diff --git a/bigbluebutton-html5/.Trash-1000/files/clearCursors.js b/bigbluebutton-html5/.Trash-1000/files/clearCursors.js new file mode 100644 index 0000000000000000000000000000000000000000..1d3905a7a0128dd86d398bd17f3b5b22a0d7ab4d --- /dev/null +++ b/bigbluebutton-html5/.Trash-1000/files/clearCursors.js @@ -0,0 +1,10 @@ +import Cursor from '/imports/api/cursor'; +import Logger from '/imports/startup/server/logger'; + +export default function clearCursor(meetingId) { + if (meetingId) { + return Cursor.remove({ meetingId }, Logger.info(`Cleared Cursor (${meetingId})`)); + } else { + return Cursor.remove({}, Logger.info('Cleared Cursor (all)')); + } +}; diff --git a/bigbluebutton-html5/imports/api/cursor/server/modifiers/eventHandlers.js b/bigbluebutton-html5/.Trash-1000/files/eventHandlers.js similarity index 100% rename from bigbluebutton-html5/imports/api/cursor/server/modifiers/eventHandlers.js rename to bigbluebutton-html5/.Trash-1000/files/eventHandlers.js diff --git a/bigbluebutton-html5/imports/api/cursor/server/publications.js b/bigbluebutton-html5/.Trash-1000/files/publications.js similarity index 100% rename from bigbluebutton-html5/imports/api/cursor/server/publications.js rename to bigbluebutton-html5/.Trash-1000/files/publications.js diff --git a/bigbluebutton-html5/.Trash-1000/info/clearCursors.js.trashinfo b/bigbluebutton-html5/.Trash-1000/info/clearCursors.js.trashinfo new file mode 100644 index 0000000000000000000000000000000000000000..b7fb8148a174c9e0c3c98e9acfcdf5b761e65c16 --- /dev/null +++ b/bigbluebutton-html5/.Trash-1000/info/clearCursors.js.trashinfo @@ -0,0 +1,3 @@ +[Trash Info] +Path=imports/api/cursor/server/modifiers/clearCursors.js +DeletionDate=2016-11-18T09:49:05 diff --git a/bigbluebutton-html5/.Trash-1000/info/eventHandlers.js.trashinfo b/bigbluebutton-html5/.Trash-1000/info/eventHandlers.js.trashinfo new file mode 100644 index 0000000000000000000000000000000000000000..395cce760ff756b5483ffb639c5c377b4eeb8cf9 --- /dev/null +++ b/bigbluebutton-html5/.Trash-1000/info/eventHandlers.js.trashinfo @@ -0,0 +1,3 @@ +[Trash Info] +Path=imports/api/cursor/server/modifiers/eventHandlers.js +DeletionDate=2016-11-18T09:49:29 diff --git a/bigbluebutton-html5/.Trash-1000/info/publications.js.trashinfo b/bigbluebutton-html5/.Trash-1000/info/publications.js.trashinfo new file mode 100644 index 0000000000000000000000000000000000000000..4d86c5b6409e24b21bf6a3601e55c7a2f0d3164e --- /dev/null +++ b/bigbluebutton-html5/.Trash-1000/info/publications.js.trashinfo @@ -0,0 +1,3 @@ +[Trash Info] +Path=imports/api/cursor/server/publications.js +DeletionDate=2016-11-18T09:46:05 diff --git a/bigbluebutton-html5/imports/api/cursor/server/eventHandlers.js b/bigbluebutton-html5/imports/api/cursor/server/eventHandlers.js new file mode 100644 index 0000000000000000000000000000000000000000..bc02337a12b12eba1d2e5173b6bc9bfdc4c76851 --- /dev/null +++ b/bigbluebutton-html5/imports/api/cursor/server/eventHandlers.js @@ -0,0 +1,4 @@ +import RedisPubSub from '/imports/startup/server/redis'; +import handleCursorUpdate from './handlers/cursorUpdate'; + +RedisPubSub.on('presentation_cursor_updated_message', handleCursorUpdate); diff --git a/bigbluebutton-html5/imports/api/cursor/server/handlers/cursorUpdate.js b/bigbluebutton-html5/imports/api/cursor/server/handlers/cursorUpdate.js new file mode 100644 index 0000000000000000000000000000000000000000..c14e2a7b9a620c6ae403f8de48ee3761d7a6f83d --- /dev/null +++ b/bigbluebutton-html5/imports/api/cursor/server/handlers/cursorUpdate.js @@ -0,0 +1,15 @@ +import Logger from '/imports/startup/server/logger'; +import { check } from 'meteor/check'; +import updateCursor from '../modifiers/updateCursor'; + +export default function handleCursorUpdate({ payload }) { + const meetingId = payload.meeting_id; + const x = payload.x_percent; + const y = payload.y_percent; + + check(meetingId, String); + check(x, Number); + check(y, Number); + + return updateCursor(meetingId, x, y); +}; diff --git a/bigbluebutton-html5/imports/api/cursor/server/index.js b/bigbluebutton-html5/imports/api/cursor/server/index.js new file mode 100644 index 0000000000000000000000000000000000000000..92451ac76bf27410726e8f3cd2eebac46cd7b83e --- /dev/null +++ b/bigbluebutton-html5/imports/api/cursor/server/index.js @@ -0,0 +1,3 @@ +import './eventHandlers'; +import './methods'; +import './publishers'; diff --git a/bigbluebutton-html5/imports/api/cursor/server/methods.js b/bigbluebutton-html5/imports/api/cursor/server/methods.js new file mode 100644 index 0000000000000000000000000000000000000000..1ce65c369863cac02b7c5224a46ab766a38cf8b3 --- /dev/null +++ b/bigbluebutton-html5/imports/api/cursor/server/methods.js @@ -0,0 +1,4 @@ +import { Meteor } from 'meteor/meteor'; + +Meteor.methods({ +}); diff --git a/bigbluebutton-html5/imports/api/cursor/server/modifiers/clearCursor.js b/bigbluebutton-html5/imports/api/cursor/server/modifiers/clearCursor.js new file mode 100755 index 0000000000000000000000000000000000000000..1d3905a7a0128dd86d398bd17f3b5b22a0d7ab4d --- /dev/null +++ b/bigbluebutton-html5/imports/api/cursor/server/modifiers/clearCursor.js @@ -0,0 +1,10 @@ +import Cursor from '/imports/api/cursor'; +import Logger from '/imports/startup/server/logger'; + +export default function clearCursor(meetingId) { + if (meetingId) { + return Cursor.remove({ meetingId }, Logger.info(`Cleared Cursor (${meetingId})`)); + } else { + return Cursor.remove({}, Logger.info('Cleared Cursor (all)')); + } +}; diff --git a/bigbluebutton-html5/imports/api/cursor/server/modifiers/clearCursorCollection.js b/bigbluebutton-html5/imports/api/cursor/server/modifiers/clearCursorCollection.js deleted file mode 100755 index ff7fea40718c9edefaefee08c976ae1c1ce40f07..0000000000000000000000000000000000000000 --- a/bigbluebutton-html5/imports/api/cursor/server/modifiers/clearCursorCollection.js +++ /dev/null @@ -1,14 +0,0 @@ -import Cursor from '/imports/api/cursor'; -import { logger } from '/imports/startup/server/logger'; - -// called on server start and meeting end -export function clearCursorCollection() { - const meetingId = arguments[0]; - if (meetingId != null) { - return Cursor.remove({ - meetingId: meetingId, - }, () => logger.info(`cleared Cursor Collection (meetingId: ${meetingId})!`)); - } else { - return Cursor.remove({}, () => logger.info('cleared Cursor Collection (all meetings)!')); - } -}; diff --git a/bigbluebutton-html5/imports/api/cursor/server/modifiers/initializeCursor.js b/bigbluebutton-html5/imports/api/cursor/server/modifiers/initializeCursor.js index 172a98fe719500b8748bc57b58bfe8468fd18a69..0b4c162e3cb39171b8d3aaa202ec30a17a42ab69 100755 --- a/bigbluebutton-html5/imports/api/cursor/server/modifiers/initializeCursor.js +++ b/bigbluebutton-html5/imports/api/cursor/server/modifiers/initializeCursor.js @@ -1,17 +1,8 @@ import Cursor from '/imports/api/cursor'; -import { logger } from '/imports/startup/server/logger'; +import updateCursor from './updateCursor'; -export function initializeCursor(meetingId) { - return Cursor.upsert({ - meetingId: meetingId, - }, { - meetingId: meetingId, - x: 0, - y: 0, - }, (err, numChanged) => { - if (err) { - return logger.error(`err upserting cursor for ${meetingId}`); - } +export default function initializeCursor(meetingId) { + check(meetingId, String); - }); + return updateCursor(meetingId, 0, 0); }; diff --git a/bigbluebutton-html5/imports/api/cursor/server/modifiers/updateCursor.js b/bigbluebutton-html5/imports/api/cursor/server/modifiers/updateCursor.js new file mode 100755 index 0000000000000000000000000000000000000000..2e6217849d566b849965d418e55c4c921a33be6d --- /dev/null +++ b/bigbluebutton-html5/imports/api/cursor/server/modifiers/updateCursor.js @@ -0,0 +1,37 @@ +import Logger from '/imports/startup/server/logger'; +import Cursor from '/imports/api/cursor'; + +export default function updateCursor(meetingId, x = 0, y = 0) { + check(meetingId, String); + check(x, Number); + check(y, Number); + + const selector = { + meetingId, + }; + + const modifier = { + $set: { + meetingId, + x, + y, + }, + }; + + const cb = (err, numChanged) => { + if (err) { + return Logger.error(`Upserting cursor to collection: ${err}`); + } + + const { insertedId } = numChanged; + if (insertedId) { + return Logger.info(`Initialized cursor meeting=${meetingId}`); + } + + if (numChanged) { + return Logger.info(`Updated cursor meeting=${meetingId}`); + } + }; + + return Cursor.upsert(selector, modifier, cb); +}; diff --git a/bigbluebutton-html5/imports/api/cursor/server/modifiers/updateCursorLocation.js b/bigbluebutton-html5/imports/api/cursor/server/modifiers/updateCursorLocation.js deleted file mode 100755 index f16c0a5f518c377555de19a44f5ece03c2118e84..0000000000000000000000000000000000000000 --- a/bigbluebutton-html5/imports/api/cursor/server/modifiers/updateCursorLocation.js +++ /dev/null @@ -1,19 +0,0 @@ -import Cursor from '/imports/api/cursor'; -import { logger } from '/imports/startup/server/logger'; - -export function updateCursorLocation(meetingId, cursorObject) { - return Cursor.upsert({ - meetingId: meetingId, - }, { - $set: { - meetingId: meetingId, - x: cursorObject.x, - y: cursorObject.y, - }, - }, (err, numChanged) => { - if (err != null) { - return logger.error(`_unsucc update of cursor for ${meetingId} err=${JSON.stringify(err)}`); - } - - }); -}; diff --git a/bigbluebutton-html5/imports/api/cursor/server/publishers.js b/bigbluebutton-html5/imports/api/cursor/server/publishers.js new file mode 100644 index 0000000000000000000000000000000000000000..fd435ecbf7008d8e1ea7625f1ad3dbb494c66d2a --- /dev/null +++ b/bigbluebutton-html5/imports/api/cursor/server/publishers.js @@ -0,0 +1,22 @@ +import Cursor from '/imports/api/cursor'; +import { Meteor } from 'meteor/meteor'; +import { check } from 'meteor/check'; +import Logger from '/imports/startup/server/logger'; +import { isAllowedTo } from '/imports/startup/server/userPermissions'; + +Meteor.publish('cursor', (credentials) => { + // TODO: Some publishers have ACL and others dont + // if (!isAllowedTo('@@@', credentials)) { + // this.error(new Meteor.Error(402, "The user was not authorized to subscribe for 'cursor'")); + // } + + const { meetingId, requesterUserId, requesterToken } = credentials; + + check(meetingId, String); + check(requesterUserId, String); + check(requesterToken, String); + + Logger.info(`Publishing Cursor for ${meetingId} ${requesterUserId} ${requesterToken}`); + + return Cursor.find({ meetingId }); +}); diff --git a/bigbluebutton-html5/imports/api/meetings/server/modifiers/addMeeting.js b/bigbluebutton-html5/imports/api/meetings/server/modifiers/addMeeting.js index 7c9943b3b771a0e1acad6a27687eac471d67c96e..eb34b099f286406503eaea921c4ec5c3b6ed9f91 100755 --- a/bigbluebutton-html5/imports/api/meetings/server/modifiers/addMeeting.js +++ b/bigbluebutton-html5/imports/api/meetings/server/modifiers/addMeeting.js @@ -1,7 +1,7 @@ import { check } from 'meteor/check'; import Meetings from '/imports/api/meetings'; import Logger from '/imports/startup/server/logger'; -import { initializeCursor } from '/imports/api/cursor/server/modifiers/initializeCursor'; +import initializeCursor from '/imports/api/cursor/server/modifiers/initializeCursor'; export default function addMeeting(meeting) { const APP_CONFIG = Meteor.settings.public.app; diff --git a/bigbluebutton-html5/imports/api/meetings/server/modifiers/clearMeetings.js b/bigbluebutton-html5/imports/api/meetings/server/modifiers/clearMeetings.js index 110b699bf2a0c5312425502937a8294b5c6cde39..e9036cc13dc1e24c0a15ae4bd0a6b84a25e5e5fa 100755 --- a/bigbluebutton-html5/imports/api/meetings/server/modifiers/clearMeetings.js +++ b/bigbluebutton-html5/imports/api/meetings/server/modifiers/clearMeetings.js @@ -7,7 +7,7 @@ import clearChats from '/imports/api/chat/server/modifiers/clearChats'; import { clearShapesCollection } from '/imports/api/shapes/server/modifiers/clearShapesCollection'; import clearSlides from '/imports/api/slides/server/modifiers/clearSlides'; import clearPolls from '/imports/api/polls/server/modifiers/clearPolls'; -import { clearCursorCollection } from '/imports/api/cursor/server/modifiers/clearCursorCollection'; +import clearCursor from '/imports/api/cursor/server/modifiers/clearCursor'; import { clearCaptionsCollection } from '/imports/api/captions/server/modifiers/clearCaptionsCollection'; import clearPresentations from '/imports/api/presentations/server/modifiers/clearPresentations'; @@ -16,7 +16,7 @@ export default function clearMeetings() { return Meetings.remove({}, (err) => { clearCaptionsCollection(); clearChats(); - clearCursorCollection(); + clearCursor(); clearPresentations(); clearPolls(); clearShapesCollection(); diff --git a/bigbluebutton-html5/imports/api/meetings/server/modifiers/removeMeeting.js b/bigbluebutton-html5/imports/api/meetings/server/modifiers/removeMeeting.js index 5460bf01d4f2ad51120998e63fd6bb1794c2d476..75f2e9eb890615514bab77a8a97ef14beb5cd01a 100755 --- a/bigbluebutton-html5/imports/api/meetings/server/modifiers/removeMeeting.js +++ b/bigbluebutton-html5/imports/api/meetings/server/modifiers/removeMeeting.js @@ -7,7 +7,7 @@ import clearChats from '/imports/api/chat/server/modifiers/clearChats'; import { clearShapesCollection } from '/imports/api/shapes/server/modifiers/clearShapesCollection'; import clearSlides from '/imports/api/slides/server/modifiers/clearSlides'; import clearPolls from '/imports/api/polls/server/modifiers/clearPolls'; -import { clearCursorCollection } from '/imports/api/cursor/server/modifiers/clearCursorCollection'; +import clearCursor from '/imports/api/cursor/server/modifiers/clearCursor'; import { clearCaptionsCollection } from '/imports/api/captions/server/modifiers/clearCaptionsCollection'; import clearPresentations from '/imports/api/presentations/server/modifiers/clearPresentations'; diff --git a/bigbluebutton-html5/imports/api/slides/server/modifiers/clearSlides.js b/bigbluebutton-html5/imports/api/slides/server/modifiers/clearSlides.js index 868290d952268eff20ea244d83ed90ab40b0e945..be66ed0ec6312054b1d888b4876f08bc9871c09e 100755 --- a/bigbluebutton-html5/imports/api/slides/server/modifiers/clearSlides.js +++ b/bigbluebutton-html5/imports/api/slides/server/modifiers/clearSlides.js @@ -3,7 +3,7 @@ import Logger from '/imports/startup/server/logger'; export default function clearSlides(meetingId) { if (meetingId) { - return Slides.remove({ meetingId: meetingId }, Logger.info(`Cleared Slides (${meetingId})`)); + return Slides.remove({ meetingId }, Logger.info(`Cleared Slides (${meetingId})`)); } else { return Slides.remove({}, Logger.info('Cleared Slides (all)')); } diff --git a/bigbluebutton-html5/server/main.js b/bigbluebutton-html5/server/main.js index d1256192fe2f115b164ba056648bc8d26f0c61ab..0edfeb00497c5fabba6fdfd2eeebe9bd0aa34455 100755 --- a/bigbluebutton-html5/server/main.js +++ b/bigbluebutton-html5/server/main.js @@ -1,11 +1,7 @@ import '/imports/startup/server'; import '/imports/api/chat/server'; -import '/imports/api/cursor/server/publications'; -import '/imports/api/cursor/server/modifiers/clearCursorCollection'; -import '/imports/api/cursor/server/modifiers/initializeCursor'; -import '/imports/api/cursor/server/modifiers/updateCursorLocation'; -import '/imports/api/cursor/server/modifiers/eventHandlers'; +import '/imports/api/cursor/server'; import '/imports/api/deskshare/server/publications'; import '/imports/api/deskshare/server/modifiers/clearDeskshareCollection';