@webex/contact-center 3.11.0 → 3.12.0-auth-prejoin-fetch.1
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/.sdd/manifest.json +883 -0
- package/AGENTS.md +94 -0
- package/ai-docs/ARCHITECTURE.md +168 -0
- package/ai-docs/CONTRACTS.md +50 -0
- package/ai-docs/GETTING_STARTED.md +168 -0
- package/ai-docs/GLOSSARY.md +43 -0
- package/ai-docs/README.md +138 -0
- package/ai-docs/REVIEW_CHECKLIST.md +41 -0
- package/ai-docs/RULES.md +444 -0
- package/ai-docs/SECURITY.md +52 -0
- package/ai-docs/SERVICE_STATE.md +48 -0
- package/ai-docs/SPEC_INDEX.md +65 -0
- package/ai-docs/adr/0001-spec-source-policy.md +55 -0
- package/ai-docs/adr/README.md +8 -0
- package/ai-docs/adr/_adr-template.md +31 -0
- package/ai-docs/contact-center-spec.md +359 -0
- package/ai-docs/features/consult-transfer-list-policy/spec/feature-spec.md +362 -0
- package/ai-docs/features/generated-spec-conformance-fidelity-remediation/spec/feature-spec.md +117 -0
- package/ai-docs/features/residual-warning-coverage-completion/spec/feature-spec.md +203 -0
- package/ai-docs/features/validator-code-fidelity-drift-fix/spec/feature-spec.md +315 -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 +818 -59
- package/dist/cc.js.map +1 -1
- package/dist/config.js +13 -0
- package/dist/config.js.map +1 -1
- package/dist/constants.js +31 -3
- package/dist/constants.js.map +1 -1
- package/dist/index.js +27 -5
- package/dist/index.js.map +1 -1
- package/dist/metrics/behavioral-events.js +127 -0
- package/dist/metrics/behavioral-events.js.map +1 -1
- package/dist/metrics/constants.js +34 -3
- package/dist/metrics/constants.js.map +1 -1
- package/dist/services/AddressBook.js +18 -15
- package/dist/services/AddressBook.js.map +1 -1
- package/dist/services/AnswerCallOnWebexService.js +174 -0
- package/dist/services/AnswerCallOnWebexService.js.map +1 -0
- package/dist/services/ApiAiAssistant.js +318 -0
- package/dist/services/ApiAiAssistant.js.map +1 -0
- package/dist/services/EntryPoint.js +46 -68
- package/dist/services/EntryPoint.js.map +1 -1
- package/dist/services/Queue.js +27 -22
- package/dist/services/Queue.js.map +1 -1
- package/dist/services/UserPreference.js +427 -0
- package/dist/services/UserPreference.js.map +1 -0
- package/dist/services/WebexCrossClientService.js +171 -0
- package/dist/services/WebexCrossClientService.js.map +1 -0
- package/dist/services/WxAppTelephonyMercurySync.js +93 -0
- package/dist/services/WxAppTelephonyMercurySync.js.map +1 -0
- package/dist/services/agent/types.js.map +1 -1
- package/dist/services/config/Util.js +11 -4
- package/dist/services/config/Util.js.map +1 -1
- package/dist/services/config/constants.js +45 -8
- package/dist/services/config/constants.js.map +1 -1
- package/dist/services/config/index.js +41 -2
- package/dist/services/config/index.js.map +1 -1
- package/dist/services/config/types.js +70 -8
- package/dist/services/config/types.js.map +1 -1
- package/dist/services/constants.js +27 -1
- package/dist/services/constants.js.map +1 -1
- package/dist/services/core/Err.js.map +1 -1
- package/dist/services/core/Utils.js +122 -25
- package/dist/services/core/Utils.js.map +1 -1
- package/dist/services/core/WebexRequest.js +6 -2
- package/dist/services/core/WebexRequest.js.map +1 -1
- package/dist/services/core/aqm-reqs.js +119 -30
- package/dist/services/core/aqm-reqs.js.map +1 -1
- package/dist/services/core/types.js.map +1 -1
- package/dist/services/core/websocket/WebSocketManager.js +22 -6
- package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
- package/dist/services/core/websocket/connection-service.js +3 -1
- package/dist/services/core/websocket/connection-service.js.map +1 -1
- package/dist/services/core/websocket/types.js.map +1 -1
- package/dist/services/index.js +6 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/task/Task.js +754 -0
- package/dist/services/task/Task.js.map +1 -0
- package/dist/services/task/TaskFactory.js +49 -0
- package/dist/services/task/TaskFactory.js.map +1 -0
- package/dist/services/task/TaskManager.js +1073 -447
- package/dist/services/task/TaskManager.js.map +1 -1
- package/dist/services/task/TaskUtils.js +220 -23
- package/dist/services/task/TaskUtils.js.map +1 -1
- package/dist/services/task/WebexCallingUtils.js +70 -0
- package/dist/services/task/WebexCallingUtils.js.map +1 -0
- package/dist/services/task/constants.js +26 -2
- package/dist/services/task/constants.js.map +1 -1
- package/dist/services/task/contact.js +29 -0
- package/dist/services/task/contact.js.map +1 -1
- package/dist/services/task/dialer.js +129 -0
- package/dist/services/task/dialer.js.map +1 -1
- package/dist/services/task/digital/Digital.js +78 -0
- package/dist/services/task/digital/Digital.js.map +1 -0
- package/dist/services/task/state-machine/TaskStateMachine.js +971 -0
- package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
- package/dist/services/task/state-machine/actions.js +572 -0
- package/dist/services/task/state-machine/actions.js.map +1 -0
- package/dist/services/task/state-machine/constants.js +161 -0
- package/dist/services/task/state-machine/constants.js.map +1 -0
- package/dist/services/task/state-machine/guards.js +409 -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 +703 -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 +243 -5
- package/dist/services/task/types.js.map +1 -1
- package/dist/services/task/voice/Voice.js +1380 -0
- package/dist/services/task/voice/Voice.js.map +1 -0
- package/dist/services/task/voice/WebRTC.js +152 -0
- package/dist/services/task/voice/WebRTC.js.map +1 -0
- package/dist/services/task/voice/wxAppVoiceMethods.js +201 -0
- package/dist/services/task/voice/wxAppVoiceMethods.js.map +1 -0
- package/dist/services/wxAppTelephonyUtils.js +19 -0
- package/dist/services/wxAppTelephonyUtils.js.map +1 -0
- package/dist/types/cc.d.ts +967 -0
- package/dist/types/config.d.ts +79 -0
- package/dist/types/constants.d.ts +74 -0
- package/dist/types/index.d.ts +201 -0
- package/dist/types/logger-proxy.d.ts +71 -0
- package/dist/types/metrics/MetricsManager.d.ts +223 -0
- package/dist/types/metrics/behavioral-events.d.ts +29 -0
- package/dist/types/metrics/constants.d.ts +183 -0
- package/dist/types/services/AddressBook.d.ts +75 -0
- package/dist/types/services/AnswerCallOnWebexService.d.ts +37 -0
- package/dist/types/services/ApiAiAssistant.d.ts +49 -0
- package/dist/types/services/EntryPoint.d.ts +69 -0
- package/dist/types/services/Queue.d.ts +78 -0
- package/dist/types/services/UserPreference.d.ts +118 -0
- package/dist/types/services/WebCallingService.d.ts +1 -0
- package/dist/types/services/WebexCrossClientService.d.ts +28 -0
- package/dist/types/services/WxAppTelephonyMercurySync.d.ts +28 -0
- package/dist/types/services/agent/index.d.ts +46 -0
- package/dist/types/services/agent/types.d.ts +413 -0
- package/dist/types/services/config/Util.d.ts +20 -0
- package/dist/types/services/config/constants.d.ts +273 -0
- package/dist/types/services/config/index.d.ts +177 -0
- package/dist/types/services/config/types.d.ts +1381 -0
- package/dist/types/services/constants.d.ts +110 -0
- package/dist/types/services/core/Err.d.ts +127 -0
- package/dist/types/services/core/GlobalTypes.d.ts +58 -0
- package/dist/types/services/core/Utils.d.ts +121 -0
- package/dist/types/services/core/WebexRequest.d.ts +23 -0
- package/dist/types/services/core/aqm-reqs.d.ts +65 -0
- package/dist/types/services/core/constants.d.ts +99 -0
- package/dist/types/services/core/types.d.ts +49 -0
- package/dist/types/services/core/websocket/WebSocketManager.d.ts +36 -0
- package/dist/types/services/core/websocket/connection-service.d.ts +27 -0
- package/dist/types/services/core/websocket/keepalive.worker.d.ts +2 -0
- package/dist/types/services/core/websocket/types.d.ts +37 -0
- package/dist/types/services/index.d.ts +54 -0
- package/dist/types/services/task/AutoWrapup.d.ts +40 -0
- package/dist/types/services/task/Task.d.ts +175 -0
- package/dist/types/services/task/TaskFactory.d.ts +13 -0
- package/dist/types/services/task/TaskManager.d.ts +1 -0
- package/dist/types/services/task/TaskUtils.d.ts +138 -0
- package/dist/types/services/task/WebexCallingUtils.d.ts +11 -0
- package/dist/types/services/task/constants.d.ts +94 -0
- package/dist/types/services/task/contact.d.ts +73 -0
- package/dist/types/services/task/dialer.d.ts +73 -0
- package/dist/types/services/task/digital/Digital.d.ts +22 -0
- package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +1398 -0
- package/dist/types/services/task/state-machine/actions.d.ts +10 -0
- package/dist/types/services/task/state-machine/constants.d.ts +107 -0
- package/dist/types/services/task/state-machine/guards.d.ts +103 -0
- package/dist/types/services/task/state-machine/index.d.ts +13 -0
- package/dist/types/services/task/state-machine/types.d.ts +277 -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 +1933 -0
- package/dist/types/services/task/voice/Voice.d.ts +223 -0
- package/dist/types/services/task/voice/WebRTC.d.ts +53 -0
- package/dist/types/services/task/voice/wxAppVoiceMethods.d.ts +52 -0
- package/dist/types/services/wxAppTelephonyUtils.d.ts +5 -0
- package/dist/types/types.d.ts +784 -0
- package/dist/types/utils/PageCache.d.ts +190 -0
- package/dist/types/webex-config.d.ts +53 -0
- package/dist/types/webex.d.ts +8 -0
- package/dist/types.js +137 -3
- package/dist/types.js.map +1 -1
- package/dist/utils/PageCache.js +19 -5
- package/dist/utils/PageCache.js.map +1 -1
- package/dist/webex.js +14 -2
- package/dist/webex.js.map +1 -1
- package/package.json +16 -12
- package/src/cc.ts +983 -60
- package/src/config.ts +13 -0
- package/src/constants.ts +29 -1
- package/src/index.ts +26 -5
- package/src/metrics/ai-docs/AGENTS.md +350 -0
- package/src/metrics/ai-docs/ARCHITECTURE.md +338 -0
- package/src/metrics/ai-docs/metrics-spec.md +860 -0
- package/src/metrics/behavioral-events.ts +134 -0
- package/src/metrics/constants.ts +39 -3
- package/src/services/AddressBook.ts +17 -6
- package/src/services/AnswerCallOnWebexService.ts +206 -0
- package/src/services/ApiAiAssistant.ts +412 -0
- package/src/services/EntryPoint.ts +59 -60
- package/src/services/Queue.ts +29 -12
- package/src/services/UserPreference.ts +509 -0
- package/src/services/WebexCrossClientService.ts +212 -0
- package/src/services/WxAppTelephonyMercurySync.ts +115 -0
- package/src/services/agent/ai-docs/AGENTS.md +240 -0
- package/src/services/agent/ai-docs/ARCHITECTURE.md +304 -0
- package/src/services/agent/ai-docs/agent-spec.md +504 -0
- package/src/services/agent/types.ts +1 -1
- package/src/services/ai-docs/AGENTS.md +386 -0
- package/src/services/ai-docs/services-spec.md +497 -0
- package/src/services/config/Util.ts +13 -2
- package/src/services/config/ai-docs/AGENTS.md +255 -0
- package/src/services/config/ai-docs/ARCHITECTURE.md +426 -0
- package/src/services/config/ai-docs/config-spec.md +675 -0
- package/src/services/config/constants.ts +47 -7
- package/src/services/config/index.ts +45 -1
- package/src/services/config/types.ts +253 -11
- package/src/services/constants.ts +29 -0
- package/src/services/core/Err.ts +4 -0
- package/src/services/core/Utils.ts +143 -30
- package/src/services/core/WebexRequest.ts +3 -1
- package/src/services/core/ai-docs/AGENTS.md +381 -0
- package/src/services/core/ai-docs/ARCHITECTURE.md +698 -0
- package/src/services/core/ai-docs/core-spec.md +787 -0
- package/src/services/core/aqm-reqs.ts +125 -32
- package/src/services/core/types.ts +2 -0
- package/src/services/core/websocket/WebSocketManager.ts +23 -6
- package/src/services/core/websocket/connection-service.ts +5 -1
- package/src/services/core/websocket/types.ts +1 -1
- package/src/services/index.ts +4 -0
- package/src/services/task/Task.ts +908 -0
- package/src/services/task/TaskFactory.ts +60 -0
- package/src/services/task/TaskManager.ts +1291 -513
- package/src/services/task/TaskUtils.ts +314 -24
- package/src/services/task/WebexCallingUtils.ts +136 -0
- package/src/services/task/ai-docs/AGENTS.md +457 -0
- package/src/services/task/ai-docs/ARCHITECTURE.md +595 -0
- package/src/services/task/ai-docs/task-spec.md +1469 -0
- package/src/services/task/constants.ts +26 -0
- package/src/services/task/contact.ts +30 -0
- package/src/services/task/dialer.ts +136 -1
- package/src/services/task/digital/Digital.ts +97 -0
- package/src/services/task/state-machine/TaskStateMachine.ts +1313 -0
- package/src/services/task/state-machine/actions.ts +741 -0
- package/src/services/task/state-machine/ai-docs/AGENTS.md +462 -0
- package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1146 -0
- package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +2209 -0
- package/src/services/task/state-machine/constants.ts +172 -0
- package/src/services/task/state-machine/guards.ts +498 -0
- package/src/services/task/state-machine/index.ts +28 -0
- package/src/services/task/state-machine/types.ts +258 -0
- package/src/services/task/state-machine/uiControlsComputer.ts +1135 -0
- package/src/services/task/taskDataNormalizer.ts +137 -0
- package/src/services/task/types.ts +843 -70
- package/src/services/task/voice/Voice.ts +1720 -0
- package/src/services/task/voice/WebRTC.ts +191 -0
- package/src/services/task/voice/wxAppVoiceMethods.ts +307 -0
- package/src/services/wxAppTelephonyUtils.ts +14 -0
- package/src/types.ts +238 -11
- package/src/utils/AGENTS.md +289 -0
- package/src/utils/PageCache.ts +38 -5
- package/src/utils/ai-docs/utils-spec.md +391 -0
- package/src/webex.js +2 -0
- package/test/unit/spec/cc.ts +1856 -122
- package/test/unit/spec/logger-proxy.ts +70 -0
- package/test/unit/spec/metrics/behavioral-events.ts +18 -0
- package/test/unit/spec/services/AddressBook.ts +37 -6
- package/test/unit/spec/services/AnswerCallOnWebexService.ts +223 -0
- package/test/unit/spec/services/ApiAiAssistant.ts +273 -0
- package/test/unit/spec/services/EntryPoint.ts +87 -40
- package/test/unit/spec/services/Queue.ts +123 -12
- package/test/unit/spec/services/UserPreference.ts +401 -0
- package/test/unit/spec/services/WebCallingService.ts +7 -1
- package/test/unit/spec/services/WebexCrossClientService.ts +261 -0
- package/test/unit/spec/services/WxAppTelephonyMercurySync.ts +113 -0
- package/test/unit/spec/services/config/Util.ts +85 -0
- package/test/unit/spec/services/config/index.ts +85 -29
- package/test/unit/spec/services/core/Utils.ts +481 -2
- package/test/unit/spec/services/core/WebexRequest.ts +3 -1
- package/test/unit/spec/services/core/aqm-reqs.ts +113 -1
- package/test/unit/spec/services/core/websocket/WebSocketManager.ts +137 -41
- package/test/unit/spec/services/core/websocket/connection-service.ts +3 -1
- package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
- package/test/unit/spec/services/task/Task.ts +677 -0
- package/test/unit/spec/services/task/TaskFactory.ts +99 -0
- package/test/unit/spec/services/task/TaskManager.ts +2209 -918
- package/test/unit/spec/services/task/TaskUtils.ts +235 -0
- package/test/unit/spec/services/task/WebexCallingUtils.ts +153 -0
- package/test/unit/spec/services/task/contact.ts +33 -0
- package/test/unit/spec/services/task/dialer.ts +372 -96
- package/test/unit/spec/services/task/digital/Digital.ts +105 -0
- package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +3433 -0
- package/test/unit/spec/services/task/state-machine/guards.ts +839 -0
- package/test/unit/spec/services/task/state-machine/types.ts +18 -0
- package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +3101 -0
- package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
- package/test/unit/spec/services/task/voice/Voice.ts +1523 -0
- package/test/unit/spec/services/task/voice/WebRTC.ts +235 -0
- package/test/unit/spec/services/task/voice/wxAppVoiceMethods.ts +459 -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/src/services/task/index.ts +0 -1801
- package/test/unit/spec/services/task/index.ts +0 -2184
|
@@ -20,18 +20,40 @@ export default class AqmReqs {
|
|
|
20
20
|
this.webSocketManager.on('message', this.onMessage.bind(this));
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
+
/**
|
|
24
|
+
* Creates a request function for an API call with parameters
|
|
25
|
+
* @param c - The configuration for the request
|
|
26
|
+
* @returns A function that makes the API request
|
|
27
|
+
*/
|
|
23
28
|
req<TRes, TErr, TReq>(c: Conf<TRes, TErr, TReq>): Res<TRes, TReq> {
|
|
24
29
|
return (p: TReq, cbRes?: CbRes<TRes>) => this.makeAPIRequest(c(p), cbRes);
|
|
25
30
|
}
|
|
26
31
|
|
|
32
|
+
/**
|
|
33
|
+
* Creates a request function for an API call with no parameters
|
|
34
|
+
* @param c - The configuration for the request
|
|
35
|
+
* @returns A function that makes the API request
|
|
36
|
+
*/
|
|
27
37
|
reqEmpty<TRes, TErr>(c: ConfEmpty<TRes, TErr>): ResEmpty<TRes> {
|
|
28
38
|
return (cbRes?: CbRes<TRes>) => this.makeAPIRequest(c(), cbRes);
|
|
29
39
|
}
|
|
30
40
|
|
|
41
|
+
/**
|
|
42
|
+
* Makes an API request
|
|
43
|
+
* @param c - The request configuration
|
|
44
|
+
* @param cbRes - The callback for the response
|
|
45
|
+
* @returns A promise that resolves with the response or rejects with an error
|
|
46
|
+
*/
|
|
31
47
|
private async makeAPIRequest<TRes, TErr>(c: Req<TRes, TErr>, cbRes?: CbRes<TRes>): Promise<TRes> {
|
|
32
48
|
return this.createPromise(c, cbRes);
|
|
33
49
|
}
|
|
34
50
|
|
|
51
|
+
/**
|
|
52
|
+
* Creates a promise for an API request
|
|
53
|
+
* @param c - The request configuration
|
|
54
|
+
* @param cbRes - The callback for the response
|
|
55
|
+
* @returns A promise that resolves with the response or rejects with an error
|
|
56
|
+
*/
|
|
35
57
|
private createPromise<TRes, TErr>(c: Req<TRes, TErr>, cbRes?: CbRes<TRes>) {
|
|
36
58
|
return new Promise<TRes>((resolve, reject) => {
|
|
37
59
|
const keySuccess = this.bindPrint(c.notifSuccess.bind);
|
|
@@ -95,16 +117,24 @@ export default class AqmReqs {
|
|
|
95
117
|
clear();
|
|
96
118
|
const notifFail = c.notifFail!;
|
|
97
119
|
if ('errId' in notifFail) {
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
120
|
+
const error = new Err.Details(notifFail.errId, msg as any);
|
|
121
|
+
|
|
122
|
+
if (c.redactSensitiveLogs) {
|
|
123
|
+
LoggerProxy.log('Routing request failed (sensitive details redacted)', {
|
|
124
|
+
module: AQM_REQS_FILE,
|
|
125
|
+
method: METHODS.CREATE_PROMISE,
|
|
126
|
+
});
|
|
127
|
+
} else {
|
|
128
|
+
LoggerProxy.log(`Routing request failed: ${JSON.stringify(msg)}`, {
|
|
129
|
+
module: AQM_REQS_FILE,
|
|
130
|
+
method: METHODS.CREATE_PROMISE,
|
|
131
|
+
});
|
|
132
|
+
LoggerProxy.log(`Routing request failed: ${error}`, {
|
|
133
|
+
module: AQM_REQS_FILE,
|
|
134
|
+
method: METHODS.CREATE_PROMISE,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
reject(error);
|
|
108
138
|
} else {
|
|
109
139
|
reject(notifFail.err(msg as any));
|
|
110
140
|
}
|
|
@@ -154,10 +184,20 @@ export default class AqmReqs {
|
|
|
154
184
|
if (response?.headers) {
|
|
155
185
|
response.headers.Authorization = '*';
|
|
156
186
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
187
|
+
if (c.redactSensitiveLogs) {
|
|
188
|
+
LoggerProxy.error('Routing request timeout (sensitive details redacted)', {
|
|
189
|
+
module: AQM_REQS_FILE,
|
|
190
|
+
method: METHODS.CREATE_PROMISE,
|
|
191
|
+
});
|
|
192
|
+
} else {
|
|
193
|
+
LoggerProxy.error(
|
|
194
|
+
`Routing request timeout${keySuccess}${JSON.stringify(response)}${c.url}`,
|
|
195
|
+
{
|
|
196
|
+
module: AQM_REQS_FILE,
|
|
197
|
+
method: METHODS.CREATE_PROMISE,
|
|
198
|
+
}
|
|
199
|
+
);
|
|
200
|
+
}
|
|
161
201
|
reject(
|
|
162
202
|
new Err.Details('Service.aqm.reqs.Timeout', {
|
|
163
203
|
key: keySuccess,
|
|
@@ -171,39 +211,60 @@ export default class AqmReqs {
|
|
|
171
211
|
});
|
|
172
212
|
}
|
|
173
213
|
|
|
174
|
-
|
|
214
|
+
/**
|
|
215
|
+
* Converts a bind object to a string representation
|
|
216
|
+
* @param bind - The bind object to convert
|
|
217
|
+
* @returns A string representation of the bind object
|
|
218
|
+
*/
|
|
219
|
+
private bindPrint(bind: any): string {
|
|
175
220
|
let result = '';
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
221
|
+
for (const key of Object.keys(bind).filter((prop) => prop !== '__typeMap')) {
|
|
222
|
+
const value = bind[key];
|
|
223
|
+
|
|
224
|
+
if (Array.isArray(value)) {
|
|
225
|
+
result += `${key}=[${value.join(',')}],`;
|
|
226
|
+
} else if (typeof value === 'object' && value !== null) {
|
|
227
|
+
result += `${key}=(${this.bindPrint(value)}),`;
|
|
182
228
|
} else {
|
|
183
|
-
result += `${
|
|
229
|
+
result += `${key}=${value},`;
|
|
184
230
|
}
|
|
185
231
|
}
|
|
186
232
|
|
|
187
233
|
return result ? result.slice(0, -1) : result;
|
|
188
234
|
}
|
|
189
235
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
236
|
+
/**
|
|
237
|
+
* Checks if a message matches a bind object
|
|
238
|
+
* @param bind - The bind object to check against
|
|
239
|
+
* @param msg - The message to check
|
|
240
|
+
* @returns True if the message matches the bind object, false otherwise
|
|
241
|
+
*/
|
|
242
|
+
private bindCheck(bind: any, msg: any): boolean {
|
|
243
|
+
// Handle type-dependent field matching if __typeMap is present
|
|
244
|
+
if (bind.__typeMap && typeof bind.__typeMap === 'object') {
|
|
245
|
+
if (!AqmReqs.typeMapCheck(bind.__typeMap, msg)) {
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
for (const key of Object.keys(bind).filter((prop) => prop !== '__typeMap')) {
|
|
251
|
+
const bindValue = bind[key];
|
|
252
|
+
const msgValue = msg[key];
|
|
253
|
+
|
|
254
|
+
if (Array.isArray(bindValue)) {
|
|
194
255
|
// Check if the message value matches any of the values in the array
|
|
195
|
-
if (!
|
|
256
|
+
if (!bindValue.includes(msgValue)) {
|
|
196
257
|
return false;
|
|
197
258
|
}
|
|
198
|
-
} else if (typeof
|
|
199
|
-
if (typeof
|
|
200
|
-
if (!this.bindCheck(
|
|
259
|
+
} else if (typeof bindValue === 'object' && bindValue !== null) {
|
|
260
|
+
if (typeof msgValue === 'object' && msgValue !== null) {
|
|
261
|
+
if (!this.bindCheck(bindValue, msgValue)) {
|
|
201
262
|
return false;
|
|
202
263
|
}
|
|
203
264
|
} else {
|
|
204
265
|
return false;
|
|
205
266
|
}
|
|
206
|
-
} else if (!
|
|
267
|
+
} else if (!msgValue || msgValue !== bindValue) {
|
|
207
268
|
return false;
|
|
208
269
|
}
|
|
209
270
|
}
|
|
@@ -211,7 +272,39 @@ export default class AqmReqs {
|
|
|
211
272
|
return true;
|
|
212
273
|
}
|
|
213
274
|
|
|
214
|
-
|
|
275
|
+
/**
|
|
276
|
+
* Checks type-dependent field conditions defined in __typeMap.
|
|
277
|
+
* @param typeMap - The type map to check against
|
|
278
|
+
* @param msg - The message to check
|
|
279
|
+
* @returns True if the message matches the type map, false otherwise
|
|
280
|
+
* The typeMap has the shape:
|
|
281
|
+
* { typeField: "type", conditions: { EventA: { field: value }, EventB: { field: value } } }
|
|
282
|
+
* It reads msg[typeField] to determine which condition set to apply,
|
|
283
|
+
* then verifies all fields in that condition match the message.
|
|
284
|
+
*/
|
|
285
|
+
private static typeMapCheck(typeMap: any, msg: any): boolean {
|
|
286
|
+
const typeField = typeMap.typeField || 'type';
|
|
287
|
+
const msgType = msg[typeField];
|
|
288
|
+
|
|
289
|
+
if (typeMap.conditions && typeMap.conditions[msgType]) {
|
|
290
|
+
const condition = typeMap.conditions[msgType];
|
|
291
|
+
for (const field of Object.keys(condition)) {
|
|
292
|
+
if (!msg[field] || msg[field] !== condition[field]) {
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
return true;
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Handles incoming messages from the WebSocket (must be a lambda fn)
|
|
305
|
+
* @param msg - The message to handle
|
|
306
|
+
* @returns
|
|
307
|
+
*/
|
|
215
308
|
private readonly onMessage = (msg: any) => {
|
|
216
309
|
const event = JSON.parse(msg);
|
|
217
310
|
if (event.type === 'Welcome') {
|
|
@@ -20,6 +20,8 @@ export type Req<TRes, TErr> = {
|
|
|
20
20
|
url: string;
|
|
21
21
|
host?: string;
|
|
22
22
|
method?: HTTP_METHODS;
|
|
23
|
+
/** Suppress request URLs and routing payloads from AQM logs for sensitive operations. */
|
|
24
|
+
redactSensitiveLogs?: boolean;
|
|
23
25
|
err?:
|
|
24
26
|
| ((errObj: WebexRequestPayload) => Err.Details<'Service.reqs.generic.failure'>)
|
|
25
27
|
| Err.IdsMessage
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import EventEmitter from 'events';
|
|
2
2
|
import {WebexSDK, SubscribeRequest, HTTP_METHODS} from '../../../types';
|
|
3
|
-
import {
|
|
3
|
+
import {WCC_API_GATEWAY} from '../../constants';
|
|
4
4
|
import {ConnectionLostDetails} from './types';
|
|
5
5
|
import {CC_EVENTS, SubscribeResponse, WelcomeResponse} from '../../config/types';
|
|
6
6
|
import LoggerProxy from '../../../logger-proxy';
|
|
@@ -44,10 +44,13 @@ export class WebSocketManager extends EventEmitter {
|
|
|
44
44
|
this.keepaliveWorker = new Worker(URL.createObjectURL(workerScriptBlob));
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
async initWebSocket(options: {
|
|
48
|
-
|
|
47
|
+
async initWebSocket(options: {
|
|
48
|
+
body: SubscribeRequest;
|
|
49
|
+
resource: string;
|
|
50
|
+
}): Promise<WelcomeResponse> {
|
|
51
|
+
const {body: connectionConfig, resource} = options;
|
|
49
52
|
try {
|
|
50
|
-
await this.register(connectionConfig);
|
|
53
|
+
await this.register(connectionConfig, resource);
|
|
51
54
|
} catch (error) {
|
|
52
55
|
LoggerProxy.error(`[WebSocketStatus] | Error in registering Websocket ${error}`, {
|
|
53
56
|
module: WEB_SOCKET_MANAGER_FILE,
|
|
@@ -84,13 +87,25 @@ export class WebSocketManager extends EventEmitter {
|
|
|
84
87
|
this.isConnectionLost = event.isConnectionLost;
|
|
85
88
|
}
|
|
86
89
|
|
|
87
|
-
private async register(connectionConfig: SubscribeRequest) {
|
|
90
|
+
private async register(connectionConfig: SubscribeRequest, resource: string) {
|
|
88
91
|
try {
|
|
92
|
+
// X-ORGANIZATION-ID header is only required for INT environments
|
|
93
|
+
const isIntEnv = this.webex.internal?.services?.isIntegrationEnvironment() || false;
|
|
94
|
+
const orgId = this.webex.credentials.getOrgId();
|
|
95
|
+
|
|
96
|
+
if (isIntEnv && orgId) {
|
|
97
|
+
LoggerProxy.log(`[WebSocketManager] Adding X-ORGANIZATION-ID header for INT environment`, {
|
|
98
|
+
module: WEB_SOCKET_MANAGER_FILE,
|
|
99
|
+
method: METHODS.REGISTER,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
|
|
89
103
|
const subscribeResponse: SubscribeResponse = await this.webex.request({
|
|
90
104
|
service: WCC_API_GATEWAY,
|
|
91
|
-
resource
|
|
105
|
+
resource,
|
|
92
106
|
method: HTTP_METHODS.POST,
|
|
93
107
|
body: connectionConfig,
|
|
108
|
+
headers: isIntEnv && orgId ? {'X-ORGANIZATION-ID': orgId} : undefined,
|
|
94
109
|
});
|
|
95
110
|
this.url = subscribeResponse.body.webSocketUrl;
|
|
96
111
|
} catch (e) {
|
|
@@ -199,3 +214,5 @@ export class WebSocketManager extends EventEmitter {
|
|
|
199
214
|
}
|
|
200
215
|
}
|
|
201
216
|
}
|
|
217
|
+
|
|
218
|
+
export default WebSocketManager;
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
} from '../constants';
|
|
11
11
|
import {CONNECTION_SERVICE_FILE} from '../../../constants';
|
|
12
12
|
import {SubscribeRequest} from '../../../types';
|
|
13
|
+
import {SUBSCRIBE_API} from '../../constants';
|
|
13
14
|
|
|
14
15
|
export class ConnectionService extends EventEmitter {
|
|
15
16
|
private connectionProp: ConnectionProp = {
|
|
@@ -124,7 +125,10 @@ export class ConnectionService extends EventEmitter {
|
|
|
124
125
|
});
|
|
125
126
|
const onlineStatus = navigator.onLine;
|
|
126
127
|
if (onlineStatus) {
|
|
127
|
-
await this.webSocketManager.initWebSocket({
|
|
128
|
+
await this.webSocketManager.initWebSocket({
|
|
129
|
+
body: this.subscribeRequest,
|
|
130
|
+
resource: SUBSCRIBE_API,
|
|
131
|
+
});
|
|
128
132
|
await this.clearTimerOnRestoreFailed();
|
|
129
133
|
this.isSocketReconnected = true;
|
|
130
134
|
} else {
|
package/src/services/index.ts
CHANGED
|
@@ -25,6 +25,8 @@ export default class Services {
|
|
|
25
25
|
public readonly dialer: ReturnType<typeof aqmDialer>;
|
|
26
26
|
/** WebSocket manager for handling real-time communications */
|
|
27
27
|
public readonly webSocketManager: WebSocketManager;
|
|
28
|
+
/** RTD WebSocket manager for handling real-time transcription */
|
|
29
|
+
public readonly rtdWebSocketManager: WebSocketManager;
|
|
28
30
|
/** Connection service for managing websocket connections */
|
|
29
31
|
public readonly connectionService: ConnectionService;
|
|
30
32
|
/** Singleton instance of the Services class */
|
|
@@ -39,6 +41,8 @@ export default class Services {
|
|
|
39
41
|
constructor(options: {webex: WebexSDK; connectionConfig: SubscribeRequest}) {
|
|
40
42
|
const {webex, connectionConfig} = options;
|
|
41
43
|
this.webSocketManager = new WebSocketManager({webex});
|
|
44
|
+
// TODO: Implement reconnection logic for this websocket in upcoming PR
|
|
45
|
+
this.rtdWebSocketManager = new WebSocketManager({webex});
|
|
42
46
|
const aqmReq = new AqmReqs(this.webSocketManager);
|
|
43
47
|
this.config = new AgentConfigService();
|
|
44
48
|
this.agent = routingAgent(aqmReq);
|