stop external video if presenter changed

This commit is contained in:
Anton Georgiev 2021-02-21 12:19:01 +00:00
parent 0b6496618c
commit 740a3a9db9
7 changed files with 40 additions and 31 deletions

View File

@ -1,11 +1,9 @@
import { Meteor } from 'meteor/meteor'; import { Meteor } from 'meteor/meteor';
import { makeCall } from '/imports/ui/services/api';
let streamer = null; let streamer = null;
const getStreamer = (meetingID) => { const getStreamer = (meetingID) => {
if (!streamer) { if (!streamer) {
streamer = new Meteor.Streamer(`external-videos-${meetingID}`); streamer = new Meteor.Streamer(`external-videos-${meetingID}`);
makeCall('initializeExternalVideo');
} }
return streamer; return streamer;
}; };

View File

@ -1,6 +1,5 @@
import { check } from 'meteor/check'; import { check } from 'meteor/check';
import Logger from '/imports/startup/server/logger'; import Logger from '/imports/startup/server/logger';
import Users from '/imports/api/users';
import Meetings from '/imports/api/meetings'; import Meetings from '/imports/api/meetings';
export default function handleStopExternalVideo({ header, body }, meetingId) { export default function handleStopExternalVideo({ header, body }, meetingId) {
@ -9,10 +8,6 @@ export default function handleStopExternalVideo({ header, body }, meetingId) {
check(meetingId, String); check(meetingId, String);
check(userId, String); check(userId, String);
const user = Users.findOne({ meetingId: meetingId, userId: userId }) Logger.info(`External video stop sharing was initiated by:[${userId}] for meeting ${meetingId}`);
Meetings.update({ meetingId }, { $set: { externalVideoUrl: null } });
if (user && user.presenter) {
Logger.info(`User id=${userId} stop sharing an external video for meeting ${meetingId}`);
Meetings.update({ meetingId }, { $set: { externalVideoUrl: null } });
}
} }

View File

@ -1,28 +1,21 @@
import { check } from 'meteor/check'; import { check } from 'meteor/check';
import Logger from '/imports/startup/server/logger'; import Logger from '/imports/startup/server/logger';
import Users from '/imports/api/users'; import Users from '/imports/api/users';
import RedisPubSub from '/imports/startup/server/redis'; import stopWatchingExternalVideoSystemCall from '/imports/api/external-videos/server/methods/stopWatchingExternalVideoSystemCall';
import { extractCredentials } from '/imports/api/common/server/helpers'; import { extractCredentials } from '/imports/api/common/server/helpers';
export default function stopWatchingExternalVideo(options) { export default function stopWatchingExternalVideo() {
const REDIS_CONFIG = Meteor.settings.private.redis; const { meetingId, requesterUserId } = extractCredentials(this.userId);
const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
const EVENT_NAME = 'StopExternalVideoPubMsg';
// when we call stopWatchingExternalVideo as a Meteor method from client side we obtain
// user credentials from the connection via extractCredentials
// However, we also call this function from server side (end meeting, user left, etc)
const { meetingId, requesterUserId } = this.userId ? extractCredentials(this.userId) : options;
try { try {
check(meetingId, String); check(meetingId, String);
check(requesterUserId, String); check(requesterUserId, String);
const user = Users.findOne({ meetingId, userId: requesterUserId }); const user = Users.findOne({ meetingId, userId: requesterUserId });
if (user && user.presenter) { if (user && user.presenter) {
const payload = { }; // proceed and publish the event
Logger.debug(`User id=${requesterUserId} sending ${EVENT_NAME} for meeting ${meetingId}`); stopWatchingExternalVideoSystemCall({ meetingId, requesterUserId });
return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
} }
} catch (error) { } catch (error) {
Logger.error(`Error on stop sharing an external video for meeting=${meetingId} ${error}`); Logger.error(`Error on stop sharing an external video for meeting=${meetingId} ${error}`);

View File

@ -0,0 +1,26 @@
import { check } from 'meteor/check';
import Logger from '/imports/startup/server/logger';
import Meetings from '/imports/api/meetings';
import RedisPubSub from '/imports/startup/server/redis';
export default function stopWatchingExternalVideoSystemCall({ meetingId, requesterUserId }) {
const REDIS_CONFIG = Meteor.settings.private.redis;
const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
const EVENT_NAME = 'StopExternalVideoPubMsg';
try {
check(meetingId, String);
check(requesterUserId, String);
// check if there is ongoing video shared
const meeting = Meetings.findOne({ meetingId });
if (!meeting || meeting.externalVideoUrl === null) return;
Logger.info('ExternalVideo::stopWatchingExternalVideo was triggered ', { meetingId, requesterUserId });
const payload = { };
return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
} catch (error) {
Logger.error(`Error on stop sharing an external video for meeting=${meetingId} ${error}`);
}
}

View File

@ -1,20 +1,17 @@
import { check } from 'meteor/check'; import { check } from 'meteor/check';
import Meetings from '/imports/api/meetings'; import Meetings from '/imports/api/meetings';
import Users from '/imports/api/users';
import addScreenshare from '../modifiers/addScreenshare'; import addScreenshare from '../modifiers/addScreenshare';
import Logger from '/imports/startup/server/logger'; import Logger from '/imports/startup/server/logger';
import stopWatchingExternalVideo from '/imports/api/external-videos/server/methods/stopWatchingExternalVideo'; import stopWatchingExternalVideoSystemCall from '/imports/api/external-videos/server/methods/stopWatchingExternalVideoSystemCall';
export default function handleScreenshareStarted({ body }, meetingId) { export default function handleScreenshareStarted({ body }, meetingId) {
check(meetingId, String); check(meetingId, String);
check(body, Object); check(body, Object);
const meeting = Meetings.findOne({ meetingId }); const meeting = Meetings.findOne({ meetingId });
const presenter = Users.findOne({ meetingId, presenter: true });
const presenterId = presenter && presenter.userId ? presenter.userId : 'system-screenshare-starting';
if (meeting && meeting.externalVideoUrl) { if (meeting && meeting.externalVideoUrl) {
Logger.info(`ScreenshareStarted: There is external video being shared. Stopping it due to presenter change, ${meeting.externalVideoUrl}`); Logger.info(`ScreenshareStarted: There is external video being shared. Stopping it due to presenter change, ${meeting.externalVideoUrl}`);
stopWatchingExternalVideo({ meetingId, requesterUserId: presenterId }); stopWatchingExternalVideoSystemCall({ meetingId, requesterUserId: 'system-screenshare-starting' });
} }
return addScreenshare(meetingId, body); return addScreenshare(meetingId, body);
} }

View File

@ -1,7 +1,7 @@
import Logger from '/imports/startup/server/logger'; import Logger from '/imports/startup/server/logger';
import Users from '/imports/api/users'; import Users from '/imports/api/users';
import Meetings from '/imports/api/meetings'; import Meetings from '/imports/api/meetings';
import stopWatchingExternalVideo from '/imports/api/external-videos/server/methods/stopWatchingExternalVideo'; import stopWatchingExternalVideoSystemCall from '/imports/api/external-videos/server/methods/stopWatchingExternalVideoSystemCall';
export default function changePresenter(presenter, userId, meetingId, changedBy) { export default function changePresenter(presenter, userId, meetingId, changedBy) {
const selector = { const selector = {
@ -19,7 +19,7 @@ export default function changePresenter(presenter, userId, meetingId, changedBy)
const meeting = Meetings.findOne({ meetingId }); const meeting = Meetings.findOne({ meetingId });
if (meeting && meeting.externalVideoUrl) { if (meeting && meeting.externalVideoUrl) {
Logger.info(`ChangePresenter:There is external video being shared. Stopping it due to presenter change, ${meeting.externalVideoUrl}`); Logger.info(`ChangePresenter:There is external video being shared. Stopping it due to presenter change, ${meeting.externalVideoUrl}`);
stopWatchingExternalVideo({ meetingId, requesterUserId: userId }); stopWatchingExternalVideoSystemCall({ meetingId, requesterUserId: 'system-presenter-changed' });
} }
const numberAffected = Users.update(selector, modifier); const numberAffected = Users.update(selector, modifier);

View File

@ -2,7 +2,7 @@ import { check } from 'meteor/check';
import Users from '/imports/api/users'; import Users from '/imports/api/users';
import VideoStreams from '/imports/api/video-streams'; import VideoStreams from '/imports/api/video-streams';
import Logger from '/imports/startup/server/logger'; import Logger from '/imports/startup/server/logger';
import stopWatchingExternalVideo from '/imports/api/external-videos/server/methods/stopWatchingExternalVideo'; import stopWatchingExternalVideoSystemCall from '/imports/api/external-videos/server/methods/stopWatchingExternalVideoSystemCall';
import clearUserInfoForRequester from '/imports/api/users-infos/server/modifiers/clearUserInfoForRequester'; import clearUserInfoForRequester from '/imports/api/users-infos/server/modifiers/clearUserInfoForRequester';
import ClientConnections from '/imports/startup/server/ClientConnections'; import ClientConnections from '/imports/startup/server/ClientConnections';
@ -22,7 +22,7 @@ export default function removeUser(meetingId, userId) {
if (userToRemove) { if (userToRemove) {
const { presenter } = userToRemove; const { presenter } = userToRemove;
if (presenter) { if (presenter) {
stopWatchingExternalVideo({ meetingId, requesterUserId: userId }); stopWatchingExternalVideoSystemCall({ meetingId, requesterUserId: 'system-presenter-was-removed' });
} }
} }