var joinRoomCmd = `@joinRoom:${document.location.hash.substr(1)}`; function restartWebSocket() { var old_ws = ws_connection; old_ws.close(); sendThroughWebSocket(joinRoomCmd); try { ws_connection = new WebSocket('wss://broadcaster.sfner.com'); } catch (e) { ws_connection = old_ws; setTimeout(restartWebSocket, 10); console.error(e); return; } ws_connection.onopen = old_ws.onopen; ws_connection.onclose = old_ws.onclose; ws_connection.onmessage = old_ws.onmessage; } function configureWebSocket() { console.info('WebSocket is ready.'); ensureWebSocketQueueIsEmpty(); } function onMessageFromWebSocket(message) { try { handleMessage(JSON.parse(message.data)); } catch (e) { console.error(message); console.error(e); } } function onBeforeUnload() { ws_connection.onclose = function () { }; ws_connection.close(); } var ws_connection = { close: () => { }, readyState: WebSocket.CLOSED }; ws_connection.onopen = configureWebSocket; ws_connection.onclose = restartWebSocket; ws_connection.onmessage = onMessageFromWebSocket; window.onbeforeunload = onBeforeUnload; var webSocketQueue = []; function sendThroughWebSocket(data) { webSocketQueue.push(data); ensureWebSocketQueueIsEmpty(); } function ensureWebSocketQueueIsEmpty() { while (webSocketQueue.length > 0) { if (ws_connection.readyState == WebSocket.OPEN) { var data = webSocketQueue.shift(); ws_connection.send(data); } else { break; } } } sendThroughWebSocket(joinRoomCmd); setTimeout(restartWebSocket, 10);