@webex/internal-plugin-mercury 3.12.0-llmrefactor.1 → 3.12.0-llmrefactor.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/mercury.js +45 -5
- package/dist/mercury.js.map +1 -1
- package/package.json +12 -12
- package/src/mercury.js +46 -4
- package/test/unit/spec/mercury-events.js +7 -2
- package/test/unit/spec/mercury.js +116 -0
package/dist/mercury.js
CHANGED
|
@@ -36,6 +36,7 @@ var _dec, _dec2, _obj;
|
|
|
36
36
|
function ownKeys(e, r) { var t = _Object$keys2(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return _Object$getOwnPropertyDescriptor2(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
37
37
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : _Object$getOwnPropertyDescriptors ? _Object$defineProperties(e, _Object$getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { _Object$defineProperty(e, r, _Object$getOwnPropertyDescriptor2(t, r)); }); } return e; }
|
|
38
38
|
var normalReconnectReasons = ['idle', 'done (forced)', 'pong not received', 'pong mismatch'];
|
|
39
|
+
var MERCURY_CLOSE_4000_METRIC = 'JS_SDK_MERCURY_CLOSE_4000';
|
|
39
40
|
var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mercury#listen(): Use Mercury#connect() instead'), _dec2 = (0, _common.deprecated)('Mercury#stopListening(): Use Mercury#disconnect() instead'), _obj = {
|
|
40
41
|
namespace: 'Mercury',
|
|
41
42
|
lastError: undefined,
|
|
@@ -607,6 +608,28 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
607
608
|
}
|
|
608
609
|
return handlers;
|
|
609
610
|
},
|
|
611
|
+
_submitMercuryClose4000Metric: function _submitMercuryClose4000Metric(event, options) {
|
|
612
|
+
var action = options.action,
|
|
613
|
+
isActiveSocket = options.isActiveSocket,
|
|
614
|
+
messageType = options.messageType;
|
|
615
|
+
try {
|
|
616
|
+
this.webex.internal.metrics.submitClientMetrics(MERCURY_CLOSE_4000_METRIC, {
|
|
617
|
+
fields: {
|
|
618
|
+
action: action,
|
|
619
|
+
close_code: event.code,
|
|
620
|
+
close_reason: event.reason || '',
|
|
621
|
+
is_active_socket: isActiveSocket,
|
|
622
|
+
message_type: messageType
|
|
623
|
+
},
|
|
624
|
+
tags: {
|
|
625
|
+
action: action,
|
|
626
|
+
message_type: messageType
|
|
627
|
+
}
|
|
628
|
+
});
|
|
629
|
+
} catch (error) {
|
|
630
|
+
this.logger.warn("".concat(this.namespace, ": failed to submit Mercury 4000 close metric"), error);
|
|
631
|
+
}
|
|
632
|
+
},
|
|
610
633
|
_onclose: function _onclose(event, sourceSocket) {
|
|
611
634
|
// I don't see any way to avoid the complexity or statement count in here.
|
|
612
635
|
/* eslint complexity: [0] */
|
|
@@ -642,10 +665,27 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
642
665
|
if (isActiveSocket) this._emit('offline.permanent', event);
|
|
643
666
|
break;
|
|
644
667
|
case 4000:
|
|
645
|
-
// metric: disconnect
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
668
|
+
// metric: disconnect, check reason
|
|
669
|
+
if (reason === 'replaced') {
|
|
670
|
+
this._submitMercuryClose4000Metric(event, {
|
|
671
|
+
action: 'no_action',
|
|
672
|
+
isActiveSocket: isActiveSocket,
|
|
673
|
+
messageType: 'replaced'
|
|
674
|
+
});
|
|
675
|
+
this.logger.info("".concat(this.namespace, ": socket replaced; will not reconnect"));
|
|
676
|
+
if (isActiveSocket) this._emit('offline.replaced', event);
|
|
677
|
+
} else {
|
|
678
|
+
this._submitMercuryClose4000Metric(event, {
|
|
679
|
+
action: isActiveSocket ? 'reconnect' : 'ignore_non_active',
|
|
680
|
+
isActiveSocket: isActiveSocket,
|
|
681
|
+
messageType: 'other'
|
|
682
|
+
});
|
|
683
|
+
this.logger.info("".concat(this.namespace, ": socket disconnected with 4000: ").concat(event.reason, "; reconnecting"));
|
|
684
|
+
if (isActiveSocket) {
|
|
685
|
+
this._emit('offline.transient', event);
|
|
686
|
+
this._reconnect(socketUrl);
|
|
687
|
+
}
|
|
688
|
+
}
|
|
649
689
|
break;
|
|
650
690
|
case 4001:
|
|
651
691
|
// replaced during shutdown
|
|
@@ -756,7 +796,7 @@ var Mercury = _webexCore.WebexPlugin.extend((_dec = (0, _common.deprecated)('Mer
|
|
|
756
796
|
this.logger.info("".concat(this.namespace, ": reconnecting"));
|
|
757
797
|
return this.connect(webSocketUrl);
|
|
758
798
|
},
|
|
759
|
-
version: "3.12.0-llmrefactor.
|
|
799
|
+
version: "3.12.0-llmrefactor.3"
|
|
760
800
|
}, (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));
|
|
761
801
|
var _default = exports.default = Mercury;
|
|
762
802
|
//# sourceMappingURL=mercury.js.map
|
package/dist/mercury.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_url","_interopRequireDefault","require","_webexCore","_common","_lodash","_backoff","_socket","_errors","_dec","_dec2","_obj","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor2","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","normalReconnectReasons","Mercury","WebexPlugin","extend","deprecated","namespace","lastError","undefined","session","connected","type","connecting","hasEverConnected","socket","localClusterServiceUrls","mercuryTimeOffset","backoffCall","_connectPromise","_shutdownSwitchoverBackoffCall","_shutdownSwitchoverId","resolvedWebSocketUrl","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","_this2","event","_onclose","_onmessage","_setTimeOffset","_len","args","Array","_key","_emit","concat","_len2","_key2","_handleImminentShutdown","_this3","oldSocket","logger","info","_now","_connectWithBackoff","isShutdownSwitchover","attemptOptions","onSuccess","newSocket","webSocketUrl","url","then","catch","err","reason","error","getLastError","getSocket","connect","_this4","_promise","resolve","device","registered","register","finally","disconnect","options","_this5","_stringify","abort","removeAllListeners","once","close","listen","stopListening","processRegistrationStatusEvent","message","_applyOverrides","headers","headerKeys","_keys","keyPath","set","_prepareUrl","_this6","getFeature","haMessagingEnabled","highPrioritySocketUrl","convertUrlToPriorityHostUrl","warn","_url$parse","hostFromUrl","parse","host","isValidHost","wsUrl","webSharedMercury","_assign","query","outboundWireFormat","bufferStates","aliasHttpStatus","mercuryRegistrationStatus","isRegistrationRefreshEnabled","_deleteProperty","get","multipleConnections","clientTimestamp","search","format","_attemptConnection","socketUrl","callback","_this7","_options$isShutdownSw","_options$onSuccess","Socket","newWSUrl","msg","Error","reject","_prepareAndOpenSocket","refresh","_this7$backoffCall","_this7$backoffCall3","code","getNumRetries","_this7$backoffCall2","retries","stack","UnknownResponse","NotAuthorized","credentials","force","BadRequest","Forbidden","ConnectionError","markFailedUrl","_this8","logPrefix","all","getUserToken","_ref","_ref2","_slicedToArray2","token","forceCloseDelay","config","pingInterval","pongTimeout","toString","trackingId","sessionId","defaultMercuryOptions","customOptionsMsg","open","_this9","context","_context$isShutdownSw","_context$attemptOptio","call","onComplete","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","_len3","_key3","trigger","logError","console","_getEventHandlers","eventType","_eventType$split","split","_eventType$split2","name","handlers","handlerName","camelCase","sourceSocket","isActiveSocket","toLowerCase","unset","_reconnect","includes","_this0","ENABLE_MERCURY_LOGGING","reduce","promise","handler","_ref3","_ref4","wsWriteTimestamp","version","_applyDecoratedDescriptor2","_getOwnPropertyDescriptor","_default","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\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 socket: 'object',\n localClusterServiceUrls: 'object',\n mercuryTimeOffset: {\n default: undefined,\n type: 'number',\n },\n backoffCall: 'object',\n _connectPromise: 'object',\n _shutdownSwitchoverBackoffCall: 'object',\n _shutdownSwitchoverId: 'string',\n // Store the resolved (pre-proxy) URL so reconnection uses a catalog-valid host\n // instead of the potentially rewritten socket.url from an interceptor.\n resolvedWebSocketUrl: 'string',\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 * @returns {void}\n */\n _attachSocketEventListeners(socket) {\n socket.on('close', (event) => this._onclose(event, socket));\n socket.on('message', (...args) => this._onmessage(...args));\n socket.on('pong', (...args) => this._setTimeOffset(...args));\n socket.on('sequence-mismatch', (...args) => this._emit('sequence-mismatch', ...args));\n socket.on('ping-pong-latency', (...args) => this._emit('ping-pong-latency', ...args));\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 * @returns {void}\n */\n _handleImminentShutdown() {\n const oldSocket = this.socket;\n\n try {\n if (this._shutdownSwitchoverBackoffCall) {\n this.logger.info(`${this.namespace}: [shutdown] switchover already in progress`);\n\n return;\n }\n this._shutdownSwitchoverId = `${Date.now()}`;\n this.logger.info(\n `${this.namespace}: [shutdown] switchover start, id=${this._shutdownSwitchoverId}`\n );\n\n this._connectWithBackoff(undefined, {\n isShutdownSwitchover: true,\n attemptOptions: {\n isShutdownSwitchover: true,\n onSuccess: (newSocket, webSocketUrl) => {\n this.logger.info(\n `${this.namespace}: [shutdown] switchover connected, url: ${webSocketUrl}`\n );\n\n // Atomically switch active socket reference\n this.socket = newSocket;\n this.connected = true; // remain connected throughout\n\n this._emit('event:mercury_shutdown_switchover_complete', {url: webSocketUrl});\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(`${this.namespace}: [shutdown] switchover completed successfully`);\n })\n .catch((err) => {\n this.logger.info(\n `${this.namespace}: [shutdown] switchover exhausted retries; will fall back to normal reconnection`,\n err\n );\n this._emit('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(`${this.namespace}: [shutdown] error during switchover`, e);\n this._shutdownSwitchoverBackoffCall = undefined;\n this._emit('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 the underlying WebSocket.\n * @returns {any} The socket instance, or undefined if not connected.\n */\n getSocket() {\n return this.socket;\n },\n\n connect(webSocketUrl) {\n if (this.connected) {\n this.logger.info(`${this.namespace}: already connected, will not connect again`);\n\n return Promise.resolve();\n }\n\n // If already connecting, return the existing promise so callers can await it\n if (this._connectPromise) {\n this.logger.info(\n `${this.namespace}: connection already in progress, returning existing promise`\n );\n\n return this._connectPromise;\n }\n\n this.connecting = true;\n\n this.logger.info(`${this.namespace}: starting connection attempt`);\n\n this._connectPromise = Promise.resolve(\n this.webex.internal.device.registered || this.webex.internal.device.register()\n )\n .then(() => {\n this.logger.info(`${this.namespace}: connecting`);\n\n return this._connectWithBackoff(webSocketUrl);\n })\n .finally(() => {\n this._connectPromise = null;\n });\n\n return this._connectPromise;\n },\n\n disconnect(options) {\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 if (this.backoffCall) {\n this.logger.info(`${this.namespace}: aborting connection`);\n this.backoffCall.abort();\n }\n\n if (this._shutdownSwitchoverBackoffCall) {\n this.logger.info(`${this.namespace}: aborting shutdown switchover`);\n this._shutdownSwitchoverBackoffCall.abort();\n }\n\n if (this.socket) {\n this.socket.removeAllListeners('message');\n this.once('offline', resolve);\n this.socket.close(options || undefined);\n\n return;\n }\n\n resolve();\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\n delete webSocketUrl.search;\n\n return url.format(webSocketUrl);\n });\n },\n\n _attemptConnection(socketUrl, callback, options = {}) {\n const {isShutdownSwitchover = false, onSuccess = null} = options;\n\n const socket = new Socket();\n let newWSUrl;\n\n this._attachSocketEventListeners(socket);\n\n // Check appropriate backoff call based on connection type\n if (isShutdownSwitchover && !this._shutdownSwitchoverBackoffCall) {\n const msg = `${this.namespace}: prevent socket open when switchover backoff call no longer defined`;\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 if (!isShutdownSwitchover && !this.backoffCall) {\n const msg = `${this.namespace}: prevent socket open when backoffCall no longer defined`;\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 // eslint-disable-next-line no-unreachable\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.socket = socket;\n }\n\n return this._prepareAndOpenSocket(socket, socketUrl, isShutdownSwitchover)\n .then((webSocketUrl) => {\n newWSUrl = webSocketUrl;\n this.logger.info(\n `${this.namespace}: ${\n isShutdownSwitchover ? '[shutdown] switchover' : ''\n } connected to mercury, success, action: connected, 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(`${this.namespace}: [shutdown] switchover attempt failed`, reason);\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 // 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 && this.backoffCall && this.backoffCall?.getNumRetries() > 0) {\n this._emit('connection_failed', reason, {retries: this.backoffCall?.getNumRetries()});\n }\n this.logger.info(\n `${this.namespace}: connection attempt failed`,\n reason,\n this.backoffCall?.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, 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(`${this.namespace}: received authorization error, reauthorizing`);\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(`${this.namespace}: received unrecoverable response from mercury`);\n this.backoffCall.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, 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 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 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(`${this.namespace}: failed to handle connection failure`, reason);\n callback(reason);\n });\n },\n\n _prepareAndOpenSocket(socket, socketUrl, 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 this.logger.info(`${this.namespace}: ${logPrefix} url: ${webSocketUrl}`);\n\n // Store the resolved URL before socket.open(), which may be rewritten by\n // an interceptor (e.g. same-site websocket proxy). On reconnection we need\n // the original catalog-valid URL, not the post-proxy one from socket.url.\n if (!isShutdownSwitchover) {\n this.resolvedWebSocketUrl = webSocketUrl;\n }\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, context = {}) {\n const {isShutdownSwitchover = false, attemptOptions = {}} = context;\n\n return new Promise((resolve, reject) => {\n // eslint gets confused about whether or not call is actually used\n // eslint-disable-next-line prefer-const\n let call;\n const onComplete = (err) => {\n // Clear state flags based on connection type\n if (isShutdownSwitchover) {\n this._shutdownSwitchoverBackoffCall = undefined;\n } else {\n this.connecting = false;\n this.backoffCall = undefined;\n }\n\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\n return reject(err);\n }\n\n // Default success handling for normal connections\n if (!isShutdownSwitchover) {\n this.connected = true;\n this.hasEverConnected = true;\n this._emit('online');\n this.webex.internal.newMetrics.callDiagnosticMetrics.setMercuryConnectedStatus(true);\n }\n\n return resolve();\n };\n\n // eslint-disable-next-line prefer-reflect\n call = backoff.call((callback) => {\n const attemptNum = call.getNumRetries();\n const logPrefix = isShutdownSwitchover ? '[shutdown] switchover' : 'connection';\n\n this.logger.info(`${this.namespace}: executing ${logPrefix} attempt ${attemptNum}`);\n this._attemptConnection(webSocketUrl, callback, attemptOptions);\n }, onComplete);\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 call.on('abort', () => {\n const msg = isShutdownSwitchover ? 'Shutdown Switchover' : 'Connection';\n\n this.logger.info(`${this.namespace}: ${msg} aborted`);\n reject(new Error(`Mercury ${msg} Aborted`));\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 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`\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`);\n });\n\n // Store backoff call reference BEFORE starting (so it's available in _attemptConnection)\n if (isShutdownSwitchover) {\n this._shutdownSwitchoverBackoffCall = call;\n } else {\n this.backoffCall = call;\n }\n\n call.start();\n });\n },\n\n _emit(...args) {\n try {\n this.trigger(...args);\n } catch (error) {\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\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(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 isActiveSocket = sourceSocket === this.socket;\n const reason = event.reason && event.reason.toLowerCase();\n\n // Use the stored resolved URL for reconnection instead of sourceSocket.url,\n // which may have been rewritten by an interceptor to a non-catalog host.\n const socketUrl = this.resolvedWebSocketUrl || (sourceSocket && sourceSocket.url);\n\n if (isActiveSocket) {\n // Only tear down state if the currently active socket closed\n if (this.socket) {\n this.socket.removeAllListeners();\n }\n this.unset('socket');\n this.connected = false;\n this._emit('offline', event);\n this.webex.internal.newMetrics.callDiagnosticMetrics.setMercuryConnectedStatus(false);\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}`\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; will not reconnect: ${event.reason}`\n );\n if (isActiveSocket) this._emit('offline.permanent', event);\n break;\n case 4000:\n // metric: disconnect\n this.logger.info(`${this.namespace}: socket replaced; will not reconnect`);\n if (isActiveSocket) this._emit('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`\n );\n this._emit('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`\n );\n this._emit('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 disconnected; reconnecting`);\n if (isActiveSocket) {\n this._emit('offline.transient', event);\n this.logger.info(`${this.namespace}: [shutdown] reconnecting active socket to recover`);\n this._reconnect(socketUrl);\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 disconnected; reconnecting`);\n if (isActiveSocket) {\n this._emit('offline.transient', event);\n this.logger.info(`${this.namespace}: [shutdown] reconnecting due to normal close`);\n this._reconnect(socketUrl);\n }\n // metric: disconnect\n // if (reason === done forced) metric: force closure\n } else {\n this.logger.info(\n `${this.namespace}: socket disconnected; will not reconnect: ${event.reason}`\n );\n if (isActiveSocket) this._emit('offline.permanent', event);\n }\n break;\n default:\n this.logger.info(\n `${this.namespace}: socket disconnected unexpectedly; will not reconnect`\n );\n // unexpected disconnect\n if (isActiveSocket) this._emit('offline.permanent', event);\n }\n } catch (error) {\n this.logger.error(`${this.namespace}: error occurred in close handler`, error);\n }\n },\n\n _onmessage(event) {\n this._setTimeOffset(event);\n const envelope = event.data;\n\n if (process.env.ENABLE_MERCURY_LOGGING) {\n this.logger.debug(`${this.namespace}: message envelope: `, envelope);\n }\n\n // Handle shutdown message shape: { type: 'shutdown' }\n if (envelope && envelope.type === 'shutdown') {\n this.logger.info(`${this.namespace}: [shutdown] imminent shutdown message received`);\n this._emit('event:mercury_shutdown_imminent', envelope);\n\n this._handleImminentShutdown();\n\n return Promise.resolve();\n }\n\n const {data} = envelope;\n\n if (!data || !data.eventType) {\n this._emit('event', envelope);\n\n return Promise.resolve();\n }\n\n this._applyOverrides(data);\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}`,\n reason\n )\n );\n }),\n Promise.resolve()\n )\n .then(() => {\n this._emit('event', event.data);\n const [namespace] = data.eventType ? data.eventType.split('.') : [];\n\n if (namespace === data.eventType) {\n this._emit(`event:${namespace}`, envelope);\n } else {\n this._emit(`event:${namespace}`, envelope);\n this._emit(`event:${data.eventType}`, envelope);\n }\n })\n .catch((reason) => {\n this.logger.error(`${this.namespace}: error occurred processing socket message`, reason);\n });\n },\n\n _setTimeOffset(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) {\n this.logger.info(`${this.namespace}: reconnecting`);\n\n return this.connect(webSocketUrl);\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","normalReconnectReasons","MERCURY_CLOSE_4000_METRIC","Mercury","WebexPlugin","extend","deprecated","namespace","lastError","undefined","session","connected","type","connecting","hasEverConnected","socket","localClusterServiceUrls","mercuryTimeOffset","backoffCall","_connectPromise","_shutdownSwitchoverBackoffCall","_shutdownSwitchoverId","resolvedWebSocketUrl","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","_this2","event","_onclose","_onmessage","_setTimeOffset","_len","args","Array","_key","_emit","concat","_len2","_key2","_handleImminentShutdown","_this3","oldSocket","logger","info","_now","_connectWithBackoff","isShutdownSwitchover","attemptOptions","onSuccess","newSocket","webSocketUrl","url","then","catch","err","reason","error","getLastError","getSocket","connect","_this4","_promise","resolve","device","registered","register","finally","disconnect","options","_this5","_stringify","abort","removeAllListeners","once","close","listen","stopListening","processRegistrationStatusEvent","message","_applyOverrides","headers","headerKeys","_keys","keyPath","set","_prepareUrl","_this6","getFeature","haMessagingEnabled","highPrioritySocketUrl","convertUrlToPriorityHostUrl","warn","_url$parse","hostFromUrl","parse","host","isValidHost","wsUrl","webSharedMercury","_assign","query","outboundWireFormat","bufferStates","aliasHttpStatus","mercuryRegistrationStatus","isRegistrationRefreshEnabled","_deleteProperty","get","multipleConnections","clientTimestamp","search","format","_attemptConnection","socketUrl","callback","_this7","_options$isShutdownSw","_options$onSuccess","Socket","newWSUrl","msg","Error","reject","_prepareAndOpenSocket","refresh","_this7$backoffCall","_this7$backoffCall3","code","getNumRetries","_this7$backoffCall2","retries","stack","UnknownResponse","NotAuthorized","credentials","force","BadRequest","Forbidden","ConnectionError","markFailedUrl","_this8","logPrefix","all","getUserToken","_ref","_ref2","_slicedToArray2","token","forceCloseDelay","config","pingInterval","pongTimeout","toString","trackingId","sessionId","defaultMercuryOptions","customOptionsMsg","open","_this9","context","_context$isShutdownSw","_context$attemptOptio","call","onComplete","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","_len3","_key3","trigger","logError","console","_getEventHandlers","eventType","_eventType$split","split","_eventType$split2","name","handlers","handlerName","camelCase","_submitMercuryClose4000Metric","action","isActiveSocket","messageType","metrics","submitClientMetrics","fields","close_code","close_reason","is_active_socket","message_type","tags","sourceSocket","toLowerCase","unset","_reconnect","includes","_this0","ENABLE_MERCURY_LOGGING","reduce","promise","handler","_ref3","_ref4","wsWriteTimestamp","version","_applyDecoratedDescriptor2","_getOwnPropertyDescriptor","_default","exports"],"sources":["mercury.js"],"sourcesContent":["/* eslint-disable require-jsdoc */\n/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport url from 'url';\n\nimport {WebexPlugin} from '@webex/webex-core';\nimport {deprecated} from '@webex/common';\nimport {camelCase, get, set} from 'lodash';\nimport backoff from 'backoff';\n\nimport Socket from './socket';\nimport {\n BadRequest,\n Forbidden,\n NotAuthorized,\n UnknownResponse,\n ConnectionError,\n // NotFound\n} from './errors';\n\nconst normalReconnectReasons = ['idle', 'done (forced)', 'pong not received', 'pong mismatch'];\nconst MERCURY_CLOSE_4000_METRIC = 'JS_SDK_MERCURY_CLOSE_4000';\n\nconst Mercury = WebexPlugin.extend({\n namespace: 'Mercury',\n lastError: undefined,\n\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 socket: 'object',\n localClusterServiceUrls: 'object',\n mercuryTimeOffset: {\n default: undefined,\n type: 'number',\n },\n backoffCall: 'object',\n _connectPromise: 'object',\n _shutdownSwitchoverBackoffCall: 'object',\n _shutdownSwitchoverId: 'string',\n // Store the resolved (pre-proxy) URL so reconnection uses a catalog-valid host\n // instead of the potentially rewritten socket.url from an interceptor.\n resolvedWebSocketUrl: 'string',\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 * @returns {void}\n */\n _attachSocketEventListeners(socket) {\n socket.on('close', (event) => this._onclose(event, socket));\n socket.on('message', (...args) => this._onmessage(...args));\n socket.on('pong', (...args) => this._setTimeOffset(...args));\n socket.on('sequence-mismatch', (...args) => this._emit('sequence-mismatch', ...args));\n socket.on('ping-pong-latency', (...args) => this._emit('ping-pong-latency', ...args));\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 * @returns {void}\n */\n _handleImminentShutdown() {\n const oldSocket = this.socket;\n\n try {\n if (this._shutdownSwitchoverBackoffCall) {\n this.logger.info(`${this.namespace}: [shutdown] switchover already in progress`);\n\n return;\n }\n this._shutdownSwitchoverId = `${Date.now()}`;\n this.logger.info(\n `${this.namespace}: [shutdown] switchover start, id=${this._shutdownSwitchoverId}`\n );\n\n this._connectWithBackoff(undefined, {\n isShutdownSwitchover: true,\n attemptOptions: {\n isShutdownSwitchover: true,\n onSuccess: (newSocket, webSocketUrl) => {\n this.logger.info(\n `${this.namespace}: [shutdown] switchover connected, url: ${webSocketUrl}`\n );\n\n // Atomically switch active socket reference\n this.socket = newSocket;\n this.connected = true; // remain connected throughout\n\n this._emit('event:mercury_shutdown_switchover_complete', {url: webSocketUrl});\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(`${this.namespace}: [shutdown] switchover completed successfully`);\n })\n .catch((err) => {\n this.logger.info(\n `${this.namespace}: [shutdown] switchover exhausted retries; will fall back to normal reconnection`,\n err\n );\n this._emit('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(`${this.namespace}: [shutdown] error during switchover`, e);\n this._shutdownSwitchoverBackoffCall = undefined;\n this._emit('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 the underlying WebSocket.\n * @returns {any} The socket instance, or undefined if not connected.\n */\n getSocket() {\n return this.socket;\n },\n\n connect(webSocketUrl) {\n if (this.connected) {\n this.logger.info(`${this.namespace}: already connected, will not connect again`);\n\n return Promise.resolve();\n }\n\n // If already connecting, return the existing promise so callers can await it\n if (this._connectPromise) {\n this.logger.info(\n `${this.namespace}: connection already in progress, returning existing promise`\n );\n\n return this._connectPromise;\n }\n\n this.connecting = true;\n\n this.logger.info(`${this.namespace}: starting connection attempt`);\n\n this._connectPromise = Promise.resolve(\n this.webex.internal.device.registered || this.webex.internal.device.register()\n )\n .then(() => {\n this.logger.info(`${this.namespace}: connecting`);\n\n return this._connectWithBackoff(webSocketUrl);\n })\n .finally(() => {\n this._connectPromise = null;\n });\n\n return this._connectPromise;\n },\n\n disconnect(options) {\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 if (this.backoffCall) {\n this.logger.info(`${this.namespace}: aborting connection`);\n this.backoffCall.abort();\n }\n\n if (this._shutdownSwitchoverBackoffCall) {\n this.logger.info(`${this.namespace}: aborting shutdown switchover`);\n this._shutdownSwitchoverBackoffCall.abort();\n }\n\n if (this.socket) {\n this.socket.removeAllListeners('message');\n this.once('offline', resolve);\n this.socket.close(options || undefined);\n\n return;\n }\n\n resolve();\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\n delete webSocketUrl.search;\n\n return url.format(webSocketUrl);\n });\n },\n\n _attemptConnection(socketUrl, callback, options = {}) {\n const {isShutdownSwitchover = false, onSuccess = null} = options;\n\n const socket = new Socket();\n let newWSUrl;\n\n this._attachSocketEventListeners(socket);\n\n // Check appropriate backoff call based on connection type\n if (isShutdownSwitchover && !this._shutdownSwitchoverBackoffCall) {\n const msg = `${this.namespace}: prevent socket open when switchover backoff call no longer defined`;\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 if (!isShutdownSwitchover && !this.backoffCall) {\n const msg = `${this.namespace}: prevent socket open when backoffCall no longer defined`;\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 // eslint-disable-next-line no-unreachable\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.socket = socket;\n }\n\n return this._prepareAndOpenSocket(socket, socketUrl, isShutdownSwitchover)\n .then((webSocketUrl) => {\n newWSUrl = webSocketUrl;\n this.logger.info(\n `${this.namespace}: ${\n isShutdownSwitchover ? '[shutdown] switchover' : ''\n } connected to mercury, success, action: connected, 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(`${this.namespace}: [shutdown] switchover attempt failed`, reason);\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 // 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 && this.backoffCall && this.backoffCall?.getNumRetries() > 0) {\n this._emit('connection_failed', reason, {retries: this.backoffCall?.getNumRetries()});\n }\n this.logger.info(\n `${this.namespace}: connection attempt failed`,\n reason,\n this.backoffCall?.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, 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(`${this.namespace}: received authorization error, reauthorizing`);\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(`${this.namespace}: received unrecoverable response from mercury`);\n this.backoffCall.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, 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 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 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(`${this.namespace}: failed to handle connection failure`, reason);\n callback(reason);\n });\n },\n\n _prepareAndOpenSocket(socket, socketUrl, 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 this.logger.info(`${this.namespace}: ${logPrefix} url: ${webSocketUrl}`);\n\n // Store the resolved URL before socket.open(), which may be rewritten by\n // an interceptor (e.g. same-site websocket proxy). On reconnection we need\n // the original catalog-valid URL, not the post-proxy one from socket.url.\n if (!isShutdownSwitchover) {\n this.resolvedWebSocketUrl = webSocketUrl;\n }\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, context = {}) {\n const {isShutdownSwitchover = false, attemptOptions = {}} = context;\n\n return new Promise((resolve, reject) => {\n // eslint gets confused about whether or not call is actually used\n // eslint-disable-next-line prefer-const\n let call;\n const onComplete = (err) => {\n // Clear state flags based on connection type\n if (isShutdownSwitchover) {\n this._shutdownSwitchoverBackoffCall = undefined;\n } else {\n this.connecting = false;\n this.backoffCall = undefined;\n }\n\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\n return reject(err);\n }\n\n // Default success handling for normal connections\n if (!isShutdownSwitchover) {\n this.connected = true;\n this.hasEverConnected = true;\n this._emit('online');\n this.webex.internal.newMetrics.callDiagnosticMetrics.setMercuryConnectedStatus(true);\n }\n\n return resolve();\n };\n\n // eslint-disable-next-line prefer-reflect\n call = backoff.call((callback) => {\n const attemptNum = call.getNumRetries();\n const logPrefix = isShutdownSwitchover ? '[shutdown] switchover' : 'connection';\n\n this.logger.info(`${this.namespace}: executing ${logPrefix} attempt ${attemptNum}`);\n this._attemptConnection(webSocketUrl, callback, attemptOptions);\n }, onComplete);\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 call.on('abort', () => {\n const msg = isShutdownSwitchover ? 'Shutdown Switchover' : 'Connection';\n\n this.logger.info(`${this.namespace}: ${msg} aborted`);\n reject(new Error(`Mercury ${msg} Aborted`));\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 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`\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`);\n });\n\n // Store backoff call reference BEFORE starting (so it's available in _attemptConnection)\n if (isShutdownSwitchover) {\n this._shutdownSwitchoverBackoffCall = call;\n } else {\n this.backoffCall = call;\n }\n\n call.start();\n });\n },\n\n _emit(...args) {\n try {\n this.trigger(...args);\n } catch (error) {\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\n const [namespace, name] = eventType.split('.');\n const handlers = [];\n\n if (!this.webex[namespace] && !this.webex.internal[namespace]) {\n return handlers;\n }\n\n const handlerName = camelCase(`process_${name}_event`);\n\n if ((this.webex[namespace] || this.webex.internal[namespace])[handlerName]) {\n handlers.push({\n name: handlerName,\n namespace,\n });\n }\n\n return handlers;\n },\n\n _submitMercuryClose4000Metric(event, options) {\n const {action, isActiveSocket, messageType} = options;\n\n try {\n this.webex.internal.metrics.submitClientMetrics(MERCURY_CLOSE_4000_METRIC, {\n fields: {\n action,\n close_code: event.code,\n close_reason: event.reason || '',\n is_active_socket: isActiveSocket,\n message_type: messageType,\n },\n tags: {\n action,\n message_type: messageType,\n },\n });\n } catch (error) {\n this.logger.warn(`${this.namespace}: failed to submit Mercury 4000 close metric`, error);\n }\n },\n\n _onclose(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 isActiveSocket = sourceSocket === this.socket;\n const reason = event.reason && event.reason.toLowerCase();\n\n // Use the stored resolved URL for reconnection instead of sourceSocket.url,\n // which may have been rewritten by an interceptor to a non-catalog host.\n const socketUrl = this.resolvedWebSocketUrl || (sourceSocket && sourceSocket.url);\n\n if (isActiveSocket) {\n // Only tear down state if the currently active socket closed\n if (this.socket) {\n this.socket.removeAllListeners();\n }\n this.unset('socket');\n this.connected = false;\n this._emit('offline', event);\n this.webex.internal.newMetrics.callDiagnosticMetrics.setMercuryConnectedStatus(false);\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}`\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; will not reconnect: ${event.reason}`\n );\n if (isActiveSocket) this._emit('offline.permanent', event);\n break;\n case 4000:\n // metric: disconnect, check reason\n if (reason === 'replaced') {\n this._submitMercuryClose4000Metric(event, {\n action: 'no_action',\n isActiveSocket,\n messageType: 'replaced',\n });\n this.logger.info(`${this.namespace}: socket replaced; will not reconnect`);\n if (isActiveSocket) this._emit('offline.replaced', event);\n } else {\n this._submitMercuryClose4000Metric(event, {\n action: isActiveSocket ? 'reconnect' : 'ignore_non_active',\n isActiveSocket,\n messageType: 'other',\n });\n this.logger.info(\n `${this.namespace}: socket disconnected with 4000: ${event.reason}; reconnecting`\n );\n if (isActiveSocket) {\n this._emit('offline.transient', event);\n this._reconnect(socketUrl);\n }\n }\n break;\n case 4001:\n // replaced during shutdown\n if (isActiveSocket) {\n // Server closed active socket with 4001, meaning it expected this connection\n // to be replaced, but the switchover in _handleImminentShutdown failed.\n // This is a permanent failure - do not reconnect.\n this.logger.warn(\n `${this.namespace}: active socket closed with 4001; shutdown switchover failed`\n );\n this._emit('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`\n );\n this._emit('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 disconnected; reconnecting`);\n if (isActiveSocket) {\n this._emit('offline.transient', event);\n this.logger.info(`${this.namespace}: [shutdown] reconnecting active socket to recover`);\n this._reconnect(socketUrl);\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 disconnected; reconnecting`);\n if (isActiveSocket) {\n this._emit('offline.transient', event);\n this.logger.info(`${this.namespace}: [shutdown] reconnecting due to normal close`);\n this._reconnect(socketUrl);\n }\n // metric: disconnect\n // if (reason === done forced) metric: force closure\n } else {\n this.logger.info(\n `${this.namespace}: socket disconnected; will not reconnect: ${event.reason}`\n );\n if (isActiveSocket) this._emit('offline.permanent', event);\n }\n break;\n default:\n this.logger.info(\n `${this.namespace}: socket disconnected unexpectedly; will not reconnect`\n );\n // unexpected disconnect\n if (isActiveSocket) this._emit('offline.permanent', event);\n }\n } catch (error) {\n this.logger.error(`${this.namespace}: error occurred in close handler`, error);\n }\n },\n\n _onmessage(event) {\n this._setTimeOffset(event);\n const envelope = event.data;\n\n if (process.env.ENABLE_MERCURY_LOGGING) {\n this.logger.debug(`${this.namespace}: message envelope: `, envelope);\n }\n\n // Handle shutdown message shape: { type: 'shutdown' }\n if (envelope && envelope.type === 'shutdown') {\n this.logger.info(`${this.namespace}: [shutdown] imminent shutdown message received`);\n this._emit('event:mercury_shutdown_imminent', envelope);\n\n this._handleImminentShutdown();\n\n return Promise.resolve();\n }\n\n const {data} = envelope;\n\n if (!data || !data.eventType) {\n this._emit('event', envelope);\n\n return Promise.resolve();\n }\n\n this._applyOverrides(data);\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}`,\n reason\n )\n );\n }),\n Promise.resolve()\n )\n .then(() => {\n this._emit('event', event.data);\n const [namespace] = data.eventType ? data.eventType.split('.') : [];\n\n if (namespace === data.eventType) {\n this._emit(`event:${namespace}`, envelope);\n } else {\n this._emit(`event:${namespace}`, envelope);\n this._emit(`event:${data.eventType}`, envelope);\n }\n })\n .catch((reason) => {\n this.logger.error(`${this.namespace}: error occurred processing socket message`, reason);\n });\n },\n\n _setTimeOffset(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) {\n this.logger.info(`${this.namespace}: reconnecting`);\n\n return this.connect(webSocketUrl);\n },\n});\n\nexport default Mercury;\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -29,8 +29,8 @@
|
|
|
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.12.0-llmrefactor.
|
|
33
|
-
"@webex/test-helper-mocha": "3.12.0-llmrefactor.
|
|
32
|
+
"@webex/test-helper-chai": "3.12.0-llmrefactor.2",
|
|
33
|
+
"@webex/test-helper-mocha": "3.12.0-llmrefactor.2",
|
|
34
34
|
"@webex/test-helper-mock-webex": "3.12.0-llmrefactor.1",
|
|
35
35
|
"@webex/test-helper-test-users": "3.12.0-llmrefactor.1",
|
|
36
36
|
"eslint": "^8.24.0",
|
|
@@ -38,18 +38,18 @@
|
|
|
38
38
|
"sinon": "^9.2.4"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@webex/common": "3.12.0-llmrefactor.
|
|
42
|
-
"@webex/common-timers": "3.12.0-llmrefactor.
|
|
43
|
-
"@webex/internal-plugin-device": "3.12.0-llmrefactor.
|
|
44
|
-
"@webex/internal-plugin-feature": "3.12.0-llmrefactor.
|
|
45
|
-
"@webex/internal-plugin-metrics": "3.12.0-llmrefactor.
|
|
46
|
-
"@webex/test-helper-chai": "3.12.0-llmrefactor.
|
|
47
|
-
"@webex/test-helper-mocha": "3.12.0-llmrefactor.
|
|
48
|
-
"@webex/test-helper-mock-web-socket": "3.12.0-llmrefactor.
|
|
41
|
+
"@webex/common": "3.12.0-llmrefactor.2",
|
|
42
|
+
"@webex/common-timers": "3.12.0-llmrefactor.2",
|
|
43
|
+
"@webex/internal-plugin-device": "3.12.0-llmrefactor.2",
|
|
44
|
+
"@webex/internal-plugin-feature": "3.12.0-llmrefactor.2",
|
|
45
|
+
"@webex/internal-plugin-metrics": "3.12.0-llmrefactor.2",
|
|
46
|
+
"@webex/test-helper-chai": "3.12.0-llmrefactor.2",
|
|
47
|
+
"@webex/test-helper-mocha": "3.12.0-llmrefactor.2",
|
|
48
|
+
"@webex/test-helper-mock-web-socket": "3.12.0-llmrefactor.2",
|
|
49
49
|
"@webex/test-helper-mock-webex": "3.12.0-llmrefactor.1",
|
|
50
50
|
"@webex/test-helper-refresh-callback": "3.12.0-llmrefactor.1",
|
|
51
51
|
"@webex/test-helper-test-users": "3.12.0-llmrefactor.1",
|
|
52
|
-
"@webex/webex-core": "3.12.0-llmrefactor.
|
|
52
|
+
"@webex/webex-core": "3.12.0-llmrefactor.2",
|
|
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-llmrefactor.
|
|
67
|
+
"version": "3.12.0-llmrefactor.3"
|
|
68
68
|
}
|
package/src/mercury.js
CHANGED
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
} from './errors';
|
|
22
22
|
|
|
23
23
|
const normalReconnectReasons = ['idle', 'done (forced)', 'pong not received', 'pong mismatch'];
|
|
24
|
+
const MERCURY_CLOSE_4000_METRIC = 'JS_SDK_MERCURY_CLOSE_4000';
|
|
24
25
|
|
|
25
26
|
const Mercury = WebexPlugin.extend({
|
|
26
27
|
namespace: 'Mercury',
|
|
@@ -703,6 +704,28 @@ const Mercury = WebexPlugin.extend({
|
|
|
703
704
|
return handlers;
|
|
704
705
|
},
|
|
705
706
|
|
|
707
|
+
_submitMercuryClose4000Metric(event, options) {
|
|
708
|
+
const {action, isActiveSocket, messageType} = options;
|
|
709
|
+
|
|
710
|
+
try {
|
|
711
|
+
this.webex.internal.metrics.submitClientMetrics(MERCURY_CLOSE_4000_METRIC, {
|
|
712
|
+
fields: {
|
|
713
|
+
action,
|
|
714
|
+
close_code: event.code,
|
|
715
|
+
close_reason: event.reason || '',
|
|
716
|
+
is_active_socket: isActiveSocket,
|
|
717
|
+
message_type: messageType,
|
|
718
|
+
},
|
|
719
|
+
tags: {
|
|
720
|
+
action,
|
|
721
|
+
message_type: messageType,
|
|
722
|
+
},
|
|
723
|
+
});
|
|
724
|
+
} catch (error) {
|
|
725
|
+
this.logger.warn(`${this.namespace}: failed to submit Mercury 4000 close metric`, error);
|
|
726
|
+
}
|
|
727
|
+
},
|
|
728
|
+
|
|
706
729
|
_onclose(event, sourceSocket) {
|
|
707
730
|
// I don't see any way to avoid the complexity or statement count in here.
|
|
708
731
|
/* eslint complexity: [0] */
|
|
@@ -744,10 +767,29 @@ const Mercury = WebexPlugin.extend({
|
|
|
744
767
|
if (isActiveSocket) this._emit('offline.permanent', event);
|
|
745
768
|
break;
|
|
746
769
|
case 4000:
|
|
747
|
-
// metric: disconnect
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
770
|
+
// metric: disconnect, check reason
|
|
771
|
+
if (reason === 'replaced') {
|
|
772
|
+
this._submitMercuryClose4000Metric(event, {
|
|
773
|
+
action: 'no_action',
|
|
774
|
+
isActiveSocket,
|
|
775
|
+
messageType: 'replaced',
|
|
776
|
+
});
|
|
777
|
+
this.logger.info(`${this.namespace}: socket replaced; will not reconnect`);
|
|
778
|
+
if (isActiveSocket) this._emit('offline.replaced', event);
|
|
779
|
+
} else {
|
|
780
|
+
this._submitMercuryClose4000Metric(event, {
|
|
781
|
+
action: isActiveSocket ? 'reconnect' : 'ignore_non_active',
|
|
782
|
+
isActiveSocket,
|
|
783
|
+
messageType: 'other',
|
|
784
|
+
});
|
|
785
|
+
this.logger.info(
|
|
786
|
+
`${this.namespace}: socket disconnected with 4000: ${event.reason}; reconnecting`
|
|
787
|
+
);
|
|
788
|
+
if (isActiveSocket) {
|
|
789
|
+
this._emit('offline.transient', event);
|
|
790
|
+
this._reconnect(socketUrl);
|
|
791
|
+
}
|
|
792
|
+
}
|
|
751
793
|
break;
|
|
752
794
|
case 4001:
|
|
753
795
|
// replaced during shutdown
|
|
@@ -265,8 +265,14 @@ describe('plugin-mercury', () => {
|
|
|
265
265
|
},
|
|
266
266
|
{
|
|
267
267
|
code: 4000,
|
|
268
|
+
reason: 'Replaced',
|
|
268
269
|
action: 'replace',
|
|
269
270
|
},
|
|
271
|
+
{
|
|
272
|
+
code: 4000,
|
|
273
|
+
reason: 'Unexpected close',
|
|
274
|
+
action: 'reconnect',
|
|
275
|
+
},
|
|
270
276
|
{
|
|
271
277
|
action: 'close',
|
|
272
278
|
},
|
|
@@ -316,8 +322,7 @@ describe('plugin-mercury', () => {
|
|
|
316
322
|
// Reconnection re-derives from the resolved URL
|
|
317
323
|
// captured in _prepareAndOpenSocket, not the socket's actual
|
|
318
324
|
// (possibly changed by interceptors) url.
|
|
319
|
-
expectedReconnectUrl =
|
|
320
|
-
mercury.sessionWebSocketUrls.get('mercury-default-session');
|
|
325
|
+
expectedReconnectUrl = mercury.resolvedWebSocketUrl;
|
|
321
326
|
|
|
322
327
|
mockWebSocket.emit('close', {code, reason});
|
|
323
328
|
|
|
@@ -1285,6 +1285,122 @@ describe('plugin-mercury', () => {
|
|
|
1285
1285
|
});
|
|
1286
1286
|
});
|
|
1287
1287
|
|
|
1288
|
+
describe('#_onclose() with code 4000', () => {
|
|
1289
|
+
let mockSocket, anotherSocket;
|
|
1290
|
+
|
|
1291
|
+
beforeEach(() => {
|
|
1292
|
+
mockSocket = {
|
|
1293
|
+
url: 'ws://active-socket.com',
|
|
1294
|
+
removeAllListeners: sinon.stub(),
|
|
1295
|
+
};
|
|
1296
|
+
anotherSocket = {
|
|
1297
|
+
url: 'ws://old-socket.com',
|
|
1298
|
+
removeAllListeners: sinon.stub(),
|
|
1299
|
+
};
|
|
1300
|
+
mercury.socket = mockSocket;
|
|
1301
|
+
mercury.resolvedWebSocketUrl = mockSocket.url;
|
|
1302
|
+
mercury.connected = true;
|
|
1303
|
+
sinon.stub(mercury, '_emit');
|
|
1304
|
+
sinon.stub(mercury, '_reconnect');
|
|
1305
|
+
sinon.stub(mercury, 'unset');
|
|
1306
|
+
// Reset metrics stub before each test
|
|
1307
|
+
webex.internal.metrics.submitClientMetrics.resetHistory();
|
|
1308
|
+
});
|
|
1309
|
+
|
|
1310
|
+
afterEach(() => {
|
|
1311
|
+
mercury._emit.restore();
|
|
1312
|
+
mercury._reconnect.restore();
|
|
1313
|
+
mercury.unset.restore();
|
|
1314
|
+
});
|
|
1315
|
+
|
|
1316
|
+
it('should not reconnect when active socket is replaced', () => {
|
|
1317
|
+
const closeEvent = {
|
|
1318
|
+
code: 4000,
|
|
1319
|
+
reason: 'Replaced',
|
|
1320
|
+
};
|
|
1321
|
+
|
|
1322
|
+
mercury._onclose(closeEvent, mockSocket);
|
|
1323
|
+
|
|
1324
|
+
assert.calledOnceWithExactly(
|
|
1325
|
+
webex.internal.metrics.submitClientMetrics,
|
|
1326
|
+
'JS_SDK_MERCURY_CLOSE_4000',
|
|
1327
|
+
{
|
|
1328
|
+
fields: {
|
|
1329
|
+
action: 'no_action',
|
|
1330
|
+
close_code: 4000,
|
|
1331
|
+
close_reason: 'Replaced',
|
|
1332
|
+
is_active_socket: true,
|
|
1333
|
+
message_type: 'replaced',
|
|
1334
|
+
},
|
|
1335
|
+
tags: {
|
|
1336
|
+
action: 'no_action',
|
|
1337
|
+
message_type: 'replaced',
|
|
1338
|
+
},
|
|
1339
|
+
}
|
|
1340
|
+
);
|
|
1341
|
+
assert.calledWith(mercury._emit, 'offline.replaced', closeEvent);
|
|
1342
|
+
assert.notCalled(mercury._reconnect);
|
|
1343
|
+
});
|
|
1344
|
+
|
|
1345
|
+
it('should reconnect active socket when 4000 has an unknown reason', () => {
|
|
1346
|
+
const closeEvent = {
|
|
1347
|
+
code: 4000,
|
|
1348
|
+
reason: 'Unexpected close',
|
|
1349
|
+
};
|
|
1350
|
+
|
|
1351
|
+
mercury._onclose(closeEvent, mockSocket);
|
|
1352
|
+
|
|
1353
|
+
assert.calledOnceWithExactly(
|
|
1354
|
+
webex.internal.metrics.submitClientMetrics,
|
|
1355
|
+
'JS_SDK_MERCURY_CLOSE_4000',
|
|
1356
|
+
{
|
|
1357
|
+
fields: {
|
|
1358
|
+
action: 'reconnect',
|
|
1359
|
+
close_code: 4000,
|
|
1360
|
+
close_reason: 'Unexpected close',
|
|
1361
|
+
is_active_socket: true,
|
|
1362
|
+
message_type: 'other',
|
|
1363
|
+
},
|
|
1364
|
+
tags: {
|
|
1365
|
+
action: 'reconnect',
|
|
1366
|
+
message_type: 'other',
|
|
1367
|
+
},
|
|
1368
|
+
}
|
|
1369
|
+
);
|
|
1370
|
+
assert.calledWith(mercury._emit, 'offline.transient', closeEvent);
|
|
1371
|
+
assert.calledWith(mercury._reconnect, mockSocket.url);
|
|
1372
|
+
});
|
|
1373
|
+
|
|
1374
|
+
it('should not reconnect a non-active socket with an unknown 4000 reason', () => {
|
|
1375
|
+
const closeEvent = {
|
|
1376
|
+
code: 4000,
|
|
1377
|
+
reason: 'Unexpected close',
|
|
1378
|
+
};
|
|
1379
|
+
|
|
1380
|
+
mercury._onclose(closeEvent, anotherSocket);
|
|
1381
|
+
|
|
1382
|
+
assert.calledOnceWithExactly(
|
|
1383
|
+
webex.internal.metrics.submitClientMetrics,
|
|
1384
|
+
'JS_SDK_MERCURY_CLOSE_4000',
|
|
1385
|
+
{
|
|
1386
|
+
fields: {
|
|
1387
|
+
action: 'ignore_non_active',
|
|
1388
|
+
close_code: 4000,
|
|
1389
|
+
close_reason: 'Unexpected close',
|
|
1390
|
+
is_active_socket: false,
|
|
1391
|
+
message_type: 'other',
|
|
1392
|
+
},
|
|
1393
|
+
tags: {
|
|
1394
|
+
action: 'ignore_non_active',
|
|
1395
|
+
message_type: 'other',
|
|
1396
|
+
},
|
|
1397
|
+
}
|
|
1398
|
+
);
|
|
1399
|
+
assert.notCalled(mercury._reconnect);
|
|
1400
|
+
assert.isTrue(mercury.connected);
|
|
1401
|
+
});
|
|
1402
|
+
});
|
|
1403
|
+
|
|
1288
1404
|
describe('#_onclose() with code 4001 (shutdown replacement)', () => {
|
|
1289
1405
|
let mockSocket, anotherSocket;
|
|
1290
1406
|
|