127.0.0.1:8000 watch-together / master server / websocket / messages / update-viewer.js
master

Tree @master (Download .tar.gz)

update-viewer.js @masterraw · history · blame

const ws_utils = require('../utils');
const watchrooms = require('../../utils/watchrooms');
const broadcast = require('../broadcast');

module.exports = function(user_id, data) {
    //ws_utils.log.v("Update viewer state for", user_id);
    //ws_utils.log.v(data);
    let watchroom = watchrooms.get(data.video_id);
    if (!watchroom) {
        // Prevent race condition error where user
        // requests state change then leaves the
        // watchroom before it is executed
        return;
    }

    if (watchroom.state.paused) {
        if (watchroom.state.invoked_by === "server") {
            let all_ready = true;
            for (const viewer of Object.values(watchroom.viewers)) {
                if (!viewer.ready) {
                    all_ready = false;
                    break;
                }
            }
            if (all_ready) {
                ws_utils.log.v("Play video for everyone now that all viewers are ready");
                ws_utils.server_update_state(data.video_id, {
                    paused: false
                });
            }
        }
    } else if (!data.viewer.ready) {
        ws_utils.log.v(`Pause video for everyone to let ${user_id} sync state`);
        ws_utils.server_update_state(data.video_id, {
            paused: true
        });
    }

    broadcast({
        command: "announce",
        data: {
            target: "watchroom",
            type: "viewer-update",
            viewer: watchrooms.update_user(user_id, data.video_id, data.viewer)
        }
    }, watchroom.viewers);
};