127.0.0.1:8000 watch-together / master src / js / websocket / index.js
master

Tree @master (Download .tar.gz)

index.js @masterraw · history · blame

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;