@webex/contact-center 3.12.0-next.9 → 3.12.0-task-refactor.2
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/AGENTS.md +438 -0
- package/ai-docs/README.md +131 -0
- package/ai-docs/RULES.md +455 -0
- package/ai-docs/patterns/event-driven-patterns.md +485 -0
- package/ai-docs/patterns/testing-patterns.md +480 -0
- package/ai-docs/patterns/typescript-patterns.md +365 -0
- package/ai-docs/templates/README.md +102 -0
- package/ai-docs/templates/documentation/create-agents-md.md +240 -0
- package/ai-docs/templates/documentation/create-architecture-md.md +295 -0
- package/ai-docs/templates/existing-service/bug-fix.md +254 -0
- package/ai-docs/templates/existing-service/feature-enhancement.md +450 -0
- package/ai-docs/templates/new-method/00-master.md +80 -0
- package/ai-docs/templates/new-method/01-requirements.md +232 -0
- package/ai-docs/templates/new-method/02-implementation.md +295 -0
- package/ai-docs/templates/new-method/03-tests.md +201 -0
- package/ai-docs/templates/new-method/04-validation.md +141 -0
- package/ai-docs/templates/new-service/00-master.md +109 -0
- package/ai-docs/templates/new-service/01-pre-questions.md +159 -0
- package/ai-docs/templates/new-service/02-code-generation.md +346 -0
- package/ai-docs/templates/new-service/03-integration.md +178 -0
- package/ai-docs/templates/new-service/04-test-generation.md +205 -0
- package/ai-docs/templates/new-service/05-validation.md +145 -0
- package/dist/cc.js +65 -123
- package/dist/cc.js.map +1 -1
- package/dist/constants.js +13 -2
- package/dist/constants.js.map +1 -1
- package/dist/index.js +13 -5
- package/dist/index.js.map +1 -1
- package/dist/metrics/behavioral-events.js +26 -13
- package/dist/metrics/behavioral-events.js.map +1 -1
- package/dist/metrics/constants.js +7 -6
- package/dist/metrics/constants.js.map +1 -1
- package/dist/services/ApiAiAssistant.js +0 -3
- package/dist/services/ApiAiAssistant.js.map +1 -1
- package/dist/services/config/Util.js +2 -3
- package/dist/services/config/Util.js.map +1 -1
- package/dist/services/config/types.js +16 -14
- package/dist/services/config/types.js.map +1 -1
- package/dist/services/constants.js +0 -1
- package/dist/services/constants.js.map +1 -1
- package/dist/services/core/Err.js.map +1 -1
- package/dist/services/core/Utils.js +79 -55
- package/dist/services/core/Utils.js.map +1 -1
- package/dist/services/core/aqm-reqs.js +17 -92
- package/dist/services/core/aqm-reqs.js.map +1 -1
- package/dist/services/core/websocket/WebSocketManager.js +5 -25
- package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
- package/dist/services/core/websocket/types.js.map +1 -1
- package/dist/services/index.js +1 -2
- package/dist/services/index.js.map +1 -1
- package/dist/services/task/Task.js +644 -0
- package/dist/services/task/Task.js.map +1 -0
- package/dist/services/task/TaskFactory.js +45 -0
- package/dist/services/task/TaskFactory.js.map +1 -0
- package/dist/services/task/TaskManager.js +570 -535
- package/dist/services/task/TaskManager.js.map +1 -1
- package/dist/services/task/TaskUtils.js +132 -28
- package/dist/services/task/TaskUtils.js.map +1 -1
- package/dist/services/task/constants.js +7 -6
- package/dist/services/task/constants.js.map +1 -1
- package/dist/services/task/dialer.js +0 -51
- package/dist/services/task/dialer.js.map +1 -1
- package/dist/services/task/digital/Digital.js +77 -0
- package/dist/services/task/digital/Digital.js.map +1 -0
- package/dist/services/task/state-machine/TaskStateMachine.js +634 -0
- package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
- package/dist/services/task/state-machine/actions.js +372 -0
- package/dist/services/task/state-machine/actions.js.map +1 -0
- package/dist/services/task/state-machine/constants.js +139 -0
- package/dist/services/task/state-machine/constants.js.map +1 -0
- package/dist/services/task/state-machine/guards.js +263 -0
- package/dist/services/task/state-machine/guards.js.map +1 -0
- package/dist/services/task/state-machine/index.js +53 -0
- package/dist/services/task/state-machine/index.js.map +1 -0
- package/dist/services/task/state-machine/types.js +54 -0
- package/dist/services/task/state-machine/types.js.map +1 -0
- package/dist/services/task/state-machine/uiControlsComputer.js +377 -0
- package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -0
- package/dist/services/task/taskDataNormalizer.js +99 -0
- package/dist/services/task/taskDataNormalizer.js.map +1 -0
- package/dist/services/task/types.js +157 -18
- package/dist/services/task/types.js.map +1 -1
- package/dist/services/task/voice/Voice.js +1031 -0
- package/dist/services/task/voice/Voice.js.map +1 -0
- package/dist/services/task/voice/WebRTC.js +149 -0
- package/dist/services/task/voice/WebRTC.js.map +1 -0
- package/dist/types/cc.d.ts +4 -33
- package/dist/types/constants.d.ts +13 -2
- package/dist/types/index.d.ts +11 -5
- package/dist/types/metrics/constants.d.ts +5 -3
- package/dist/types/services/ApiAiAssistant.d.ts +1 -1
- package/dist/types/services/config/types.d.ts +97 -25
- package/dist/types/services/core/Err.d.ts +0 -2
- package/dist/types/services/core/Utils.d.ts +25 -23
- package/dist/types/services/core/aqm-reqs.d.ts +0 -49
- package/dist/types/services/core/websocket/WebSocketManager.d.ts +1 -1
- package/dist/types/services/core/websocket/connection-service.d.ts +0 -1
- package/dist/types/services/core/websocket/types.d.ts +1 -1
- package/dist/types/services/index.d.ts +1 -1
- package/dist/types/services/task/Task.d.ts +146 -0
- package/dist/types/services/task/TaskFactory.d.ts +12 -0
- package/dist/types/services/task/TaskUtils.d.ts +39 -8
- package/dist/types/services/task/constants.d.ts +5 -4
- package/dist/types/services/task/dialer.d.ts +0 -15
- package/dist/types/services/task/digital/Digital.d.ts +22 -0
- package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +906 -0
- package/dist/types/services/task/state-machine/actions.d.ts +8 -0
- package/dist/types/services/task/state-machine/constants.d.ts +91 -0
- package/dist/types/services/task/state-machine/guards.d.ts +78 -0
- package/dist/types/services/task/state-machine/index.d.ts +13 -0
- package/dist/types/services/task/state-machine/types.d.ts +256 -0
- package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
- package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
- package/dist/types/services/task/types.d.ts +539 -88
- package/dist/types/services/task/voice/Voice.d.ts +183 -0
- package/dist/types/services/task/voice/WebRTC.d.ts +53 -0
- package/dist/types/types.d.ts +68 -0
- package/dist/types/webex.d.ts +1 -0
- package/dist/types.js +70 -0
- package/dist/types.js.map +1 -1
- package/dist/webex.js +14 -2
- package/dist/webex.js.map +1 -1
- package/package.json +14 -11
- package/src/cc.ts +91 -177
- package/src/constants.ts +13 -2
- package/src/index.ts +14 -5
- package/src/metrics/ai-docs/AGENTS.md +348 -0
- package/src/metrics/ai-docs/ARCHITECTURE.md +336 -0
- package/src/metrics/behavioral-events.ts +28 -14
- package/src/metrics/constants.ts +7 -8
- package/src/services/ApiAiAssistant.ts +2 -4
- package/src/services/agent/ai-docs/AGENTS.md +238 -0
- package/src/services/agent/ai-docs/ARCHITECTURE.md +302 -0
- package/src/services/ai-docs/AGENTS.md +384 -0
- package/src/services/config/Util.ts +2 -3
- package/src/services/config/ai-docs/AGENTS.md +253 -0
- package/src/services/config/ai-docs/ARCHITECTURE.md +424 -0
- package/src/services/config/types.ts +108 -20
- package/src/services/constants.ts +0 -1
- package/src/services/core/Err.ts +0 -1
- package/src/services/core/Utils.ts +90 -67
- package/src/services/core/ai-docs/AGENTS.md +379 -0
- package/src/services/core/ai-docs/ARCHITECTURE.md +696 -0
- package/src/services/core/aqm-reqs.ts +22 -100
- package/src/services/core/websocket/WebSocketManager.ts +4 -23
- package/src/services/core/websocket/types.ts +1 -1
- package/src/services/index.ts +1 -2
- package/src/services/task/Task.ts +785 -0
- package/src/services/task/TaskFactory.ts +55 -0
- package/src/services/task/TaskManager.ts +579 -633
- package/src/services/task/TaskUtils.ts +175 -31
- package/src/services/task/ai-docs/AGENTS.md +448 -0
- package/src/services/task/ai-docs/ARCHITECTURE.md +573 -0
- package/src/services/task/constants.ts +5 -4
- package/src/services/task/dialer.ts +1 -56
- package/src/services/task/digital/Digital.ts +95 -0
- package/src/services/task/state-machine/TaskStateMachine.ts +793 -0
- package/src/services/task/state-machine/actions.ts +422 -0
- package/src/services/task/state-machine/ai-docs/AGENTS.md +495 -0
- package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1135 -0
- package/src/services/task/state-machine/constants.ts +150 -0
- package/src/services/task/state-machine/guards.ts +303 -0
- package/src/services/task/state-machine/index.ts +28 -0
- package/src/services/task/state-machine/types.ts +228 -0
- package/src/services/task/state-machine/uiControlsComputer.ts +542 -0
- package/src/services/task/taskDataNormalizer.ts +137 -0
- package/src/services/task/types.ts +641 -95
- package/src/services/task/voice/Voice.ts +1255 -0
- package/src/services/task/voice/WebRTC.ts +187 -0
- package/src/types.ts +88 -5
- package/src/utils/AGENTS.md +276 -0
- package/src/webex.js +2 -0
- package/test/unit/spec/cc.ts +59 -142
- package/test/unit/spec/logger-proxy.ts +70 -0
- package/test/unit/spec/services/ApiAiAssistant.ts +17 -0
- package/test/unit/spec/services/config/index.ts +26 -55
- package/test/unit/spec/services/core/Utils.ts +103 -52
- package/test/unit/spec/services/core/websocket/WebSocketManager.ts +48 -112
- package/test/unit/spec/services/core/websocket/connection-service.ts +5 -4
- package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
- package/test/unit/spec/services/task/Task.ts +416 -0
- package/test/unit/spec/services/task/TaskFactory.ts +62 -0
- package/test/unit/spec/services/task/TaskManager.ts +781 -1735
- package/test/unit/spec/services/task/TaskUtils.ts +125 -0
- package/test/unit/spec/services/task/dialer.ts +112 -198
- package/test/unit/spec/services/task/digital/Digital.ts +105 -0
- package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +473 -0
- package/test/unit/spec/services/task/state-machine/guards.ts +288 -0
- package/test/unit/spec/services/task/state-machine/types.ts +18 -0
- package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +147 -0
- package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
- package/test/unit/spec/services/task/voice/Voice.ts +587 -0
- package/test/unit/spec/services/task/voice/WebRTC.ts +242 -0
- package/umd/contact-center.min.js +2 -2
- package/umd/contact-center.min.js.map +1 -1
- package/dist/services/task/index.js +0 -1525
- package/dist/services/task/index.js.map +0 -1
- package/dist/types/services/task/index.d.ts +0 -650
- package/src/services/task/index.ts +0 -1801
- package/test/unit/spec/services/task/index.ts +0 -2184
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Err","_interopRequireWildcard","require","_types","_loggerProxy","_interopRequireDefault","_WebexRequest","_types2","_constants","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","getCommonErrorDetails","errObj","trackingId","headers","trackingid","TrackingID","msg","body","isEntryPointOrEpdn","destAgentType","getAgentActionTypeFromTask","taskData","destinationType","isDialNumber","isEntryPointVariant","FALLBACK_DIAL_NUMBER_REGEX","exports","isValidDialNumber","input","dialPlanEntries","length","LoggerProxy","info","test","some","entry","regex","RegExp","getStationLoginErrorData","failure","loginOption","duplicateLocationMessage","LoginOption","EXTENSION","AGENT_DN","errorCodeMessageMap","DUPLICATE_LOCATION","message","fieldName","INVALID_DIAL_NUMBER","defaultMessage","defaultFieldName","reason","data","getErrorDetails","error","methodName","moduleName","errData","details","module","method","WebexRequest","getInstance","uploadLogs","correlationId","err","Error","generateTaskErrorObject","errorMsg","fallbackMessage","errorMessage","errorType","name","errorData","reasonCode","createErrDetailsObject","Details","getConsultedAgentId","media","agentId","consultParticipants","consultedParticipantId","keys","forEach","key","mType","STATE_CONSULT","participants","includes","id","find","participant","getDestAgentIdForCBT","interaction","consultingAgent","destAgentIdForCBT","foundEntry","entries","pType","toLowerCase","PARTICIPANT_TYPES","DN","type","AGENT","dn","calculateDestAgentId","destAgentIdCBT","EP_DN","epId","calculateDestType","destinationaegntId","undefined","CONSULT_TRANSFER_DESTINATION_TYPE","DIALNUMBER","ENTRYPOINT","deriveConsultTransferDestinationType","agentActionType"],"sources":["Utils.ts"],"sourcesContent":["import * as Err from './Err';\nimport {LoginOption, WebexRequestPayload} from '../../types';\nimport {Failure, AugmentedError} from './GlobalTypes';\nimport LoggerProxy from '../../logger-proxy';\nimport WebexRequest from './WebexRequest';\nimport {\n TaskData,\n ConsultTransferPayLoad,\n CONSULT_TRANSFER_DESTINATION_TYPE,\n Interaction,\n} from '../task/types';\nimport {PARTICIPANT_TYPES, STATE_CONSULT} from './constants';\nimport {DialPlan} from '../config/types';\n\n/**\n * Extracts common error details from a Webex request payload.\n *\n * @param errObj - The Webex request payload object.\n * @returns An object containing the tracking ID and message body.\n * @private\n * @ignore\n */\nconst getCommonErrorDetails = (errObj: WebexRequestPayload) => {\n return {\n trackingId: errObj?.headers?.trackingid || errObj?.headers?.TrackingID,\n msg: errObj?.body,\n };\n};\n\n/**\n * Checks if the destination type represents an entry point variant (EPDN or ENTRYPOINT).\n */\nconst isEntryPointOrEpdn = (destAgentType?: string): boolean => {\n return destAgentType === 'EPDN' || destAgentType === 'ENTRYPOINT';\n};\n\n/**\n * Determines if the task involves dialing a number based on the destination type.\n * Returns 'DIAL_NUMBER' for dial-related destinations, empty string otherwise.\n */\nconst getAgentActionTypeFromTask = (taskData?: TaskData): 'DIAL_NUMBER' | '' => {\n const destAgentType = taskData?.destinationType;\n\n // Check if destination requires dialing: direct dial number or entry point variants\n const isDialNumber = destAgentType === 'DN';\n const isEntryPointVariant = isEntryPointOrEpdn(destAgentType);\n\n // If the destination type is a dial number or an entry point variant, return 'DIAL_NUMBER'\n return isDialNumber || isEntryPointVariant ? 'DIAL_NUMBER' : '';\n};\n\n// Fallback regex for US/Canada dial numbers when no dial plan entries are configured\nexport const FALLBACK_DIAL_NUMBER_REGEX = /1[0-9]{3}[2-9][0-9]{6}([,]{1,10}[0-9]+){0,1}/;\n\n/**\n * Validates a dial number against the provided dial plan regex patterns.\n * A number is valid if it matches at least one regex pattern in the dial plans.\n * Falls back to US/Canada regex validation if no dial plan entries are configured.\n *\n * @param input - The dial number to validate\n * @param dialPlanEntries - Array of dial plan entries containing regex patterns\n * @returns true if the input matches at least one dial plan regex pattern, false otherwise\n */\nexport const isValidDialNumber = (\n input: string,\n dialPlanEntries: DialPlan['dialPlanEntity']\n): boolean => {\n if (!dialPlanEntries || dialPlanEntries.length === 0) {\n LoggerProxy.info('No dial plan entries found. Falling back to US number validation.');\n\n return FALLBACK_DIAL_NUMBER_REGEX.test(input);\n }\n\n return dialPlanEntries.some((entry) => {\n try {\n const regex = new RegExp(entry.regex);\n\n return regex.test(input);\n } catch {\n return false;\n }\n });\n};\n\nexport const getStationLoginErrorData = (failure: Failure, loginOption: LoginOption) => {\n let duplicateLocationMessage = 'This value is already in use';\n\n if (loginOption === LoginOption.EXTENSION) {\n duplicateLocationMessage = 'This extension is already in use';\n }\n\n if (loginOption === LoginOption.AGENT_DN) {\n duplicateLocationMessage =\n 'Dial number is in use. Try a different one. For help, reach out to your administrator or support team.';\n }\n\n const errorCodeMessageMap = {\n DUPLICATE_LOCATION: {\n message: duplicateLocationMessage,\n fieldName: loginOption,\n },\n INVALID_DIAL_NUMBER: {\n message:\n 'Enter a valid dial number. For help, reach out to your administrator or support team.',\n fieldName: loginOption,\n },\n };\n\n const defaultMessage = 'An error occurred while logging in to the station';\n const defaultFieldName = 'generic';\n\n const reason = failure?.data?.reason || '';\n\n return {\n message: errorCodeMessageMap[reason]?.message || defaultMessage,\n fieldName: errorCodeMessageMap[reason]?.fieldName || defaultFieldName,\n };\n};\n\n/**\n * Extracts error details and logs the error. Also uploads logs for the error unless it is a silent relogin agent not found error.\n *\n * @param error - The error object, expected to have a `details` property of type Failure.\n * @param methodName - The name of the method where the error occurred.\n * @param moduleName - The name of the module where the error occurred.\n * @returns An object containing the error instance and the reason string.\n * @public\n * @example\n * const details = getErrorDetails(error, 'fetchData', 'DataModule');\n * if (details.error) { handleError(details.error); }\n * @ignore\n */\nexport const getErrorDetails = (error: any, methodName: string, moduleName: string) => {\n let errData = {message: '', fieldName: ''};\n\n const failure = error.details as Failure;\n const reason = failure?.data?.reason ?? `Error while performing ${methodName}`;\n\n if (!(reason === 'AGENT_NOT_FOUND' && methodName === 'silentRelogin')) {\n LoggerProxy.error(`${methodName} failed with reason: ${reason}`, {\n module: moduleName,\n method: methodName,\n trackingId: failure?.trackingId,\n });\n // we can add more conditions here if not needed for specific cases eg: silentReLogin\n WebexRequest.getInstance().uploadLogs({\n correlationId: failure?.trackingId,\n });\n }\n\n if (methodName === 'stationLogin') {\n errData = getStationLoginErrorData(failure, error.loginOption);\n\n LoggerProxy.error(\n `${methodName} failed with reason: ${reason}, message: ${errData.message}, fieldName: ${errData.fieldName}`,\n {\n module: moduleName,\n method: methodName,\n trackingId: failure?.trackingId,\n }\n );\n }\n\n const err = new Error(reason ?? `Error while performing ${methodName}`);\n // @ts-ignore - add custom property to the error object for backward compatibility\n err.data = errData;\n\n return {\n error: err,\n reason,\n };\n};\n\n/**\n * Extracts error details from task API errors and logs them. Also uploads logs for the error.\n * This handles the specific error format returned by task API calls.\n *\n * @param error - The error object from task API calls with structure: {id: string, details: {trackingId: string, msg: {...}}}\n * @param methodName - The name of the method where the error occurred.\n * @param moduleName - The name of the module where the error occurred.\n * @returns AugmentedError containing structured error details on err.data for metrics and logging\n * @public\n * @example\n * const taskError = generateTaskErrorObject(error, 'transfer', 'TaskModule');\n * throw taskError.error;\n * @ignore\n */\nexport const generateTaskErrorObject = (\n error: any,\n methodName: string,\n moduleName: string\n): AugmentedError => {\n const trackingId = error?.details?.trackingId || error?.trackingId || '';\n const errorMsg = error?.details?.msg;\n\n const fallbackMessage =\n (error && typeof error.message === 'string' && error.message) ||\n `Error while performing ${methodName}`;\n const errorMessage = errorMsg?.errorMessage || fallbackMessage;\n const errorType =\n errorMsg?.errorType ||\n (error && typeof error.name === 'string' && error.name) ||\n 'Unknown Error';\n const errorData = errorMsg?.errorData || '';\n const reasonCode = errorMsg?.reasonCode || 0;\n\n // Log and upload for Task API formatted errors\n LoggerProxy.error(`${methodName} failed: ${errorMessage} (${errorType})`, {\n module: moduleName,\n method: methodName,\n trackingId,\n });\n WebexRequest.getInstance().uploadLogs({\n correlationId: trackingId,\n });\n\n const reason = `${errorType}: ${errorMessage}${errorData ? ` (${errorData})` : ''}`;\n const err: AugmentedError = new Error(reason);\n err.data = {\n message: errorMessage,\n errorType,\n errorData,\n reasonCode,\n trackingId,\n };\n\n return err;\n};\n\n/**\n * Creates an error details object suitable for use with the Err.Details class.\n *\n * @param errObj - The Webex request payload object.\n * @returns An instance of Err.Details with the generic failure message and extracted details.\n * @public\n * @example\n * const errDetails = createErrDetailsObject(webexRequestPayload);\n * @ignore\n */\nexport const createErrDetailsObject = (errObj: WebexRequestPayload) => {\n const details = getCommonErrorDetails(errObj);\n\n return new Err.Details('Service.reqs.generic.failure', details);\n};\n\n/**\n * Gets the consulted agent ID from the media object by finding the agent\n * in the consult media participants (excluding the current agent).\n *\n * @param media - The media object from the interaction\n * @param agentId - The current agent's ID to exclude from the search\n * @returns The consulted agent ID, or empty string if none found\n */\nexport const getConsultedAgentId = (media: Interaction['media'], agentId: string): string => {\n let consultParticipants: string[] = [];\n let consultedParticipantId = '';\n\n Object.keys(media).forEach((key) => {\n if (media[key].mType === STATE_CONSULT) {\n consultParticipants = media[key].participants;\n }\n });\n\n if (consultParticipants.includes(agentId)) {\n const id = consultParticipants.find((participant) => participant !== agentId);\n consultedParticipantId = id || consultedParticipantId;\n }\n\n return consultedParticipantId;\n};\n\n/**\n * Gets the destination agent ID for CBT (Capacity Based Team) scenarios.\n * CBT refers to teams created in Control Hub with capacity-based routing\n * (as opposed to agent-based routing). This handles cases where the consulted\n * participant is not directly in participants but can be found by matching\n * the dial number (dn).\n *\n * @param interaction - The interaction object\n * @param consultingAgent - The consulting agent identifier\n * @returns The destination agent ID for CBT scenarios, or empty string if none found\n */\nexport const getDestAgentIdForCBT = (interaction: Interaction, consultingAgent: string): string => {\n const participants = interaction.participants;\n let destAgentIdForCBT = '';\n\n // Check if this is a CBT scenario (consultingAgent exists but not directly in participants)\n if (consultingAgent && !participants[consultingAgent]) {\n const foundEntry = Object.entries(participants).find(\n ([, participant]: [string, Interaction['participants'][string]]) => {\n return (\n participant.pType.toLowerCase() === PARTICIPANT_TYPES.DN &&\n participant.type === PARTICIPANT_TYPES.AGENT &&\n participant.dn === consultingAgent\n );\n }\n );\n\n if (foundEntry) {\n destAgentIdForCBT = foundEntry[0];\n }\n }\n\n return destAgentIdForCBT;\n};\n\n/**\n * Calculates the destination agent ID for consult operations.\n *\n * @param interaction - The interaction object\n * @param agentId - The current agent's ID\n * @returns The destination agent ID\n */\nexport const calculateDestAgentId = (interaction: Interaction, agentId: string): string => {\n const consultingAgent = getConsultedAgentId(interaction.media, agentId);\n\n // Check if this is a CBT (Capacity Based Team) scenario\n // If not CBT, the function will return empty string and we'll use the normal flow\n const destAgentIdCBT = getDestAgentIdForCBT(interaction, consultingAgent);\n if (destAgentIdCBT) {\n return destAgentIdCBT;\n }\n\n return interaction.participants[consultingAgent]?.type === PARTICIPANT_TYPES.EP_DN\n ? interaction.participants[consultingAgent]?.epId\n : interaction.participants[consultingAgent]?.id;\n};\n\n/**\n * Calculates the destination agent ID for fetching destination type.\n *\n * @param interaction - The interaction object\n * @param agentId - The current agent's ID\n * @returns The destination agent ID for determining destination type\n */\nexport const calculateDestType = (interaction: Interaction, agentId: string): string => {\n const consultingAgent = getConsultedAgentId(interaction.media, agentId);\n\n // Check if this is a CBT (Capacity Based Team) scenario, otherwise use consultingAgent\n const destAgentIdCBT = getDestAgentIdForCBT(interaction, consultingAgent);\n const destinationaegntId = destAgentIdCBT || consultingAgent;\n const destAgentType = destinationaegntId\n ? interaction.participants[destinationaegntId]?.pType\n : undefined;\n if (destAgentType) {\n if (destAgentType === 'DN') {\n return CONSULT_TRANSFER_DESTINATION_TYPE.DIALNUMBER;\n }\n if (destAgentType === 'EP-DN') {\n return CONSULT_TRANSFER_DESTINATION_TYPE.ENTRYPOINT;\n }\n // Keep the existing destinationType if it's something else (like \"agent\" or \"Agent\")\n // Convert \"Agent\" to lowercase for consistency\n\n return destAgentType.toLowerCase();\n }\n\n return CONSULT_TRANSFER_DESTINATION_TYPE.AGENT;\n};\n\nexport const deriveConsultTransferDestinationType = (\n taskData?: TaskData\n): ConsultTransferPayLoad['destinationType'] => {\n const agentActionType = getAgentActionTypeFromTask(taskData);\n\n if (agentActionType === 'DIAL_NUMBER') {\n return isEntryPointOrEpdn(taskData?.destinationType)\n ? CONSULT_TRANSFER_DESTINATION_TYPE.ENTRYPOINT\n : CONSULT_TRANSFER_DESTINATION_TYPE.DIALNUMBER;\n }\n\n return CONSULT_TRANSFER_DESTINATION_TYPE.AGENT;\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["Err","_interopRequireWildcard","require","_types","_loggerProxy","_interopRequireDefault","_WebexRequest","_types2","_constants","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","getCommonErrorDetails","errObj","trackingId","headers","trackingid","TrackingID","msg","body","isValidDialNumber","input","regexForDn","test","exports","getStationLoginErrorData","failure","loginOption","duplicateLocationMessage","LoginOption","EXTENSION","AGENT_DN","errorCodeMessageMap","DUPLICATE_LOCATION","message","fieldName","INVALID_DIAL_NUMBER","defaultMessage","defaultFieldName","reason","data","getErrorDetails","error","methodName","moduleName","errData","details","LoggerProxy","module","method","WebexRequest","getInstance","uploadLogs","correlationId","err","Error","generateTaskErrorObject","errorMsg","fallbackMessage","errorMessage","errorType","name","errorData","reasonCode","createErrDetailsObject","Details","getConsultedAgentId","media","agentId","consultParticipants","consultedParticipantId","keys","forEach","key","mType","STATE_CONSULT","participants","includes","id","find","participant","getDestAgentIdForCBT","interaction","consultingAgent","destAgentIdForCBT","foundEntry","entries","pType","toLowerCase","PARTICIPANT_TYPES","DN","type","AGENT","dn","calculateDestAgentId","destAgentIdCBT","EP_DN","epId","calculateDestType","destinationaegntId","destAgentType","undefined","CONSULT_TRANSFER_DESTINATION_TYPE","DIALNUMBER","ENTRYPOINT","buildConsultConferenceParamData","dataPassed","interactionIdPassed","to","destAgentId","destinationType","String","trim","normalizedDestinationType","toUpperCase","replace","DESTINATION_TYPE","QUEUE","interactionId","deriveConsultTransferDestinationType","taskData","destType","normalizedDestType"],"sources":["Utils.ts"],"sourcesContent":["import * as Err from './Err';\nimport {LoginOption, WebexRequestPayload} from '../../types';\nimport {Failure, AugmentedError} from './GlobalTypes';\nimport LoggerProxy from '../../logger-proxy';\nimport WebexRequest from './WebexRequest';\nimport {\n ConsultConferenceData,\n consultConferencePayloadData,\n ConsultTransferDestinationType,\n TaskData,\n CONSULT_TRANSFER_DESTINATION_TYPE,\n DESTINATION_TYPE,\n Interaction,\n InteractionParticipant,\n} from '../task/types';\nimport {PARTICIPANT_TYPES, STATE_CONSULT} from './constants';\n\n/**\n * Extracts common error details from a Webex request payload.\n *\n * @param errObj - The Webex request payload object.\n * @returns An object containing the tracking ID and message body.\n * @private\n * @ignore\n */\nconst getCommonErrorDetails = (errObj: WebexRequestPayload) => {\n return {\n trackingId: errObj?.headers?.trackingid || errObj?.headers?.TrackingID,\n msg: errObj?.body,\n };\n};\n\nexport const isValidDialNumber = (input: string): boolean => {\n // This regex checks for a valid dial number format for only few countries such as US, Canada.\n const regexForDn = /1[0-9]{3}[2-9][0-9]{6}([,]{1,10}[0-9]+){0,1}/;\n\n return regexForDn.test(input);\n};\n\nexport const getStationLoginErrorData = (failure: Failure, loginOption: LoginOption) => {\n let duplicateLocationMessage = 'This value is already in use';\n\n if (loginOption === LoginOption.EXTENSION) {\n duplicateLocationMessage = 'This extension is already in use';\n }\n\n if (loginOption === LoginOption.AGENT_DN) {\n duplicateLocationMessage =\n 'Dial number is in use. Try a different one. For help, reach out to your administrator or support team.';\n }\n\n const errorCodeMessageMap = {\n DUPLICATE_LOCATION: {\n message: duplicateLocationMessage,\n fieldName: loginOption,\n },\n INVALID_DIAL_NUMBER: {\n message:\n 'Enter a valid US dial number. For help, reach out to your administrator or support team.',\n fieldName: loginOption,\n },\n };\n\n const defaultMessage = 'An error occurred while logging in to the station';\n const defaultFieldName = 'generic';\n\n const reason = failure?.data?.reason || '';\n\n return {\n message: errorCodeMessageMap[reason]?.message || defaultMessage,\n fieldName: errorCodeMessageMap[reason]?.fieldName || defaultFieldName,\n };\n};\n\n/**\n * Extracts error details and logs the error. Also uploads logs for the error unless it is a silent relogin agent not found error.\n *\n * @param error - The error object, expected to have a `details` property of type Failure.\n * @param methodName - The name of the method where the error occurred.\n * @param moduleName - The name of the module where the error occurred.\n * @returns An object containing the error instance and the reason string.\n * @public\n * @example\n * const details = getErrorDetails(error, 'fetchData', 'DataModule');\n * if (details.error) { handleError(details.error); }\n * @ignore\n */\nexport const getErrorDetails = (error: any, methodName: string, moduleName: string) => {\n let errData = {message: '', fieldName: ''};\n\n const failure = error.details as Failure;\n const reason = failure?.data?.reason ?? `Error while performing ${methodName}`;\n\n if (!(reason === 'AGENT_NOT_FOUND' && methodName === 'silentRelogin')) {\n LoggerProxy.error(`${methodName} failed with reason: ${reason}`, {\n module: moduleName,\n method: methodName,\n trackingId: failure?.trackingId,\n });\n // we can add more conditions here if not needed for specific cases eg: silentReLogin\n WebexRequest.getInstance().uploadLogs({\n correlationId: failure?.trackingId,\n });\n }\n\n if (methodName === 'stationLogin') {\n errData = getStationLoginErrorData(failure, error.loginOption);\n\n LoggerProxy.error(\n `${methodName} failed with reason: ${reason}, message: ${errData.message}, fieldName: ${errData.fieldName}`,\n {\n module: moduleName,\n method: methodName,\n trackingId: failure?.trackingId,\n }\n );\n }\n\n const err = new Error(reason ?? `Error while performing ${methodName}`);\n // @ts-ignore - add custom property to the error object for backward compatibility\n err.data = errData;\n\n return {\n error: err,\n reason,\n };\n};\n\n/**\n * Extracts error details from task API errors and logs them. Also uploads logs for the error.\n * This handles the specific error format returned by task API calls.\n *\n * @param error - The error object from task API calls with structure: {id: string, details: {trackingId: string, msg: {...}}}\n * @param methodName - The name of the method where the error occurred.\n * @param moduleName - The name of the module where the error occurred.\n * @returns AugmentedError containing structured error details on err.data for metrics and logging\n * @public\n * @example\n * const taskError = generateTaskErrorObject(error, 'transfer', 'TaskModule');\n * throw taskError.error;\n * @ignore\n */\nexport const generateTaskErrorObject = (\n error: any,\n methodName: string,\n moduleName: string\n): AugmentedError => {\n const trackingId = error?.details?.trackingId || error?.trackingId || '';\n const errorMsg = error?.details?.msg;\n\n const fallbackMessage =\n (error && typeof error.message === 'string' && error.message) ||\n `Error while performing ${methodName}`;\n const errorMessage = errorMsg?.errorMessage || fallbackMessage;\n const errorType =\n errorMsg?.errorType ||\n (error && typeof error.name === 'string' && error.name) ||\n 'Unknown Error';\n const errorData = errorMsg?.errorData || '';\n const reasonCode = errorMsg?.reasonCode || 0;\n\n // Log and upload for Task API formatted errors\n LoggerProxy.error(`${methodName} failed: ${errorMessage} (${errorType})`, {\n module: moduleName,\n method: methodName,\n trackingId,\n });\n WebexRequest.getInstance().uploadLogs({\n correlationId: trackingId,\n });\n\n const reason = `${errorType}: ${errorMessage}${errorData ? ` (${errorData})` : ''}`;\n const err: AugmentedError = new Error(reason);\n err.data = {\n message: errorMessage,\n errorType,\n errorData,\n reasonCode,\n trackingId,\n };\n\n return err;\n};\n\n/**\n * Creates an error details object suitable for use with the Err.Details class.\n *\n * @param errObj - The Webex request payload object.\n * @returns An instance of Err.Details with the generic failure message and extracted details.\n * @public\n * @example\n * const errDetails = createErrDetailsObject(webexRequestPayload);\n * @ignore\n */\nexport const createErrDetailsObject = (errObj: WebexRequestPayload) => {\n const details = getCommonErrorDetails(errObj);\n\n return new Err.Details('Service.reqs.generic.failure', details);\n};\n\n/*\n * Gets the consulted agent ID from the media object by finding the agent\n * in the consult media participants (excluding the current agent).\n *\n * @param media - The media object from the interaction\n * @param agentId - The current agent's ID to exclude from the search\n * @returns The consulted agent ID, or empty string if none found\n */\nexport const getConsultedAgentId = (media: Interaction['media'], agentId: string): string => {\n let consultParticipants: string[] = [];\n let consultedParticipantId = '';\n\n Object.keys(media).forEach((key) => {\n if (media[key].mType === STATE_CONSULT) {\n consultParticipants = media[key].participants;\n }\n });\n\n if (consultParticipants.includes(agentId)) {\n const id = consultParticipants.find((participant) => participant !== agentId);\n consultedParticipantId = id || consultedParticipantId;\n }\n\n return consultedParticipantId;\n};\n\n/**\n * Gets the destination agent ID for CBT (Capacity Based Team) scenarios.\n * CBT refers to teams created in Control Hub with capacity-based routing\n * (as opposed to agent-based routing). This handles cases where the consulted\n * participant is not directly in participants but can be found by matching\n * the dial number (dn).\n *\n * @param interaction - The interaction object\n * @param consultingAgent - The consulting agent identifier\n * @returns The destination agent ID for CBT scenarios, or empty string if none found\n */\nexport const getDestAgentIdForCBT = (interaction: Interaction, consultingAgent: string): string => {\n const participants = interaction.participants;\n let destAgentIdForCBT = '';\n\n // Check if this is a CBT scenario (consultingAgent exists but not directly in participants)\n if (consultingAgent && !participants[consultingAgent]) {\n const foundEntry = Object.entries(participants).find(\n ([, participant]: [string, Interaction['participants'][string]]) => {\n return (\n participant.pType.toLowerCase() === PARTICIPANT_TYPES.DN &&\n participant.type === PARTICIPANT_TYPES.AGENT &&\n participant.dn === consultingAgent\n );\n }\n );\n\n if (foundEntry) {\n destAgentIdForCBT = foundEntry[0];\n }\n }\n\n return destAgentIdForCBT;\n};\n\n/**\n * Calculates the destination agent ID for consult operations.\n *\n * @param interaction - The interaction object\n * @param agentId - The current agent's ID\n * @returns The destination agent ID\n */\nexport const calculateDestAgentId = (interaction: Interaction, agentId: string): string => {\n const consultingAgent = getConsultedAgentId(interaction.media, agentId);\n\n // Check if this is a CBT (Capacity Based Team) scenario\n // If not CBT, the function will return empty string and we'll use the normal flow\n const destAgentIdCBT = getDestAgentIdForCBT(interaction, consultingAgent);\n if (destAgentIdCBT) {\n return destAgentIdCBT;\n }\n\n const participant = interaction.participants[consultingAgent];\n if (!participant) {\n return '';\n }\n\n if (participant.type === PARTICIPANT_TYPES.EP_DN) {\n return (participant as InteractionParticipant & {epId?: string}).epId ?? '';\n }\n\n return participant.id ?? '';\n};\n\n/**\n * Calculates the destination agent ID for fetching destination type.\n *\n * @param interaction - The interaction object\n * @param agentId - The current agent's ID\n * @returns The destination agent ID for determining destination type\n */\nexport const calculateDestType = (interaction: Interaction, agentId: string): string => {\n const consultingAgent = getConsultedAgentId(interaction.media, agentId);\n\n // Check if this is a CBT (Capacity Based Team) scenario, otherwise use consultingAgent\n const destAgentIdCBT = getDestAgentIdForCBT(interaction, consultingAgent);\n const destinationaegntId = destAgentIdCBT || consultingAgent;\n const destAgentType = destinationaegntId\n ? interaction.participants[destinationaegntId]?.pType\n : undefined;\n if (destAgentType) {\n if (destAgentType === 'DN') {\n return CONSULT_TRANSFER_DESTINATION_TYPE.DIALNUMBER;\n }\n if (destAgentType === 'EP-DN') {\n return CONSULT_TRANSFER_DESTINATION_TYPE.ENTRYPOINT;\n }\n // Keep the existing destinationType if it's something else (like \"agent\" or \"Agent\")\n // Convert \"Agent\" to lowercase for consistency\n\n return destAgentType.toLowerCase();\n }\n\n return CONSULT_TRANSFER_DESTINATION_TYPE.AGENT;\n};\n\n/**\n * Gets the destination agent ID from participants.\n * Finds a participant who is not the current agent and is an agent type.\n *\n * @param participants - The participants object from interaction\n * @param agentId - The current agent's ID\n * @returns The destination agent ID, or undefined if none found\n */\nexport const buildConsultConferenceParamData = (\n dataPassed: consultConferencePayloadData,\n interactionIdPassed: string\n): {interactionId: string; data: ConsultConferenceData} => {\n const data: ConsultConferenceData = {\n ...('agentId' in dataPassed && {agentId: dataPassed.agentId}),\n to: dataPassed.destAgentId,\n destinationType: '',\n };\n\n if ('destinationType' in dataPassed) {\n const destinationType = String(dataPassed.destinationType || '').trim();\n const normalizedDestinationType = destinationType.toUpperCase().replace(/[-_\\s]/g, '');\n\n if (normalizedDestinationType === 'DN' || normalizedDestinationType === 'DIALNUMBER') {\n data.destinationType = DESTINATION_TYPE.DIALNUMBER;\n } else if (normalizedDestinationType === 'EPDN' || normalizedDestinationType === 'ENTRYPOINT') {\n data.destinationType = DESTINATION_TYPE.ENTRYPOINT;\n } else if (normalizedDestinationType === 'QUEUE') {\n data.destinationType = DESTINATION_TYPE.QUEUE;\n } else if (normalizedDestinationType === 'AGENT') {\n data.destinationType = DESTINATION_TYPE.AGENT;\n } else {\n data.destinationType = destinationType as ConsultConferenceData['destinationType'];\n }\n } else {\n data.destinationType = DESTINATION_TYPE.AGENT;\n }\n\n return {\n interactionId: interactionIdPassed,\n data,\n };\n};\n\n/**\n * Derives the consult transfer destination type based on task data.\n * This function determines the appropriate destination type for a consult transfer\n * by examining the destination type stored in the task data.\n *\n * @param taskData - The task data containing destination information\n * @returns The derived consult transfer destination type\n * @public\n */\nexport const deriveConsultTransferDestinationType = (\n taskData: TaskData\n): ConsultTransferDestinationType => {\n const destType = taskData?.destinationType;\n const normalizedDestType = String(destType || '')\n .toUpperCase()\n .replace(/[-_\\s]/g, '');\n\n // Map destination types to consult transfer destination types\n if (normalizedDestType === 'DN' || normalizedDestType === 'DIALNUMBER') {\n return CONSULT_TRANSFER_DESTINATION_TYPE.DIALNUMBER;\n }\n if (normalizedDestType === 'EPDN' || normalizedDestType === 'ENTRYPOINT') {\n return CONSULT_TRANSFER_DESTINATION_TYPE.ENTRYPOINT;\n }\n if (normalizedDestType === 'QUEUE') {\n return CONSULT_TRANSFER_DESTINATION_TYPE.QUEUE;\n }\n\n // Default to agent if no specific type matches\n return CONSULT_TRANSFER_DESTINATION_TYPE.AGENT;\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -20,41 +20,15 @@ class AqmReqs {
|
|
|
20
20
|
this.webSocketManager = webSocketManager;
|
|
21
21
|
this.webSocketManager.on('message', this.onMessage.bind(this));
|
|
22
22
|
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Creates a request function for an API call with parameters
|
|
26
|
-
* @param c - The configuration for the request
|
|
27
|
-
* @returns A function that makes the API request
|
|
28
|
-
*/
|
|
29
23
|
req(c) {
|
|
30
24
|
return (p, cbRes) => this.makeAPIRequest(c(p), cbRes);
|
|
31
25
|
}
|
|
32
|
-
|
|
33
|
-
/**
|
|
34
|
-
* Creates a request function for an API call with no parameters
|
|
35
|
-
* @param c - The configuration for the request
|
|
36
|
-
* @returns A function that makes the API request
|
|
37
|
-
*/
|
|
38
26
|
reqEmpty(c) {
|
|
39
27
|
return cbRes => this.makeAPIRequest(c(), cbRes);
|
|
40
28
|
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Makes an API request
|
|
44
|
-
* @param c - The request configuration
|
|
45
|
-
* @param cbRes - The callback for the response
|
|
46
|
-
* @returns A promise that resolves with the response or rejects with an error
|
|
47
|
-
*/
|
|
48
29
|
async makeAPIRequest(c, cbRes) {
|
|
49
30
|
return this.createPromise(c, cbRes);
|
|
50
31
|
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Creates a promise for an API request
|
|
54
|
-
* @param c - The request configuration
|
|
55
|
-
* @param cbRes - The callback for the response
|
|
56
|
-
* @returns A promise that resolves with the response or rejects with an error
|
|
57
|
-
*/
|
|
58
32
|
createPromise(c, cbRes) {
|
|
59
33
|
return new Promise((resolve, reject) => {
|
|
60
34
|
const keySuccess = this.bindPrint(c.notifSuccess.bind);
|
|
@@ -165,7 +139,7 @@ class AqmReqs {
|
|
|
165
139
|
if (response?.headers) {
|
|
166
140
|
response.headers.Authorization = '*';
|
|
167
141
|
}
|
|
168
|
-
_loggerProxy.default.error(`Routing request timeout${keySuccess}${
|
|
142
|
+
_loggerProxy.default.error(`Routing request timeout${keySuccess}${response}${c.url}`, {
|
|
169
143
|
module: _constants2.AQM_REQS_FILE,
|
|
170
144
|
method: _constants.METHODS.CREATE_PROMISE
|
|
171
145
|
});
|
|
@@ -177,93 +151,44 @@ class AqmReqs {
|
|
|
177
151
|
}
|
|
178
152
|
});
|
|
179
153
|
}
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* Converts a bind object to a string representation
|
|
183
|
-
* @param bind - The bind object to convert
|
|
184
|
-
* @returns A string representation of the bind object
|
|
185
|
-
*/
|
|
186
154
|
bindPrint(bind) {
|
|
187
155
|
let result = '';
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
if (Array.isArray(
|
|
191
|
-
result += `${
|
|
192
|
-
} else if (typeof
|
|
193
|
-
result += `${
|
|
156
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
157
|
+
for (const k in bind) {
|
|
158
|
+
if (Array.isArray(bind[k])) {
|
|
159
|
+
result += `${k}=[${bind[k].join(',')}],`;
|
|
160
|
+
} else if (typeof bind[k] === 'object' && bind[k] !== null) {
|
|
161
|
+
result += `${k}=(${this.bindPrint(bind[k])}),`;
|
|
194
162
|
} else {
|
|
195
|
-
result += `${
|
|
163
|
+
result += `${k}=${bind[k]},`;
|
|
196
164
|
}
|
|
197
165
|
}
|
|
198
166
|
return result ? result.slice(0, -1) : result;
|
|
199
167
|
}
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* Checks if a message matches a bind object
|
|
203
|
-
* @param bind - The bind object to check against
|
|
204
|
-
* @param msg - The message to check
|
|
205
|
-
* @returns True if the message matches the bind object, false otherwise
|
|
206
|
-
*/
|
|
207
168
|
bindCheck(bind, msg) {
|
|
208
|
-
//
|
|
209
|
-
|
|
210
|
-
if (
|
|
211
|
-
return false;
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
for (const key of Object.keys(bind).filter(prop => prop !== '__typeMap')) {
|
|
215
|
-
const bindValue = bind[key];
|
|
216
|
-
const msgValue = msg[key];
|
|
217
|
-
if (Array.isArray(bindValue)) {
|
|
169
|
+
// eslint-disable-next-line no-restricted-syntax
|
|
170
|
+
for (const k in bind) {
|
|
171
|
+
if (Array.isArray(bind[k])) {
|
|
218
172
|
// Check if the message value matches any of the values in the array
|
|
219
|
-
if (!
|
|
173
|
+
if (!bind[k].includes(msg[k])) {
|
|
220
174
|
return false;
|
|
221
175
|
}
|
|
222
|
-
} else if (typeof
|
|
223
|
-
if (typeof
|
|
224
|
-
if (!this.bindCheck(
|
|
176
|
+
} else if (typeof bind[k] === 'object' && bind[k] !== null) {
|
|
177
|
+
if (typeof msg[k] === 'object' && msg[k] !== null) {
|
|
178
|
+
if (!this.bindCheck(bind[k], msg[k])) {
|
|
225
179
|
return false;
|
|
226
180
|
}
|
|
227
181
|
} else {
|
|
228
182
|
return false;
|
|
229
183
|
}
|
|
230
|
-
} else if (!
|
|
184
|
+
} else if (!msg[k] || msg[k] !== bind[k]) {
|
|
231
185
|
return false;
|
|
232
186
|
}
|
|
233
187
|
}
|
|
234
188
|
return true;
|
|
235
189
|
}
|
|
236
190
|
|
|
237
|
-
|
|
238
|
-
* Checks type-dependent field conditions defined in __typeMap.
|
|
239
|
-
* @param typeMap - The type map to check against
|
|
240
|
-
* @param msg - The message to check
|
|
241
|
-
* @returns True if the message matches the type map, false otherwise
|
|
242
|
-
* The typeMap has the shape:
|
|
243
|
-
* { typeField: "type", conditions: { EventA: { field: value }, EventB: { field: value } } }
|
|
244
|
-
* It reads msg[typeField] to determine which condition set to apply,
|
|
245
|
-
* then verifies all fields in that condition match the message.
|
|
246
|
-
*/
|
|
247
|
-
static typeMapCheck(typeMap, msg) {
|
|
248
|
-
const typeField = typeMap.typeField || 'type';
|
|
249
|
-
const msgType = msg[typeField];
|
|
250
|
-
if (typeMap.conditions && typeMap.conditions[msgType]) {
|
|
251
|
-
const condition = typeMap.conditions[msgType];
|
|
252
|
-
for (const field of Object.keys(condition)) {
|
|
253
|
-
if (!msg[field] || msg[field] !== condition[field]) {
|
|
254
|
-
return false;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
return true;
|
|
258
|
-
}
|
|
259
|
-
return false;
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
/**
|
|
263
|
-
* Handles incoming messages from the WebSocket (must be a lambda fn)
|
|
264
|
-
* @param msg - The message to handle
|
|
265
|
-
* @returns
|
|
266
|
-
*/
|
|
191
|
+
// must be lambda
|
|
267
192
|
onMessage = msg => {
|
|
268
193
|
const event = JSON.parse(msg);
|
|
269
194
|
if (event.type === 'Welcome') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Err","_interopRequireWildcard","require","_types","_loggerProxy","_interopRequireDefault","_constants","_constants2","_WebexRequest","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","AqmReqs","pendingRequests","pendingNotifCancelrequest","constructor","webSocketManager","webexRequest","WebexRequest","getInstance","on","onMessage","bind","req","c","p","cbRes","makeAPIRequest","reqEmpty","createPromise","Promise","resolve","reject","keySuccess","bindPrint","notifSuccess","keyFail","notifFail","keyCancel","notifCancel","k","timeout","Details","key","msg","isClear","clear","check","bindCheck","handle","alternateBind","alternateBindKey","LoggerProxy","log","JSON","stringify","module","AQM_REQS_FILE","method","METHODS","CREATE_PROMISE","eerr","errId","err","response","request","service","host","resource","url","data","HTTP_METHODS","POST","GET","body","then","res","catch","error","headers","Authorization","Message","window","setTimeout","TIMEOUT_REQ","result","keys","filter","prop","value","Array","isArray","join","slice","__typeMap","typeMapCheck","bindValue","msgValue","includes","typeMap","typeField","msgType","conditions","condition","field","event","parse","type","info","ON_MESSAGE","keepalive","isHandled","kReq","thisReq","kReqAlt","exports"],"sources":["aqm-reqs.ts"],"sourcesContent":["import {Msg} from './GlobalTypes';\nimport * as Err from './Err';\nimport {HTTP_METHODS, WebexRequestPayload} from '../../types';\nimport LoggerProxy from '../../logger-proxy';\nimport {CbRes, Conf, ConfEmpty, Pending, Req, Res, ResEmpty} from './types';\nimport {TIMEOUT_REQ, METHODS} from './constants';\nimport {AQM_REQS_FILE} from '../../constants';\nimport WebexRequest from './WebexRequest';\nimport {WebSocketManager} from './websocket/WebSocketManager';\n\nexport default class AqmReqs {\n private pendingRequests: Record<string, Pending> = {};\n private pendingNotifCancelrequest: Record<string, Pending> = {};\n private webexRequest: WebexRequest;\n private webSocketManager: WebSocketManager;\n\n constructor(webSocketManager: WebSocketManager) {\n this.webexRequest = WebexRequest.getInstance();\n this.webSocketManager = webSocketManager;\n this.webSocketManager.on('message', this.onMessage.bind(this));\n }\n\n /**\n * Creates a request function for an API call with parameters\n * @param c - The configuration for the request\n * @returns A function that makes the API request\n */\n req<TRes, TErr, TReq>(c: Conf<TRes, TErr, TReq>): Res<TRes, TReq> {\n return (p: TReq, cbRes?: CbRes<TRes>) => this.makeAPIRequest(c(p), cbRes);\n }\n\n /**\n * Creates a request function for an API call with no parameters\n * @param c - The configuration for the request\n * @returns A function that makes the API request\n */\n reqEmpty<TRes, TErr>(c: ConfEmpty<TRes, TErr>): ResEmpty<TRes> {\n return (cbRes?: CbRes<TRes>) => this.makeAPIRequest(c(), cbRes);\n }\n\n /**\n * Makes an API request\n * @param c - The request configuration\n * @param cbRes - The callback for the response\n * @returns A promise that resolves with the response or rejects with an error\n */\n private async makeAPIRequest<TRes, TErr>(c: Req<TRes, TErr>, cbRes?: CbRes<TRes>): Promise<TRes> {\n return this.createPromise(c, cbRes);\n }\n\n /**\n * Creates a promise for an API request\n * @param c - The request configuration\n * @param cbRes - The callback for the response\n * @returns A promise that resolves with the response or rejects with an error\n */\n private createPromise<TRes, TErr>(c: Req<TRes, TErr>, cbRes?: CbRes<TRes>) {\n return new Promise<TRes>((resolve, reject) => {\n const keySuccess = this.bindPrint(c.notifSuccess.bind);\n const keyFail = c.notifFail ? this.bindPrint(c.notifFail.bind) : null;\n const keyCancel = c.notifCancel?.bind ? this.bindPrint(c.notifCancel.bind) : null;\n let k = '';\n if (this.pendingRequests[keySuccess]) {\n k = keySuccess;\n }\n if (keyFail && this.pendingRequests[keyFail]) {\n k += keyFail;\n }\n if (k && c.timeout !== 'disabled') {\n reject(\n new Err.Details('Service.aqm.reqs.Pending', {\n key: k,\n msg: 'The request has been already created, multiple requests are not allowed.',\n })\n );\n\n return;\n }\n\n let isClear = false;\n const clear = () => {\n delete this.pendingRequests[keySuccess];\n if (keyFail) {\n delete this.pendingRequests[keyFail];\n }\n if (keyCancel) {\n delete this.pendingNotifCancelrequest[keyCancel];\n }\n isClear = true;\n };\n\n this.pendingRequests[keySuccess] = {\n check: (msg: Msg) => this.bindCheck(c.notifSuccess.bind, msg),\n handle: (msg: Msg) => {\n clear();\n resolve(msg as any);\n },\n };\n if (keyCancel) {\n this.pendingRequests[keySuccess].alternateBind = keyCancel;\n this.pendingNotifCancelrequest[keyCancel] = {\n check: (msg: Msg) => this.bindCheck(c.notifCancel?.bind, msg),\n handle: (msg: Msg) => {\n const alternateBindKey = this.pendingNotifCancelrequest[keyCancel].alternateBind;\n if (alternateBindKey) {\n this.pendingRequests[alternateBindKey].handle(msg);\n }\n },\n alternateBind: keySuccess,\n };\n }\n\n if (keyFail) {\n this.pendingRequests[keyFail] = {\n check: (msg: Msg) => this.bindCheck(c.notifFail!.bind, msg),\n handle: (msg: Msg) => {\n clear();\n const notifFail = c.notifFail!;\n if ('errId' in notifFail) {\n LoggerProxy.log(`Routing request failed: ${JSON.stringify(msg)}`, {\n module: AQM_REQS_FILE,\n method: METHODS.CREATE_PROMISE,\n });\n const eerr = new Err.Details(notifFail.errId, msg as any);\n LoggerProxy.log(`Routing request failed: ${eerr}`, {\n module: AQM_REQS_FILE,\n method: METHODS.CREATE_PROMISE,\n });\n reject(eerr);\n } else {\n reject(notifFail.err(msg as any));\n }\n },\n };\n }\n let response: WebexRequestPayload | null = null;\n this.webexRequest\n .request({\n service: c.host ?? '',\n resource: c.url,\n // eslint-disable-next-line no-nested-ternary\n method: c.method ? c.method : c.data ? HTTP_METHODS.POST : HTTP_METHODS.GET,\n\n body: c.data,\n })\n .then((res: any) => {\n response = res;\n if (cbRes) {\n cbRes(res);\n }\n })\n .catch((error: WebexRequestPayload) => {\n clear();\n if (error?.headers) {\n error.headers.Authorization = '*';\n }\n if (error?.headers) {\n error.headers.Authorization = '*';\n }\n if (typeof c.err === 'function') {\n reject(c.err(error));\n } else if (typeof c.err === 'string') {\n reject(new Err.Message(c.err));\n } else {\n reject(new Err.Message('Service.aqm.reqs.GenericRequestError'));\n }\n });\n\n if (c.timeout !== 'disabled') {\n window.setTimeout(\n () => {\n if (isClear) {\n return;\n }\n clear();\n if (response?.headers) {\n response.headers.Authorization = '*';\n }\n LoggerProxy.error(\n `Routing request timeout${keySuccess}${JSON.stringify(response)}${c.url}`,\n {\n module: AQM_REQS_FILE,\n method: METHODS.CREATE_PROMISE,\n }\n );\n reject(\n new Err.Details('Service.aqm.reqs.Timeout', {\n key: keySuccess,\n response: response!,\n })\n );\n },\n c.timeout && c.timeout > 0 ? c.timeout : TIMEOUT_REQ\n );\n }\n });\n }\n\n /**\n * Converts a bind object to a string representation\n * @param bind - The bind object to convert\n * @returns A string representation of the bind object\n */\n private bindPrint(bind: any): string {\n let result = '';\n for (const key of Object.keys(bind).filter((prop) => prop !== '__typeMap')) {\n const value = bind[key];\n\n if (Array.isArray(value)) {\n result += `${key}=[${value.join(',')}],`;\n } else if (typeof value === 'object' && value !== null) {\n result += `${key}=(${this.bindPrint(value)}),`;\n } else {\n result += `${key}=${value},`;\n }\n }\n\n return result ? result.slice(0, -1) : result;\n }\n\n /**\n * Checks if a message matches a bind object\n * @param bind - The bind object to check against\n * @param msg - The message to check\n * @returns True if the message matches the bind object, false otherwise\n */\n private bindCheck(bind: any, msg: any): boolean {\n // Handle type-dependent field matching if __typeMap is present\n if (bind.__typeMap && typeof bind.__typeMap === 'object') {\n if (!AqmReqs.typeMapCheck(bind.__typeMap, msg)) {\n return false;\n }\n }\n\n for (const key of Object.keys(bind).filter((prop) => prop !== '__typeMap')) {\n const bindValue = bind[key];\n const msgValue = msg[key];\n\n if (Array.isArray(bindValue)) {\n // Check if the message value matches any of the values in the array\n if (!bindValue.includes(msgValue)) {\n return false;\n }\n } else if (typeof bindValue === 'object' && bindValue !== null) {\n if (typeof msgValue === 'object' && msgValue !== null) {\n if (!this.bindCheck(bindValue, msgValue)) {\n return false;\n }\n } else {\n return false;\n }\n } else if (!msgValue || msgValue !== bindValue) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Checks type-dependent field conditions defined in __typeMap.\n * @param typeMap - The type map to check against\n * @param msg - The message to check\n * @returns True if the message matches the type map, false otherwise\n * The typeMap has the shape:\n * { typeField: \"type\", conditions: { EventA: { field: value }, EventB: { field: value } } }\n * It reads msg[typeField] to determine which condition set to apply,\n * then verifies all fields in that condition match the message.\n */\n private static typeMapCheck(typeMap: any, msg: any): boolean {\n const typeField = typeMap.typeField || 'type';\n const msgType = msg[typeField];\n\n if (typeMap.conditions && typeMap.conditions[msgType]) {\n const condition = typeMap.conditions[msgType];\n for (const field of Object.keys(condition)) {\n if (!msg[field] || msg[field] !== condition[field]) {\n return false;\n }\n }\n\n return true;\n }\n\n return false;\n }\n\n /**\n * Handles incoming messages from the WebSocket (must be a lambda fn)\n * @param msg - The message to handle\n * @returns\n */\n private readonly onMessage = (msg: any) => {\n const event = JSON.parse(msg);\n if (event.type === 'Welcome') {\n LoggerProxy.info(`Welcome message from Notifs Websocket`, {\n module: AQM_REQS_FILE,\n method: METHODS.ON_MESSAGE,\n });\n\n return;\n }\n\n if (event.keepalive === 'true') {\n return;\n }\n\n if (event.type === 'AgentReloginFailed') {\n LoggerProxy.info('Silently handling the agent relogin fail', {\n module: AQM_REQS_FILE,\n method: METHODS.ON_MESSAGE,\n });\n }\n\n let isHandled = false;\n\n const kReq = Object.keys(this.pendingRequests);\n for (const thisReq of kReq) {\n const req = this.pendingRequests[thisReq];\n if (req.check(event)) {\n req.handle(event);\n isHandled = true;\n break;\n }\n }\n // pendingNotifCancelrequest stores the secondary bind key, checks for the secondary bind key and handles the event\n const kReqAlt = Object.keys(this.pendingNotifCancelrequest);\n for (const thisReq of kReqAlt) {\n const req = this.pendingNotifCancelrequest[thisReq];\n if (req.check(event)) {\n req.handle(event);\n isHandled = true;\n }\n }\n\n // TODO: add event emitter for unhandled events to replicate event.listen or .on\n\n if (!isHandled) {\n LoggerProxy.info(`event=missingEventHandler | [AqmReqs] missing routing message handler`, {\n module: AQM_REQS_FILE,\n method: METHODS.ON_MESSAGE,\n });\n }\n };\n}\n"],"mappings":";;;;;;AACA,IAAAA,GAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAC,sBAAA,CAAAH,OAAA;AAEA,IAAAI,UAAA,GAAAJ,OAAA;AACA,IAAAK,WAAA,GAAAL,OAAA;AACA,IAAAM,aAAA,GAAAH,sBAAA,CAAAH,OAAA;AAA0C,SAAAG,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAAA,SAAAR,wBAAAQ,CAAA,EAAAG,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAZ,uBAAA,YAAAA,CAAAQ,CAAA,EAAAG,CAAA,SAAAA,CAAA,IAAAH,CAAA,IAAAA,CAAA,CAAAC,UAAA,SAAAD,CAAA,MAAAO,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAR,OAAA,EAAAF,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAS,CAAA,MAAAF,CAAA,GAAAJ,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAE,CAAA,CAAAI,GAAA,CAAAX,CAAA,UAAAO,CAAA,CAAAK,GAAA,CAAAZ,CAAA,GAAAO,CAAA,CAAAM,GAAA,CAAAb,CAAA,EAAAS,CAAA,gBAAAN,CAAA,IAAAH,CAAA,gBAAAG,CAAA,OAAAW,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAG,CAAA,OAAAK,CAAA,IAAAD,CAAA,GAAAS,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAG,CAAA,OAAAK,CAAA,CAAAI,GAAA,IAAAJ,CAAA,CAAAK,GAAA,IAAAN,CAAA,CAAAE,CAAA,EAAAN,CAAA,EAAAK,CAAA,IAAAC,CAAA,CAAAN,CAAA,IAAAH,CAAA,CAAAG,CAAA,WAAAM,CAAA,KAAAT,CAAA,EAAAG,CAAA;AAG3B,MAAMgB,OAAO,CAAC;EACnBC,eAAe,GAA4B,CAAC,CAAC;EAC7CC,yBAAyB,GAA4B,CAAC,CAAC;EAI/DC,WAAWA,CAACC,gBAAkC,EAAE;IAC9C,IAAI,CAACC,YAAY,GAAGC,qBAAY,CAACC,WAAW,CAAC,CAAC;IAC9C,IAAI,CAACH,gBAAgB,GAAGA,gBAAgB;IACxC,IAAI,CAACA,gBAAgB,CAACI,EAAE,CAAC,SAAS,EAAE,IAAI,CAACC,SAAS,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC;EAChE;;EAEA;AACF;AACA;AACA;AACA;EACEC,GAAGA,CAAmBC,CAAyB,EAAmB;IAChE,OAAO,CAACC,CAAO,EAAEC,KAAmB,KAAK,IAAI,CAACC,cAAc,CAACH,CAAC,CAACC,CAAC,CAAC,EAAEC,KAAK,CAAC;EAC3E;;EAEA;AACF;AACA;AACA;AACA;EACEE,QAAQA,CAAaJ,CAAwB,EAAkB;IAC7D,OAAQE,KAAmB,IAAK,IAAI,CAACC,cAAc,CAACH,CAAC,CAAC,CAAC,EAAEE,KAAK,CAAC;EACjE;;EAEA;AACF;AACA;AACA;AACA;AACA;EACE,MAAcC,cAAcA,CAAaH,CAAkB,EAAEE,KAAmB,EAAiB;IAC/F,OAAO,IAAI,CAACG,aAAa,CAACL,CAAC,EAAEE,KAAK,CAAC;EACrC;;EAEA;AACF;AACA;AACA;AACA;AACA;EACUG,aAAaA,CAAaL,CAAkB,EAAEE,KAAmB,EAAE;IACzE,OAAO,IAAII,OAAO,CAAO,CAACC,OAAO,EAAEC,MAAM,KAAK;MAC5C,MAAMC,UAAU,GAAG,IAAI,CAACC,SAAS,CAACV,CAAC,CAACW,YAAY,CAACb,IAAI,CAAC;MACtD,MAAMc,OAAO,GAAGZ,CAAC,CAACa,SAAS,GAAG,IAAI,CAACH,SAAS,CAACV,CAAC,CAACa,SAAS,CAACf,IAAI,CAAC,GAAG,IAAI;MACrE,MAAMgB,SAAS,GAAGd,CAAC,CAACe,WAAW,EAAEjB,IAAI,GAAG,IAAI,CAACY,SAAS,CAACV,CAAC,CAACe,WAAW,CAACjB,IAAI,CAAC,GAAG,IAAI;MACjF,IAAIkB,CAAC,GAAG,EAAE;MACV,IAAI,IAAI,CAAC3B,eAAe,CAACoB,UAAU,CAAC,EAAE;QACpCO,CAAC,GAAGP,UAAU;MAChB;MACA,IAAIG,OAAO,IAAI,IAAI,CAACvB,eAAe,CAACuB,OAAO,CAAC,EAAE;QAC5CI,CAAC,IAAIJ,OAAO;MACd;MACA,IAAII,CAAC,IAAIhB,CAAC,CAACiB,OAAO,KAAK,UAAU,EAAE;QACjCT,MAAM,CACJ,IAAIhD,GAAG,CAAC0D,OAAO,CAAC,0BAA0B,EAAE;UAC1CC,GAAG,EAAEH,CAAC;UACNI,GAAG,EAAE;QACP,CAAC,CACH,CAAC;QAED;MACF;MAEA,IAAIC,OAAO,GAAG,KAAK;MACnB,MAAMC,KAAK,GAAGA,CAAA,KAAM;QAClB,OAAO,IAAI,CAACjC,eAAe,CAACoB,UAAU,CAAC;QACvC,IAAIG,OAAO,EAAE;UACX,OAAO,IAAI,CAACvB,eAAe,CAACuB,OAAO,CAAC;QACtC;QACA,IAAIE,SAAS,EAAE;UACb,OAAO,IAAI,CAACxB,yBAAyB,CAACwB,SAAS,CAAC;QAClD;QACAO,OAAO,GAAG,IAAI;MAChB,CAAC;MAED,IAAI,CAAChC,eAAe,CAACoB,UAAU,CAAC,GAAG;QACjCc,KAAK,EAAGH,GAAQ,IAAK,IAAI,CAACI,SAAS,CAACxB,CAAC,CAACW,YAAY,CAACb,IAAI,EAAEsB,GAAG,CAAC;QAC7DK,MAAM,EAAGL,GAAQ,IAAK;UACpBE,KAAK,CAAC,CAAC;UACPf,OAAO,CAACa,GAAU,CAAC;QACrB;MACF,CAAC;MACD,IAAIN,SAAS,EAAE;QACb,IAAI,CAACzB,eAAe,CAACoB,UAAU,CAAC,CAACiB,aAAa,GAAGZ,SAAS;QAC1D,IAAI,CAACxB,yBAAyB,CAACwB,SAAS,CAAC,GAAG;UAC1CS,KAAK,EAAGH,GAAQ,IAAK,IAAI,CAACI,SAAS,CAACxB,CAAC,CAACe,WAAW,EAAEjB,IAAI,EAAEsB,GAAG,CAAC;UAC7DK,MAAM,EAAGL,GAAQ,IAAK;YACpB,MAAMO,gBAAgB,GAAG,IAAI,CAACrC,yBAAyB,CAACwB,SAAS,CAAC,CAACY,aAAa;YAChF,IAAIC,gBAAgB,EAAE;cACpB,IAAI,CAACtC,eAAe,CAACsC,gBAAgB,CAAC,CAACF,MAAM,CAACL,GAAG,CAAC;YACpD;UACF,CAAC;UACDM,aAAa,EAAEjB;QACjB,CAAC;MACH;MAEA,IAAIG,OAAO,EAAE;QACX,IAAI,CAACvB,eAAe,CAACuB,OAAO,CAAC,GAAG;UAC9BW,KAAK,EAAGH,GAAQ,IAAK,IAAI,CAACI,SAAS,CAACxB,CAAC,CAACa,SAAS,CAAEf,IAAI,EAAEsB,GAAG,CAAC;UAC3DK,MAAM,EAAGL,GAAQ,IAAK;YACpBE,KAAK,CAAC,CAAC;YACP,MAAMT,SAAS,GAAGb,CAAC,CAACa,SAAU;YAC9B,IAAI,OAAO,IAAIA,SAAS,EAAE;cACxBe,oBAAW,CAACC,GAAG,CAAC,2BAA2BC,IAAI,CAACC,SAAS,CAACX,GAAG,CAAC,EAAE,EAAE;gBAChEY,MAAM,EAAEC,yBAAa;gBACrBC,MAAM,EAAEC,kBAAO,CAACC;cAClB,CAAC,CAAC;cACF,MAAMC,IAAI,GAAG,IAAI7E,GAAG,CAAC0D,OAAO,CAACL,SAAS,CAACyB,KAAK,EAAElB,GAAU,CAAC;cACzDQ,oBAAW,CAACC,GAAG,CAAC,2BAA2BQ,IAAI,EAAE,EAAE;gBACjDL,MAAM,EAAEC,yBAAa;gBACrBC,MAAM,EAAEC,kBAAO,CAACC;cAClB,CAAC,CAAC;cACF5B,MAAM,CAAC6B,IAAI,CAAC;YACd,CAAC,MAAM;cACL7B,MAAM,CAACK,SAAS,CAAC0B,GAAG,CAACnB,GAAU,CAAC,CAAC;YACnC;UACF;QACF,CAAC;MACH;MACA,IAAIoB,QAAoC,GAAG,IAAI;MAC/C,IAAI,CAAC/C,YAAY,CACdgD,OAAO,CAAC;QACPC,OAAO,EAAE1C,CAAC,CAAC2C,IAAI,IAAI,EAAE;QACrBC,QAAQ,EAAE5C,CAAC,CAAC6C,GAAG;QACf;QACAX,MAAM,EAAElC,CAAC,CAACkC,MAAM,GAAGlC,CAAC,CAACkC,MAAM,GAAGlC,CAAC,CAAC8C,IAAI,GAAGC,mBAAY,CAACC,IAAI,GAAGD,mBAAY,CAACE,GAAG;QAE3EC,IAAI,EAAElD,CAAC,CAAC8C;MACV,CAAC,CAAC,CACDK,IAAI,CAAEC,GAAQ,IAAK;QAClBZ,QAAQ,GAAGY,GAAG;QACd,IAAIlD,KAAK,EAAE;UACTA,KAAK,CAACkD,GAAG,CAAC;QACZ;MACF,CAAC,CAAC,CACDC,KAAK,CAAEC,KAA0B,IAAK;QACrChC,KAAK,CAAC,CAAC;QACP,IAAIgC,KAAK,EAAEC,OAAO,EAAE;UAClBD,KAAK,CAACC,OAAO,CAACC,aAAa,GAAG,GAAG;QACnC;QACA,IAAIF,KAAK,EAAEC,OAAO,EAAE;UAClBD,KAAK,CAACC,OAAO,CAACC,aAAa,GAAG,GAAG;QACnC;QACA,IAAI,OAAOxD,CAAC,CAACuC,GAAG,KAAK,UAAU,EAAE;UAC/B/B,MAAM,CAACR,CAAC,CAACuC,GAAG,CAACe,KAAK,CAAC,CAAC;QACtB,CAAC,MAAM,IAAI,OAAOtD,CAAC,CAACuC,GAAG,KAAK,QAAQ,EAAE;UACpC/B,MAAM,CAAC,IAAIhD,GAAG,CAACiG,OAAO,CAACzD,CAAC,CAACuC,GAAG,CAAC,CAAC;QAChC,CAAC,MAAM;UACL/B,MAAM,CAAC,IAAIhD,GAAG,CAACiG,OAAO,CAAC,sCAAsC,CAAC,CAAC;QACjE;MACF,CAAC,CAAC;MAEJ,IAAIzD,CAAC,CAACiB,OAAO,KAAK,UAAU,EAAE;QAC5ByC,MAAM,CAACC,UAAU,CACf,MAAM;UACJ,IAAItC,OAAO,EAAE;YACX;UACF;UACAC,KAAK,CAAC,CAAC;UACP,IAAIkB,QAAQ,EAAEe,OAAO,EAAE;YACrBf,QAAQ,CAACe,OAAO,CAACC,aAAa,GAAG,GAAG;UACtC;UACA5B,oBAAW,CAAC0B,KAAK,CACf,0BAA0B7C,UAAU,GAAGqB,IAAI,CAACC,SAAS,CAACS,QAAQ,CAAC,GAAGxC,CAAC,CAAC6C,GAAG,EAAE,EACzE;YACEb,MAAM,EAAEC,yBAAa;YACrBC,MAAM,EAAEC,kBAAO,CAACC;UAClB,CACF,CAAC;UACD5B,MAAM,CACJ,IAAIhD,GAAG,CAAC0D,OAAO,CAAC,0BAA0B,EAAE;YAC1CC,GAAG,EAAEV,UAAU;YACf+B,QAAQ,EAAEA;UACZ,CAAC,CACH,CAAC;QACH,CAAC,EACDxC,CAAC,CAACiB,OAAO,IAAIjB,CAAC,CAACiB,OAAO,GAAG,CAAC,GAAGjB,CAAC,CAACiB,OAAO,GAAG2C,sBAC3C,CAAC;MACH;IACF,CAAC,CAAC;EACJ;;EAEA;AACF;AACA;AACA;AACA;EACUlD,SAASA,CAACZ,IAAS,EAAU;IACnC,IAAI+D,MAAM,GAAG,EAAE;IACf,KAAK,MAAM1C,GAAG,IAAIlC,MAAM,CAAC6E,IAAI,CAAChE,IAAI,CAAC,CAACiE,MAAM,CAAEC,IAAI,IAAKA,IAAI,KAAK,WAAW,CAAC,EAAE;MAC1E,MAAMC,KAAK,GAAGnE,IAAI,CAACqB,GAAG,CAAC;MAEvB,IAAI+C,KAAK,CAACC,OAAO,CAACF,KAAK,CAAC,EAAE;QACxBJ,MAAM,IAAI,GAAG1C,GAAG,KAAK8C,KAAK,CAACG,IAAI,CAAC,GAAG,CAAC,IAAI;MAC1C,CAAC,MAAM,IAAI,OAAOH,KAAK,KAAK,QAAQ,IAAIA,KAAK,KAAK,IAAI,EAAE;QACtDJ,MAAM,IAAI,GAAG1C,GAAG,KAAK,IAAI,CAACT,SAAS,CAACuD,KAAK,CAAC,IAAI;MAChD,CAAC,MAAM;QACLJ,MAAM,IAAI,GAAG1C,GAAG,IAAI8C,KAAK,GAAG;MAC9B;IACF;IAEA,OAAOJ,MAAM,GAAGA,MAAM,CAACQ,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAGR,MAAM;EAC9C;;EAEA;AACF;AACA;AACA;AACA;AACA;EACUrC,SAASA,CAAC1B,IAAS,EAAEsB,GAAQ,EAAW;IAC9C;IACA,IAAItB,IAAI,CAACwE,SAAS,IAAI,OAAOxE,IAAI,CAACwE,SAAS,KAAK,QAAQ,EAAE;MACxD,IAAI,CAAClF,OAAO,CAACmF,YAAY,CAACzE,IAAI,CAACwE,SAAS,EAAElD,GAAG,CAAC,EAAE;QAC9C,OAAO,KAAK;MACd;IACF;IAEA,KAAK,MAAMD,GAAG,IAAIlC,MAAM,CAAC6E,IAAI,CAAChE,IAAI,CAAC,CAACiE,MAAM,CAAEC,IAAI,IAAKA,IAAI,KAAK,WAAW,CAAC,EAAE;MAC1E,MAAMQ,SAAS,GAAG1E,IAAI,CAACqB,GAAG,CAAC;MAC3B,MAAMsD,QAAQ,GAAGrD,GAAG,CAACD,GAAG,CAAC;MAEzB,IAAI+C,KAAK,CAACC,OAAO,CAACK,SAAS,CAAC,EAAE;QAC5B;QACA,IAAI,CAACA,SAAS,CAACE,QAAQ,CAACD,QAAQ,CAAC,EAAE;UACjC,OAAO,KAAK;QACd;MACF,CAAC,MAAM,IAAI,OAAOD,SAAS,KAAK,QAAQ,IAAIA,SAAS,KAAK,IAAI,EAAE;QAC9D,IAAI,OAAOC,QAAQ,KAAK,QAAQ,IAAIA,QAAQ,KAAK,IAAI,EAAE;UACrD,IAAI,CAAC,IAAI,CAACjD,SAAS,CAACgD,SAAS,EAAEC,QAAQ,CAAC,EAAE;YACxC,OAAO,KAAK;UACd;QACF,CAAC,MAAM;UACL,OAAO,KAAK;QACd;MACF,CAAC,MAAM,IAAI,CAACA,QAAQ,IAAIA,QAAQ,KAAKD,SAAS,EAAE;QAC9C,OAAO,KAAK;MACd;IACF;IAEA,OAAO,IAAI;EACb;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAeD,YAAYA,CAACI,OAAY,EAAEvD,GAAQ,EAAW;IAC3D,MAAMwD,SAAS,GAAGD,OAAO,CAACC,SAAS,IAAI,MAAM;IAC7C,MAAMC,OAAO,GAAGzD,GAAG,CAACwD,SAAS,CAAC;IAE9B,IAAID,OAAO,CAACG,UAAU,IAAIH,OAAO,CAACG,UAAU,CAACD,OAAO,CAAC,EAAE;MACrD,MAAME,SAAS,GAAGJ,OAAO,CAACG,UAAU,CAACD,OAAO,CAAC;MAC7C,KAAK,MAAMG,KAAK,IAAI/F,MAAM,CAAC6E,IAAI,CAACiB,SAAS,CAAC,EAAE;QAC1C,IAAI,CAAC3D,GAAG,CAAC4D,KAAK,CAAC,IAAI5D,GAAG,CAAC4D,KAAK,CAAC,KAAKD,SAAS,CAACC,KAAK,CAAC,EAAE;UAClD,OAAO,KAAK;QACd;MACF;MAEA,OAAO,IAAI;IACb;IAEA,OAAO,KAAK;EACd;;EAEA;AACF;AACA;AACA;AACA;EACmBnF,SAAS,GAAIuB,GAAQ,IAAK;IACzC,MAAM6D,KAAK,GAAGnD,IAAI,CAACoD,KAAK,CAAC9D,GAAG,CAAC;IAC7B,IAAI6D,KAAK,CAACE,IAAI,KAAK,SAAS,EAAE;MAC5BvD,oBAAW,CAACwD,IAAI,CAAC,uCAAuC,EAAE;QACxDpD,MAAM,EAAEC,yBAAa;QACrBC,MAAM,EAAEC,kBAAO,CAACkD;MAClB,CAAC,CAAC;MAEF;IACF;IAEA,IAAIJ,KAAK,CAACK,SAAS,KAAK,MAAM,EAAE;MAC9B;IACF;IAEA,IAAIL,KAAK,CAACE,IAAI,KAAK,oBAAoB,EAAE;MACvCvD,oBAAW,CAACwD,IAAI,CAAC,0CAA0C,EAAE;QAC3DpD,MAAM,EAAEC,yBAAa;QACrBC,MAAM,EAAEC,kBAAO,CAACkD;MAClB,CAAC,CAAC;IACJ;IAEA,IAAIE,SAAS,GAAG,KAAK;IAErB,MAAMC,IAAI,GAAGvG,MAAM,CAAC6E,IAAI,CAAC,IAAI,CAACzE,eAAe,CAAC;IAC9C,KAAK,MAAMoG,OAAO,IAAID,IAAI,EAAE;MAC1B,MAAMzF,GAAG,GAAG,IAAI,CAACV,eAAe,CAACoG,OAAO,CAAC;MACzC,IAAI1F,GAAG,CAACwB,KAAK,CAAC0D,KAAK,CAAC,EAAE;QACpBlF,GAAG,CAAC0B,MAAM,CAACwD,KAAK,CAAC;QACjBM,SAAS,GAAG,IAAI;QAChB;MACF;IACF;IACA;IACA,MAAMG,OAAO,GAAGzG,MAAM,CAAC6E,IAAI,CAAC,IAAI,CAACxE,yBAAyB,CAAC;IAC3D,KAAK,MAAMmG,OAAO,IAAIC,OAAO,EAAE;MAC7B,MAAM3F,GAAG,GAAG,IAAI,CAACT,yBAAyB,CAACmG,OAAO,CAAC;MACnD,IAAI1F,GAAG,CAACwB,KAAK,CAAC0D,KAAK,CAAC,EAAE;QACpBlF,GAAG,CAAC0B,MAAM,CAACwD,KAAK,CAAC;QACjBM,SAAS,GAAG,IAAI;MAClB;IACF;;IAEA;;IAEA,IAAI,CAACA,SAAS,EAAE;MACd3D,oBAAW,CAACwD,IAAI,CAAC,uEAAuE,EAAE;QACxFpD,MAAM,EAAEC,yBAAa;QACrBC,MAAM,EAAEC,kBAAO,CAACkD;MAClB,CAAC,CAAC;IACJ;EACF,CAAC;AACH;AAACM,OAAA,CAAAxH,OAAA,GAAAiB,OAAA","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["Err","_interopRequireWildcard","require","_types","_loggerProxy","_interopRequireDefault","_constants","_constants2","_WebexRequest","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","AqmReqs","pendingRequests","pendingNotifCancelrequest","constructor","webSocketManager","webexRequest","WebexRequest","getInstance","on","onMessage","bind","req","c","p","cbRes","makeAPIRequest","reqEmpty","createPromise","Promise","resolve","reject","keySuccess","bindPrint","notifSuccess","keyFail","notifFail","keyCancel","notifCancel","k","timeout","Details","key","msg","isClear","clear","check","bindCheck","handle","alternateBind","alternateBindKey","LoggerProxy","log","JSON","stringify","module","AQM_REQS_FILE","method","METHODS","CREATE_PROMISE","eerr","errId","err","response","request","service","host","resource","url","data","HTTP_METHODS","POST","GET","body","then","res","catch","error","headers","Authorization","Message","window","setTimeout","TIMEOUT_REQ","result","Array","isArray","join","slice","includes","event","parse","type","info","ON_MESSAGE","keepalive","isHandled","kReq","keys","thisReq","kReqAlt","exports"],"sources":["aqm-reqs.ts"],"sourcesContent":["import {Msg} from './GlobalTypes';\nimport * as Err from './Err';\nimport {HTTP_METHODS, WebexRequestPayload} from '../../types';\nimport LoggerProxy from '../../logger-proxy';\nimport {CbRes, Conf, ConfEmpty, Pending, Req, Res, ResEmpty} from './types';\nimport {TIMEOUT_REQ, METHODS} from './constants';\nimport {AQM_REQS_FILE} from '../../constants';\nimport WebexRequest from './WebexRequest';\nimport {WebSocketManager} from './websocket/WebSocketManager';\n\nexport default class AqmReqs {\n private pendingRequests: Record<string, Pending> = {};\n private pendingNotifCancelrequest: Record<string, Pending> = {};\n private webexRequest: WebexRequest;\n private webSocketManager: WebSocketManager;\n\n constructor(webSocketManager: WebSocketManager) {\n this.webexRequest = WebexRequest.getInstance();\n this.webSocketManager = webSocketManager;\n this.webSocketManager.on('message', this.onMessage.bind(this));\n }\n\n req<TRes, TErr, TReq>(c: Conf<TRes, TErr, TReq>): Res<TRes, TReq> {\n return (p: TReq, cbRes?: CbRes<TRes>) => this.makeAPIRequest(c(p), cbRes);\n }\n\n reqEmpty<TRes, TErr>(c: ConfEmpty<TRes, TErr>): ResEmpty<TRes> {\n return (cbRes?: CbRes<TRes>) => this.makeAPIRequest(c(), cbRes);\n }\n\n private async makeAPIRequest<TRes, TErr>(c: Req<TRes, TErr>, cbRes?: CbRes<TRes>): Promise<TRes> {\n return this.createPromise(c, cbRes);\n }\n\n private createPromise<TRes, TErr>(c: Req<TRes, TErr>, cbRes?: CbRes<TRes>) {\n return new Promise<TRes>((resolve, reject) => {\n const keySuccess = this.bindPrint(c.notifSuccess.bind);\n const keyFail = c.notifFail ? this.bindPrint(c.notifFail.bind) : null;\n const keyCancel = c.notifCancel?.bind ? this.bindPrint(c.notifCancel.bind) : null;\n let k = '';\n if (this.pendingRequests[keySuccess]) {\n k = keySuccess;\n }\n if (keyFail && this.pendingRequests[keyFail]) {\n k += keyFail;\n }\n if (k && c.timeout !== 'disabled') {\n reject(\n new Err.Details('Service.aqm.reqs.Pending', {\n key: k,\n msg: 'The request has been already created, multiple requests are not allowed.',\n })\n );\n\n return;\n }\n\n let isClear = false;\n const clear = () => {\n delete this.pendingRequests[keySuccess];\n if (keyFail) {\n delete this.pendingRequests[keyFail];\n }\n if (keyCancel) {\n delete this.pendingNotifCancelrequest[keyCancel];\n }\n isClear = true;\n };\n\n this.pendingRequests[keySuccess] = {\n check: (msg: Msg) => this.bindCheck(c.notifSuccess.bind, msg),\n handle: (msg: Msg) => {\n clear();\n resolve(msg as any);\n },\n };\n if (keyCancel) {\n this.pendingRequests[keySuccess].alternateBind = keyCancel;\n this.pendingNotifCancelrequest[keyCancel] = {\n check: (msg: Msg) => this.bindCheck(c.notifCancel?.bind, msg),\n handle: (msg: Msg) => {\n const alternateBindKey = this.pendingNotifCancelrequest[keyCancel].alternateBind;\n if (alternateBindKey) {\n this.pendingRequests[alternateBindKey].handle(msg);\n }\n },\n alternateBind: keySuccess,\n };\n }\n\n if (keyFail) {\n this.pendingRequests[keyFail] = {\n check: (msg: Msg) => this.bindCheck(c.notifFail!.bind, msg),\n handle: (msg: Msg) => {\n clear();\n const notifFail = c.notifFail!;\n if ('errId' in notifFail) {\n LoggerProxy.log(`Routing request failed: ${JSON.stringify(msg)}`, {\n module: AQM_REQS_FILE,\n method: METHODS.CREATE_PROMISE,\n });\n const eerr = new Err.Details(notifFail.errId, msg as any);\n LoggerProxy.log(`Routing request failed: ${eerr}`, {\n module: AQM_REQS_FILE,\n method: METHODS.CREATE_PROMISE,\n });\n reject(eerr);\n } else {\n reject(notifFail.err(msg as any));\n }\n },\n };\n }\n let response: WebexRequestPayload | null = null;\n this.webexRequest\n .request({\n service: c.host ?? '',\n resource: c.url,\n // eslint-disable-next-line no-nested-ternary\n method: c.method ? c.method : c.data ? HTTP_METHODS.POST : HTTP_METHODS.GET,\n\n body: c.data,\n })\n .then((res: any) => {\n response = res;\n if (cbRes) {\n cbRes(res);\n }\n })\n .catch((error: WebexRequestPayload) => {\n clear();\n if (error?.headers) {\n error.headers.Authorization = '*';\n }\n if (error?.headers) {\n error.headers.Authorization = '*';\n }\n if (typeof c.err === 'function') {\n reject(c.err(error));\n } else if (typeof c.err === 'string') {\n reject(new Err.Message(c.err));\n } else {\n reject(new Err.Message('Service.aqm.reqs.GenericRequestError'));\n }\n });\n\n if (c.timeout !== 'disabled') {\n window.setTimeout(\n () => {\n if (isClear) {\n return;\n }\n clear();\n if (response?.headers) {\n response.headers.Authorization = '*';\n }\n LoggerProxy.error(`Routing request timeout${keySuccess}${response!}${c.url}`, {\n module: AQM_REQS_FILE,\n method: METHODS.CREATE_PROMISE,\n });\n reject(\n new Err.Details('Service.aqm.reqs.Timeout', {\n key: keySuccess,\n response: response!,\n })\n );\n },\n c.timeout && c.timeout > 0 ? c.timeout : TIMEOUT_REQ\n );\n }\n });\n }\n\n private bindPrint(bind: any) {\n let result = '';\n // eslint-disable-next-line no-restricted-syntax\n for (const k in bind) {\n if (Array.isArray(bind[k])) {\n result += `${k}=[${bind[k].join(',')}],`;\n } else if (typeof bind[k] === 'object' && bind[k] !== null) {\n result += `${k}=(${this.bindPrint(bind[k])}),`;\n } else {\n result += `${k}=${bind[k]},`;\n }\n }\n\n return result ? result.slice(0, -1) : result;\n }\n\n private bindCheck(bind: any, msg: any) {\n // eslint-disable-next-line no-restricted-syntax\n for (const k in bind) {\n if (Array.isArray(bind[k])) {\n // Check if the message value matches any of the values in the array\n if (!bind[k].includes(msg[k])) {\n return false;\n }\n } else if (typeof bind[k] === 'object' && bind[k] !== null) {\n if (typeof msg[k] === 'object' && msg[k] !== null) {\n if (!this.bindCheck(bind[k], msg[k])) {\n return false;\n }\n } else {\n return false;\n }\n } else if (!msg[k] || msg[k] !== bind[k]) {\n return false;\n }\n }\n\n return true;\n }\n\n // must be lambda\n private readonly onMessage = (msg: any) => {\n const event = JSON.parse(msg);\n if (event.type === 'Welcome') {\n LoggerProxy.info(`Welcome message from Notifs Websocket`, {\n module: AQM_REQS_FILE,\n method: METHODS.ON_MESSAGE,\n });\n\n return;\n }\n\n if (event.keepalive === 'true') {\n return;\n }\n\n if (event.type === 'AgentReloginFailed') {\n LoggerProxy.info('Silently handling the agent relogin fail', {\n module: AQM_REQS_FILE,\n method: METHODS.ON_MESSAGE,\n });\n }\n\n let isHandled = false;\n\n const kReq = Object.keys(this.pendingRequests);\n for (const thisReq of kReq) {\n const req = this.pendingRequests[thisReq];\n if (req.check(event)) {\n req.handle(event);\n isHandled = true;\n break;\n }\n }\n // pendingNotifCancelrequest stores the secondary bind key, checks for the secondary bind key and handles the event\n const kReqAlt = Object.keys(this.pendingNotifCancelrequest);\n for (const thisReq of kReqAlt) {\n const req = this.pendingNotifCancelrequest[thisReq];\n if (req.check(event)) {\n req.handle(event);\n isHandled = true;\n }\n }\n\n // TODO: add event emitter for unhandled events to replicate event.listen or .on\n\n if (!isHandled) {\n LoggerProxy.info(`event=missingEventHandler | [AqmReqs] missing routing message handler`, {\n module: AQM_REQS_FILE,\n method: METHODS.ON_MESSAGE,\n });\n }\n };\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.WebSocketManager = void 0;
|
|
6
|
+
exports.default = exports.WebSocketManager = void 0;
|
|
7
7
|
var _events = _interopRequireDefault(require("events"));
|
|
8
8
|
var _types = require("../../../types");
|
|
9
9
|
var _constants = require("../../constants");
|
|
@@ -41,18 +41,10 @@ class WebSocketManager extends _events.default {
|
|
|
41
41
|
}
|
|
42
42
|
async initWebSocket(options) {
|
|
43
43
|
const {
|
|
44
|
-
body
|
|
44
|
+
body,
|
|
45
45
|
resource
|
|
46
46
|
} = options;
|
|
47
|
-
|
|
48
|
-
await this.register(connectionConfig, resource);
|
|
49
|
-
} catch (error) {
|
|
50
|
-
_loggerProxy.default.error(`[WebSocketStatus] | Error in registering Websocket ${error}`, {
|
|
51
|
-
module: _constants3.WEB_SOCKET_MANAGER_FILE,
|
|
52
|
-
method: _constants2.METHODS.INIT_WEB_SOCKET
|
|
53
|
-
});
|
|
54
|
-
throw error;
|
|
55
|
-
}
|
|
47
|
+
await this.register(body, resource);
|
|
56
48
|
return new Promise((resolve, reject) => {
|
|
57
49
|
this.welcomePromiseResolve = resolve;
|
|
58
50
|
this.connect().catch(error => {
|
|
@@ -82,23 +74,11 @@ class WebSocketManager extends _events.default {
|
|
|
82
74
|
}
|
|
83
75
|
async register(connectionConfig, resource) {
|
|
84
76
|
try {
|
|
85
|
-
// X-ORGANIZATION-ID header is only required for INT environments
|
|
86
|
-
const isIntEnv = this.webex.internal?.services?.isIntegrationEnvironment() || false;
|
|
87
|
-
const orgId = this.webex.credentials.getOrgId();
|
|
88
|
-
if (isIntEnv && orgId) {
|
|
89
|
-
_loggerProxy.default.log(`[WebSocketManager] Adding X-ORGANIZATION-ID header for INT environment`, {
|
|
90
|
-
module: _constants3.WEB_SOCKET_MANAGER_FILE,
|
|
91
|
-
method: _constants2.METHODS.REGISTER
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
77
|
const subscribeResponse = await this.webex.request({
|
|
95
78
|
service: _constants.WCC_API_GATEWAY,
|
|
96
79
|
resource,
|
|
97
80
|
method: _types.HTTP_METHODS.POST,
|
|
98
|
-
body: connectionConfig
|
|
99
|
-
headers: isIntEnv && orgId ? {
|
|
100
|
-
'X-ORGANIZATION-ID': orgId
|
|
101
|
-
} : undefined
|
|
81
|
+
body: connectionConfig
|
|
102
82
|
});
|
|
103
83
|
this.url = subscribeResponse.body.webSocketUrl;
|
|
104
84
|
} catch (e) {
|
|
@@ -106,7 +86,6 @@ class WebSocketManager extends _events.default {
|
|
|
106
86
|
module: _constants3.WEB_SOCKET_MANAGER_FILE,
|
|
107
87
|
method: _constants2.METHODS.REGISTER
|
|
108
88
|
});
|
|
109
|
-
throw e;
|
|
110
89
|
}
|
|
111
90
|
}
|
|
112
91
|
async connect() {
|
|
@@ -203,4 +182,5 @@ class WebSocketManager extends _events.default {
|
|
|
203
182
|
}
|
|
204
183
|
}
|
|
205
184
|
exports.WebSocketManager = WebSocketManager;
|
|
185
|
+
var _default = exports.default = WebSocketManager;
|
|
206
186
|
//# sourceMappingURL=WebSocketManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_events","_interopRequireDefault","require","_types","_constants","_types2","_loggerProxy","_keepalive","_constants2","_constants3","e","__esModule","default","WebSocketManager","EventEmitter","url","welcomePromiseResolve","constructor","options","webex","shouldReconnect","websocket","isSocketClosed","isWelcomeReceived","forceCloseWebSocketOnTimeout","isConnectionLost","workerScriptBlob","Blob","workerScript","type","keepaliveWorker","Worker","URL","createObjectURL","initWebSocket","body","connectionConfig","resource","register","error","LoggerProxy","module","WEB_SOCKET_MANAGER_FILE","method","METHODS","INIT_WEB_SOCKET","Promise","resolve","reject","connect","catch","close","reason","postMessage","log","CLOSE","handleConnectionLost","event","isIntEnv","internal","services","isIntegrationEnvironment","orgId","credentials","getOrgId","REGISTER","subscribeResponse","request","service","WCC_API_GATEWAY","HTTP_METHODS","POST","headers","undefined","webSocketUrl","CONNECT","WebSocket","onopen","send","JSON","stringify","keepalive","onmessage","keepAliveEvent","data","intervalDuration","KEEPALIVE_WORKER_INTERVAL","closeSocketTimeout","CLOSE_SOCKET_TIMEOUT","onerror","onclose","webSocketOnCloseHandler","emit","eventData","parse","CC_EVENTS","WELCOME","issueReason","onlineStatus","navigator","onLine","WEB_SOCKET_ON_CLOSE_HANDLER","exports"],"sources":["WebSocketManager.ts"],"sourcesContent":["import EventEmitter from 'events';\nimport {WebexSDK, SubscribeRequest, HTTP_METHODS} from '../../../types';\nimport {WCC_API_GATEWAY} from '../../constants';\nimport {ConnectionLostDetails} from './types';\nimport {CC_EVENTS, SubscribeResponse, WelcomeResponse} from '../../config/types';\nimport LoggerProxy from '../../../logger-proxy';\nimport workerScript from './keepalive.worker';\nimport {KEEPALIVE_WORKER_INTERVAL, CLOSE_SOCKET_TIMEOUT, METHODS} from '../constants';\nimport {WEB_SOCKET_MANAGER_FILE} from '../../../constants';\n\n/**\n * WebSocketManager handles the WebSocket connection for Contact Center operations.\n * It manages the connection lifecycle, including registration, reconnection, and message handling.\n * It also utilizes a Web Worker to manage keepalive messages and socket closure.\n * @ignore\n */\nexport class WebSocketManager extends EventEmitter {\n private websocket: WebSocket;\n shouldReconnect: boolean;\n isSocketClosed: boolean;\n private isWelcomeReceived: boolean;\n private url: string | null = null;\n private forceCloseWebSocketOnTimeout: boolean;\n private isConnectionLost: boolean;\n private webex: WebexSDK;\n private welcomePromiseResolve:\n | ((value: WelcomeResponse | PromiseLike<WelcomeResponse>) => void)\n | null = null;\n\n private keepaliveWorker: Worker;\n\n constructor(options: {webex: WebexSDK}) {\n super();\n const {webex} = options;\n this.webex = webex;\n this.shouldReconnect = true;\n this.websocket = {} as WebSocket;\n this.isSocketClosed = false;\n this.isWelcomeReceived = false;\n this.forceCloseWebSocketOnTimeout = false;\n this.isConnectionLost = false;\n\n const workerScriptBlob = new Blob([workerScript], {type: 'application/javascript'});\n this.keepaliveWorker = new Worker(URL.createObjectURL(workerScriptBlob));\n }\n\n async initWebSocket(options: {\n body: SubscribeRequest;\n resource: string;\n }): Promise<WelcomeResponse> {\n const {body: connectionConfig, resource} = options;\n try {\n await this.register(connectionConfig, resource);\n } catch (error) {\n LoggerProxy.error(`[WebSocketStatus] | Error in registering Websocket ${error}`, {\n module: WEB_SOCKET_MANAGER_FILE,\n method: METHODS.INIT_WEB_SOCKET,\n });\n throw error;\n }\n\n return new Promise((resolve, reject) => {\n this.welcomePromiseResolve = resolve;\n this.connect().catch((error) => {\n LoggerProxy.error(`[WebSocketStatus] | Error in connecting Websocket ${error}`, {\n module: WEB_SOCKET_MANAGER_FILE,\n method: METHODS.INIT_WEB_SOCKET,\n });\n reject(error);\n });\n });\n }\n\n close(shouldReconnect: boolean, reason = 'Unknown') {\n if (!this.isSocketClosed && this.shouldReconnect) {\n this.shouldReconnect = shouldReconnect;\n this.websocket.close();\n this.keepaliveWorker.postMessage({type: 'terminate'});\n LoggerProxy.log(\n `[WebSocketStatus] | event=webSocketClose | WebSocket connection closed manually REASON: ${reason}`,\n {module: WEB_SOCKET_MANAGER_FILE, method: METHODS.CLOSE}\n );\n }\n }\n\n handleConnectionLost(event: ConnectionLostDetails) {\n this.isConnectionLost = event.isConnectionLost;\n }\n\n private async register(connectionConfig: SubscribeRequest, resource: string) {\n try {\n // X-ORGANIZATION-ID header is only required for INT environments\n const isIntEnv = this.webex.internal?.services?.isIntegrationEnvironment() || false;\n const orgId = this.webex.credentials.getOrgId();\n\n if (isIntEnv && orgId) {\n LoggerProxy.log(`[WebSocketManager] Adding X-ORGANIZATION-ID header for INT environment`, {\n module: WEB_SOCKET_MANAGER_FILE,\n method: METHODS.REGISTER,\n });\n }\n\n const subscribeResponse: SubscribeResponse = await this.webex.request({\n service: WCC_API_GATEWAY,\n resource,\n method: HTTP_METHODS.POST,\n body: connectionConfig,\n headers: isIntEnv && orgId ? {'X-ORGANIZATION-ID': orgId} : undefined,\n });\n this.url = subscribeResponse.body.webSocketUrl;\n } catch (e) {\n LoggerProxy.error(\n `Register API Failed, Request to RoutingNotifs websocket registration API failed ${e}`,\n {module: WEB_SOCKET_MANAGER_FILE, method: METHODS.REGISTER}\n );\n throw e;\n }\n }\n\n private async connect() {\n if (!this.url) {\n return undefined;\n }\n LoggerProxy.log(\n `[WebSocketStatus] | event=webSocketConnecting | Connecting to WebSocket: ${this.url}`,\n {module: WEB_SOCKET_MANAGER_FILE, method: METHODS.CONNECT}\n );\n this.websocket = new WebSocket(this.url);\n\n return new Promise((resolve, reject) => {\n this.websocket.onopen = () => {\n this.isSocketClosed = false;\n this.shouldReconnect = true;\n\n this.websocket.send(JSON.stringify({keepalive: 'true'}));\n this.keepaliveWorker.onmessage = (keepAliveEvent: {data: any}) => {\n if (keepAliveEvent?.data?.type === 'keepalive') {\n this.websocket.send(JSON.stringify({keepalive: 'true'}));\n }\n\n if (keepAliveEvent?.data?.type === 'closeSocket' && this.isConnectionLost) {\n this.forceCloseWebSocketOnTimeout = true;\n this.close(true, 'WebSocket did not auto close within 16 secs');\n LoggerProxy.error(\n '[webSocketTimeout] | event=webSocketTimeout | WebSocket connection closed forcefully',\n {module: WEB_SOCKET_MANAGER_FILE, method: METHODS.CONNECT}\n );\n }\n };\n\n this.keepaliveWorker.postMessage({\n type: 'start',\n intervalDuration: KEEPALIVE_WORKER_INTERVAL, // Keepalive interval\n isSocketClosed: this.isSocketClosed,\n closeSocketTimeout: CLOSE_SOCKET_TIMEOUT, // Close socket timeout\n });\n };\n\n this.websocket.onerror = (event: any) => {\n LoggerProxy.error(\n `[WebSocketStatus] | event=socketConnectionFailed | WebSocket connection failed ${event}`,\n {module: WEB_SOCKET_MANAGER_FILE, method: METHODS.CONNECT}\n );\n reject();\n };\n\n this.websocket.onclose = async (event: any) => {\n this.webSocketOnCloseHandler(event);\n };\n\n this.websocket.onmessage = (e: MessageEvent) => {\n this.emit('message', e.data);\n const eventData = JSON.parse(e.data);\n\n if (eventData.type === CC_EVENTS.WELCOME) {\n this.isWelcomeReceived = true;\n if (this.welcomePromiseResolve) {\n this.welcomePromiseResolve(eventData.data as WelcomeResponse);\n this.welcomePromiseResolve = null;\n }\n }\n\n if (eventData.type === 'AGENT_MULTI_LOGIN') {\n this.close(false, 'multiLogin');\n LoggerProxy.error(\n '[WebSocketStatus] | event=agentMultiLogin | WebSocket connection closed by agent multiLogin',\n {module: WEB_SOCKET_MANAGER_FILE, method: METHODS.CONNECT}\n );\n }\n };\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n private async webSocketOnCloseHandler(event: any) {\n this.isSocketClosed = true;\n this.keepaliveWorker.postMessage({type: 'terminate'});\n if (this.shouldReconnect) {\n this.emit('socketClose');\n let issueReason;\n if (this.forceCloseWebSocketOnTimeout) {\n issueReason = 'WebSocket auto close timed out. Forcefully closed websocket.';\n } else {\n const onlineStatus = navigator.onLine;\n issueReason = !onlineStatus\n ? 'network issue'\n : 'missing keepalive from either desktop or notif service';\n }\n LoggerProxy.error(\n `[WebSocketStatus] | event=webSocketClose | WebSocket connection closed REASON: ${issueReason}`,\n {module: WEB_SOCKET_MANAGER_FILE, method: METHODS.WEB_SOCKET_ON_CLOSE_HANDLER}\n );\n this.forceCloseWebSocketOnTimeout = false;\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_events","_interopRequireDefault","require","_types","_constants","_types2","_loggerProxy","_keepalive","_constants2","_constants3","e","__esModule","default","WebSocketManager","EventEmitter","url","welcomePromiseResolve","constructor","options","webex","shouldReconnect","websocket","isSocketClosed","isWelcomeReceived","forceCloseWebSocketOnTimeout","isConnectionLost","workerScriptBlob","Blob","workerScript","type","keepaliveWorker","Worker","URL","createObjectURL","initWebSocket","body","resource","register","Promise","resolve","reject","connect","catch","error","LoggerProxy","module","WEB_SOCKET_MANAGER_FILE","method","METHODS","INIT_WEB_SOCKET","close","reason","postMessage","log","CLOSE","handleConnectionLost","event","connectionConfig","subscribeResponse","request","service","WCC_API_GATEWAY","HTTP_METHODS","POST","webSocketUrl","REGISTER","undefined","CONNECT","WebSocket","onopen","send","JSON","stringify","keepalive","onmessage","keepAliveEvent","data","intervalDuration","KEEPALIVE_WORKER_INTERVAL","closeSocketTimeout","CLOSE_SOCKET_TIMEOUT","onerror","onclose","webSocketOnCloseHandler","emit","eventData","parse","CC_EVENTS","WELCOME","issueReason","onlineStatus","navigator","onLine","WEB_SOCKET_ON_CLOSE_HANDLER","exports","_default"],"sources":["WebSocketManager.ts"],"sourcesContent":["import EventEmitter from 'events';\nimport {WebexSDK, SubscribeRequest, HTTP_METHODS} from '../../../types';\nimport {WCC_API_GATEWAY} from '../../constants';\nimport {ConnectionLostDetails} from './types';\nimport {CC_EVENTS, SubscribeResponse, WelcomeResponse} from '../../config/types';\nimport LoggerProxy from '../../../logger-proxy';\nimport workerScript from './keepalive.worker';\nimport {KEEPALIVE_WORKER_INTERVAL, CLOSE_SOCKET_TIMEOUT, METHODS} from '../constants';\nimport {WEB_SOCKET_MANAGER_FILE} from '../../../constants';\n\n/**\n * WebSocketManager handles the WebSocket connection for Contact Center operations.\n * It manages the connection lifecycle, including registration, reconnection, and message handling.\n * It also utilizes a Web Worker to manage keepalive messages and socket closure.\n * @ignore\n */\nexport class WebSocketManager extends EventEmitter {\n private websocket: WebSocket;\n shouldReconnect: boolean;\n isSocketClosed: boolean;\n private isWelcomeReceived: boolean;\n private url: string | null = null;\n private forceCloseWebSocketOnTimeout: boolean;\n private isConnectionLost: boolean;\n private webex: WebexSDK;\n private welcomePromiseResolve:\n | ((value: WelcomeResponse | PromiseLike<WelcomeResponse>) => void)\n | null = null;\n\n private keepaliveWorker: Worker;\n\n constructor(options: {webex: WebexSDK}) {\n super();\n const {webex} = options;\n this.webex = webex;\n this.shouldReconnect = true;\n this.websocket = {} as WebSocket;\n this.isSocketClosed = false;\n this.isWelcomeReceived = false;\n this.forceCloseWebSocketOnTimeout = false;\n this.isConnectionLost = false;\n\n const workerScriptBlob = new Blob([workerScript], {type: 'application/javascript'});\n this.keepaliveWorker = new Worker(URL.createObjectURL(workerScriptBlob));\n }\n\n async initWebSocket(options: {\n body: SubscribeRequest;\n resource: string;\n }): Promise<WelcomeResponse> {\n const {body, resource} = options;\n await this.register(body, resource);\n\n return new Promise((resolve, reject) => {\n this.welcomePromiseResolve = resolve;\n this.connect().catch((error) => {\n LoggerProxy.error(`[WebSocketStatus] | Error in connecting Websocket ${error}`, {\n module: WEB_SOCKET_MANAGER_FILE,\n method: METHODS.INIT_WEB_SOCKET,\n });\n reject(error);\n });\n });\n }\n\n close(shouldReconnect: boolean, reason = 'Unknown') {\n if (!this.isSocketClosed && this.shouldReconnect) {\n this.shouldReconnect = shouldReconnect;\n this.websocket.close();\n this.keepaliveWorker.postMessage({type: 'terminate'});\n LoggerProxy.log(\n `[WebSocketStatus] | event=webSocketClose | WebSocket connection closed manually REASON: ${reason}`,\n {module: WEB_SOCKET_MANAGER_FILE, method: METHODS.CLOSE}\n );\n }\n }\n\n handleConnectionLost(event: ConnectionLostDetails) {\n this.isConnectionLost = event.isConnectionLost;\n }\n\n private async register(connectionConfig: SubscribeRequest, resource: string) {\n try {\n const subscribeResponse: SubscribeResponse = await this.webex.request({\n service: WCC_API_GATEWAY,\n resource,\n method: HTTP_METHODS.POST,\n body: connectionConfig,\n });\n this.url = subscribeResponse.body.webSocketUrl;\n } catch (e) {\n LoggerProxy.error(\n `Register API Failed, Request to RoutingNotifs websocket registration API failed ${e}`,\n {module: WEB_SOCKET_MANAGER_FILE, method: METHODS.REGISTER}\n );\n }\n }\n\n private async connect() {\n if (!this.url) {\n return undefined;\n }\n LoggerProxy.log(\n `[WebSocketStatus] | event=webSocketConnecting | Connecting to WebSocket: ${this.url}`,\n {module: WEB_SOCKET_MANAGER_FILE, method: METHODS.CONNECT}\n );\n this.websocket = new WebSocket(this.url);\n\n return new Promise((resolve, reject) => {\n this.websocket.onopen = () => {\n this.isSocketClosed = false;\n this.shouldReconnect = true;\n\n this.websocket.send(JSON.stringify({keepalive: 'true'}));\n this.keepaliveWorker.onmessage = (keepAliveEvent: {data: any}) => {\n if (keepAliveEvent?.data?.type === 'keepalive') {\n this.websocket.send(JSON.stringify({keepalive: 'true'}));\n }\n\n if (keepAliveEvent?.data?.type === 'closeSocket' && this.isConnectionLost) {\n this.forceCloseWebSocketOnTimeout = true;\n this.close(true, 'WebSocket did not auto close within 16 secs');\n LoggerProxy.error(\n '[webSocketTimeout] | event=webSocketTimeout | WebSocket connection closed forcefully',\n {module: WEB_SOCKET_MANAGER_FILE, method: METHODS.CONNECT}\n );\n }\n };\n\n this.keepaliveWorker.postMessage({\n type: 'start',\n intervalDuration: KEEPALIVE_WORKER_INTERVAL, // Keepalive interval\n isSocketClosed: this.isSocketClosed,\n closeSocketTimeout: CLOSE_SOCKET_TIMEOUT, // Close socket timeout\n });\n };\n\n this.websocket.onerror = (event: any) => {\n LoggerProxy.error(\n `[WebSocketStatus] | event=socketConnectionFailed | WebSocket connection failed ${event}`,\n {module: WEB_SOCKET_MANAGER_FILE, method: METHODS.CONNECT}\n );\n reject();\n };\n\n this.websocket.onclose = async (event: any) => {\n this.webSocketOnCloseHandler(event);\n };\n\n this.websocket.onmessage = (e: MessageEvent) => {\n this.emit('message', e.data);\n const eventData = JSON.parse(e.data);\n\n if (eventData.type === CC_EVENTS.WELCOME) {\n this.isWelcomeReceived = true;\n if (this.welcomePromiseResolve) {\n this.welcomePromiseResolve(eventData.data as WelcomeResponse);\n this.welcomePromiseResolve = null;\n }\n }\n\n if (eventData.type === 'AGENT_MULTI_LOGIN') {\n this.close(false, 'multiLogin');\n LoggerProxy.error(\n '[WebSocketStatus] | event=agentMultiLogin | WebSocket connection closed by agent multiLogin',\n {module: WEB_SOCKET_MANAGER_FILE, method: METHODS.CONNECT}\n );\n }\n };\n });\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n private async webSocketOnCloseHandler(event: any) {\n this.isSocketClosed = true;\n this.keepaliveWorker.postMessage({type: 'terminate'});\n if (this.shouldReconnect) {\n this.emit('socketClose');\n let issueReason;\n if (this.forceCloseWebSocketOnTimeout) {\n issueReason = 'WebSocket auto close timed out. Forcefully closed websocket.';\n } else {\n const onlineStatus = navigator.onLine;\n issueReason = !onlineStatus\n ? 'network issue'\n : 'missing keepalive from either desktop or notif service';\n }\n LoggerProxy.error(\n `[WebSocketStatus] | event=webSocketClose | WebSocket connection closed REASON: ${issueReason}`,\n {module: WEB_SOCKET_MANAGER_FILE, method: METHODS.WEB_SOCKET_ON_CLOSE_HANDLER}\n );\n this.forceCloseWebSocketOnTimeout = false;\n }\n }\n}\n\nexport default WebSocketManager;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import {SubscribeRequest} from '../../../types';\nimport
|
|
1
|
+
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import {SubscribeRequest} from '../../../types';\nimport type WebSocketManager from './WebSocketManager';\n\n/**\n * Options for initializing a connection service.\n * @typedef ConnectionServiceOptions\n * @property {WebSocketManager} webSocketManager - The WebSocket manager instance.\n * @property {SubscribeRequest} subscribeRequest - The subscribe request payload.\n * @ignore\n */\nexport type ConnectionServiceOptions = {\n webSocketManager: WebSocketManager;\n subscribeRequest: SubscribeRequest;\n};\n\n/**\n * Details about the state of a lost connection and recovery attempts.\n * @typedef ConnectionLostDetails\n * @property {boolean} isConnectionLost - Indicates if the connection is currently lost.\n * @property {boolean} isRestoreFailed - Indicates if restoring the connection has failed.\n * @property {boolean} isSocketReconnected - Indicates if the socket has been reconnected.\n * @property {boolean} isKeepAlive - Indicates if the keep-alive mechanism is active.\n * @ignore\n */\nexport type ConnectionLostDetails = {\n isConnectionLost: boolean;\n isRestoreFailed: boolean;\n isSocketReconnected: boolean;\n isKeepAlive: boolean;\n};\n\n/**\n * Properties for connection configuration.\n * @typedef ConnectionProp\n * @property {number} lostConnectionRecoveryTimeout - Timeout in milliseconds for lost connection recovery.\n * @ignore\n */\nexport type ConnectionProp = {\n lostConnectionRecoveryTimeout: number;\n};\n"],"mappings":"","ignoreList":[]}
|
package/dist/services/index.js
CHANGED
|
@@ -30,7 +30,7 @@ class Services {
|
|
|
30
30
|
|
|
31
31
|
/** WebSocket manager for handling real-time communications */
|
|
32
32
|
|
|
33
|
-
/** RTD WebSocket manager for handling
|
|
33
|
+
/** RTD WebSocket manager for handling real-time transcription */
|
|
34
34
|
|
|
35
35
|
/** Connection service for managing websocket connections */
|
|
36
36
|
|
|
@@ -50,7 +50,6 @@ class Services {
|
|
|
50
50
|
this.webSocketManager = new _WebSocketManager.WebSocketManager({
|
|
51
51
|
webex
|
|
52
52
|
});
|
|
53
|
-
// TODO: Implement reconnection logic for this websocket in upcoming PR
|
|
54
53
|
this.rtdWebSocketManager = new _WebSocketManager.WebSocketManager({
|
|
55
54
|
webex
|
|
56
55
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_agent","_interopRequireDefault","require","_contact","_config","_aqmReqs","_WebSocketManager","_connectionService","_dialer","e","__esModule","default","Services","constructor","options","webex","connectionConfig","webSocketManager","WebSocketManager","rtdWebSocketManager","aqmReq","AqmReqs","config","AgentConfigService","agent","routingAgent","contact","routingContact","dialer","aqmDialer","connectionService","ConnectionService","subscribeRequest","getInstance","instance","exports"],"sources":["index.ts"],"sourcesContent":["import routingAgent from './agent';\nimport routingContact from './task/contact';\nimport AgentConfigService from './config';\nimport AqmReqs from './core/aqm-reqs';\nimport {WebSocketManager} from './core/websocket/WebSocketManager';\nimport {ConnectionService} from './core/websocket/connection-service';\nimport {WebexSDK, SubscribeRequest} from '../types';\nimport aqmDialer from './task/dialer';\n\n/**\n * Services class provides centralized access to all contact center plugin services\n * using a singleton pattern to ensure a single instance throughout the application.\n * @private\n * @ignore\n * @class\n */\nexport default class Services {\n /** Agent services for managing agent state and capabilities */\n public readonly agent: ReturnType<typeof routingAgent>;\n /** Configuration services for agent settings */\n public readonly config: AgentConfigService;\n /** Contact services for managing customer interactions */\n public readonly contact: ReturnType<typeof routingContact>;\n /** Dialer services for outbound calling features */\n public readonly dialer: ReturnType<typeof aqmDialer>;\n /** WebSocket manager for handling real-time communications */\n public readonly webSocketManager: WebSocketManager;\n /** RTD WebSocket manager for handling
|
|
1
|
+
{"version":3,"names":["_agent","_interopRequireDefault","require","_contact","_config","_aqmReqs","_WebSocketManager","_connectionService","_dialer","e","__esModule","default","Services","constructor","options","webex","connectionConfig","webSocketManager","WebSocketManager","rtdWebSocketManager","aqmReq","AqmReqs","config","AgentConfigService","agent","routingAgent","contact","routingContact","dialer","aqmDialer","connectionService","ConnectionService","subscribeRequest","getInstance","instance","exports"],"sources":["index.ts"],"sourcesContent":["import routingAgent from './agent';\nimport routingContact from './task/contact';\nimport AgentConfigService from './config';\nimport AqmReqs from './core/aqm-reqs';\nimport {WebSocketManager} from './core/websocket/WebSocketManager';\nimport {ConnectionService} from './core/websocket/connection-service';\nimport {WebexSDK, SubscribeRequest} from '../types';\nimport aqmDialer from './task/dialer';\n\n/**\n * Services class provides centralized access to all contact center plugin services\n * using a singleton pattern to ensure a single instance throughout the application.\n * @private\n * @ignore\n * @class\n */\nexport default class Services {\n /** Agent services for managing agent state and capabilities */\n public readonly agent: ReturnType<typeof routingAgent>;\n /** Configuration services for agent settings */\n public readonly config: AgentConfigService;\n /** Contact services for managing customer interactions */\n public readonly contact: ReturnType<typeof routingContact>;\n /** Dialer services for outbound calling features */\n public readonly dialer: ReturnType<typeof aqmDialer>;\n /** WebSocket manager for handling real-time communications */\n public readonly webSocketManager: WebSocketManager;\n /** RTD WebSocket manager for handling real-time transcription */\n public readonly rtdWebSocketManager: WebSocketManager;\n /** Connection service for managing websocket connections */\n public readonly connectionService: ConnectionService;\n /** Singleton instance of the Services class */\n private static instance: Services;\n\n /**\n * Creates a new Services instance\n * @param options - Configuration options\n * @param options.webex - WebexSDK instance\n * @param options.connectionConfig - Subscription configuration for websocket connection\n */\n constructor(options: {webex: WebexSDK; connectionConfig: SubscribeRequest}) {\n const {webex, connectionConfig} = options;\n this.webSocketManager = new WebSocketManager({webex});\n this.rtdWebSocketManager = new WebSocketManager({webex});\n const aqmReq = new AqmReqs(this.webSocketManager);\n this.config = new AgentConfigService();\n this.agent = routingAgent(aqmReq);\n this.contact = routingContact(aqmReq);\n this.dialer = aqmDialer(aqmReq);\n this.connectionService = new ConnectionService({\n webSocketManager: this.webSocketManager,\n subscribeRequest: connectionConfig,\n });\n }\n\n /**\n * Gets singleton instance of Services class\n * Creates a new instance if one doesn't exist\n * @param options - Configuration options\n * @param options.webex - WebexSDK instance\n * @param options.connectionConfig - Subscription configuration for websocket connection\n * @returns The singleton Services instance\n */\n public static getInstance(options: {\n webex: WebexSDK;\n connectionConfig: SubscribeRequest;\n }): Services {\n if (!this.instance) {\n this.instance = new Services(options);\n }\n\n return this.instance;\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,QAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,OAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,QAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,iBAAA,GAAAJ,OAAA;AACA,IAAAK,kBAAA,GAAAL,OAAA;AAEA,IAAAM,OAAA,GAAAP,sBAAA,CAAAC,OAAA;AAAsC,SAAAD,uBAAAQ,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAEtC;AACA;AACA;AACA;AACA;AACA;AACA;AACe,MAAMG,QAAQ,CAAC;EAC5B;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAEA;;EAGA;AACF;AACA;AACA;AACA;AACA;EACEC,WAAWA,CAACC,OAA8D,EAAE;IAC1E,MAAM;MAACC,KAAK;MAAEC;IAAgB,CAAC,GAAGF,OAAO;IACzC,IAAI,CAACG,gBAAgB,GAAG,IAAIC,kCAAgB,CAAC;MAACH;IAAK,CAAC,CAAC;IACrD,IAAI,CAACI,mBAAmB,GAAG,IAAID,kCAAgB,CAAC;MAACH;IAAK,CAAC,CAAC;IACxD,MAAMK,MAAM,GAAG,IAAIC,gBAAO,CAAC,IAAI,CAACJ,gBAAgB,CAAC;IACjD,IAAI,CAACK,MAAM,GAAG,IAAIC,eAAkB,CAAC,CAAC;IACtC,IAAI,CAACC,KAAK,GAAG,IAAAC,cAAY,EAACL,MAAM,CAAC;IACjC,IAAI,CAACM,OAAO,GAAG,IAAAC,gBAAc,EAACP,MAAM,CAAC;IACrC,IAAI,CAACQ,MAAM,GAAG,IAAAC,eAAS,EAACT,MAAM,CAAC;IAC/B,IAAI,CAACU,iBAAiB,GAAG,IAAIC,oCAAiB,CAAC;MAC7Cd,gBAAgB,EAAE,IAAI,CAACA,gBAAgB;MACvCe,gBAAgB,EAAEhB;IACpB,CAAC,CAAC;EACJ;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAciB,WAAWA,CAACnB,OAGzB,EAAY;IACX,IAAI,CAAC,IAAI,CAACoB,QAAQ,EAAE;MAClB,IAAI,CAACA,QAAQ,GAAG,IAAItB,QAAQ,CAACE,OAAO,CAAC;IACvC;IAEA,OAAO,IAAI,CAACoB,QAAQ;EACtB;AACF;AAACC,OAAA,CAAAxB,OAAA,GAAAC,QAAA","ignoreList":[]}
|