From 207030e5345c889201f38c9bd1d98b9b533e7b9d Mon Sep 17 00:00:00 2001 From: lialang Date: Tue, 10 Dec 2024 03:40:13 +0000 Subject: [PATCH] feat(mercury): add mercuryTimeOffset --- .../internal-plugin-mercury/src/mercury.js | 13 +++++++ .../test/unit/spec/mercury.js | 35 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/packages/@webex/internal-plugin-mercury/src/mercury.js b/packages/@webex/internal-plugin-mercury/src/mercury.js index 5c94ebc4265..26ab865298a 100644 --- a/packages/@webex/internal-plugin-mercury/src/mercury.js +++ b/packages/@webex/internal-plugin-mercury/src/mercury.js @@ -41,6 +41,10 @@ const Mercury = WebexPlugin.extend({ }, socket: 'object', localClusterServiceUrls: 'object', + mercuryTimeOffset: { + default: undefined, + type: 'number', + }, }, derived: { @@ -197,6 +201,7 @@ const Mercury = WebexPlugin.extend({ socket.on('close', (...args) => this._onclose(...args)); socket.on('message', (...args) => this._onmessage(...args)); + socket.on('pong', (...args) => this._setTimeOffset(...args)); socket.on('sequence-mismatch', (...args) => this._emit('sequence-mismatch', ...args)); socket.on('ping-pong-latency', (...args) => this._emit('ping-pong-latency', ...args)); @@ -486,6 +491,7 @@ const Mercury = WebexPlugin.extend({ }, _onmessage(event) { + this._setTimeOffset(event); const envelope = event.data; if (process.env.ENABLE_MERCURY_LOGGING) { @@ -529,6 +535,13 @@ const Mercury = WebexPlugin.extend({ }); }, + _setTimeOffset(event) { + const {wsWriteTimestamp} = event.data; + if (typeof wsWriteTimestamp === 'number' && wsWriteTimestamp > 0) { + this.mercuryTimeOffset = Date.now() - wsWriteTimestamp; + } + }, + _reconnect(webSocketUrl) { this.logger.info(`${this.namespace}: reconnecting`); diff --git a/packages/@webex/internal-plugin-mercury/test/unit/spec/mercury.js b/packages/@webex/internal-plugin-mercury/test/unit/spec/mercury.js index cd65a870e0c..9aca9da7ad3 100644 --- a/packages/@webex/internal-plugin-mercury/test/unit/spec/mercury.js +++ b/packages/@webex/internal-plugin-mercury/test/unit/spec/mercury.js @@ -773,6 +773,41 @@ describe('plugin-mercury', () => { }); }); + describe('#_setTimeOffset', () => { + it('sets mercuryTimeOffset based on the difference between wsWriteTimestamp and now', () => { + const event = { + data: { + wsWriteTimestamp: Date.now() - 60000, + } + }; + assert.isUndefined(mercury.mercuryTimeOffset); + mercury._setTimeOffset(event); + assert.isDefined(mercury.mercuryTimeOffset); + assert.isTrue(mercury.mercuryTimeOffset > 0); + }); + it('handles negative offsets', () => { + const event = { + data: { + wsWriteTimestamp: Date.now() + 60000, + } + }; + mercury._setTimeOffset(event); + assert.isTrue(mercury.mercuryTimeOffset < 0); + }); + it('handles invalid wsWriteTimestamp', () => { + const invalidTimestamps = [null, -1, 'invalid', undefined]; + invalidTimestamps.forEach(invalidTimestamp => { + const event = { + data: { + wsWriteTimestamp: invalidTimestamp, + } + }; + mercury._setTimeOffset(event); + assert.isUndefined(mercury.mercuryTimeOffset); + }); + }); + }); + describe('#_prepareUrl()', () => { beforeEach(() => { webex.internal.device.webSocketUrl = 'ws://example.com';