const $ = require('jquery');
const time = require('../utils/time');
const video = require('../utils/video');
const onmessage = require('./onmessage');
const cookies = require('../utils/cookies');
let clock_sync_interval;
let reconnect_interval;
let ws;
// Do not reject non-HTTPS connections to WebSocket for development environment
const protocol = process.env.NODE_ENV === 'production' ? "wss" : "ws";
function init_ws() {
ws = new WebSocket(`${protocol}://${location.host}`);
ws.onopen = function() {
logger.log('WebSocket connection established');
$("#ws-status").text("Connected");
clearInterval(reconnect_interval);
while (send_queue.length) {
websocket.send(send_queue.shift());
}
clock_sync_interval = setInterval(function() {
ws.send(JSON.stringify({
command: "clock-sync",
data: {
video_id: video.video_id(),
latency: time.latency(),
clientTime: Date.now()
}
}));
}, 3000);
};
ws.onclose = ws.onerror = function(event) {
logger.log('WebSocket connection closed', event.code);
$("#ws-status").text("Disconnected");
clearInterval(clock_sync_interval);
clearInterval(reconnect_interval);
if (event.code === 4030) {
cookies.set("login_message", {
message: "You are logged in elsewhere",
persistent: true
});
window.location = "/login";
} else {
reconnect_interval = setInterval(function() {
$("#ws-status").text("Connecting...");
init_ws();
}, 5000);
}
};
ws.onmessage = function(message) {
onmessage(JSON.parse(message.data), websocket);
};
}
init_ws();
let send_queue = [];
const websocket = {
send: function(data) {
if (ws && ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify(data));
} else {
logger.log("Cannot send, ws is closed");
send_queue.push(data);
}
}
};
module.exports = websocket;