@webex/calling 3.12.0-next.39 → 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/mobius-socket/mobius-socket.js +10 -14
- package/dist/mobius-socket/mobius-socket.js.map +1 -1
- package/dist/mobius-socket/mobius-socket.test.js +17 -12
- package/dist/mobius-socket/mobius-socket.test.js.map +1 -1
- package/dist/mobius-socket/socket/constants.js +22 -1
- package/dist/mobius-socket/socket/constants.js.map +1 -1
- package/dist/module/mobius-socket/mobius-socket.js +7 -10
- package/dist/module/mobius-socket/socket/constants.js +16 -0
- package/dist/types/mobius-socket/mobius-socket.d.ts.map +1 -1
- package/dist/types/mobius-socket/socket/constants.d.ts +16 -0
- package/dist/types/mobius-socket/socket/constants.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -32,6 +32,7 @@ var _events = require("events");
|
|
|
32
32
|
var _backoff = _interopRequireDefault(require("backoff"));
|
|
33
33
|
var _socket = _interopRequireDefault(require("./socket"));
|
|
34
34
|
var _errors = require("./errors");
|
|
35
|
+
var _constants = require("./socket/constants");
|
|
35
36
|
function ownKeys(e, r) { var t = _Object$keys(e); if (_Object$getOwnPropertySymbols) { var o = _Object$getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return _Object$getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
36
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$getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
37
38
|
function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2.default)(o), (0, _possibleConstructorReturn2.default)(t, _isNativeReflectConstruct() ? _Reflect$construct(o, e || [], (0, _getPrototypeOf2.default)(t).constructor) : o.apply(t, e)); }
|
|
@@ -664,7 +665,8 @@ var MobiusSocket = /*#__PURE__*/function (_EventEmitter) {
|
|
|
664
665
|
key: "onclose",
|
|
665
666
|
value: function () {
|
|
666
667
|
var _onclose = (0, _asyncToGenerator2.default)(/*#__PURE__*/_regenerator.default.mark(function _callee(event, sourceSocket) {
|
|
667
|
-
var
|
|
668
|
+
var _this1 = this,
|
|
669
|
+
_this$socket4;
|
|
668
670
|
var loggerContext, reason, socketUrl, isActiveSocket, _t, _t2;
|
|
669
671
|
return _regenerator.default.wrap(function (_context) {
|
|
670
672
|
while (1) switch (_context.prev = _context.next) {
|
|
@@ -710,17 +712,9 @@ var MobiusSocket = /*#__PURE__*/function (_EventEmitter) {
|
|
|
710
712
|
if (isActiveSocket) this.emitEvent('offline.replaced', event);
|
|
711
713
|
return _context.abrupt("continue", 13);
|
|
712
714
|
case 4:
|
|
713
|
-
//
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
// to be replaced, but the switchover in handleImminentShutdown failed.
|
|
717
|
-
this.logger.warn("active socket closed with 4001; shutdown switchover failed", loggerContext);
|
|
718
|
-
this.emitEvent('offline.permanent', event);
|
|
719
|
-
} else {
|
|
720
|
-
// Expected: old socket closed after successful switchover
|
|
721
|
-
this.logger.info("old socket closed with 4001 (replaced during shutdown); no reconnect needed", loggerContext);
|
|
722
|
-
this.emitEvent('offline.replaced', event);
|
|
723
|
-
}
|
|
715
|
+
// Handle the same way we do for registration.down event from Mobius.
|
|
716
|
+
this.logger.info("socket closed with 4001; will not reconnect", loggerContext);
|
|
717
|
+
this.emitEvent('event:async_event', _constants.MOBIUS_SOCKET_4001_EVENT);
|
|
724
718
|
return _context.abrupt("continue", 13);
|
|
725
719
|
case 5:
|
|
726
720
|
this.logger.info("socket disconnected; ".concat(event.reason), loggerContext);
|
|
@@ -748,7 +742,9 @@ var MobiusSocket = /*#__PURE__*/function (_EventEmitter) {
|
|
|
748
742
|
case 8:
|
|
749
743
|
this.logger.error("onclose, statusCode=".concat(event.code), loggerContext);
|
|
750
744
|
_context.next = 9;
|
|
751
|
-
return this.refreshToken()
|
|
745
|
+
return this.refreshToken().catch(function (error) {
|
|
746
|
+
_this1.logger.error("".concat(MOBIUS_SOCKET_NAMESPACE, ": periodic token refresh failed"), error);
|
|
747
|
+
});
|
|
752
748
|
case 9:
|
|
753
749
|
_context.next = 10;
|
|
754
750
|
return this.reconnect((_this$socket4 = this.socket) === null || _this$socket4 === void 0 ? void 0 : _this$socket4.url);
|
|
@@ -784,7 +780,7 @@ var MobiusSocket = /*#__PURE__*/function (_EventEmitter) {
|
|
|
784
780
|
value: function onmessage(event) {
|
|
785
781
|
var loggerContext = {
|
|
786
782
|
file: 'mobius-socket.ts',
|
|
787
|
-
method: '
|
|
783
|
+
method: 'onmessage'
|
|
788
784
|
};
|
|
789
785
|
var envelope = event.data;
|
|
790
786
|
this.logger.debug("message envelope: ", envelope, loggerContext);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_events","require","_backoff","_interopRequireDefault","_socket","_errors","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","Boolean","prototype","valueOf","call","_superPropGet","p","_get2","normalReconnectReasons","MOBIUS_SOCKET_NAMESPACE","TOKEN_REFRESH_INTERVAL_MS","normalizeMobiusAuthToken","token","replace","MobiusSocket","_EventEmitter","webex","_this","config","undefined","_classCallCheck2","Error","logger","console","connected","connecting","hasEverConnected","socket","backoffCall","shutdownSwitchoverBackoffCall","seenAsyncEventIds","_map","connectPromise","tokenRefreshTimer","tokenRefreshInFlight","_inherits2","_createClass2","key","value","off","eventName","listener","removeAllListeners","attachSocketEventListeners","_this2","on","event","onclose","onmessage","trackAsyncEventAndShouldSuppressDuplicate","envelope","type","eventId","has","previousValue","get","delete","set","info","concat","log","dedupCacheMaxSize","size","oldestEventId","keys","next","handleImminentShutdown","_this3","oldSocket","connectWithBackoff","isShutdownSwitchover","attemptOptions","onSuccess","newSocket","webSocketUrl","emitEvent","url","then","catch","err","reason","error","getConnectedWebSocketUrl","_this$socket","sendWssRequest","payload","options","_typeof2","_isArray","_promise","reject","sendRequest","timeout","isConnected","connect","_this$socket2","_this$socket3","_this$webex$internal$","_this$webex$internal$2","_this4","resolve","socketUrl","Number","initialConnectionMaxRetries","internal","device","registered","register","finally","disconnect","_this5","_stringify","abort","clear","stopTokenRefreshTimer","close","prepareUrl","attemptConnection","callback","_this6","_options$isShutdownSw","_options$attemptOptio","_attemptOptions$onSuc","Socket","newWSUrl","mode","msg","prepareAndOpenSocket","backoffCallNormal","code","getNumRetries","retries","stack","UnknownResponse","_this6$webex$internal","_this6$webex$internal2","refresh","NotAuthorized","_this6$webex$credenti","_this6$webex$credenti2","credentials","force","BadRequest","Forbidden","warn","_this7","logPrefix","all","getUserToken","_ref","_ref2","_slicedToArray2","forceCloseDelay","wssResponseTimeout","toString","refreshToken","trackingId","sessionId","_now","defaultMobiusSocketOptions","customOptionsMsg","open","_this8","context","_context$isShutdownSw","_context$attemptOptio","isInitialConnect","initialRetryLimit","isInitialConnectWithoutRetries","onComplete","startTokenRefreshTimer","backoff","attemptNum","attemptLogPrefix","setStrategy","ExponentialStrategy","initialDelay","backoffTimeReset","maxDelay","backoffTimeMax","retryIf","failAfter","maxRetries","number","delay","Math","min","strategy_","nextBackoffDelay_","Infinity","callbackLogPrefix","process","env","NODE_ENV","debug","start","_len","args","Array","_key","emit","_this9","setInterval","clearInterval","_this$webex$credentia","_this$webex$credentia2","_this$webex$credentia3","_this0","tokenPromise","canRefresh","_this0$socket","refreshedToken","_onclose","_asyncToGenerator2","_regenerator","mark","_callee","sourceSocket","_this$socket4","loggerContext","isActiveSocket","_t","_t2","wrap","_context","prev","file","method","toLowerCase","abrupt","reconnect","includes","stop","_x","_x2","data","eventType","_eventType$split","split","_eventType$split2","namespace","EventEmitter","_default","exports"],"sources":["mobius-socket.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file\n */\n\nimport {EventEmitter} from 'events';\n// @ts-ignore - backoff library does not have type definitions\nimport backoff from 'backoff';\n\nimport type {WebexSDK} from '../SDKConnector/types';\nimport Socket from './socket';\nimport {BadRequest, Forbidden, NotAuthorized, UnknownResponse} from './errors';\nimport type {MobiusSocketConfig} from './config';\nimport type {SocketCloseEvent, SocketMessageEvent, SocketResponse} from './socket/types';\nimport type {\n MobiusSocketCloseOptions,\n MobiusSocketDisconnectResult,\n MobiusSocketRequestOptions,\n MobiusSocketRequestPayload,\n} from './types';\n\nconst normalReconnectReasons = ['idle', 'done (forced)'];\nconst MOBIUS_SOCKET_NAMESPACE = 'MobiusSocket';\nconst TOKEN_REFRESH_INTERVAL_MS = 1 * 60 * 60 * 1000; // 1 hour\n\ntype MobiusSocketLogger = Pick<Console, 'debug' | 'error' | 'info' | 'log' | 'warn'>;\n\n// Extended Socket type with dynamic properties\ntype ExtendedSocket = Socket & {\n connecting?: boolean;\n connected?: boolean;\n};\n\nfunction normalizeMobiusAuthToken(token: string) {\n return token.replace(/^Bearer\\s+/i, '');\n}\n\nclass MobiusSocket extends EventEmitter {\n private webex: WebexSDK;\n private config: Partial<MobiusSocketConfig>;\n private logger: MobiusSocketLogger;\n private connected: boolean;\n private connecting: boolean;\n private hasEverConnected: boolean;\n private socket: ExtendedSocket | undefined;\n private backoffCall: any; // backoff library has no types\n private shutdownSwitchoverBackoffCall: any; // backoff library has no types\n private seenAsyncEventIds: Map<string, boolean>;\n private connectPromise: Promise<void> | undefined;\n private socketUrl: string | undefined;\n private tokenRefreshTimer: NodeJS.Timeout | undefined;\n private tokenRefreshInFlight: Promise<unknown> | undefined;\n\n constructor(webex: WebexSDK, config: Partial<MobiusSocketConfig> = {}) {\n super();\n\n if (!webex) {\n throw new Error('A Webex instance is required when initializing MobiusSocket');\n }\n\n this.webex = webex;\n this.config = config;\n this.logger = (webex.logger as unknown as MobiusSocketLogger) || console;\n this.connected = false;\n this.connecting = false;\n this.hasEverConnected = false;\n this.socket = undefined;\n this.backoffCall = undefined;\n this.shutdownSwitchoverBackoffCall = undefined;\n this.seenAsyncEventIds = new Map();\n this.connectPromise = undefined;\n this.tokenRefreshTimer = undefined;\n this.tokenRefreshInFlight = undefined;\n }\n\n public off(eventName: string, listener?: (...args: unknown[]) => void) {\n if (listener) {\n return super.off(eventName, listener);\n }\n\n this.removeAllListeners(eventName);\n\n return this;\n }\n\n /**\n * Attach event listeners to a socket.\n * @param socket - The socket to attach listeners to\n */\n private attachSocketEventListeners(socket: ExtendedSocket): void {\n socket.on('close', (event: SocketCloseEvent) => this.onclose(event, socket));\n socket.on('message', (event: SocketMessageEvent<SocketResponse>) => this.onmessage(event));\n }\n\n /**\n * Tracks a newly seen async_event ID and reports whether a duplicate should be suppressed.\n * @param envelope - Parsed websocket message envelope\n * @returns True when the event has already been seen\n */\n private trackAsyncEventAndShouldSuppressDuplicate(envelope: SocketResponse): boolean {\n if (envelope?.type !== 'async_event' || !envelope.eventId) {\n return false;\n }\n\n if (this.seenAsyncEventIds.has(envelope.eventId)) {\n // Refresh recency so frequently retransmitted eventIds stay protected longer.\n // This deletion and setting again makes the data recent since javascript map maintains order as well\n const previousValue = this.seenAsyncEventIds.get(envelope.eventId) || true;\n this.seenAsyncEventIds.delete(envelope.eventId);\n this.seenAsyncEventIds.set(envelope.eventId, previousValue);\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: duplicate async_event suppressed, eventId=${envelope.eventId}`\n );\n\n return true;\n }\n\n this.logger.log(\n `${MOBIUS_SOCKET_NAMESPACE}: tracking async_event, eventId=${envelope.eventId}`\n );\n this.seenAsyncEventIds.set(envelope.eventId, true);\n\n if (\n this.config.dedupCacheMaxSize &&\n this.seenAsyncEventIds.size > this.config.dedupCacheMaxSize\n ) {\n const oldestEventId = this.seenAsyncEventIds.keys().next().value || '';\n\n this.seenAsyncEventIds.delete(oldestEventId);\n this.logger.log(\n `${MOBIUS_SOCKET_NAMESPACE}: evicted oldest async_event from dedup cache, eventId=${oldestEventId}`\n );\n }\n\n return false;\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 */\n private handleImminentShutdown() {\n const oldSocket = this.socket;\n\n try {\n if (this.shutdownSwitchoverBackoffCall) {\n this.logger.info(`${MOBIUS_SOCKET_NAMESPACE}: [shutdown] switchover already in progress`);\n\n return;\n }\n\n this.logger.info(`${MOBIUS_SOCKET_NAMESPACE}: [shutdown] switchover start`);\n\n this.connectWithBackoff(undefined, {\n isShutdownSwitchover: true,\n attemptOptions: {\n isShutdownSwitchover: true,\n onSuccess: (newSocket, webSocketUrl) => {\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: [shutdown] switchover connected, url: ${webSocketUrl}`\n );\n\n // Promote the new socket now that the switchover succeeded\n newSocket.connecting = false;\n newSocket.connected = true;\n this.socket = newSocket;\n this.connected = true;\n\n this.emitEvent('event:mobius_shutdown_switchover_complete', {\n url: webSocketUrl,\n });\n\n if (oldSocket) {\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: [shutdown] old socket retained; server will close with 4001`\n );\n }\n },\n },\n })\n .then(() => {\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: [shutdown] switchover completed successfully`\n );\n })\n .catch((err) => {\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: [shutdown] switchover exhausted retries; will fall back to normal reconnection: `,\n err\n );\n this.emitEvent('event:mobius_shutdown_switchover_failed', {reason: err});\n });\n } catch (e) {\n this.logger.error(`${MOBIUS_SOCKET_NAMESPACE}: [shutdown] error during switchover`, e);\n this.shutdownSwitchoverBackoffCall = undefined;\n this.emitEvent('event:mobius_shutdown_switchover_failed', {reason: e});\n }\n }\n\n /**\n * Get the websocket URL for the currently connected socket.\n * @returns The connected websocket URL, or undefined when not connected\n */\n public getConnectedWebSocketUrl(): string | undefined {\n if (!this.socket?.connected) {\n return undefined;\n }\n\n return this.socket.url;\n }\n\n /**\n * Sends a websocket request and resolves when the matching response arrives.\n * @param payload - The websocket request payload\n * @param options - Additional request options\n * @returns Promise that resolves with the socket response\n */\n public sendWssRequest(\n payload: MobiusSocketRequestPayload,\n options: MobiusSocketRequestOptions = {}\n ): Promise<SocketResponse> {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {\n return Promise.reject(new Error('`payload` is required'));\n }\n\n if (!this.socket || !this.socket.connected) {\n return Promise.reject(new Error('Mobius socket is not connected'));\n }\n\n return this.socket.sendRequest(payload, {timeout: options.timeout});\n }\n\n /**\n * Check if the socket is connected.\n * @returns True if connected\n */\n public isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Connect to Mobius.\n * @param webSocketUrl - Optional websocket URL override. Falls back to the device websocket URL\n * @returns Promise that resolves when connection flow completes\n */\n public connect(webSocketUrl?: string): Promise<void> {\n if (this.connectPromise) {\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: connection already in progress, returning existing promise`\n );\n\n return this.connectPromise;\n }\n\n if (this.socket?.connected || this.socket?.connecting) {\n this.logger.info(`${MOBIUS_SOCKET_NAMESPACE}: already connected, will not connect again`);\n\n return Promise.resolve();\n }\n\n // Treat a connect() call that targets a different Mobius websocket URL\n // as a fresh initial connection for retry purposes.\n if (webSocketUrl && this.socketUrl && webSocketUrl !== this.socketUrl) {\n this.hasEverConnected = false;\n }\n\n // Cache the caller-provided URL for reconnect\n if (webSocketUrl) {\n this.socketUrl = webSocketUrl;\n }\n\n this.connecting = true;\n\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: starting connection attempt${\n Number(this.config.initialConnectionMaxRetries) === 0 && !this.hasEverConnected\n ? ' (initial retries disabled)'\n : ''\n }`\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(`${MOBIUS_SOCKET_NAMESPACE}: connecting`);\n\n return this.connectWithBackoff(this.socketUrl);\n })\n .finally(() => {\n this.connectPromise = undefined;\n });\n\n this.connectPromise = connectPromise;\n\n return connectPromise;\n }\n\n /**\n * Disconnect the Mobius socket.\n * @param options - Optional websocket close options (code, reason)\n * @returns Promise that resolves after disconnect cleanup and close handling complete\n */\n public disconnect(options?: MobiusSocketCloseOptions): MobiusSocketDisconnectResult {\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}#disconnect: connecting state: ${this.connecting},\n connected state: ${this.connected}, socket exists: ${!!this.socket},\n options: ${JSON.stringify(options)}`\n );\n\n if (this.backoffCall) {\n this.logger.info(`${MOBIUS_SOCKET_NAMESPACE}: aborting connection`);\n this.backoffCall.abort();\n this.backoffCall = undefined;\n }\n\n if (this.shutdownSwitchoverBackoffCall) {\n this.logger.info(`${MOBIUS_SOCKET_NAMESPACE}: aborting shutdown switchover connection`);\n this.shutdownSwitchoverBackoffCall.abort();\n this.shutdownSwitchoverBackoffCall = undefined;\n }\n\n this.connectPromise = undefined;\n this.seenAsyncEventIds.clear();\n\n if (!this.socket) {\n this.connected = false;\n this.stopTokenRefreshTimer();\n\n return Promise.resolve();\n }\n\n this.socket.removeAllListeners('message');\n this.socket.connecting = false;\n this.socket.connected = false;\n\n return Promise.resolve(this.socket.close(options || undefined)).finally(() => {\n this.connected = false;\n this.stopTokenRefreshTimer();\n });\n }\n\n private prepareUrl(webSocketUrl: string | undefined): Promise<string> {\n if (!webSocketUrl) {\n // TODO: Circle back to this logic when mobius implements the shutdown switchover\n webSocketUrl = this.webex.internal.device.webSocketUrl || '';\n }\n\n return Promise.resolve(webSocketUrl);\n }\n\n private attemptConnection(\n socketUrl: string | undefined,\n callback: (err?: Error) => void,\n options: {\n isShutdownSwitchover?: boolean;\n attemptOptions?: {\n isShutdownSwitchover?: boolean;\n onSuccess?: ((socket: ExtendedSocket, url: string) => void) | null;\n };\n } = {}\n ): Promise<void | Error> {\n const {isShutdownSwitchover = false, attemptOptions = {}} = options;\n const {onSuccess = null} = attemptOptions;\n\n const socket = new Socket() as ExtendedSocket;\n socket.connecting = true;\n let newWSUrl: string | undefined;\n\n this.attachSocketEventListeners(socket);\n\n const backoffCall = isShutdownSwitchover\n ? this.shutdownSwitchoverBackoffCall\n : this.backoffCall;\n\n // Check appropriate backoff call based on connection type\n if (!backoffCall) {\n const mode = isShutdownSwitchover ? 'switchover backoff call' : 'backoffCall';\n const msg = `${MOBIUS_SOCKET_NAMESPACE}: prevent socket open when ${mode} no longer defined`;\n const err = new Error(msg);\n\n this.logger.info(msg);\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.socket = socket;\n }\n\n return this.prepareAndOpenSocket(socket, socketUrl, isShutdownSwitchover)\n .then((webSocketUrl) => {\n newWSUrl = webSocketUrl;\n\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: ${\n isShutdownSwitchover ? '[shutdown] switchover' : ''\n } connected to mobius socket, success, 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 Promise.resolve();\n })\n .catch((reason) => {\n // For shutdown, simpler error handling - just callback for retry\n if (isShutdownSwitchover) {\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: [shutdown] switchover attempt failed`,\n reason\n );\n\n return callback(reason as Error);\n }\n\n // Normal connection error handling\n const backoffCallNormal = this.backoffCall;\n // Suppress connection errors that appear to be network related (code 1006).\n if (reason.code !== 1006 && backoffCallNormal && backoffCallNormal?.getNumRetries() > 0) {\n this.emitEvent('connection_failed', reason, {\n retries: backoffCallNormal?.getNumRetries(),\n });\n }\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: connection attempt failed`,\n reason,\n backoffCallNormal?.getNumRetries() === 0 ? reason.stack : ''\n );\n\n // UnknownResponse is produced by IE for any 4XXX; treat 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 `${MOBIUS_SOCKET_NAMESPACE}: received unknown response code, refreshing device registration`\n );\n\n return this.webex.internal.device\n .refresh?.()\n .then(() => callback(reason as unknown as Error));\n }\n // NotAuthorized implies expired token\n if (reason instanceof NotAuthorized) {\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: received authorization error, reauthorizing`\n );\n\n return this.webex.credentials\n .refresh?.({force: true})\n .then(() => callback(reason as unknown as Error));\n }\n if (reason instanceof BadRequest || reason instanceof Forbidden) {\n this.logger.warn(\n `${MOBIUS_SOCKET_NAMESPACE}: received unrecoverable response from ${MOBIUS_SOCKET_NAMESPACE}`\n );\n backoffCallNormal?.abort();\n\n return callback(reason as unknown as Error);\n }\n\n return callback(reason as unknown as Error);\n })\n .catch((reason) => {\n this.logger.error(\n `${MOBIUS_SOCKET_NAMESPACE}: failed to handle connection failure`,\n reason\n );\n callback(reason);\n });\n }\n\n private prepareAndOpenSocket(\n socket: ExtendedSocket,\n socketUrl: string | undefined,\n isShutdownSwitchover = false\n ): Promise<string> {\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: any = {\n forceCloseDelay: this.config.forceCloseDelay,\n wssResponseTimeout: this.config.wssResponseTimeout,\n token: normalizeMobiusAuthToken(token.toString()),\n refreshToken: () => this.refreshToken(),\n trackingId: `${this.webex.sessionId}_${Date.now()}`,\n logger: this.logger,\n };\n\n if (this.webex.config.defaultMobiusSocketOptions) {\n const customOptionsMsg = isShutdownSwitchover\n ? 'setting custom options for switchover'\n : 'setting custom options';\n\n this.logger.info(`${MOBIUS_SOCKET_NAMESPACE}: ${customOptionsMsg}`);\n options = {...options, ...this.webex.config.defaultMobiusSocketOptions};\n }\n\n // Only promote the socket reference for normal connections.\n // Shutdown switchover keeps the old socket active until the new one succeeds.\n if (!isShutdownSwitchover) {\n this.socket = socket;\n }\n\n this.logger.info(`${MOBIUS_SOCKET_NAMESPACE} ${logPrefix} url: ${webSocketUrl}`);\n\n return socket.open(webSocketUrl, options).then(() => webSocketUrl);\n }\n );\n }\n\n private connectWithBackoff(\n webSocketUrl: string | undefined,\n // TODO: type for context can be moved out, it's repeated\n context: {\n isShutdownSwitchover?: boolean;\n attemptOptions?: {\n isShutdownSwitchover?: boolean;\n onSuccess?: ((socket: ExtendedSocket, url: string) => void) | null;\n };\n } = {}\n ): Promise<void> {\n const {isShutdownSwitchover = false, attemptOptions = {}} = context;\n\n return new Promise((resolve, reject) => {\n let call: any;\n const isInitialConnect = !isShutdownSwitchover && !this.hasEverConnected;\n const initialRetryLimit =\n this.config.initialConnectionMaxRetries == null\n ? null\n : Number(this.config.initialConnectionMaxRetries);\n const isInitialConnectWithoutRetries = isInitialConnect && initialRetryLimit === 0;\n\n const onComplete = (err?: Error) => {\n if (isShutdownSwitchover) {\n this.shutdownSwitchoverBackoffCall = undefined;\n } else {\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(`${MOBIUS_SOCKET_NAMESPACE}: ${msg}; ${err}`);\n // Only mutate socket flags for normal connections.\n // During shutdown switchover, this.socket is the old live socket — don't touch it.\n if (!isShutdownSwitchover && this.socket) {\n this.socket.connecting = false;\n this.socket.connected = false;\n }\n\n return reject(err);\n }\n\n // For normal connections, mark the socket as connected.\n // Shutdown switchover promotion is handled by the onSuccess callback.\n if (!isShutdownSwitchover && this.socket) {\n this.socket.connecting = false;\n this.socket.connected = true;\n }\n\n if (!isShutdownSwitchover) {\n this.connecting = false;\n this.connected = true;\n this.hasEverConnected = true;\n this.startTokenRefreshTimer();\n this.emitEvent('online');\n }\n\n return resolve();\n };\n // eslint-disable-next-line prefer-reflect\n call = backoff.call(\n (callback: (err?: Error) => void) => {\n const attemptNum = call.getNumRetries();\n const attemptLogPrefix = isShutdownSwitchover ? '[shutdown] switchover' : 'connection';\n\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: executing ${attemptLogPrefix} attempt ${attemptNum}`\n );\n this.attemptConnection(webSocketUrl, callback, attemptOptions);\n },\n (err?: Error) => onComplete(err)\n );\n\n call.setStrategy(\n new backoff.ExponentialStrategy({\n initialDelay: this.config.backoffTimeReset,\n maxDelay: this.config.backoffTimeMax,\n })\n );\n\n if (isInitialConnectWithoutRetries) {\n call.retryIf(() => false);\n } else if (isInitialConnect && initialRetryLimit !== null && initialRetryLimit > 0) {\n call.failAfter(initialRetryLimit);\n } else if (this.config.maxRetries) {\n call.failAfter(this.config.maxRetries);\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.on('abort', () => {\n const msg = isShutdownSwitchover ? 'Shutdown Switchover' : 'Connection';\n\n this.logger.info(`${MOBIUS_SOCKET_NAMESPACE}: ${msg} aborted`);\n reject(new Error(`MobiusSocket ${msg} Aborted`));\n });\n\n call.on('callback', (err?: Error) => {\n if (err) {\n if (isInitialConnectWithoutRetries) {\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: initial connect failed; retries already disabled`\n );\n\n return;\n }\n\n const number = call.getNumRetries();\n const delay = Math.min(\n call.strategy_.nextBackoffDelay_,\n this.config.backoffTimeMax || Infinity\n );\n\n const callbackLogPrefix = isShutdownSwitchover ? '[shutdown] switchover' : '';\n\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: ${callbackLogPrefix} 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(`${MOBIUS_SOCKET_NAMESPACE}: `, err, err.stack);\n }\n\n return;\n }\n this.logger.info(`${MOBIUS_SOCKET_NAMESPACE}: connected`);\n });\n\n call.start();\n });\n }\n\n /**\n * Safely emits an event, catching and logging any errors from event handlers.\n * @param eventName - The name of the event to emit\n * @param args - Arguments to pass to event handlers\n */\n private emitEvent(eventName: string, ...args: unknown[]): void {\n try {\n if (!eventName) {\n return;\n }\n\n this.emit(eventName, ...args);\n } catch (error) {\n // Safely handle errors without causing additional issues during cleanup\n this.logger.error(\n `${MOBIUS_SOCKET_NAMESPACE}: error occurred in event handler:`,\n error,\n ' with args: ',\n [eventName, ...args]\n );\n }\n }\n\n /**\n * Starts a periodic timer to refresh the authentication token.\n * Token refresh occurs every hour while connected.\n */\n private startTokenRefreshTimer() {\n if (this.tokenRefreshTimer || !this.connected) {\n return;\n }\n\n this.tokenRefreshTimer = setInterval(() => {\n this.refreshToken().catch((error) => {\n this.logger.error(`${MOBIUS_SOCKET_NAMESPACE}: periodic token refresh failed`, error);\n });\n }, TOKEN_REFRESH_INTERVAL_MS);\n }\n\n /**\n * Stops the periodic token refresh timer.\n */\n private stopTokenRefreshTimer() {\n if (!this.tokenRefreshTimer) {\n return;\n }\n\n clearInterval(this.tokenRefreshTimer);\n this.tokenRefreshTimer = undefined;\n }\n\n /**\n * Refreshes the authentication token and re-authenticates the socket connection.\n * @returns Promise that resolves when token refresh and re-authentication complete\n */\n private refreshToken(): Promise<unknown> {\n if (this.tokenRefreshInFlight) {\n return this.tokenRefreshInFlight;\n }\n\n if (!this.connected) {\n this.stopTokenRefreshTimer();\n\n return Promise.resolve();\n }\n\n const tokenPromise = this.webex.credentials.canRefresh\n ? this.webex.credentials\n .refresh?.({force: true})\n ?.then(() => this.webex.credentials.getUserToken())\n : this.webex.credentials.getUserToken();\n\n this.tokenRefreshInFlight = tokenPromise!\n .then((token) => {\n if (!token) {\n throw new Error('Mobius token refresh did not return a token');\n }\n const refreshedToken = normalizeMobiusAuthToken(token.toString());\n\n if (!this.socket?.connected) {\n this.logger.warn(\n `${MOBIUS_SOCKET_NAMESPACE}: socket is not connected, skipping token refresh`\n );\n\n return undefined;\n }\n\n return this.socket!.refresh(refreshedToken);\n })\n .catch((error) => {\n this.logger.error(\n `${MOBIUS_SOCKET_NAMESPACE}: failed to refresh/re-auth Mobius socket`,\n error\n );\n\n throw error;\n })\n .finally(() => {\n this.tokenRefreshInFlight = undefined;\n });\n\n return this.tokenRefreshInFlight;\n }\n\n private async onclose(event: SocketCloseEvent, sourceSocket: ExtendedSocket): Promise<void> {\n const loggerContext = {\n file: 'mobius-socket.ts',\n method: 'onclose',\n };\n\n try {\n const reason = event.reason && event.reason.toLowerCase();\n let socketUrl: string | undefined;\n\n const isActiveSocket = sourceSocket === this.socket;\n if (sourceSocket) {\n socketUrl = sourceSocket.url;\n }\n\n // Only tear down state if the currently active socket closed\n if (isActiveSocket) {\n if (this.socket) {\n this.socket.removeAllListeners();\n this.socket = undefined;\n this.emitEvent('offline', event);\n }\n this.connecting = false;\n this.connected = false;\n this.stopTokenRefreshTimer();\n } else {\n // Old socket closed; do not flip connection state\n this.logger.info(`[shutdown] non-active socket closed, code=${event.code}`, loggerContext);\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 this.logger.info(\n `service rejected last message; will not reconnect: ${event.reason}`,\n loggerContext\n );\n if (isActiveSocket) this.emitEvent('offline.permanent', event);\n break;\n case 4000:\n this.logger.info(`socket replaced; will not reconnect`, loggerContext);\n if (isActiveSocket) this.emitEvent('offline.replaced', event);\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.logger.warn(\n `active socket closed with 4001; shutdown switchover failed`,\n loggerContext\n );\n this.emitEvent('offline.permanent', event);\n } else {\n // Expected: old socket closed after successful switchover\n this.logger.info(\n `old socket closed with 4001 (replaced during shutdown); no reconnect needed`,\n loggerContext\n );\n this.emitEvent('offline.replaced', event);\n }\n break;\n case 1000:\n case 1001:\n this.logger.info(`socket disconnected; ${event.reason}`, loggerContext);\n if (isActiveSocket) this.emitEvent('offline.permanent', event);\n break;\n case 1005:\n case 1006:\n case 1011:\n case 1012:\n this.logger.info(`socket disconnected; reconnecting`, loggerContext);\n if (isActiveSocket) {\n this.emitEvent('offline.transient', event);\n this.reconnect(socketUrl);\n }\n break;\n case 3050:\n if (reason && normalReconnectReasons.includes(reason)) {\n this.logger.info(`socket disconnected; reconnecting`, loggerContext);\n if (isActiveSocket) {\n this.emitEvent('offline.transient', event);\n this.reconnect(socketUrl);\n }\n } else {\n this.logger.info(\n `socket disconnected; will not reconnect: ${event.reason}`,\n loggerContext\n );\n if (isActiveSocket) this.emitEvent('offline.permanent', event);\n }\n break;\n case 4401:\n case 4403:\n case 4404:\n this.logger.error(`onclose, statusCode=${event.code}`, loggerContext);\n await this.refreshToken();\n await this.reconnect(this.socket?.url);\n break;\n case 4429:\n // Silently ignore too many requests\n this.logger.error(`too many requests, statusCode=${event.code}`, loggerContext);\n break;\n default:\n this.logger.info(`socket disconnected unexpectedly; will not reconnect`, loggerContext);\n if (isActiveSocket) this.emitEvent('offline.permanent', event);\n }\n } catch (error) {\n this.logger.error(`error occurred in close handler`, error, loggerContext);\n }\n }\n\n private onmessage(event: SocketMessageEvent<SocketResponse>): Promise<void> {\n const loggerContext = {\n file: 'mobius-socket.ts',\n method: 'onclose',\n };\n\n const envelope = event.data;\n\n this.logger.debug(`message envelope: `, envelope, loggerContext);\n\n // Handle shutdown message shape: { type: 'shutdown' }\n if (envelope && envelope.type === 'shutdown') {\n this.logger.info(`[shutdown] imminent shutdown message received`, loggerContext);\n this.emitEvent('event:mobius_shutdown_imminent', envelope); // This is not yet not implemented, keeping for future support\n\n this.handleImminentShutdown();\n\n return Promise.resolve();\n }\n\n if (this.trackAsyncEventAndShouldSuppressDuplicate(envelope)) {\n return Promise.resolve();\n }\n\n // Emit event:<type> for typed messages (e.g., register.response)\n if (envelope.type) {\n this.emitEvent(`event:${envelope.type}`, envelope);\n }\n\n // Use data/payload if present, otherwise treat the envelope itself as the data (flat format)\n const data: SocketResponse = (envelope.data as SocketResponse) || envelope;\n\n // Support both Mobius-enveloped (data.eventType) and flat (eventType) formats\n const eventType: string | undefined =\n (data?.eventType as string) || (envelope.eventType as string);\n\n if (!eventType) {\n this.emitEvent('event', envelope);\n\n return Promise.resolve();\n }\n\n try {\n // TODO: Remove if event:namespace is not required\n this.emitEvent('event', envelope);\n const [namespace] = eventType.split('.');\n this.emitEvent(`event:${namespace}`, envelope);\n\n if (namespace !== eventType) {\n this.emitEvent(`event:${eventType}`, envelope);\n }\n } catch (reason) {\n this.logger.error(`error occurred processing socket message`, reason, loggerContext);\n }\n\n return Promise.resolve();\n }\n\n private reconnect(webSocketUrl: string | undefined): Promise<void> {\n this.logger.info(`reconnecting`, {file: 'mobius-socket.ts', method: 'reconnect'});\n\n return this.connect(webSocketUrl || this.socketUrl);\n }\n}\n\nexport default MobiusSocket;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAAA,OAAA,GAAAC,OAAA;AAEA,IAAAC,QAAA,GAAAC,sBAAA,CAAAF,OAAA;AAGA,IAAAG,OAAA,GAAAD,sBAAA,CAAAF,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AAA+E,SAAAK,QAAAC,CAAA,EAAAC,CAAA,QAAAC,CAAA,GAAAC,YAAA,CAAAH,CAAA,OAAAI,6BAAA,QAAAC,CAAA,GAAAD,6BAAA,CAAAJ,CAAA,GAAAC,CAAA,KAAAI,CAAA,GAAAA,CAAA,CAAAC,MAAA,WAAAL,CAAA,WAAAM,gCAAA,CAAAP,CAAA,EAAAC,CAAA,EAAAO,UAAA,OAAAN,CAAA,CAAAO,IAAA,CAAAC,KAAA,CAAAR,CAAA,EAAAG,CAAA,YAAAH,CAAA;AAAA,SAAAS,cAAAX,CAAA,aAAAC,CAAA,MAAAA,CAAA,GAAAW,SAAA,CAAAC,MAAA,EAAAZ,CAAA,UAAAC,CAAA,WAAAU,SAAA,CAAAX,CAAA,IAAAW,SAAA,CAAAX,CAAA,QAAAA,CAAA,OAAAF,OAAA,CAAAe,MAAA,CAAAZ,CAAA,OAAAa,OAAA,WAAAd,CAAA,QAAAe,gBAAA,CAAAC,OAAA,EAAAjB,CAAA,EAAAC,CAAA,EAAAC,CAAA,CAAAD,CAAA,SAAAiB,iCAAA,GAAAC,wBAAA,CAAAnB,CAAA,EAAAkB,iCAAA,CAAAhB,CAAA,KAAAH,OAAA,CAAAe,MAAA,CAAAZ,CAAA,GAAAa,OAAA,WAAAd,CAAA,IAAAmB,sBAAA,CAAApB,CAAA,EAAAC,CAAA,EAAAM,gCAAA,CAAAL,CAAA,EAAAD,CAAA,iBAAAD,CAAA;AAAA,SAAAqB,WAAAnB,CAAA,EAAAG,CAAA,EAAAL,CAAA,WAAAK,CAAA,OAAAiB,gBAAA,CAAAL,OAAA,EAAAZ,CAAA,OAAAkB,2BAAA,CAAAN,OAAA,EAAAf,CAAA,EAAAsB,yBAAA,KAAAC,kBAAA,CAAApB,CAAA,EAAAL,CAAA,YAAAsB,gBAAA,CAAAL,OAAA,EAAAf,CAAA,EAAAwB,WAAA,IAAArB,CAAA,CAAAK,KAAA,CAAAR,CAAA,EAAAF,CAAA;AAAA,SAAAwB,0BAAA,cAAAtB,CAAA,IAAAyB,OAAA,CAAAC,SAAA,CAAAC,OAAA,CAAAC,IAAA,CAAAL,kBAAA,CAAAE,OAAA,iCAAAzB,CAAA,aAAAsB,yBAAA,YAAAA,0BAAA,aAAAtB,CAAA;AAAA,SAAA6B,cAAA7B,CAAA,EAAAG,CAAA,EAAAL,CAAA,EAAAC,CAAA,QAAA+B,CAAA,OAAAC,KAAA,CAAAhB,OAAA,MAAAK,gBAAA,CAAAL,OAAA,MAAAhB,CAAA,GAAAC,CAAA,CAAA0B,SAAA,GAAA1B,CAAA,GAAAG,CAAA,EAAAL,CAAA,cAAAC,CAAA,yBAAA+B,CAAA,aAAA9B,CAAA,WAAA8B,CAAA,CAAAtB,KAAA,CAAAV,CAAA,EAAAE,CAAA,OAAA8B,CAAA,IAV/E;AACA;AACA,GAFA,CAKA;AAeA,IAAME,sBAAsB,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC;AACxD,IAAMC,uBAAuB,GAAG,cAAc;AAC9C,IAAMC,yBAAyB,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;;AAItD;;AAMA,SAASC,wBAAwBA,CAACC,KAAa,EAAE;EAC/C,OAAOA,KAAK,CAACC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC;AACzC;AAAC,IAEKC,YAAY,0BAAAC,aAAA;EAgBhB,SAAAD,aAAYE,KAAe,EAA4C;IAAA,IAAAC,KAAA;IAAA,IAA1CC,MAAmC,GAAAhC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAiC,SAAA,GAAAjC,SAAA,MAAG,CAAC,CAAC;IAAA,IAAAkC,gBAAA,CAAA7B,OAAA,QAAAuB,YAAA;IACnEG,KAAA,GAAAtB,UAAA,OAAAmB,YAAA;IAAQ,IAAAxB,gBAAA,CAAAC,OAAA,EAAA0B,KAAA;IAAA,IAAA3B,gBAAA,CAAAC,OAAA,EAAA0B,KAAA;IAAA,IAAA3B,gBAAA,CAAAC,OAAA,EAAA0B,KAAA;IAAA,IAAA3B,gBAAA,CAAAC,OAAA,EAAA0B,KAAA;IAAA,IAAA3B,gBAAA,CAAAC,OAAA,EAAA0B,KAAA;IAAA,IAAA3B,gBAAA,CAAAC,OAAA,EAAA0B,KAAA;IAAA,IAAA3B,gBAAA,CAAAC,OAAA,EAAA0B,KAAA;IAAA,IAAA3B,gBAAA,CAAAC,OAAA,EAAA0B,KAAA;IATgB;IAAA,IAAA3B,gBAAA,CAAAC,OAAA,EAAA0B,KAAA;IACkB;IAAA,IAAA3B,gBAAA,CAAAC,OAAA,EAAA0B,KAAA;IAAA,IAAA3B,gBAAA,CAAAC,OAAA,EAAA0B,KAAA;IAAA,IAAA3B,gBAAA,CAAAC,OAAA,EAAA0B,KAAA;IAAA,IAAA3B,gBAAA,CAAAC,OAAA,EAAA0B,KAAA;IAAA,IAAA3B,gBAAA,CAAAC,OAAA,EAAA0B,KAAA;IAU1C,IAAI,CAACD,KAAK,EAAE;MACV,MAAM,IAAIK,KAAK,CAAC,6DAA6D,CAAC;IAChF;IAEAJ,KAAA,CAAKD,KAAK,GAAGA,KAAK;IAClBC,KAAA,CAAKC,MAAM,GAAGA,MAAM;IACpBD,KAAA,CAAKK,MAAM,GAAIN,KAAK,CAACM,MAAM,IAAsCC,OAAO;IACxEN,KAAA,CAAKO,SAAS,GAAG,KAAK;IACtBP,KAAA,CAAKQ,UAAU,GAAG,KAAK;IACvBR,KAAA,CAAKS,gBAAgB,GAAG,KAAK;IAC7BT,KAAA,CAAKU,MAAM,GAAGR,SAAS;IACvBF,KAAA,CAAKW,WAAW,GAAGT,SAAS;IAC5BF,KAAA,CAAKY,6BAA6B,GAAGV,SAAS;IAC9CF,KAAA,CAAKa,iBAAiB,GAAG,IAAAC,IAAA,CAAAxC,OAAA,CAAQ,CAAC;IAClC0B,KAAA,CAAKe,cAAc,GAAGb,SAAS;IAC/BF,KAAA,CAAKgB,iBAAiB,GAAGd,SAAS;IAClCF,KAAA,CAAKiB,oBAAoB,GAAGf,SAAS;IAAC,OAAAF,KAAA;EACxC;EAAC,IAAAkB,UAAA,CAAA5C,OAAA,EAAAuB,YAAA,EAAAC,aAAA;EAAA,WAAAqB,aAAA,CAAA7C,OAAA,EAAAuB,YAAA;IAAAuB,GAAA;IAAAC,KAAA,EAED,SAAOC,GAAGA,CAACC,SAAiB,EAAEC,QAAuC,EAAE;MACrE,IAAIA,QAAQ,EAAE;QACZ,OAAApC,aAAA,CAAAS,YAAA,mBAAiB0B,SAAS,EAAEC,QAAQ;MACtC;MAEA,IAAI,CAACC,kBAAkB,CAACF,SAAS,CAAC;MAElC,OAAO,IAAI;IACb;;IAEA;AACF;AACA;AACA;EAHE;IAAAH,GAAA;IAAAC,KAAA,EAIA,SAAQK,0BAA0BA,CAAChB,MAAsB,EAAQ;MAAA,IAAAiB,MAAA;MAC/DjB,MAAM,CAACkB,EAAE,CAAC,OAAO,EAAE,UAACC,KAAuB;QAAA,OAAKF,MAAI,CAACG,OAAO,CAACD,KAAK,EAAEnB,MAAM,CAAC;MAAA,EAAC;MAC5EA,MAAM,CAACkB,EAAE,CAAC,SAAS,EAAE,UAACC,KAAyC;QAAA,OAAKF,MAAI,CAACI,SAAS,CAACF,KAAK,CAAC;MAAA,EAAC;IAC5F;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAT,GAAA;IAAAC,KAAA,EAKA,SAAQW,yCAAyCA,CAACC,QAAwB,EAAW;MACnF,IAAI,CAAAA,QAAQ,aAARA,QAAQ,uBAARA,QAAQ,CAAEC,IAAI,MAAK,aAAa,IAAI,CAACD,QAAQ,CAACE,OAAO,EAAE;QACzD,OAAO,KAAK;MACd;MAEA,IAAI,IAAI,CAACtB,iBAAiB,CAACuB,GAAG,CAACH,QAAQ,CAACE,OAAO,CAAC,EAAE;QAChD;QACA;QACA,IAAME,aAAa,GAAG,IAAI,CAACxB,iBAAiB,CAACyB,GAAG,CAACL,QAAQ,CAACE,OAAO,CAAC,IAAI,IAAI;QAC1E,IAAI,CAACtB,iBAAiB,CAAC0B,MAAM,CAACN,QAAQ,CAACE,OAAO,CAAC;QAC/C,IAAI,CAACtB,iBAAiB,CAAC2B,GAAG,CAACP,QAAQ,CAACE,OAAO,EAAEE,aAAa,CAAC;QAC3D,IAAI,CAAChC,MAAM,CAACoC,IAAI,IAAAC,MAAA,CACXlD,uBAAuB,kDAAAkD,MAAA,CAA+CT,QAAQ,CAACE,OAAO,CAC3F,CAAC;QAED,OAAO,IAAI;MACb;MAEA,IAAI,CAAC9B,MAAM,CAACsC,GAAG,IAAAD,MAAA,CACVlD,uBAAuB,sCAAAkD,MAAA,CAAmCT,QAAQ,CAACE,OAAO,CAC/E,CAAC;MACD,IAAI,CAACtB,iBAAiB,CAAC2B,GAAG,CAACP,QAAQ,CAACE,OAAO,EAAE,IAAI,CAAC;MAElD,IACE,IAAI,CAAClC,MAAM,CAAC2C,iBAAiB,IAC7B,IAAI,CAAC/B,iBAAiB,CAACgC,IAAI,GAAG,IAAI,CAAC5C,MAAM,CAAC2C,iBAAiB,EAC3D;QACA,IAAME,aAAa,GAAG,IAAI,CAACjC,iBAAiB,CAACkC,IAAI,CAAC,CAAC,CAACC,IAAI,CAAC,CAAC,CAAC3B,KAAK,IAAI,EAAE;QAEtE,IAAI,CAACR,iBAAiB,CAAC0B,MAAM,CAACO,aAAa,CAAC;QAC5C,IAAI,CAACzC,MAAM,CAACsC,GAAG,IAAAD,MAAA,CACVlD,uBAAuB,6DAAAkD,MAAA,CAA0DI,aAAa,CACnG,CAAC;MACH;MAEA,OAAO,KAAK;IACd;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA1B,GAAA;IAAAC,KAAA,EAKA,SAAQ4B,sBAAsBA,CAAA,EAAG;MAAA,IAAAC,MAAA;MAC/B,IAAMC,SAAS,GAAG,IAAI,CAACzC,MAAM;MAE7B,IAAI;QACF,IAAI,IAAI,CAACE,6BAA6B,EAAE;UACtC,IAAI,CAACP,MAAM,CAACoC,IAAI,IAAAC,MAAA,CAAIlD,uBAAuB,gDAA6C,CAAC;UAEzF;QACF;QAEA,IAAI,CAACa,MAAM,CAACoC,IAAI,IAAAC,MAAA,CAAIlD,uBAAuB,kCAA+B,CAAC;QAE3E,IAAI,CAAC4D,kBAAkB,CAAClD,SAAS,EAAE;UACjCmD,oBAAoB,EAAE,IAAI;UAC1BC,cAAc,EAAE;YACdD,oBAAoB,EAAE,IAAI;YAC1BE,SAAS,EAAE,SAAXA,SAASA,CAAGC,SAAS,EAAEC,YAAY,EAAK;cACtCP,MAAI,CAAC7C,MAAM,CAACoC,IAAI,IAAAC,MAAA,CACXlD,uBAAuB,8CAAAkD,MAAA,CAA2Ce,YAAY,CACnF,CAAC;;cAED;cACAD,SAAS,CAAChD,UAAU,GAAG,KAAK;cAC5BgD,SAAS,CAACjD,SAAS,GAAG,IAAI;cAC1B2C,MAAI,CAACxC,MAAM,GAAG8C,SAAS;cACvBN,MAAI,CAAC3C,SAAS,GAAG,IAAI;cAErB2C,MAAI,CAACQ,SAAS,CAAC,2CAA2C,EAAE;gBAC1DC,GAAG,EAAEF;cACP,CAAC,CAAC;cAEF,IAAIN,SAAS,EAAE;gBACbD,MAAI,CAAC7C,MAAM,CAACoC,IAAI,IAAAC,MAAA,CACXlD,uBAAuB,kEAC5B,CAAC;cACH;YACF;UACF;QACF,CAAC,CAAC,CACCoE,IAAI,CAAC,YAAM;UACVV,MAAI,CAAC7C,MAAM,CAACoC,IAAI,IAAAC,MAAA,CACXlD,uBAAuB,mDAC5B,CAAC;QACH,CAAC,CAAC,CACDqE,KAAK,CAAC,UAACC,GAAG,EAAK;UACdZ,MAAI,CAAC7C,MAAM,CAACoC,IAAI,IAAAC,MAAA,CACXlD,uBAAuB,yFAC1BsE,GACF,CAAC;UACDZ,MAAI,CAACQ,SAAS,CAAC,yCAAyC,EAAE;YAACK,MAAM,EAAED;UAAG,CAAC,CAAC;QAC1E,CAAC,CAAC;MACN,CAAC,CAAC,OAAOzG,CAAC,EAAE;QACV,IAAI,CAACgD,MAAM,CAAC2D,KAAK,IAAAtB,MAAA,CAAIlD,uBAAuB,2CAAwCnC,CAAC,CAAC;QACtF,IAAI,CAACuD,6BAA6B,GAAGV,SAAS;QAC9C,IAAI,CAACwD,SAAS,CAAC,yCAAyC,EAAE;UAACK,MAAM,EAAE1G;QAAC,CAAC,CAAC;MACxE;IACF;;IAEA;AACF;AACA;AACA;EAHE;IAAA+D,GAAA;IAAAC,KAAA,EAIA,SAAO4C,wBAAwBA,CAAA,EAAuB;MAAA,IAAAC,YAAA;MACpD,IAAI,GAAAA,YAAA,GAAC,IAAI,CAACxD,MAAM,cAAAwD,YAAA,eAAXA,YAAA,CAAa3D,SAAS,GAAE;QAC3B,OAAOL,SAAS;MAClB;MAEA,OAAO,IAAI,CAACQ,MAAM,CAACiD,GAAG;IACxB;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAvC,GAAA;IAAAC,KAAA,EAMA,SAAO8C,cAAcA,CACnBC,OAAmC,EAEV;MAAA,IADzBC,OAAmC,GAAApG,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAiC,SAAA,GAAAjC,SAAA,MAAG,CAAC,CAAC;MAExC,IAAI,CAACmG,OAAO,IAAI,IAAAE,QAAA,CAAAhG,OAAA,EAAO8F,OAAO,MAAK,QAAQ,IAAI,IAAAG,QAAA,CAAAjG,OAAA,EAAc8F,OAAO,CAAC,EAAE;QACrE,OAAOI,QAAA,CAAAlG,OAAA,CAAQmG,MAAM,CAAC,IAAIrE,KAAK,CAAC,uBAAuB,CAAC,CAAC;MAC3D;MAEA,IAAI,CAAC,IAAI,CAACM,MAAM,IAAI,CAAC,IAAI,CAACA,MAAM,CAACH,SAAS,EAAE;QAC1C,OAAOiE,QAAA,CAAAlG,OAAA,CAAQmG,MAAM,CAAC,IAAIrE,KAAK,CAAC,gCAAgC,CAAC,CAAC;MACpE;MAEA,OAAO,IAAI,CAACM,MAAM,CAACgE,WAAW,CAACN,OAAO,EAAE;QAACO,OAAO,EAAEN,OAAO,CAACM;MAAO,CAAC,CAAC;IACrE;;IAEA;AACF;AACA;AACA;EAHE;IAAAvD,GAAA;IAAAC,KAAA,EAIA,SAAOuD,WAAWA,CAAA,EAAY;MAC5B,OAAO,IAAI,CAACrE,SAAS;IACvB;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAa,GAAA;IAAAC,KAAA,EAKA,SAAOwD,OAAOA,CAACpB,YAAqB,EAAiB;MAAA,IAAAqB,aAAA;QAAAC,aAAA;QAAAC,qBAAA;QAAAC,sBAAA;QAAAC,MAAA;MACnD,IAAI,IAAI,CAACnE,cAAc,EAAE;QACvB,IAAI,CAACV,MAAM,CAACoC,IAAI,IAAAC,MAAA,CACXlD,uBAAuB,iEAC5B,CAAC;QAED,OAAO,IAAI,CAACuB,cAAc;MAC5B;MAEA,IAAI,CAAA+D,aAAA,OAAI,CAACpE,MAAM,cAAAoE,aAAA,eAAXA,aAAA,CAAavE,SAAS,KAAAwE,aAAA,GAAI,IAAI,CAACrE,MAAM,cAAAqE,aAAA,eAAXA,aAAA,CAAavE,UAAU,EAAE;QACrD,IAAI,CAACH,MAAM,CAACoC,IAAI,IAAAC,MAAA,CAAIlD,uBAAuB,gDAA6C,CAAC;QAEzF,OAAOgF,QAAA,CAAAlG,OAAA,CAAQ6G,OAAO,CAAC,CAAC;MAC1B;;MAEA;MACA;MACA,IAAI1B,YAAY,IAAI,IAAI,CAAC2B,SAAS,IAAI3B,YAAY,KAAK,IAAI,CAAC2B,SAAS,EAAE;QACrE,IAAI,CAAC3E,gBAAgB,GAAG,KAAK;MAC/B;;MAEA;MACA,IAAIgD,YAAY,EAAE;QAChB,IAAI,CAAC2B,SAAS,GAAG3B,YAAY;MAC/B;MAEA,IAAI,CAACjD,UAAU,GAAG,IAAI;MAEtB,IAAI,CAACH,MAAM,CAACoC,IAAI,IAAAC,MAAA,CACXlD,uBAAuB,mCAAAkD,MAAA,CACxB2C,MAAM,CAAC,IAAI,CAACpF,MAAM,CAACqF,2BAA2B,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC7E,gBAAgB,GAC3E,6BAA6B,GAC7B,EAAE,CAEV,CAAC;MAED,IAAMM,cAAc,GAAGyD,QAAA,CAAAlG,OAAA,CAAQ6G,OAAO,CACpC,IAAI,CAACpF,KAAK,CAACwF,QAAQ,CAACC,MAAM,CAACC,UAAU,MAAAT,qBAAA,GAAI,CAAAC,sBAAA,OAAI,CAAClF,KAAK,CAACwF,QAAQ,CAACC,MAAM,EAACE,QAAQ,cAAAV,qBAAA,uBAAnCA,qBAAA,CAAA7F,IAAA,CAAA8F,sBAAsC,CAAC,CAClF,CAAC,CACErB,IAAI,CAAC,YAAM;QACVsB,MAAI,CAAC7E,MAAM,CAACoC,IAAI,IAAAC,MAAA,CAAIlD,uBAAuB,iBAAc,CAAC;QAE1D,OAAO0F,MAAI,CAAC9B,kBAAkB,CAAC8B,MAAI,CAACE,SAAS,CAAC;MAChD,CAAC,CAAC,CACDO,OAAO,CAAC,YAAM;QACbT,MAAI,CAACnE,cAAc,GAAGb,SAAS;MACjC,CAAC,CAAC;MAEJ,IAAI,CAACa,cAAc,GAAGA,cAAc;MAEpC,OAAOA,cAAc;IACvB;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAK,GAAA;IAAAC,KAAA,EAKA,SAAOuE,UAAUA,CAACvB,OAAkC,EAAgC;MAAA,IAAAwB,MAAA;MAClF,IAAI,CAACxF,MAAM,CAACoC,IAAI,IAAAC,MAAA,CACXlD,uBAAuB,qCAAAkD,MAAA,CAAkC,IAAI,CAAClC,UAAU,iCAAAkC,MAAA,CACvD,IAAI,CAACnC,SAAS,uBAAAmC,MAAA,CAAoB,CAAC,CAAC,IAAI,CAAChC,MAAM,yBAAAgC,MAAA,CACvD,IAAAoD,UAAA,CAAAxH,OAAA,EAAe+F,OAAO,CAAC,CACrC,CAAC;MAED,IAAI,IAAI,CAAC1D,WAAW,EAAE;QACpB,IAAI,CAACN,MAAM,CAACoC,IAAI,IAAAC,MAAA,CAAIlD,uBAAuB,0BAAuB,CAAC;QACnE,IAAI,CAACmB,WAAW,CAACoF,KAAK,CAAC,CAAC;QACxB,IAAI,CAACpF,WAAW,GAAGT,SAAS;MAC9B;MAEA,IAAI,IAAI,CAACU,6BAA6B,EAAE;QACtC,IAAI,CAACP,MAAM,CAACoC,IAAI,IAAAC,MAAA,CAAIlD,uBAAuB,8CAA2C,CAAC;QACvF,IAAI,CAACoB,6BAA6B,CAACmF,KAAK,CAAC,CAAC;QAC1C,IAAI,CAACnF,6BAA6B,GAAGV,SAAS;MAChD;MAEA,IAAI,CAACa,cAAc,GAAGb,SAAS;MAC/B,IAAI,CAACW,iBAAiB,CAACmF,KAAK,CAAC,CAAC;MAE9B,IAAI,CAAC,IAAI,CAACtF,MAAM,EAAE;QAChB,IAAI,CAACH,SAAS,GAAG,KAAK;QACtB,IAAI,CAAC0F,qBAAqB,CAAC,CAAC;QAE5B,OAAOzB,QAAA,CAAAlG,OAAA,CAAQ6G,OAAO,CAAC,CAAC;MAC1B;MAEA,IAAI,CAACzE,MAAM,CAACe,kBAAkB,CAAC,SAAS,CAAC;MACzC,IAAI,CAACf,MAAM,CAACF,UAAU,GAAG,KAAK;MAC9B,IAAI,CAACE,MAAM,CAACH,SAAS,GAAG,KAAK;MAE7B,OAAOiE,QAAA,CAAAlG,OAAA,CAAQ6G,OAAO,CAAC,IAAI,CAACzE,MAAM,CAACwF,KAAK,CAAC7B,OAAO,IAAInE,SAAS,CAAC,CAAC,CAACyF,OAAO,CAAC,YAAM;QAC5EE,MAAI,CAACtF,SAAS,GAAG,KAAK;QACtBsF,MAAI,CAACI,qBAAqB,CAAC,CAAC;MAC9B,CAAC,CAAC;IACJ;EAAC;IAAA7E,GAAA;IAAAC,KAAA,EAED,SAAQ8E,UAAUA,CAAC1C,YAAgC,EAAmB;MACpE,IAAI,CAACA,YAAY,EAAE;QACjB;QACAA,YAAY,GAAG,IAAI,CAAC1D,KAAK,CAACwF,QAAQ,CAACC,MAAM,CAAC/B,YAAY,IAAI,EAAE;MAC9D;MAEA,OAAOe,QAAA,CAAAlG,OAAA,CAAQ6G,OAAO,CAAC1B,YAAY,CAAC;IACtC;EAAC;IAAArC,GAAA;IAAAC,KAAA,EAED,SAAQ+E,iBAAiBA,CACvBhB,SAA6B,EAC7BiB,QAA+B,EAQR;MAAA,IAAAC,MAAA;MAAA,IAPvBjC,OAMC,GAAApG,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAiC,SAAA,GAAAjC,SAAA,MAAG,CAAC,CAAC;MAEN,IAAAsI,qBAAA,GAA4DlC,OAAO,CAA5DhB,oBAAoB;QAApBA,oBAAoB,GAAAkD,qBAAA,cAAG,KAAK,GAAAA,qBAAA;QAAAC,qBAAA,GAAyBnC,OAAO,CAA9Bf,cAAc;QAAdA,cAAc,GAAAkD,qBAAA,cAAG,CAAC,CAAC,GAAAA,qBAAA;MACxD,IAAAC,qBAAA,GAA2BnD,cAAc,CAAlCC,SAAS;QAATA,SAAS,GAAAkD,qBAAA,cAAG,IAAI,GAAAA,qBAAA;MAEvB,IAAM/F,MAAM,GAAG,IAAIgG,eAAM,CAAC,CAAmB;MAC7ChG,MAAM,CAACF,UAAU,GAAG,IAAI;MACxB,IAAImG,QAA4B;MAEhC,IAAI,CAACjF,0BAA0B,CAAChB,MAAM,CAAC;MAEvC,IAAMC,WAAW,GAAG0C,oBAAoB,GACpC,IAAI,CAACzC,6BAA6B,GAClC,IAAI,CAACD,WAAW;;MAEpB;MACA,IAAI,CAACA,WAAW,EAAE;QAChB,IAAMiG,IAAI,GAAGvD,oBAAoB,GAAG,yBAAyB,GAAG,aAAa;QAC7E,IAAMwD,GAAG,MAAAnE,MAAA,CAAMlD,uBAAuB,iCAAAkD,MAAA,CAA8BkE,IAAI,uBAAoB;QAC5F,IAAM9C,GAAG,GAAG,IAAI1D,KAAK,CAACyG,GAAG,CAAC;QAE1B,IAAI,CAACxG,MAAM,CAACoC,IAAI,CAACoE,GAAG,CAAC;QACrB;QACAR,QAAQ,CAACvC,GAAG,CAAC;QAEb,OAAOU,QAAA,CAAAlG,OAAA,CAAQmG,MAAM,CAACX,GAAG,CAAC;MAC5B;;MAEA;MACA;MACA,IAAI,CAACT,oBAAoB,EAAE;QACzB,IAAI,CAAC3C,MAAM,GAAGA,MAAM;MACtB;MAEA,OAAO,IAAI,CAACoG,oBAAoB,CAACpG,MAAM,EAAE0E,SAAS,EAAE/B,oBAAoB,CAAC,CACtEO,IAAI,CAAC,UAACH,YAAY,EAAK;QACtBkD,QAAQ,GAAGlD,YAAY;QAEvB6C,MAAI,CAACjG,MAAM,CAACoC,IAAI,IAAAC,MAAA,CACXlD,uBAAuB,QAAAkD,MAAA,CACxBW,oBAAoB,GAAG,uBAAuB,GAAG,EAAE,iDAAAX,MAAA,CACPiE,QAAQ,CACxD,CAAC;;QAED;QACA,IAAIpD,SAAS,EAAE;UACbA,SAAS,CAAC7C,MAAM,EAAE+C,YAAY,CAAC;UAC/B4C,QAAQ,CAAC,CAAC;UAEV,OAAO7B,QAAA,CAAAlG,OAAA,CAAQ6G,OAAO,CAAC,CAAC;QAC1B;;QAEA;QACAkB,QAAQ,CAAC,CAAC;QAEV,OAAO7B,QAAA,CAAAlG,OAAA,CAAQ6G,OAAO,CAAC,CAAC;MAC1B,CAAC,CAAC,CACDtB,KAAK,CAAC,UAACE,MAAM,EAAK;QACjB;QACA,IAAIV,oBAAoB,EAAE;UACxBiD,MAAI,CAACjG,MAAM,CAACoC,IAAI,IAAAC,MAAA,CACXlD,uBAAuB,6CAC1BuE,MACF,CAAC;UAED,OAAOsC,QAAQ,CAACtC,MAAe,CAAC;QAClC;;QAEA;QACA,IAAMgD,iBAAiB,GAAGT,MAAI,CAAC3F,WAAW;QAC1C;QACA,IAAIoD,MAAM,CAACiD,IAAI,KAAK,IAAI,IAAID,iBAAiB,IAAI,CAAAA,iBAAiB,aAAjBA,iBAAiB,uBAAjBA,iBAAiB,CAAEE,aAAa,CAAC,CAAC,IAAG,CAAC,EAAE;UACvFX,MAAI,CAAC5C,SAAS,CAAC,mBAAmB,EAAEK,MAAM,EAAE;YAC1CmD,OAAO,EAAEH,iBAAiB,aAAjBA,iBAAiB,uBAAjBA,iBAAiB,CAAEE,aAAa,CAAC;UAC5C,CAAC,CAAC;QACJ;QACAX,MAAI,CAACjG,MAAM,CAACoC,IAAI,IAAAC,MAAA,CACXlD,uBAAuB,kCAC1BuE,MAAM,EACN,CAAAgD,iBAAiB,aAAjBA,iBAAiB,uBAAjBA,iBAAiB,CAAEE,aAAa,CAAC,CAAC,MAAK,CAAC,GAAGlD,MAAM,CAACoD,KAAK,GAAG,EAC5D,CAAC;;QAED;QACA;QACA,IAAIpD,MAAM,YAAYqD,uBAAe,EAAE;UAAA,IAAAC,qBAAA,EAAAC,sBAAA;UACrChB,MAAI,CAACjG,MAAM,CAACoC,IAAI,IAAAC,MAAA,CACXlD,uBAAuB,qEAC5B,CAAC;UAED,QAAA6H,qBAAA,GAAO,CAAAC,sBAAA,GAAAhB,MAAI,CAACvG,KAAK,CAACwF,QAAQ,CAACC,MAAM,EAC9B+B,OAAO,cAAAF,qBAAA,uBADHA,qBAAA,CAAAlI,IAAA,CAAAmI,sBACM,CAAC,CACX1D,IAAI,CAAC;YAAA,OAAMyC,QAAQ,CAACtC,MAA0B,CAAC;UAAA,EAAC;QACrD;QACA;QACA,IAAIA,MAAM,YAAYyD,qBAAa,EAAE;UAAA,IAAAC,qBAAA,EAAAC,sBAAA;UACnCpB,MAAI,CAACjG,MAAM,CAACoC,IAAI,IAAAC,MAAA,CACXlD,uBAAuB,kDAC5B,CAAC;UAED,QAAAiI,qBAAA,GAAO,CAAAC,sBAAA,GAAApB,MAAI,CAACvG,KAAK,CAAC4H,WAAW,EAC1BJ,OAAO,cAAAE,qBAAA,uBADHA,qBAAA,CAAAtI,IAAA,CAAAuI,sBAAA,EACM;YAACE,KAAK,EAAE;UAAI,CAAC,CAAC,CACxBhE,IAAI,CAAC;YAAA,OAAMyC,QAAQ,CAACtC,MAA0B,CAAC;UAAA,EAAC;QACrD;QACA,IAAIA,MAAM,YAAY8D,kBAAU,IAAI9D,MAAM,YAAY+D,iBAAS,EAAE;UAC/DxB,MAAI,CAACjG,MAAM,CAAC0H,IAAI,IAAArF,MAAA,CACXlD,uBAAuB,6CAAAkD,MAAA,CAA0ClD,uBAAuB,CAC7F,CAAC;UACDuH,iBAAiB,aAAjBA,iBAAiB,uBAAjBA,iBAAiB,CAAEhB,KAAK,CAAC,CAAC;UAE1B,OAAOM,QAAQ,CAACtC,MAA0B,CAAC;QAC7C;QAEA,OAAOsC,QAAQ,CAACtC,MAA0B,CAAC;MAC7C,CAAC,CAAC,CACDF,KAAK,CAAC,UAACE,MAAM,EAAK;QACjBuC,MAAI,CAACjG,MAAM,CAAC2D,KAAK,IAAAtB,MAAA,CACZlD,uBAAuB,4CAC1BuE,MACF,CAAC;QACDsC,QAAQ,CAACtC,MAAM,CAAC;MAClB,CAAC,CAAC;IACN;EAAC;IAAA3C,GAAA;IAAAC,KAAA,EAED,SAAQyF,oBAAoBA,CAC1BpG,MAAsB,EACtB0E,SAA6B,EAEZ;MAAA,IAAA4C,MAAA;MAAA,IADjB3E,oBAAoB,GAAApF,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAiC,SAAA,GAAAjC,SAAA,MAAG,KAAK;MAE5B,IAAMgK,SAAS,GAAG5E,oBAAoB,GAAG,uBAAuB,GAAG,YAAY;MAE/E,OAAOmB,QAAA,CAAAlG,OAAA,CAAQ4J,GAAG,CAAC,CAAC,IAAI,CAAC/B,UAAU,CAACf,SAAS,CAAC,EAAE,IAAI,CAACrF,KAAK,CAAC4H,WAAW,CAACQ,YAAY,CAAC,CAAC,CAAC,CAAC,CAACvE,IAAI,CAC1F,UAAAwE,IAAA,EAA2B;QAAA,IAAAC,KAAA,OAAAC,eAAA,CAAAhK,OAAA,EAAA8J,IAAA;UAAzB3E,YAAY,GAAA4E,KAAA;UAAE1I,KAAK,GAAA0I,KAAA;QACnB,IAAIhE,OAAY,GAAG;UACjBkE,eAAe,EAAEP,MAAI,CAAC/H,MAAM,CAACsI,eAAe;UAC5CC,kBAAkB,EAAER,MAAI,CAAC/H,MAAM,CAACuI,kBAAkB;UAClD7I,KAAK,EAAED,wBAAwB,CAACC,KAAK,CAAC8I,QAAQ,CAAC,CAAC,CAAC;UACjDC,YAAY,EAAE,SAAdA,YAAYA,CAAA;YAAA,OAAQV,MAAI,CAACU,YAAY,CAAC,CAAC;UAAA;UACvCC,UAAU,KAAAjG,MAAA,CAAKsF,MAAI,CAACjI,KAAK,CAAC6I,SAAS,OAAAlG,MAAA,CAAI,IAAAmG,IAAA,CAAAvK,OAAA,EAAS,CAAC,CAAE;UACnD+B,MAAM,EAAE2H,MAAI,CAAC3H;QACf,CAAC;QAED,IAAI2H,MAAI,CAACjI,KAAK,CAACE,MAAM,CAAC6I,0BAA0B,EAAE;UAChD,IAAMC,gBAAgB,GAAG1F,oBAAoB,GACzC,uCAAuC,GACvC,wBAAwB;UAE5B2E,MAAI,CAAC3H,MAAM,CAACoC,IAAI,IAAAC,MAAA,CAAIlD,uBAAuB,QAAAkD,MAAA,CAAKqG,gBAAgB,CAAE,CAAC;UACnE1E,OAAO,GAAArG,aAAA,CAAAA,aAAA,KAAOqG,OAAO,GAAK2D,MAAI,CAACjI,KAAK,CAACE,MAAM,CAAC6I,0BAA0B,CAAC;QACzE;;QAEA;QACA;QACA,IAAI,CAACzF,oBAAoB,EAAE;UACzB2E,MAAI,CAACtH,MAAM,GAAGA,MAAM;QACtB;QAEAsH,MAAI,CAAC3H,MAAM,CAACoC,IAAI,IAAAC,MAAA,CAAIlD,uBAAuB,OAAAkD,MAAA,CAAIuF,SAAS,YAAAvF,MAAA,CAASe,YAAY,CAAE,CAAC;QAEhF,OAAO/C,MAAM,CAACsI,IAAI,CAACvF,YAAY,EAAEY,OAAO,CAAC,CAACT,IAAI,CAAC;UAAA,OAAMH,YAAY;QAAA,EAAC;MACpE,CACF,CAAC;IACH;EAAC;IAAArC,GAAA;IAAAC,KAAA,EAED,SAAQ+B,kBAAkBA,CACxBK,YAAgC,EASjB;MAAA,IAAAwF,MAAA;MAAA,IAPfC,OAMC,GAAAjL,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAiC,SAAA,GAAAjC,SAAA,MAAG,CAAC,CAAC;MAEN,IAAAkL,qBAAA,GAA4DD,OAAO,CAA5D7F,oBAAoB;QAApBA,oBAAoB,GAAA8F,qBAAA,cAAG,KAAK,GAAAA,qBAAA;QAAAC,qBAAA,GAAyBF,OAAO,CAA9B5F,cAAc;QAAdA,cAAc,GAAA8F,qBAAA,cAAG,CAAC,CAAC,GAAAA,qBAAA;MAExD,OAAO,IAAA5E,QAAA,CAAAlG,OAAA,CAAY,UAAC6G,OAAO,EAAEV,MAAM,EAAK;QACtC,IAAItF,IAAS;QACb,IAAMkK,gBAAgB,GAAG,CAAChG,oBAAoB,IAAI,CAAC4F,MAAI,CAACxI,gBAAgB;QACxE,IAAM6I,iBAAiB,GACrBL,MAAI,CAAChJ,MAAM,CAACqF,2BAA2B,IAAI,IAAI,GAC3C,IAAI,GACJD,MAAM,CAAC4D,MAAI,CAAChJ,MAAM,CAACqF,2BAA2B,CAAC;QACrD,IAAMiE,8BAA8B,GAAGF,gBAAgB,IAAIC,iBAAiB,KAAK,CAAC;QAElF,IAAME,UAAU,GAAG,SAAbA,UAAUA,CAAI1F,GAAW,EAAK;UAClC,IAAIT,oBAAoB,EAAE;YACxB4F,MAAI,CAACrI,6BAA6B,GAAGV,SAAS;UAChD,CAAC,MAAM;YACL+I,MAAI,CAACtI,WAAW,GAAGT,SAAS;UAC9B;UAEA,IAAI4D,GAAG,EAAE;YACP,IAAM+C,GAAG,GAAGxD,oBAAoB,yCAAAX,MAAA,CACUvD,IAAI,CAAC8H,aAAa,CAAC,CAAC,2CAAAvE,MAAA,CAC/BvD,IAAI,CAAC8H,aAAa,CAAC,CAAC,aAAU;YAE7DgC,MAAI,CAAC5I,MAAM,CAACoC,IAAI,IAAAC,MAAA,CAAIlD,uBAAuB,QAAAkD,MAAA,CAAKmE,GAAG,QAAAnE,MAAA,CAAKoB,GAAG,CAAE,CAAC;YAC9D;YACA;YACA,IAAI,CAACT,oBAAoB,IAAI4F,MAAI,CAACvI,MAAM,EAAE;cACxCuI,MAAI,CAACvI,MAAM,CAACF,UAAU,GAAG,KAAK;cAC9ByI,MAAI,CAACvI,MAAM,CAACH,SAAS,GAAG,KAAK;YAC/B;YAEA,OAAOkE,MAAM,CAACX,GAAG,CAAC;UACpB;;UAEA;UACA;UACA,IAAI,CAACT,oBAAoB,IAAI4F,MAAI,CAACvI,MAAM,EAAE;YACxCuI,MAAI,CAACvI,MAAM,CAACF,UAAU,GAAG,KAAK;YAC9ByI,MAAI,CAACvI,MAAM,CAACH,SAAS,GAAG,IAAI;UAC9B;UAEA,IAAI,CAAC8C,oBAAoB,EAAE;YACzB4F,MAAI,CAACzI,UAAU,GAAG,KAAK;YACvByI,MAAI,CAAC1I,SAAS,GAAG,IAAI;YACrB0I,MAAI,CAACxI,gBAAgB,GAAG,IAAI;YAC5BwI,MAAI,CAACQ,sBAAsB,CAAC,CAAC;YAC7BR,MAAI,CAACvF,SAAS,CAAC,QAAQ,CAAC;UAC1B;UAEA,OAAOyB,OAAO,CAAC,CAAC;QAClB,CAAC;QACD;QACAhG,IAAI,GAAGuK,gBAAO,CAACvK,IAAI,CACjB,UAACkH,QAA+B,EAAK;UACnC,IAAMsD,UAAU,GAAGxK,IAAI,CAAC8H,aAAa,CAAC,CAAC;UACvC,IAAM2C,gBAAgB,GAAGvG,oBAAoB,GAAG,uBAAuB,GAAG,YAAY;UAEtF4F,MAAI,CAAC5I,MAAM,CAACoC,IAAI,IAAAC,MAAA,CACXlD,uBAAuB,kBAAAkD,MAAA,CAAekH,gBAAgB,eAAAlH,MAAA,CAAYiH,UAAU,CACjF,CAAC;UACDV,MAAI,CAAC7C,iBAAiB,CAAC3C,YAAY,EAAE4C,QAAQ,EAAE/C,cAAc,CAAC;QAChE,CAAC,EACD,UAACQ,GAAW;UAAA,OAAK0F,UAAU,CAAC1F,GAAG,CAAC;QAAA,CAClC,CAAC;QAED3E,IAAI,CAAC0K,WAAW,CACd,IAAIH,gBAAO,CAACI,mBAAmB,CAAC;UAC9BC,YAAY,EAAEd,MAAI,CAAChJ,MAAM,CAAC+J,gBAAgB;UAC1CC,QAAQ,EAAEhB,MAAI,CAAChJ,MAAM,CAACiK;QACxB,CAAC,CACH,CAAC;QAED,IAAIX,8BAA8B,EAAE;UAClCpK,IAAI,CAACgL,OAAO,CAAC;YAAA,OAAM,KAAK;UAAA,EAAC;QAC3B,CAAC,MAAM,IAAId,gBAAgB,IAAIC,iBAAiB,KAAK,IAAI,IAAIA,iBAAiB,GAAG,CAAC,EAAE;UAClFnK,IAAI,CAACiL,SAAS,CAACd,iBAAiB,CAAC;QACnC,CAAC,MAAM,IAAIL,MAAI,CAAChJ,MAAM,CAACoK,UAAU,EAAE;UACjClL,IAAI,CAACiL,SAAS,CAACnB,MAAI,CAAChJ,MAAM,CAACoK,UAAU,CAAC;QACxC;;QAEA;QACA,IAAIhH,oBAAoB,EAAE;UACxB4F,MAAI,CAACrI,6BAA6B,GAAGzB,IAAI;QAC3C,CAAC,MAAM;UACL8J,MAAI,CAACtI,WAAW,GAAGxB,IAAI;QACzB;QAEAA,IAAI,CAACyC,EAAE,CAAC,OAAO,EAAE,YAAM;UACrB,IAAMiF,GAAG,GAAGxD,oBAAoB,GAAG,qBAAqB,GAAG,YAAY;UAEvE4F,MAAI,CAAC5I,MAAM,CAACoC,IAAI,IAAAC,MAAA,CAAIlD,uBAAuB,QAAAkD,MAAA,CAAKmE,GAAG,aAAU,CAAC;UAC9DpC,MAAM,CAAC,IAAIrE,KAAK,iBAAAsC,MAAA,CAAiBmE,GAAG,aAAU,CAAC,CAAC;QAClD,CAAC,CAAC;QAEF1H,IAAI,CAACyC,EAAE,CAAC,UAAU,EAAE,UAACkC,GAAW,EAAK;UACnC,IAAIA,GAAG,EAAE;YACP,IAAIyF,8BAA8B,EAAE;cAClCN,MAAI,CAAC5I,MAAM,CAACoC,IAAI,IAAAC,MAAA,CACXlD,uBAAuB,uDAC5B,CAAC;cAED;YACF;YAEA,IAAM8K,MAAM,GAAGnL,IAAI,CAAC8H,aAAa,CAAC,CAAC;YACnC,IAAMsD,KAAK,GAAGC,IAAI,CAACC,GAAG,CACpBtL,IAAI,CAACuL,SAAS,CAACC,iBAAiB,EAChC1B,MAAI,CAAChJ,MAAM,CAACiK,cAAc,IAAIU,QAChC,CAAC;YAED,IAAMC,iBAAiB,GAAGxH,oBAAoB,GAAG,uBAAuB,GAAG,EAAE;YAE7E4F,MAAI,CAAC5I,MAAM,CAACoC,IAAI,IAAAC,MAAA,CACXlD,uBAAuB,QAAAkD,MAAA,CAAKmI,iBAAiB,2CAAAnI,MAAA,CAC9C4H,MAAM,GAAG,CAAC,UAAA5H,MAAA,CACL6H,KAAK,QACd,CAAC;YACD;YACA,IAAIO,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,aAAa,EAAE;cAC1C/B,MAAI,CAAC5I,MAAM,CAAC4K,KAAK,IAAAvI,MAAA,CAAIlD,uBAAuB,SAAMsE,GAAG,EAAEA,GAAG,CAACqD,KAAK,CAAC;YACnE;YAEA;UACF;UACA8B,MAAI,CAAC5I,MAAM,CAACoC,IAAI,IAAAC,MAAA,CAAIlD,uBAAuB,gBAAa,CAAC;QAC3D,CAAC,CAAC;QAEFL,IAAI,CAAC+L,KAAK,CAAC,CAAC;MACd,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA9J,GAAA;IAAAC,KAAA,EAKA,SAAQqC,SAASA,CAACnC,SAAiB,EAA4B;MAAA,SAAA4J,IAAA,GAAAlN,SAAA,CAAAC,MAAA,EAAvBkN,IAAI,OAAAC,KAAA,CAAAF,IAAA,OAAAA,IAAA,WAAAG,IAAA,MAAAA,IAAA,GAAAH,IAAA,EAAAG,IAAA;QAAJF,IAAI,CAAAE,IAAA,QAAArN,SAAA,CAAAqN,IAAA;MAAA;MAC1C,IAAI;QACF,IAAI,CAAC/J,SAAS,EAAE;UACd;QACF;QAEA,IAAI,CAACgK,IAAI,CAAAxN,KAAA,CAAT,IAAI,GAAMwD,SAAS,EAAAmB,MAAA,CAAK0I,IAAI,EAAC;MAC/B,CAAC,CAAC,OAAOpH,KAAK,EAAE;QACd;QACA,IAAI,CAAC3D,MAAM,CAAC2D,KAAK,IAAAtB,MAAA,CACZlD,uBAAuB,yCAC1BwE,KAAK,EACL,cAAc,GACbzC,SAAS,EAAAmB,MAAA,CAAK0I,IAAI,CACrB,CAAC;MACH;IACF;;IAEA;AACF;AACA;AACA;EAHE;IAAAhK,GAAA;IAAAC,KAAA,EAIA,SAAQoI,sBAAsBA,CAAA,EAAG;MAAA,IAAA+B,MAAA;MAC/B,IAAI,IAAI,CAACxK,iBAAiB,IAAI,CAAC,IAAI,CAACT,SAAS,EAAE;QAC7C;MACF;MAEA,IAAI,CAACS,iBAAiB,GAAGyK,WAAW,CAAC,YAAM;QACzCD,MAAI,CAAC9C,YAAY,CAAC,CAAC,CAAC7E,KAAK,CAAC,UAACG,KAAK,EAAK;UACnCwH,MAAI,CAACnL,MAAM,CAAC2D,KAAK,IAAAtB,MAAA,CAAIlD,uBAAuB,sCAAmCwE,KAAK,CAAC;QACvF,CAAC,CAAC;MACJ,CAAC,EAAEvE,yBAAyB,CAAC;IAC/B;;IAEA;AACF;AACA;EAFE;IAAA2B,GAAA;IAAAC,KAAA,EAGA,SAAQ4E,qBAAqBA,CAAA,EAAG;MAC9B,IAAI,CAAC,IAAI,CAACjF,iBAAiB,EAAE;QAC3B;MACF;MAEA0K,aAAa,CAAC,IAAI,CAAC1K,iBAAiB,CAAC;MACrC,IAAI,CAACA,iBAAiB,GAAGd,SAAS;IACpC;;IAEA;AACF;AACA;AACA;EAHE;IAAAkB,GAAA;IAAAC,KAAA,EAIA,SAAQqH,YAAYA,CAAA,EAAqB;MAAA,IAAAiD,qBAAA;QAAAC,sBAAA;QAAAC,sBAAA;QAAAC,MAAA;MACvC,IAAI,IAAI,CAAC7K,oBAAoB,EAAE;QAC7B,OAAO,IAAI,CAACA,oBAAoB;MAClC;MAEA,IAAI,CAAC,IAAI,CAACV,SAAS,EAAE;QACnB,IAAI,CAAC0F,qBAAqB,CAAC,CAAC;QAE5B,OAAOzB,QAAA,CAAAlG,OAAA,CAAQ6G,OAAO,CAAC,CAAC;MAC1B;MAEA,IAAM4G,YAAY,GAAG,IAAI,CAAChM,KAAK,CAAC4H,WAAW,CAACqE,UAAU,IAAAL,qBAAA,GAClD,CAAAC,sBAAA,OAAI,CAAC7L,KAAK,CAAC4H,WAAW,EACnBJ,OAAO,cAAAoE,qBAAA,wBAAAE,sBAAA,GADVF,qBAAA,CAAAxM,IAAA,CAAAyM,sBAAA,EACa;QAAChE,KAAK,EAAE;MAAI,CAAC,CAAC,cAAAiE,sBAAA,uBAD3BA,sBAAA,CAEIjI,IAAI,CAAC;QAAA,OAAMkI,MAAI,CAAC/L,KAAK,CAAC4H,WAAW,CAACQ,YAAY,CAAC,CAAC;MAAA,EAAC,GACrD,IAAI,CAACpI,KAAK,CAAC4H,WAAW,CAACQ,YAAY,CAAC,CAAC;MAEzC,IAAI,CAAClH,oBAAoB,GAAG8K,YAAY,CACrCnI,IAAI,CAAC,UAACjE,KAAK,EAAK;QAAA,IAAAsM,aAAA;QACf,IAAI,CAACtM,KAAK,EAAE;UACV,MAAM,IAAIS,KAAK,CAAC,6CAA6C,CAAC;QAChE;QACA,IAAM8L,cAAc,GAAGxM,wBAAwB,CAACC,KAAK,CAAC8I,QAAQ,CAAC,CAAC,CAAC;QAEjE,IAAI,GAAAwD,aAAA,GAACH,MAAI,CAACpL,MAAM,cAAAuL,aAAA,eAAXA,aAAA,CAAa1L,SAAS,GAAE;UAC3BuL,MAAI,CAACzL,MAAM,CAAC0H,IAAI,IAAArF,MAAA,CACXlD,uBAAuB,sDAC5B,CAAC;UAED,OAAOU,SAAS;QAClB;QAEA,OAAO4L,MAAI,CAACpL,MAAM,CAAE6G,OAAO,CAAC2E,cAAc,CAAC;MAC7C,CAAC,CAAC,CACDrI,KAAK,CAAC,UAACG,KAAK,EAAK;QAChB8H,MAAI,CAACzL,MAAM,CAAC2D,KAAK,IAAAtB,MAAA,CACZlD,uBAAuB,gDAC1BwE,KACF,CAAC;QAED,MAAMA,KAAK;MACb,CAAC,CAAC,CACD2B,OAAO,CAAC,YAAM;QACbmG,MAAI,CAAC7K,oBAAoB,GAAGf,SAAS;MACvC,CAAC,CAAC;MAEJ,OAAO,IAAI,CAACe,oBAAoB;IAClC;EAAC;IAAAG,GAAA;IAAAC,KAAA;MAAA,IAAA8K,QAAA,OAAAC,kBAAA,CAAA9N,OAAA,eAAA+N,YAAA,CAAA/N,OAAA,CAAAgO,IAAA,CAED,SAAAC,QAAsB1K,KAAuB,EAAE2K,YAA4B;QAAA,IAAAC,aAAA;QAAA,IAAAC,aAAA,EAAA3I,MAAA,EAAAqB,SAAA,EAAAuH,cAAA,EAAAC,EAAA,EAAAC,GAAA;QAAA,OAAAR,YAAA,CAAA/N,OAAA,CAAAwO,IAAA,WAAAC,QAAA;UAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAA/J,IAAA;YAAA;cACnE0J,aAAa,GAAG;gBACpBO,IAAI,EAAE,kBAAkB;gBACxBC,MAAM,EAAE;cACV,CAAC;cAAAH,QAAA,CAAAC,IAAA;cAGOjJ,MAAM,GAAGlC,KAAK,CAACkC,MAAM,IAAIlC,KAAK,CAACkC,MAAM,CAACoJ,WAAW,CAAC,CAAC;cAGnDR,cAAc,GAAGH,YAAY,KAAK,IAAI,CAAC9L,MAAM;cACnD,IAAI8L,YAAY,EAAE;gBAChBpH,SAAS,GAAGoH,YAAY,CAAC7I,GAAG;cAC9B;;cAEA;cACA,IAAIgJ,cAAc,EAAE;gBAClB,IAAI,IAAI,CAACjM,MAAM,EAAE;kBACf,IAAI,CAACA,MAAM,CAACe,kBAAkB,CAAC,CAAC;kBAChC,IAAI,CAACf,MAAM,GAAGR,SAAS;kBACvB,IAAI,CAACwD,SAAS,CAAC,SAAS,EAAE7B,KAAK,CAAC;gBAClC;gBACA,IAAI,CAACrB,UAAU,GAAG,KAAK;gBACvB,IAAI,CAACD,SAAS,GAAG,KAAK;gBACtB,IAAI,CAAC0F,qBAAqB,CAAC,CAAC;cAC9B,CAAC,MAAM;gBACL;gBACA,IAAI,CAAC5F,MAAM,CAACoC,IAAI,8CAAAC,MAAA,CAA8Cb,KAAK,CAACmF,IAAI,GAAI0F,aAAa,CAAC;gBAC1F;gBACA,IAAIF,YAAY,EAAE;kBAChBA,YAAY,CAAC/K,kBAAkB,CAAC,CAAC;gBACnC;cACF;cAACmL,EAAA,GAEO/K,KAAK,CAACmF,IAAI;cAAA+F,QAAA,CAAA/J,IAAA,GAAA4J,EAAA,KACX,IAAI,OAAAA,EAAA,KAOJ,IAAI,OAAAA,EAAA,KAIJ,IAAI,OAAAA,EAAA,KAmBJ,IAAI,OAAAA,EAAA,KACJ,IAAI,OAAAA,EAAA,KAIJ,IAAI,OAAAA,EAAA,KACJ,IAAI,OAAAA,EAAA,KACJ,IAAI,OAAAA,EAAA,KACJ,IAAI,OAAAA,EAAA,KAOJ,IAAI,OAAAA,EAAA,KAeJ,IAAI,OAAAA,EAAA,KACJ,IAAI,OAAAA,EAAA,KACJ,IAAI,OAAAA,EAAA,KAKJ,IAAI;cAAA;YAAA;cAlEP,IAAI,CAACvM,MAAM,CAACoC,IAAI,uDAAAC,MAAA,CACwCb,KAAK,CAACkC,MAAM,GAClE2I,aACF,CAAC;cACD,IAAIC,cAAc,EAAE,IAAI,CAACjJ,SAAS,CAAC,mBAAmB,EAAE7B,KAAK,CAAC;cAAC,OAAAkL,QAAA,CAAAK,MAAA;YAAA;cAG/D,IAAI,CAAC/M,MAAM,CAACoC,IAAI,wCAAwCiK,aAAa,CAAC;cACtE,IAAIC,cAAc,EAAE,IAAI,CAACjJ,SAAS,CAAC,kBAAkB,EAAE7B,KAAK,CAAC;cAAC,OAAAkL,QAAA,CAAAK,MAAA;YAAA;cAG9D;cACA,IAAIT,cAAc,EAAE;gBAClB;gBACA;gBACA,IAAI,CAACtM,MAAM,CAAC0H,IAAI,+DAEd2E,aACF,CAAC;gBACD,IAAI,CAAChJ,SAAS,CAAC,mBAAmB,EAAE7B,KAAK,CAAC;cAC5C,CAAC,MAAM;gBACL;gBACA,IAAI,CAACxB,MAAM,CAACoC,IAAI,gFAEdiK,aACF,CAAC;gBACD,IAAI,CAAChJ,SAAS,CAAC,kBAAkB,EAAE7B,KAAK,CAAC;cAC3C;cAAC,OAAAkL,QAAA,CAAAK,MAAA;YAAA;cAID,IAAI,CAAC/M,MAAM,CAACoC,IAAI,yBAAAC,MAAA,CAAyBb,KAAK,CAACkC,MAAM,GAAI2I,aAAa,CAAC;cACvE,IAAIC,cAAc,EAAE,IAAI,CAACjJ,SAAS,CAAC,mBAAmB,EAAE7B,KAAK,CAAC;cAAC,OAAAkL,QAAA,CAAAK,MAAA;YAAA;cAM/D,IAAI,CAAC/M,MAAM,CAACoC,IAAI,sCAAsCiK,aAAa,CAAC;cACpE,IAAIC,cAAc,EAAE;gBAClB,IAAI,CAACjJ,SAAS,CAAC,mBAAmB,EAAE7B,KAAK,CAAC;gBAC1C,IAAI,CAACwL,SAAS,CAACjI,SAAS,CAAC;cAC3B;cAAC,OAAA2H,QAAA,CAAAK,MAAA;YAAA;cAGD,IAAIrJ,MAAM,IAAIxE,sBAAsB,CAAC+N,QAAQ,CAACvJ,MAAM,CAAC,EAAE;gBACrD,IAAI,CAAC1D,MAAM,CAACoC,IAAI,sCAAsCiK,aAAa,CAAC;gBACpE,IAAIC,cAAc,EAAE;kBAClB,IAAI,CAACjJ,SAAS,CAAC,mBAAmB,EAAE7B,KAAK,CAAC;kBAC1C,IAAI,CAACwL,SAAS,CAACjI,SAAS,CAAC;gBAC3B;cACF,CAAC,MAAM;gBACL,IAAI,CAAC/E,MAAM,CAACoC,IAAI,6CAAAC,MAAA,CAC8Bb,KAAK,CAACkC,MAAM,GACxD2I,aACF,CAAC;gBACD,IAAIC,cAAc,EAAE,IAAI,CAACjJ,SAAS,CAAC,mBAAmB,EAAE7B,KAAK,CAAC;cAChE;cAAC,OAAAkL,QAAA,CAAAK,MAAA;YAAA;cAKD,IAAI,CAAC/M,MAAM,CAAC2D,KAAK,wBAAAtB,MAAA,CAAwBb,KAAK,CAACmF,IAAI,GAAI0F,aAAa,CAAC;cAACK,QAAA,CAAA/J,IAAA;cAAA,OAChE,IAAI,CAAC0F,YAAY,CAAC,CAAC;YAAA;cAAAqE,QAAA,CAAA/J,IAAA;cAAA,OACnB,IAAI,CAACqK,SAAS,EAAAZ,aAAA,GAAC,IAAI,CAAC/L,MAAM,cAAA+L,aAAA,uBAAXA,aAAA,CAAa9I,GAAG,CAAC;YAAA;cAAA,OAAAoJ,QAAA,CAAAK,MAAA;YAAA;cAGtC;cACA,IAAI,CAAC/M,MAAM,CAAC2D,KAAK,kCAAAtB,MAAA,CAAkCb,KAAK,CAACmF,IAAI,GAAI0F,aAAa,CAAC;cAAC,OAAAK,QAAA,CAAAK,MAAA;YAAA;cAGhF,IAAI,CAAC/M,MAAM,CAACoC,IAAI,yDAAyDiK,aAAa,CAAC;cACvF,IAAIC,cAAc,EAAE,IAAI,CAACjJ,SAAS,CAAC,mBAAmB,EAAE7B,KAAK,CAAC;YAAC;cAAAkL,QAAA,CAAA/J,IAAA;cAAA;YAAA;cAAA+J,QAAA,CAAAC,IAAA;cAAAH,GAAA,GAAAE,QAAA;cAGnE,IAAI,CAAC1M,MAAM,CAAC2D,KAAK,oCAAA6I,GAAA,EAA2CH,aAAa,CAAC;YAAC;YAAA;cAAA,OAAAK,QAAA,CAAAQ,IAAA;UAAA;QAAA,GAAAhB,OAAA;MAAA,CAE9E;MAAA,SAjHazK,OAAOA,CAAA0L,EAAA,EAAAC,GAAA;QAAA,OAAAtB,QAAA,CAAApO,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAP6D,OAAO;IAAA;EAAA;IAAAV,GAAA;IAAAC,KAAA,EAmHrB,SAAQU,SAASA,CAACF,KAAyC,EAAiB;MAC1E,IAAM6K,aAAa,GAAG;QACpBO,IAAI,EAAE,kBAAkB;QACxBC,MAAM,EAAE;MACV,CAAC;MAED,IAAMjL,QAAQ,GAAGJ,KAAK,CAAC6L,IAAI;MAE3B,IAAI,CAACrN,MAAM,CAAC4K,KAAK,uBAAuBhJ,QAAQ,EAAEyK,aAAa,CAAC;;MAEhE;MACA,IAAIzK,QAAQ,IAAIA,QAAQ,CAACC,IAAI,KAAK,UAAU,EAAE;QAC5C,IAAI,CAAC7B,MAAM,CAACoC,IAAI,kDAAkDiK,aAAa,CAAC;QAChF,IAAI,CAAChJ,SAAS,CAAC,gCAAgC,EAAEzB,QAAQ,CAAC,CAAC,CAAC;;QAE5D,IAAI,CAACgB,sBAAsB,CAAC,CAAC;QAE7B,OAAOuB,QAAA,CAAAlG,OAAA,CAAQ6G,OAAO,CAAC,CAAC;MAC1B;MAEA,IAAI,IAAI,CAACnD,yCAAyC,CAACC,QAAQ,CAAC,EAAE;QAC5D,OAAOuC,QAAA,CAAAlG,OAAA,CAAQ6G,OAAO,CAAC,CAAC;MAC1B;;MAEA;MACA,IAAIlD,QAAQ,CAACC,IAAI,EAAE;QACjB,IAAI,CAACwB,SAAS,UAAAhB,MAAA,CAAUT,QAAQ,CAACC,IAAI,GAAID,QAAQ,CAAC;MACpD;;MAEA;MACA,IAAMyL,IAAoB,GAAIzL,QAAQ,CAACyL,IAAI,IAAuBzL,QAAQ;;MAE1E;MACA,IAAM0L,SAA6B,GACjC,CAACD,IAAI,aAAJA,IAAI,uBAAJA,IAAI,CAAEC,SAAS,KAAgB1L,QAAQ,CAAC0L,SAAoB;MAE/D,IAAI,CAACA,SAAS,EAAE;QACd,IAAI,CAACjK,SAAS,CAAC,OAAO,EAAEzB,QAAQ,CAAC;QAEjC,OAAOuC,QAAA,CAAAlG,OAAA,CAAQ6G,OAAO,CAAC,CAAC;MAC1B;MAEA,IAAI;QACF;QACA,IAAI,CAACzB,SAAS,CAAC,OAAO,EAAEzB,QAAQ,CAAC;QACjC,IAAA2L,gBAAA,GAAoBD,SAAS,CAACE,KAAK,CAAC,GAAG,CAAC;UAAAC,iBAAA,OAAAxF,eAAA,CAAAhK,OAAA,EAAAsP,gBAAA;UAAjCG,SAAS,GAAAD,iBAAA;QAChB,IAAI,CAACpK,SAAS,UAAAhB,MAAA,CAAUqL,SAAS,GAAI9L,QAAQ,CAAC;QAE9C,IAAI8L,SAAS,KAAKJ,SAAS,EAAE;UAC3B,IAAI,CAACjK,SAAS,UAAAhB,MAAA,CAAUiL,SAAS,GAAI1L,QAAQ,CAAC;QAChD;MACF,CAAC,CAAC,OAAO8B,MAAM,EAAE;QACf,IAAI,CAAC1D,MAAM,CAAC2D,KAAK,6CAA6CD,MAAM,EAAE2I,aAAa,CAAC;MACtF;MAEA,OAAOlI,QAAA,CAAAlG,OAAA,CAAQ6G,OAAO,CAAC,CAAC;IAC1B;EAAC;IAAA/D,GAAA;IAAAC,KAAA,EAED,SAAQgM,SAASA,CAAC5J,YAAgC,EAAiB;MACjE,IAAI,CAACpD,MAAM,CAACoC,IAAI,iBAAiB;QAACwK,IAAI,EAAE,kBAAkB;QAAEC,MAAM,EAAE;MAAW,CAAC,CAAC;MAEjF,OAAO,IAAI,CAACrI,OAAO,CAACpB,YAAY,IAAI,IAAI,CAAC2B,SAAS,CAAC;IACrD;EAAC;AAAA,EA94BwB4I,oBAAY;AAAA,IAAAC,QAAA,GAAAC,OAAA,CAAA5P,OAAA,GAi5BxBuB,YAAY","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_events","require","_backoff","_interopRequireDefault","_socket","_errors","_constants","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","Boolean","prototype","valueOf","call","_superPropGet","p","_get2","normalReconnectReasons","MOBIUS_SOCKET_NAMESPACE","TOKEN_REFRESH_INTERVAL_MS","normalizeMobiusAuthToken","token","replace","MobiusSocket","_EventEmitter","webex","_this","config","undefined","_classCallCheck2","Error","logger","console","connected","connecting","hasEverConnected","socket","backoffCall","shutdownSwitchoverBackoffCall","seenAsyncEventIds","_map","connectPromise","tokenRefreshTimer","tokenRefreshInFlight","_inherits2","_createClass2","key","value","off","eventName","listener","removeAllListeners","attachSocketEventListeners","_this2","on","event","onclose","onmessage","trackAsyncEventAndShouldSuppressDuplicate","envelope","type","eventId","has","previousValue","get","delete","set","info","concat","log","dedupCacheMaxSize","size","oldestEventId","keys","next","handleImminentShutdown","_this3","oldSocket","connectWithBackoff","isShutdownSwitchover","attemptOptions","onSuccess","newSocket","webSocketUrl","emitEvent","url","then","catch","err","reason","error","getConnectedWebSocketUrl","_this$socket","sendWssRequest","payload","options","_typeof2","_isArray","_promise","reject","sendRequest","timeout","isConnected","connect","_this$socket2","_this$socket3","_this$webex$internal$","_this$webex$internal$2","_this4","resolve","socketUrl","Number","initialConnectionMaxRetries","internal","device","registered","register","finally","disconnect","_this5","_stringify","abort","clear","stopTokenRefreshTimer","close","prepareUrl","attemptConnection","callback","_this6","_options$isShutdownSw","_options$attemptOptio","_attemptOptions$onSuc","Socket","newWSUrl","mode","msg","prepareAndOpenSocket","backoffCallNormal","code","getNumRetries","retries","stack","UnknownResponse","_this6$webex$internal","_this6$webex$internal2","refresh","NotAuthorized","_this6$webex$credenti","_this6$webex$credenti2","credentials","force","BadRequest","Forbidden","warn","_this7","logPrefix","all","getUserToken","_ref","_ref2","_slicedToArray2","forceCloseDelay","wssResponseTimeout","toString","refreshToken","trackingId","sessionId","_now","defaultMobiusSocketOptions","customOptionsMsg","open","_this8","context","_context$isShutdownSw","_context$attemptOptio","isInitialConnect","initialRetryLimit","isInitialConnectWithoutRetries","onComplete","startTokenRefreshTimer","backoff","attemptNum","attemptLogPrefix","setStrategy","ExponentialStrategy","initialDelay","backoffTimeReset","maxDelay","backoffTimeMax","retryIf","failAfter","maxRetries","number","delay","Math","min","strategy_","nextBackoffDelay_","Infinity","callbackLogPrefix","process","env","NODE_ENV","debug","start","_len","args","Array","_key","emit","_this9","setInterval","clearInterval","_this$webex$credentia","_this$webex$credentia2","_this$webex$credentia3","_this0","tokenPromise","canRefresh","_this0$socket","refreshedToken","_onclose","_asyncToGenerator2","_regenerator","mark","_callee","sourceSocket","_this1","_this$socket4","loggerContext","isActiveSocket","_t","_t2","wrap","_context","prev","file","method","toLowerCase","abrupt","MOBIUS_SOCKET_4001_EVENT","reconnect","includes","stop","_x","_x2","data","eventType","_eventType$split","split","_eventType$split2","namespace","EventEmitter","_default","exports"],"sources":["mobius-socket.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file\n */\n\nimport {EventEmitter} from 'events';\n// @ts-ignore - backoff library does not have type definitions\nimport backoff from 'backoff';\n\nimport type {WebexSDK} from '../SDKConnector/types';\nimport Socket from './socket';\nimport {BadRequest, Forbidden, NotAuthorized, UnknownResponse} from './errors';\nimport type {MobiusSocketConfig} from './config';\nimport type {SocketCloseEvent, SocketMessageEvent, SocketResponse} from './socket/types';\nimport type {\n MobiusSocketCloseOptions,\n MobiusSocketDisconnectResult,\n MobiusSocketRequestOptions,\n MobiusSocketRequestPayload,\n} from './types';\nimport {MOBIUS_SOCKET_4001_EVENT} from './socket/constants';\n\nconst normalReconnectReasons = ['idle', 'done (forced)'];\nconst MOBIUS_SOCKET_NAMESPACE = 'MobiusSocket';\nconst TOKEN_REFRESH_INTERVAL_MS = 1 * 60 * 60 * 1000; // 1 hour\n\ntype MobiusSocketLogger = Pick<Console, 'debug' | 'error' | 'info' | 'log' | 'warn'>;\n\n// Extended Socket type with dynamic properties\ntype ExtendedSocket = Socket & {\n connecting?: boolean;\n connected?: boolean;\n};\n\nfunction normalizeMobiusAuthToken(token: string) {\n return token.replace(/^Bearer\\s+/i, '');\n}\n\nclass MobiusSocket extends EventEmitter {\n private webex: WebexSDK;\n private config: Partial<MobiusSocketConfig>;\n private logger: MobiusSocketLogger;\n private connected: boolean;\n private connecting: boolean;\n private hasEverConnected: boolean;\n private socket: ExtendedSocket | undefined;\n private backoffCall: any; // backoff library has no types\n private shutdownSwitchoverBackoffCall: any; // backoff library has no types\n private seenAsyncEventIds: Map<string, boolean>;\n private connectPromise: Promise<void> | undefined;\n private socketUrl: string | undefined;\n private tokenRefreshTimer: NodeJS.Timeout | undefined;\n private tokenRefreshInFlight: Promise<unknown> | undefined;\n\n constructor(webex: WebexSDK, config: Partial<MobiusSocketConfig> = {}) {\n super();\n\n if (!webex) {\n throw new Error('A Webex instance is required when initializing MobiusSocket');\n }\n\n this.webex = webex;\n this.config = config;\n this.logger = (webex.logger as unknown as MobiusSocketLogger) || console;\n this.connected = false;\n this.connecting = false;\n this.hasEverConnected = false;\n this.socket = undefined;\n this.backoffCall = undefined;\n this.shutdownSwitchoverBackoffCall = undefined;\n this.seenAsyncEventIds = new Map();\n this.connectPromise = undefined;\n this.tokenRefreshTimer = undefined;\n this.tokenRefreshInFlight = undefined;\n }\n\n public off(eventName: string, listener?: (...args: unknown[]) => void) {\n if (listener) {\n return super.off(eventName, listener);\n }\n\n this.removeAllListeners(eventName);\n\n return this;\n }\n\n /**\n * Attach event listeners to a socket.\n * @param socket - The socket to attach listeners to\n */\n private attachSocketEventListeners(socket: ExtendedSocket): void {\n socket.on('close', (event: SocketCloseEvent) => this.onclose(event, socket));\n socket.on('message', (event: SocketMessageEvent<SocketResponse>) => this.onmessage(event));\n }\n\n /**\n * Tracks a newly seen async_event ID and reports whether a duplicate should be suppressed.\n * @param envelope - Parsed websocket message envelope\n * @returns True when the event has already been seen\n */\n private trackAsyncEventAndShouldSuppressDuplicate(envelope: SocketResponse): boolean {\n if (envelope?.type !== 'async_event' || !envelope.eventId) {\n return false;\n }\n\n if (this.seenAsyncEventIds.has(envelope.eventId)) {\n // Refresh recency so frequently retransmitted eventIds stay protected longer.\n // This deletion and setting again makes the data recent since javascript map maintains order as well\n const previousValue = this.seenAsyncEventIds.get(envelope.eventId) || true;\n this.seenAsyncEventIds.delete(envelope.eventId);\n this.seenAsyncEventIds.set(envelope.eventId, previousValue);\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: duplicate async_event suppressed, eventId=${envelope.eventId}`\n );\n\n return true;\n }\n\n this.logger.log(\n `${MOBIUS_SOCKET_NAMESPACE}: tracking async_event, eventId=${envelope.eventId}`\n );\n this.seenAsyncEventIds.set(envelope.eventId, true);\n\n if (\n this.config.dedupCacheMaxSize &&\n this.seenAsyncEventIds.size > this.config.dedupCacheMaxSize\n ) {\n const oldestEventId = this.seenAsyncEventIds.keys().next().value || '';\n\n this.seenAsyncEventIds.delete(oldestEventId);\n this.logger.log(\n `${MOBIUS_SOCKET_NAMESPACE}: evicted oldest async_event from dedup cache, eventId=${oldestEventId}`\n );\n }\n\n return false;\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 */\n private handleImminentShutdown() {\n const oldSocket = this.socket;\n\n try {\n if (this.shutdownSwitchoverBackoffCall) {\n this.logger.info(`${MOBIUS_SOCKET_NAMESPACE}: [shutdown] switchover already in progress`);\n\n return;\n }\n\n this.logger.info(`${MOBIUS_SOCKET_NAMESPACE}: [shutdown] switchover start`);\n\n this.connectWithBackoff(undefined, {\n isShutdownSwitchover: true,\n attemptOptions: {\n isShutdownSwitchover: true,\n onSuccess: (newSocket, webSocketUrl) => {\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: [shutdown] switchover connected, url: ${webSocketUrl}`\n );\n\n // Promote the new socket now that the switchover succeeded\n newSocket.connecting = false;\n newSocket.connected = true;\n this.socket = newSocket;\n this.connected = true;\n\n this.emitEvent('event:mobius_shutdown_switchover_complete', {\n url: webSocketUrl,\n });\n\n if (oldSocket) {\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: [shutdown] old socket retained; server will close with 4001`\n );\n }\n },\n },\n })\n .then(() => {\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: [shutdown] switchover completed successfully`\n );\n })\n .catch((err) => {\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: [shutdown] switchover exhausted retries; will fall back to normal reconnection: `,\n err\n );\n this.emitEvent('event:mobius_shutdown_switchover_failed', {reason: err});\n });\n } catch (e) {\n this.logger.error(`${MOBIUS_SOCKET_NAMESPACE}: [shutdown] error during switchover`, e);\n this.shutdownSwitchoverBackoffCall = undefined;\n this.emitEvent('event:mobius_shutdown_switchover_failed', {reason: e});\n }\n }\n\n /**\n * Get the websocket URL for the currently connected socket.\n * @returns The connected websocket URL, or undefined when not connected\n */\n public getConnectedWebSocketUrl(): string | undefined {\n if (!this.socket?.connected) {\n return undefined;\n }\n\n return this.socket.url;\n }\n\n /**\n * Sends a websocket request and resolves when the matching response arrives.\n * @param payload - The websocket request payload\n * @param options - Additional request options\n * @returns Promise that resolves with the socket response\n */\n public sendWssRequest(\n payload: MobiusSocketRequestPayload,\n options: MobiusSocketRequestOptions = {}\n ): Promise<SocketResponse> {\n if (!payload || typeof payload !== 'object' || Array.isArray(payload)) {\n return Promise.reject(new Error('`payload` is required'));\n }\n\n if (!this.socket || !this.socket.connected) {\n return Promise.reject(new Error('Mobius socket is not connected'));\n }\n\n return this.socket.sendRequest(payload, {timeout: options.timeout});\n }\n\n /**\n * Check if the socket is connected.\n * @returns True if connected\n */\n public isConnected(): boolean {\n return this.connected;\n }\n\n /**\n * Connect to Mobius.\n * @param webSocketUrl - Optional websocket URL override. Falls back to the device websocket URL\n * @returns Promise that resolves when connection flow completes\n */\n public connect(webSocketUrl?: string): Promise<void> {\n if (this.connectPromise) {\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: connection already in progress, returning existing promise`\n );\n\n return this.connectPromise;\n }\n\n if (this.socket?.connected || this.socket?.connecting) {\n this.logger.info(`${MOBIUS_SOCKET_NAMESPACE}: already connected, will not connect again`);\n\n return Promise.resolve();\n }\n\n // Treat a connect() call that targets a different Mobius websocket URL\n // as a fresh initial connection for retry purposes.\n if (webSocketUrl && this.socketUrl && webSocketUrl !== this.socketUrl) {\n this.hasEverConnected = false;\n }\n\n // Cache the caller-provided URL for reconnect\n if (webSocketUrl) {\n this.socketUrl = webSocketUrl;\n }\n\n this.connecting = true;\n\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: starting connection attempt${\n Number(this.config.initialConnectionMaxRetries) === 0 && !this.hasEverConnected\n ? ' (initial retries disabled)'\n : ''\n }`\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(`${MOBIUS_SOCKET_NAMESPACE}: connecting`);\n\n return this.connectWithBackoff(this.socketUrl);\n })\n .finally(() => {\n this.connectPromise = undefined;\n });\n\n this.connectPromise = connectPromise;\n\n return connectPromise;\n }\n\n /**\n * Disconnect the Mobius socket.\n * @param options - Optional websocket close options (code, reason)\n * @returns Promise that resolves after disconnect cleanup and close handling complete\n */\n public disconnect(options?: MobiusSocketCloseOptions): MobiusSocketDisconnectResult {\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}#disconnect: connecting state: ${this.connecting},\n connected state: ${this.connected}, socket exists: ${!!this.socket},\n options: ${JSON.stringify(options)}`\n );\n\n if (this.backoffCall) {\n this.logger.info(`${MOBIUS_SOCKET_NAMESPACE}: aborting connection`);\n this.backoffCall.abort();\n this.backoffCall = undefined;\n }\n\n if (this.shutdownSwitchoverBackoffCall) {\n this.logger.info(`${MOBIUS_SOCKET_NAMESPACE}: aborting shutdown switchover connection`);\n this.shutdownSwitchoverBackoffCall.abort();\n this.shutdownSwitchoverBackoffCall = undefined;\n }\n\n this.connectPromise = undefined;\n this.seenAsyncEventIds.clear();\n\n if (!this.socket) {\n this.connected = false;\n this.stopTokenRefreshTimer();\n\n return Promise.resolve();\n }\n\n this.socket.removeAllListeners('message');\n this.socket.connecting = false;\n this.socket.connected = false;\n\n return Promise.resolve(this.socket.close(options || undefined)).finally(() => {\n this.connected = false;\n this.stopTokenRefreshTimer();\n });\n }\n\n private prepareUrl(webSocketUrl: string | undefined): Promise<string> {\n if (!webSocketUrl) {\n // TODO: Circle back to this logic when mobius implements the shutdown switchover\n webSocketUrl = this.webex.internal.device.webSocketUrl || '';\n }\n\n return Promise.resolve(webSocketUrl);\n }\n\n private attemptConnection(\n socketUrl: string | undefined,\n callback: (err?: Error) => void,\n options: {\n isShutdownSwitchover?: boolean;\n attemptOptions?: {\n isShutdownSwitchover?: boolean;\n onSuccess?: ((socket: ExtendedSocket, url: string) => void) | null;\n };\n } = {}\n ): Promise<void | Error> {\n const {isShutdownSwitchover = false, attemptOptions = {}} = options;\n const {onSuccess = null} = attemptOptions;\n\n const socket = new Socket() as ExtendedSocket;\n socket.connecting = true;\n let newWSUrl: string | undefined;\n\n this.attachSocketEventListeners(socket);\n\n const backoffCall = isShutdownSwitchover\n ? this.shutdownSwitchoverBackoffCall\n : this.backoffCall;\n\n // Check appropriate backoff call based on connection type\n if (!backoffCall) {\n const mode = isShutdownSwitchover ? 'switchover backoff call' : 'backoffCall';\n const msg = `${MOBIUS_SOCKET_NAMESPACE}: prevent socket open when ${mode} no longer defined`;\n const err = new Error(msg);\n\n this.logger.info(msg);\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.socket = socket;\n }\n\n return this.prepareAndOpenSocket(socket, socketUrl, isShutdownSwitchover)\n .then((webSocketUrl) => {\n newWSUrl = webSocketUrl;\n\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: ${\n isShutdownSwitchover ? '[shutdown] switchover' : ''\n } connected to mobius socket, success, 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 Promise.resolve();\n })\n .catch((reason) => {\n // For shutdown, simpler error handling - just callback for retry\n if (isShutdownSwitchover) {\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: [shutdown] switchover attempt failed`,\n reason\n );\n\n return callback(reason as Error);\n }\n\n // Normal connection error handling\n const backoffCallNormal = this.backoffCall;\n // Suppress connection errors that appear to be network related (code 1006).\n if (reason.code !== 1006 && backoffCallNormal && backoffCallNormal?.getNumRetries() > 0) {\n this.emitEvent('connection_failed', reason, {\n retries: backoffCallNormal?.getNumRetries(),\n });\n }\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: connection attempt failed`,\n reason,\n backoffCallNormal?.getNumRetries() === 0 ? reason.stack : ''\n );\n\n // UnknownResponse is produced by IE for any 4XXX; treat 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 `${MOBIUS_SOCKET_NAMESPACE}: received unknown response code, refreshing device registration`\n );\n\n return this.webex.internal.device\n .refresh?.()\n .then(() => callback(reason as unknown as Error));\n }\n // NotAuthorized implies expired token\n if (reason instanceof NotAuthorized) {\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: received authorization error, reauthorizing`\n );\n\n return this.webex.credentials\n .refresh?.({force: true})\n .then(() => callback(reason as unknown as Error));\n }\n if (reason instanceof BadRequest || reason instanceof Forbidden) {\n this.logger.warn(\n `${MOBIUS_SOCKET_NAMESPACE}: received unrecoverable response from ${MOBIUS_SOCKET_NAMESPACE}`\n );\n backoffCallNormal?.abort();\n\n return callback(reason as unknown as Error);\n }\n\n return callback(reason as unknown as Error);\n })\n .catch((reason) => {\n this.logger.error(\n `${MOBIUS_SOCKET_NAMESPACE}: failed to handle connection failure`,\n reason\n );\n callback(reason);\n });\n }\n\n private prepareAndOpenSocket(\n socket: ExtendedSocket,\n socketUrl: string | undefined,\n isShutdownSwitchover = false\n ): Promise<string> {\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: any = {\n forceCloseDelay: this.config.forceCloseDelay,\n wssResponseTimeout: this.config.wssResponseTimeout,\n token: normalizeMobiusAuthToken(token.toString()),\n refreshToken: () => this.refreshToken(),\n trackingId: `${this.webex.sessionId}_${Date.now()}`,\n logger: this.logger,\n };\n\n if (this.webex.config.defaultMobiusSocketOptions) {\n const customOptionsMsg = isShutdownSwitchover\n ? 'setting custom options for switchover'\n : 'setting custom options';\n\n this.logger.info(`${MOBIUS_SOCKET_NAMESPACE}: ${customOptionsMsg}`);\n options = {...options, ...this.webex.config.defaultMobiusSocketOptions};\n }\n\n // Only promote the socket reference for normal connections.\n // Shutdown switchover keeps the old socket active until the new one succeeds.\n if (!isShutdownSwitchover) {\n this.socket = socket;\n }\n\n this.logger.info(`${MOBIUS_SOCKET_NAMESPACE} ${logPrefix} url: ${webSocketUrl}`);\n\n return socket.open(webSocketUrl, options).then(() => webSocketUrl);\n }\n );\n }\n\n private connectWithBackoff(\n webSocketUrl: string | undefined,\n // TODO: type for context can be moved out, it's repeated\n context: {\n isShutdownSwitchover?: boolean;\n attemptOptions?: {\n isShutdownSwitchover?: boolean;\n onSuccess?: ((socket: ExtendedSocket, url: string) => void) | null;\n };\n } = {}\n ): Promise<void> {\n const {isShutdownSwitchover = false, attemptOptions = {}} = context;\n\n return new Promise((resolve, reject) => {\n let call: any;\n const isInitialConnect = !isShutdownSwitchover && !this.hasEverConnected;\n const initialRetryLimit =\n this.config.initialConnectionMaxRetries == null\n ? null\n : Number(this.config.initialConnectionMaxRetries);\n const isInitialConnectWithoutRetries = isInitialConnect && initialRetryLimit === 0;\n\n const onComplete = (err?: Error) => {\n if (isShutdownSwitchover) {\n this.shutdownSwitchoverBackoffCall = undefined;\n } else {\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(`${MOBIUS_SOCKET_NAMESPACE}: ${msg}; ${err}`);\n // Only mutate socket flags for normal connections.\n // During shutdown switchover, this.socket is the old live socket — don't touch it.\n if (!isShutdownSwitchover && this.socket) {\n this.socket.connecting = false;\n this.socket.connected = false;\n }\n\n return reject(err);\n }\n\n // For normal connections, mark the socket as connected.\n // Shutdown switchover promotion is handled by the onSuccess callback.\n if (!isShutdownSwitchover && this.socket) {\n this.socket.connecting = false;\n this.socket.connected = true;\n }\n\n if (!isShutdownSwitchover) {\n this.connecting = false;\n this.connected = true;\n this.hasEverConnected = true;\n this.startTokenRefreshTimer();\n this.emitEvent('online');\n }\n\n return resolve();\n };\n // eslint-disable-next-line prefer-reflect\n call = backoff.call(\n (callback: (err?: Error) => void) => {\n const attemptNum = call.getNumRetries();\n const attemptLogPrefix = isShutdownSwitchover ? '[shutdown] switchover' : 'connection';\n\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: executing ${attemptLogPrefix} attempt ${attemptNum}`\n );\n this.attemptConnection(webSocketUrl, callback, attemptOptions);\n },\n (err?: Error) => onComplete(err)\n );\n\n call.setStrategy(\n new backoff.ExponentialStrategy({\n initialDelay: this.config.backoffTimeReset,\n maxDelay: this.config.backoffTimeMax,\n })\n );\n\n if (isInitialConnectWithoutRetries) {\n call.retryIf(() => false);\n } else if (isInitialConnect && initialRetryLimit !== null && initialRetryLimit > 0) {\n call.failAfter(initialRetryLimit);\n } else if (this.config.maxRetries) {\n call.failAfter(this.config.maxRetries);\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.on('abort', () => {\n const msg = isShutdownSwitchover ? 'Shutdown Switchover' : 'Connection';\n\n this.logger.info(`${MOBIUS_SOCKET_NAMESPACE}: ${msg} aborted`);\n reject(new Error(`MobiusSocket ${msg} Aborted`));\n });\n\n call.on('callback', (err?: Error) => {\n if (err) {\n if (isInitialConnectWithoutRetries) {\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: initial connect failed; retries already disabled`\n );\n\n return;\n }\n\n const number = call.getNumRetries();\n const delay = Math.min(\n call.strategy_.nextBackoffDelay_,\n this.config.backoffTimeMax || Infinity\n );\n\n const callbackLogPrefix = isShutdownSwitchover ? '[shutdown] switchover' : '';\n\n this.logger.info(\n `${MOBIUS_SOCKET_NAMESPACE}: ${callbackLogPrefix} 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(`${MOBIUS_SOCKET_NAMESPACE}: `, err, err.stack);\n }\n\n return;\n }\n this.logger.info(`${MOBIUS_SOCKET_NAMESPACE}: connected`);\n });\n\n call.start();\n });\n }\n\n /**\n * Safely emits an event, catching and logging any errors from event handlers.\n * @param eventName - The name of the event to emit\n * @param args - Arguments to pass to event handlers\n */\n private emitEvent(eventName: string, ...args: unknown[]): void {\n try {\n if (!eventName) {\n return;\n }\n\n this.emit(eventName, ...args);\n } catch (error) {\n // Safely handle errors without causing additional issues during cleanup\n this.logger.error(\n `${MOBIUS_SOCKET_NAMESPACE}: error occurred in event handler:`,\n error,\n ' with args: ',\n [eventName, ...args]\n );\n }\n }\n\n /**\n * Starts a periodic timer to refresh the authentication token.\n * Token refresh occurs every hour while connected.\n */\n private startTokenRefreshTimer() {\n if (this.tokenRefreshTimer || !this.connected) {\n return;\n }\n\n this.tokenRefreshTimer = setInterval(() => {\n this.refreshToken().catch((error) => {\n this.logger.error(`${MOBIUS_SOCKET_NAMESPACE}: periodic token refresh failed`, error);\n });\n }, TOKEN_REFRESH_INTERVAL_MS);\n }\n\n /**\n * Stops the periodic token refresh timer.\n */\n private stopTokenRefreshTimer() {\n if (!this.tokenRefreshTimer) {\n return;\n }\n\n clearInterval(this.tokenRefreshTimer);\n this.tokenRefreshTimer = undefined;\n }\n\n /**\n * Refreshes the authentication token and re-authenticates the socket connection.\n * @returns Promise that resolves when token refresh and re-authentication complete\n */\n private refreshToken(): Promise<unknown> {\n if (this.tokenRefreshInFlight) {\n return this.tokenRefreshInFlight;\n }\n\n if (!this.connected) {\n this.stopTokenRefreshTimer();\n\n return Promise.resolve();\n }\n\n const tokenPromise = this.webex.credentials.canRefresh\n ? this.webex.credentials\n .refresh?.({force: true})\n ?.then(() => this.webex.credentials.getUserToken())\n : this.webex.credentials.getUserToken();\n\n this.tokenRefreshInFlight = tokenPromise!\n .then((token) => {\n if (!token) {\n throw new Error('Mobius token refresh did not return a token');\n }\n const refreshedToken = normalizeMobiusAuthToken(token.toString());\n\n if (!this.socket?.connected) {\n this.logger.warn(\n `${MOBIUS_SOCKET_NAMESPACE}: socket is not connected, skipping token refresh`\n );\n\n return undefined;\n }\n\n return this.socket!.refresh(refreshedToken);\n })\n .catch((error) => {\n this.logger.error(\n `${MOBIUS_SOCKET_NAMESPACE}: failed to refresh/re-auth Mobius socket`,\n error\n );\n\n throw error;\n })\n .finally(() => {\n this.tokenRefreshInFlight = undefined;\n });\n\n return this.tokenRefreshInFlight;\n }\n\n private async onclose(event: SocketCloseEvent, sourceSocket: ExtendedSocket): Promise<void> {\n const loggerContext = {\n file: 'mobius-socket.ts',\n method: 'onclose',\n };\n\n try {\n const reason = event.reason && event.reason.toLowerCase();\n let socketUrl: string | undefined;\n\n const isActiveSocket = sourceSocket === this.socket;\n if (sourceSocket) {\n socketUrl = sourceSocket.url;\n }\n\n // Only tear down state if the currently active socket closed\n if (isActiveSocket) {\n if (this.socket) {\n this.socket.removeAllListeners();\n this.socket = undefined;\n this.emitEvent('offline', event);\n }\n this.connecting = false;\n this.connected = false;\n this.stopTokenRefreshTimer();\n } else {\n // Old socket closed; do not flip connection state\n this.logger.info(`[shutdown] non-active socket closed, code=${event.code}`, loggerContext);\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 this.logger.info(\n `service rejected last message; will not reconnect: ${event.reason}`,\n loggerContext\n );\n if (isActiveSocket) this.emitEvent('offline.permanent', event);\n break;\n case 4000:\n this.logger.info(`socket replaced; will not reconnect`, loggerContext);\n if (isActiveSocket) this.emitEvent('offline.replaced', event);\n break;\n case 4001:\n // Handle the same way we do for registration.down event from Mobius.\n this.logger.info(`socket closed with 4001; will not reconnect`, loggerContext);\n this.emitEvent('event:async_event', MOBIUS_SOCKET_4001_EVENT);\n break;\n case 1000:\n case 1001:\n this.logger.info(`socket disconnected; ${event.reason}`, loggerContext);\n if (isActiveSocket) this.emitEvent('offline.permanent', event);\n break;\n case 1005:\n case 1006:\n case 1011:\n case 1012:\n this.logger.info(`socket disconnected; reconnecting`, loggerContext);\n if (isActiveSocket) {\n this.emitEvent('offline.transient', event);\n this.reconnect(socketUrl);\n }\n break;\n case 3050:\n if (reason && normalReconnectReasons.includes(reason)) {\n this.logger.info(`socket disconnected; reconnecting`, loggerContext);\n if (isActiveSocket) {\n this.emitEvent('offline.transient', event);\n this.reconnect(socketUrl);\n }\n } else {\n this.logger.info(\n `socket disconnected; will not reconnect: ${event.reason}`,\n loggerContext\n );\n if (isActiveSocket) this.emitEvent('offline.permanent', event);\n }\n break;\n case 4401:\n case 4403:\n case 4404:\n this.logger.error(`onclose, statusCode=${event.code}`, loggerContext);\n await this.refreshToken().catch((error) => {\n this.logger.error(`${MOBIUS_SOCKET_NAMESPACE}: periodic token refresh failed`, error);\n });\n await this.reconnect(this.socket?.url);\n break;\n case 4429:\n // Silently ignore too many requests\n this.logger.error(`too many requests, statusCode=${event.code}`, loggerContext);\n break;\n default:\n this.logger.info(`socket disconnected unexpectedly; will not reconnect`, loggerContext);\n if (isActiveSocket) this.emitEvent('offline.permanent', event);\n }\n } catch (error) {\n this.logger.error(`error occurred in close handler`, error, loggerContext);\n }\n }\n\n private onmessage(event: SocketMessageEvent<SocketResponse>): Promise<void> {\n const loggerContext = {\n file: 'mobius-socket.ts',\n method: 'onmessage',\n };\n\n const envelope = event.data;\n\n this.logger.debug(`message envelope: `, envelope, loggerContext);\n\n // Handle shutdown message shape: { type: 'shutdown' }\n if (envelope && envelope.type === 'shutdown') {\n this.logger.info(`[shutdown] imminent shutdown message received`, loggerContext);\n this.emitEvent('event:mobius_shutdown_imminent', envelope); // This is not yet not implemented, keeping for future support\n\n this.handleImminentShutdown();\n\n return Promise.resolve();\n }\n\n if (this.trackAsyncEventAndShouldSuppressDuplicate(envelope)) {\n return Promise.resolve();\n }\n\n // Emit event:<type> for typed messages (e.g., register.response)\n if (envelope.type) {\n this.emitEvent(`event:${envelope.type}`, envelope);\n }\n\n // Use data/payload if present, otherwise treat the envelope itself as the data (flat format)\n const data: SocketResponse = (envelope.data as SocketResponse) || envelope;\n\n // Support both Mobius-enveloped (data.eventType) and flat (eventType) formats\n const eventType: string | undefined =\n (data?.eventType as string) || (envelope.eventType as string);\n\n if (!eventType) {\n this.emitEvent('event', envelope);\n\n return Promise.resolve();\n }\n\n try {\n // TODO: Remove if event:namespace is not required\n this.emitEvent('event', envelope);\n const [namespace] = eventType.split('.');\n this.emitEvent(`event:${namespace}`, envelope);\n\n if (namespace !== eventType) {\n this.emitEvent(`event:${eventType}`, envelope);\n }\n } catch (reason) {\n this.logger.error(`error occurred processing socket message`, reason, loggerContext);\n }\n\n return Promise.resolve();\n }\n\n private reconnect(webSocketUrl: string | undefined): Promise<void> {\n this.logger.info(`reconnecting`, {file: 'mobius-socket.ts', method: 'reconnect'});\n\n return this.connect(webSocketUrl || this.socketUrl);\n }\n}\n\nexport default MobiusSocket;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1295,43 +1295,47 @@ describe('plugin-mobius-socket', function () {
|
|
|
1295
1295
|
mobiusSocket.emitEvent.restore();
|
|
1296
1296
|
mobiusSocket.reconnect.restore();
|
|
1297
1297
|
});
|
|
1298
|
-
it('should handle active socket close with 4001 -
|
|
1298
|
+
it('should handle active socket close with 4001 - emits registration.down and tears down state', function () {
|
|
1299
1299
|
var closeEvent = {
|
|
1300
1300
|
code: 4001,
|
|
1301
1301
|
reason: 'replaced during shutdown'
|
|
1302
1302
|
};
|
|
1303
1303
|
mobiusSocket.onclose(closeEvent, mockSocket);
|
|
1304
|
-
_testHelperChai.assert.calledWith(mobiusSocket.emitEvent, 'offline
|
|
1304
|
+
_testHelperChai.assert.calledWith(mobiusSocket.emitEvent, 'offline', closeEvent);
|
|
1305
|
+
_testHelperChai.assert.calledWith(mobiusSocket.emitEvent, 'event:async_event', _constants.MOBIUS_SOCKET_4001_EVENT);
|
|
1306
|
+
_testHelperChai.assert.neverCalledWith(mobiusSocket.emitEvent, 'offline.permanent', closeEvent);
|
|
1305
1307
|
_testHelperChai.assert.notCalled(mobiusSocket.reconnect);
|
|
1306
1308
|
_testHelperChai.assert.isFalse(mobiusSocket.connected);
|
|
1307
1309
|
});
|
|
1308
|
-
it('should handle non-active socket close with 4001 -
|
|
1310
|
+
it('should handle non-active socket close with 4001 - emits registration.down without tearing down state', function () {
|
|
1309
1311
|
var closeEvent = {
|
|
1310
1312
|
code: 4001,
|
|
1311
1313
|
reason: 'replaced during shutdown'
|
|
1312
1314
|
};
|
|
1313
1315
|
mobiusSocket.onclose(closeEvent, anotherSocket);
|
|
1314
|
-
_testHelperChai.assert.calledWith(mobiusSocket.emitEvent, '
|
|
1316
|
+
_testHelperChai.assert.calledWith(mobiusSocket.emitEvent, 'event:async_event', _constants.MOBIUS_SOCKET_4001_EVENT);
|
|
1317
|
+
_testHelperChai.assert.neverCalledWith(mobiusSocket.emitEvent, 'offline.replaced', closeEvent);
|
|
1318
|
+
_testHelperChai.assert.neverCalledWith(mobiusSocket.emitEvent, 'offline', closeEvent);
|
|
1315
1319
|
_testHelperChai.assert.notCalled(mobiusSocket.reconnect);
|
|
1316
1320
|
_testHelperChai.assert.isTrue(mobiusSocket.connected);
|
|
1317
1321
|
_testHelperChai.assert.strictEqual(mobiusSocket.socket, mockSocket);
|
|
1318
1322
|
});
|
|
1319
|
-
it('should
|
|
1323
|
+
it('should emit registration.down for both active and non-active socket closes with 4001', function () {
|
|
1320
1324
|
var closeEvent = {
|
|
1321
1325
|
code: 4001,
|
|
1322
1326
|
reason: 'replaced during shutdown'
|
|
1323
1327
|
};
|
|
1324
1328
|
|
|
1325
|
-
//
|
|
1329
|
+
// Non-active socket: only registration.down is emitted (no 'offline')
|
|
1326
1330
|
mobiusSocket.onclose(closeEvent, anotherSocket);
|
|
1327
|
-
_testHelperChai.assert.calledWith(mobiusSocket.emitEvent, '
|
|
1328
|
-
|
|
1329
|
-
// Reset the spy call history
|
|
1331
|
+
_testHelperChai.assert.calledWith(mobiusSocket.emitEvent, 'event:async_event', _constants.MOBIUS_SOCKET_4001_EVENT);
|
|
1332
|
+
_testHelperChai.assert.neverCalledWith(mobiusSocket.emitEvent, 'offline', closeEvent);
|
|
1330
1333
|
mobiusSocket.emitEvent.resetHistory();
|
|
1331
1334
|
|
|
1332
|
-
//
|
|
1335
|
+
// Active socket: 'offline' is emitted alongside registration.down
|
|
1333
1336
|
mobiusSocket.onclose(closeEvent, mockSocket);
|
|
1334
|
-
_testHelperChai.assert.calledWith(mobiusSocket.emitEvent, 'offline
|
|
1337
|
+
_testHelperChai.assert.calledWith(mobiusSocket.emitEvent, 'offline', closeEvent);
|
|
1338
|
+
_testHelperChai.assert.calledWith(mobiusSocket.emitEvent, 'event:async_event', _constants.MOBIUS_SOCKET_4001_EVENT);
|
|
1335
1339
|
});
|
|
1336
1340
|
it('should handle missing sourceSocket parameter (treats as non-active)', function () {
|
|
1337
1341
|
var closeEvent = {
|
|
@@ -1339,7 +1343,8 @@ describe('plugin-mobius-socket', function () {
|
|
|
1339
1343
|
reason: 'replaced during shutdown'
|
|
1340
1344
|
};
|
|
1341
1345
|
mobiusSocket.onclose(closeEvent, undefined);
|
|
1342
|
-
_testHelperChai.assert.calledWith(mobiusSocket.emitEvent, '
|
|
1346
|
+
_testHelperChai.assert.calledWith(mobiusSocket.emitEvent, 'event:async_event', _constants.MOBIUS_SOCKET_4001_EVENT);
|
|
1347
|
+
_testHelperChai.assert.neverCalledWith(mobiusSocket.emitEvent, 'offline.replaced', closeEvent);
|
|
1343
1348
|
_testHelperChai.assert.notCalled(mobiusSocket.reconnect);
|
|
1344
1349
|
});
|
|
1345
1350
|
it('should clean up event listeners from non-active socket when it closes', function () {
|