@webex/calling 3.12.0-mobius-socket.19 → 3.12.0-mobius-socket.20
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/errors.js +47 -6
- package/dist/mobius-socket/errors.js.map +1 -1
- package/dist/mobius-socket/index.js +4 -10
- package/dist/mobius-socket/index.js.map +1 -1
- package/dist/mobius-socket/mobius-socket.js +151 -140
- package/dist/mobius-socket/mobius-socket.js.map +1 -1
- package/dist/mobius-socket/mobius-socket.test.js +18 -11
- package/dist/mobius-socket/mobius-socket.test.js.map +1 -1
- package/dist/mobius-socket/socket/constants.js +14 -0
- package/dist/mobius-socket/socket/constants.js.map +1 -1
- package/dist/mobius-socket/socket/socket-base.js +93 -138
- package/dist/mobius-socket/socket/socket-base.js.map +1 -1
- package/dist/mobius-socket/socket/types.js.map +1 -1
- package/dist/mobius-socket/socket.test.js +3 -3
- package/dist/mobius-socket/socket.test.js.map +1 -1
- package/dist/mobius-socket/types.js.map +1 -1
- package/dist/module/mobius-socket/errors.js +17 -0
- package/dist/module/mobius-socket/mobius-socket.js +39 -41
- package/dist/module/mobius-socket/socket/socket-base.js +26 -58
- package/dist/types/mobius-socket/errors.d.ts +4 -1
- package/dist/types/mobius-socket/errors.d.ts.map +1 -1
- package/dist/types/mobius-socket/index.d.ts.map +1 -1
- package/dist/types/mobius-socket/mobius-socket.d.ts +14 -1
- package/dist/types/mobius-socket/mobius-socket.d.ts.map +1 -1
- package/dist/types/mobius-socket/socket/constants.d.ts.map +1 -1
- package/dist/types/mobius-socket/socket/socket-base.d.ts +0 -1
- package/dist/types/mobius-socket/socket/socket-base.d.ts.map +1 -1
- package/dist/types/mobius-socket/socket/types.d.ts +0 -8
- package/dist/types/mobius-socket/socket/types.d.ts.map +1 -1
- package/dist/types/mobius-socket/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_events","require","_common","_commonTimers","_errors","_constants","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty3","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","Boolean","prototype","valueOf","call","sockets","_weakMap","Socket","exports","_EventEmitter","_this","_classCallCheck2","domain","pendingResponses","_map","onmessage","bind","onclose","setMaxListeners","_inherits2","_createClass2","key","get","binaryType","bufferedAmount","extensions","protocol","readyState","url","value","close","options","_this2","_promise","resolve","reject","socket","logger","info","concat","SOCKET_READY_STATE","CLOSING","CLOSED","originalCode","code","originalReason","reason","resolvedOptions","_defaults2","Error","closeTimer","safeSetTimeout","error","warn","forceCloseDelay","event","clearTimeout","CONNECTING","closeEvent","open","_this3","URL","hostname","_unused","checkRequired","_keys","_defineProperty2","WebSocket","getWebSocketConstructor","fixCloseCode","UnknownResponse","BadRequest","NotAuthorized","Forbidden","ConnectionError","onopen","authorize","token","then","catch","onerror","set","rejectPendingResponses","emit","removeAllListeners","_this4","data","JSON","parse","processedEvent","type","acknowledge","handlePendingResponse","send","_this5","OPEN","_isObject2","_stringify","sendRequest","_this6","undefined","request","trackingId","createTrackingId","timeout","wssResponseTimeout","matchesResponse","response","getStatusCode","statusCode","getStatusMessage","statusMessage","createError","createTimeoutError","has","timeoutId","clearPendingResponse","_has2","MESSAGE_TYPES","EVENT_ACK","eventId","message","refresh","refreshedToken","toString","String","AUTH","subtype","crypto","randomUUID","pendingResponse","delete","size","_from","values","_this7","refreshToken","toLowerCase","EventEmitter"],"sources":["socket-base.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {EventEmitter} from 'events';\n\n// @ts-expect-error `@webex/common` is still JS-only and does not ship declarations.\nimport {checkRequired} from '@webex/common';\n// @ts-expect-error `@webex/common-timers` is still JS-only and does not ship declarations.\nimport {safeSetTimeout} from '@webex/common-timers';\nimport {defaults, has, isObject} from 'lodash';\n\nimport {BadRequest, ConnectionError, Forbidden, NotAuthorized, UnknownResponse} from '../errors';\nimport {MESSAGE_TYPES, SOCKET_READY_STATE} from './constants';\nimport type {\n SocketCloseEvent,\n SocketLogger,\n SocketMessageEvent,\n PendingResponseEntry,\n SendRequestOptions,\n SocketOpenOptions,\n SocketResponse,\n SocketTransport,\n SocketTransportConstructor,\n} from './types';\n\nconst sockets = new WeakMap<Socket, SocketTransport>();\n\n/**\n * Generalized socket abstraction\n */\nexport default class Socket extends EventEmitter {\n private domain: string;\n\n private pendingResponses: Map<string, PendingResponseEntry>;\n\n forceCloseDelay!: number;\n\n logger!: SocketLogger;\n\n refreshToken?: (response: SocketResponse) => unknown;\n\n token!: string;\n\n trackingId!: string;\n\n wssResponseTimeout?: number;\n\n /**\n * constructor\n * @returns {Socket}\n */\n public constructor() {\n super();\n this.domain = 'unknown-domain';\n this.pendingResponses = new Map();\n this.onmessage = this.onmessage.bind(this);\n this.onclose = this.onclose.bind(this);\n this.setMaxListeners(10);\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {string}\n */\n public get binaryType() {\n return sockets.get(this)!.binaryType;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {number}\n */\n public get bufferedAmount() {\n return sockets.get(this)!.bufferedAmount;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {string}\n */\n public get extensions() {\n return sockets.get(this)!.extensions;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {string}\n */\n public get protocol() {\n return sockets.get(this)!.protocol;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {number}\n */\n public get readyState() {\n return sockets.get(this)!.readyState;\n }\n\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n * @returns {string}\n */\n public get url() {\n return sockets.get(this)!.url;\n }\n\n /**\n * Provides the environmentally appropriate constructor (ws in NodeJS,\n * WebSocket in browsers)\n * @returns {WebSocket}\n */\n public static getWebSocketConstructor(): unknown {\n throw new Error(\n 'Socket.getWebSocketConstructor() must be implemented in an environmentally appropriate way'\n );\n }\n\n /**\n * Closes the socket\n * @param {Object} options\n * @param {string} options.reason\n * @param {number} options.code\n * @returns {Promise}\n */\n public close(options?: {reason?: string; code?: number}) {\n return new Promise<SocketCloseEvent | void>((resolve, reject) => {\n const socket = sockets.get(this);\n\n if (!socket) {\n // Open has not been called yet so there is no socket to close\n resolve();\n\n return;\n }\n // logger is defined once open is called\n this.logger.info(`socket,${this.domain}: closing`);\n\n if (\n socket.readyState === SOCKET_READY_STATE.CLOSING ||\n socket.readyState === SOCKET_READY_STATE.CLOSED\n ) {\n this.logger.info(`socket,${this.domain}: already closed`);\n resolve();\n\n return;\n }\n\n const originalCode = options?.code;\n const originalReason = options?.reason;\n\n const resolvedOptions = defaults(options || {}, {\n code: 1000,\n reason: 'Done',\n }) as {code: number; reason: string};\n\n if (\n resolvedOptions.code &&\n resolvedOptions.code !== 1000 &&\n (resolvedOptions.code < 3000 || resolvedOptions.code > 4999)\n ) {\n reject(new Error('`options.code` must be 1000 or between 3000 and 4999 (inclusive)'));\n\n return;\n }\n\n const closeTimer = safeSetTimeout(() => {\n try {\n this.logger.info(`socket,${this.domain}: no close event received, forcing closure`);\n resolve(\n this.onclose(\n originalCode\n ? {code: originalCode, reason: originalReason || 'Done (unknown)'}\n : {\n code: 1000,\n reason: 'Done (forced)',\n }\n )\n );\n } catch (error) {\n this.logger.warn(`socket,${this.domain}: force-close failed`, error);\n }\n }, this.forceCloseDelay);\n\n socket.onclose = (event) => {\n this.logger.info(`socket,${this.domain}: close event fired`, event.code, event.reason);\n clearTimeout(closeTimer);\n this.onclose(event);\n resolve(event);\n };\n\n // If socket is still connecting, manually trigger close handler with desired code\n // because calling close() on a CONNECTING socket may not preserve custom codes\n if (socket.readyState === SOCKET_READY_STATE.CONNECTING) {\n this.logger.info(\n `socket,${this.domain}: socket still connecting, triggering close manually`\n );\n clearTimeout(closeTimer);\n const closeEvent: SocketCloseEvent = {\n code: resolvedOptions.code,\n reason: resolvedOptions.reason,\n };\n this.onclose(closeEvent);\n resolve(closeEvent);\n try {\n socket.close(resolvedOptions.code, resolvedOptions.reason);\n } catch (error) {\n this.logger.info(\n `socket,${this.domain}: error while closing CONNECTING socket, likely due to browser incompatibility with custom close codes`,\n error\n );\n }\n } else {\n socket.close(resolvedOptions.code, resolvedOptions.reason);\n }\n });\n }\n\n /**\n * Opens a WebSocket\n * @param {string} url\n * @param {options} options\n * @param {number} options.forceCloseDelay (required)\n * @param {string} options.token (required)\n * @param {string} options.trackingId (required)\n * @param {Logger} options.logger (required)\n * @returns {Promise}\n */\n public open(url: string, options?: SocketOpenOptions) {\n try {\n this.domain = new URL(url).hostname;\n } catch {\n this.domain = url;\n }\n\n return new Promise<void>((resolve, reject) => {\n /* eslint complexity: [0] */\n if (!url) {\n reject(new Error('`url` is required'));\n\n return;\n }\n\n if (sockets.get(this)) {\n reject(new Error('Socket#open() can only be called once per instance'));\n\n return;\n }\n\n const resolvedOptions = (options || {}) as SocketOpenOptions;\n\n checkRequired(['forceCloseDelay', 'token', 'trackingId', 'logger'], resolvedOptions);\n\n Object.keys(resolvedOptions).forEach((key) => {\n Reflect.defineProperty(this, key, {\n enumerable: false,\n value: resolvedOptions[key],\n });\n });\n\n const WebSocket = Socket.getWebSocketConstructor() as SocketTransportConstructor;\n\n this.logger.info(`socket,${this.domain}: creating WebSocket`);\n const socket = new WebSocket(url, [], resolvedOptions);\n\n socket.binaryType = 'arraybuffer';\n socket.onmessage = this.onmessage;\n\n socket.onclose = (event) => {\n event = this.fixCloseCode(event);\n this.logger.info(`socket,${this.domain}: closed before open`, event.code, event.reason);\n switch (event.code) {\n case 1005:\n // IE 11 doesn't seem to allow 4XXX codes, so if we get a 1005, assume\n // it's a bad websocket url. That'll trigger a device refresh; if it\n // turns out we had a bad token, the device refresh should 401 and\n // trigger a token refresh.\n return reject(new UnknownResponse(event));\n case 4400:\n return reject(new BadRequest(event));\n case 4401:\n return reject(new NotAuthorized(event));\n case 4403:\n return reject(new Forbidden(event));\n default:\n return reject(new ConnectionError(event));\n }\n };\n\n socket.onopen = () => {\n this.logger.info(`socket,${this.domain}: connected`);\n this.authorize(this.token)\n .then(() => {\n this.logger.info(`socket,${this.domain}: authorized`);\n socket.onclose = this.onclose;\n resolve();\n })\n .catch(reject);\n };\n\n socket.onerror = (event) => {\n this.logger.warn(`socket,${this.domain}: error event fired`, event);\n };\n\n sockets.set(this, socket);\n this.logger.info(`socket,${this.domain}: waiting for server`);\n });\n }\n\n /**\n * Handles incoming CloseEvents\n * @param {CloseEvent} event\n * @returns {undefined}\n */\n public onclose(event: SocketCloseEvent) {\n this.logger.info(`socket,${this.domain}: closed`, event.code, event.reason);\n\n event = this.fixCloseCode(event);\n this.rejectPendingResponses(new ConnectionError(event));\n this.emit('close', event);\n\n // Remove all listeners to (a) avoid reacting to late pongs and (b) ensure\n // we don't have a retain cycle.\n this.removeAllListeners();\n }\n\n /**\n * Handles incoming message events\n * @param {MessageEvent} event\n * @returns {undefined}\n */\n public onmessage(event: SocketMessageEvent<string>) {\n try {\n const data = JSON.parse(event.data) as SocketResponse;\n const processedEvent = {data};\n\n if (data.type === 'async_event') {\n this.acknowledge(processedEvent).catch((error) => {\n this.logger.warn(`socket,${this.domain}: failed to acknowledge async event`, error);\n });\n }\n\n // Match pending request/response promises before emitting the public message event.\n // The message is still emitted afterward for any external listeners that care about it.\n this.handlePendingResponse(data);\n this.emit('message', processedEvent);\n } catch (error) {\n /* istanbul ignore next */\n this.logger.warn(`socket,${this.domain}: error while receiving WebSocket message`, error);\n }\n }\n\n /**\n * Sends a message up the socket\n * @param {mixed} data\n * @returns {Promise}\n */\n public send(data: string | Record<string, unknown>) {\n return new Promise<void>((resolve, reject) => {\n if (this.readyState !== SOCKET_READY_STATE.OPEN) {\n reject(new Error('INVALID_STATE_ERROR'));\n\n return;\n }\n\n if (isObject(data)) {\n data = JSON.stringify(data);\n }\n\n const socket = sockets.get(this);\n\n if (!socket) {\n reject(new Error('INVALID_STATE_ERROR'));\n\n return;\n }\n\n socket.send(data);\n\n resolve();\n });\n }\n\n /**\n * Sends a request and resolves when the matching response arrives.\n * @param {Object} data\n * @param {Object} [options={}]\n * @param {Function} [options.matchesResponse]\n * @param {Function} [options.createError]\n * @param {Function} [options.createTimeoutError]\n * @param {Function} [options.getStatusCode]\n * @param {Function} [options.getStatusMessage]\n * @param {number} [options.timeout]\n * @returns {Promise<Object>}\n */\n public sendRequest(data: SocketResponse, options: SendRequestOptions = {}) {\n if (!isObject(data)) {\n return Promise.reject(new Error('`data` is required'));\n }\n\n const request = {...data};\n const trackingId = request.trackingId || this.createTrackingId();\n const timeout = options.timeout || this.wssResponseTimeout || 10000;\n const matchesResponse =\n options.matchesResponse ||\n ((response) => response?.trackingId === trackingId && response?.type === 'response_event');\n const getStatusCode = options.getStatusCode || ((response) => response?.statusCode);\n const getStatusMessage = options.getStatusMessage || ((response) => response?.statusMessage);\n const createError =\n options.createError ||\n ((response, statusCode, statusMessage) =>\n new ConnectionError({\n code: statusCode,\n reason: statusMessage || response?.reason || 'Socket request failed',\n }));\n const createTimeoutError =\n options.createTimeoutError ||\n (() =>\n new ConnectionError({\n reason: 'Socket response not received before timeout',\n }));\n\n if (this.pendingResponses.has(trackingId)) {\n return Promise.reject(\n new Error(`socket request already pending for trackingId ${trackingId}`)\n );\n }\n\n request.trackingId = trackingId;\n\n return new Promise<SocketResponse>((resolve, reject) => {\n const timeoutId = safeSetTimeout(() => {\n this.clearPendingResponse(trackingId);\n reject(createTimeoutError(request));\n }, timeout);\n\n this.pendingResponses.set(trackingId, {\n request,\n matchesResponse,\n getStatusCode,\n getStatusMessage,\n createError,\n resolve: (response) => {\n this.clearPendingResponse(trackingId);\n resolve(response);\n },\n reject: (error) => {\n this.clearPendingResponse(trackingId);\n reject(error);\n },\n timeoutId,\n });\n\n this.send(request).catch((error) => {\n this.clearPendingResponse(trackingId);\n reject(error);\n });\n });\n }\n\n /**\n * Sends an acknowledgment for a specific event\n * @param {MessageEvent} event\n * @returns {Promise}\n */\n private acknowledge(event: SocketMessageEvent<SocketResponse>) {\n if (!event) {\n return Promise.reject(new Error('`event` is required'));\n }\n\n if (!has(event, 'data.eventId')) {\n return Promise.reject(new Error('`event.data.eventId` is required'));\n }\n\n // Don't try to acknowledge if socket is not in open state\n if (this.readyState !== SOCKET_READY_STATE.OPEN) {\n return Promise.resolve();\n }\n\n return this.send({\n type: MESSAGE_TYPES.EVENT_ACK,\n trackingId: event.data.trackingId || this.createTrackingId(),\n eventId: event.data.eventId,\n }).catch((error) => {\n if (error.message === 'INVALID_STATE_ERROR') {\n return Promise.resolve();\n }\n throw error;\n });\n }\n\n public refresh(token: string | {toString(): string}) {\n if (!token) {\n return Promise.reject(new Error('`token` is required for Socket#refresh()'));\n }\n\n let refreshedToken;\n\n if (typeof token === 'string') {\n refreshedToken = token;\n } else if (token && typeof token.toString === 'function') {\n refreshedToken = token.toString();\n } else {\n refreshedToken = String(token);\n }\n\n return this.authorize(refreshedToken);\n }\n\n /**\n * Sends an auth message up the socket with a refreshed token.\n * @param {string} token\n * @returns {Promise}\n */\n private authorize(token: string) {\n this.logger.info(`socket,${this.domain}: authorizing`);\n\n return this.sendRequest(\n {\n type: MESSAGE_TYPES.AUTH,\n data: {\n token,\n },\n },\n {\n matchesResponse: (response, request) =>\n response?.type === 'response_event' &&\n response?.subtype === MESSAGE_TYPES.AUTH &&\n response?.trackingId === request.trackingId,\n getStatusCode: (response) => response?.statusCode,\n getStatusMessage: (response) => response?.statusMessage,\n createError: (response, statusCode, statusMessage) =>\n new NotAuthorized({\n code: statusCode,\n reason: statusMessage || 'Mobius auth failed',\n }),\n createTimeoutError: () =>\n new NotAuthorized({\n reason: 'Mobius auth response not received before timeout',\n }),\n }\n );\n }\n\n /**\n * Creates a unique tracking ID\n * @private\n * @returns {string}\n */\n private createTrackingId() {\n return `${this.trackingId}_${crypto.randomUUID()}`;\n }\n\n /**\n * Clears a pending response entry.\n * @param {string} trackingId\n * @returns {void}\n */\n private clearPendingResponse(trackingId: string) {\n const pendingResponse = this.pendingResponses.get(trackingId);\n\n if (pendingResponse?.timeoutId) {\n clearTimeout(pendingResponse.timeoutId);\n }\n\n this.pendingResponses.delete(trackingId);\n }\n\n /**\n * Rejects all pending responses with the provided error.\n * @param {Error} error\n * @returns {void}\n */\n private rejectPendingResponses(error: unknown) {\n if (!this.pendingResponses.size) {\n return;\n }\n\n Array.from(this.pendingResponses.values()).forEach((pendingResponse) => {\n pendingResponse.reject(error);\n });\n }\n\n /**\n * Handles incoming responses for pending requests.\n * @param {Object} response\n * @returns {boolean}\n */\n private handlePendingResponse(response: SocketResponse) {\n if (!response) {\n return false;\n }\n\n // Pending request correlation currently requires trackingId on the response.\n const pendingResponse = response.trackingId\n ? this.pendingResponses.get(response.trackingId)\n : undefined;\n\n if (!pendingResponse) {\n return false;\n }\n\n if (!pendingResponse.matchesResponse(response, pendingResponse.request)) {\n return false;\n }\n\n const statusCode = pendingResponse.getStatusCode(response);\n const statusMessage = pendingResponse.getStatusMessage(response);\n\n if (statusCode === 440 && response?.subtype !== MESSAGE_TYPES.AUTH) {\n if (typeof this.refreshToken === 'function') {\n Promise.resolve(this.refreshToken(response)).catch((error) => {\n this.logger.warn(`socket,${this.domain}: failed token-expiry re-auth`, error);\n });\n } else {\n this.logger.warn(\n `socket,${this.domain}: refreshToken callback is unavailable for statusCode 440`\n );\n }\n }\n\n if (statusCode === undefined) {\n pendingResponse.reject(\n pendingResponse.createError(\n response,\n statusCode,\n statusMessage || 'Socket response missing status code'\n )\n );\n } else if (statusCode >= 200 && statusCode < 300) {\n pendingResponse.resolve(response);\n } else {\n pendingResponse.reject(pendingResponse.createError(response, statusCode, statusMessage));\n }\n\n return true;\n }\n\n /**\n * Deals with the fact that some browsers drop some close codes (but not\n * close reasons).\n * @param {CloseEvent} event\n * @private\n * @returns {CloseEvent}\n */\n private fixCloseCode(event: SocketCloseEvent) {\n if (event.code === 1005 && event.reason) {\n switch (event.reason.toLowerCase()) {\n case 'replaced':\n this.logger.info(\n `socket,${this.domain}: fixing CloseEvent code for reason: `,\n event.reason\n );\n event.code = 4000;\n break;\n case 'authentication failed':\n case 'authentication did not happen within the timeout window of 30000 seconds.':\n this.logger.info(\n `socket,${this.domain}: fixing CloseEvent code for reason: `,\n event.reason\n );\n event.code = 1008;\n break;\n default:\n // do nothing\n }\n }\n\n return event;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_events","require","_common","_commonTimers","_errors","_constants","_createForOfIteratorHelper","r","e","t","_Symbol","_Symbol$iterator","_Array$isArray","_unsupportedIterableToArray","length","_n","F","s","n","done","value","f","TypeError","o","a","u","call","next","return","_arrayLikeToArray","toString","slice","constructor","name","_Array$from","test","Array","ownKeys","_Object$keys2","_Object$getOwnPropertySymbols","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","Object","forEach","_defineProperty3","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","Boolean","prototype","valueOf","sockets","_weakMap","createTrackingId","concat","crypto","randomUUID","Socket","exports","_EventEmitter","_this","_classCallCheck2","domain","pendingResponses","_map","onmessage","bind","onclose","setMaxListeners","_inherits2","_createClass2","key","get","_sockets$get","binaryType","_sockets$get2","bufferedAmount","_sockets$get3","extensions","_sockets$get4","protocol","_sockets$get5","readyState","_sockets$get6","url","close","options","_this2","_promise","resolve","reject","socket","logger","info","SOCKET_READY_STATE","CLOSING","CLOSED","originalCode","code","originalReason","reason","resolvedOptions","_defaults2","Error","closeTimer","safeSetTimeout","error","warn","forceCloseDelay","event","clearTimeout","CONNECTING","closeEvent","open","_this3","URL","hostname","_unused","checkRequired","_keys","_defineProperty2","WebSocket","getWebSocketConstructor","fixCloseCode","UnknownResponse","BadRequest","NotAuthorized","Forbidden","ConnectionError","onopen","authorize","token","then","catch","onerror","set","rejectPendingResponses","emit","removeAllListeners","_this4","data","JSON","parse","processedEvent","type","acknowledge","handlePendingResponse","send","_this5","OPEN","_isObject2","_stringify","sendRequest","_this6","undefined","request","trackingId","timeout","wssResponseTimeout","has","timeoutId","clearPendingResponse","createTimeoutError","pendingResponse","response","_has2","MESSAGE_TYPES","EVENT_ACK","eventId","message","refresh","refreshedToken","String","AUTH","delete","size","_iterator","values","_step","err","_this7","subtype","statusCode","statusMessage","refreshToken","createWssResponseError","toLowerCase","EventEmitter"],"sources":["socket-base.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {EventEmitter} from 'events';\n\n// @ts-ignore - type not available\nimport {checkRequired} from '@webex/common';\n// @ts-ignore - type not available\nimport {safeSetTimeout} from '@webex/common-timers';\nimport {defaults, has, isObject} from 'lodash';\n\nimport {\n BadRequest,\n ConnectionError,\n createTimeoutError,\n createWssResponseError,\n Forbidden,\n NotAuthorized,\n UnknownResponse,\n} from '../errors';\nimport {MESSAGE_TYPES, SOCKET_READY_STATE} from './constants';\nimport type {\n SocketCloseEvent,\n SocketLogger,\n SocketMessageEvent,\n PendingResponseEntry,\n SendRequestOptions,\n SocketOpenOptions,\n SocketResponse,\n SocketTransport,\n SocketTransportConstructor,\n} from './types';\n\nconst sockets = new WeakMap<Socket, SocketTransport>();\n\nfunction createTrackingId() {\n return `webex-js-sdk_${crypto.randomUUID()}`;\n}\n\n/**\n * Generalized socket abstraction\n */\nexport default class Socket extends EventEmitter {\n private domain: string;\n\n private pendingResponses: Map<string, PendingResponseEntry>;\n\n forceCloseDelay!: number;\n\n logger!: SocketLogger;\n\n refreshToken?: (response: SocketResponse) => unknown;\n\n token!: string;\n\n trackingId!: string;\n\n wssResponseTimeout?: number;\n\n /**\n * Creates a new Socket instance.\n */\n public constructor() {\n super();\n this.domain = 'unknown-domain';\n this.pendingResponses = new Map();\n this.onmessage = this.onmessage.bind(this);\n this.onclose = this.onclose.bind(this);\n this.setMaxListeners(10);\n }\n\n // TODO: Circle back and check if we are using binaryType and related getters. If not, we can remove these.\n /**\n * Gets the binary type of the WebSocket connection.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n */\n public get binaryType() {\n return sockets.get(this)?.binaryType || '';\n }\n\n /**\n * Gets the number of bytes of data that have been queued but not yet transmitted.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n */\n public get bufferedAmount() {\n return sockets.get(this)?.bufferedAmount || 0;\n }\n\n /**\n * Gets the extensions selected by the server.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n */\n public get extensions() {\n return sockets.get(this)?.extensions || '';\n }\n\n /**\n * Gets the sub-protocol selected by the server.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n */\n public get protocol() {\n return sockets.get(this)?.protocol || '';\n }\n\n /**\n * Gets the current state of the WebSocket connection.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n */\n public get readyState() {\n return sockets.get(this)?.readyState || 0;\n }\n\n /**\n * Gets the URL of the WebSocket connection.\n * @see https://developer.mozilla.org/en-US/docs/Web/API/WebSocket\n */\n public get url() {\n return sockets.get(this)?.url || '';\n }\n\n /**\n * Provides the environmentally appropriate WebSocket constructor.\n *\n * @returns The WebSocket constructor (ws in NodeJS, WebSocket in browsers)\n */\n public static getWebSocketConstructor(): unknown {\n throw new Error(\n 'Socket.getWebSocketConstructor() must be implemented in an environmentally appropriate way'\n );\n }\n\n /**\n * Closes the socket.\n * @param options - Close options containing code and reason\n * @returns Promise that resolves when the socket is closed\n */\n public close(options?: {reason?: string; code?: number}) {\n return new Promise<SocketCloseEvent | void>((resolve, reject) => {\n const socket = sockets.get(this);\n\n if (!socket) {\n // Open has not been called yet so there is no socket to close\n resolve();\n\n return;\n }\n // logger is defined once open is called\n this.logger.info(`socket,${this.domain}: closing`);\n\n if (\n socket.readyState === SOCKET_READY_STATE.CLOSING ||\n socket.readyState === SOCKET_READY_STATE.CLOSED\n ) {\n this.logger.info(`socket,${this.domain}: already closed`);\n resolve();\n\n return;\n }\n\n const originalCode = options?.code;\n const originalReason = options?.reason;\n\n const resolvedOptions = defaults(options || {}, {\n code: 1000,\n reason: 'Done',\n }) as {code: number; reason: string};\n\n if (\n resolvedOptions.code &&\n resolvedOptions.code !== 1000 &&\n (resolvedOptions.code < 3000 || resolvedOptions.code > 4999)\n ) {\n reject(new Error('`options.code` must be 1000 or between 3000 and 4999 (inclusive)'));\n\n return;\n }\n\n const closeTimer = safeSetTimeout(() => {\n try {\n this.logger.info(`socket,${this.domain}: no close event received, forcing closure`);\n resolve(\n this.onclose(\n originalCode\n ? {code: originalCode, reason: originalReason || 'Done (unknown)'}\n : {\n code: 1000,\n reason: 'Done (forced)',\n }\n )\n );\n } catch (error) {\n this.logger.warn(`socket,${this.domain}: force-close failed`, error);\n }\n }, this.forceCloseDelay);\n\n socket.onclose = (event) => {\n this.logger.info(`socket,${this.domain}: close event fired`, event.code, event.reason);\n clearTimeout(closeTimer);\n this.onclose(event);\n resolve(event);\n };\n\n // If socket is still connecting, manually trigger close handler with desired code\n // because calling close() on a CONNECTING socket may not preserve custom codes\n if (socket.readyState === SOCKET_READY_STATE.CONNECTING) {\n this.logger.info(\n `socket,${this.domain}: socket still connecting, triggering close manually`\n );\n clearTimeout(closeTimer);\n const closeEvent: SocketCloseEvent = {\n code: resolvedOptions.code,\n reason: resolvedOptions.reason,\n };\n this.onclose(closeEvent);\n resolve(closeEvent);\n try {\n socket.close(resolvedOptions.code, resolvedOptions.reason);\n } catch (error) {\n this.logger.info(\n `socket,${this.domain}: error while closing CONNECTING socket, likely due to browser incompatibility with custom close codes`,\n error\n );\n }\n } else {\n socket.close(resolvedOptions.code, resolvedOptions.reason);\n }\n });\n }\n\n /**\n * Opens a WebSocket connection and performs authentication.\n *\n * @param url - WebSocket URL to connect to\n * @param options - Socket connection options including token, logger, and timeout settings\n * @returns Promise that resolves when socket is opened and authenticated\n */\n public open(url: string, options?: SocketOpenOptions) {\n try {\n this.domain = new URL(url).hostname;\n } catch {\n this.domain = url;\n }\n\n return new Promise<void>((resolve, reject) => {\n /* eslint complexity: [0] */\n if (!url) {\n reject(new Error('`url` is required'));\n\n return;\n }\n\n if (sockets.get(this)) {\n reject(new Error('Socket#open() can only be called once per instance'));\n\n return;\n }\n\n const resolvedOptions = (options || {}) as SocketOpenOptions;\n\n checkRequired(['forceCloseDelay', 'token', 'trackingId', 'logger'], resolvedOptions);\n\n Object.keys(resolvedOptions).forEach((key) => {\n Reflect.defineProperty(this, key, {\n enumerable: false,\n value: resolvedOptions[key],\n });\n });\n\n const WebSocket = Socket.getWebSocketConstructor() as SocketTransportConstructor;\n\n this.logger.info(`socket,${this.domain}: creating WebSocket`);\n const socket = new WebSocket(url, [], resolvedOptions);\n\n socket.binaryType = 'arraybuffer';\n socket.onmessage = this.onmessage;\n\n socket.onclose = (event) => {\n event = this.fixCloseCode(event);\n this.logger.info(`socket,${this.domain}: closed before open`, event.code, event.reason);\n switch (event.code) {\n case 1005:\n // IE 11 doesn't seem to allow 4XXX codes, so if we get a 1005, assume\n // it's a bad websocket url. That'll trigger a device refresh; if it\n // turns out we had a bad token, the device refresh should 401 and\n // trigger a token refresh.\n return reject(new UnknownResponse(event));\n case 4400:\n return reject(new BadRequest(event));\n case 4401:\n return reject(new NotAuthorized(event));\n case 4403:\n return reject(new Forbidden(event));\n default:\n return reject(new ConnectionError(event));\n }\n };\n\n socket.onopen = () => {\n this.logger.info(`socket,${this.domain}: connected`);\n this.authorize(this.token)\n .then(() => {\n this.logger.info(`socket,${this.domain}: authorized`);\n socket.onclose = this.onclose;\n resolve();\n })\n .catch(reject);\n };\n\n socket.onerror = (event) => {\n this.logger.warn(`socket,${this.domain}: error event fired`, event);\n };\n\n sockets.set(this, socket);\n this.logger.info(`socket,${this.domain}: waiting for server`);\n });\n }\n\n /**\n * Handles incoming CloseEvents.\n * @param event - The close event containing code and reason\n */\n public onclose(event: SocketCloseEvent) {\n this.logger.info(`socket,${this.domain}: closed`, event.code, event.reason);\n\n event = this.fixCloseCode(event);\n this.rejectPendingResponses(new ConnectionError(event));\n this.emit('close', event);\n\n // Remove all listeners to (a) avoid reacting to late pongs and (b) ensure\n // we don't have a retain cycle.\n this.removeAllListeners();\n }\n\n /**\n * Handles incoming message events from the WebSocket.\n * @param event - The message event containing the data\n */\n public onmessage(event: SocketMessageEvent<string>) {\n try {\n const data = JSON.parse(event.data) as SocketResponse;\n const processedEvent = {data};\n\n if (data.type === 'async_event') {\n this.acknowledge(processedEvent).catch((error) => {\n this.logger.warn(`socket,${this.domain}: failed to acknowledge async event`, error);\n });\n }\n\n // Match pending request/response promises before emitting the public message event.\n // The message is still emitted afterward for any external listeners that care about it.\n this.handlePendingResponse(data);\n this.emit('message', processedEvent);\n } catch (error) {\n /* istanbul ignore next */\n this.logger.warn(`socket,${this.domain}: error while receiving WebSocket message`, error);\n }\n }\n\n /**\n * Sends a message up the socket.\n * @param data - Data to send (string or object that will be JSON stringified)\n * @returns Promise that resolves when the message is sent\n */\n public send(data: string | Record<string, unknown>) {\n return new Promise<void>((resolve, reject) => {\n if (this.readyState !== SOCKET_READY_STATE.OPEN) {\n reject(new Error('INVALID_STATE_ERROR'));\n\n return;\n }\n\n if (isObject(data)) {\n data = JSON.stringify(data);\n }\n\n const socket = sockets.get(this);\n\n if (!socket) {\n reject(new Error('INVALID_STATE_ERROR'));\n\n return;\n }\n\n socket.send(data);\n\n resolve();\n });\n }\n\n /**\n * Sends a request and resolves when the matching response arrives.\n *\n * @param data - Request data to send over the socket\n * @param options - Request options including timeout and error handlers\n * @returns Promise that resolves with the response data\n */\n public sendRequest(data: SocketResponse, options: SendRequestOptions = {}) {\n if (!isObject(data)) {\n return Promise.reject(new Error('`data` is required'));\n }\n\n const request = {...data};\n const trackingId = request.trackingId || createTrackingId();\n const timeout = options.timeout || this.wssResponseTimeout || 10000;\n\n if (this.pendingResponses.has(trackingId)) {\n return Promise.reject(new Error(`socket request already sent for trackingId ${trackingId}`));\n }\n\n request.trackingId = trackingId;\n\n return new Promise<SocketResponse>((resolve, reject) => {\n const timeoutId = safeSetTimeout(() => {\n this.clearPendingResponse(trackingId);\n reject(createTimeoutError(request));\n }, timeout) as NodeJS.Timeout;\n\n const pendingResponse: PendingResponseEntry = {\n request,\n resolve: (response: SocketResponse) => {\n this.clearPendingResponse(trackingId);\n resolve(response);\n },\n reject: (error: unknown) => {\n this.clearPendingResponse(trackingId);\n reject(error);\n },\n timeoutId,\n };\n\n this.pendingResponses.set(trackingId, pendingResponse);\n\n this.send(request).catch((error) => {\n this.clearPendingResponse(trackingId);\n reject(error);\n });\n });\n }\n\n /**\n * Sends an acknowledgment for a specific async event.\n * @param event - Message event containing the async event to acknowledge\n * @returns Promise that resolves when acknowledgment is sent\n */\n private acknowledge(event: SocketMessageEvent<SocketResponse>) {\n if (!event) {\n return Promise.reject(new Error('`event` is required'));\n }\n\n if (!has(event, 'data.eventId')) {\n return Promise.reject(new Error('`event.data.eventId` is required'));\n }\n\n // Don't try to acknowledge if socket is not in open state\n if (this.readyState !== SOCKET_READY_STATE.OPEN) {\n return Promise.resolve();\n }\n\n return this.send({\n type: MESSAGE_TYPES.EVENT_ACK,\n trackingId: event.data.trackingId || createTrackingId(),\n eventId: event.data.eventId,\n }).catch((error) => {\n if (error.message === 'INVALID_STATE_ERROR') {\n return Promise.resolve();\n }\n throw error;\n });\n }\n\n public refresh(token: string | {toString(): string}) {\n if (!token) {\n return Promise.reject(new Error('`token` is required for Socket#refresh()'));\n }\n\n let refreshedToken;\n\n if (typeof token === 'string') {\n refreshedToken = token;\n } else if (token && typeof token.toString === 'function') {\n refreshedToken = token.toString();\n } else {\n refreshedToken = String(token);\n }\n\n return this.authorize(refreshedToken);\n }\n\n /**\n * Sends an auth message up the socket with a refreshed token.\n * @param token - Authentication token to send\n * @returns Promise that resolves when authentication succeeds\n */\n private authorize(token: string) {\n this.logger.info(`socket,${this.domain}: authorizing`);\n\n return this.sendRequest({\n type: MESSAGE_TYPES.AUTH,\n data: {token},\n });\n }\n\n /**\n * Clears a pending response entry.\n * @param trackingId - Tracking ID of the response to clear\n */\n private clearPendingResponse(trackingId: string) {\n const pendingResponse = this.pendingResponses.get(trackingId);\n\n if (pendingResponse?.timeoutId) {\n clearTimeout(pendingResponse.timeoutId);\n }\n\n this.pendingResponses.delete(trackingId);\n }\n\n /**\n * Rejects all pending responses with the provided error.\n * @param error - Error to reject pending responses with\n */\n private rejectPendingResponses(error: unknown) {\n if (!this.pendingResponses.size) {\n return;\n }\n\n for (const pendingResponse of this.pendingResponses.values()) {\n pendingResponse.reject(error);\n }\n }\n\n /**\n * Handles incoming responses for pending requests.\n * @param response - Response data to match against pending requests\n * @returns True if a matching pending request was found and handled\n */\n private handlePendingResponse(response: SocketResponse) {\n if (!response) {\n return false;\n }\n\n // Pending request correlation currently requires trackingId on the response.\n const pendingResponse = this.pendingResponses.get(response.trackingId || '');\n\n if (!pendingResponse) {\n return false;\n }\n\n if (response.subtype !== pendingResponse.request.type) {\n return false;\n }\n\n const statusCode = response?.statusCode;\n const statusMessage = response?.statusMessage;\n\n if (statusCode === 440 && response?.subtype !== MESSAGE_TYPES.AUTH) {\n if (typeof this.refreshToken === 'function') {\n Promise.resolve(this.refreshToken(response)).catch((error) => {\n this.logger.warn(`socket,${this.domain}: failed token-expiry re-auth`, error);\n });\n } else {\n this.logger.warn(\n `socket,${this.domain}: refreshToken callback is unavailable for statusCode 440`\n );\n }\n }\n\n if (statusCode === undefined) {\n const error = createWssResponseError(\n response,\n statusCode,\n statusMessage || 'Socket response missing status code'\n );\n pendingResponse.reject(error);\n } else if (statusCode >= 200 && statusCode < 300) {\n pendingResponse.resolve(response);\n } else {\n pendingResponse.reject(createWssResponseError(response, statusCode, statusMessage));\n }\n\n return true;\n }\n\n /**\n * Deals with the fact that some browsers drop some close codes (but not close reasons).\n *\n * @param event - Close event to fix\n * @returns Fixed close event with corrected code if necessary\n */\n private fixCloseCode(event: SocketCloseEvent) {\n if (event.code === 1005 && event.reason) {\n switch (event.reason.toLowerCase()) {\n case 'replaced':\n this.logger.info(\n `socket,${this.domain}: fixing CloseEvent code for reason: `,\n event.reason\n );\n event.code = 4000;\n break;\n case 'authentication failed':\n case 'authentication did not happen within the timeout window of 30000 seconds.':\n this.logger.info(\n `socket,${this.domain}: fixing CloseEvent code for reason: `,\n event.reason\n );\n event.code = 1008;\n break;\n default:\n // do nothing\n }\n }\n\n return event;\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["/**\n * Type for the browser WebSocket constructor.\n */\nexport type BrowserWebSocketConstructor = typeof WebSocket;\n\n/**\n * Global scope interface for accessing WebSocket constructors across environments.\n */\nexport type ShimGlobalScope = {\n /** Firefox's WebSocket constructor */\n MozWebSocket?: BrowserWebSocketConstructor;\n /** Standard WebSocket constructor */\n WebSocket?: BrowserWebSocketConstructor;\n};\n\n/**\n * Socket close event data.\n */\nexport type SocketCloseEvent = {\n /** WebSocket close code */\n code?: number;\n /** Human-readable close reason */\n reason?: string;\n};\n\n/**\n * Socket message event wrapper.\n */\nexport type SocketMessageEvent<T = unknown> = {\n /** Message data payload */\n data: T;\n};\n\n/**\n * Logger interface for socket operations.\n */\nexport type SocketLogger = {\n /** Log informational messages */\n info: (...args: unknown[]) => void;\n /** Log warning messages */\n warn: (...args: unknown[]) => void;\n};\n\n/**\n * Socket response/request message structure.\n */\nexport type SocketResponse = {\n /** Unique tracking ID for request/response correlation */\n trackingId?: string;\n /** Message type identifier */\n type?: string;\n /** Message subtype identifier */\n subtype?: string;\n /** HTTP-style status code */\n statusCode?: number;\n /** Human-readable status message */\n statusMessage?: string;\n /** Reason for error or closure */\n reason?: string;\n /** Event ID for async events */\n eventId?: string;\n /** Additional properties */\n [key: string]: unknown;\n};\n\n/**\n * Entry for tracking pending request/response pairs.\n */\nexport type PendingResponseEntry = {\n /** Original request data */\n request: SocketResponse;\n /** Resolve function for the pending promise */\n resolve: (response: SocketResponse) => void;\n /** Reject function for the pending promise */\n reject: (error: unknown) => void;\n /** Timeout handle for the request */\n timeoutId: ReturnType<typeof setTimeout>;\n};\n\n/**\n * Options for configuring socket requests.\n */\nexport type SendRequestOptions = {\n /** Optional custom timeout error factory */\n createTimeoutError?: (request: SocketResponse) => unknown;\n /** Request timeout in milliseconds */\n timeout?: number;\n};\n\n/**\n * Options required for opening a socket connection.\n */\nexport type SocketOpenOptions = {\n /** Milliseconds to wait for close frame before forcing closure */\n forceCloseDelay: number;\n /** Authentication token */\n token: string;\n /** Tracking ID for this connection */\n trackingId: string;\n /** Logger instance for socket operations */\n logger: SocketLogger;\n /** Optional timeout for websocket responses */\n wssResponseTimeout?: number;\n /** Optional token refresh callback */\n refreshToken?: (response: SocketResponse) => unknown;\n /** Additional options */\n [key: string]: unknown;\n};\n\n/**\n * Interface for the underlying WebSocket transport.\n */\nexport type SocketTransport = {\n /** Binary data type */\n binaryType: string;\n /** Number of bytes queued but not sent */\n bufferedAmount: number;\n /** Extensions negotiated with server */\n extensions: string;\n /** Sub-protocol negotiated with server */\n protocol: string;\n /** Current connection state */\n readyState: number;\n /** WebSocket URL */\n url: string;\n /** Message event handler */\n onmessage: ((event: SocketMessageEvent<string>) => void) | null;\n /** Close event handler */\n onclose: ((event: SocketCloseEvent) => void) | null;\n /** Open event handler */\n onopen: (() => void) | null;\n /** Error event handler */\n onerror: ((event: unknown) => void) | null;\n /** Close the connection */\n close: (code?: number, reason?: string) => void;\n /** Send data through the socket */\n send: (data: string) => void;\n};\n\n/**\n * Constructor type for creating socket transports.\n */\nexport type SocketTransportConstructor = new (...args: unknown[]) => SocketTransport;\n"],"mappings":"","ignoreList":[]}
|
|
@@ -331,9 +331,9 @@ describe('plugin-mobius-socket', function () {
|
|
|
331
331
|
statusMessage: 'Unauthorized'
|
|
332
332
|
});
|
|
333
333
|
return _testHelperChai.assert.isRejected(promise).then(function (reason) {
|
|
334
|
-
_testHelperChai.assert.
|
|
335
|
-
_testHelperChai.assert.equal(reason.
|
|
336
|
-
_testHelperChai.assert.match(reason.
|
|
334
|
+
_testHelperChai.assert.equal(reason.name, 'MobiusSocketResponseError');
|
|
335
|
+
_testHelperChai.assert.equal(reason.statusCode, 401);
|
|
336
|
+
_testHelperChai.assert.match(reason.statusMessage, /Unauthorized/);
|
|
337
337
|
return s.close();
|
|
338
338
|
});
|
|
339
339
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_crypto","require","_testHelperChai","_testHelperMockWebSocket","_interopRequireDefault","_sinon","_errors","_config","_socket","_constants","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty3","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty2","crypto","randomUUID","_defineProperty2","value","configurable","describe","mockWebSocket","socket","usingFakeTimers","mockoptions","logger","console","token","trackingId","config","mobiusSocket","emitAuthResponse","_ref","undefined","_ref$statusCode","statusCode","_ref$statusMessage","statusMessage","authRequest","JSON","parse","send","lastCall","args","emit","data","_stringify","type","subtype","MESSAGE_TYPES","AUTH","beforeEach","jest","useFakeTimers","doNotFake","sinon","stub","Socket","callsFake","_len","Array","_key","_construct2","MockWebSocket","promise","open","process","nextTick","afterEach","useRealTimers","getWebSocketConstructor","restore","_promise","resolve","close","then","freshSocket","catch","it","assert","isRejected","forceCloseDelay","openPromise","wssResponseTimeout","logLevelToken","readyState","equal","notEqual","binaryType","bufferedAmount","extensions","protocol","url","s","firstCallArgs","firstCall","code","reason","instanceOf","BadRequest","match","message","NotAuthorized","Forbidden","ConnectionError","property","error","called","all","calledWith","p1","p2","transientSocket","spy","on","removeAllListeners","closePromise","advanceTimersByTime","description","closeOptions","expectedCode","expectedReason","_ref2","_asyncToGenerator2","_regenerator","mark","_callee","socketInstance","previousStub","closeSpy","result","wrap","_context","prev","next","_len2","_key2","sent","calledOnce","stop","json","_forEach2","Replaced","concat","id","eventId","eventType","callId","deviceId","acknowledge","notCalled","EVENT_ACK"],"sources":["socket.test.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {randomUUID} from 'crypto';\nimport {forEach} from 'lodash';\nimport {assert} from '@webex/test-helper-chai';\nimport MockWebSocket from '@webex/test-helper-mock-web-socket';\nimport sinon from 'sinon';\nimport {BadRequest, NotAuthorized, Forbidden, ConnectionError} from './errors';\nimport config from './config';\nimport Socket from './socket';\nimport {MESSAGE_TYPES} from './socket/constants';\n\nif (!crypto.randomUUID) {\n Object.defineProperty(crypto, 'randomUUID', {\n value: randomUUID,\n configurable: true,\n });\n}\n\ndescribe('plugin-mobius-socket', () => {\n describe('Socket', () => {\n let mockWebSocket;\n let socket;\n let usingFakeTimers;\n\n const mockoptions = {\n logger: console,\n token: 'mocktoken',\n trackingId: 'mocktrackingid',\n ...config.mobiusSocket,\n };\n\n const emitAuthResponse = ({statusCode = 200, statusMessage = 'OK'} = {}) => {\n const authRequest = JSON.parse(mockWebSocket.send.lastCall.args[0]);\n\n mockWebSocket.emit('message', {\n data: JSON.stringify({\n type: 'response_event',\n subtype: MESSAGE_TYPES.AUTH,\n trackingId: authRequest.trackingId,\n statusCode,\n statusMessage,\n }),\n });\n };\n\n beforeEach(() => {\n jest.useFakeTimers({doNotFake: ['nextTick']});\n usingFakeTimers = true;\n });\n\n beforeEach(() => {\n sinon.stub(Socket, 'getWebSocketConstructor').callsFake(\n () =>\n function (...args) {\n mockWebSocket = new MockWebSocket(...args);\n\n return mockWebSocket;\n }\n );\n\n socket = new Socket();\n const promise = socket.open('ws://example.com', mockoptions);\n\n mockWebSocket.open();\n // Simulate Mobius auth response (MockWebSocket.open auto-sends mercury.buffer_state which Mobius ignores)\n process.nextTick(() => {\n emitAuthResponse();\n });\n\n return promise;\n });\n\n afterEach(() => {\n if (usingFakeTimers) {\n jest.useRealTimers();\n usingFakeTimers = false;\n }\n\n Socket.getWebSocketConstructor.restore();\n\n return Promise.resolve(socket && socket.close()).then(() => {\n mockWebSocket = undefined;\n socket = undefined;\n });\n });\n\n describe('#open()', () => {\n let freshSocket;\n\n beforeEach(() => {\n freshSocket = new Socket();\n });\n\n afterEach(() => freshSocket.close().catch(() => undefined));\n\n it('requires a url', () => assert.isRejected(freshSocket.open(), /`url` is required/));\n\n it('requires a forceCloseDelay option', () =>\n assert.isRejected(\n freshSocket.open('ws://example.com'),\n /missing required property forceCloseDelay/\n ));\n\n it('requires a token option', () =>\n assert.isRejected(\n freshSocket.open('ws://example.com', {\n forceCloseDelay: mockoptions.forceCloseDelay,\n }),\n /missing required property token/\n ));\n\n it('requires a trackingId option', () =>\n assert.isRejected(\n freshSocket.open('ws://example.com', {\n forceCloseDelay: mockoptions.forceCloseDelay,\n token: 'mocktoken',\n }),\n /missing required property trackingId/\n ));\n\n it('requires a logger option', () =>\n assert.isRejected(\n freshSocket.open('ws://example.com', {\n forceCloseDelay: mockoptions.forceCloseDelay,\n token: 'mocktoken',\n trackingId: 'mocktrackingid',\n }),\n /missing required property logger/\n ));\n\n it('accepts a logLevelToken option', () => {\n const openPromise = freshSocket.open('ws://example.com', {\n forceCloseDelay: mockoptions.forceCloseDelay,\n wssResponseTimeout: mockoptions.wssResponseTimeout,\n logger: console,\n token: 'mocktoken',\n trackingId: 'mocktrackingid',\n logLevelToken: 'mocklogleveltoken',\n });\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n\n emitAuthResponse();\n\n return openPromise.then(() => {\n assert.equal(freshSocket.logLevelToken, 'mocklogleveltoken');\n });\n });\n });\n\n describe('#binaryType', () => {\n it('proxies to the underlying socket', () => {\n assert.notEqual(socket.binaryType, 'test');\n mockWebSocket.binaryType = 'test';\n assert.equal(socket.binaryType, 'test');\n });\n });\n\n describe('#bufferedAmount', () => {\n it('proxies to the underlying socket', () => {\n assert.notEqual(socket.bufferedAmount, 'test');\n mockWebSocket.bufferedAmount = 'test';\n assert.equal(socket.bufferedAmount, 'test');\n });\n });\n\n describe('#extensions', () => {\n it('proxies to the underlying socket', () => {\n assert.notEqual(socket.extensions, 'test');\n mockWebSocket.extensions = 'test';\n assert.equal(socket.extensions, 'test');\n });\n });\n\n describe('#protocol', () => {\n it('proxies to the underlying socket', () => {\n assert.notEqual(socket.protocol, 'test');\n mockWebSocket.protocol = 'test';\n assert.equal(socket.protocol, 'test');\n });\n });\n\n describe('#readyState', () => {\n it('proxies to the underlying socket', () => {\n assert.notEqual(socket.readyState, 'test');\n mockWebSocket.readyState = 'test';\n assert.equal(socket.readyState, 'test');\n });\n });\n\n describe('#url', () => {\n it('proxies to the underlying socket', () => {\n assert.notEqual(socket.url, 'test');\n mockWebSocket.url = 'test';\n assert.equal(socket.url, 'test');\n });\n });\n\n describe('#open()', () => {\n it('requires a url parameter', () => {\n const s = new Socket();\n\n return assert.isRejected(s.open(), /`url` is required/);\n });\n\n it('cannot be called more than once', () =>\n assert.isRejected(\n socket.open('ws://example.com'),\n /Socket#open\\(\\) can only be called once/\n ));\n\n it(\"sets the underlying socket's binary type\", () =>\n assert.equal(socket.binaryType, 'arraybuffer'));\n\n describe('when connection fails because this is a service account', () => {\n it('rejects with a BadRequest', () => {\n const s = new Socket();\n const promise = s.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n\n const firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);\n\n assert.equal(firstCallArgs.type, MESSAGE_TYPES.AUTH);\n\n mockWebSocket.emit('close', {\n code: 4400,\n reason: \"Service accounts can't use this endpoint\",\n });\n\n return assert.isRejected(promise).then((reason) => {\n assert.instanceOf(reason, BadRequest);\n assert.match(reason.code, 4400);\n assert.match(reason.reason, /Service accounts can't use this endpoint/);\n assert.match(reason.message, /Service accounts can't use this endpoint/);\n\n return s.close();\n });\n });\n });\n\n describe('when connection fails because of an invalid token', () => {\n it('rejects with a NotAuthorized', () => {\n const s = new Socket();\n const promise = s.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n\n const firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);\n\n assert.equal(firstCallArgs.type, MESSAGE_TYPES.AUTH);\n\n mockWebSocket.emit('close', {\n code: 4401,\n reason: 'Authorization Failed',\n });\n\n return assert.isRejected(promise).then((reason) => {\n assert.instanceOf(reason, NotAuthorized);\n assert.match(reason.code, 4401);\n assert.match(reason.reason, /Authorization Failed/);\n assert.match(reason.message, /Authorization Failed/);\n\n return s.close();\n });\n });\n });\n\n describe('when connection fails because of a missing entitlement', () => {\n it('rejects with a Forbidden', () => {\n const s = new Socket();\n const promise = s.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n\n const firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);\n\n assert.equal(firstCallArgs.type, MESSAGE_TYPES.AUTH);\n\n mockWebSocket.emit('close', {\n code: 4403,\n reason: 'Not entitled',\n });\n\n return assert.isRejected(promise).then((reason) => {\n assert.instanceOf(reason, Forbidden);\n assert.match(reason.code, 4403);\n assert.match(reason.reason, /Not entitled/);\n assert.match(reason.message, /Not entitled/);\n\n return s.close();\n });\n });\n });\n\n describe('when connection fails for non-authorization reasons', () => {\n it(\"rejects with the close event's reason\", () => {\n const s = new Socket();\n const promise = s.open('ws://example.com', mockoptions);\n\n mockWebSocket.emit('close', {\n code: 4001,\n reason: 'No',\n });\n\n return assert.isRejected(promise).then((reason) => {\n assert.instanceOf(reason, ConnectionError);\n assert.match(reason.code, 4001);\n assert.match(reason.reason, /No/);\n assert.match(reason.message, /No/);\n\n return s.close();\n });\n });\n });\n\n describe('when the connection succeeds', () => {\n it('sends an auth message up the socket', () => {\n const firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);\n\n assert.equal(firstCallArgs.type, MESSAGE_TYPES.AUTH);\n assert.property(firstCallArgs, 'data');\n assert.property(firstCallArgs.data, 'token');\n assert.equal(firstCallArgs.data.token, 'mocktoken');\n assert.property(firstCallArgs, 'trackingId');\n });\n\n describe('when logLevelToken is set', () => {\n it('includes auth payload with token', () => {\n const s = new Socket();\n\n s.open('ws://example.com', {\n forceCloseDelay: mockoptions.forceCloseDelay,\n wssResponseTimeout: mockoptions.wssResponseTimeout,\n logger: console,\n token: 'mocktoken',\n trackingId: 'mocktrackingid',\n }).catch((reason) => console.error(reason));\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n\n const firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);\n\n assert.equal(firstCallArgs.type, MESSAGE_TYPES.AUTH);\n assert.property(firstCallArgs, 'data');\n assert.equal(firstCallArgs.data.token, 'mocktoken');\n assert.property(firstCallArgs, 'trackingId');\n\n return s.close();\n });\n });\n\n it('resolves upon receiving response_event auth response', () => {\n const s = new Socket();\n const promise = s.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n emitAuthResponse();\n\n return promise.then(() => s.close());\n });\n\n it('rejects upon receiving a non-2xx auth response_event', () => {\n const s = new Socket();\n const promise = s.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n emitAuthResponse({statusCode: 401, statusMessage: 'Unauthorized'});\n\n return assert.isRejected(promise).then((reason) => {\n assert.instanceOf(reason, NotAuthorized);\n assert.equal(reason.code, 401);\n assert.match(reason.reason, /Unauthorized/);\n\n return s.close();\n });\n });\n });\n });\n\n describe('#close()', () => {\n it('closes the socket', () => socket.close().then(() => assert.called(mockWebSocket.close)));\n\n it('only accepts valid close codes', () =>\n Promise.all([\n assert.isRejected(\n socket.close({code: 1001}),\n /`options.code` must be 1000 or between 3000 and 4999 \\(inclusive\\)/\n ),\n socket.close({code: 1000}),\n ]));\n\n it('accepts a reason', () =>\n socket\n .close({\n code: 3001,\n reason: 'Custom Normal',\n })\n .then(() => assert.calledWith(mockWebSocket.close, 3001, 'Custom Normal')));\n\n it('accepts the logout reason', () =>\n socket\n .close({\n code: 3050,\n reason: 'done (permanent)',\n })\n .then(() => assert.calledWith(mockWebSocket.close, 3050, 'done (permanent)')));\n\n it('can safely be called called multiple times', () => {\n const p1 = socket.close();\n\n mockWebSocket.readyState = 2;\n const p2 = socket.close();\n\n return Promise.all([p1, p2]);\n });\n\n it('signals closure if no close frame is received within the specified window', () => {\n const transientSocket = new Socket();\n const openPromise = transientSocket.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n emitAuthResponse();\n\n return openPromise.then(() => {\n const spy = sinon.spy();\n\n transientSocket.on('close', spy);\n mockWebSocket.close = () =>\n new Promise(() => {\n /* eslint no-inline-comments: [0] */\n });\n mockWebSocket.removeAllListeners('close');\n\n const closePromise = transientSocket.close();\n\n jest.advanceTimersByTime(mockoptions.forceCloseDelay);\n\n return closePromise.then(() => {\n assert.called(spy);\n assert.calledWith(spy, {\n code: 1000,\n reason: 'Done (forced)',\n });\n });\n });\n });\n\n it('signals closure if no close frame is received within the specified window, but uses the initial options as 3050 if specified by options call', () => {\n const transientSocket = new Socket();\n const openPromise = transientSocket.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n emitAuthResponse();\n\n return openPromise.then(() => {\n const spy = sinon.spy();\n\n transientSocket.on('close', spy);\n mockWebSocket.close = () =>\n new Promise(() => {\n /* eslint no-inline-comments: [0] */\n });\n mockWebSocket.removeAllListeners('close');\n\n const closePromise = transientSocket.close({code: 3050, reason: 'done (permanent)'});\n\n jest.advanceTimersByTime(mockoptions.forceCloseDelay);\n\n return closePromise.then(() => {\n assert.called(spy);\n assert.calledWith(spy, {\n code: 3050,\n reason: 'done (permanent)',\n });\n });\n });\n });\n\n it('signals closure if no close frame is received within the specified window, and uses default options as 1000 if the code is not 3050', () => {\n const transientSocket = new Socket();\n const openPromise = transientSocket.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n emitAuthResponse();\n\n return openPromise.then(() => {\n const spy = sinon.spy();\n\n transientSocket.on('close', spy);\n mockWebSocket.close = () =>\n new Promise(() => {\n /* eslint no-inline-comments: [0] */\n });\n mockWebSocket.removeAllListeners('close');\n\n const closePromise = transientSocket.close({code: 1000, reason: 'test'});\n\n jest.advanceTimersByTime(mockoptions.forceCloseDelay);\n\n return closePromise.then(() => {\n assert.called(spy);\n assert.calledWith(spy, {\n code: 1000,\n reason: 'test',\n });\n });\n });\n });\n\n it('signals closure if no close frame is received within the specified window, and uses default options as 1000 if the code is not 3050', () => {\n const transientSocket = new Socket();\n const openPromise = transientSocket.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n emitAuthResponse();\n\n return openPromise.then(() => {\n const spy = sinon.spy();\n\n transientSocket.on('close', spy);\n mockWebSocket.close = () =>\n new Promise(() => {\n /* eslint no-inline-comments: [0] */\n });\n mockWebSocket.removeAllListeners('close');\n\n const closePromise = transientSocket.close({code: 1000});\n\n jest.advanceTimersByTime(mockoptions.forceCloseDelay);\n\n return closePromise.then(() => {\n assert.called(spy);\n assert.calledWith(spy, {\n code: 1000,\n reason: 'Done (unknown)',\n });\n });\n });\n });\n\n [\n {\n description: 'manually triggers close handler when socket is still connecting',\n closeOptions: {code: 3001, reason: 'Custom close while connecting'},\n expectedCode: 3001,\n expectedReason: 'Custom close while connecting',\n },\n {\n description:\n 'manually triggers close handler with default code when socket is connecting',\n closeOptions: undefined,\n expectedCode: 1000,\n expectedReason: 'Done',\n },\n ].forEach(({description, closeOptions, expectedCode, expectedReason}) => {\n it(description, async () => {\n const s = new Socket();\n let socketInstance;\n\n // Save the current stub and replace it\n const previousStub = Socket.getWebSocketConstructor;\n Socket.getWebSocketConstructor = sinon.stub().callsFake(\n () =>\n function (...args) {\n socketInstance = new MockWebSocket(...args);\n\n return socketInstance;\n }\n );\n\n // open the socket\n s.open('ws://example.com', mockoptions);\n\n // Keep socket in CONNECTING state (readyState 0)\n socketInstance.readyState = 0;\n\n const closeSpy = sinon.spy();\n s.on('close', closeSpy);\n\n // Call close and await the result\n const result = await s.close(closeOptions);\n\n // Verify the promise resolved with the correct close event\n assert.equal(result.code, expectedCode);\n assert.equal(result.reason, expectedReason);\n\n // Verify close handler was called with expected code/reason\n assert.calledOnce(closeSpy);\n assert.calledWith(closeSpy, {\n code: expectedCode,\n reason: expectedReason,\n });\n\n // Verify the underlying socket.close was called with the correct params\n assert.calledOnce(socketInstance.close);\n assert.calledWith(socketInstance.close, expectedCode, expectedReason);\n\n // Restore the previous stub\n Socket.getWebSocketConstructor = previousStub;\n });\n });\n });\n\n describe('#send()', () => {\n describe('when the socket is not in the OPEN state', () => {\n it('fails', () => {\n mockWebSocket.readyState = 0;\n\n return assert\n .isRejected(socket.send('test0'), /INVALID_STATE_ERROR/)\n .then(() => {\n mockWebSocket.readyState = 2;\n\n return assert.isRejected(socket.send('test2'), /INVALID_STATE_ERROR/);\n })\n .then(() => {\n mockWebSocket.readyState = 3;\n\n return assert.isRejected(socket.send('test3'), /INVALID_STATE_ERROR/);\n })\n .then(() => {\n mockWebSocket.readyState = 1;\n\n return socket.send('test1');\n });\n });\n });\n\n it('sends strings', () => {\n socket.send('this is a string');\n assert.calledWith(mockWebSocket.send, 'this is a string');\n });\n\n it('sends JSON.stringifyable object', () => {\n socket.send({\n json: true,\n });\n assert.calledWith(mockWebSocket.send, '{\"json\":true}');\n });\n });\n\n describe('#onclose()', () => {\n describe('when it receives close code 1005', () => {\n forEach(\n {\n Replaced: 4000,\n 'Authentication Failed': 1008,\n 'Authentication did not happen within the timeout window of 30000 seconds.': 1008,\n },\n (code, reason) => {\n it(`emits code ${code} for reason ${reason}`, () => {\n const spy = sinon.spy();\n\n socket.on('close', spy);\n\n mockWebSocket.emit('close', {\n code: 1005,\n reason,\n });\n assert.called(spy);\n assert.calledWith(spy, {\n code,\n reason,\n });\n });\n }\n );\n });\n\n describe('when it receives close code 3050', () => {\n it('emits code 3050 for code 3050', () => {\n const code = 3050;\n const reason = 'done (permanent)';\n const spy = sinon.spy();\n\n socket.on('close', spy);\n\n mockWebSocket.emit('close', {\n code,\n reason,\n });\n assert.called(spy);\n assert.calledWith(spy, {\n code,\n reason,\n });\n });\n });\n });\n\n describe('#onmessage()', () => {\n let spy;\n\n beforeEach(() => {\n spy = sinon.spy();\n socket.on('message', spy);\n });\n\n it('emits messages from the underlying socket', () => {\n mockWebSocket.emit('message', {\n data: JSON.stringify({\n id: 'mockid',\n }),\n });\n\n assert.called(spy);\n });\n\n it('parses received messages', () => {\n mockWebSocket.emit('message', {\n data: JSON.stringify({\n id: 'mockid',\n type: 'test',\n }),\n });\n\n assert.calledWith(spy, {\n data: {\n id: 'mockid',\n type: 'test',\n },\n });\n });\n\n it('preserves top-level type and eventId for async_event envelopes', () => {\n mockWebSocket.emit('message', {\n data: JSON.stringify({\n type: 'async_event',\n trackingId: 'SRV_bb000000-0000-0000-0000-000000000006',\n eventId: 'f6a7b8c9-d0e1-2345-fabc-456789012345',\n data: {\n eventType: 'mobius.callinfo',\n callId: 'fcf86aa5-5539-4c9f-8b72-667786ae9b6c',\n deviceId: '334f3d50-1d26-4712-93f1-4972390cc565',\n },\n }),\n });\n\n assert.calledWith(spy, {\n data: {\n type: 'async_event',\n trackingId: 'SRV_bb000000-0000-0000-0000-000000000006',\n eventId: 'f6a7b8c9-d0e1-2345-fabc-456789012345',\n data: {\n eventType: 'mobius.callinfo',\n callId: 'fcf86aa5-5539-4c9f-8b72-667786ae9b6c',\n deviceId: '334f3d50-1d26-4712-93f1-4972390cc565',\n },\n },\n });\n });\n\n it('acknowledges async_event messages only', () => {\n sinon.spy(socket, 'acknowledge');\n mockWebSocket.emit('message', {\n data: JSON.stringify({\n type: 'async_event',\n eventId: 'event-123',\n trackingId: 'tracking-123',\n }),\n });\n assert.called(socket.acknowledge);\n });\n\n it('does not acknowledge non-async_event messages', () => {\n sinon.spy(socket, 'acknowledge');\n mockWebSocket.emit('message', {\n data: JSON.stringify({\n type: 'regular',\n id: 'mockid',\n }),\n });\n assert.notCalled(socket.acknowledge);\n });\n });\n\n describe('#acknowledge', () => {\n it('requires an event', () => assert.isRejected(socket.acknowledge(), /`event` is required/));\n\n it('acknowledges async events using event_ack and eventId', () =>\n socket\n .acknowledge({\n data: {\n eventId: 'event-123',\n trackingId: 'tracking-123',\n },\n })\n .then(() => {\n assert.calledWith(\n mockWebSocket.send,\n JSON.stringify({\n type: MESSAGE_TYPES.EVENT_ACK,\n trackingId: 'tracking-123',\n eventId: 'event-123',\n })\n );\n }));\n });\n });\n});\n"],"mappings":";;;;;;;;;;;;;;;;;AAIA,IAAAA,OAAA,GAAAC,OAAA;AAEA,IAAAC,eAAA,GAAAD,OAAA;AACA,IAAAE,wBAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,MAAA,GAAAD,sBAAA,CAAAH,OAAA;AACA,IAAAK,OAAA,GAAAL,OAAA;AACA,IAAAM,OAAA,GAAAH,sBAAA,CAAAH,OAAA;AACA,IAAAO,OAAA,GAAAJ,sBAAA,CAAAH,OAAA;AACA,IAAAQ,UAAA,GAAAR,OAAA;AAAiD,SAAAS,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,uBAAA,CAAApB,CAAA,EAAAC,CAAA,EAAAM,gCAAA,CAAAL,CAAA,EAAAD,CAAA,iBAAAD,CAAA,IAZjD;AACA;AACA;AAYA,IAAI,CAACqB,MAAM,CAACC,UAAU,EAAE;EACtB,IAAAC,gBAAA,CAAAN,OAAA,EAAsBI,MAAM,EAAE,YAAY,EAAE;IAC1CG,KAAK,EAAEF,kBAAU;IACjBG,YAAY,EAAE;EAChB,CAAC,CAAC;AACJ;AAEAC,QAAQ,CAAC,sBAAsB,EAAE,YAAM;EACrCA,QAAQ,CAAC,QAAQ,EAAE,YAAM;IACvB,IAAIC,aAAa;IACjB,IAAIC,MAAM;IACV,IAAIC,eAAe;IAEnB,IAAMC,WAAW,GAAAnB,aAAA;MACfoB,MAAM,EAAEC,OAAO;MACfC,KAAK,EAAE,WAAW;MAClBC,UAAU,EAAE;IAAgB,GACzBC,eAAM,CAACC,YAAY,CACvB;IAED,IAAMC,gBAAgB,GAAG,SAAnBA,gBAAgBA,CAAA,EAAsD;MAAA,IAAAC,IAAA,GAAA1B,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAA2B,SAAA,GAAA3B,SAAA,MAAP,CAAC,CAAC;QAAA4B,eAAA,GAAAF,IAAA,CAA5CG,UAAU;QAAVA,UAAU,GAAAD,eAAA,cAAG,GAAG,GAAAA,eAAA;QAAAE,kBAAA,GAAAJ,IAAA,CAAEK,aAAa;QAAbA,aAAa,GAAAD,kBAAA,cAAG,IAAI,GAAAA,kBAAA;MAC/D,IAAME,WAAW,GAAGC,IAAI,CAACC,KAAK,CAACnB,aAAa,CAACoB,IAAI,CAACC,QAAQ,CAACC,IAAI,CAAC,CAAC,CAAC,CAAC;MAEnEtB,aAAa,CAACuB,IAAI,CAAC,SAAS,EAAE;QAC5BC,IAAI,EAAE,IAAAC,UAAA,CAAAnC,OAAA,EAAe;UACnBoC,IAAI,EAAE,gBAAgB;UACtBC,OAAO,EAAEC,wBAAa,CAACC,IAAI;UAC3BtB,UAAU,EAAEU,WAAW,CAACV,UAAU;UAClCO,UAAU,EAAVA,UAAU;UACVE,aAAa,EAAbA;QACF,CAAC;MACH,CAAC,CAAC;IACJ,CAAC;IAEDc,UAAU,CAAC,YAAM;MACfC,IAAI,CAACC,aAAa,CAAC;QAACC,SAAS,EAAE,CAAC,UAAU;MAAC,CAAC,CAAC;MAC7C/B,eAAe,GAAG,IAAI;IACxB,CAAC,CAAC;IAEF4B,UAAU,CAAC,YAAM;MACfI,cAAK,CAACC,IAAI,CAACC,eAAM,EAAE,yBAAyB,CAAC,CAACC,SAAS,CACrD;QAAA,OACE,YAAmB;UAAA,SAAAC,IAAA,GAAArD,SAAA,CAAAC,MAAA,EAANoC,IAAI,OAAAiB,KAAA,CAAAD,IAAA,GAAAE,IAAA,MAAAA,IAAA,GAAAF,IAAA,EAAAE,IAAA;YAAJlB,IAAI,CAAAkB,IAAA,IAAAvD,SAAA,CAAAuD,IAAA;UAAA;UACfxC,aAAa,OAAAyC,WAAA,CAAAnD,OAAA,EAAOoD,gCAAa,EAAIpB,IAAI,CAAC;UAE1C,OAAOtB,aAAa;QACtB,CAAC;MAAA,CACL,CAAC;MAEDC,MAAM,GAAG,IAAImC,eAAM,CAAC,CAAC;MACrB,IAAMO,OAAO,GAAG1C,MAAM,CAAC2C,IAAI,CAAC,kBAAkB,EAAEzC,WAAW,CAAC;MAE5DH,aAAa,CAAC4C,IAAI,CAAC,CAAC;MACpB;MACAC,OAAO,CAACC,QAAQ,CAAC,YAAM;QACrBpC,gBAAgB,CAAC,CAAC;MACpB,CAAC,CAAC;MAEF,OAAOiC,OAAO;IAChB,CAAC,CAAC;IAEFI,SAAS,CAAC,YAAM;MACd,IAAI7C,eAAe,EAAE;QACnB6B,IAAI,CAACiB,aAAa,CAAC,CAAC;QACpB9C,eAAe,GAAG,KAAK;MACzB;MAEAkC,eAAM,CAACa,uBAAuB,CAACC,OAAO,CAAC,CAAC;MAExC,OAAOC,QAAA,CAAA7D,OAAA,CAAQ8D,OAAO,CAACnD,MAAM,IAAIA,MAAM,CAACoD,KAAK,CAAC,CAAC,CAAC,CAACC,IAAI,CAAC,YAAM;QAC1DtD,aAAa,GAAGY,SAAS;QACzBX,MAAM,GAAGW,SAAS;MACpB,CAAC,CAAC;IACJ,CAAC,CAAC;IAEFb,QAAQ,CAAC,SAAS,EAAE,YAAM;MACxB,IAAIwD,WAAW;MAEfzB,UAAU,CAAC,YAAM;QACfyB,WAAW,GAAG,IAAInB,eAAM,CAAC,CAAC;MAC5B,CAAC,CAAC;MAEFW,SAAS,CAAC;QAAA,OAAMQ,WAAW,CAACF,KAAK,CAAC,CAAC,CAACG,KAAK,CAAC;UAAA,OAAM5C,SAAS;QAAA,EAAC;MAAA,EAAC;MAE3D6C,EAAE,CAAC,gBAAgB,EAAE;QAAA,OAAMC,sBAAM,CAACC,UAAU,CAACJ,WAAW,CAACX,IAAI,CAAC,CAAC,EAAE,mBAAmB,CAAC;MAAA,EAAC;MAEtFa,EAAE,CAAC,mCAAmC,EAAE;QAAA,OACtCC,sBAAM,CAACC,UAAU,CACfJ,WAAW,CAACX,IAAI,CAAC,kBAAkB,CAAC,EACpC,2CACF,CAAC;MAAA,EAAC;MAEJa,EAAE,CAAC,yBAAyB,EAAE;QAAA,OAC5BC,sBAAM,CAACC,UAAU,CACfJ,WAAW,CAACX,IAAI,CAAC,kBAAkB,EAAE;UACnCgB,eAAe,EAAEzD,WAAW,CAACyD;QAC/B,CAAC,CAAC,EACF,iCACF,CAAC;MAAA,EAAC;MAEJH,EAAE,CAAC,8BAA8B,EAAE;QAAA,OACjCC,sBAAM,CAACC,UAAU,CACfJ,WAAW,CAACX,IAAI,CAAC,kBAAkB,EAAE;UACnCgB,eAAe,EAAEzD,WAAW,CAACyD,eAAe;UAC5CtD,KAAK,EAAE;QACT,CAAC,CAAC,EACF,sCACF,CAAC;MAAA,EAAC;MAEJmD,EAAE,CAAC,0BAA0B,EAAE;QAAA,OAC7BC,sBAAM,CAACC,UAAU,CACfJ,WAAW,CAACX,IAAI,CAAC,kBAAkB,EAAE;UACnCgB,eAAe,EAAEzD,WAAW,CAACyD,eAAe;UAC5CtD,KAAK,EAAE,WAAW;UAClBC,UAAU,EAAE;QACd,CAAC,CAAC,EACF,kCACF,CAAC;MAAA,EAAC;MAEJkD,EAAE,CAAC,gCAAgC,EAAE,YAAM;QACzC,IAAMI,WAAW,GAAGN,WAAW,CAACX,IAAI,CAAC,kBAAkB,EAAE;UACvDgB,eAAe,EAAEzD,WAAW,CAACyD,eAAe;UAC5CE,kBAAkB,EAAE3D,WAAW,CAAC2D,kBAAkB;UAClD1D,MAAM,EAAEC,OAAO;UACfC,KAAK,EAAE,WAAW;UAClBC,UAAU,EAAE,gBAAgB;UAC5BwD,aAAa,EAAE;QACjB,CAAC,CAAC;QAEF/D,aAAa,CAACgE,UAAU,GAAG,CAAC;QAC5BhE,aAAa,CAACuB,IAAI,CAAC,MAAM,CAAC;QAE1Bb,gBAAgB,CAAC,CAAC;QAElB,OAAOmD,WAAW,CAACP,IAAI,CAAC,YAAM;UAC5BI,sBAAM,CAACO,KAAK,CAACV,WAAW,CAACQ,aAAa,EAAE,mBAAmB,CAAC;QAC9D,CAAC,CAAC;MACJ,CAAC,CAAC;IACJ,CAAC,CAAC;IAEFhE,QAAQ,CAAC,aAAa,EAAE,YAAM;MAC5B0D,EAAE,CAAC,kCAAkC,EAAE,YAAM;QAC3CC,sBAAM,CAACQ,QAAQ,CAACjE,MAAM,CAACkE,UAAU,EAAE,MAAM,CAAC;QAC1CnE,aAAa,CAACmE,UAAU,GAAG,MAAM;QACjCT,sBAAM,CAACO,KAAK,CAAChE,MAAM,CAACkE,UAAU,EAAE,MAAM,CAAC;MACzC,CAAC,CAAC;IACJ,CAAC,CAAC;IAEFpE,QAAQ,CAAC,iBAAiB,EAAE,YAAM;MAChC0D,EAAE,CAAC,kCAAkC,EAAE,YAAM;QAC3CC,sBAAM,CAACQ,QAAQ,CAACjE,MAAM,CAACmE,cAAc,EAAE,MAAM,CAAC;QAC9CpE,aAAa,CAACoE,cAAc,GAAG,MAAM;QACrCV,sBAAM,CAACO,KAAK,CAAChE,MAAM,CAACmE,cAAc,EAAE,MAAM,CAAC;MAC7C,CAAC,CAAC;IACJ,CAAC,CAAC;IAEFrE,QAAQ,CAAC,aAAa,EAAE,YAAM;MAC5B0D,EAAE,CAAC,kCAAkC,EAAE,YAAM;QAC3CC,sBAAM,CAACQ,QAAQ,CAACjE,MAAM,CAACoE,UAAU,EAAE,MAAM,CAAC;QAC1CrE,aAAa,CAACqE,UAAU,GAAG,MAAM;QACjCX,sBAAM,CAACO,KAAK,CAAChE,MAAM,CAACoE,UAAU,EAAE,MAAM,CAAC;MACzC,CAAC,CAAC;IACJ,CAAC,CAAC;IAEFtE,QAAQ,CAAC,WAAW,EAAE,YAAM;MAC1B0D,EAAE,CAAC,kCAAkC,EAAE,YAAM;QAC3CC,sBAAM,CAACQ,QAAQ,CAACjE,MAAM,CAACqE,QAAQ,EAAE,MAAM,CAAC;QACxCtE,aAAa,CAACsE,QAAQ,GAAG,MAAM;QAC/BZ,sBAAM,CAACO,KAAK,CAAChE,MAAM,CAACqE,QAAQ,EAAE,MAAM,CAAC;MACvC,CAAC,CAAC;IACJ,CAAC,CAAC;IAEFvE,QAAQ,CAAC,aAAa,EAAE,YAAM;MAC5B0D,EAAE,CAAC,kCAAkC,EAAE,YAAM;QAC3CC,sBAAM,CAACQ,QAAQ,CAACjE,MAAM,CAAC+D,UAAU,EAAE,MAAM,CAAC;QAC1ChE,aAAa,CAACgE,UAAU,GAAG,MAAM;QACjCN,sBAAM,CAACO,KAAK,CAAChE,MAAM,CAAC+D,UAAU,EAAE,MAAM,CAAC;MACzC,CAAC,CAAC;IACJ,CAAC,CAAC;IAEFjE,QAAQ,CAAC,MAAM,EAAE,YAAM;MACrB0D,EAAE,CAAC,kCAAkC,EAAE,YAAM;QAC3CC,sBAAM,CAACQ,QAAQ,CAACjE,MAAM,CAACsE,GAAG,EAAE,MAAM,CAAC;QACnCvE,aAAa,CAACuE,GAAG,GAAG,MAAM;QAC1Bb,sBAAM,CAACO,KAAK,CAAChE,MAAM,CAACsE,GAAG,EAAE,MAAM,CAAC;MAClC,CAAC,CAAC;IACJ,CAAC,CAAC;IAEFxE,QAAQ,CAAC,SAAS,EAAE,YAAM;MACxB0D,EAAE,CAAC,0BAA0B,EAAE,YAAM;QACnC,IAAMe,CAAC,GAAG,IAAIpC,eAAM,CAAC,CAAC;QAEtB,OAAOsB,sBAAM,CAACC,UAAU,CAACa,CAAC,CAAC5B,IAAI,CAAC,CAAC,EAAE,mBAAmB,CAAC;MACzD,CAAC,CAAC;MAEFa,EAAE,CAAC,iCAAiC,EAAE;QAAA,OACpCC,sBAAM,CAACC,UAAU,CACf1D,MAAM,CAAC2C,IAAI,CAAC,kBAAkB,CAAC,EAC/B,yCACF,CAAC;MAAA,EAAC;MAEJa,EAAE,CAAC,0CAA0C,EAAE;QAAA,OAC7CC,sBAAM,CAACO,KAAK,CAAChE,MAAM,CAACkE,UAAU,EAAE,aAAa,CAAC;MAAA,EAAC;MAEjDpE,QAAQ,CAAC,yDAAyD,EAAE,YAAM;QACxE0D,EAAE,CAAC,2BAA2B,EAAE,YAAM;UACpC,IAAMe,CAAC,GAAG,IAAIpC,eAAM,CAAC,CAAC;UACtB,IAAMO,OAAO,GAAG6B,CAAC,CAAC5B,IAAI,CAAC,kBAAkB,EAAEzC,WAAW,CAAC;UAEvDH,aAAa,CAACgE,UAAU,GAAG,CAAC;UAC5BhE,aAAa,CAACuB,IAAI,CAAC,MAAM,CAAC;UAE1B,IAAMkD,aAAa,GAAGvD,IAAI,CAACC,KAAK,CAACnB,aAAa,CAACoB,IAAI,CAACsD,SAAS,CAACpD,IAAI,CAAC,CAAC,CAAC,CAAC;UAEtEoC,sBAAM,CAACO,KAAK,CAACQ,aAAa,CAAC/C,IAAI,EAAEE,wBAAa,CAACC,IAAI,CAAC;UAEpD7B,aAAa,CAACuB,IAAI,CAAC,OAAO,EAAE;YAC1BoD,IAAI,EAAE,IAAI;YACVC,MAAM,EAAE;UACV,CAAC,CAAC;UAEF,OAAOlB,sBAAM,CAACC,UAAU,CAAChB,OAAO,CAAC,CAACW,IAAI,CAAC,UAACsB,MAAM,EAAK;YACjDlB,sBAAM,CAACmB,UAAU,CAACD,MAAM,EAAEE,kBAAU,CAAC;YACrCpB,sBAAM,CAACqB,KAAK,CAACH,MAAM,CAACD,IAAI,EAAE,IAAI,CAAC;YAC/BjB,sBAAM,CAACqB,KAAK,CAACH,MAAM,CAACA,MAAM,EAAE,0CAA0C,CAAC;YACvElB,sBAAM,CAACqB,KAAK,CAACH,MAAM,CAACI,OAAO,EAAE,0CAA0C,CAAC;YAExE,OAAOR,CAAC,CAACnB,KAAK,CAAC,CAAC;UAClB,CAAC,CAAC;QACJ,CAAC,CAAC;MACJ,CAAC,CAAC;MAEFtD,QAAQ,CAAC,mDAAmD,EAAE,YAAM;QAClE0D,EAAE,CAAC,8BAA8B,EAAE,YAAM;UACvC,IAAMe,CAAC,GAAG,IAAIpC,eAAM,CAAC,CAAC;UACtB,IAAMO,OAAO,GAAG6B,CAAC,CAAC5B,IAAI,CAAC,kBAAkB,EAAEzC,WAAW,CAAC;UAEvDH,aAAa,CAACgE,UAAU,GAAG,CAAC;UAC5BhE,aAAa,CAACuB,IAAI,CAAC,MAAM,CAAC;UAE1B,IAAMkD,aAAa,GAAGvD,IAAI,CAACC,KAAK,CAACnB,aAAa,CAACoB,IAAI,CAACsD,SAAS,CAACpD,IAAI,CAAC,CAAC,CAAC,CAAC;UAEtEoC,sBAAM,CAACO,KAAK,CAACQ,aAAa,CAAC/C,IAAI,EAAEE,wBAAa,CAACC,IAAI,CAAC;UAEpD7B,aAAa,CAACuB,IAAI,CAAC,OAAO,EAAE;YAC1BoD,IAAI,EAAE,IAAI;YACVC,MAAM,EAAE;UACV,CAAC,CAAC;UAEF,OAAOlB,sBAAM,CAACC,UAAU,CAAChB,OAAO,CAAC,CAACW,IAAI,CAAC,UAACsB,MAAM,EAAK;YACjDlB,sBAAM,CAACmB,UAAU,CAACD,MAAM,EAAEK,qBAAa,CAAC;YACxCvB,sBAAM,CAACqB,KAAK,CAACH,MAAM,CAACD,IAAI,EAAE,IAAI,CAAC;YAC/BjB,sBAAM,CAACqB,KAAK,CAACH,MAAM,CAACA,MAAM,EAAE,sBAAsB,CAAC;YACnDlB,sBAAM,CAACqB,KAAK,CAACH,MAAM,CAACI,OAAO,EAAE,sBAAsB,CAAC;YAEpD,OAAOR,CAAC,CAACnB,KAAK,CAAC,CAAC;UAClB,CAAC,CAAC;QACJ,CAAC,CAAC;MACJ,CAAC,CAAC;MAEFtD,QAAQ,CAAC,wDAAwD,EAAE,YAAM;QACvE0D,EAAE,CAAC,0BAA0B,EAAE,YAAM;UACnC,IAAMe,CAAC,GAAG,IAAIpC,eAAM,CAAC,CAAC;UACtB,IAAMO,OAAO,GAAG6B,CAAC,CAAC5B,IAAI,CAAC,kBAAkB,EAAEzC,WAAW,CAAC;UAEvDH,aAAa,CAACgE,UAAU,GAAG,CAAC;UAC5BhE,aAAa,CAACuB,IAAI,CAAC,MAAM,CAAC;UAE1B,IAAMkD,aAAa,GAAGvD,IAAI,CAACC,KAAK,CAACnB,aAAa,CAACoB,IAAI,CAACsD,SAAS,CAACpD,IAAI,CAAC,CAAC,CAAC,CAAC;UAEtEoC,sBAAM,CAACO,KAAK,CAACQ,aAAa,CAAC/C,IAAI,EAAEE,wBAAa,CAACC,IAAI,CAAC;UAEpD7B,aAAa,CAACuB,IAAI,CAAC,OAAO,EAAE;YAC1BoD,IAAI,EAAE,IAAI;YACVC,MAAM,EAAE;UACV,CAAC,CAAC;UAEF,OAAOlB,sBAAM,CAACC,UAAU,CAAChB,OAAO,CAAC,CAACW,IAAI,CAAC,UAACsB,MAAM,EAAK;YACjDlB,sBAAM,CAACmB,UAAU,CAACD,MAAM,EAAEM,iBAAS,CAAC;YACpCxB,sBAAM,CAACqB,KAAK,CAACH,MAAM,CAACD,IAAI,EAAE,IAAI,CAAC;YAC/BjB,sBAAM,CAACqB,KAAK,CAACH,MAAM,CAACA,MAAM,EAAE,cAAc,CAAC;YAC3ClB,sBAAM,CAACqB,KAAK,CAACH,MAAM,CAACI,OAAO,EAAE,cAAc,CAAC;YAE5C,OAAOR,CAAC,CAACnB,KAAK,CAAC,CAAC;UAClB,CAAC,CAAC;QACJ,CAAC,CAAC;MACJ,CAAC,CAAC;MAEFtD,QAAQ,CAAC,qDAAqD,EAAE,YAAM;QACpE0D,EAAE,CAAC,uCAAuC,EAAE,YAAM;UAChD,IAAMe,CAAC,GAAG,IAAIpC,eAAM,CAAC,CAAC;UACtB,IAAMO,OAAO,GAAG6B,CAAC,CAAC5B,IAAI,CAAC,kBAAkB,EAAEzC,WAAW,CAAC;UAEvDH,aAAa,CAACuB,IAAI,CAAC,OAAO,EAAE;YAC1BoD,IAAI,EAAE,IAAI;YACVC,MAAM,EAAE;UACV,CAAC,CAAC;UAEF,OAAOlB,sBAAM,CAACC,UAAU,CAAChB,OAAO,CAAC,CAACW,IAAI,CAAC,UAACsB,MAAM,EAAK;YACjDlB,sBAAM,CAACmB,UAAU,CAACD,MAAM,EAAEO,uBAAe,CAAC;YAC1CzB,sBAAM,CAACqB,KAAK,CAACH,MAAM,CAACD,IAAI,EAAE,IAAI,CAAC;YAC/BjB,sBAAM,CAACqB,KAAK,CAACH,MAAM,CAACA,MAAM,EAAE,IAAI,CAAC;YACjClB,sBAAM,CAACqB,KAAK,CAACH,MAAM,CAACI,OAAO,EAAE,IAAI,CAAC;YAElC,OAAOR,CAAC,CAACnB,KAAK,CAAC,CAAC;UAClB,CAAC,CAAC;QACJ,CAAC,CAAC;MACJ,CAAC,CAAC;MAEFtD,QAAQ,CAAC,8BAA8B,EAAE,YAAM;QAC7C0D,EAAE,CAAC,qCAAqC,EAAE,YAAM;UAC9C,IAAMgB,aAAa,GAAGvD,IAAI,CAACC,KAAK,CAACnB,aAAa,CAACoB,IAAI,CAACsD,SAAS,CAACpD,IAAI,CAAC,CAAC,CAAC,CAAC;UAEtEoC,sBAAM,CAACO,KAAK,CAACQ,aAAa,CAAC/C,IAAI,EAAEE,wBAAa,CAACC,IAAI,CAAC;UACpD6B,sBAAM,CAAC0B,QAAQ,CAACX,aAAa,EAAE,MAAM,CAAC;UACtCf,sBAAM,CAAC0B,QAAQ,CAACX,aAAa,CAACjD,IAAI,EAAE,OAAO,CAAC;UAC5CkC,sBAAM,CAACO,KAAK,CAACQ,aAAa,CAACjD,IAAI,CAAClB,KAAK,EAAE,WAAW,CAAC;UACnDoD,sBAAM,CAAC0B,QAAQ,CAACX,aAAa,EAAE,YAAY,CAAC;QAC9C,CAAC,CAAC;QAEF1E,QAAQ,CAAC,2BAA2B,EAAE,YAAM;UAC1C0D,EAAE,CAAC,kCAAkC,EAAE,YAAM;YAC3C,IAAMe,CAAC,GAAG,IAAIpC,eAAM,CAAC,CAAC;YAEtBoC,CAAC,CAAC5B,IAAI,CAAC,kBAAkB,EAAE;cACzBgB,eAAe,EAAEzD,WAAW,CAACyD,eAAe;cAC5CE,kBAAkB,EAAE3D,WAAW,CAAC2D,kBAAkB;cAClD1D,MAAM,EAAEC,OAAO;cACfC,KAAK,EAAE,WAAW;cAClBC,UAAU,EAAE;YACd,CAAC,CAAC,CAACiD,KAAK,CAAC,UAACoB,MAAM;cAAA,OAAKvE,OAAO,CAACgF,KAAK,CAACT,MAAM,CAAC;YAAA,EAAC;YAC3C5E,aAAa,CAACgE,UAAU,GAAG,CAAC;YAC5BhE,aAAa,CAACuB,IAAI,CAAC,MAAM,CAAC;YAE1B,IAAMkD,aAAa,GAAGvD,IAAI,CAACC,KAAK,CAACnB,aAAa,CAACoB,IAAI,CAACsD,SAAS,CAACpD,IAAI,CAAC,CAAC,CAAC,CAAC;YAEtEoC,sBAAM,CAACO,KAAK,CAACQ,aAAa,CAAC/C,IAAI,EAAEE,wBAAa,CAACC,IAAI,CAAC;YACpD6B,sBAAM,CAAC0B,QAAQ,CAACX,aAAa,EAAE,MAAM,CAAC;YACtCf,sBAAM,CAACO,KAAK,CAACQ,aAAa,CAACjD,IAAI,CAAClB,KAAK,EAAE,WAAW,CAAC;YACnDoD,sBAAM,CAAC0B,QAAQ,CAACX,aAAa,EAAE,YAAY,CAAC;YAE5C,OAAOD,CAAC,CAACnB,KAAK,CAAC,CAAC;UAClB,CAAC,CAAC;QACJ,CAAC,CAAC;QAEFI,EAAE,CAAC,sDAAsD,EAAE,YAAM;UAC/D,IAAMe,CAAC,GAAG,IAAIpC,eAAM,CAAC,CAAC;UACtB,IAAMO,OAAO,GAAG6B,CAAC,CAAC5B,IAAI,CAAC,kBAAkB,EAAEzC,WAAW,CAAC;UAEvDH,aAAa,CAACgE,UAAU,GAAG,CAAC;UAC5BhE,aAAa,CAACuB,IAAI,CAAC,MAAM,CAAC;UAC1Bb,gBAAgB,CAAC,CAAC;UAElB,OAAOiC,OAAO,CAACW,IAAI,CAAC;YAAA,OAAMkB,CAAC,CAACnB,KAAK,CAAC,CAAC;UAAA,EAAC;QACtC,CAAC,CAAC;QAEFI,EAAE,CAAC,sDAAsD,EAAE,YAAM;UAC/D,IAAMe,CAAC,GAAG,IAAIpC,eAAM,CAAC,CAAC;UACtB,IAAMO,OAAO,GAAG6B,CAAC,CAAC5B,IAAI,CAAC,kBAAkB,EAAEzC,WAAW,CAAC;UAEvDH,aAAa,CAACgE,UAAU,GAAG,CAAC;UAC5BhE,aAAa,CAACuB,IAAI,CAAC,MAAM,CAAC;UAC1Bb,gBAAgB,CAAC;YAACI,UAAU,EAAE,GAAG;YAAEE,aAAa,EAAE;UAAc,CAAC,CAAC;UAElE,OAAO0C,sBAAM,CAACC,UAAU,CAAChB,OAAO,CAAC,CAACW,IAAI,CAAC,UAACsB,MAAM,EAAK;YACjDlB,sBAAM,CAACmB,UAAU,CAACD,MAAM,EAAEK,qBAAa,CAAC;YACxCvB,sBAAM,CAACO,KAAK,CAACW,MAAM,CAACD,IAAI,EAAE,GAAG,CAAC;YAC9BjB,sBAAM,CAACqB,KAAK,CAACH,MAAM,CAACA,MAAM,EAAE,cAAc,CAAC;YAE3C,OAAOJ,CAAC,CAACnB,KAAK,CAAC,CAAC;UAClB,CAAC,CAAC;QACJ,CAAC,CAAC;MACJ,CAAC,CAAC;IACJ,CAAC,CAAC;IAEFtD,QAAQ,CAAC,UAAU,EAAE,YAAM;MACzB0D,EAAE,CAAC,mBAAmB,EAAE;QAAA,OAAMxD,MAAM,CAACoD,KAAK,CAAC,CAAC,CAACC,IAAI,CAAC;UAAA,OAAMI,sBAAM,CAAC4B,MAAM,CAACtF,aAAa,CAACqD,KAAK,CAAC;QAAA,EAAC;MAAA,EAAC;MAE5FI,EAAE,CAAC,gCAAgC,EAAE;QAAA,OACnCN,QAAA,CAAA7D,OAAA,CAAQiG,GAAG,CAAC,CACV7B,sBAAM,CAACC,UAAU,CACf1D,MAAM,CAACoD,KAAK,CAAC;UAACsB,IAAI,EAAE;QAAI,CAAC,CAAC,EAC1B,oEACF,CAAC,EACD1E,MAAM,CAACoD,KAAK,CAAC;UAACsB,IAAI,EAAE;QAAI,CAAC,CAAC,CAC3B,CAAC;MAAA,EAAC;MAELlB,EAAE,CAAC,kBAAkB,EAAE;QAAA,OACrBxD,MAAM,CACHoD,KAAK,CAAC;UACLsB,IAAI,EAAE,IAAI;UACVC,MAAM,EAAE;QACV,CAAC,CAAC,CACDtB,IAAI,CAAC;UAAA,OAAMI,sBAAM,CAAC8B,UAAU,CAACxF,aAAa,CAACqD,KAAK,EAAE,IAAI,EAAE,eAAe,CAAC;QAAA,EAAC;MAAA,EAAC;MAE/EI,EAAE,CAAC,2BAA2B,EAAE;QAAA,OAC9BxD,MAAM,CACHoD,KAAK,CAAC;UACLsB,IAAI,EAAE,IAAI;UACVC,MAAM,EAAE;QACV,CAAC,CAAC,CACDtB,IAAI,CAAC;UAAA,OAAMI,sBAAM,CAAC8B,UAAU,CAACxF,aAAa,CAACqD,KAAK,EAAE,IAAI,EAAE,kBAAkB,CAAC;QAAA,EAAC;MAAA,EAAC;MAElFI,EAAE,CAAC,4CAA4C,EAAE,YAAM;QACrD,IAAMgC,EAAE,GAAGxF,MAAM,CAACoD,KAAK,CAAC,CAAC;QAEzBrD,aAAa,CAACgE,UAAU,GAAG,CAAC;QAC5B,IAAM0B,EAAE,GAAGzF,MAAM,CAACoD,KAAK,CAAC,CAAC;QAEzB,OAAOF,QAAA,CAAA7D,OAAA,CAAQiG,GAAG,CAAC,CAACE,EAAE,EAAEC,EAAE,CAAC,CAAC;MAC9B,CAAC,CAAC;MAEFjC,EAAE,CAAC,2EAA2E,EAAE,YAAM;QACpF,IAAMkC,eAAe,GAAG,IAAIvD,eAAM,CAAC,CAAC;QACpC,IAAMyB,WAAW,GAAG8B,eAAe,CAAC/C,IAAI,CAAC,kBAAkB,EAAEzC,WAAW,CAAC;QAEzEH,aAAa,CAACgE,UAAU,GAAG,CAAC;QAC5BhE,aAAa,CAACuB,IAAI,CAAC,MAAM,CAAC;QAC1Bb,gBAAgB,CAAC,CAAC;QAElB,OAAOmD,WAAW,CAACP,IAAI,CAAC,YAAM;UAC5B,IAAMsC,GAAG,GAAG1D,cAAK,CAAC0D,GAAG,CAAC,CAAC;UAEvBD,eAAe,CAACE,EAAE,CAAC,OAAO,EAAED,GAAG,CAAC;UAChC5F,aAAa,CAACqD,KAAK,GAAG;YAAA,OACpB,IAAAF,QAAA,CAAA7D,OAAA,CAAY,YAAM;cAChB;YAAA,CACD,CAAC;UAAA;UACJU,aAAa,CAAC8F,kBAAkB,CAAC,OAAO,CAAC;UAEzC,IAAMC,YAAY,GAAGJ,eAAe,CAACtC,KAAK,CAAC,CAAC;UAE5CtB,IAAI,CAACiE,mBAAmB,CAAC7F,WAAW,CAACyD,eAAe,CAAC;UAErD,OAAOmC,YAAY,CAACzC,IAAI,CAAC,YAAM;YAC7BI,sBAAM,CAAC4B,MAAM,CAACM,GAAG,CAAC;YAClBlC,sBAAM,CAAC8B,UAAU,CAACI,GAAG,EAAE;cACrBjB,IAAI,EAAE,IAAI;cACVC,MAAM,EAAE;YACV,CAAC,CAAC;UACJ,CAAC,CAAC;QACJ,CAAC,CAAC;MACJ,CAAC,CAAC;MAEFnB,EAAE,CAAC,8IAA8I,EAAE,YAAM;QACvJ,IAAMkC,eAAe,GAAG,IAAIvD,eAAM,CAAC,CAAC;QACpC,IAAMyB,WAAW,GAAG8B,eAAe,CAAC/C,IAAI,CAAC,kBAAkB,EAAEzC,WAAW,CAAC;QAEzEH,aAAa,CAACgE,UAAU,GAAG,CAAC;QAC5BhE,aAAa,CAACuB,IAAI,CAAC,MAAM,CAAC;QAC1Bb,gBAAgB,CAAC,CAAC;QAElB,OAAOmD,WAAW,CAACP,IAAI,CAAC,YAAM;UAC5B,IAAMsC,GAAG,GAAG1D,cAAK,CAAC0D,GAAG,CAAC,CAAC;UAEvBD,eAAe,CAACE,EAAE,CAAC,OAAO,EAAED,GAAG,CAAC;UAChC5F,aAAa,CAACqD,KAAK,GAAG;YAAA,OACpB,IAAAF,QAAA,CAAA7D,OAAA,CAAY,YAAM;cAChB;YAAA,CACD,CAAC;UAAA;UACJU,aAAa,CAAC8F,kBAAkB,CAAC,OAAO,CAAC;UAEzC,IAAMC,YAAY,GAAGJ,eAAe,CAACtC,KAAK,CAAC;YAACsB,IAAI,EAAE,IAAI;YAAEC,MAAM,EAAE;UAAkB,CAAC,CAAC;UAEpF7C,IAAI,CAACiE,mBAAmB,CAAC7F,WAAW,CAACyD,eAAe,CAAC;UAErD,OAAOmC,YAAY,CAACzC,IAAI,CAAC,YAAM;YAC7BI,sBAAM,CAAC4B,MAAM,CAACM,GAAG,CAAC;YAClBlC,sBAAM,CAAC8B,UAAU,CAACI,GAAG,EAAE;cACrBjB,IAAI,EAAE,IAAI;cACVC,MAAM,EAAE;YACV,CAAC,CAAC;UACJ,CAAC,CAAC;QACJ,CAAC,CAAC;MACJ,CAAC,CAAC;MAEFnB,EAAE,CAAC,qIAAqI,EAAE,YAAM;QAC9I,IAAMkC,eAAe,GAAG,IAAIvD,eAAM,CAAC,CAAC;QACpC,IAAMyB,WAAW,GAAG8B,eAAe,CAAC/C,IAAI,CAAC,kBAAkB,EAAEzC,WAAW,CAAC;QAEzEH,aAAa,CAACgE,UAAU,GAAG,CAAC;QAC5BhE,aAAa,CAACuB,IAAI,CAAC,MAAM,CAAC;QAC1Bb,gBAAgB,CAAC,CAAC;QAElB,OAAOmD,WAAW,CAACP,IAAI,CAAC,YAAM;UAC5B,IAAMsC,GAAG,GAAG1D,cAAK,CAAC0D,GAAG,CAAC,CAAC;UAEvBD,eAAe,CAACE,EAAE,CAAC,OAAO,EAAED,GAAG,CAAC;UAChC5F,aAAa,CAACqD,KAAK,GAAG;YAAA,OACpB,IAAAF,QAAA,CAAA7D,OAAA,CAAY,YAAM;cAChB;YAAA,CACD,CAAC;UAAA;UACJU,aAAa,CAAC8F,kBAAkB,CAAC,OAAO,CAAC;UAEzC,IAAMC,YAAY,GAAGJ,eAAe,CAACtC,KAAK,CAAC;YAACsB,IAAI,EAAE,IAAI;YAAEC,MAAM,EAAE;UAAM,CAAC,CAAC;UAExE7C,IAAI,CAACiE,mBAAmB,CAAC7F,WAAW,CAACyD,eAAe,CAAC;UAErD,OAAOmC,YAAY,CAACzC,IAAI,CAAC,YAAM;YAC7BI,sBAAM,CAAC4B,MAAM,CAACM,GAAG,CAAC;YAClBlC,sBAAM,CAAC8B,UAAU,CAACI,GAAG,EAAE;cACrBjB,IAAI,EAAE,IAAI;cACVC,MAAM,EAAE;YACV,CAAC,CAAC;UACJ,CAAC,CAAC;QACJ,CAAC,CAAC;MACJ,CAAC,CAAC;MAEFnB,EAAE,CAAC,qIAAqI,EAAE,YAAM;QAC9I,IAAMkC,eAAe,GAAG,IAAIvD,eAAM,CAAC,CAAC;QACpC,IAAMyB,WAAW,GAAG8B,eAAe,CAAC/C,IAAI,CAAC,kBAAkB,EAAEzC,WAAW,CAAC;QAEzEH,aAAa,CAACgE,UAAU,GAAG,CAAC;QAC5BhE,aAAa,CAACuB,IAAI,CAAC,MAAM,CAAC;QAC1Bb,gBAAgB,CAAC,CAAC;QAElB,OAAOmD,WAAW,CAACP,IAAI,CAAC,YAAM;UAC5B,IAAMsC,GAAG,GAAG1D,cAAK,CAAC0D,GAAG,CAAC,CAAC;UAEvBD,eAAe,CAACE,EAAE,CAAC,OAAO,EAAED,GAAG,CAAC;UAChC5F,aAAa,CAACqD,KAAK,GAAG;YAAA,OACpB,IAAAF,QAAA,CAAA7D,OAAA,CAAY,YAAM;cAChB;YAAA,CACD,CAAC;UAAA;UACJU,aAAa,CAAC8F,kBAAkB,CAAC,OAAO,CAAC;UAEzC,IAAMC,YAAY,GAAGJ,eAAe,CAACtC,KAAK,CAAC;YAACsB,IAAI,EAAE;UAAI,CAAC,CAAC;UAExD5C,IAAI,CAACiE,mBAAmB,CAAC7F,WAAW,CAACyD,eAAe,CAAC;UAErD,OAAOmC,YAAY,CAACzC,IAAI,CAAC,YAAM;YAC7BI,sBAAM,CAAC4B,MAAM,CAACM,GAAG,CAAC;YAClBlC,sBAAM,CAAC8B,UAAU,CAACI,GAAG,EAAE;cACrBjB,IAAI,EAAE,IAAI;cACVC,MAAM,EAAE;YACV,CAAC,CAAC;UACJ,CAAC,CAAC;QACJ,CAAC,CAAC;MACJ,CAAC,CAAC;MAEF,CACE;QACEqB,WAAW,EAAE,iEAAiE;QAC9EC,YAAY,EAAE;UAACvB,IAAI,EAAE,IAAI;UAAEC,MAAM,EAAE;QAA+B,CAAC;QACnEuB,YAAY,EAAE,IAAI;QAClBC,cAAc,EAAE;MAClB,CAAC,EACD;QACEH,WAAW,EACT,6EAA6E;QAC/EC,YAAY,EAAEtF,SAAS;QACvBuF,YAAY,EAAE,IAAI;QAClBC,cAAc,EAAE;MAClB,CAAC,CACF,CAAChH,OAAO,CAAC,UAAAiH,KAAA,EAA+D;QAAA,IAA7DJ,WAAW,GAAAI,KAAA,CAAXJ,WAAW;UAAEC,YAAY,GAAAG,KAAA,CAAZH,YAAY;UAAEC,YAAY,GAAAE,KAAA,CAAZF,YAAY;UAAEC,cAAc,GAAAC,KAAA,CAAdD,cAAc;QACjE3C,EAAE,CAACwC,WAAW,mBAAAK,kBAAA,CAAAhH,OAAA,eAAAiH,YAAA,CAAAjH,OAAA,CAAAkH,IAAA,CAAE,SAAAC,QAAA;UAAA,IAAAjC,CAAA,EAAAkC,cAAA,EAAAC,YAAA,EAAAC,QAAA,EAAAC,MAAA;UAAA,OAAAN,YAAA,CAAAjH,OAAA,CAAAwH,IAAA,WAAAC,QAAA;YAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;cAAA;gBACRzC,CAAC,GAAG,IAAIpC,eAAM,CAAC,CAAC;gBAGtB;gBACMuE,YAAY,GAAGvE,eAAM,CAACa,uBAAuB;gBACnDb,eAAM,CAACa,uBAAuB,GAAGf,cAAK,CAACC,IAAI,CAAC,CAAC,CAACE,SAAS,CACrD;kBAAA,OACE,YAAmB;oBAAA,SAAA6E,KAAA,GAAAjI,SAAA,CAAAC,MAAA,EAANoC,IAAI,OAAAiB,KAAA,CAAA2E,KAAA,GAAAC,KAAA,MAAAA,KAAA,GAAAD,KAAA,EAAAC,KAAA;sBAAJ7F,IAAI,CAAA6F,KAAA,IAAAlI,SAAA,CAAAkI,KAAA;oBAAA;oBACfT,cAAc,OAAAjE,WAAA,CAAAnD,OAAA,EAAOoD,gCAAa,EAAIpB,IAAI,CAAC;oBAE3C,OAAOoF,cAAc;kBACvB,CAAC;gBAAA,CACL,CAAC;;gBAED;gBACAlC,CAAC,CAAC5B,IAAI,CAAC,kBAAkB,EAAEzC,WAAW,CAAC;;gBAEvC;gBACAuG,cAAc,CAAC1C,UAAU,GAAG,CAAC;gBAEvB4C,QAAQ,GAAG1E,cAAK,CAAC0D,GAAG,CAAC,CAAC;gBAC5BpB,CAAC,CAACqB,EAAE,CAAC,OAAO,EAAEe,QAAQ,CAAC;;gBAEvB;gBAAAG,QAAA,CAAAE,IAAA;gBAAA,OACqBzC,CAAC,CAACnB,KAAK,CAAC6C,YAAY,CAAC;cAAA;gBAApCW,MAAM,GAAAE,QAAA,CAAAK,IAAA;gBAEZ;gBACA1D,sBAAM,CAACO,KAAK,CAAC4C,MAAM,CAAClC,IAAI,EAAEwB,YAAY,CAAC;gBACvCzC,sBAAM,CAACO,KAAK,CAAC4C,MAAM,CAACjC,MAAM,EAAEwB,cAAc,CAAC;;gBAE3C;gBACA1C,sBAAM,CAAC2D,UAAU,CAACT,QAAQ,CAAC;gBAC3BlD,sBAAM,CAAC8B,UAAU,CAACoB,QAAQ,EAAE;kBAC1BjC,IAAI,EAAEwB,YAAY;kBAClBvB,MAAM,EAAEwB;gBACV,CAAC,CAAC;;gBAEF;gBACA1C,sBAAM,CAAC2D,UAAU,CAACX,cAAc,CAACrD,KAAK,CAAC;gBACvCK,sBAAM,CAAC8B,UAAU,CAACkB,cAAc,CAACrD,KAAK,EAAE8C,YAAY,EAAEC,cAAc,CAAC;;gBAErE;gBACAhE,eAAM,CAACa,uBAAuB,GAAG0D,YAAY;cAAC;cAAA;gBAAA,OAAAI,QAAA,CAAAO,IAAA;YAAA;UAAA,GAAAb,OAAA;QAAA,CAC/C,GAAC;MACJ,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF1G,QAAQ,CAAC,SAAS,EAAE,YAAM;MACxBA,QAAQ,CAAC,0CAA0C,EAAE,YAAM;QACzD0D,EAAE,CAAC,OAAO,EAAE,YAAM;UAChBzD,aAAa,CAACgE,UAAU,GAAG,CAAC;UAE5B,OAAON,sBAAM,CACVC,UAAU,CAAC1D,MAAM,CAACmB,IAAI,CAAC,OAAO,CAAC,EAAE,qBAAqB,CAAC,CACvDkC,IAAI,CAAC,YAAM;YACVtD,aAAa,CAACgE,UAAU,GAAG,CAAC;YAE5B,OAAON,sBAAM,CAACC,UAAU,CAAC1D,MAAM,CAACmB,IAAI,CAAC,OAAO,CAAC,EAAE,qBAAqB,CAAC;UACvE,CAAC,CAAC,CACDkC,IAAI,CAAC,YAAM;YACVtD,aAAa,CAACgE,UAAU,GAAG,CAAC;YAE5B,OAAON,sBAAM,CAACC,UAAU,CAAC1D,MAAM,CAACmB,IAAI,CAAC,OAAO,CAAC,EAAE,qBAAqB,CAAC;UACvE,CAAC,CAAC,CACDkC,IAAI,CAAC,YAAM;YACVtD,aAAa,CAACgE,UAAU,GAAG,CAAC;YAE5B,OAAO/D,MAAM,CAACmB,IAAI,CAAC,OAAO,CAAC;UAC7B,CAAC,CAAC;QACN,CAAC,CAAC;MACJ,CAAC,CAAC;MAEFqC,EAAE,CAAC,eAAe,EAAE,YAAM;QACxBxD,MAAM,CAACmB,IAAI,CAAC,kBAAkB,CAAC;QAC/BsC,sBAAM,CAAC8B,UAAU,CAACxF,aAAa,CAACoB,IAAI,EAAE,kBAAkB,CAAC;MAC3D,CAAC,CAAC;MAEFqC,EAAE,CAAC,iCAAiC,EAAE,YAAM;QAC1CxD,MAAM,CAACmB,IAAI,CAAC;UACVmG,IAAI,EAAE;QACR,CAAC,CAAC;QACF7D,sBAAM,CAAC8B,UAAU,CAACxF,aAAa,CAACoB,IAAI,EAAE,eAAe,CAAC;MACxD,CAAC,CAAC;IACJ,CAAC,CAAC;IAEFrB,QAAQ,CAAC,YAAY,EAAE,YAAM;MAC3BA,QAAQ,CAAC,kCAAkC,EAAE,YAAM;QACjD,IAAAyH,SAAA,CAAAlI,OAAA,EACE;UACEmI,QAAQ,EAAE,IAAI;UACd,uBAAuB,EAAE,IAAI;UAC7B,2EAA2E,EAAE;QAC/E,CAAC,EACD,UAAC9C,IAAI,EAAEC,MAAM,EAAK;UAChBnB,EAAE,eAAAiE,MAAA,CAAe/C,IAAI,kBAAA+C,MAAA,CAAe9C,MAAM,GAAI,YAAM;YAClD,IAAMgB,GAAG,GAAG1D,cAAK,CAAC0D,GAAG,CAAC,CAAC;YAEvB3F,MAAM,CAAC4F,EAAE,CAAC,OAAO,EAAED,GAAG,CAAC;YAEvB5F,aAAa,CAACuB,IAAI,CAAC,OAAO,EAAE;cAC1BoD,IAAI,EAAE,IAAI;cACVC,MAAM,EAANA;YACF,CAAC,CAAC;YACFlB,sBAAM,CAAC4B,MAAM,CAACM,GAAG,CAAC;YAClBlC,sBAAM,CAAC8B,UAAU,CAACI,GAAG,EAAE;cACrBjB,IAAI,EAAJA,IAAI;cACJC,MAAM,EAANA;YACF,CAAC,CAAC;UACJ,CAAC,CAAC;QACJ,CACF,CAAC;MACH,CAAC,CAAC;MAEF7E,QAAQ,CAAC,kCAAkC,EAAE,YAAM;QACjD0D,EAAE,CAAC,+BAA+B,EAAE,YAAM;UACxC,IAAMkB,IAAI,GAAG,IAAI;UACjB,IAAMC,MAAM,GAAG,kBAAkB;UACjC,IAAMgB,GAAG,GAAG1D,cAAK,CAAC0D,GAAG,CAAC,CAAC;UAEvB3F,MAAM,CAAC4F,EAAE,CAAC,OAAO,EAAED,GAAG,CAAC;UAEvB5F,aAAa,CAACuB,IAAI,CAAC,OAAO,EAAE;YAC1BoD,IAAI,EAAJA,IAAI;YACJC,MAAM,EAANA;UACF,CAAC,CAAC;UACFlB,sBAAM,CAAC4B,MAAM,CAACM,GAAG,CAAC;UAClBlC,sBAAM,CAAC8B,UAAU,CAACI,GAAG,EAAE;YACrBjB,IAAI,EAAJA,IAAI;YACJC,MAAM,EAANA;UACF,CAAC,CAAC;QACJ,CAAC,CAAC;MACJ,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF7E,QAAQ,CAAC,cAAc,EAAE,YAAM;MAC7B,IAAI6F,GAAG;MAEP9D,UAAU,CAAC,YAAM;QACf8D,GAAG,GAAG1D,cAAK,CAAC0D,GAAG,CAAC,CAAC;QACjB3F,MAAM,CAAC4F,EAAE,CAAC,SAAS,EAAED,GAAG,CAAC;MAC3B,CAAC,CAAC;MAEFnC,EAAE,CAAC,2CAA2C,EAAE,YAAM;QACpDzD,aAAa,CAACuB,IAAI,CAAC,SAAS,EAAE;UAC5BC,IAAI,EAAE,IAAAC,UAAA,CAAAnC,OAAA,EAAe;YACnBqI,EAAE,EAAE;UACN,CAAC;QACH,CAAC,CAAC;QAEFjE,sBAAM,CAAC4B,MAAM,CAACM,GAAG,CAAC;MACpB,CAAC,CAAC;MAEFnC,EAAE,CAAC,0BAA0B,EAAE,YAAM;QACnCzD,aAAa,CAACuB,IAAI,CAAC,SAAS,EAAE;UAC5BC,IAAI,EAAE,IAAAC,UAAA,CAAAnC,OAAA,EAAe;YACnBqI,EAAE,EAAE,QAAQ;YACZjG,IAAI,EAAE;UACR,CAAC;QACH,CAAC,CAAC;QAEFgC,sBAAM,CAAC8B,UAAU,CAACI,GAAG,EAAE;UACrBpE,IAAI,EAAE;YACJmG,EAAE,EAAE,QAAQ;YACZjG,IAAI,EAAE;UACR;QACF,CAAC,CAAC;MACJ,CAAC,CAAC;MAEF+B,EAAE,CAAC,gEAAgE,EAAE,YAAM;QACzEzD,aAAa,CAACuB,IAAI,CAAC,SAAS,EAAE;UAC5BC,IAAI,EAAE,IAAAC,UAAA,CAAAnC,OAAA,EAAe;YACnBoC,IAAI,EAAE,aAAa;YACnBnB,UAAU,EAAE,0CAA0C;YACtDqH,OAAO,EAAE,sCAAsC;YAC/CpG,IAAI,EAAE;cACJqG,SAAS,EAAE,iBAAiB;cAC5BC,MAAM,EAAE,sCAAsC;cAC9CC,QAAQ,EAAE;YACZ;UACF,CAAC;QACH,CAAC,CAAC;QAEFrE,sBAAM,CAAC8B,UAAU,CAACI,GAAG,EAAE;UACrBpE,IAAI,EAAE;YACJE,IAAI,EAAE,aAAa;YACnBnB,UAAU,EAAE,0CAA0C;YACtDqH,OAAO,EAAE,sCAAsC;YAC/CpG,IAAI,EAAE;cACJqG,SAAS,EAAE,iBAAiB;cAC5BC,MAAM,EAAE,sCAAsC;cAC9CC,QAAQ,EAAE;YACZ;UACF;QACF,CAAC,CAAC;MACJ,CAAC,CAAC;MAEFtE,EAAE,CAAC,wCAAwC,EAAE,YAAM;QACjDvB,cAAK,CAAC0D,GAAG,CAAC3F,MAAM,EAAE,aAAa,CAAC;QAChCD,aAAa,CAACuB,IAAI,CAAC,SAAS,EAAE;UAC5BC,IAAI,EAAE,IAAAC,UAAA,CAAAnC,OAAA,EAAe;YACnBoC,IAAI,EAAE,aAAa;YACnBkG,OAAO,EAAE,WAAW;YACpBrH,UAAU,EAAE;UACd,CAAC;QACH,CAAC,CAAC;QACFmD,sBAAM,CAAC4B,MAAM,CAACrF,MAAM,CAAC+H,WAAW,CAAC;MACnC,CAAC,CAAC;MAEFvE,EAAE,CAAC,+CAA+C,EAAE,YAAM;QACxDvB,cAAK,CAAC0D,GAAG,CAAC3F,MAAM,EAAE,aAAa,CAAC;QAChCD,aAAa,CAACuB,IAAI,CAAC,SAAS,EAAE;UAC5BC,IAAI,EAAE,IAAAC,UAAA,CAAAnC,OAAA,EAAe;YACnBoC,IAAI,EAAE,SAAS;YACfiG,EAAE,EAAE;UACN,CAAC;QACH,CAAC,CAAC;QACFjE,sBAAM,CAACuE,SAAS,CAAChI,MAAM,CAAC+H,WAAW,CAAC;MACtC,CAAC,CAAC;IACJ,CAAC,CAAC;IAEFjI,QAAQ,CAAC,cAAc,EAAE,YAAM;MAC7B0D,EAAE,CAAC,mBAAmB,EAAE;QAAA,OAAMC,sBAAM,CAACC,UAAU,CAAC1D,MAAM,CAAC+H,WAAW,CAAC,CAAC,EAAE,qBAAqB,CAAC;MAAA,EAAC;MAE7FvE,EAAE,CAAC,uDAAuD,EAAE;QAAA,OAC1DxD,MAAM,CACH+H,WAAW,CAAC;UACXxG,IAAI,EAAE;YACJoG,OAAO,EAAE,WAAW;YACpBrH,UAAU,EAAE;UACd;QACF,CAAC,CAAC,CACD+C,IAAI,CAAC,YAAM;UACVI,sBAAM,CAAC8B,UAAU,CACfxF,aAAa,CAACoB,IAAI,EAClB,IAAAK,UAAA,CAAAnC,OAAA,EAAe;YACboC,IAAI,EAAEE,wBAAa,CAACsG,SAAS;YAC7B3H,UAAU,EAAE,cAAc;YAC1BqH,OAAO,EAAE;UACX,CAAC,CACH,CAAC;QACH,CAAC,CAAC;MAAA,EAAC;IACT,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_crypto","require","_testHelperChai","_testHelperMockWebSocket","_interopRequireDefault","_sinon","_errors","_config","_socket","_constants","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty3","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty2","crypto","randomUUID","_defineProperty2","value","configurable","describe","mockWebSocket","socket","usingFakeTimers","mockoptions","logger","console","token","trackingId","config","mobiusSocket","emitAuthResponse","_ref","undefined","_ref$statusCode","statusCode","_ref$statusMessage","statusMessage","authRequest","JSON","parse","send","lastCall","args","emit","data","_stringify","type","subtype","MESSAGE_TYPES","AUTH","beforeEach","jest","useFakeTimers","doNotFake","sinon","stub","Socket","callsFake","_len","Array","_key","_construct2","MockWebSocket","promise","open","process","nextTick","afterEach","useRealTimers","getWebSocketConstructor","restore","_promise","resolve","close","then","freshSocket","catch","it","assert","isRejected","forceCloseDelay","openPromise","wssResponseTimeout","logLevelToken","readyState","equal","notEqual","binaryType","bufferedAmount","extensions","protocol","url","s","firstCallArgs","firstCall","code","reason","instanceOf","BadRequest","match","message","NotAuthorized","Forbidden","ConnectionError","property","error","name","called","all","calledWith","p1","p2","transientSocket","spy","on","removeAllListeners","closePromise","advanceTimersByTime","description","closeOptions","expectedCode","expectedReason","_ref2","_asyncToGenerator2","_regenerator","mark","_callee","socketInstance","previousStub","closeSpy","result","wrap","_context","prev","next","_len2","_key2","sent","calledOnce","stop","json","_forEach2","Replaced","concat","id","eventId","eventType","callId","deviceId","acknowledge","notCalled","EVENT_ACK"],"sources":["socket.test.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {randomUUID} from 'crypto';\nimport {forEach} from 'lodash';\nimport {assert} from '@webex/test-helper-chai';\nimport MockWebSocket from '@webex/test-helper-mock-web-socket';\nimport sinon from 'sinon';\nimport {BadRequest, NotAuthorized, Forbidden, ConnectionError} from './errors';\nimport config from './config';\nimport Socket from './socket';\nimport {MESSAGE_TYPES} from './socket/constants';\n\nif (!crypto.randomUUID) {\n Object.defineProperty(crypto, 'randomUUID', {\n value: randomUUID,\n configurable: true,\n });\n}\n\ndescribe('plugin-mobius-socket', () => {\n describe('Socket', () => {\n let mockWebSocket;\n let socket;\n let usingFakeTimers;\n\n const mockoptions = {\n logger: console,\n token: 'mocktoken',\n trackingId: 'mocktrackingid',\n ...config.mobiusSocket,\n };\n\n const emitAuthResponse = ({statusCode = 200, statusMessage = 'OK'} = {}) => {\n const authRequest = JSON.parse(mockWebSocket.send.lastCall.args[0]);\n\n mockWebSocket.emit('message', {\n data: JSON.stringify({\n type: 'response_event',\n subtype: MESSAGE_TYPES.AUTH,\n trackingId: authRequest.trackingId,\n statusCode,\n statusMessage,\n }),\n });\n };\n\n beforeEach(() => {\n jest.useFakeTimers({doNotFake: ['nextTick']});\n usingFakeTimers = true;\n });\n\n beforeEach(() => {\n sinon.stub(Socket, 'getWebSocketConstructor').callsFake(\n () =>\n function (...args) {\n mockWebSocket = new MockWebSocket(...args);\n\n return mockWebSocket;\n }\n );\n\n socket = new Socket();\n const promise = socket.open('ws://example.com', mockoptions);\n\n mockWebSocket.open();\n // Simulate Mobius auth response (MockWebSocket.open auto-sends mercury.buffer_state which Mobius ignores)\n process.nextTick(() => {\n emitAuthResponse();\n });\n\n return promise;\n });\n\n afterEach(() => {\n if (usingFakeTimers) {\n jest.useRealTimers();\n usingFakeTimers = false;\n }\n\n Socket.getWebSocketConstructor.restore();\n\n return Promise.resolve(socket && socket.close()).then(() => {\n mockWebSocket = undefined;\n socket = undefined;\n });\n });\n\n describe('#open()', () => {\n let freshSocket;\n\n beforeEach(() => {\n freshSocket = new Socket();\n });\n\n afterEach(() => freshSocket.close().catch(() => undefined));\n\n it('requires a url', () => assert.isRejected(freshSocket.open(), /`url` is required/));\n\n it('requires a forceCloseDelay option', () =>\n assert.isRejected(\n freshSocket.open('ws://example.com'),\n /missing required property forceCloseDelay/\n ));\n\n it('requires a token option', () =>\n assert.isRejected(\n freshSocket.open('ws://example.com', {\n forceCloseDelay: mockoptions.forceCloseDelay,\n }),\n /missing required property token/\n ));\n\n it('requires a trackingId option', () =>\n assert.isRejected(\n freshSocket.open('ws://example.com', {\n forceCloseDelay: mockoptions.forceCloseDelay,\n token: 'mocktoken',\n }),\n /missing required property trackingId/\n ));\n\n it('requires a logger option', () =>\n assert.isRejected(\n freshSocket.open('ws://example.com', {\n forceCloseDelay: mockoptions.forceCloseDelay,\n token: 'mocktoken',\n trackingId: 'mocktrackingid',\n }),\n /missing required property logger/\n ));\n\n it('accepts a logLevelToken option', () => {\n const openPromise = freshSocket.open('ws://example.com', {\n forceCloseDelay: mockoptions.forceCloseDelay,\n wssResponseTimeout: mockoptions.wssResponseTimeout,\n logger: console,\n token: 'mocktoken',\n trackingId: 'mocktrackingid',\n logLevelToken: 'mocklogleveltoken',\n });\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n\n emitAuthResponse();\n\n return openPromise.then(() => {\n assert.equal(freshSocket.logLevelToken, 'mocklogleveltoken');\n });\n });\n });\n\n describe('#binaryType', () => {\n it('proxies to the underlying socket', () => {\n assert.notEqual(socket.binaryType, 'test');\n mockWebSocket.binaryType = 'test';\n assert.equal(socket.binaryType, 'test');\n });\n });\n\n describe('#bufferedAmount', () => {\n it('proxies to the underlying socket', () => {\n assert.notEqual(socket.bufferedAmount, 'test');\n mockWebSocket.bufferedAmount = 'test';\n assert.equal(socket.bufferedAmount, 'test');\n });\n });\n\n describe('#extensions', () => {\n it('proxies to the underlying socket', () => {\n assert.notEqual(socket.extensions, 'test');\n mockWebSocket.extensions = 'test';\n assert.equal(socket.extensions, 'test');\n });\n });\n\n describe('#protocol', () => {\n it('proxies to the underlying socket', () => {\n assert.notEqual(socket.protocol, 'test');\n mockWebSocket.protocol = 'test';\n assert.equal(socket.protocol, 'test');\n });\n });\n\n describe('#readyState', () => {\n it('proxies to the underlying socket', () => {\n assert.notEqual(socket.readyState, 'test');\n mockWebSocket.readyState = 'test';\n assert.equal(socket.readyState, 'test');\n });\n });\n\n describe('#url', () => {\n it('proxies to the underlying socket', () => {\n assert.notEqual(socket.url, 'test');\n mockWebSocket.url = 'test';\n assert.equal(socket.url, 'test');\n });\n });\n\n describe('#open()', () => {\n it('requires a url parameter', () => {\n const s = new Socket();\n\n return assert.isRejected(s.open(), /`url` is required/);\n });\n\n it('cannot be called more than once', () =>\n assert.isRejected(\n socket.open('ws://example.com'),\n /Socket#open\\(\\) can only be called once/\n ));\n\n it(\"sets the underlying socket's binary type\", () =>\n assert.equal(socket.binaryType, 'arraybuffer'));\n\n describe('when connection fails because this is a service account', () => {\n it('rejects with a BadRequest', () => {\n const s = new Socket();\n const promise = s.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n\n const firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);\n\n assert.equal(firstCallArgs.type, MESSAGE_TYPES.AUTH);\n\n mockWebSocket.emit('close', {\n code: 4400,\n reason: \"Service accounts can't use this endpoint\",\n });\n\n return assert.isRejected(promise).then((reason) => {\n assert.instanceOf(reason, BadRequest);\n assert.match(reason.code, 4400);\n assert.match(reason.reason, /Service accounts can't use this endpoint/);\n assert.match(reason.message, /Service accounts can't use this endpoint/);\n\n return s.close();\n });\n });\n });\n\n describe('when connection fails because of an invalid token', () => {\n it('rejects with a NotAuthorized', () => {\n const s = new Socket();\n const promise = s.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n\n const firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);\n\n assert.equal(firstCallArgs.type, MESSAGE_TYPES.AUTH);\n\n mockWebSocket.emit('close', {\n code: 4401,\n reason: 'Authorization Failed',\n });\n\n return assert.isRejected(promise).then((reason) => {\n assert.instanceOf(reason, NotAuthorized);\n assert.match(reason.code, 4401);\n assert.match(reason.reason, /Authorization Failed/);\n assert.match(reason.message, /Authorization Failed/);\n\n return s.close();\n });\n });\n });\n\n describe('when connection fails because of a missing entitlement', () => {\n it('rejects with a Forbidden', () => {\n const s = new Socket();\n const promise = s.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n\n const firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);\n\n assert.equal(firstCallArgs.type, MESSAGE_TYPES.AUTH);\n\n mockWebSocket.emit('close', {\n code: 4403,\n reason: 'Not entitled',\n });\n\n return assert.isRejected(promise).then((reason) => {\n assert.instanceOf(reason, Forbidden);\n assert.match(reason.code, 4403);\n assert.match(reason.reason, /Not entitled/);\n assert.match(reason.message, /Not entitled/);\n\n return s.close();\n });\n });\n });\n\n describe('when connection fails for non-authorization reasons', () => {\n it(\"rejects with the close event's reason\", () => {\n const s = new Socket();\n const promise = s.open('ws://example.com', mockoptions);\n\n mockWebSocket.emit('close', {\n code: 4001,\n reason: 'No',\n });\n\n return assert.isRejected(promise).then((reason) => {\n assert.instanceOf(reason, ConnectionError);\n assert.match(reason.code, 4001);\n assert.match(reason.reason, /No/);\n assert.match(reason.message, /No/);\n\n return s.close();\n });\n });\n });\n\n describe('when the connection succeeds', () => {\n it('sends an auth message up the socket', () => {\n const firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);\n\n assert.equal(firstCallArgs.type, MESSAGE_TYPES.AUTH);\n assert.property(firstCallArgs, 'data');\n assert.property(firstCallArgs.data, 'token');\n assert.equal(firstCallArgs.data.token, 'mocktoken');\n assert.property(firstCallArgs, 'trackingId');\n });\n\n describe('when logLevelToken is set', () => {\n it('includes auth payload with token', () => {\n const s = new Socket();\n\n s.open('ws://example.com', {\n forceCloseDelay: mockoptions.forceCloseDelay,\n wssResponseTimeout: mockoptions.wssResponseTimeout,\n logger: console,\n token: 'mocktoken',\n trackingId: 'mocktrackingid',\n }).catch((reason) => console.error(reason));\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n\n const firstCallArgs = JSON.parse(mockWebSocket.send.firstCall.args[0]);\n\n assert.equal(firstCallArgs.type, MESSAGE_TYPES.AUTH);\n assert.property(firstCallArgs, 'data');\n assert.equal(firstCallArgs.data.token, 'mocktoken');\n assert.property(firstCallArgs, 'trackingId');\n\n return s.close();\n });\n });\n\n it('resolves upon receiving response_event auth response', () => {\n const s = new Socket();\n const promise = s.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n emitAuthResponse();\n\n return promise.then(() => s.close());\n });\n\n it('rejects upon receiving a non-2xx auth response_event', () => {\n const s = new Socket();\n const promise = s.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n emitAuthResponse({statusCode: 401, statusMessage: 'Unauthorized'});\n\n return assert.isRejected(promise).then((reason) => {\n assert.equal(reason.name, 'MobiusSocketResponseError');\n assert.equal(reason.statusCode, 401);\n assert.match(reason.statusMessage, /Unauthorized/);\n\n return s.close();\n });\n });\n });\n });\n\n describe('#close()', () => {\n it('closes the socket', () => socket.close().then(() => assert.called(mockWebSocket.close)));\n\n it('only accepts valid close codes', () =>\n Promise.all([\n assert.isRejected(\n socket.close({code: 1001}),\n /`options.code` must be 1000 or between 3000 and 4999 \\(inclusive\\)/\n ),\n socket.close({code: 1000}),\n ]));\n\n it('accepts a reason', () =>\n socket\n .close({\n code: 3001,\n reason: 'Custom Normal',\n })\n .then(() => assert.calledWith(mockWebSocket.close, 3001, 'Custom Normal')));\n\n it('accepts the logout reason', () =>\n socket\n .close({\n code: 3050,\n reason: 'done (permanent)',\n })\n .then(() => assert.calledWith(mockWebSocket.close, 3050, 'done (permanent)')));\n\n it('can safely be called called multiple times', () => {\n const p1 = socket.close();\n\n mockWebSocket.readyState = 2;\n const p2 = socket.close();\n\n return Promise.all([p1, p2]);\n });\n\n it('signals closure if no close frame is received within the specified window', () => {\n const transientSocket = new Socket();\n const openPromise = transientSocket.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n emitAuthResponse();\n\n return openPromise.then(() => {\n const spy = sinon.spy();\n\n transientSocket.on('close', spy);\n mockWebSocket.close = () =>\n new Promise(() => {\n /* eslint no-inline-comments: [0] */\n });\n mockWebSocket.removeAllListeners('close');\n\n const closePromise = transientSocket.close();\n\n jest.advanceTimersByTime(mockoptions.forceCloseDelay);\n\n return closePromise.then(() => {\n assert.called(spy);\n assert.calledWith(spy, {\n code: 1000,\n reason: 'Done (forced)',\n });\n });\n });\n });\n\n it('signals closure if no close frame is received within the specified window, but uses the initial options as 3050 if specified by options call', () => {\n const transientSocket = new Socket();\n const openPromise = transientSocket.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n emitAuthResponse();\n\n return openPromise.then(() => {\n const spy = sinon.spy();\n\n transientSocket.on('close', spy);\n mockWebSocket.close = () =>\n new Promise(() => {\n /* eslint no-inline-comments: [0] */\n });\n mockWebSocket.removeAllListeners('close');\n\n const closePromise = transientSocket.close({code: 3050, reason: 'done (permanent)'});\n\n jest.advanceTimersByTime(mockoptions.forceCloseDelay);\n\n return closePromise.then(() => {\n assert.called(spy);\n assert.calledWith(spy, {\n code: 3050,\n reason: 'done (permanent)',\n });\n });\n });\n });\n\n it('signals closure if no close frame is received within the specified window, and uses default options as 1000 if the code is not 3050', () => {\n const transientSocket = new Socket();\n const openPromise = transientSocket.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n emitAuthResponse();\n\n return openPromise.then(() => {\n const spy = sinon.spy();\n\n transientSocket.on('close', spy);\n mockWebSocket.close = () =>\n new Promise(() => {\n /* eslint no-inline-comments: [0] */\n });\n mockWebSocket.removeAllListeners('close');\n\n const closePromise = transientSocket.close({code: 1000, reason: 'test'});\n\n jest.advanceTimersByTime(mockoptions.forceCloseDelay);\n\n return closePromise.then(() => {\n assert.called(spy);\n assert.calledWith(spy, {\n code: 1000,\n reason: 'test',\n });\n });\n });\n });\n\n it('signals closure if no close frame is received within the specified window, and uses default options as 1000 if the code is not 3050', () => {\n const transientSocket = new Socket();\n const openPromise = transientSocket.open('ws://example.com', mockoptions);\n\n mockWebSocket.readyState = 1;\n mockWebSocket.emit('open');\n emitAuthResponse();\n\n return openPromise.then(() => {\n const spy = sinon.spy();\n\n transientSocket.on('close', spy);\n mockWebSocket.close = () =>\n new Promise(() => {\n /* eslint no-inline-comments: [0] */\n });\n mockWebSocket.removeAllListeners('close');\n\n const closePromise = transientSocket.close({code: 1000});\n\n jest.advanceTimersByTime(mockoptions.forceCloseDelay);\n\n return closePromise.then(() => {\n assert.called(spy);\n assert.calledWith(spy, {\n code: 1000,\n reason: 'Done (unknown)',\n });\n });\n });\n });\n\n [\n {\n description: 'manually triggers close handler when socket is still connecting',\n closeOptions: {code: 3001, reason: 'Custom close while connecting'},\n expectedCode: 3001,\n expectedReason: 'Custom close while connecting',\n },\n {\n description:\n 'manually triggers close handler with default code when socket is connecting',\n closeOptions: undefined,\n expectedCode: 1000,\n expectedReason: 'Done',\n },\n ].forEach(({description, closeOptions, expectedCode, expectedReason}) => {\n it(description, async () => {\n const s = new Socket();\n let socketInstance;\n\n // Save the current stub and replace it\n const previousStub = Socket.getWebSocketConstructor;\n Socket.getWebSocketConstructor = sinon.stub().callsFake(\n () =>\n function (...args) {\n socketInstance = new MockWebSocket(...args);\n\n return socketInstance;\n }\n );\n\n // open the socket\n s.open('ws://example.com', mockoptions);\n\n // Keep socket in CONNECTING state (readyState 0)\n socketInstance.readyState = 0;\n\n const closeSpy = sinon.spy();\n s.on('close', closeSpy);\n\n // Call close and await the result\n const result = await s.close(closeOptions);\n\n // Verify the promise resolved with the correct close event\n assert.equal(result.code, expectedCode);\n assert.equal(result.reason, expectedReason);\n\n // Verify close handler was called with expected code/reason\n assert.calledOnce(closeSpy);\n assert.calledWith(closeSpy, {\n code: expectedCode,\n reason: expectedReason,\n });\n\n // Verify the underlying socket.close was called with the correct params\n assert.calledOnce(socketInstance.close);\n assert.calledWith(socketInstance.close, expectedCode, expectedReason);\n\n // Restore the previous stub\n Socket.getWebSocketConstructor = previousStub;\n });\n });\n });\n\n describe('#send()', () => {\n describe('when the socket is not in the OPEN state', () => {\n it('fails', () => {\n mockWebSocket.readyState = 0;\n\n return assert\n .isRejected(socket.send('test0'), /INVALID_STATE_ERROR/)\n .then(() => {\n mockWebSocket.readyState = 2;\n\n return assert.isRejected(socket.send('test2'), /INVALID_STATE_ERROR/);\n })\n .then(() => {\n mockWebSocket.readyState = 3;\n\n return assert.isRejected(socket.send('test3'), /INVALID_STATE_ERROR/);\n })\n .then(() => {\n mockWebSocket.readyState = 1;\n\n return socket.send('test1');\n });\n });\n });\n\n it('sends strings', () => {\n socket.send('this is a string');\n assert.calledWith(mockWebSocket.send, 'this is a string');\n });\n\n it('sends JSON.stringifyable object', () => {\n socket.send({\n json: true,\n });\n assert.calledWith(mockWebSocket.send, '{\"json\":true}');\n });\n });\n\n describe('#onclose()', () => {\n describe('when it receives close code 1005', () => {\n forEach(\n {\n Replaced: 4000,\n 'Authentication Failed': 1008,\n 'Authentication did not happen within the timeout window of 30000 seconds.': 1008,\n },\n (code, reason) => {\n it(`emits code ${code} for reason ${reason}`, () => {\n const spy = sinon.spy();\n\n socket.on('close', spy);\n\n mockWebSocket.emit('close', {\n code: 1005,\n reason,\n });\n assert.called(spy);\n assert.calledWith(spy, {\n code,\n reason,\n });\n });\n }\n );\n });\n\n describe('when it receives close code 3050', () => {\n it('emits code 3050 for code 3050', () => {\n const code = 3050;\n const reason = 'done (permanent)';\n const spy = sinon.spy();\n\n socket.on('close', spy);\n\n mockWebSocket.emit('close', {\n code,\n reason,\n });\n assert.called(spy);\n assert.calledWith(spy, {\n code,\n reason,\n });\n });\n });\n });\n\n describe('#onmessage()', () => {\n let spy;\n\n beforeEach(() => {\n spy = sinon.spy();\n socket.on('message', spy);\n });\n\n it('emits messages from the underlying socket', () => {\n mockWebSocket.emit('message', {\n data: JSON.stringify({\n id: 'mockid',\n }),\n });\n\n assert.called(spy);\n });\n\n it('parses received messages', () => {\n mockWebSocket.emit('message', {\n data: JSON.stringify({\n id: 'mockid',\n type: 'test',\n }),\n });\n\n assert.calledWith(spy, {\n data: {\n id: 'mockid',\n type: 'test',\n },\n });\n });\n\n it('preserves top-level type and eventId for async_event envelopes', () => {\n mockWebSocket.emit('message', {\n data: JSON.stringify({\n type: 'async_event',\n trackingId: 'SRV_bb000000-0000-0000-0000-000000000006',\n eventId: 'f6a7b8c9-d0e1-2345-fabc-456789012345',\n data: {\n eventType: 'mobius.callinfo',\n callId: 'fcf86aa5-5539-4c9f-8b72-667786ae9b6c',\n deviceId: '334f3d50-1d26-4712-93f1-4972390cc565',\n },\n }),\n });\n\n assert.calledWith(spy, {\n data: {\n type: 'async_event',\n trackingId: 'SRV_bb000000-0000-0000-0000-000000000006',\n eventId: 'f6a7b8c9-d0e1-2345-fabc-456789012345',\n data: {\n eventType: 'mobius.callinfo',\n callId: 'fcf86aa5-5539-4c9f-8b72-667786ae9b6c',\n deviceId: '334f3d50-1d26-4712-93f1-4972390cc565',\n },\n },\n });\n });\n\n it('acknowledges async_event messages only', () => {\n sinon.spy(socket, 'acknowledge');\n mockWebSocket.emit('message', {\n data: JSON.stringify({\n type: 'async_event',\n eventId: 'event-123',\n trackingId: 'tracking-123',\n }),\n });\n assert.called(socket.acknowledge);\n });\n\n it('does not acknowledge non-async_event messages', () => {\n sinon.spy(socket, 'acknowledge');\n mockWebSocket.emit('message', {\n data: JSON.stringify({\n type: 'regular',\n id: 'mockid',\n }),\n });\n assert.notCalled(socket.acknowledge);\n });\n });\n\n describe('#acknowledge', () => {\n it('requires an event', () => assert.isRejected(socket.acknowledge(), /`event` is required/));\n\n it('acknowledges async events using event_ack and eventId', () =>\n socket\n .acknowledge({\n data: {\n eventId: 'event-123',\n trackingId: 'tracking-123',\n },\n })\n .then(() => {\n assert.calledWith(\n mockWebSocket.send,\n JSON.stringify({\n type: MESSAGE_TYPES.EVENT_ACK,\n trackingId: 'tracking-123',\n eventId: 'event-123',\n })\n );\n }));\n });\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type {SocketCloseEvent, SocketResponse} from './socket/types';\n\nexport type MobiusSocketCloseOptions = {\n code?: number;\n reason?: string;\n};\n\nexport type MobiusSocketRequestPayload = SocketResponse & {\n trackingId: string;\n type: string;\n};\n\nexport type MobiusSocketRequestOptions = {\n timeout?: number;\n};\n\nexport type MobiusSocketResponseError = Error & {\n name: 'MobiusSocketResponseError';\n response?: SocketResponse;\n statusCode?: number;\n statusMessage?: string;\n trackingId?: string;\n};\n\nexport type MobiusSocketDisconnectResult = Promise<void | SocketCloseEvent>;\n"],"mappings":"","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type {SocketCloseEvent, SocketResponse} from './socket/types';\n\n/**\n * Options for closing a Mobius socket connection.\n */\nexport type MobiusSocketCloseOptions = {\n /** WebSocket close code */\n code?: number;\n /** Human-readable close reason */\n reason?: string;\n};\n\n/**\n * Payload for a Mobius websocket request.\n */\nexport type MobiusSocketRequestPayload = SocketResponse & {\n /** Unique tracking ID for correlating request/response */\n trackingId: string;\n /** Request type identifier */\n type: string;\n};\n\n/**\n * Options for configuring a Mobius websocket request.\n */\nexport type MobiusSocketRequestOptions = {\n /** Request timeout in milliseconds */\n timeout?: number;\n};\n\n/**\n * Error type for Mobius websocket response failures.\n */\nexport type MobiusSocketResponseError = Error & {\n /** Error name identifier */\n name: 'MobiusSocketResponseError';\n /** Original socket response that triggered the error */\n response?: SocketResponse;\n /** HTTP-style status code */\n statusCode?: number;\n /** Human-readable status message */\n statusMessage?: string;\n /** Tracking ID of the failed request */\n trackingId?: string;\n};\n\n/**\n * Result type for Mobius socket disconnect operations.\n */\nexport type MobiusSocketDisconnectResult = Promise<void | SocketCloseEvent>;\n"],"mappings":"","ignoreList":[]}
|
|
@@ -45,3 +45,20 @@ export class Forbidden extends ConnectionError {
|
|
|
45
45
|
super(event);
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
|
+
export function createWssResponseError(response, statusCode, statusMessage) {
|
|
49
|
+
const error = new Error(statusMessage || `Mobius websocket request failed with status ${statusCode || 'unknown'}`);
|
|
50
|
+
error.name = 'MobiusSocketResponseError';
|
|
51
|
+
error.statusCode = statusCode;
|
|
52
|
+
error.statusMessage = statusMessage;
|
|
53
|
+
error.response = response;
|
|
54
|
+
error.trackingId = response?.trackingId;
|
|
55
|
+
return error;
|
|
56
|
+
}
|
|
57
|
+
export function createTimeoutError(request) {
|
|
58
|
+
const errorPayload = {
|
|
59
|
+
type: 'response_event',
|
|
60
|
+
subtype: request.type,
|
|
61
|
+
trackingId: request.trackingId,
|
|
62
|
+
};
|
|
63
|
+
return createWssResponseError(errorPayload, 408, 'Mobius websocket response timed out');
|
|
64
|
+
}
|