From a92f59eef6f680d0ce30f5f9ba0b4b21212d5e79 Mon Sep 17 00:00:00 2001 From: Chen Li1 Date: Tue, 10 Dec 2019 09:47:20 +0800 Subject: [PATCH 1/3] Process missing messages during reconnection --- src/sdk/conference/signaling.js | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/sdk/conference/signaling.js b/src/sdk/conference/signaling.js index ba3ed014..21e6f145 100644 --- a/src/sdk/conference/signaling.js +++ b/src/sdk/conference/signaling.js @@ -39,6 +39,7 @@ export class SioSignaling extends EventModule.EventDispatcher { this._reconnectTimes = 0; this._reconnectionTicket = null; this._refreshReconnectionTicket = null; + this._messageSequence = 0; } /** @@ -69,6 +70,7 @@ export class SioSignaling extends EventModule.EventDispatcher { data: data, }, })); + this._messageSequence++; }); }); this._socket.on('reconnecting', () => { @@ -102,7 +104,25 @@ export class SioSignaling extends EventModule.EventDispatcher { data) => { if (status === 'ok') { this._reconnectTimes = 0; - this._onReconnectionTicket(data); + if (typeof data === 'object') { + if (Array.isArray(data.messages)) { + const pendingMessages = data.messages.filter(msg => { + return (msg.seq > this._messageSequence); + }); + pendingMessages.forEach(msg => { + this.dispatchEvent(new EventModule.MessageEvent('data', { + message: { + notification: msg.event, + data: msg.data, + }, + })); + this._messageSequence++; + }); + } + this._onReconnectionTicket(data.ticket); + } else { + this._onReconnectionTicket(data); + } } else { this.dispatchEvent(new EventModule.OwtEvent('disconnect')); } From de0b2bbe679e856ba2c612850359974034914f70 Mon Sep 17 00:00:00 2001 From: Chen Li1 Date: Wed, 18 Dec 2019 16:54:10 +0800 Subject: [PATCH 2/3] Avoid message sequence overflow --- src/sdk/conference/signaling.js | 37 +++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/src/sdk/conference/signaling.js b/src/sdk/conference/signaling.js index 21e6f145..6c9f194e 100644 --- a/src/sdk/conference/signaling.js +++ b/src/sdk/conference/signaling.js @@ -11,6 +11,7 @@ import {Base64} from '../base/base64.js'; 'use strict'; const reconnectionAttempts = 10; +const maxSequence = 2147483647; // eslint-disable-next-line require-jsdoc function handleResponse(status, data, resolve, reject) { @@ -70,7 +71,7 @@ export class SioSignaling extends EventModule.EventDispatcher { data: data, }, })); - this._messageSequence++; + this._incrementMessageSequence(); }); }); this._socket.on('reconnecting', () => { @@ -106,18 +107,20 @@ export class SioSignaling extends EventModule.EventDispatcher { this._reconnectTimes = 0; if (typeof data === 'object') { if (Array.isArray(data.messages)) { - const pendingMessages = data.messages.filter(msg => { - return (msg.seq > this._messageSequence); - }); - pendingMessages.forEach(msg => { - this.dispatchEvent(new EventModule.MessageEvent('data', { - message: { - notification: msg.event, - data: msg.data, - }, - })); - this._messageSequence++; - }); + let isMissingStart = false; + for (const msg of data.messages) { + if (isMissingStart) { + this.dispatchEvent(new EventModule.MessageEvent('data', { + message: { + notification: msg.event, + data: msg.data, + }, + })); + this._incrementMessageSequence(); + } else if (msg.seq === this._messageSequence) { + isMissingStart = true; + } + } } this._onReconnectionTicket(data.ticket); } else { @@ -221,4 +224,12 @@ export class SioSignaling extends EventModule.EventDispatcher { clearTimeout(this._refreshReconnectionTicket); this._refreshReconnectionTicket = null; } + + _incrementMessageSequence() { + if (this._messageSequence === maxSequence) { + this._messageSequence = 0; + } else { + this._messageSequence++; + } + } } From 51355ecc739f5d344bbc140a5224013e77cad013 Mon Sep 17 00:00:00 2001 From: Chen Li1 Date: Wed, 10 Mar 2021 14:09:12 +0800 Subject: [PATCH 3/3] Fix eslint --- src/sdk/conference/signaling.js | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/src/sdk/conference/signaling.js b/src/sdk/conference/signaling.js index 6c9f194e..f4f2ea71 100644 --- a/src/sdk/conference/signaling.js +++ b/src/sdk/conference/signaling.js @@ -110,12 +110,13 @@ export class SioSignaling extends EventModule.EventDispatcher { let isMissingStart = false; for (const msg of data.messages) { if (isMissingStart) { - this.dispatchEvent(new EventModule.MessageEvent('data', { - message: { - notification: msg.event, - data: msg.data, - }, - })); + this.dispatchEvent( + new EventModule.MessageEvent('data', { + message: { + notification: msg.event, + data: msg.data, + }, + })); this._incrementMessageSequence(); } else if (msg.seq === this._messageSequence) { isMissingStart = true; @@ -225,6 +226,13 @@ export class SioSignaling extends EventModule.EventDispatcher { this._refreshReconnectionTicket = null; } + /** + * @function _clearReconnectionTask + * @instance + * @desc Increase the message sequence. + * @memberof Owt.Conference.SioSignaling + * @private. + */ _incrementMessageSequence() { if (this._messageSequence === maxSequence) { this._messageSequence = 0;