From 6c798e00442736b28c61fc50d235f2f1387ef499 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 26c01322..51710e4d 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 379cf5a1c35f8e685994aab5ff8b01d2319c64ff 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 51710e4d..e381d591 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 005ffb3c71b341cb85b58f434e5b81fc6bf8f382 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 e381d591..414251c4 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;