diff --git a/bigbluebutton-html5/imports/api/cursor/server/handlers/cursorUpdate.js b/bigbluebutton-html5/imports/api/cursor/server/handlers/cursorUpdate.js index 2e4b1c3ab3cbd219e7f04cd4c1fbff1d4a5b5f70..2e094fb1cf52696469f52ad44b5c2162f58d1ad1 100755 --- a/bigbluebutton-html5/imports/api/cursor/server/handlers/cursorUpdate.js +++ b/bigbluebutton-html5/imports/api/cursor/server/handlers/cursorUpdate.js @@ -1,24 +1,33 @@ import { check } from 'meteor/check'; import CursorStreamer from '/imports/api/cursor/server/streamer'; +import Logger from '/imports/startup/server/logger'; + + +const { streamerLog } = Meteor.settings.private.serverLog; const CURSOR_PROCCESS_INTERVAL = 30; -let cursorQueue = []; -let cursorRecieverIsRunning = false; +let cursorQueue = {}; +let cursorReceiverIsRunning = false; const proccess = () => { if (!Object.keys(cursorQueue).length) { - cursorRecieverIsRunning = false; + cursorReceiverIsRunning = false; return; } - cursorRecieverIsRunning = true; - - Object.keys(cursorQueue).forEach((meetingId) => { - CursorStreamer(meetingId).emit('message', { meetingId, cursors: cursorQueue[meetingId] }); - }); - cursorQueue = {}; - - Meteor.setTimeout(proccess, CURSOR_PROCCESS_INTERVAL); + cursorReceiverIsRunning = true; + + try { + Object.keys(cursorQueue).forEach((meetingId) => { + CursorStreamer(meetingId).emit('message', { meetingId, cursors: cursorQueue[meetingId] }); + }); + cursorQueue = {}; + + Meteor.setTimeout(proccess, CURSOR_PROCCESS_INTERVAL); + } catch (error) { + Logger.error(`Error while trying to send cursor streamer data. ${error}`); + cursorReceiverIsRunning = false; + } }; export default function handleCursorUpdate({ header, body }, meetingId) { @@ -31,7 +40,12 @@ export default function handleCursorUpdate({ header, body }, meetingId) { if (!cursorQueue.hasOwnProperty(meetingId)) { cursorQueue[meetingId] = {}; } + + if (streamerLog) { + Logger.debug(`CursorUpdate process for meeting ${meetingId} is running: ${cursorReceiverIsRunning}`); + } + // overwrite since we dont care about the other positions cursorQueue[meetingId][userId] = body; - if (!cursorRecieverIsRunning) proccess(); + if (!cursorReceiverIsRunning) proccess(); } diff --git a/bigbluebutton-html5/imports/api/cursor/server/streamer.js b/bigbluebutton-html5/imports/api/cursor/server/streamer.js index 5ae5ed6e66622eb89307f81bee59515139d0e500..4c3218960b71813ef6b108f3fb04f9d5c9a7d95d 100644 --- a/bigbluebutton-html5/imports/api/cursor/server/streamer.js +++ b/bigbluebutton-html5/imports/api/cursor/server/streamer.js @@ -1,6 +1,8 @@ import Logger from '/imports/startup/server/logger'; import publishCursorUpdate from './methods/publishCursorUpdate'; +const { streamerLog } = Meteor.settings.private.serverLog; + export function removeCursorStreamer(meetingId) { Logger.info(`Removing Cursor streamer object for meeting ${meetingId}`); delete Meteor.StreamerCentral.instances[`cursor-${meetingId}`]; @@ -8,8 +10,14 @@ export function removeCursorStreamer(meetingId) { export function addCursorStreamer(meetingId) { const streamer = new Meteor.Streamer(`cursor-${meetingId}`, { retransmit: false }); + if (streamerLog) { + Logger.debug(`Cursor streamer created for meeting ${meetingId}`); + } streamer.allowRead(function allowRead() { + if (streamerLog) { + Logger.debug(`Cursor streamer called allowRead for user ${this.userId} in meeting ${meetingId}`); + } return this.userId && this.userId.includes(meetingId); }); diff --git a/bigbluebutton-html5/imports/ui/components/cursor/service.js b/bigbluebutton-html5/imports/ui/components/cursor/service.js index 5d5e9f7f1458ea8cb9ecb87fff0cb14158a07434..56746d56e6cef74e63637443b2922a59753ba51b 100755 --- a/bigbluebutton-html5/imports/ui/components/cursor/service.js +++ b/bigbluebutton-html5/imports/ui/components/cursor/service.js @@ -1,5 +1,6 @@ import Auth from '/imports/ui/services/auth'; import { throttle } from 'lodash'; +import logger from '/imports/startup/client/logger'; const Cursor = new Mongo.Collection(null); let cursorStreamListener = null; @@ -34,9 +35,17 @@ export function publishCursorUpdate(payload) { } export function initCursorStreamListener() { + logger.debug({ + logCode: 'init_cursor_stream_listener', + }, 'initCursorStreamListener called'); + if (!cursorStreamListener) { cursorStreamListener = new Meteor.Streamer(`cursor-${Auth.meetingID}`, { retransmit: false }); + logger.debug({ + logCode: 'init_cursor_stream_listener', + }, 'initCursorStreamListener called'); + cursorStreamListener.on('message', ({ cursors }) => { Object.keys(cursors).forEach((userId) => { if (Auth.userID === userId) return; diff --git a/bigbluebutton-html5/imports/ui/components/subscriptions/component.jsx b/bigbluebutton-html5/imports/ui/components/subscriptions/component.jsx index b9ef128011f292e5db7f2d3ad761cdfad18f1946..554b05d940856fc72c6096201f94a4cdeae1cfb8 100755 --- a/bigbluebutton-html5/imports/ui/components/subscriptions/component.jsx +++ b/bigbluebutton-html5/imports/ui/components/subscriptions/component.jsx @@ -95,6 +95,7 @@ export default withTracker(() => { Meteor.subscribe('users', credentials, userIsModerator, subscriptionErrorHandler); Meteor.subscribe('breakouts', credentials, userIsModerator, subscriptionErrorHandler); Meteor.subscribe('meetings', credentials, userIsModerator, subscriptionErrorHandler); + logger.debug({ logCode: 'startup_client_subscription_init_streamers', extraInfo: { role: User.role } }, 'Calling init streamers functions'); initAnnotationsStreamListener(); initCursorStreamListener(); } diff --git a/bigbluebutton-html5/private/config/settings.yml b/bigbluebutton-html5/private/config/settings.yml index 9b910f74c0ffde8c9c0fd039ed01f504c568a193..2ae195c99be606cbdaea9e56cfa2abb0db3c7b15 100755 --- a/bigbluebutton-html5/private/config/settings.yml +++ b/bigbluebutton-html5/private/config/settings.yml @@ -338,6 +338,7 @@ private: - DoLatencyTracerMsg serverLog: level: info + streamerLog: false memoryMonitoring: stat: enabled: false