@webex/internal-plugin-mercury 3.12.0-next.4 → 3.12.0-next.40

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 CHANGED
@@ -68,6 +68,12 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
68
68
  },
69
69
  type: 'object'
70
70
  },
71
+ sessionWebSocketUrls: {
72
+ default: function _default() {
73
+ return new _map.default();
74
+ },
75
+ type: 'object'
76
+ },
71
77
  backoffCalls: {
72
78
  default: function _default() {
73
79
  return new _map.default();
@@ -370,6 +376,7 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
370
376
  return _promise.default.all(disconnectPromises).then(function () {
371
377
  _this6.connected = false;
372
378
  _this6.sockets.clear();
379
+ _this6.sessionWebSocketUrls.clear();
373
380
  _this6.backoffCalls.clear();
374
381
  // Clear connection promises to prevent stale promises
375
382
  if (_this6._connectPromises) {
@@ -554,9 +561,14 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
554
561
  }
555
562
  if (reason instanceof _errors.ConnectionError) {
556
563
  return _this8.webex.internal.feature.getFeature('developer', 'web-high-availability').then(function (haMessagingEnabled) {
564
+ var wsUrl = newWSUrl || reason.webSocketUrl;
557
565
  if (haMessagingEnabled) {
558
- _this8.logger.info("".concat(_this8.namespace, ": received a generic connection error for ").concat(sessionId, ", will try to connect to another datacenter. failed, action: 'failed', url: ").concat(newWSUrl, " error: ").concat(reason.message));
559
- return _this8.webex.internal.services.markFailedUrl(newWSUrl);
566
+ _this8.logger.info("".concat(_this8.namespace, ": received a generic connection error for ").concat(sessionId, ", will try to connect to another datacenter. failed, action: 'failed', url: ").concat(wsUrl, " error: ").concat(reason.message));
567
+ if (wsUrl) {
568
+ _this8.logger.info("".concat(_this8.namespace, ": marking ").concat(wsUrl, " as failed for ").concat(sessionId, " due to connection error"));
569
+ return _this8.webex.internal.services.markFailedUrl(wsUrl);
570
+ }
571
+ _this8.logger.info("".concat(_this8.namespace, ": no socket url available to mark as failed for ").concat(sessionId, " due to connection error"));
560
572
  }
561
573
  return null;
562
574
  }).then(function () {
@@ -596,8 +608,19 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
596
608
  _this9.sockets.set(sessionId, socket);
597
609
  _this9.socket = _this9.sockets.get(_this9.defaultSessionId);
598
610
  _this9.logger.info("".concat(_this9.namespace, " ").concat(logPrefix, " url for ").concat(sessionId, ": ").concat(webSocketUrl));
611
+
612
+ // Remember the resolved URL used to open this socket so that
613
+ // reconnection in _onclose re-derives from a catalog-valid host. This is
614
+ // captured before socket.open(), which a lower layer (e.g. the same-site
615
+ // websocket proxy done with interceptors) may rewrite into a non-catalog host.
616
+ // Reusing the post-proxy native socket URL would fail
617
+ // host-catalog validation in _prepareUrl and block reconnection.
618
+ _this9.sessionWebSocketUrls.set(sessionId, webSocketUrl);
599
619
  return socket.open(webSocketUrl, options).then(function () {
600
620
  return webSocketUrl;
621
+ }).catch(function (err) {
622
+ err.webSocketUrl = webSocketUrl;
623
+ return _promise.default.reject(err);
601
624
  });
602
625
  });
603
626
  },
@@ -758,12 +781,16 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
758
781
  try {
759
782
  var reason = event.reason && event.reason.toLowerCase();
760
783
  var sessionSocket = this.sockets.get(sessionId);
761
- var socketUrl;
762
784
  event.sessionId = sessionId;
763
785
  var isActiveSocket = sourceSocket === sessionSocket;
764
- if (sourceSocket) {
765
- socketUrl = sourceSocket.url;
766
- }
786
+ // Reconnect using the resolved URL this session's socket was
787
+ // opened with, captured in _prepareAndOpenSocket. Do NOT reuse
788
+ // sourceSocket.url: that reflects the URL the native WebSocket was
789
+ // actually opened with, which a lower layer may have rewritten
790
+ // (e.g. via interceptors) into a host that is not in the SDK host
791
+ // catalog. Feeding such a URL back into _prepareUrl fails host-catalog
792
+ // validation and permanently blocks reconnection.
793
+ var socketUrl = this.sessionWebSocketUrls.get(sessionId);
767
794
  this.sockets.delete(sessionId);
768
795
  if (isActiveSocket) {
769
796
  // Only tear down state if the currently active socket closed
@@ -910,7 +937,7 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
910
937
  this.logger.info("".concat(this.namespace, ": reconnecting ").concat(sessionId));
911
938
  return this.connect(webSocketUrl, sessionId);
912
939
  },
913
- version: "3.12.0-next.4"
940
+ version: "3.12.0-next.40"
914
941
  }, (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));
915
942
  var _default2 = exports.default = Mercury;
916
943
  //# sourceMappingURL=mercury.js.map
@@ -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","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 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.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 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: ${newWSUrl} error: ${reason.message}`\n );\n\n return this.webex.internal.services.markFailedUrl(newWSUrl);\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 return socket.open(webSocketUrl, options).then(() => webSocketUrl);\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 let socketUrl;\n event.sessionId = sessionId;\n\n const isActiveSocket = sourceSocket === sessionSocket;\n if (sourceSocket) {\n socketUrl = sourceSocket.url;\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","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":[]}
package/package.json CHANGED
@@ -29,27 +29,27 @@
29
29
  "@webex/eslint-config-legacy": "0.0.0",
30
30
  "@webex/jest-config-legacy": "0.0.0",
31
31
  "@webex/legacy-tools": "0.0.0",
32
- "@webex/test-helper-chai": "3.11.0-next.1",
33
- "@webex/test-helper-mocha": "3.11.0-next.1",
34
- "@webex/test-helper-mock-webex": "3.11.0-next.1",
35
- "@webex/test-helper-test-users": "3.11.0-next.1",
32
+ "@webex/test-helper-chai": "3.12.0-next.5",
33
+ "@webex/test-helper-mocha": "3.12.0-next.5",
34
+ "@webex/test-helper-mock-webex": "3.12.0-next.5",
35
+ "@webex/test-helper-test-users": "3.12.0-next.5",
36
36
  "eslint": "^8.24.0",
37
37
  "prettier": "^2.7.1",
38
38
  "sinon": "^9.2.4"
39
39
  },
40
40
  "dependencies": {
41
- "@webex/common": "3.11.0-next.1",
42
- "@webex/common-timers": "3.11.0-next.1",
43
- "@webex/internal-plugin-device": "3.12.0-next.3",
44
- "@webex/internal-plugin-feature": "3.12.0-next.3",
45
- "@webex/internal-plugin-metrics": "3.12.0-next.3",
46
- "@webex/test-helper-chai": "3.11.0-next.1",
47
- "@webex/test-helper-mocha": "3.11.0-next.1",
48
- "@webex/test-helper-mock-web-socket": "3.11.0-next.1",
49
- "@webex/test-helper-mock-webex": "3.11.0-next.1",
50
- "@webex/test-helper-refresh-callback": "3.11.0-next.1",
51
- "@webex/test-helper-test-users": "3.11.0-next.1",
52
- "@webex/webex-core": "3.12.0-next.3",
41
+ "@webex/common": "3.12.0-next.5",
42
+ "@webex/common-timers": "3.12.0-next.5",
43
+ "@webex/internal-plugin-device": "3.12.0-next.37",
44
+ "@webex/internal-plugin-feature": "3.12.0-next.37",
45
+ "@webex/internal-plugin-metrics": "3.12.0-next.37",
46
+ "@webex/test-helper-chai": "3.12.0-next.5",
47
+ "@webex/test-helper-mocha": "3.12.0-next.5",
48
+ "@webex/test-helper-mock-web-socket": "3.12.0-next.5",
49
+ "@webex/test-helper-mock-webex": "3.12.0-next.5",
50
+ "@webex/test-helper-refresh-callback": "3.12.0-next.5",
51
+ "@webex/test-helper-test-users": "3.12.0-next.5",
52
+ "@webex/webex-core": "3.12.0-next.37",
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.4"
67
+ "version": "3.12.0-next.40"
68
68
  }
package/src/mercury.js CHANGED
@@ -44,6 +44,10 @@ const Mercury = WebexPlugin.extend({
44
44
  default: () => new Map(),
45
45
  type: 'object',
46
46
  },
47
+ sessionWebSocketUrls: {
48
+ default: () => new Map(),
49
+ type: 'object',
50
+ },
47
51
  backoffCalls: {
48
52
  default: () => new Map(),
49
53
  type: 'object',
@@ -377,6 +381,7 @@ const Mercury = WebexPlugin.extend({
377
381
  return Promise.all(disconnectPromises).then(() => {
378
382
  this.connected = false;
379
383
  this.sockets.clear();
384
+ this.sessionWebSocketUrls.clear();
380
385
  this.backoffCalls.clear();
381
386
  // Clear connection promises to prevent stale promises
382
387
  if (this._connectPromises) {
@@ -610,12 +615,24 @@ const Mercury = WebexPlugin.extend({
610
615
  return this.webex.internal.feature
611
616
  .getFeature('developer', 'web-high-availability')
612
617
  .then((haMessagingEnabled) => {
618
+ const wsUrl = newWSUrl || reason.webSocketUrl;
619
+
613
620
  if (haMessagingEnabled) {
614
621
  this.logger.info(
615
- `${this.namespace}: received a generic connection error for ${sessionId}, will try to connect to another datacenter. failed, action: 'failed', url: ${newWSUrl} error: ${reason.message}`
622
+ `${this.namespace}: received a generic connection error for ${sessionId}, will try to connect to another datacenter. failed, action: 'failed', url: ${wsUrl} error: ${reason.message}`
616
623
  );
617
624
 
618
- return this.webex.internal.services.markFailedUrl(newWSUrl);
625
+ if (wsUrl) {
626
+ this.logger.info(
627
+ `${this.namespace}: marking ${wsUrl} as failed for ${sessionId} due to connection error`
628
+ );
629
+
630
+ return this.webex.internal.services.markFailedUrl(wsUrl);
631
+ }
632
+
633
+ this.logger.info(
634
+ `${this.namespace}: no socket url available to mark as failed for ${sessionId} due to connection error`
635
+ );
619
636
  }
620
637
 
621
638
  return null;
@@ -664,7 +681,22 @@ const Mercury = WebexPlugin.extend({
664
681
 
665
682
  this.logger.info(`${this.namespace} ${logPrefix} url for ${sessionId}: ${webSocketUrl}`);
666
683
 
667
- return socket.open(webSocketUrl, options).then(() => webSocketUrl);
684
+ // Remember the resolved URL used to open this socket so that
685
+ // reconnection in _onclose re-derives from a catalog-valid host. This is
686
+ // captured before socket.open(), which a lower layer (e.g. the same-site
687
+ // websocket proxy done with interceptors) may rewrite into a non-catalog host.
688
+ // Reusing the post-proxy native socket URL would fail
689
+ // host-catalog validation in _prepareUrl and block reconnection.
690
+ this.sessionWebSocketUrls.set(sessionId, webSocketUrl);
691
+
692
+ return socket
693
+ .open(webSocketUrl, options)
694
+ .then(() => webSocketUrl)
695
+ .catch((err) => {
696
+ err.webSocketUrl = webSocketUrl;
697
+
698
+ return Promise.reject(err);
699
+ });
668
700
  }
669
701
  );
670
702
  },
@@ -857,13 +889,18 @@ const Mercury = WebexPlugin.extend({
857
889
  try {
858
890
  const reason = event.reason && event.reason.toLowerCase();
859
891
  const sessionSocket = this.sockets.get(sessionId);
860
- let socketUrl;
861
892
  event.sessionId = sessionId;
862
893
 
863
894
  const isActiveSocket = sourceSocket === sessionSocket;
864
- if (sourceSocket) {
865
- socketUrl = sourceSocket.url;
866
- }
895
+ // Reconnect using the resolved URL this session's socket was
896
+ // opened with, captured in _prepareAndOpenSocket. Do NOT reuse
897
+ // sourceSocket.url: that reflects the URL the native WebSocket was
898
+ // actually opened with, which a lower layer may have rewritten
899
+ // (e.g. via interceptors) into a host that is not in the SDK host
900
+ // catalog. Feeding such a URL back into _prepareUrl fails host-catalog
901
+ // validation and permanently blocks reconnection.
902
+ const socketUrl = this.sessionWebSocketUrls.get(sessionId);
903
+
867
904
  this.sockets.delete(sessionId);
868
905
 
869
906
  if (isActiveSocket) {
@@ -292,6 +292,8 @@ describe('plugin-mercury', () => {
292
292
  mercury._reconnect.restore();
293
293
  }
294
294
 
295
+ let expectedReconnectUrl;
296
+
295
297
  sinon.spy(mercury, 'connect');
296
298
 
297
299
  const offlineSpy = sinon.spy();
@@ -313,6 +315,12 @@ describe('plugin-mercury', () => {
313
315
  // Make sure mercury.connect has a call count of zero
314
316
  mercury.connect.resetHistory();
315
317
 
318
+ // Reconnection re-derives from the resolved URL
319
+ // captured in _prepareAndOpenSocket, not the socket's actual
320
+ // (possibly changed by interceptors) url.
321
+ expectedReconnectUrl =
322
+ mercury.sessionWebSocketUrls.get('mercury-default-session');
323
+
316
324
  mockWebSocket.emit('close', {code, reason});
317
325
 
318
326
  return promiseTick(1);
@@ -342,7 +350,7 @@ describe('plugin-mercury', () => {
342
350
  assert.isFalse(mercury.connected, 'Mercury is not connected');
343
351
  if (action === 'reconnect') {
344
352
  assert.called(mercury.connect);
345
- assert.calledWith(mercury.connect, mockWebSocket.url);
353
+ assert.calledWith(mercury.connect, expectedReconnectUrl);
346
354
  assert.isTrue(mercury.connecting, 'Mercury is connecting');
347
355
 
348
356
  // Block until reconnect completes so logs don't overlap
@@ -135,7 +135,7 @@ describe('plugin-mercury', () => {
135
135
  }
136
136
 
137
137
  // Small delay to ensure all async operations complete
138
- await new Promise(resolve => setTimeout(resolve, 10));
138
+ await new Promise((resolve) => setTimeout(resolve, 10));
139
139
  });
140
140
 
141
141
  describe('#listen()', () => {
@@ -294,18 +294,20 @@ describe('plugin-mercury', () => {
294
294
  .then(() => {
295
295
  assert.calledOnce(Socket.prototype.open);
296
296
 
297
- return promiseTick(5);
297
+ // Wait for error handling from 1st failure to schedule 2nd timer
298
+ return promiseTick(10);
298
299
  })
299
300
  .then(() => {
300
301
  clock.tick(mercury.config.backoffTimeReset);
301
302
 
302
- return promiseTick(5);
303
+ // Wait for 2nd socket.open call AND error handling to schedule 3rd timer
304
+ return promiseTick(10);
303
305
  })
304
306
  .then(() => {
305
307
  assert.calledTwice(Socket.prototype.open);
306
308
  clock.tick(2 * mercury.config.backoffTimeReset);
307
309
 
308
- return promiseTick(5);
310
+ return promiseTick(10);
309
311
  })
310
312
  .then(() => {
311
313
  assert.calledThrice(Socket.prototype.open);
@@ -380,20 +382,20 @@ describe('plugin-mercury', () => {
380
382
  .then(() => {
381
383
  assert.calledOnce(Socket.prototype.open);
382
384
 
383
- // I'm not sure why, but it's important the clock doesn't advance
384
- // until a tick happens
385
- return promiseTick(5);
385
+ // Wait for error handling from 1st failure to schedule 2nd timer
386
+ return promiseTick(10);
386
387
  })
387
388
  .then(() => {
388
389
  clock.tick(mercury.config.backoffTimeReset);
389
390
 
390
- return promiseTick(5);
391
+ // Wait for 2nd socket.open call AND error handling to schedule 3rd timer
392
+ return promiseTick(10);
391
393
  })
392
394
  .then(() => {
393
395
  assert.calledTwice(Socket.prototype.open);
394
396
  clock.tick(2 * mercury.config.backoffTimeReset);
395
397
 
396
- return promiseTick(5);
398
+ return promiseTick(10);
397
399
  })
398
400
  .then(() => {
399
401
  assert.calledThrice(Socket.prototype.open);
@@ -493,15 +495,49 @@ describe('plugin-mercury', () => {
493
495
  // });
494
496
 
495
497
  describe('when web-high-availability feature is enabled', () => {
496
- it('marks current socket url as failed and get new one on Connection Error', () => {
498
+ it('marks the URL as failed when socket.open() fails with a ConnectionError', () => {
499
+ // When socket.open() fails, _prepareAndOpenSocket attaches webSocketUrl to the error.
500
+ // The error handler then uses wsUrl = newWSUrl || reason.webSocketUrl, so markFailedUrl
501
+ // is called with the URL obtained before the socket open attempt.
497
502
  webex.internal.feature.getFeature.returns(Promise.resolve(true));
498
503
  socketOpenStub.restore();
499
504
  socketOpenStub = sinon.stub(Socket.prototype, 'open').returns(Promise.resolve());
500
505
  socketOpenStub.onCall(0).returns(Promise.reject(new ConnectionError({code: 4001})));
501
506
  const promise = mercury.connect();
502
507
 
503
- return promiseTick(7).then(() => {
508
+ return promiseTick(15).then(() => {
504
509
  assert.calledOnce(webex.internal.services.markFailedUrl);
510
+ assert.calledWith(
511
+ webex.internal.services.markFailedUrl,
512
+ sinon.match(/example-2\.com/)
513
+ );
514
+ clock.tick(1000);
515
+
516
+ return promise;
517
+ });
518
+ });
519
+
520
+ it('does not mark a URL as failed when no wsUrl is available in ConnectionError', () => {
521
+ // If the error has no webSocketUrl and newWSUrl is also undefined,
522
+ // markFailedUrl should not be called.
523
+ webex.internal.feature.getFeature.returns(Promise.resolve(true));
524
+
525
+ const errWithNoUrl = new ConnectionError({code: 4001});
526
+ // Explicitly ensure no webSocketUrl on the error
527
+ delete errWithNoUrl.webSocketUrl;
528
+
529
+ // Stub _prepareAndOpenSocket so it rejects without attaching webSocketUrl
530
+ // (simulating a failure before socket.open is reached, e.g. _prepareUrl failure)
531
+ const prepareAndOpenStub = sinon.stub(mercury, '_prepareAndOpenSocket');
532
+
533
+ prepareAndOpenStub.onCall(0).returns(Promise.reject(errWithNoUrl));
534
+ prepareAndOpenStub.returns(Promise.resolve('ws://example-2.com'));
535
+
536
+ const promise = mercury.connect();
537
+
538
+ return promiseTick(15).then(() => {
539
+ assert.notCalled(webex.internal.services.markFailedUrl);
540
+ prepareAndOpenStub.restore();
505
541
  clock.tick(1000);
506
542
 
507
543
  return promise;
@@ -532,13 +568,13 @@ describe('plugin-mercury', () => {
532
568
 
533
569
  return promise.then(() =>
534
570
  promiseTick(2)
535
- .then(() => {
536
- clock.tick(6 * webex.internal.mercury.config.backoffTimeReset);
571
+ .then(() => {
572
+ clock.tick(6 * webex.internal.mercury.config.backoffTimeReset);
537
573
 
538
- return promiseTick(2);
539
- })
540
- .then(() => {
541
- assert.calledOnce(Socket.prototype.open);
574
+ return promiseTick(2);
575
+ })
576
+ .then(() => {
577
+ assert.calledOnce(Socket.prototype.open);
542
578
  })
543
579
  );
544
580
  });
@@ -754,12 +790,18 @@ describe('plugin-mercury', () => {
754
790
  return promiseTick(webex.internal.mercury.config.backoffTimeReset).then(() => {
755
791
  // By this time backoffCall and mercury socket should be defined by the
756
792
  // 'connect' call
757
- assert.isDefined(mercury.backoffCalls.get('mercury-default-session'), 'Mercury backoffCall is not defined');
793
+ assert.isDefined(
794
+ mercury.backoffCalls.get('mercury-default-session'),
795
+ 'Mercury backoffCall is not defined'
796
+ );
758
797
  assert.isDefined(mercury.socket, 'Mercury socket is not defined');
759
798
  // Calling disconnect will abort the backoffCall, close the socket, and
760
799
  // reject the connect
761
800
  mercury.disconnect();
762
- assert.isUndefined(mercury.backoffCalls.get('mercury-default-session'), 'Mercury backoffCall is still defined');
801
+ assert.isUndefined(
802
+ mercury.backoffCalls.get('mercury-default-session'),
803
+ 'Mercury backoffCall is still defined'
804
+ );
763
805
  // The socket will never be unset (which seems bad)
764
806
  assert.isDefined(mercury.socket, 'Mercury socket is not defined');
765
807
 
@@ -815,7 +857,10 @@ describe('plugin-mercury', () => {
815
857
  return assert.isRejected(promise).then((error) => {
816
858
  const lastError = mercury.getLastError();
817
859
 
818
- assert.equal(error.message, `Mercury Connection Aborted for ${mercury.defaultSessionId}`);
860
+ assert.equal(
861
+ error.message,
862
+ `Mercury Connection Aborted for ${mercury.defaultSessionId}`
863
+ );
819
864
  assert.isDefined(lastError);
820
865
  assert.equal(lastError, realError);
821
866
  });
@@ -1113,7 +1158,6 @@ describe('plugin-mercury', () => {
1113
1158
  });
1114
1159
  });
1115
1160
 
1116
-
1117
1161
  describe('#_onmessage() with shutdown message', () => {
1118
1162
  beforeEach(() => {
1119
1163
  sinon.stub(mercury, '_handleImminentShutdown');
@@ -1249,8 +1293,18 @@ describe('plugin-mercury', () => {
1249
1293
 
1250
1294
  // Normal flow emits namespace-specific events after processing handlers.
1251
1295
  // The early-return guard only emits 'event', so asserting these proves the normal path was taken.
1252
- assert.calledWith(mercury._emit, mercury.defaultSessionId, 'event:conversation', event.data);
1253
- assert.calledWith(mercury._emit, mercury.defaultSessionId, 'event:conversation.activity', event.data);
1296
+ assert.calledWith(
1297
+ mercury._emit,
1298
+ mercury.defaultSessionId,
1299
+ 'event:conversation',
1300
+ event.data
1301
+ );
1302
+ assert.calledWith(
1303
+ mercury._emit,
1304
+ mercury.defaultSessionId,
1305
+ 'event:conversation.activity',
1306
+ event.data
1307
+ );
1254
1308
  });
1255
1309
  });
1256
1310
 
@@ -1314,7 +1368,12 @@ describe('plugin-mercury', () => {
1314
1368
 
1315
1369
  mercury._onclose(mercury.defaultSessionId, closeEvent, mockSocket);
1316
1370
 
1317
- assert.calledWith(mercury._emit, mercury.defaultSessionId, 'offline.permanent', closeEvent);
1371
+ assert.calledWith(
1372
+ mercury._emit,
1373
+ mercury.defaultSessionId,
1374
+ 'offline.permanent',
1375
+ closeEvent
1376
+ );
1318
1377
  assert.notCalled(mercury._reconnect); // No reconnect for 4001 on active socket
1319
1378
  assert.isFalse(mercury.connected);
1320
1379
  });
@@ -1327,7 +1386,12 @@ describe('plugin-mercury', () => {
1327
1386
 
1328
1387
  mercury._onclose(mercury.defaultSessionId, closeEvent, anotherSocket);
1329
1388
 
1330
- assert.calledWith(mercury._emit, mercury.defaultSessionId, 'offline.replaced', closeEvent);
1389
+ assert.calledWith(
1390
+ mercury._emit,
1391
+ mercury.defaultSessionId,
1392
+ 'offline.replaced',
1393
+ closeEvent
1394
+ );
1331
1395
  assert.notCalled(mercury._reconnect);
1332
1396
  assert.isTrue(mercury.connected); // Should remain connected
1333
1397
  assert.notCalled(mercury.unset);
@@ -1341,7 +1405,12 @@ describe('plugin-mercury', () => {
1341
1405
 
1342
1406
  // Test non-active socket
1343
1407
  mercury._onclose(mercury.defaultSessionId, closeEvent, anotherSocket);
1344
- assert.calledWith(mercury._emit, mercury.defaultSessionId, 'offline.replaced', closeEvent);
1408
+ assert.calledWith(
1409
+ mercury._emit,
1410
+ mercury.defaultSessionId,
1411
+ 'offline.replaced',
1412
+ closeEvent
1413
+ );
1345
1414
 
1346
1415
  // Reset the spy call history
1347
1416
  mercury._emit.resetHistory();
@@ -1349,7 +1418,12 @@ describe('plugin-mercury', () => {
1349
1418
  // Test active socket
1350
1419
  mercury.sockets.set(mercury.defaultSessionId, mockSocket);
1351
1420
  mercury._onclose(mercury.defaultSessionId, closeEvent, mockSocket);
1352
- assert.calledWith(mercury._emit, mercury.defaultSessionId, 'offline.permanent', closeEvent);
1421
+ assert.calledWith(
1422
+ mercury._emit,
1423
+ mercury.defaultSessionId,
1424
+ 'offline.permanent',
1425
+ closeEvent
1426
+ );
1353
1427
  });
1354
1428
 
1355
1429
  it('should handle missing sourceSocket parameter (treats as non-active)', () => {
@@ -1361,7 +1435,12 @@ describe('plugin-mercury', () => {
1361
1435
  mercury._onclose(mercury.defaultSessionId, closeEvent); // No sourceSocket parameter
1362
1436
 
1363
1437
  // With simplified logic, undefined !== this.socket, so isActiveSocket = false
1364
- assert.calledWith(mercury._emit, mercury.defaultSessionId, 'offline.replaced', closeEvent);
1438
+ assert.calledWith(
1439
+ mercury._emit,
1440
+ mercury.defaultSessionId,
1441
+ 'offline.replaced',
1442
+ closeEvent
1443
+ );
1365
1444
  assert.notCalled(mercury._reconnect);
1366
1445
  });
1367
1446
 
@@ -1394,6 +1473,76 @@ describe('plugin-mercury', () => {
1394
1473
  });
1395
1474
  });
1396
1475
 
1476
+ describe('#_onclose() reconnect URL derivation', () => {
1477
+ const sessionId = 'mercury-default-session';
1478
+ // The URL resolved and stored in _prepareAndOpenSocket (catalog-valid host).
1479
+ const resolvedUrl = 'wss://mercury-connection.wbx2.com/v1/apps/wx2/registrations';
1480
+ // The URL the native socket was actually opened with, after a lower
1481
+ // layer (e.g. the same-site websocket proxy) rewrote it into a
1482
+ // non-catalog host. Reusing this would fail host-catalog validation.
1483
+ const proxiedUrl = 'wss://web.webex.com/webproxy/mercury-connection.wbx2.com/v1/apps/wx2';
1484
+ let sourceSocket;
1485
+
1486
+ beforeEach(() => {
1487
+ sourceSocket = {
1488
+ url: proxiedUrl,
1489
+ removeAllListeners: sinon.stub(),
1490
+ };
1491
+ mercury.socket = sourceSocket;
1492
+ mercury.sockets.set(sessionId, sourceSocket);
1493
+ mercury.sessionWebSocketUrls.set(sessionId, resolvedUrl);
1494
+ mercury.connected = true;
1495
+ sinon.stub(mercury, '_emit');
1496
+ sinon.stub(mercury, '_reconnect');
1497
+ sinon.stub(mercury, 'unset');
1498
+ });
1499
+
1500
+ afterEach(() => {
1501
+ mercury._emit.restore();
1502
+ mercury._reconnect.restore();
1503
+ mercury.unset.restore();
1504
+ mercury.sockets.clear();
1505
+ mercury.sessionWebSocketUrls.clear();
1506
+ });
1507
+
1508
+ [1001, 1005, 1006, 1011].forEach((code) => {
1509
+ it(`reconnects an active socket using the stored resolved URL (not the proxied socket.url) for code ${code}`, () => {
1510
+ mercury._onclose(sessionId, {code, reason: 'transient'}, sourceSocket);
1511
+
1512
+ assert.calledOnceWithExactly(mercury._reconnect, resolvedUrl, sessionId);
1513
+ assert.neverCalledWith(mercury._reconnect, proxiedUrl, sessionId);
1514
+ });
1515
+ });
1516
+
1517
+ it('reconnects using the stored resolved URL for a normal close (1000) with a reconnect reason', () => {
1518
+ mercury._onclose(sessionId, {code: 1000, reason: 'done (forced)'}, sourceSocket);
1519
+
1520
+ assert.calledOnceWithExactly(mercury._reconnect, resolvedUrl, sessionId);
1521
+ });
1522
+
1523
+ it('does not reconnect when a non-active (old) socket closes', () => {
1524
+ const oldSocket = {
1525
+ url: proxiedUrl,
1526
+ removeAllListeners: sinon.stub(),
1527
+ };
1528
+
1529
+ mercury._onclose(sessionId, {code: 1006, reason: 'transient'}, oldSocket);
1530
+
1531
+ assert.notCalled(mercury._reconnect);
1532
+ });
1533
+ });
1534
+
1535
+ describe('#disconnectAll()', () => {
1536
+ it('clears sessionWebSocketUrls along with the other session state', async () => {
1537
+ mercury.sessionWebSocketUrls.set('mercury-default-session', 'ws://example.com');
1538
+ mercury.sessionWebSocketUrls.set('llm-session', 'ws://example-2.com');
1539
+
1540
+ await mercury.disconnectAll();
1541
+
1542
+ assert.equal(mercury.sessionWebSocketUrls.size, 0);
1543
+ });
1544
+ });
1545
+
1397
1546
  describe('shutdown switchover with retry logic', () => {
1398
1547
  let connectWithBackoffStub;
1399
1548
  const sessionId = 'mercury-default-session';
@@ -1582,6 +1731,16 @@ describe('plugin-mercury', () => {
1582
1731
  assert.equal(result, 'ws://example.com');
1583
1732
  });
1584
1733
 
1734
+ it('stores the resolved (pre-proxy) URL under the sessionId in sessionWebSocketUrls', async () => {
1735
+ const sessionId = 'llm-session';
1736
+
1737
+ await mercury._prepareAndOpenSocket(mockSocket, 'ws://original.com', sessionId);
1738
+
1739
+ // The stored value is the URL resolved by _prepareUrl, not the raw
1740
+ // input, so _onclose can later reconnect from a catalog-valid host.
1741
+ assert.equal(mercury.sessionWebSocketUrls.get(sessionId), 'ws://example.com');
1742
+ });
1743
+
1585
1744
  it('should handle errors during socket open', async () => {
1586
1745
  mockSocket.open.returns(Promise.reject(new Error('Open failed')));
1587
1746
 
@@ -1590,6 +1749,7 @@ describe('plugin-mercury', () => {
1590
1749
  assert.fail('Should have thrown an error');
1591
1750
  } catch (err) {
1592
1751
  assert.equal(err.message, 'Open failed');
1752
+ assert.equal(err.webSocketUrl, 'ws://example.com');
1593
1753
  }
1594
1754
  });
1595
1755
  });
@@ -1648,11 +1808,7 @@ describe('plugin-mercury', () => {
1648
1808
  onSuccess: (newSocket, url) => {
1649
1809
  mercury.socket = newSocket;
1650
1810
  mercury.connected = true;
1651
- mercury._emit(
1652
- sessionId,
1653
- 'event:mercury_shutdown_switchover_complete',
1654
- {url}
1655
- );
1811
+ mercury._emit(sessionId, 'event:mercury_shutdown_switchover_complete', {url});
1656
1812
  },
1657
1813
  });
1658
1814
 
@@ -1680,12 +1836,9 @@ describe('plugin-mercury', () => {
1680
1836
  it('should check _shutdownSwitchoverBackoffCall for shutdown connections', () => {
1681
1837
  mercury._shutdownSwitchoverBackoffCalls.clear();
1682
1838
 
1683
- const result = mercury._attemptConnection(
1684
- 'ws://test.com',
1685
- sessionId,
1686
- callback,
1687
- {isShutdownSwitchover: true}
1688
- );
1839
+ const result = mercury._attemptConnection('ws://test.com', sessionId, callback, {
1840
+ isShutdownSwitchover: true,
1841
+ });
1689
1842
 
1690
1843
  return result.catch((err) => {
1691
1844
  assert.instanceOf(err, Error);