@webex/internal-plugin-mercury 3.12.0-next.42 → 3.12.0-next.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/mercury.js +45 -4
- package/dist/mercury.js.map +1 -1
- package/package.json +5 -5
- package/src/mercury.js +46 -3
- package/test/unit/spec/mercury-events.js +6 -0
- package/test/unit/spec/mercury.js +123 -0
package/dist/mercury.js
CHANGED
|
@@ -45,6 +45,7 @@ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof _Symbo
|
|
|
45
45
|
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? _Array$from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
46
46
|
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
47
47
|
var normalReconnectReasons = ['idle', 'done (forced)', 'pong not received', 'pong mismatch'];
|
|
48
|
+
var MERCURY_CLOSE_4000_METRIC = 'JS_SDK_MERCURY_CLOSE_4000';
|
|
48
49
|
var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mercury#listen(): Use Mercury#connect() instead'), _dec2 = (0, _common.deprecated)('Mercury#stopListening(): Use Mercury#disconnect() instead'), _obj = {
|
|
49
50
|
namespace: 'Mercury',
|
|
50
51
|
lastError: undefined,
|
|
@@ -774,6 +775,29 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
774
775
|
}
|
|
775
776
|
return handlers;
|
|
776
777
|
},
|
|
778
|
+
_submitMercuryClose4000Metric: function _submitMercuryClose4000Metric(sessionId, event, options) {
|
|
779
|
+
var action = options.action,
|
|
780
|
+
isActiveSocket = options.isActiveSocket,
|
|
781
|
+
messageType = options.messageType;
|
|
782
|
+
try {
|
|
783
|
+
this.webex.internal.metrics.submitClientMetrics(MERCURY_CLOSE_4000_METRIC, {
|
|
784
|
+
fields: {
|
|
785
|
+
action: action,
|
|
786
|
+
close_code: event.code,
|
|
787
|
+
close_reason: event.reason || '',
|
|
788
|
+
is_active_socket: isActiveSocket,
|
|
789
|
+
message_type: messageType,
|
|
790
|
+
session_id: sessionId
|
|
791
|
+
},
|
|
792
|
+
tags: {
|
|
793
|
+
action: action,
|
|
794
|
+
message_type: messageType
|
|
795
|
+
}
|
|
796
|
+
});
|
|
797
|
+
} catch (error) {
|
|
798
|
+
this.logger.warn("".concat(this.namespace, ": failed to submit Mercury 4000 close metric"), error);
|
|
799
|
+
}
|
|
800
|
+
},
|
|
777
801
|
_onclose: function _onclose(sessionId, event, sourceSocket) {
|
|
778
802
|
// I don't see any way to avoid the complexity or statement count in here.
|
|
779
803
|
/* eslint complexity: [0] */
|
|
@@ -821,9 +845,26 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
821
845
|
break;
|
|
822
846
|
case 4000:
|
|
823
847
|
// metric: disconnect
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
848
|
+
if (reason === 'replaced') {
|
|
849
|
+
this._submitMercuryClose4000Metric(sessionId, event, {
|
|
850
|
+
action: 'no_action',
|
|
851
|
+
isActiveSocket: isActiveSocket,
|
|
852
|
+
messageType: 'replaced'
|
|
853
|
+
});
|
|
854
|
+
this.logger.info("".concat(this.namespace, ": socket ").concat(sessionId, " replaced; will not reconnect"));
|
|
855
|
+
if (isActiveSocket) this._emit(sessionId, 'offline.replaced', event);
|
|
856
|
+
} else {
|
|
857
|
+
this._submitMercuryClose4000Metric(sessionId, event, {
|
|
858
|
+
action: isActiveSocket ? 'reconnect' : 'ignore_non_active',
|
|
859
|
+
isActiveSocket: isActiveSocket,
|
|
860
|
+
messageType: 'other'
|
|
861
|
+
});
|
|
862
|
+
this.logger.info("".concat(this.namespace, ": socket ").concat(sessionId, " disconnected with 4000: ").concat(event.reason, "; reconnecting"));
|
|
863
|
+
if (isActiveSocket) {
|
|
864
|
+
this._emit(sessionId, 'offline.transient', event);
|
|
865
|
+
this._reconnect(socketUrl, sessionId);
|
|
866
|
+
}
|
|
867
|
+
}
|
|
827
868
|
break;
|
|
828
869
|
case 4001:
|
|
829
870
|
// replaced during shutdown
|
|
@@ -937,7 +978,7 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
937
978
|
this.logger.info("".concat(this.namespace, ": reconnecting ").concat(sessionId));
|
|
938
979
|
return this.connect(webSocketUrl, sessionId);
|
|
939
980
|
},
|
|
940
|
-
version: "3.12.0-next.
|
|
981
|
+
version: "3.12.0-next.44"
|
|
941
982
|
}, (0, _applyDecoratedDescriptor2.default)(_obj, "listen", [_dec], (0, _getOwnPropertyDescriptor.default)(_obj, "listen"), _obj), (0, _applyDecoratedDescriptor2.default)(_obj, "stopListening", [_dec2], (0, _getOwnPropertyDescriptor.default)(_obj, "stopListening"), _obj), _obj));
|
|
942
983
|
var _default2 = exports.default = Mercury;
|
|
943
984
|
//# sourceMappingURL=mercury.js.map
|
package/dist/mercury.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_url","_interopRequireDefault","require","_webexCore","_common","_lodash","_backoff","_socket","_errors","_dec","_dec2","_obj","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor2","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createForOfIteratorHelper","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","_n","F","s","n","done","value","f","TypeError","a","u","call","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from","test","Array","normalReconnectReasons","Mercury","WebexPlugin","extend","deprecated","namespace","lastError","undefined","defaultSessionId","session","connected","type","connecting","hasEverConnected","sockets","_map","sessionWebSocketUrls","backoffCalls","_shutdownSwitchoverBackoffCalls","localClusterServiceUrls","mercuryTimeOffset","derived","listening","deps","fn","initialize","_this","on","envelope","data","webex","internal","feature","updateFeature","featureToggle","_this$webex$internal$","services","switchActiveClusterIds","_envelope$data","activeClusters","_this$webex$internal$2","invalidateCache","_envelope$data2","timestamp","_attachSocketEventListeners","socket","sessionId","_this2","event","_onclose","_len","args","_key","_onmessage","concat","_len2","_key2","_setTimeOffset","_len3","_key3","_emit","_len4","_key4","_handleImminentShutdown","_this3","oldSocket","get","logger","info","_shutdownSwitchoverId","_now","_connectWithBackoff","isShutdownSwitchover","attemptOptions","onSuccess","newSocket","webSocketUrl","hasConnectedSockets","url","then","catch","err","reason","error","delete","getLastError","getSockets","getSocket","hasConnectingSockets","connect","_this4","_connectPromises","has","sessionSocket","_promise","resolve","Error","stack","connectPromise","device","registered","register","finally","set","logout","disconnectAll","config","beforeLogoutOptionsCloseReason","includes","code","disconnect","options","_this5","_stringify","backoffCall","abort","shutdownSwitchoverBackoffCall","suffix","removeAllListeners","once","close","_this6","disconnectPromises","_iterator","keys","_step","all","clear","listen","stopListening","processRegistrationStatusEvent","message","_applyOverrides","headers","headerKeys","_keys","keyPath","_prepareUrl","_this7","getFeature","haMessagingEnabled","highPrioritySocketUrl","convertUrlToPriorityHostUrl","warn","_url$parse","hostFromUrl","parse","host","isValidHost","wsUrl","webSharedMercury","_assign","query","outboundWireFormat","bufferStates","aliasHttpStatus","mercuryRegistrationStatus","isRegistrationRefreshEnabled","_deleteProperty","multipleConnections","clientTimestamp","search","format","_attemptConnection","socketUrl","callback","_this8","_options$isShutdownSw","_options$onSuccess","Socket","newWSUrl","mode","msg","reject","_prepareAndOpenSocket","refresh","backoffCallNormal","getNumRetries","retries","UnknownResponse","NotAuthorized","credentials","force","BadRequest","Forbidden","ConnectionError","markFailedUrl","_this9","logPrefix","getUserToken","_ref","_ref2","_slicedToArray2","token","forceCloseDelay","pingInterval","pongTimeout","trackingId","defaultMercuryOptions","customOptionsMsg","open","_this0","context","_context$isShutdownSw","_context$attemptOptio","onComplete","sid","newMetrics","callDiagnosticMetrics","setMercuryConnectedStatus","backoff","attemptNum","setStrategy","ExponentialStrategy","initialDelay","backoffTimeReset","maxDelay","backoffTimeMax","initialConnectionMaxRetries","failAfter","maxRetries","number","delay","Math","min","strategy_","nextBackoffDelay_","process","env","NODE_ENV","debug","start","_len5","_key5","first","second","rest","eventName","trigger","_toConsumableArray2","logError","console","_getEventHandlers","eventType","_eventType$split","split","_eventType$split2","handlers","handlerName","camelCase","sourceSocket","toLowerCase","isActiveSocket","unset","_reconnect","_this1","ENABLE_MERCURY_LOGGING","reduce","promise","handler","_data$eventType$split","_data$eventType$split2","wsWriteTimestamp","version","_applyDecoratedDescriptor2","_getOwnPropertyDescriptor","_default2","exports"],"sources":["mercury.js"],"sourcesContent":["/* eslint-disable require-jsdoc */\n/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport url from 'url';\n\nimport {WebexPlugin} from '@webex/webex-core';\nimport {deprecated} from '@webex/common';\nimport {camelCase, get, set} from 'lodash';\nimport backoff from 'backoff';\n\nimport Socket from './socket';\nimport {\n BadRequest,\n Forbidden,\n NotAuthorized,\n UnknownResponse,\n ConnectionError,\n // NotFound\n} from './errors';\n\nconst normalReconnectReasons = ['idle', 'done (forced)', 'pong not received', 'pong mismatch'];\n\nconst Mercury = WebexPlugin.extend({\n namespace: 'Mercury',\n lastError: undefined,\n defaultSessionId: 'mercury-default-session',\n\n session: {\n connected: {\n default: false,\n type: 'boolean',\n },\n connecting: {\n default: false,\n type: 'boolean',\n },\n hasEverConnected: {\n default: false,\n type: 'boolean',\n },\n sockets: {\n default: () => new Map(),\n type: 'object',\n },\n sessionWebSocketUrls: {\n default: () => new Map(),\n type: 'object',\n },\n backoffCalls: {\n default: () => new Map(),\n type: 'object',\n },\n _shutdownSwitchoverBackoffCalls: {\n default: () => new Map(),\n type: 'object',\n },\n localClusterServiceUrls: 'object',\n mercuryTimeOffset: {\n default: undefined,\n type: 'number',\n },\n },\n\n derived: {\n listening: {\n deps: ['connected'],\n fn() {\n return this.connected;\n },\n },\n },\n\n initialize() {\n /*\n When one of these legacy feature gets updated, this event would be triggered\n * group-message-notifications\n * mention-notifications\n * thread-notifications\n */\n this.on('event:featureToggle_update', (envelope) => {\n if (envelope && envelope.data) {\n this.webex.internal.feature.updateFeature(envelope.data.featureToggle);\n }\n });\n /*\n * When Cluster Migrations, notify clients using ActiveClusterStatusEvent via mercury\n * https://wwwin-github.cisco.com/pages/Webex/crr-docs/techdocs/rr-002.html#wip-notifying-clients-of-cluster-migrations\n * */\n this.on('event:ActiveClusterStatusEvent', (envelope) => {\n if (\n typeof this.webex.internal.services?.switchActiveClusterIds === 'function' &&\n envelope &&\n envelope.data\n ) {\n this.webex.internal.services.switchActiveClusterIds(envelope.data?.activeClusters);\n }\n });\n /*\n * Using cache-invalidation via mercury to instead the method of polling via the new /timestamp endpoint from u2c\n * https://wwwin-github.cisco.com/pages/Webex/crr-docs/techdocs/rr-005.html#websocket-notifications\n * */\n this.on('event:u2c.cache-invalidation', (envelope) => {\n if (\n typeof this.webex.internal.services?.invalidateCache === 'function' &&\n envelope &&\n envelope.data\n ) {\n this.webex.internal.services.invalidateCache(envelope.data?.timestamp);\n }\n });\n },\n\n /**\n * Attach event listeners to a socket.\n * @param {Socket} socket - The socket to attach listeners to\n * @param {sessionId} sessionId - The socket related session ID\n * @returns {void}\n */\n _attachSocketEventListeners(socket, sessionId) {\n socket.on('close', (event) => this._onclose(sessionId, event, socket));\n socket.on('message', (...args) => this._onmessage(sessionId, ...args));\n socket.on('pong', (...args) => this._setTimeOffset(sessionId, ...args));\n socket.on('sequence-mismatch', (...args) =>\n this._emit(sessionId, 'sequence-mismatch', ...args)\n );\n socket.on('ping-pong-latency', (...args) =>\n this._emit(sessionId, 'ping-pong-latency', ...args)\n );\n },\n\n /**\n * Handle imminent shutdown by establishing a new connection while keeping\n * the current one alive (make-before-break).\n * Idempotent: will no-op if already in progress.\n * @param {string} sessionId - The session ID for which the shutdown is imminent\n * @returns {void}\n */\n _handleImminentShutdown(sessionId) {\n const oldSocket = this.sockets.get(sessionId);\n\n try {\n // Idempotent: if we already have a switchover backoff call for this session,\n // a switchover is in progress – do nothing.\n if (this._shutdownSwitchoverBackoffCalls.get(sessionId)) {\n this.logger.info(\n `${this.namespace}: [shutdown] switchover already in progress for ${sessionId}`\n );\n\n return;\n }\n\n this._shutdownSwitchoverId = `${Date.now()}`;\n this.logger.info(\n `${this.namespace}: [shutdown] switchover start, id=${this._shutdownSwitchoverId} for ${sessionId}`\n );\n\n this._connectWithBackoff(undefined, sessionId, {\n isShutdownSwitchover: true,\n attemptOptions: {\n isShutdownSwitchover: true,\n onSuccess: (newSocket, webSocketUrl) => {\n this.logger.info(\n `${this.namespace}: [shutdown] switchover connected, url: ${webSocketUrl} for ${sessionId}`\n );\n\n // Atomically switch active socket reference\n this.socket = this.sockets.get(this.defaultSessionId);\n this.connected = this.hasConnectedSockets(); // remain connected throughout\n\n this._emit(sessionId, 'event:mercury_shutdown_switchover_complete', {\n url: webSocketUrl,\n });\n\n if (oldSocket) {\n this.logger.info(\n `${this.namespace}: [shutdown] old socket retained; server will close with 4001`\n );\n }\n },\n },\n })\n .then(() => {\n this.logger.info(\n `${this.namespace}: [shutdown] switchover completed successfully for ${sessionId}`\n );\n })\n .catch((err) => {\n this.logger.info(\n `${this.namespace}: [shutdown] switchover exhausted retries; will fall back to normal reconnection for ${sessionId}: `,\n err\n );\n this._emit(sessionId, 'event:mercury_shutdown_switchover_failed', {reason: err});\n // Old socket will eventually close with 4001, triggering normal reconnection\n });\n } catch (e) {\n this.logger.error(\n `${this.namespace}: [shutdown] error during switchover for ${sessionId}`,\n e\n );\n this._shutdownSwitchoverBackoffCalls.delete(sessionId);\n this._emit(sessionId, 'event:mercury_shutdown_switchover_failed', {reason: e});\n }\n },\n\n /**\n * Get the last error.\n * @returns {any} The last error.\n */\n getLastError() {\n return this.lastError;\n },\n\n /**\n * Get all active socket connections\n * @returns {Map} Map of sessionId to socket instances\n */\n getSockets() {\n return this.sockets;\n },\n\n /**\n * Get a specific socket by connection ID\n * @param {string} sessionId - The connection identifier\n * @returns {Socket|undefined} The socket instance or undefined if not found\n */\n getSocket(sessionId = this.defaultSessionId) {\n return this.sockets.get(sessionId);\n },\n\n /**\n * Check if a socket is connected\n * @param {string} [sessionId=this.defaultSessionId] - The session identifier\n * @returns {boolean|undefined} True if the socket is connected\n */\n hasConnectedSockets(sessionId = this.defaultSessionId) {\n const socket = this.sockets.get(sessionId || this.defaultSessionId);\n\n return socket?.connected;\n },\n\n /**\n * Check if any sockets are connecting\n * @param {string} [sessionId=this.defaultSessionId] - The session identifier\n * @returns {boolean|undefined} True if the socket is connecting\n */\n hasConnectingSockets(sessionId = this.defaultSessionId) {\n const socket = this.sockets.get(sessionId || this.defaultSessionId);\n\n return socket?.connecting;\n },\n\n /**\n * Connect to Mercury for a specific session.\n * @param {string} [webSocketUrl] - Optional websocket URL override. Falls back to the device websocket URL.\n * @param {string} [sessionId=this.defaultSessionId] - The session identifier for this connection.\n * @returns {Promise<void>} Resolves when connection flow completes for the session.\n */\n connect(webSocketUrl, sessionId = this.defaultSessionId) {\n if (!this._connectPromises) this._connectPromises = new Map();\n\n // First check if there's already a connection promise for this session\n if (this._connectPromises.has(sessionId)) {\n this.logger.info(\n `${this.namespace}: connection ${sessionId} already in progress, returning existing promise`\n );\n\n return this._connectPromises.get(sessionId);\n }\n\n const sessionSocket = this.sockets.get(sessionId);\n if (sessionSocket?.connected || sessionSocket?.connecting) {\n this.logger.info(\n `${this.namespace}: connection ${sessionId} already connected, will not connect again`\n );\n\n return Promise.resolve();\n }\n\n this.connecting = true;\n\n this.logger.info(`${this.namespace}: starting connection attempt for ${sessionId}`);\n this.logger.info(\n `${this.namespace}: debug_mercury_logging stack: `,\n new Error('debug_mercury_logging').stack\n );\n\n const connectPromise = Promise.resolve(\n this.webex.internal.device.registered || this.webex.internal.device.register()\n )\n .then(() => {\n this.logger.info(`${this.namespace}: connecting ${sessionId}`);\n\n return this._connectWithBackoff(webSocketUrl, sessionId);\n })\n .finally(() => {\n this._connectPromises.delete(sessionId);\n });\n\n this._connectPromises.set(sessionId, connectPromise);\n\n return connectPromise;\n },\n\n logout() {\n this.logger.info(`${this.namespace}: logout() called`);\n this.logger.info(\n `${this.namespace}: debug_mercury_logging stack: `,\n new Error('debug_mercury_logging').stack\n );\n\n return this.disconnectAll(\n this.config.beforeLogoutOptionsCloseReason &&\n !normalReconnectReasons.includes(this.config.beforeLogoutOptionsCloseReason)\n ? {code: 3050, reason: this.config.beforeLogoutOptionsCloseReason}\n : undefined\n );\n },\n\n /**\n * Disconnect a Mercury socket for a specific session.\n * @param {object} [options] - Optional websocket close options (for example: `{code, reason}`).\n * @param {string} [sessionId=this.defaultSessionId] - The session identifier to disconnect.\n * @returns {Promise<void>} Resolves after disconnect cleanup and close handling are initiated/completed.\n */\n disconnect(options, sessionId = this.defaultSessionId) {\n this.logger.info(\n `${this.namespace}#disconnect: connecting state: ${this.connecting}, connected state: ${\n this.connected\n }, socket exists: ${!!this.socket}, options: ${JSON.stringify(options)}`\n );\n\n return new Promise((resolve) => {\n const backoffCall = this.backoffCalls.get(sessionId);\n if (backoffCall) {\n this.logger.info(`${this.namespace}: aborting connection ${sessionId}`);\n backoffCall.abort();\n this.backoffCalls.delete(sessionId);\n }\n const shutdownSwitchoverBackoffCall = this._shutdownSwitchoverBackoffCalls.get(sessionId);\n if (shutdownSwitchoverBackoffCall) {\n this.logger.info(`${this.namespace}: aborting shutdown switchover connection ${sessionId}`);\n shutdownSwitchoverBackoffCall.abort();\n this._shutdownSwitchoverBackoffCalls.delete(sessionId);\n }\n // Clean up any pending connection promises\n if (this._connectPromises) {\n this._connectPromises.delete(sessionId);\n }\n\n const sessionSocket = this.sockets.get(sessionId);\n const suffix = sessionId === this.defaultSessionId ? '' : `:${sessionId}`;\n\n if (sessionSocket) {\n sessionSocket.removeAllListeners('message');\n sessionSocket.connecting = false;\n sessionSocket.connected = false;\n this.once(sessionId === this.defaultSessionId ? 'offline' : `offline${suffix}`, resolve);\n resolve(sessionSocket.close(options || undefined));\n }\n resolve();\n\n // Update overall connected status\n this.connected = this.hasConnectedSockets();\n });\n },\n\n /**\n * Disconnect all socket connections\n * @param {object} options - Close options\n * @returns {Promise} Promise that resolves when all connections are closed\n */\n disconnectAll(options) {\n const disconnectPromises = [];\n\n for (const sessionId of this.sockets.keys()) {\n disconnectPromises.push(this.disconnect(options, sessionId));\n }\n\n return Promise.all(disconnectPromises).then(() => {\n this.connected = false;\n this.sockets.clear();\n this.sessionWebSocketUrls.clear();\n this.backoffCalls.clear();\n // Clear connection promises to prevent stale promises\n if (this._connectPromises) {\n this._connectPromises.clear();\n }\n });\n },\n\n @deprecated('Mercury#listen(): Use Mercury#connect() instead')\n listen() {\n /* eslint no-invalid-this: [0] */\n return this.connect();\n },\n\n @deprecated('Mercury#stopListening(): Use Mercury#disconnect() instead')\n stopListening() {\n /* eslint no-invalid-this: [0] */\n return this.disconnect();\n },\n\n processRegistrationStatusEvent(message) {\n this.localClusterServiceUrls = message.localClusterServiceUrls;\n },\n\n _applyOverrides(event) {\n if (!event || !event.headers) {\n return;\n }\n const headerKeys = Object.keys(event.headers);\n\n headerKeys.forEach((keyPath) => {\n set(event, keyPath, event.headers[keyPath]);\n });\n },\n\n _prepareUrl(webSocketUrl) {\n if (!webSocketUrl) {\n webSocketUrl = this.webex.internal.device.webSocketUrl;\n }\n\n return this.webex.internal.feature\n .getFeature('developer', 'web-high-availability')\n .then((haMessagingEnabled) => {\n if (haMessagingEnabled) {\n let highPrioritySocketUrl;\n try {\n highPrioritySocketUrl =\n this.webex.internal.services.convertUrlToPriorityHostUrl(webSocketUrl);\n } catch (e) {\n this.logger.warn(`${this.namespace}: error converting to high priority url`, e);\n }\n if (!highPrioritySocketUrl) {\n const hostFromUrl = url.parse(webSocketUrl, true)?.host;\n const isValidHost = this.webex.internal.services.isValidHost(hostFromUrl);\n if (!isValidHost) {\n this.logger.error(\n `${this.namespace}: host ${hostFromUrl} is not a valid host from host catalog`\n );\n\n return '';\n }\n }\n\n return highPrioritySocketUrl || webSocketUrl;\n }\n\n return webSocketUrl;\n })\n .then((wsUrl) => {\n webSocketUrl = wsUrl;\n })\n .then(() => this.webex.internal.feature.getFeature('developer', 'web-shared-mercury'))\n .then((webSharedMercury) => {\n if (!webSocketUrl) {\n return '';\n }\n webSocketUrl = url.parse(webSocketUrl, true);\n Object.assign(webSocketUrl.query, {\n outboundWireFormat: 'text',\n bufferStates: true,\n aliasHttpStatus: true,\n });\n\n if (webSharedMercury) {\n Object.assign(webSocketUrl.query, {\n mercuryRegistrationStatus: true,\n isRegistrationRefreshEnabled: true,\n });\n Reflect.deleteProperty(webSocketUrl.query, 'bufferStates');\n }\n\n if (get(this, 'webex.config.device.ephemeral', false)) {\n webSocketUrl.query.multipleConnections = true;\n }\n\n webSocketUrl.query.clientTimestamp = Date.now();\n delete webSocketUrl.search;\n\n return url.format(webSocketUrl);\n });\n },\n\n _attemptConnection(socketUrl, sessionId, callback, options = {}) {\n const {isShutdownSwitchover = false, onSuccess = null} = options;\n\n const socket = new Socket();\n socket.connecting = true;\n let newWSUrl;\n\n this._attachSocketEventListeners(socket, sessionId);\n\n const backoffCall = isShutdownSwitchover\n ? this._shutdownSwitchoverBackoffCalls.get(sessionId)\n : this.backoffCalls.get(sessionId);\n\n // Check appropriate backoff call based on connection type\n if (!backoffCall) {\n const mode = isShutdownSwitchover ? 'switchover backoff call' : 'backoffCall';\n const msg = `${this.namespace}: prevent socket open when ${mode} no longer defined for ${sessionId}`;\n const err = new Error(msg);\n\n this.logger.info(msg);\n\n // Call the callback with the error before rejecting\n callback(err);\n\n return Promise.reject(err);\n }\n\n // For shutdown switchover, don't set socket yet (make-before-break)\n // For normal connection, set socket before opening to allow disconnect() to close it\n if (!isShutdownSwitchover) {\n this.sockets.set(sessionId, socket);\n }\n\n return this._prepareAndOpenSocket(socket, socketUrl, sessionId, isShutdownSwitchover)\n .then((webSocketUrl) => {\n newWSUrl = webSocketUrl;\n\n this.logger.info(\n `${this.namespace}: ${\n isShutdownSwitchover ? '[shutdown] switchover' : ''\n } connected to mercury, success, action: connected for ${sessionId}, url: ${newWSUrl}`\n );\n\n // Custom success handler for shutdown switchover\n if (onSuccess) {\n onSuccess(socket, webSocketUrl);\n callback();\n\n return Promise.resolve();\n }\n\n // Default behavior for normal connection\n callback();\n\n return this.webex.internal.feature\n .getFeature('developer', 'web-high-availability')\n .then((haMessagingEnabled) => {\n if (haMessagingEnabled) {\n return this.webex.internal.device.refresh();\n }\n\n return Promise.resolve();\n });\n })\n .catch((reason) => {\n // For shutdown, simpler error handling - just callback for retry\n if (isShutdownSwitchover) {\n this.logger.info(\n `${this.namespace}: [shutdown] switchover attempt failed for ${sessionId}`,\n reason\n );\n\n return callback(reason);\n }\n\n // Normal connection error handling (existing complex logic)\n this.lastError = reason; // remember the last error\n\n const backoffCallNormal = this.backoffCalls.get(sessionId);\n // Suppress connection errors that appear to be network related. This\n // may end up suppressing metrics during outages, but we might not care\n // (especially since many of our outages happen in a way that client\n // metrics can't be trusted).\n if (reason.code !== 1006 && backoffCallNormal && backoffCallNormal?.getNumRetries() > 0) {\n this._emit(sessionId, 'connection_failed', reason, {\n sessionId,\n retries: backoffCallNormal?.getNumRetries(),\n });\n }\n this.logger.info(\n `${this.namespace}: connection attempt failed for ${sessionId}`,\n reason,\n backoffCallNormal?.getNumRetries() === 0 ? reason.stack : ''\n );\n // UnknownResponse is produced by IE for any 4XXX; treated it like a bad\n // web socket url and let WDM handle the token checking\n if (reason instanceof UnknownResponse) {\n this.logger.info(\n `${this.namespace}: received unknown response code for ${sessionId}, refreshing device registration`\n );\n\n return this.webex.internal.device.refresh().then(() => callback(reason));\n }\n // NotAuthorized implies expired token\n if (reason instanceof NotAuthorized) {\n this.logger.info(\n `${this.namespace}: received authorization error for ${sessionId}, reauthorizing`\n );\n\n return this.webex.credentials.refresh({force: true}).then(() => callback(reason));\n }\n // // NotFound implies expired web socket url\n // else if (reason instanceof NotFound) {\n // this.logger.info(`mercury: received not found error, refreshing device registration`);\n // return this.webex.internal.device.refresh()\n // .then(() => callback(reason));\n // }\n // BadRequest implies current credentials are for a Service Account\n // Forbidden implies current user is not entitle for Webex\n if (reason instanceof BadRequest || reason instanceof Forbidden) {\n this.logger.warn(\n `${this.namespace}: received unrecoverable response from mercury for ${sessionId}`\n );\n backoffCallNormal?.abort();\n\n return callback(reason);\n }\n if (reason instanceof ConnectionError) {\n return this.webex.internal.feature\n .getFeature('developer', 'web-high-availability')\n .then((haMessagingEnabled) => {\n const wsUrl = newWSUrl || reason.webSocketUrl;\n\n if (haMessagingEnabled) {\n this.logger.info(\n `${this.namespace}: received a generic connection error for ${sessionId}, will try to connect to another datacenter. failed, action: 'failed', url: ${wsUrl} error: ${reason.message}`\n );\n\n if (wsUrl) {\n this.logger.info(\n `${this.namespace}: marking ${wsUrl} as failed for ${sessionId} due to connection error`\n );\n\n return this.webex.internal.services.markFailedUrl(wsUrl);\n }\n\n this.logger.info(\n `${this.namespace}: no socket url available to mark as failed for ${sessionId} due to connection error`\n );\n }\n\n return null;\n })\n .then(() => callback(reason));\n }\n\n return callback(reason);\n })\n .catch((reason) => {\n this.logger.error(\n `${this.namespace}: failed to handle connection failure for ${sessionId}`,\n reason\n );\n callback(reason);\n });\n },\n\n _prepareAndOpenSocket(socket, socketUrl, sessionId, isShutdownSwitchover = false) {\n const logPrefix = isShutdownSwitchover ? '[shutdown] switchover' : 'connection';\n\n return Promise.all([this._prepareUrl(socketUrl), this.webex.credentials.getUserToken()]).then(\n ([webSocketUrl, token]) => {\n let options = {\n forceCloseDelay: this.config.forceCloseDelay,\n pingInterval: this.config.pingInterval,\n pongTimeout: this.config.pongTimeout,\n token: token.toString(),\n trackingId: `${this.webex.sessionId}_${Date.now()}`,\n logger: this.logger,\n };\n\n if (this.webex.config.defaultMercuryOptions) {\n const customOptionsMsg = isShutdownSwitchover\n ? 'setting custom options for switchover'\n : 'setting custom options';\n\n this.logger.info(`${this.namespace}: ${customOptionsMsg}`);\n options = {...options, ...this.webex.config.defaultMercuryOptions};\n }\n\n // Set the socket before opening it. This allows a disconnect() to close\n // the socket if it is in the process of being opened.\n this.sockets.set(sessionId, socket);\n this.socket = this.sockets.get(this.defaultSessionId);\n\n this.logger.info(`${this.namespace} ${logPrefix} url for ${sessionId}: ${webSocketUrl}`);\n\n // Remember the resolved URL used to open this socket so that\n // reconnection in _onclose re-derives from a catalog-valid host. This is\n // captured before socket.open(), which a lower layer (e.g. the same-site\n // websocket proxy done with interceptors) may rewrite into a non-catalog host.\n // Reusing the post-proxy native socket URL would fail\n // host-catalog validation in _prepareUrl and block reconnection.\n this.sessionWebSocketUrls.set(sessionId, webSocketUrl);\n\n return socket\n .open(webSocketUrl, options)\n .then(() => webSocketUrl)\n .catch((err) => {\n err.webSocketUrl = webSocketUrl;\n\n return Promise.reject(err);\n });\n }\n );\n },\n\n _connectWithBackoff(webSocketUrl, sessionId, context = {}) {\n const {isShutdownSwitchover = false, attemptOptions = {}} = context;\n\n return new Promise((resolve, reject) => {\n // eslint gets confused about whether call is actually used\n // eslint-disable-next-line prefer-const\n let call;\n const onComplete = (err, sid = sessionId) => {\n if (isShutdownSwitchover) {\n this._shutdownSwitchoverBackoffCalls.delete(sid);\n } else {\n this.backoffCalls.delete(sid);\n }\n const sessionSocket = this.sockets.get(sid);\n if (err) {\n const msg = isShutdownSwitchover\n ? `[shutdown] switchover failed after ${call.getNumRetries()} retries`\n : `failed to connect after ${call.getNumRetries()} retries`;\n\n this.logger.info(\n `${this.namespace}: ${msg}; log statement about next retry was inaccurate; ${err}`\n );\n if (sessionSocket) {\n sessionSocket.connecting = false;\n sessionSocket.connected = false;\n }\n\n return reject(err);\n }\n\n // Update overall connected status\n if (sessionSocket) {\n sessionSocket.connecting = false;\n sessionSocket.connected = true;\n }\n // Default success handling for normal connections\n if (!isShutdownSwitchover) {\n this.connecting = this.hasConnectingSockets();\n this.connected = this.hasConnectedSockets();\n this.hasEverConnected = true;\n this._emit(sid, 'online');\n if (this.connected) {\n this.webex.internal.newMetrics.callDiagnosticMetrics.setMercuryConnectedStatus(true);\n }\n }\n\n return resolve();\n };\n // eslint-disable-next-line prefer-reflect\n call = backoff.call(\n (callback) => {\n const attemptNum = call.getNumRetries();\n const logPrefix = isShutdownSwitchover ? '[shutdown] switchover' : 'connection';\n\n this.logger.info(\n `${this.namespace}: executing ${logPrefix} attempt ${attemptNum} for ${sessionId}`\n );\n this._attemptConnection(webSocketUrl, sessionId, callback, attemptOptions);\n },\n (err) => onComplete(err, sessionId)\n );\n\n call.setStrategy(\n new backoff.ExponentialStrategy({\n initialDelay: this.config.backoffTimeReset,\n maxDelay: this.config.backoffTimeMax,\n })\n );\n\n if (\n this.config.initialConnectionMaxRetries &&\n !this.hasEverConnected &&\n !isShutdownSwitchover\n ) {\n call.failAfter(this.config.initialConnectionMaxRetries);\n } else if (this.config.maxRetries) {\n call.failAfter(this.config.maxRetries);\n }\n\n // Store the call BEFORE setting up event handlers to prevent race conditions\n // Store backoff call reference BEFORE starting (so it's available in _attemptConnection)\n if (isShutdownSwitchover) {\n this._shutdownSwitchoverBackoffCalls.set(sessionId, call);\n } else {\n this.backoffCalls.set(sessionId, call);\n }\n\n call.on('abort', () => {\n const msg = isShutdownSwitchover ? 'Shutdown Switchover' : 'Connection';\n\n this.logger.info(`${this.namespace}: ${msg} aborted for ${sessionId}`);\n reject(new Error(`Mercury ${msg} Aborted for ${sessionId}`));\n });\n\n call.on('callback', (err) => {\n if (err) {\n const number = call.getNumRetries();\n const delay = Math.min(call.strategy_.nextBackoffDelay_, this.config.backoffTimeMax);\n\n const logPrefix = isShutdownSwitchover ? '[shutdown] switchover' : '';\n\n this.logger.info(\n `${this.namespace}: ${logPrefix} failed to connect; attempting retry ${\n number + 1\n } in ${delay} ms for ${sessionId}`\n );\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'development') {\n this.logger.debug(`${this.namespace}: `, err, err.stack);\n }\n\n return;\n }\n this.logger.info(`${this.namespace}: connected ${sessionId}`);\n });\n\n call.start();\n });\n },\n\n _emit(...args) {\n try {\n if (!args || args.length === 0) {\n return;\n }\n\n // New signature: _emit(sessionId, eventName, ...rest)\n // Backwards compatibility: if the first arg isn't a known sessionId (or defaultSessionId),\n // treat the call as the old signature and forward directly to trigger(...)\n const [first, second, ...rest] = args;\n\n if (typeof first === 'string' && typeof second === 'string') {\n const sessionId = first;\n const eventName = second;\n const suffix = sessionId === this.defaultSessionId ? '' : `:${sessionId}`;\n\n this.trigger(`${eventName}${suffix}`, ...rest);\n } else {\n // Old usage: _emit(eventName, ...args)\n this.trigger(...args);\n }\n } catch (error) {\n // Safely handle errors without causing additional issues during cleanup\n try {\n this.logger.error(\n `${this.namespace}: error occurred in event handler:`,\n error,\n ' with args: ',\n args\n );\n } catch (logError) {\n // If even logging fails, just ignore to prevent cascading errors during cleanup\n // eslint-disable-next-line no-console\n console.error('Mercury _emit error handling failed:', logError);\n }\n }\n },\n\n _getEventHandlers(eventType) {\n if (!eventType) {\n return [];\n }\n const [namespace, name] = eventType.split('.');\n const handlers = [];\n\n if (!this.webex[namespace] && !this.webex.internal[namespace]) {\n return handlers;\n }\n\n const handlerName = camelCase(`process_${name}_event`);\n\n if ((this.webex[namespace] || this.webex.internal[namespace])[handlerName]) {\n handlers.push({\n name: handlerName,\n namespace,\n });\n }\n\n return handlers;\n },\n\n _onclose(sessionId, event, sourceSocket) {\n // I don't see any way to avoid the complexity or statement count in here.\n /* eslint complexity: [0] */\n\n try {\n const reason = event.reason && event.reason.toLowerCase();\n const sessionSocket = this.sockets.get(sessionId);\n event.sessionId = sessionId;\n\n const isActiveSocket = sourceSocket === sessionSocket;\n // Reconnect using the resolved URL this session's socket was\n // opened with, captured in _prepareAndOpenSocket. Do NOT reuse\n // sourceSocket.url: that reflects the URL the native WebSocket was\n // actually opened with, which a lower layer may have rewritten\n // (e.g. via interceptors) into a host that is not in the SDK host\n // catalog. Feeding such a URL back into _prepareUrl fails host-catalog\n // validation and permanently blocks reconnection.\n const socketUrl = this.sessionWebSocketUrls.get(sessionId);\n\n this.sockets.delete(sessionId);\n\n if (isActiveSocket) {\n // Only tear down state if the currently active socket closed\n if (sessionSocket) {\n sessionSocket.removeAllListeners();\n if (sessionId === this.defaultSessionId) this.unset('socket');\n this._emit(sessionId, 'offline', event);\n }\n // Update overall connected status\n this.connecting = this.hasConnectingSockets();\n this.connected = this.hasConnectedSockets();\n\n if (!this.connected) {\n this.webex.internal.newMetrics.callDiagnosticMetrics.setMercuryConnectedStatus(false);\n }\n } else {\n // Old socket closed; do not flip connection state\n this.logger.info(\n `${this.namespace}: [shutdown] non-active socket closed, code=${event.code} for ${sessionId}`\n );\n // Clean up listeners from old socket now that it's closed\n if (sourceSocket) {\n sourceSocket.removeAllListeners();\n }\n }\n\n switch (event.code) {\n case 1003:\n // metric: disconnect\n this.logger.info(\n `${this.namespace}: Mercury service rejected last message for ${sessionId}; will not reconnect: ${event.reason}`\n );\n if (isActiveSocket) this._emit(sessionId, 'offline.permanent', event);\n break;\n case 4000:\n // metric: disconnect\n this.logger.info(`${this.namespace}: socket ${sessionId} replaced; will not reconnect`);\n if (isActiveSocket) this._emit(sessionId, 'offline.replaced', event);\n // If not active, nothing to do\n break;\n case 4001:\n // replaced during shutdown\n if (isActiveSocket) {\n // Server closed active socket with 4001, meaning it expected this connection\n // to be replaced, but the switchover in _handleImminentShutdown failed.\n // This is a permanent failure - do not reconnect.\n this.logger.warn(\n `${this.namespace}: active socket closed with 4001; shutdown switchover failed for ${sessionId}`\n );\n this._emit(sessionId, 'offline.permanent', event);\n } else {\n // Expected: old socket closed after successful switchover\n this.logger.info(\n `${this.namespace}: old socket closed with 4001 (replaced during shutdown); no reconnect needed for ${sessionId}`\n );\n this._emit(sessionId, 'offline.replaced', event);\n }\n break;\n case 1001:\n case 1005:\n case 1006:\n case 1011:\n this.logger.info(`${this.namespace}: socket ${sessionId} disconnected; reconnecting`);\n if (isActiveSocket) {\n this._emit(sessionId, 'offline.transient', event);\n this.logger.info(\n `${this.namespace}: [shutdown] reconnecting active socket to recover for ${sessionId}`\n );\n this._reconnect(socketUrl, sessionId);\n }\n // metric: disconnect\n // if (code == 1011 && reason !== ping error) metric: unexpected disconnect\n break;\n case 1000:\n case 3050: // 3050 indicates logout form of closure, default to old behavior, use config reason defined by consumer to proceed with the permanent block\n if (normalReconnectReasons.includes(reason)) {\n this.logger.info(`${this.namespace}: socket ${sessionId} disconnected; reconnecting`);\n if (isActiveSocket) {\n this._emit(sessionId, 'offline.transient', event);\n this.logger.info(\n `${this.namespace}: [shutdown] reconnecting due to normal close for ${sessionId}`\n );\n this._reconnect(socketUrl, sessionId);\n }\n // metric: disconnect\n // if (reason === done forced) metric: force closure\n } else {\n this.logger.info(\n `${this.namespace}: socket ${sessionId} disconnected; will not reconnect: ${event.reason}`\n );\n if (isActiveSocket) this._emit(sessionId, 'offline.permanent', event);\n }\n break;\n default:\n this.logger.info(\n `${this.namespace}: socket ${sessionId} disconnected unexpectedly; will not reconnect`\n );\n // unexpected disconnect\n if (isActiveSocket) this._emit(sessionId, 'offline.permanent', event);\n }\n } catch (error) {\n this.logger.error(\n `${this.namespace}: error occurred in close handler for ${sessionId}`,\n error\n );\n }\n },\n\n _onmessage(sessionId, event) {\n this._setTimeOffset(sessionId, event);\n const envelope = event.data;\n\n if (process.env.ENABLE_MERCURY_LOGGING) {\n this.logger.debug(`${this.namespace}: message envelope from ${sessionId}: `, envelope);\n }\n\n envelope.sessionId = sessionId;\n\n // Handle shutdown message shape: { type: 'shutdown' }\n if (envelope && envelope.type === 'shutdown') {\n this.logger.info(\n `${this.namespace}: [shutdown] imminent shutdown message received for ${sessionId}`\n );\n this._emit(sessionId, 'event:mercury_shutdown_imminent', envelope);\n\n this._handleImminentShutdown(sessionId);\n\n return Promise.resolve();\n }\n\n envelope.sessionId = sessionId;\n const {data} = envelope;\n\n this._applyOverrides(data);\n\n if (!data || !data.eventType) {\n this._emit(sessionId, 'event', envelope);\n\n return Promise.resolve();\n }\n\n return this._getEventHandlers(data.eventType)\n .reduce(\n (promise, handler) =>\n promise.then(() => {\n const {namespace, name} = handler;\n\n return new Promise((resolve) =>\n resolve((this.webex[namespace] || this.webex.internal[namespace])[name](data))\n ).catch((reason) =>\n this.logger.error(\n `${this.namespace}: error occurred in autowired event handler for ${data.eventType} from ${sessionId}`,\n reason\n )\n );\n }),\n Promise.resolve()\n )\n .then(() => {\n this._emit(sessionId, 'event', envelope);\n const [namespace] = data.eventType.split('.');\n\n if (namespace === data.eventType) {\n this._emit(sessionId, `event:${namespace}`, envelope);\n } else {\n this._emit(sessionId, `event:${namespace}`, envelope);\n this._emit(sessionId, `event:${data.eventType}`, envelope);\n }\n })\n .catch((reason) => {\n this.logger.error(\n `${this.namespace}: error occurred processing socket message from ${sessionId}`,\n reason\n );\n });\n },\n\n _setTimeOffset(sessionId, event) {\n const {wsWriteTimestamp} = event.data;\n if (typeof wsWriteTimestamp === 'number' && wsWriteTimestamp > 0) {\n this.mercuryTimeOffset = Date.now() - wsWriteTimestamp;\n }\n },\n\n _reconnect(webSocketUrl, sessionId = this.defaultSessionId) {\n this.logger.info(`${this.namespace}: reconnecting ${sessionId}`);\n\n return this.connect(webSocketUrl, sessionId);\n },\n});\n\nexport default Mercury;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_url","_interopRequireDefault","require","_webexCore","_common","_lodash","_backoff","_socket","_errors","_dec","_dec2","_obj","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor2","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createForOfIteratorHelper","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","_n","F","s","n","done","value","f","TypeError","a","u","call","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from","test","Array","normalReconnectReasons","MERCURY_CLOSE_4000_METRIC","Mercury","WebexPlugin","extend","deprecated","namespace","lastError","undefined","defaultSessionId","session","connected","type","connecting","hasEverConnected","sockets","_map","sessionWebSocketUrls","backoffCalls","_shutdownSwitchoverBackoffCalls","localClusterServiceUrls","mercuryTimeOffset","derived","listening","deps","fn","initialize","_this","on","envelope","data","webex","internal","feature","updateFeature","featureToggle","_this$webex$internal$","services","switchActiveClusterIds","_envelope$data","activeClusters","_this$webex$internal$2","invalidateCache","_envelope$data2","timestamp","_attachSocketEventListeners","socket","sessionId","_this2","event","_onclose","_len","args","_key","_onmessage","concat","_len2","_key2","_setTimeOffset","_len3","_key3","_emit","_len4","_key4","_handleImminentShutdown","_this3","oldSocket","get","logger","info","_shutdownSwitchoverId","_now","_connectWithBackoff","isShutdownSwitchover","attemptOptions","onSuccess","newSocket","webSocketUrl","hasConnectedSockets","url","then","catch","err","reason","error","delete","getLastError","getSockets","getSocket","hasConnectingSockets","connect","_this4","_connectPromises","has","sessionSocket","_promise","resolve","Error","stack","connectPromise","device","registered","register","finally","set","logout","disconnectAll","config","beforeLogoutOptionsCloseReason","includes","code","disconnect","options","_this5","_stringify","backoffCall","abort","shutdownSwitchoverBackoffCall","suffix","removeAllListeners","once","close","_this6","disconnectPromises","_iterator","keys","_step","all","clear","listen","stopListening","processRegistrationStatusEvent","message","_applyOverrides","headers","headerKeys","_keys","keyPath","_prepareUrl","_this7","getFeature","haMessagingEnabled","highPrioritySocketUrl","convertUrlToPriorityHostUrl","warn","_url$parse","hostFromUrl","parse","host","isValidHost","wsUrl","webSharedMercury","_assign","query","outboundWireFormat","bufferStates","aliasHttpStatus","mercuryRegistrationStatus","isRegistrationRefreshEnabled","_deleteProperty","multipleConnections","clientTimestamp","search","format","_attemptConnection","socketUrl","callback","_this8","_options$isShutdownSw","_options$onSuccess","Socket","newWSUrl","mode","msg","reject","_prepareAndOpenSocket","refresh","backoffCallNormal","getNumRetries","retries","UnknownResponse","NotAuthorized","credentials","force","BadRequest","Forbidden","ConnectionError","markFailedUrl","_this9","logPrefix","getUserToken","_ref","_ref2","_slicedToArray2","token","forceCloseDelay","pingInterval","pongTimeout","trackingId","defaultMercuryOptions","customOptionsMsg","open","_this0","context","_context$isShutdownSw","_context$attemptOptio","onComplete","sid","newMetrics","callDiagnosticMetrics","setMercuryConnectedStatus","backoff","attemptNum","setStrategy","ExponentialStrategy","initialDelay","backoffTimeReset","maxDelay","backoffTimeMax","initialConnectionMaxRetries","failAfter","maxRetries","number","delay","Math","min","strategy_","nextBackoffDelay_","process","env","NODE_ENV","debug","start","_len5","_key5","first","second","rest","eventName","trigger","_toConsumableArray2","logError","console","_getEventHandlers","eventType","_eventType$split","split","_eventType$split2","handlers","handlerName","camelCase","_submitMercuryClose4000Metric","action","isActiveSocket","messageType","metrics","submitClientMetrics","fields","close_code","close_reason","is_active_socket","message_type","session_id","tags","sourceSocket","toLowerCase","unset","_reconnect","_this1","ENABLE_MERCURY_LOGGING","reduce","promise","handler","_data$eventType$split","_data$eventType$split2","wsWriteTimestamp","version","_applyDecoratedDescriptor2","_getOwnPropertyDescriptor","_default2","exports"],"sources":["mercury.js"],"sourcesContent":["/* eslint-disable require-jsdoc */\n/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport url from 'url';\n\nimport {WebexPlugin} from '@webex/webex-core';\nimport {deprecated} from '@webex/common';\nimport {camelCase, get, set} from 'lodash';\nimport backoff from 'backoff';\n\nimport Socket from './socket';\nimport {\n BadRequest,\n Forbidden,\n NotAuthorized,\n UnknownResponse,\n ConnectionError,\n // NotFound\n} from './errors';\n\nconst normalReconnectReasons = ['idle', 'done (forced)', 'pong not received', 'pong mismatch'];\nconst MERCURY_CLOSE_4000_METRIC = 'JS_SDK_MERCURY_CLOSE_4000';\n\nconst Mercury = WebexPlugin.extend({\n namespace: 'Mercury',\n lastError: undefined,\n defaultSessionId: 'mercury-default-session',\n\n session: {\n connected: {\n default: false,\n type: 'boolean',\n },\n connecting: {\n default: false,\n type: 'boolean',\n },\n hasEverConnected: {\n default: false,\n type: 'boolean',\n },\n sockets: {\n default: () => new Map(),\n type: 'object',\n },\n sessionWebSocketUrls: {\n default: () => new Map(),\n type: 'object',\n },\n backoffCalls: {\n default: () => new Map(),\n type: 'object',\n },\n _shutdownSwitchoverBackoffCalls: {\n default: () => new Map(),\n type: 'object',\n },\n localClusterServiceUrls: 'object',\n mercuryTimeOffset: {\n default: undefined,\n type: 'number',\n },\n },\n\n derived: {\n listening: {\n deps: ['connected'],\n fn() {\n return this.connected;\n },\n },\n },\n\n initialize() {\n /*\n When one of these legacy feature gets updated, this event would be triggered\n * group-message-notifications\n * mention-notifications\n * thread-notifications\n */\n this.on('event:featureToggle_update', (envelope) => {\n if (envelope && envelope.data) {\n this.webex.internal.feature.updateFeature(envelope.data.featureToggle);\n }\n });\n /*\n * When Cluster Migrations, notify clients using ActiveClusterStatusEvent via mercury\n * https://wwwin-github.cisco.com/pages/Webex/crr-docs/techdocs/rr-002.html#wip-notifying-clients-of-cluster-migrations\n * */\n this.on('event:ActiveClusterStatusEvent', (envelope) => {\n if (\n typeof this.webex.internal.services?.switchActiveClusterIds === 'function' &&\n envelope &&\n envelope.data\n ) {\n this.webex.internal.services.switchActiveClusterIds(envelope.data?.activeClusters);\n }\n });\n /*\n * Using cache-invalidation via mercury to instead the method of polling via the new /timestamp endpoint from u2c\n * https://wwwin-github.cisco.com/pages/Webex/crr-docs/techdocs/rr-005.html#websocket-notifications\n * */\n this.on('event:u2c.cache-invalidation', (envelope) => {\n if (\n typeof this.webex.internal.services?.invalidateCache === 'function' &&\n envelope &&\n envelope.data\n ) {\n this.webex.internal.services.invalidateCache(envelope.data?.timestamp);\n }\n });\n },\n\n /**\n * Attach event listeners to a socket.\n * @param {Socket} socket - The socket to attach listeners to\n * @param {sessionId} sessionId - The socket related session ID\n * @returns {void}\n */\n _attachSocketEventListeners(socket, sessionId) {\n socket.on('close', (event) => this._onclose(sessionId, event, socket));\n socket.on('message', (...args) => this._onmessage(sessionId, ...args));\n socket.on('pong', (...args) => this._setTimeOffset(sessionId, ...args));\n socket.on('sequence-mismatch', (...args) =>\n this._emit(sessionId, 'sequence-mismatch', ...args)\n );\n socket.on('ping-pong-latency', (...args) =>\n this._emit(sessionId, 'ping-pong-latency', ...args)\n );\n },\n\n /**\n * Handle imminent shutdown by establishing a new connection while keeping\n * the current one alive (make-before-break).\n * Idempotent: will no-op if already in progress.\n * @param {string} sessionId - The session ID for which the shutdown is imminent\n * @returns {void}\n */\n _handleImminentShutdown(sessionId) {\n const oldSocket = this.sockets.get(sessionId);\n\n try {\n // Idempotent: if we already have a switchover backoff call for this session,\n // a switchover is in progress – do nothing.\n if (this._shutdownSwitchoverBackoffCalls.get(sessionId)) {\n this.logger.info(\n `${this.namespace}: [shutdown] switchover already in progress for ${sessionId}`\n );\n\n return;\n }\n\n this._shutdownSwitchoverId = `${Date.now()}`;\n this.logger.info(\n `${this.namespace}: [shutdown] switchover start, id=${this._shutdownSwitchoverId} for ${sessionId}`\n );\n\n this._connectWithBackoff(undefined, sessionId, {\n isShutdownSwitchover: true,\n attemptOptions: {\n isShutdownSwitchover: true,\n onSuccess: (newSocket, webSocketUrl) => {\n this.logger.info(\n `${this.namespace}: [shutdown] switchover connected, url: ${webSocketUrl} for ${sessionId}`\n );\n\n // Atomically switch active socket reference\n this.socket = this.sockets.get(this.defaultSessionId);\n this.connected = this.hasConnectedSockets(); // remain connected throughout\n\n this._emit(sessionId, 'event:mercury_shutdown_switchover_complete', {\n url: webSocketUrl,\n });\n\n if (oldSocket) {\n this.logger.info(\n `${this.namespace}: [shutdown] old socket retained; server will close with 4001`\n );\n }\n },\n },\n })\n .then(() => {\n this.logger.info(\n `${this.namespace}: [shutdown] switchover completed successfully for ${sessionId}`\n );\n })\n .catch((err) => {\n this.logger.info(\n `${this.namespace}: [shutdown] switchover exhausted retries; will fall back to normal reconnection for ${sessionId}: `,\n err\n );\n this._emit(sessionId, 'event:mercury_shutdown_switchover_failed', {reason: err});\n // Old socket will eventually close with 4001, triggering normal reconnection\n });\n } catch (e) {\n this.logger.error(\n `${this.namespace}: [shutdown] error during switchover for ${sessionId}`,\n e\n );\n this._shutdownSwitchoverBackoffCalls.delete(sessionId);\n this._emit(sessionId, 'event:mercury_shutdown_switchover_failed', {reason: e});\n }\n },\n\n /**\n * Get the last error.\n * @returns {any} The last error.\n */\n getLastError() {\n return this.lastError;\n },\n\n /**\n * Get all active socket connections\n * @returns {Map} Map of sessionId to socket instances\n */\n getSockets() {\n return this.sockets;\n },\n\n /**\n * Get a specific socket by connection ID\n * @param {string} sessionId - The connection identifier\n * @returns {Socket|undefined} The socket instance or undefined if not found\n */\n getSocket(sessionId = this.defaultSessionId) {\n return this.sockets.get(sessionId);\n },\n\n /**\n * Check if a socket is connected\n * @param {string} [sessionId=this.defaultSessionId] - The session identifier\n * @returns {boolean|undefined} True if the socket is connected\n */\n hasConnectedSockets(sessionId = this.defaultSessionId) {\n const socket = this.sockets.get(sessionId || this.defaultSessionId);\n\n return socket?.connected;\n },\n\n /**\n * Check if any sockets are connecting\n * @param {string} [sessionId=this.defaultSessionId] - The session identifier\n * @returns {boolean|undefined} True if the socket is connecting\n */\n hasConnectingSockets(sessionId = this.defaultSessionId) {\n const socket = this.sockets.get(sessionId || this.defaultSessionId);\n\n return socket?.connecting;\n },\n\n /**\n * Connect to Mercury for a specific session.\n * @param {string} [webSocketUrl] - Optional websocket URL override. Falls back to the device websocket URL.\n * @param {string} [sessionId=this.defaultSessionId] - The session identifier for this connection.\n * @returns {Promise<void>} Resolves when connection flow completes for the session.\n */\n connect(webSocketUrl, sessionId = this.defaultSessionId) {\n if (!this._connectPromises) this._connectPromises = new Map();\n\n // First check if there's already a connection promise for this session\n if (this._connectPromises.has(sessionId)) {\n this.logger.info(\n `${this.namespace}: connection ${sessionId} already in progress, returning existing promise`\n );\n\n return this._connectPromises.get(sessionId);\n }\n\n const sessionSocket = this.sockets.get(sessionId);\n if (sessionSocket?.connected || sessionSocket?.connecting) {\n this.logger.info(\n `${this.namespace}: connection ${sessionId} already connected, will not connect again`\n );\n\n return Promise.resolve();\n }\n\n this.connecting = true;\n\n this.logger.info(`${this.namespace}: starting connection attempt for ${sessionId}`);\n this.logger.info(\n `${this.namespace}: debug_mercury_logging stack: `,\n new Error('debug_mercury_logging').stack\n );\n\n const connectPromise = Promise.resolve(\n this.webex.internal.device.registered || this.webex.internal.device.register()\n )\n .then(() => {\n this.logger.info(`${this.namespace}: connecting ${sessionId}`);\n\n return this._connectWithBackoff(webSocketUrl, sessionId);\n })\n .finally(() => {\n this._connectPromises.delete(sessionId);\n });\n\n this._connectPromises.set(sessionId, connectPromise);\n\n return connectPromise;\n },\n\n logout() {\n this.logger.info(`${this.namespace}: logout() called`);\n this.logger.info(\n `${this.namespace}: debug_mercury_logging stack: `,\n new Error('debug_mercury_logging').stack\n );\n\n return this.disconnectAll(\n this.config.beforeLogoutOptionsCloseReason &&\n !normalReconnectReasons.includes(this.config.beforeLogoutOptionsCloseReason)\n ? {code: 3050, reason: this.config.beforeLogoutOptionsCloseReason}\n : undefined\n );\n },\n\n /**\n * Disconnect a Mercury socket for a specific session.\n * @param {object} [options] - Optional websocket close options (for example: `{code, reason}`).\n * @param {string} [sessionId=this.defaultSessionId] - The session identifier to disconnect.\n * @returns {Promise<void>} Resolves after disconnect cleanup and close handling are initiated/completed.\n */\n disconnect(options, sessionId = this.defaultSessionId) {\n this.logger.info(\n `${this.namespace}#disconnect: connecting state: ${this.connecting}, connected state: ${\n this.connected\n }, socket exists: ${!!this.socket}, options: ${JSON.stringify(options)}`\n );\n\n return new Promise((resolve) => {\n const backoffCall = this.backoffCalls.get(sessionId);\n if (backoffCall) {\n this.logger.info(`${this.namespace}: aborting connection ${sessionId}`);\n backoffCall.abort();\n this.backoffCalls.delete(sessionId);\n }\n const shutdownSwitchoverBackoffCall = this._shutdownSwitchoverBackoffCalls.get(sessionId);\n if (shutdownSwitchoverBackoffCall) {\n this.logger.info(`${this.namespace}: aborting shutdown switchover connection ${sessionId}`);\n shutdownSwitchoverBackoffCall.abort();\n this._shutdownSwitchoverBackoffCalls.delete(sessionId);\n }\n // Clean up any pending connection promises\n if (this._connectPromises) {\n this._connectPromises.delete(sessionId);\n }\n\n const sessionSocket = this.sockets.get(sessionId);\n const suffix = sessionId === this.defaultSessionId ? '' : `:${sessionId}`;\n\n if (sessionSocket) {\n sessionSocket.removeAllListeners('message');\n sessionSocket.connecting = false;\n sessionSocket.connected = false;\n this.once(sessionId === this.defaultSessionId ? 'offline' : `offline${suffix}`, resolve);\n resolve(sessionSocket.close(options || undefined));\n }\n resolve();\n\n // Update overall connected status\n this.connected = this.hasConnectedSockets();\n });\n },\n\n /**\n * Disconnect all socket connections\n * @param {object} options - Close options\n * @returns {Promise} Promise that resolves when all connections are closed\n */\n disconnectAll(options) {\n const disconnectPromises = [];\n\n for (const sessionId of this.sockets.keys()) {\n disconnectPromises.push(this.disconnect(options, sessionId));\n }\n\n return Promise.all(disconnectPromises).then(() => {\n this.connected = false;\n this.sockets.clear();\n this.sessionWebSocketUrls.clear();\n this.backoffCalls.clear();\n // Clear connection promises to prevent stale promises\n if (this._connectPromises) {\n this._connectPromises.clear();\n }\n });\n },\n\n @deprecated('Mercury#listen(): Use Mercury#connect() instead')\n listen() {\n /* eslint no-invalid-this: [0] */\n return this.connect();\n },\n\n @deprecated('Mercury#stopListening(): Use Mercury#disconnect() instead')\n stopListening() {\n /* eslint no-invalid-this: [0] */\n return this.disconnect();\n },\n\n processRegistrationStatusEvent(message) {\n this.localClusterServiceUrls = message.localClusterServiceUrls;\n },\n\n _applyOverrides(event) {\n if (!event || !event.headers) {\n return;\n }\n const headerKeys = Object.keys(event.headers);\n\n headerKeys.forEach((keyPath) => {\n set(event, keyPath, event.headers[keyPath]);\n });\n },\n\n _prepareUrl(webSocketUrl) {\n if (!webSocketUrl) {\n webSocketUrl = this.webex.internal.device.webSocketUrl;\n }\n\n return this.webex.internal.feature\n .getFeature('developer', 'web-high-availability')\n .then((haMessagingEnabled) => {\n if (haMessagingEnabled) {\n let highPrioritySocketUrl;\n try {\n highPrioritySocketUrl =\n this.webex.internal.services.convertUrlToPriorityHostUrl(webSocketUrl);\n } catch (e) {\n this.logger.warn(`${this.namespace}: error converting to high priority url`, e);\n }\n if (!highPrioritySocketUrl) {\n const hostFromUrl = url.parse(webSocketUrl, true)?.host;\n const isValidHost = this.webex.internal.services.isValidHost(hostFromUrl);\n if (!isValidHost) {\n this.logger.error(\n `${this.namespace}: host ${hostFromUrl} is not a valid host from host catalog`\n );\n\n return '';\n }\n }\n\n return highPrioritySocketUrl || webSocketUrl;\n }\n\n return webSocketUrl;\n })\n .then((wsUrl) => {\n webSocketUrl = wsUrl;\n })\n .then(() => this.webex.internal.feature.getFeature('developer', 'web-shared-mercury'))\n .then((webSharedMercury) => {\n if (!webSocketUrl) {\n return '';\n }\n webSocketUrl = url.parse(webSocketUrl, true);\n Object.assign(webSocketUrl.query, {\n outboundWireFormat: 'text',\n bufferStates: true,\n aliasHttpStatus: true,\n });\n\n if (webSharedMercury) {\n Object.assign(webSocketUrl.query, {\n mercuryRegistrationStatus: true,\n isRegistrationRefreshEnabled: true,\n });\n Reflect.deleteProperty(webSocketUrl.query, 'bufferStates');\n }\n\n if (get(this, 'webex.config.device.ephemeral', false)) {\n webSocketUrl.query.multipleConnections = true;\n }\n\n webSocketUrl.query.clientTimestamp = Date.now();\n delete webSocketUrl.search;\n\n return url.format(webSocketUrl);\n });\n },\n\n _attemptConnection(socketUrl, sessionId, callback, options = {}) {\n const {isShutdownSwitchover = false, onSuccess = null} = options;\n\n const socket = new Socket();\n socket.connecting = true;\n let newWSUrl;\n\n this._attachSocketEventListeners(socket, sessionId);\n\n const backoffCall = isShutdownSwitchover\n ? this._shutdownSwitchoverBackoffCalls.get(sessionId)\n : this.backoffCalls.get(sessionId);\n\n // Check appropriate backoff call based on connection type\n if (!backoffCall) {\n const mode = isShutdownSwitchover ? 'switchover backoff call' : 'backoffCall';\n const msg = `${this.namespace}: prevent socket open when ${mode} no longer defined for ${sessionId}`;\n const err = new Error(msg);\n\n this.logger.info(msg);\n\n // Call the callback with the error before rejecting\n callback(err);\n\n return Promise.reject(err);\n }\n\n // For shutdown switchover, don't set socket yet (make-before-break)\n // For normal connection, set socket before opening to allow disconnect() to close it\n if (!isShutdownSwitchover) {\n this.sockets.set(sessionId, socket);\n }\n\n return this._prepareAndOpenSocket(socket, socketUrl, sessionId, isShutdownSwitchover)\n .then((webSocketUrl) => {\n newWSUrl = webSocketUrl;\n\n this.logger.info(\n `${this.namespace}: ${\n isShutdownSwitchover ? '[shutdown] switchover' : ''\n } connected to mercury, success, action: connected for ${sessionId}, url: ${newWSUrl}`\n );\n\n // Custom success handler for shutdown switchover\n if (onSuccess) {\n onSuccess(socket, webSocketUrl);\n callback();\n\n return Promise.resolve();\n }\n\n // Default behavior for normal connection\n callback();\n\n return this.webex.internal.feature\n .getFeature('developer', 'web-high-availability')\n .then((haMessagingEnabled) => {\n if (haMessagingEnabled) {\n return this.webex.internal.device.refresh();\n }\n\n return Promise.resolve();\n });\n })\n .catch((reason) => {\n // For shutdown, simpler error handling - just callback for retry\n if (isShutdownSwitchover) {\n this.logger.info(\n `${this.namespace}: [shutdown] switchover attempt failed for ${sessionId}`,\n reason\n );\n\n return callback(reason);\n }\n\n // Normal connection error handling (existing complex logic)\n this.lastError = reason; // remember the last error\n\n const backoffCallNormal = this.backoffCalls.get(sessionId);\n // Suppress connection errors that appear to be network related. This\n // may end up suppressing metrics during outages, but we might not care\n // (especially since many of our outages happen in a way that client\n // metrics can't be trusted).\n if (reason.code !== 1006 && backoffCallNormal && backoffCallNormal?.getNumRetries() > 0) {\n this._emit(sessionId, 'connection_failed', reason, {\n sessionId,\n retries: backoffCallNormal?.getNumRetries(),\n });\n }\n this.logger.info(\n `${this.namespace}: connection attempt failed for ${sessionId}`,\n reason,\n backoffCallNormal?.getNumRetries() === 0 ? reason.stack : ''\n );\n // UnknownResponse is produced by IE for any 4XXX; treated it like a bad\n // web socket url and let WDM handle the token checking\n if (reason instanceof UnknownResponse) {\n this.logger.info(\n `${this.namespace}: received unknown response code for ${sessionId}, refreshing device registration`\n );\n\n return this.webex.internal.device.refresh().then(() => callback(reason));\n }\n // NotAuthorized implies expired token\n if (reason instanceof NotAuthorized) {\n this.logger.info(\n `${this.namespace}: received authorization error for ${sessionId}, reauthorizing`\n );\n\n return this.webex.credentials.refresh({force: true}).then(() => callback(reason));\n }\n // // NotFound implies expired web socket url\n // else if (reason instanceof NotFound) {\n // this.logger.info(`mercury: received not found error, refreshing device registration`);\n // return this.webex.internal.device.refresh()\n // .then(() => callback(reason));\n // }\n // BadRequest implies current credentials are for a Service Account\n // Forbidden implies current user is not entitle for Webex\n if (reason instanceof BadRequest || reason instanceof Forbidden) {\n this.logger.warn(\n `${this.namespace}: received unrecoverable response from mercury for ${sessionId}`\n );\n backoffCallNormal?.abort();\n\n return callback(reason);\n }\n if (reason instanceof ConnectionError) {\n return this.webex.internal.feature\n .getFeature('developer', 'web-high-availability')\n .then((haMessagingEnabled) => {\n const wsUrl = newWSUrl || reason.webSocketUrl;\n\n if (haMessagingEnabled) {\n this.logger.info(\n `${this.namespace}: received a generic connection error for ${sessionId}, will try to connect to another datacenter. failed, action: 'failed', url: ${wsUrl} error: ${reason.message}`\n );\n\n if (wsUrl) {\n this.logger.info(\n `${this.namespace}: marking ${wsUrl} as failed for ${sessionId} due to connection error`\n );\n\n return this.webex.internal.services.markFailedUrl(wsUrl);\n }\n\n this.logger.info(\n `${this.namespace}: no socket url available to mark as failed for ${sessionId} due to connection error`\n );\n }\n\n return null;\n })\n .then(() => callback(reason));\n }\n\n return callback(reason);\n })\n .catch((reason) => {\n this.logger.error(\n `${this.namespace}: failed to handle connection failure for ${sessionId}`,\n reason\n );\n callback(reason);\n });\n },\n\n _prepareAndOpenSocket(socket, socketUrl, sessionId, isShutdownSwitchover = false) {\n const logPrefix = isShutdownSwitchover ? '[shutdown] switchover' : 'connection';\n\n return Promise.all([this._prepareUrl(socketUrl), this.webex.credentials.getUserToken()]).then(\n ([webSocketUrl, token]) => {\n let options = {\n forceCloseDelay: this.config.forceCloseDelay,\n pingInterval: this.config.pingInterval,\n pongTimeout: this.config.pongTimeout,\n token: token.toString(),\n trackingId: `${this.webex.sessionId}_${Date.now()}`,\n logger: this.logger,\n };\n\n if (this.webex.config.defaultMercuryOptions) {\n const customOptionsMsg = isShutdownSwitchover\n ? 'setting custom options for switchover'\n : 'setting custom options';\n\n this.logger.info(`${this.namespace}: ${customOptionsMsg}`);\n options = {...options, ...this.webex.config.defaultMercuryOptions};\n }\n\n // Set the socket before opening it. This allows a disconnect() to close\n // the socket if it is in the process of being opened.\n this.sockets.set(sessionId, socket);\n this.socket = this.sockets.get(this.defaultSessionId);\n\n this.logger.info(`${this.namespace} ${logPrefix} url for ${sessionId}: ${webSocketUrl}`);\n\n // Remember the resolved URL used to open this socket so that\n // reconnection in _onclose re-derives from a catalog-valid host. This is\n // captured before socket.open(), which a lower layer (e.g. the same-site\n // websocket proxy done with interceptors) may rewrite into a non-catalog host.\n // Reusing the post-proxy native socket URL would fail\n // host-catalog validation in _prepareUrl and block reconnection.\n this.sessionWebSocketUrls.set(sessionId, webSocketUrl);\n\n return socket\n .open(webSocketUrl, options)\n .then(() => webSocketUrl)\n .catch((err) => {\n err.webSocketUrl = webSocketUrl;\n\n return Promise.reject(err);\n });\n }\n );\n },\n\n _connectWithBackoff(webSocketUrl, sessionId, context = {}) {\n const {isShutdownSwitchover = false, attemptOptions = {}} = context;\n\n return new Promise((resolve, reject) => {\n // eslint gets confused about whether call is actually used\n // eslint-disable-next-line prefer-const\n let call;\n const onComplete = (err, sid = sessionId) => {\n if (isShutdownSwitchover) {\n this._shutdownSwitchoverBackoffCalls.delete(sid);\n } else {\n this.backoffCalls.delete(sid);\n }\n const sessionSocket = this.sockets.get(sid);\n if (err) {\n const msg = isShutdownSwitchover\n ? `[shutdown] switchover failed after ${call.getNumRetries()} retries`\n : `failed to connect after ${call.getNumRetries()} retries`;\n\n this.logger.info(\n `${this.namespace}: ${msg}; log statement about next retry was inaccurate; ${err}`\n );\n if (sessionSocket) {\n sessionSocket.connecting = false;\n sessionSocket.connected = false;\n }\n\n return reject(err);\n }\n\n // Update overall connected status\n if (sessionSocket) {\n sessionSocket.connecting = false;\n sessionSocket.connected = true;\n }\n // Default success handling for normal connections\n if (!isShutdownSwitchover) {\n this.connecting = this.hasConnectingSockets();\n this.connected = this.hasConnectedSockets();\n this.hasEverConnected = true;\n this._emit(sid, 'online');\n if (this.connected) {\n this.webex.internal.newMetrics.callDiagnosticMetrics.setMercuryConnectedStatus(true);\n }\n }\n\n return resolve();\n };\n // eslint-disable-next-line prefer-reflect\n call = backoff.call(\n (callback) => {\n const attemptNum = call.getNumRetries();\n const logPrefix = isShutdownSwitchover ? '[shutdown] switchover' : 'connection';\n\n this.logger.info(\n `${this.namespace}: executing ${logPrefix} attempt ${attemptNum} for ${sessionId}`\n );\n this._attemptConnection(webSocketUrl, sessionId, callback, attemptOptions);\n },\n (err) => onComplete(err, sessionId)\n );\n\n call.setStrategy(\n new backoff.ExponentialStrategy({\n initialDelay: this.config.backoffTimeReset,\n maxDelay: this.config.backoffTimeMax,\n })\n );\n\n if (\n this.config.initialConnectionMaxRetries &&\n !this.hasEverConnected &&\n !isShutdownSwitchover\n ) {\n call.failAfter(this.config.initialConnectionMaxRetries);\n } else if (this.config.maxRetries) {\n call.failAfter(this.config.maxRetries);\n }\n\n // Store the call BEFORE setting up event handlers to prevent race conditions\n // Store backoff call reference BEFORE starting (so it's available in _attemptConnection)\n if (isShutdownSwitchover) {\n this._shutdownSwitchoverBackoffCalls.set(sessionId, call);\n } else {\n this.backoffCalls.set(sessionId, call);\n }\n\n call.on('abort', () => {\n const msg = isShutdownSwitchover ? 'Shutdown Switchover' : 'Connection';\n\n this.logger.info(`${this.namespace}: ${msg} aborted for ${sessionId}`);\n reject(new Error(`Mercury ${msg} Aborted for ${sessionId}`));\n });\n\n call.on('callback', (err) => {\n if (err) {\n const number = call.getNumRetries();\n const delay = Math.min(call.strategy_.nextBackoffDelay_, this.config.backoffTimeMax);\n\n const logPrefix = isShutdownSwitchover ? '[shutdown] switchover' : '';\n\n this.logger.info(\n `${this.namespace}: ${logPrefix} failed to connect; attempting retry ${\n number + 1\n } in ${delay} ms for ${sessionId}`\n );\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'development') {\n this.logger.debug(`${this.namespace}: `, err, err.stack);\n }\n\n return;\n }\n this.logger.info(`${this.namespace}: connected ${sessionId}`);\n });\n\n call.start();\n });\n },\n\n _emit(...args) {\n try {\n if (!args || args.length === 0) {\n return;\n }\n\n // New signature: _emit(sessionId, eventName, ...rest)\n // Backwards compatibility: if the first arg isn't a known sessionId (or defaultSessionId),\n // treat the call as the old signature and forward directly to trigger(...)\n const [first, second, ...rest] = args;\n\n if (typeof first === 'string' && typeof second === 'string') {\n const sessionId = first;\n const eventName = second;\n const suffix = sessionId === this.defaultSessionId ? '' : `:${sessionId}`;\n\n this.trigger(`${eventName}${suffix}`, ...rest);\n } else {\n // Old usage: _emit(eventName, ...args)\n this.trigger(...args);\n }\n } catch (error) {\n // Safely handle errors without causing additional issues during cleanup\n try {\n this.logger.error(\n `${this.namespace}: error occurred in event handler:`,\n error,\n ' with args: ',\n args\n );\n } catch (logError) {\n // If even logging fails, just ignore to prevent cascading errors during cleanup\n // eslint-disable-next-line no-console\n console.error('Mercury _emit error handling failed:', logError);\n }\n }\n },\n\n _getEventHandlers(eventType) {\n if (!eventType) {\n return [];\n }\n const [namespace, name] = eventType.split('.');\n const handlers = [];\n\n if (!this.webex[namespace] && !this.webex.internal[namespace]) {\n return handlers;\n }\n\n const handlerName = camelCase(`process_${name}_event`);\n\n if ((this.webex[namespace] || this.webex.internal[namespace])[handlerName]) {\n handlers.push({\n name: handlerName,\n namespace,\n });\n }\n\n return handlers;\n },\n\n _submitMercuryClose4000Metric(sessionId, event, options) {\n const {action, isActiveSocket, messageType} = options;\n\n try {\n this.webex.internal.metrics.submitClientMetrics(MERCURY_CLOSE_4000_METRIC, {\n fields: {\n action,\n close_code: event.code,\n close_reason: event.reason || '',\n is_active_socket: isActiveSocket,\n message_type: messageType,\n session_id: sessionId,\n },\n tags: {\n action,\n message_type: messageType,\n },\n });\n } catch (error) {\n this.logger.warn(`${this.namespace}: failed to submit Mercury 4000 close metric`, error);\n }\n },\n\n _onclose(sessionId, event, sourceSocket) {\n // I don't see any way to avoid the complexity or statement count in here.\n /* eslint complexity: [0] */\n\n try {\n const reason = event.reason && event.reason.toLowerCase();\n const sessionSocket = this.sockets.get(sessionId);\n event.sessionId = sessionId;\n\n const isActiveSocket = sourceSocket === sessionSocket;\n // Reconnect using the resolved URL this session's socket was\n // opened with, captured in _prepareAndOpenSocket. Do NOT reuse\n // sourceSocket.url: that reflects the URL the native WebSocket was\n // actually opened with, which a lower layer may have rewritten\n // (e.g. via interceptors) into a host that is not in the SDK host\n // catalog. Feeding such a URL back into _prepareUrl fails host-catalog\n // validation and permanently blocks reconnection.\n const socketUrl = this.sessionWebSocketUrls.get(sessionId);\n\n this.sockets.delete(sessionId);\n\n if (isActiveSocket) {\n // Only tear down state if the currently active socket closed\n if (sessionSocket) {\n sessionSocket.removeAllListeners();\n if (sessionId === this.defaultSessionId) this.unset('socket');\n this._emit(sessionId, 'offline', event);\n }\n // Update overall connected status\n this.connecting = this.hasConnectingSockets();\n this.connected = this.hasConnectedSockets();\n\n if (!this.connected) {\n this.webex.internal.newMetrics.callDiagnosticMetrics.setMercuryConnectedStatus(false);\n }\n } else {\n // Old socket closed; do not flip connection state\n this.logger.info(\n `${this.namespace}: [shutdown] non-active socket closed, code=${event.code} for ${sessionId}`\n );\n // Clean up listeners from old socket now that it's closed\n if (sourceSocket) {\n sourceSocket.removeAllListeners();\n }\n }\n\n switch (event.code) {\n case 1003:\n // metric: disconnect\n this.logger.info(\n `${this.namespace}: Mercury service rejected last message for ${sessionId}; will not reconnect: ${event.reason}`\n );\n if (isActiveSocket) this._emit(sessionId, 'offline.permanent', event);\n break;\n case 4000:\n // metric: disconnect\n if (reason === 'replaced') {\n this._submitMercuryClose4000Metric(sessionId, event, {\n action: 'no_action',\n isActiveSocket,\n messageType: 'replaced',\n });\n this.logger.info(`${this.namespace}: socket ${sessionId} replaced; will not reconnect`);\n if (isActiveSocket) this._emit(sessionId, 'offline.replaced', event);\n } else {\n this._submitMercuryClose4000Metric(sessionId, event, {\n action: isActiveSocket ? 'reconnect' : 'ignore_non_active',\n isActiveSocket,\n messageType: 'other',\n });\n this.logger.info(\n `${this.namespace}: socket ${sessionId} disconnected with 4000: ${event.reason}; reconnecting`\n );\n if (isActiveSocket) {\n this._emit(sessionId, 'offline.transient', event);\n this._reconnect(socketUrl, sessionId);\n }\n }\n break;\n case 4001:\n // replaced during shutdown\n if (isActiveSocket) {\n // Server closed active socket with 4001, meaning it expected this connection\n // to be replaced, but the switchover in _handleImminentShutdown failed.\n // This is a permanent failure - do not reconnect.\n this.logger.warn(\n `${this.namespace}: active socket closed with 4001; shutdown switchover failed for ${sessionId}`\n );\n this._emit(sessionId, 'offline.permanent', event);\n } else {\n // Expected: old socket closed after successful switchover\n this.logger.info(\n `${this.namespace}: old socket closed with 4001 (replaced during shutdown); no reconnect needed for ${sessionId}`\n );\n this._emit(sessionId, 'offline.replaced', event);\n }\n break;\n case 1001:\n case 1005:\n case 1006:\n case 1011:\n this.logger.info(`${this.namespace}: socket ${sessionId} disconnected; reconnecting`);\n if (isActiveSocket) {\n this._emit(sessionId, 'offline.transient', event);\n this.logger.info(\n `${this.namespace}: [shutdown] reconnecting active socket to recover for ${sessionId}`\n );\n this._reconnect(socketUrl, sessionId);\n }\n // metric: disconnect\n // if (code == 1011 && reason !== ping error) metric: unexpected disconnect\n break;\n case 1000:\n case 3050: // 3050 indicates logout form of closure, default to old behavior, use config reason defined by consumer to proceed with the permanent block\n if (normalReconnectReasons.includes(reason)) {\n this.logger.info(`${this.namespace}: socket ${sessionId} disconnected; reconnecting`);\n if (isActiveSocket) {\n this._emit(sessionId, 'offline.transient', event);\n this.logger.info(\n `${this.namespace}: [shutdown] reconnecting due to normal close for ${sessionId}`\n );\n this._reconnect(socketUrl, sessionId);\n }\n // metric: disconnect\n // if (reason === done forced) metric: force closure\n } else {\n this.logger.info(\n `${this.namespace}: socket ${sessionId} disconnected; will not reconnect: ${event.reason}`\n );\n if (isActiveSocket) this._emit(sessionId, 'offline.permanent', event);\n }\n break;\n default:\n this.logger.info(\n `${this.namespace}: socket ${sessionId} disconnected unexpectedly; will not reconnect`\n );\n // unexpected disconnect\n if (isActiveSocket) this._emit(sessionId, 'offline.permanent', event);\n }\n } catch (error) {\n this.logger.error(\n `${this.namespace}: error occurred in close handler for ${sessionId}`,\n error\n );\n }\n },\n\n _onmessage(sessionId, event) {\n this._setTimeOffset(sessionId, event);\n const envelope = event.data;\n\n if (process.env.ENABLE_MERCURY_LOGGING) {\n this.logger.debug(`${this.namespace}: message envelope from ${sessionId}: `, envelope);\n }\n\n envelope.sessionId = sessionId;\n\n // Handle shutdown message shape: { type: 'shutdown' }\n if (envelope && envelope.type === 'shutdown') {\n this.logger.info(\n `${this.namespace}: [shutdown] imminent shutdown message received for ${sessionId}`\n );\n this._emit(sessionId, 'event:mercury_shutdown_imminent', envelope);\n\n this._handleImminentShutdown(sessionId);\n\n return Promise.resolve();\n }\n\n envelope.sessionId = sessionId;\n const {data} = envelope;\n\n this._applyOverrides(data);\n\n if (!data || !data.eventType) {\n this._emit(sessionId, 'event', envelope);\n\n return Promise.resolve();\n }\n\n return this._getEventHandlers(data.eventType)\n .reduce(\n (promise, handler) =>\n promise.then(() => {\n const {namespace, name} = handler;\n\n return new Promise((resolve) =>\n resolve((this.webex[namespace] || this.webex.internal[namespace])[name](data))\n ).catch((reason) =>\n this.logger.error(\n `${this.namespace}: error occurred in autowired event handler for ${data.eventType} from ${sessionId}`,\n reason\n )\n );\n }),\n Promise.resolve()\n )\n .then(() => {\n this._emit(sessionId, 'event', envelope);\n const [namespace] = data.eventType.split('.');\n\n if (namespace === data.eventType) {\n this._emit(sessionId, `event:${namespace}`, envelope);\n } else {\n this._emit(sessionId, `event:${namespace}`, envelope);\n this._emit(sessionId, `event:${data.eventType}`, envelope);\n }\n })\n .catch((reason) => {\n this.logger.error(\n `${this.namespace}: error occurred processing socket message from ${sessionId}`,\n reason\n );\n });\n },\n\n _setTimeOffset(sessionId, event) {\n const {wsWriteTimestamp} = event.data;\n if (typeof wsWriteTimestamp === 'number' && wsWriteTimestamp > 0) {\n this.mercuryTimeOffset = Date.now() - wsWriteTimestamp;\n }\n },\n\n _reconnect(webSocketUrl, sessionId = this.defaultSessionId) {\n this.logger.info(`${this.namespace}: reconnecting ${sessionId}`);\n\n return this.connect(webSocketUrl, sessionId);\n },\n});\n\nexport default Mercury;\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -40,16 +40,16 @@
|
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@webex/common": "3.12.0-next.5",
|
|
42
42
|
"@webex/common-timers": "3.12.0-next.5",
|
|
43
|
-
"@webex/internal-plugin-device": "3.12.0-next.
|
|
44
|
-
"@webex/internal-plugin-feature": "3.12.0-next.
|
|
45
|
-
"@webex/internal-plugin-metrics": "3.12.0-next.
|
|
43
|
+
"@webex/internal-plugin-device": "3.12.0-next.40",
|
|
44
|
+
"@webex/internal-plugin-feature": "3.12.0-next.40",
|
|
45
|
+
"@webex/internal-plugin-metrics": "3.12.0-next.40",
|
|
46
46
|
"@webex/test-helper-chai": "3.12.0-next.5",
|
|
47
47
|
"@webex/test-helper-mocha": "3.12.0-next.5",
|
|
48
48
|
"@webex/test-helper-mock-web-socket": "3.12.0-next.5",
|
|
49
49
|
"@webex/test-helper-mock-webex": "3.12.0-next.5",
|
|
50
50
|
"@webex/test-helper-refresh-callback": "3.12.0-next.5",
|
|
51
51
|
"@webex/test-helper-test-users": "3.12.0-next.5",
|
|
52
|
-
"@webex/webex-core": "3.12.0-next.
|
|
52
|
+
"@webex/webex-core": "3.12.0-next.40",
|
|
53
53
|
"backoff": "^2.5.0",
|
|
54
54
|
"lodash": "^4.17.21",
|
|
55
55
|
"uuid": "^3.3.2",
|
|
@@ -64,5 +64,5 @@
|
|
|
64
64
|
"test:style": "eslint ./src/**/*.*",
|
|
65
65
|
"test:unit": "webex-legacy-tools test --unit --runner mocha"
|
|
66
66
|
},
|
|
67
|
-
"version": "3.12.0-next.
|
|
67
|
+
"version": "3.12.0-next.44"
|
|
68
68
|
}
|
package/src/mercury.js
CHANGED
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
} from './errors';
|
|
22
22
|
|
|
23
23
|
const normalReconnectReasons = ['idle', 'done (forced)', 'pong not received', 'pong mismatch'];
|
|
24
|
+
const MERCURY_CLOSE_4000_METRIC = 'JS_SDK_MERCURY_CLOSE_4000';
|
|
24
25
|
|
|
25
26
|
const Mercury = WebexPlugin.extend({
|
|
26
27
|
namespace: 'Mercury',
|
|
@@ -882,6 +883,29 @@ const Mercury = WebexPlugin.extend({
|
|
|
882
883
|
return handlers;
|
|
883
884
|
},
|
|
884
885
|
|
|
886
|
+
_submitMercuryClose4000Metric(sessionId, event, options) {
|
|
887
|
+
const {action, isActiveSocket, messageType} = options;
|
|
888
|
+
|
|
889
|
+
try {
|
|
890
|
+
this.webex.internal.metrics.submitClientMetrics(MERCURY_CLOSE_4000_METRIC, {
|
|
891
|
+
fields: {
|
|
892
|
+
action,
|
|
893
|
+
close_code: event.code,
|
|
894
|
+
close_reason: event.reason || '',
|
|
895
|
+
is_active_socket: isActiveSocket,
|
|
896
|
+
message_type: messageType,
|
|
897
|
+
session_id: sessionId,
|
|
898
|
+
},
|
|
899
|
+
tags: {
|
|
900
|
+
action,
|
|
901
|
+
message_type: messageType,
|
|
902
|
+
},
|
|
903
|
+
});
|
|
904
|
+
} catch (error) {
|
|
905
|
+
this.logger.warn(`${this.namespace}: failed to submit Mercury 4000 close metric`, error);
|
|
906
|
+
}
|
|
907
|
+
},
|
|
908
|
+
|
|
885
909
|
_onclose(sessionId, event, sourceSocket) {
|
|
886
910
|
// I don't see any way to avoid the complexity or statement count in here.
|
|
887
911
|
/* eslint complexity: [0] */
|
|
@@ -938,9 +962,28 @@ const Mercury = WebexPlugin.extend({
|
|
|
938
962
|
break;
|
|
939
963
|
case 4000:
|
|
940
964
|
// metric: disconnect
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
965
|
+
if (reason === 'replaced') {
|
|
966
|
+
this._submitMercuryClose4000Metric(sessionId, event, {
|
|
967
|
+
action: 'no_action',
|
|
968
|
+
isActiveSocket,
|
|
969
|
+
messageType: 'replaced',
|
|
970
|
+
});
|
|
971
|
+
this.logger.info(`${this.namespace}: socket ${sessionId} replaced; will not reconnect`);
|
|
972
|
+
if (isActiveSocket) this._emit(sessionId, 'offline.replaced', event);
|
|
973
|
+
} else {
|
|
974
|
+
this._submitMercuryClose4000Metric(sessionId, event, {
|
|
975
|
+
action: isActiveSocket ? 'reconnect' : 'ignore_non_active',
|
|
976
|
+
isActiveSocket,
|
|
977
|
+
messageType: 'other',
|
|
978
|
+
});
|
|
979
|
+
this.logger.info(
|
|
980
|
+
`${this.namespace}: socket ${sessionId} disconnected with 4000: ${event.reason}; reconnecting`
|
|
981
|
+
);
|
|
982
|
+
if (isActiveSocket) {
|
|
983
|
+
this._emit(sessionId, 'offline.transient', event);
|
|
984
|
+
this._reconnect(socketUrl, sessionId);
|
|
985
|
+
}
|
|
986
|
+
}
|
|
944
987
|
break;
|
|
945
988
|
case 4001:
|
|
946
989
|
// replaced during shutdown
|
|
@@ -267,8 +267,14 @@ describe('plugin-mercury', () => {
|
|
|
267
267
|
},
|
|
268
268
|
{
|
|
269
269
|
code: 4000,
|
|
270
|
+
reason: 'Replaced',
|
|
270
271
|
action: 'replace',
|
|
271
272
|
},
|
|
273
|
+
{
|
|
274
|
+
code: 4000,
|
|
275
|
+
reason: 'Unexpected close',
|
|
276
|
+
action: 'reconnect',
|
|
277
|
+
},
|
|
272
278
|
{
|
|
273
279
|
action: 'close',
|
|
274
280
|
},
|
|
@@ -1334,6 +1334,129 @@ describe('plugin-mercury', () => {
|
|
|
1334
1334
|
});
|
|
1335
1335
|
});
|
|
1336
1336
|
|
|
1337
|
+
describe('#_onclose() with code 4000', () => {
|
|
1338
|
+
let mockSocket, anotherSocket;
|
|
1339
|
+
|
|
1340
|
+
beforeEach(() => {
|
|
1341
|
+
mockSocket = {
|
|
1342
|
+
url: 'ws://active-socket.com',
|
|
1343
|
+
removeAllListeners: sinon.stub(),
|
|
1344
|
+
};
|
|
1345
|
+
anotherSocket = {
|
|
1346
|
+
url: 'ws://old-socket.com',
|
|
1347
|
+
removeAllListeners: sinon.stub(),
|
|
1348
|
+
};
|
|
1349
|
+
mercury.socket = mockSocket;
|
|
1350
|
+
mercury.sockets.set(mercury.defaultSessionId, mockSocket);
|
|
1351
|
+
mercury.sessionWebSocketUrls.set(mercury.defaultSessionId, mockSocket.url);
|
|
1352
|
+
mercury.connected = true;
|
|
1353
|
+
sinon.stub(mercury, '_emit');
|
|
1354
|
+
sinon.stub(mercury, '_reconnect');
|
|
1355
|
+
sinon.stub(mercury, 'unset');
|
|
1356
|
+
});
|
|
1357
|
+
|
|
1358
|
+
afterEach(() => {
|
|
1359
|
+
mercury._emit.restore();
|
|
1360
|
+
mercury._reconnect.restore();
|
|
1361
|
+
mercury.unset.restore();
|
|
1362
|
+
});
|
|
1363
|
+
|
|
1364
|
+
it('should not reconnect when active socket is replaced', () => {
|
|
1365
|
+
const closeEvent = {
|
|
1366
|
+
code: 4000,
|
|
1367
|
+
reason: 'Replaced',
|
|
1368
|
+
};
|
|
1369
|
+
|
|
1370
|
+
mercury._onclose(mercury.defaultSessionId, closeEvent, mockSocket);
|
|
1371
|
+
|
|
1372
|
+
assert.calledOnceWithExactly(
|
|
1373
|
+
webex.internal.metrics.submitClientMetrics,
|
|
1374
|
+
'JS_SDK_MERCURY_CLOSE_4000',
|
|
1375
|
+
{
|
|
1376
|
+
fields: {
|
|
1377
|
+
action: 'no_action',
|
|
1378
|
+
close_code: 4000,
|
|
1379
|
+
close_reason: 'Replaced',
|
|
1380
|
+
is_active_socket: true,
|
|
1381
|
+
message_type: 'replaced',
|
|
1382
|
+
session_id: mercury.defaultSessionId,
|
|
1383
|
+
},
|
|
1384
|
+
tags: {
|
|
1385
|
+
action: 'no_action',
|
|
1386
|
+
message_type: 'replaced',
|
|
1387
|
+
},
|
|
1388
|
+
}
|
|
1389
|
+
);
|
|
1390
|
+
assert.calledWith(mercury._emit, mercury.defaultSessionId, 'offline.replaced', closeEvent);
|
|
1391
|
+
assert.notCalled(mercury._reconnect);
|
|
1392
|
+
});
|
|
1393
|
+
|
|
1394
|
+
it('should reconnect active socket when 4000 has an unknown reason', () => {
|
|
1395
|
+
const closeEvent = {
|
|
1396
|
+
code: 4000,
|
|
1397
|
+
reason: 'Unexpected close',
|
|
1398
|
+
};
|
|
1399
|
+
|
|
1400
|
+
mercury._onclose(mercury.defaultSessionId, closeEvent, mockSocket);
|
|
1401
|
+
|
|
1402
|
+
assert.calledOnceWithExactly(
|
|
1403
|
+
webex.internal.metrics.submitClientMetrics,
|
|
1404
|
+
'JS_SDK_MERCURY_CLOSE_4000',
|
|
1405
|
+
{
|
|
1406
|
+
fields: {
|
|
1407
|
+
action: 'reconnect',
|
|
1408
|
+
close_code: 4000,
|
|
1409
|
+
close_reason: 'Unexpected close',
|
|
1410
|
+
is_active_socket: true,
|
|
1411
|
+
message_type: 'other',
|
|
1412
|
+
session_id: mercury.defaultSessionId,
|
|
1413
|
+
},
|
|
1414
|
+
tags: {
|
|
1415
|
+
action: 'reconnect',
|
|
1416
|
+
message_type: 'other',
|
|
1417
|
+
},
|
|
1418
|
+
}
|
|
1419
|
+
);
|
|
1420
|
+
assert.calledWith(mercury._emit, mercury.defaultSessionId, 'offline.transient', closeEvent);
|
|
1421
|
+
assert.calledWith(
|
|
1422
|
+
mercury._reconnect,
|
|
1423
|
+
mockSocket.url,
|
|
1424
|
+
mercury.defaultSessionId
|
|
1425
|
+
);
|
|
1426
|
+
});
|
|
1427
|
+
|
|
1428
|
+
it('should not reconnect a non-active socket with an unknown 4000 reason', () => {
|
|
1429
|
+
const closeEvent = {
|
|
1430
|
+
code: 4000,
|
|
1431
|
+
reason: 'Unexpected close',
|
|
1432
|
+
};
|
|
1433
|
+
|
|
1434
|
+
mercury._onclose(mercury.defaultSessionId, closeEvent, anotherSocket);
|
|
1435
|
+
|
|
1436
|
+
assert.calledOnceWithExactly(
|
|
1437
|
+
webex.internal.metrics.submitClientMetrics,
|
|
1438
|
+
'JS_SDK_MERCURY_CLOSE_4000',
|
|
1439
|
+
{
|
|
1440
|
+
fields: {
|
|
1441
|
+
action: 'ignore_non_active',
|
|
1442
|
+
close_code: 4000,
|
|
1443
|
+
close_reason: 'Unexpected close',
|
|
1444
|
+
is_active_socket: false,
|
|
1445
|
+
message_type: 'other',
|
|
1446
|
+
session_id: mercury.defaultSessionId,
|
|
1447
|
+
},
|
|
1448
|
+
tags: {
|
|
1449
|
+
action: 'ignore_non_active',
|
|
1450
|
+
message_type: 'other',
|
|
1451
|
+
},
|
|
1452
|
+
}
|
|
1453
|
+
);
|
|
1454
|
+
assert.notCalled(mercury._emit);
|
|
1455
|
+
assert.notCalled(mercury._reconnect);
|
|
1456
|
+
assert.isTrue(mercury.connected);
|
|
1457
|
+
});
|
|
1458
|
+
});
|
|
1459
|
+
|
|
1337
1460
|
describe('#_onclose() with code 4001 (shutdown replacement)', () => {
|
|
1338
1461
|
let mockSocket, anotherSocket;
|
|
1339
1462
|
|