@webex/contact-center 3.11.0 → 3.12.0-llmrefactor.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.
Files changed (267) hide show
  1. package/.sdd/manifest.json +882 -0
  2. package/AGENTS.md +94 -0
  3. package/ai-docs/ARCHITECTURE.md +168 -0
  4. package/ai-docs/CONTRACTS.md +46 -0
  5. package/ai-docs/GETTING_STARTED.md +168 -0
  6. package/ai-docs/GLOSSARY.md +43 -0
  7. package/ai-docs/README.md +138 -0
  8. package/ai-docs/REVIEW_CHECKLIST.md +41 -0
  9. package/ai-docs/RULES.md +444 -0
  10. package/ai-docs/SECURITY.md +52 -0
  11. package/ai-docs/SERVICE_STATE.md +48 -0
  12. package/ai-docs/SPEC_INDEX.md +65 -0
  13. package/ai-docs/adr/0001-spec-source-policy.md +55 -0
  14. package/ai-docs/adr/README.md +8 -0
  15. package/ai-docs/adr/_adr-template.md +31 -0
  16. package/ai-docs/contact-center-spec.md +341 -0
  17. package/ai-docs/features/generated-spec-conformance-fidelity-remediation/spec/feature-spec.md +117 -0
  18. package/ai-docs/features/residual-warning-coverage-completion/spec/feature-spec.md +203 -0
  19. package/ai-docs/features/validator-code-fidelity-drift-fix/spec/feature-spec.md +315 -0
  20. package/ai-docs/patterns/event-driven-patterns.md +485 -0
  21. package/ai-docs/patterns/testing-patterns.md +480 -0
  22. package/ai-docs/patterns/typescript-patterns.md +365 -0
  23. package/ai-docs/templates/README.md +102 -0
  24. package/ai-docs/templates/documentation/create-agents-md.md +240 -0
  25. package/ai-docs/templates/documentation/create-architecture-md.md +295 -0
  26. package/ai-docs/templates/existing-service/bug-fix.md +254 -0
  27. package/ai-docs/templates/existing-service/feature-enhancement.md +450 -0
  28. package/ai-docs/templates/new-method/00-master.md +80 -0
  29. package/ai-docs/templates/new-method/01-requirements.md +232 -0
  30. package/ai-docs/templates/new-method/02-implementation.md +295 -0
  31. package/ai-docs/templates/new-method/03-tests.md +201 -0
  32. package/ai-docs/templates/new-method/04-validation.md +141 -0
  33. package/ai-docs/templates/new-service/00-master.md +109 -0
  34. package/ai-docs/templates/new-service/01-pre-questions.md +159 -0
  35. package/ai-docs/templates/new-service/02-code-generation.md +346 -0
  36. package/ai-docs/templates/new-service/03-integration.md +178 -0
  37. package/ai-docs/templates/new-service/04-test-generation.md +205 -0
  38. package/ai-docs/templates/new-service/05-validation.md +145 -0
  39. package/dist/cc.js +379 -50
  40. package/dist/cc.js.map +1 -1
  41. package/dist/config.js +6 -0
  42. package/dist/config.js.map +1 -1
  43. package/dist/constants.js +22 -2
  44. package/dist/constants.js.map +1 -1
  45. package/dist/index.js +27 -5
  46. package/dist/index.js.map +1 -1
  47. package/dist/metrics/behavioral-events.js +114 -0
  48. package/dist/metrics/behavioral-events.js.map +1 -1
  49. package/dist/metrics/constants.js +32 -3
  50. package/dist/metrics/constants.js.map +1 -1
  51. package/dist/services/ApiAiAssistant.js +318 -0
  52. package/dist/services/ApiAiAssistant.js.map +1 -0
  53. package/dist/services/UserPreference.js +427 -0
  54. package/dist/services/UserPreference.js.map +1 -0
  55. package/dist/services/agent/types.js.map +1 -1
  56. package/dist/services/config/Util.js +8 -4
  57. package/dist/services/config/Util.js.map +1 -1
  58. package/dist/services/config/constants.js +35 -2
  59. package/dist/services/config/constants.js.map +1 -1
  60. package/dist/services/config/index.js +41 -2
  61. package/dist/services/config/index.js.map +1 -1
  62. package/dist/services/config/types.js +66 -8
  63. package/dist/services/config/types.js.map +1 -1
  64. package/dist/services/constants.js +27 -1
  65. package/dist/services/constants.js.map +1 -1
  66. package/dist/services/core/Err.js.map +1 -1
  67. package/dist/services/core/Utils.js +122 -25
  68. package/dist/services/core/Utils.js.map +1 -1
  69. package/dist/services/core/aqm-reqs.js +92 -17
  70. package/dist/services/core/aqm-reqs.js.map +1 -1
  71. package/dist/services/core/websocket/WebSocketManager.js +22 -6
  72. package/dist/services/core/websocket/WebSocketManager.js.map +1 -1
  73. package/dist/services/core/websocket/connection-service.js +3 -1
  74. package/dist/services/core/websocket/connection-service.js.map +1 -1
  75. package/dist/services/core/websocket/types.js.map +1 -1
  76. package/dist/services/index.js +6 -0
  77. package/dist/services/index.js.map +1 -1
  78. package/dist/services/task/Task.js +688 -0
  79. package/dist/services/task/Task.js.map +1 -0
  80. package/dist/services/task/TaskFactory.js +45 -0
  81. package/dist/services/task/TaskFactory.js.map +1 -0
  82. package/dist/services/task/TaskManager.js +751 -457
  83. package/dist/services/task/TaskManager.js.map +1 -1
  84. package/dist/services/task/TaskUtils.js +220 -23
  85. package/dist/services/task/TaskUtils.js.map +1 -1
  86. package/dist/services/task/constants.js +23 -2
  87. package/dist/services/task/constants.js.map +1 -1
  88. package/dist/services/task/dialer.js +129 -0
  89. package/dist/services/task/dialer.js.map +1 -1
  90. package/dist/services/task/digital/Digital.js +77 -0
  91. package/dist/services/task/digital/Digital.js.map +1 -0
  92. package/dist/services/task/state-machine/TaskStateMachine.js +873 -0
  93. package/dist/services/task/state-machine/TaskStateMachine.js.map +1 -0
  94. package/dist/services/task/state-machine/actions.js +567 -0
  95. package/dist/services/task/state-machine/actions.js.map +1 -0
  96. package/dist/services/task/state-machine/constants.js +161 -0
  97. package/dist/services/task/state-machine/constants.js.map +1 -0
  98. package/dist/services/task/state-machine/guards.js +382 -0
  99. package/dist/services/task/state-machine/guards.js.map +1 -0
  100. package/dist/services/task/state-machine/index.js +53 -0
  101. package/dist/services/task/state-machine/index.js.map +1 -0
  102. package/dist/services/task/state-machine/types.js +54 -0
  103. package/dist/services/task/state-machine/types.js.map +1 -0
  104. package/dist/services/task/state-machine/uiControlsComputer.js +603 -0
  105. package/dist/services/task/state-machine/uiControlsComputer.js.map +1 -0
  106. package/dist/services/task/taskDataNormalizer.js +99 -0
  107. package/dist/services/task/taskDataNormalizer.js.map +1 -0
  108. package/dist/services/task/types.js +227 -4
  109. package/dist/services/task/types.js.map +1 -1
  110. package/dist/services/task/voice/Voice.js +1044 -0
  111. package/dist/services/task/voice/Voice.js.map +1 -0
  112. package/dist/services/task/voice/WebRTC.js +149 -0
  113. package/dist/services/task/voice/WebRTC.js.map +1 -0
  114. package/dist/types/cc.d.ts +894 -0
  115. package/dist/types/config.d.ts +72 -0
  116. package/dist/types/constants.d.ts +66 -0
  117. package/dist/types/index.d.ts +199 -0
  118. package/dist/types/logger-proxy.d.ts +71 -0
  119. package/dist/types/metrics/MetricsManager.d.ts +223 -0
  120. package/dist/types/metrics/behavioral-events.d.ts +29 -0
  121. package/dist/types/metrics/constants.d.ts +181 -0
  122. package/dist/types/services/AddressBook.d.ts +74 -0
  123. package/dist/types/services/ApiAiAssistant.d.ts +49 -0
  124. package/dist/types/services/EntryPoint.d.ts +67 -0
  125. package/dist/types/services/Queue.d.ts +76 -0
  126. package/dist/types/services/UserPreference.d.ts +118 -0
  127. package/dist/types/services/WebCallingService.d.ts +1 -0
  128. package/dist/types/services/agent/index.d.ts +46 -0
  129. package/dist/types/services/agent/types.d.ts +413 -0
  130. package/dist/types/services/config/Util.d.ts +20 -0
  131. package/dist/types/services/config/constants.d.ts +270 -0
  132. package/dist/types/services/config/index.d.ts +177 -0
  133. package/dist/types/services/config/types.d.ts +1368 -0
  134. package/dist/types/services/constants.d.ts +110 -0
  135. package/dist/types/services/core/Err.d.ts +125 -0
  136. package/dist/types/services/core/GlobalTypes.d.ts +58 -0
  137. package/dist/types/services/core/Utils.d.ts +121 -0
  138. package/dist/types/services/core/WebexRequest.d.ts +22 -0
  139. package/dist/types/services/core/aqm-reqs.d.ts +65 -0
  140. package/dist/types/services/core/constants.d.ts +99 -0
  141. package/dist/types/services/core/types.d.ts +47 -0
  142. package/dist/types/services/core/websocket/WebSocketManager.d.ts +36 -0
  143. package/dist/types/services/core/websocket/connection-service.d.ts +27 -0
  144. package/dist/types/services/core/websocket/keepalive.worker.d.ts +2 -0
  145. package/dist/types/services/core/websocket/types.d.ts +37 -0
  146. package/dist/types/services/index.d.ts +54 -0
  147. package/dist/types/services/task/AutoWrapup.d.ts +40 -0
  148. package/dist/types/services/task/Task.d.ts +157 -0
  149. package/dist/types/services/task/TaskFactory.d.ts +12 -0
  150. package/dist/types/services/task/TaskManager.d.ts +1 -0
  151. package/dist/types/services/task/TaskUtils.d.ts +138 -0
  152. package/dist/types/services/task/constants.d.ts +91 -0
  153. package/dist/types/services/task/contact.d.ts +69 -0
  154. package/dist/types/services/task/dialer.d.ts +73 -0
  155. package/dist/types/services/task/digital/Digital.d.ts +22 -0
  156. package/dist/types/services/task/state-machine/TaskStateMachine.d.ts +1194 -0
  157. package/dist/types/services/task/state-machine/actions.d.ts +10 -0
  158. package/dist/types/services/task/state-machine/constants.d.ts +107 -0
  159. package/dist/types/services/task/state-machine/guards.d.ts +102 -0
  160. package/dist/types/services/task/state-machine/index.d.ts +13 -0
  161. package/dist/types/services/task/state-machine/types.d.ts +269 -0
  162. package/dist/types/services/task/state-machine/uiControlsComputer.d.ts +9 -0
  163. package/dist/types/services/task/taskDataNormalizer.d.ts +10 -0
  164. package/dist/types/services/task/types.d.ts +1856 -0
  165. package/dist/types/services/task/voice/Voice.d.ts +184 -0
  166. package/dist/types/services/task/voice/WebRTC.d.ts +53 -0
  167. package/dist/types/types.d.ts +778 -0
  168. package/dist/types/utils/PageCache.d.ts +173 -0
  169. package/dist/types/webex-config.d.ts +53 -0
  170. package/dist/types/webex.d.ts +8 -0
  171. package/dist/types.js +130 -1
  172. package/dist/types.js.map +1 -1
  173. package/dist/webex.js +14 -2
  174. package/dist/webex.js.map +1 -1
  175. package/package.json +16 -12
  176. package/src/cc.ts +477 -51
  177. package/src/config.ts +6 -0
  178. package/src/constants.ts +21 -1
  179. package/src/index.ts +24 -5
  180. package/src/metrics/ai-docs/AGENTS.md +350 -0
  181. package/src/metrics/ai-docs/ARCHITECTURE.md +338 -0
  182. package/src/metrics/ai-docs/metrics-spec.md +854 -0
  183. package/src/metrics/behavioral-events.ts +120 -0
  184. package/src/metrics/constants.ts +37 -3
  185. package/src/services/ApiAiAssistant.ts +412 -0
  186. package/src/services/UserPreference.ts +509 -0
  187. package/src/services/agent/ai-docs/AGENTS.md +240 -0
  188. package/src/services/agent/ai-docs/ARCHITECTURE.md +304 -0
  189. package/src/services/agent/ai-docs/agent-spec.md +504 -0
  190. package/src/services/agent/types.ts +1 -1
  191. package/src/services/ai-docs/AGENTS.md +386 -0
  192. package/src/services/ai-docs/services-spec.md +492 -0
  193. package/src/services/config/Util.ts +10 -2
  194. package/src/services/config/ai-docs/AGENTS.md +255 -0
  195. package/src/services/config/ai-docs/ARCHITECTURE.md +426 -0
  196. package/src/services/config/ai-docs/config-spec.md +669 -0
  197. package/src/services/config/constants.ts +37 -1
  198. package/src/services/config/index.ts +45 -1
  199. package/src/services/config/types.ts +241 -11
  200. package/src/services/constants.ts +29 -0
  201. package/src/services/core/Err.ts +3 -0
  202. package/src/services/core/Utils.ts +143 -30
  203. package/src/services/core/ai-docs/AGENTS.md +381 -0
  204. package/src/services/core/ai-docs/ARCHITECTURE.md +698 -0
  205. package/src/services/core/ai-docs/core-spec.md +783 -0
  206. package/src/services/core/aqm-reqs.ts +100 -22
  207. package/src/services/core/websocket/WebSocketManager.ts +23 -6
  208. package/src/services/core/websocket/connection-service.ts +5 -1
  209. package/src/services/core/websocket/types.ts +1 -1
  210. package/src/services/index.ts +4 -0
  211. package/src/services/task/Task.ts +837 -0
  212. package/src/services/task/TaskFactory.ts +55 -0
  213. package/src/services/task/TaskManager.ts +793 -521
  214. package/src/services/task/TaskUtils.ts +314 -24
  215. package/src/services/task/ai-docs/AGENTS.md +457 -0
  216. package/src/services/task/ai-docs/ARCHITECTURE.md +594 -0
  217. package/src/services/task/ai-docs/task-spec.md +1319 -0
  218. package/src/services/task/constants.ts +23 -0
  219. package/src/services/task/dialer.ts +136 -1
  220. package/src/services/task/digital/Digital.ts +95 -0
  221. package/src/services/task/state-machine/TaskStateMachine.ts +1166 -0
  222. package/src/services/task/state-machine/actions.ts +738 -0
  223. package/src/services/task/state-machine/ai-docs/AGENTS.md +458 -0
  224. package/src/services/task/state-machine/ai-docs/ARCHITECTURE.md +1137 -0
  225. package/src/services/task/state-machine/ai-docs/task-state-machine-spec.md +2177 -0
  226. package/src/services/task/state-machine/constants.ts +172 -0
  227. package/src/services/task/state-machine/guards.ts +445 -0
  228. package/src/services/task/state-machine/index.ts +28 -0
  229. package/src/services/task/state-machine/types.ts +243 -0
  230. package/src/services/task/state-machine/uiControlsComputer.ts +961 -0
  231. package/src/services/task/taskDataNormalizer.ts +137 -0
  232. package/src/services/task/types.ts +734 -71
  233. package/src/services/task/voice/Voice.ts +1270 -0
  234. package/src/services/task/voice/WebRTC.ts +187 -0
  235. package/src/types.ts +205 -2
  236. package/src/utils/AGENTS.md +278 -0
  237. package/src/utils/ai-docs/utils-spec.md +381 -0
  238. package/src/webex.js +2 -0
  239. package/test/unit/spec/cc.ts +503 -43
  240. package/test/unit/spec/logger-proxy.ts +70 -0
  241. package/test/unit/spec/services/ApiAiAssistant.ts +273 -0
  242. package/test/unit/spec/services/UserPreference.ts +401 -0
  243. package/test/unit/spec/services/WebCallingService.ts +7 -1
  244. package/test/unit/spec/services/config/index.ts +85 -29
  245. package/test/unit/spec/services/core/Utils.ts +481 -2
  246. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +137 -41
  247. package/test/unit/spec/services/core/websocket/connection-service.ts +3 -1
  248. package/test/unit/spec/services/task/AutoWrapup.ts +63 -0
  249. package/test/unit/spec/services/task/Task.ts +477 -0
  250. package/test/unit/spec/services/task/TaskFactory.ts +62 -0
  251. package/test/unit/spec/services/task/TaskManager.ts +1001 -1003
  252. package/test/unit/spec/services/task/TaskUtils.ts +235 -0
  253. package/test/unit/spec/services/task/dialer.ts +372 -96
  254. package/test/unit/spec/services/task/digital/Digital.ts +105 -0
  255. package/test/unit/spec/services/task/state-machine/TaskStateMachine.ts +2651 -0
  256. package/test/unit/spec/services/task/state-machine/guards.ts +637 -0
  257. package/test/unit/spec/services/task/state-machine/types.ts +18 -0
  258. package/test/unit/spec/services/task/state-machine/uiControlsComputer.ts +2663 -0
  259. package/test/unit/spec/services/task/taskTestUtils.ts +87 -0
  260. package/test/unit/spec/services/task/voice/Voice.ts +649 -0
  261. package/test/unit/spec/services/task/voice/WebRTC.ts +235 -0
  262. package/umd/contact-center.min.js +2 -2
  263. package/umd/contact-center.min.js.map +1 -1
  264. package/dist/services/task/index.js +0 -1525
  265. package/dist/services/task/index.js.map +0 -1
  266. package/src/services/task/index.ts +0 -1801
  267. 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);
@@ -154,10 +176,13 @@ export default class AqmReqs {
154
176
  if (response?.headers) {
155
177
  response.headers.Authorization = '*';
156
178
  }
157
- LoggerProxy.error(`Routing request timeout${keySuccess}${response!}${c.url}`, {
158
- module: AQM_REQS_FILE,
159
- method: METHODS.CREATE_PROMISE,
160
- });
179
+ LoggerProxy.error(
180
+ `Routing request timeout${keySuccess}${JSON.stringify(response)}${c.url}`,
181
+ {
182
+ module: AQM_REQS_FILE,
183
+ method: METHODS.CREATE_PROMISE,
184
+ }
185
+ );
161
186
  reject(
162
187
  new Err.Details('Service.aqm.reqs.Timeout', {
163
188
  key: keySuccess,
@@ -171,39 +196,60 @@ export default class AqmReqs {
171
196
  });
172
197
  }
173
198
 
174
- private bindPrint(bind: any) {
199
+ /**
200
+ * Converts a bind object to a string representation
201
+ * @param bind - The bind object to convert
202
+ * @returns A string representation of the bind object
203
+ */
204
+ private bindPrint(bind: any): string {
175
205
  let result = '';
176
- // eslint-disable-next-line no-restricted-syntax
177
- for (const k in bind) {
178
- if (Array.isArray(bind[k])) {
179
- result += `${k}=[${bind[k].join(',')}],`;
180
- } else if (typeof bind[k] === 'object' && bind[k] !== null) {
181
- result += `${k}=(${this.bindPrint(bind[k])}),`;
206
+ for (const key of Object.keys(bind).filter((prop) => prop !== '__typeMap')) {
207
+ const value = bind[key];
208
+
209
+ if (Array.isArray(value)) {
210
+ result += `${key}=[${value.join(',')}],`;
211
+ } else if (typeof value === 'object' && value !== null) {
212
+ result += `${key}=(${this.bindPrint(value)}),`;
182
213
  } else {
183
- result += `${k}=${bind[k]},`;
214
+ result += `${key}=${value},`;
184
215
  }
185
216
  }
186
217
 
187
218
  return result ? result.slice(0, -1) : result;
188
219
  }
189
220
 
190
- private bindCheck(bind: any, msg: any) {
191
- // eslint-disable-next-line no-restricted-syntax
192
- for (const k in bind) {
193
- if (Array.isArray(bind[k])) {
221
+ /**
222
+ * Checks if a message matches a bind object
223
+ * @param bind - The bind object to check against
224
+ * @param msg - The message to check
225
+ * @returns True if the message matches the bind object, false otherwise
226
+ */
227
+ private bindCheck(bind: any, msg: any): boolean {
228
+ // Handle type-dependent field matching if __typeMap is present
229
+ if (bind.__typeMap && typeof bind.__typeMap === 'object') {
230
+ if (!AqmReqs.typeMapCheck(bind.__typeMap, msg)) {
231
+ return false;
232
+ }
233
+ }
234
+
235
+ for (const key of Object.keys(bind).filter((prop) => prop !== '__typeMap')) {
236
+ const bindValue = bind[key];
237
+ const msgValue = msg[key];
238
+
239
+ if (Array.isArray(bindValue)) {
194
240
  // Check if the message value matches any of the values in the array
195
- if (!bind[k].includes(msg[k])) {
241
+ if (!bindValue.includes(msgValue)) {
196
242
  return false;
197
243
  }
198
- } else if (typeof bind[k] === 'object' && bind[k] !== null) {
199
- if (typeof msg[k] === 'object' && msg[k] !== null) {
200
- if (!this.bindCheck(bind[k], msg[k])) {
244
+ } else if (typeof bindValue === 'object' && bindValue !== null) {
245
+ if (typeof msgValue === 'object' && msgValue !== null) {
246
+ if (!this.bindCheck(bindValue, msgValue)) {
201
247
  return false;
202
248
  }
203
249
  } else {
204
250
  return false;
205
251
  }
206
- } else if (!msg[k] || msg[k] !== bind[k]) {
252
+ } else if (!msgValue || msgValue !== bindValue) {
207
253
  return false;
208
254
  }
209
255
  }
@@ -211,7 +257,39 @@ export default class AqmReqs {
211
257
  return true;
212
258
  }
213
259
 
214
- // must be lambda
260
+ /**
261
+ * Checks type-dependent field conditions defined in __typeMap.
262
+ * @param typeMap - The type map to check against
263
+ * @param msg - The message to check
264
+ * @returns True if the message matches the type map, false otherwise
265
+ * The typeMap has the shape:
266
+ * { typeField: "type", conditions: { EventA: { field: value }, EventB: { field: value } } }
267
+ * It reads msg[typeField] to determine which condition set to apply,
268
+ * then verifies all fields in that condition match the message.
269
+ */
270
+ private static typeMapCheck(typeMap: any, msg: any): boolean {
271
+ const typeField = typeMap.typeField || 'type';
272
+ const msgType = msg[typeField];
273
+
274
+ if (typeMap.conditions && typeMap.conditions[msgType]) {
275
+ const condition = typeMap.conditions[msgType];
276
+ for (const field of Object.keys(condition)) {
277
+ if (!msg[field] || msg[field] !== condition[field]) {
278
+ return false;
279
+ }
280
+ }
281
+
282
+ return true;
283
+ }
284
+
285
+ return false;
286
+ }
287
+
288
+ /**
289
+ * Handles incoming messages from the WebSocket (must be a lambda fn)
290
+ * @param msg - The message to handle
291
+ * @returns
292
+ */
215
293
  private readonly onMessage = (msg: any) => {
216
294
  const event = JSON.parse(msg);
217
295
  if (event.type === 'Welcome') {
@@ -1,6 +1,6 @@
1
1
  import EventEmitter from 'events';
2
2
  import {WebexSDK, SubscribeRequest, HTTP_METHODS} from '../../../types';
3
- import {SUBSCRIBE_API, WCC_API_GATEWAY} from '../../constants';
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: {body: SubscribeRequest}): Promise<WelcomeResponse> {
48
- const connectionConfig = options.body;
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: SUBSCRIBE_API,
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({body: this.subscribeRequest});
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 {
@@ -1,5 +1,5 @@
1
1
  import {SubscribeRequest} from '../../../types';
2
- import {WebSocketManager} from './WebSocketManager';
2
+ import type WebSocketManager from './WebSocketManager';
3
3
 
4
4
  /**
5
5
  * Options for initializing a connection service.
@@ -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);