64 lines
1.6 KiB
JavaScript
64 lines
1.6 KiB
JavaScript
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); |