Temp fix: newly joined clients miss the commands

When newly joined clients register for XMPP events upon
CONFERENCE_JOINED, those events that is carried by presence (e.g. START_COMMAND) was
already fired.
Temporary solution is to let the client send a ping message after
registering XMPP event listeners. The moderator will respond with
pong, which forces the presence to be resent.
This commit is contained in:
Radium Zheng 2018-07-10 23:25:22 +10:00
parent 0f0f9ea1b2
commit f8c01646c7
1 changed files with 36 additions and 1 deletions

View File

@ -21,6 +21,20 @@ const COMMAND_START = 'localRecStart';
*/ */
const COMMAND_STOP = 'localRecStop'; const COMMAND_STOP = 'localRecStop';
/**
* One-time command used to trigger the moderator to resend the commands.
* This is a workaround for newly-joined clients to receive remote presence.
*/
const COMMAND_PING = 'localRecPing';
/**
* One-time command sent upon receiving a {@code COMMAND_PING}.
* Only the moderator sends this command.
* This command does not carry any information itself, but rather forces the
* XMPP server to resend the remote presence.
*/
const COMMAND_PONG = 'localRecPong';
/** /**
* Participant property key for local recording stats. * Participant property key for local recording stats.
*/ */
@ -167,6 +181,7 @@ class RecordingController {
this._updateStats = this._updateStats.bind(this); this._updateStats = this._updateStats.bind(this);
this._onStartCommand = this._onStartCommand.bind(this); this._onStartCommand = this._onStartCommand.bind(this);
this._onStopCommand = this._onStopCommand.bind(this); this._onStopCommand = this._onStopCommand.bind(this);
this._onPingCommand = this._onPingCommand.bind(this);
this._doStartRecording = this._doStartRecording.bind(this); this._doStartRecording = this._doStartRecording.bind(this);
this._doStopRecording = this._doStopRecording.bind(this); this._doStopRecording = this._doStopRecording.bind(this);
this.registerEvents = this.registerEvents.bind(this); this.registerEvents = this.registerEvents.bind(this);
@ -189,8 +204,13 @@ class RecordingController {
.addCommandListener(COMMAND_STOP, this._onStopCommand); .addCommandListener(COMMAND_STOP, this._onStopCommand);
this._conference this._conference
.addCommandListener(COMMAND_START, this._onStartCommand); .addCommandListener(COMMAND_START, this._onStartCommand);
this._conference
.addCommandListener(COMMAND_PING, this._onPingCommand);
this._registered = true; this._registered = true;
} }
if (!this._conference.isModerator()) {
this._conference.sendCommandOnce(COMMAND_PING, {});
}
} }
} }
@ -225,7 +245,7 @@ class RecordingController {
*/ */
stopRecording() { stopRecording() {
if (this._conference) { if (this._conference) {
if (this._conference.isModerator) { if (this._conference.isModerator()) {
this._conference.removeCommand(COMMAND_START); this._conference.removeCommand(COMMAND_START);
this._conference.sendCommand(COMMAND_STOP, { this._conference.sendCommand(COMMAND_STOP, {
attributes: { attributes: {
@ -409,6 +429,21 @@ class RecordingController {
} }
} }
_onPingCommand: () => void;
/**
* Callback function for XMPP event.
*
* @private
* @returns {void}
*/
_onPingCommand() {
if (this._conference.isModerator()) {
logger.log('Received ping, sending pong.');
this._conference.sendCommandOnce(COMMAND_PONG, {});
}
}
/** /**
* Generates a token that can be used to distinguish each * Generates a token that can be used to distinguish each
* recording session. * recording session.