@webex/contact-center 0.0.0-next.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.
Files changed (177) hide show
  1. package/README.md +81 -0
  2. package/__mocks__/workerMock.js +15 -0
  3. package/babel.config.js +15 -0
  4. package/dist/cc.js +1416 -0
  5. package/dist/cc.js.map +1 -0
  6. package/dist/config.js +72 -0
  7. package/dist/config.js.map +1 -0
  8. package/dist/constants.js +58 -0
  9. package/dist/constants.js.map +1 -0
  10. package/dist/index.js +142 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/logger-proxy.js +115 -0
  13. package/dist/logger-proxy.js.map +1 -0
  14. package/dist/metrics/MetricsManager.js +474 -0
  15. package/dist/metrics/MetricsManager.js.map +1 -0
  16. package/dist/metrics/behavioral-events.js +322 -0
  17. package/dist/metrics/behavioral-events.js.map +1 -0
  18. package/dist/metrics/constants.js +134 -0
  19. package/dist/metrics/constants.js.map +1 -0
  20. package/dist/services/WebCallingService.js +323 -0
  21. package/dist/services/WebCallingService.js.map +1 -0
  22. package/dist/services/agent/index.js +177 -0
  23. package/dist/services/agent/index.js.map +1 -0
  24. package/dist/services/agent/types.js +137 -0
  25. package/dist/services/agent/types.js.map +1 -0
  26. package/dist/services/config/Util.js +203 -0
  27. package/dist/services/config/Util.js.map +1 -0
  28. package/dist/services/config/constants.js +221 -0
  29. package/dist/services/config/constants.js.map +1 -0
  30. package/dist/services/config/index.js +607 -0
  31. package/dist/services/config/index.js.map +1 -0
  32. package/dist/services/config/types.js +334 -0
  33. package/dist/services/config/types.js.map +1 -0
  34. package/dist/services/constants.js +117 -0
  35. package/dist/services/constants.js.map +1 -0
  36. package/dist/services/core/Err.js +43 -0
  37. package/dist/services/core/Err.js.map +1 -0
  38. package/dist/services/core/GlobalTypes.js +6 -0
  39. package/dist/services/core/GlobalTypes.js.map +1 -0
  40. package/dist/services/core/Utils.js +126 -0
  41. package/dist/services/core/Utils.js.map +1 -0
  42. package/dist/services/core/WebexRequest.js +96 -0
  43. package/dist/services/core/WebexRequest.js.map +1 -0
  44. package/dist/services/core/aqm-reqs.js +246 -0
  45. package/dist/services/core/aqm-reqs.js.map +1 -0
  46. package/dist/services/core/constants.js +109 -0
  47. package/dist/services/core/constants.js.map +1 -0
  48. package/dist/services/core/types.js +6 -0
  49. package/dist/services/core/types.js.map +1 -0
  50. package/dist/services/core/websocket/WebSocketManager.js +187 -0
  51. package/dist/services/core/websocket/WebSocketManager.js.map +1 -0
  52. package/dist/services/core/websocket/connection-service.js +111 -0
  53. package/dist/services/core/websocket/connection-service.js.map +1 -0
  54. package/dist/services/core/websocket/keepalive.worker.js +94 -0
  55. package/dist/services/core/websocket/keepalive.worker.js.map +1 -0
  56. package/dist/services/core/websocket/types.js +6 -0
  57. package/dist/services/core/websocket/types.js.map +1 -0
  58. package/dist/services/index.js +78 -0
  59. package/dist/services/index.js.map +1 -0
  60. package/dist/services/task/AutoWrapup.js +88 -0
  61. package/dist/services/task/AutoWrapup.js.map +1 -0
  62. package/dist/services/task/TaskManager.js +369 -0
  63. package/dist/services/task/TaskManager.js.map +1 -0
  64. package/dist/services/task/constants.js +58 -0
  65. package/dist/services/task/constants.js.map +1 -0
  66. package/dist/services/task/contact.js +464 -0
  67. package/dist/services/task/contact.js.map +1 -0
  68. package/dist/services/task/dialer.js +60 -0
  69. package/dist/services/task/dialer.js.map +1 -0
  70. package/dist/services/task/index.js +1188 -0
  71. package/dist/services/task/index.js.map +1 -0
  72. package/dist/services/task/types.js +214 -0
  73. package/dist/services/task/types.js.map +1 -0
  74. package/dist/types/cc.d.ts +676 -0
  75. package/dist/types/config.d.ts +66 -0
  76. package/dist/types/constants.d.ts +45 -0
  77. package/dist/types/index.d.ts +178 -0
  78. package/dist/types/logger-proxy.d.ts +71 -0
  79. package/dist/types/metrics/MetricsManager.d.ts +223 -0
  80. package/dist/types/metrics/behavioral-events.d.ts +29 -0
  81. package/dist/types/metrics/constants.d.ts +127 -0
  82. package/dist/types/services/WebCallingService.d.ts +1 -0
  83. package/dist/types/services/agent/index.d.ts +46 -0
  84. package/dist/types/services/agent/types.d.ts +413 -0
  85. package/dist/types/services/config/Util.d.ts +19 -0
  86. package/dist/types/services/config/constants.d.ts +203 -0
  87. package/dist/types/services/config/index.d.ts +171 -0
  88. package/dist/types/services/config/types.d.ts +1113 -0
  89. package/dist/types/services/constants.d.ts +97 -0
  90. package/dist/types/services/core/Err.d.ts +119 -0
  91. package/dist/types/services/core/GlobalTypes.d.ts +33 -0
  92. package/dist/types/services/core/Utils.d.ts +36 -0
  93. package/dist/types/services/core/WebexRequest.d.ts +22 -0
  94. package/dist/types/services/core/aqm-reqs.d.ts +16 -0
  95. package/dist/types/services/core/constants.d.ts +85 -0
  96. package/dist/types/services/core/types.d.ts +47 -0
  97. package/dist/types/services/core/websocket/WebSocketManager.d.ts +34 -0
  98. package/dist/types/services/core/websocket/connection-service.d.ts +27 -0
  99. package/dist/types/services/core/websocket/keepalive.worker.d.ts +2 -0
  100. package/dist/types/services/core/websocket/types.d.ts +37 -0
  101. package/dist/types/services/index.d.ts +52 -0
  102. package/dist/types/services/task/AutoWrapup.d.ts +40 -0
  103. package/dist/types/services/task/TaskManager.d.ts +1 -0
  104. package/dist/types/services/task/constants.d.ts +46 -0
  105. package/dist/types/services/task/contact.d.ts +59 -0
  106. package/dist/types/services/task/dialer.d.ts +28 -0
  107. package/dist/types/services/task/index.d.ts +569 -0
  108. package/dist/types/services/task/types.d.ts +1041 -0
  109. package/dist/types/types.d.ts +452 -0
  110. package/dist/types/webex-config.d.ts +53 -0
  111. package/dist/types/webex.d.ts +7 -0
  112. package/dist/types.js +292 -0
  113. package/dist/types.js.map +1 -0
  114. package/dist/webex-config.js +60 -0
  115. package/dist/webex-config.js.map +1 -0
  116. package/dist/webex.js +99 -0
  117. package/dist/webex.js.map +1 -0
  118. package/jest.config.js +45 -0
  119. package/package.json +83 -0
  120. package/src/cc.ts +1618 -0
  121. package/src/config.ts +65 -0
  122. package/src/constants.ts +51 -0
  123. package/src/index.ts +220 -0
  124. package/src/logger-proxy.ts +110 -0
  125. package/src/metrics/MetricsManager.ts +512 -0
  126. package/src/metrics/behavioral-events.ts +332 -0
  127. package/src/metrics/constants.ts +135 -0
  128. package/src/services/WebCallingService.ts +351 -0
  129. package/src/services/agent/index.ts +149 -0
  130. package/src/services/agent/types.ts +440 -0
  131. package/src/services/config/Util.ts +261 -0
  132. package/src/services/config/constants.ts +249 -0
  133. package/src/services/config/index.ts +743 -0
  134. package/src/services/config/types.ts +1117 -0
  135. package/src/services/constants.ts +111 -0
  136. package/src/services/core/Err.ts +126 -0
  137. package/src/services/core/GlobalTypes.ts +34 -0
  138. package/src/services/core/Utils.ts +132 -0
  139. package/src/services/core/WebexRequest.ts +103 -0
  140. package/src/services/core/aqm-reqs.ts +272 -0
  141. package/src/services/core/constants.ts +106 -0
  142. package/src/services/core/types.ts +48 -0
  143. package/src/services/core/websocket/WebSocketManager.ts +196 -0
  144. package/src/services/core/websocket/connection-service.ts +142 -0
  145. package/src/services/core/websocket/keepalive.worker.js +88 -0
  146. package/src/services/core/websocket/types.ts +40 -0
  147. package/src/services/index.ts +71 -0
  148. package/src/services/task/AutoWrapup.ts +86 -0
  149. package/src/services/task/TaskManager.ts +420 -0
  150. package/src/services/task/constants.ts +52 -0
  151. package/src/services/task/contact.ts +429 -0
  152. package/src/services/task/dialer.ts +52 -0
  153. package/src/services/task/index.ts +1375 -0
  154. package/src/services/task/types.ts +1113 -0
  155. package/src/types.ts +639 -0
  156. package/src/webex-config.ts +54 -0
  157. package/src/webex.js +96 -0
  158. package/test/unit/spec/cc.ts +1985 -0
  159. package/test/unit/spec/metrics/MetricsManager.ts +491 -0
  160. package/test/unit/spec/metrics/behavioral-events.ts +102 -0
  161. package/test/unit/spec/services/WebCallingService.ts +416 -0
  162. package/test/unit/spec/services/agent/index.ts +65 -0
  163. package/test/unit/spec/services/config/index.ts +1035 -0
  164. package/test/unit/spec/services/core/Utils.ts +279 -0
  165. package/test/unit/spec/services/core/WebexRequest.ts +144 -0
  166. package/test/unit/spec/services/core/aqm-reqs.ts +570 -0
  167. package/test/unit/spec/services/core/websocket/WebSocketManager.ts +378 -0
  168. package/test/unit/spec/services/core/websocket/connection-service.ts +178 -0
  169. package/test/unit/spec/services/task/TaskManager.ts +1351 -0
  170. package/test/unit/spec/services/task/contact.ts +204 -0
  171. package/test/unit/spec/services/task/dialer.ts +157 -0
  172. package/test/unit/spec/services/task/index.ts +1474 -0
  173. package/tsconfig.json +6 -0
  174. package/typedoc.json +37 -0
  175. package/typedoc.md +240 -0
  176. package/umd/contact-center.min.js +3 -0
  177. package/umd/contact-center.min.js.map +1 -0
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Message = exports.Details = void 0;
7
+ /**
8
+ * Err module provides a structured way to handle errors in the Contact Center plugin.
9
+ * @ignore
10
+ */
11
+
12
+ class Message extends Error {
13
+ constructor(id, value) {
14
+ super();
15
+ this.id = id;
16
+ this.stack = new Error().stack;
17
+ if (typeof value === 'string') {
18
+ this.message = value;
19
+ } else if (value instanceof Error) {
20
+ this.message = value.message;
21
+ this.name = value.name;
22
+ } else {
23
+ this.message = '';
24
+ }
25
+ }
26
+
27
+ // Marker to distinct Err class from other errors
28
+ isErr = 'yes';
29
+ }
30
+ exports.Message = Message;
31
+ class Details extends Error {
32
+ constructor(id, details) {
33
+ super();
34
+ this.id = id;
35
+ this.stack = new Error().stack;
36
+ this.details = details;
37
+ }
38
+
39
+ // Marker to distinct Err class from other errors
40
+ isErr = 'yes';
41
+ }
42
+ exports.Details = Details;
43
+ //# sourceMappingURL=Err.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Message","Error","constructor","id","value","stack","message","name","isErr","exports","Details","details"],"sources":["Err.ts"],"sourcesContent":["import {WebexRequestPayload} from '../../types';\nimport {Failure} from './GlobalTypes';\n\n/**\n * Err module provides a structured way to handle errors in the Contact Center plugin.\n * @ignore\n */\n\nexport type ErrDetails = {status: number; type: string; trackingId: string};\n\nexport type AgentErrorIds =\n | {'Service.aqm.agent.stationLogin': ErrDetails}\n | {'Service.aqm.agent.stationLoginFailed': Failure}\n | {'Service.aqm.agent.stateChange': Failure}\n | {'Service.aqm.agent.reload': Failure}\n | {'Service.aqm.agent.logout': Failure}\n | {'Service.reqs.generic.failure': {trackingId: string}}\n | {'Service.aqm.agent.BuddyAgentsRetrieveFailed': Failure};\n\nexport type vteamType = 'inboundqueue' | 'inboundentrypoint' | string;\n\nexport type TaskErrorIds =\n | {'Service.aqm.task.accept': Failure}\n | {'Service.aqm.task.end': Failure}\n | {'Service.aqm.task.wrapup': Failure}\n | {'Service.aqm.task.AgentVteamTransferFailed': Failure}\n | {'Service.aqm.task.AgentBlindTransferFailedEvent': Failure}\n | {'Service.aqm.task.AgentConsultTransferFailed': Failure}\n | {'Service.aqm.task.consult': Failure}\n | {'Service.aqm.err.trackingId': {trackingId: string}}\n | {'Service.aqm.task.consultAccept': Failure}\n | {'Service.aqm.task.consultConference': Failure}\n | {'Service.aqm.task.consultEnd': Failure}\n | {'Service.aqm.task.cancelCtq': Failure}\n | {'Service.aqm.task.hold': Failure}\n | {'Service.aqm.task.unHold': Failure}\n | {'Service.aqm.task.VteamListFailed': Failure}\n | {'Service.aqm.task.pauseRecording': Failure}\n | {'Service.aqm.task.resumeRecording': Failure}\n | {'Service.aqm.dialer.startOutdial': Failure}\n | {'Service.reqs.generic.failure': {trackingId: string}};\n\nexport type ReqError =\n | 'Service.aqm.reqs.GenericRequestError'\n | {'Service.aqm.reqs.Pending': {key: string; msg: string}}\n | {'Service.aqm.reqs.PendingEvent': {key: string}}\n | {'Service.aqm.reqs.Timeout': {key: string; response: WebexRequestPayload}}\n | {'Service.aqm.reqs.TimeoutEvent': {key: string}};\n\nexport interface Ids {\n 'Service.aqm.agent': AgentErrorIds;\n 'Service.aqm.reqs': ReqError;\n 'Service.aqm.task': TaskErrorIds;\n}\n\nexport type IdsGlobal =\n | 'system' // to handle errors that was not created by 'new Err.WithId()'\n | 'handle'\n | 'fallback';\n\nexport type IdsSub = Ids[keyof Ids];\n\nexport type IdsMessage = IdsGlobal | keyof Ids | Exclude<IdsSub, object>;\n\nexport type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (\n k: infer I\n) => void\n ? I\n : never;\n\nexport type FlattenUnion<T> = {\n [K in keyof UnionToIntersection<T>]: K extends keyof T\n ? T[K] extends any[]\n ? T[K]\n : T[K] extends object\n ? FlattenUnion<T[K]>\n : T[K]\n : UnionToIntersection<T>[K];\n};\nexport type IdsDetailsType = FlattenUnion<Exclude<IdsSub, string>>;\n\nexport type IdsDetails = keyof IdsDetailsType;\n\nexport type Id = IdsMessage | IdsDetails;\n\nexport class Message extends Error {\n readonly id: Id;\n\n constructor(id: IdsMessage);\n constructor(id: IdsMessage, message: string);\n constructor(id: IdsMessage, errror: Error);\n constructor(id: IdsMessage, value?: string | Error) {\n super();\n\n this.id = id;\n this.stack = new Error().stack!;\n\n if (typeof value === 'string') {\n this.message = value;\n } else if (value instanceof Error) {\n this.message = value.message;\n this.name = value.name;\n } else {\n this.message = '';\n }\n }\n\n // Marker to distinct Err class from other errors\n private isErr = 'yes';\n}\n\nexport class Details<T extends IdsDetails> extends Error {\n readonly id: Id;\n readonly details: IdsDetailsType[T];\n\n constructor(id: T, details: IdsDetailsType[T]) {\n super();\n\n this.id = id;\n this.stack = new Error().stack!;\n this.details = details;\n }\n\n // Marker to distinct Err class from other errors\n private isErr = 'yes';\n}\n"],"mappings":";;;;;;AAGA;AACA;AACA;AACA;;AA+EO,MAAMA,OAAO,SAASC,KAAK,CAAC;EAMjCC,WAAWA,CAACC,EAAc,EAAEC,KAAsB,EAAE;IAClD,KAAK,CAAC,CAAC;IAEP,IAAI,CAACD,EAAE,GAAGA,EAAE;IACZ,IAAI,CAACE,KAAK,GAAG,IAAIJ,KAAK,CAAC,CAAC,CAACI,KAAM;IAE/B,IAAI,OAAOD,KAAK,KAAK,QAAQ,EAAE;MAC7B,IAAI,CAACE,OAAO,GAAGF,KAAK;IACtB,CAAC,MAAM,IAAIA,KAAK,YAAYH,KAAK,EAAE;MACjC,IAAI,CAACK,OAAO,GAAGF,KAAK,CAACE,OAAO;MAC5B,IAAI,CAACC,IAAI,GAAGH,KAAK,CAACG,IAAI;IACxB,CAAC,MAAM;MACL,IAAI,CAACD,OAAO,GAAG,EAAE;IACnB;EACF;;EAEA;EACQE,KAAK,GAAG,KAAK;AACvB;AAACC,OAAA,CAAAT,OAAA,GAAAA,OAAA;AAEM,MAAMU,OAAO,SAA+BT,KAAK,CAAC;EAIvDC,WAAWA,CAACC,EAAK,EAAEQ,OAA0B,EAAE;IAC7C,KAAK,CAAC,CAAC;IAEP,IAAI,CAACR,EAAE,GAAGA,EAAE;IACZ,IAAI,CAACE,KAAK,GAAG,IAAIJ,KAAK,CAAC,CAAC,CAACI,KAAM;IAC/B,IAAI,CAACM,OAAO,GAAGA,OAAO;EACxB;;EAEA;EACQH,KAAK,GAAG,KAAK;AACvB;AAACC,OAAA,CAAAC,OAAA,GAAAA,OAAA"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ //# sourceMappingURL=GlobalTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sources":["GlobalTypes.ts"],"sourcesContent":["/**\n * Generic message interface used throughout the plugin\n * @template T - Type of the data payload (defaults to any)\n * @private\n * @ignore\n */\nexport type Msg<T = any> = {\n /** Message/Event type identifier */\n type: string;\n /** Organization identifier */\n orgId: string;\n /** Unique tracking identifier for the message/Event */\n trackingId: string;\n /** Message/Event payload data */\n data: T;\n};\n\n/**\n * Represents a failure message with specific error details\n * @private\n * @ignore\n */\nexport type Failure = Msg<{\n /** Agent identifier associated with the failure */\n agentId: string;\n /** Tracking identifier for the failure event */\n trackingId: string;\n /** Numeric code indicating the reason for failure */\n reasonCode: number;\n /** Organization identifier */\n orgId: string;\n /** Human-readable description of the failure reason */\n reason: string;\n}>;\n"],"mappings":""}
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isValidDialNumber = exports.getStationLoginErrorData = exports.getErrorDetails = exports.createErrDetailsObject = void 0;
7
+ var Err = _interopRequireWildcard(require("./Err"));
8
+ var _types = require("../../types");
9
+ var _loggerProxy = _interopRequireDefault(require("../../logger-proxy"));
10
+ var _WebexRequest = _interopRequireDefault(require("./WebexRequest"));
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
13
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
14
+ /**
15
+ * Extracts common error details from a Webex request payload.
16
+ *
17
+ * @param errObj - The Webex request payload object.
18
+ * @returns An object containing the tracking ID and message body.
19
+ * @private
20
+ * @ignore
21
+ */
22
+ const getCommonErrorDetails = errObj => {
23
+ return {
24
+ trackingId: errObj?.headers?.trackingid || errObj?.headers?.TrackingID,
25
+ msg: errObj?.body
26
+ };
27
+ };
28
+ const isValidDialNumber = input => {
29
+ // This regex checks for a valid dial number format for only few countries such as US, Canada.
30
+ const regexForDn = /1[0-9]{3}[2-9][0-9]{6}([,]{1,10}[0-9]+){0,1}/;
31
+ return regexForDn.test(input);
32
+ };
33
+ exports.isValidDialNumber = isValidDialNumber;
34
+ const getStationLoginErrorData = (failure, loginOption) => {
35
+ let duplicateLocationMessage = 'This value is already in use';
36
+ if (loginOption === _types.LoginOption.EXTENSION) {
37
+ duplicateLocationMessage = 'This extension is already in use';
38
+ }
39
+ if (loginOption === _types.LoginOption.AGENT_DN) {
40
+ duplicateLocationMessage = 'Dial number is in use. Try a different one. For help, reach out to your administrator or support team.';
41
+ }
42
+ const errorCodeMessageMap = {
43
+ DUPLICATE_LOCATION: {
44
+ message: duplicateLocationMessage,
45
+ fieldName: loginOption
46
+ },
47
+ INVALID_DIAL_NUMBER: {
48
+ message: 'Enter a valid US dial number. For help, reach out to your administrator or support team.',
49
+ fieldName: loginOption
50
+ }
51
+ };
52
+ const defaultMessage = 'An error occurred while logging in to the station';
53
+ const defaultFieldName = 'generic';
54
+ const reason = failure?.data?.reason || '';
55
+ return {
56
+ message: errorCodeMessageMap[reason]?.message || defaultMessage,
57
+ fieldName: errorCodeMessageMap[reason]?.fieldName || defaultFieldName
58
+ };
59
+ };
60
+
61
+ /**
62
+ * Extracts error details and logs the error. Also uploads logs for the error unless it is a silent relogin agent not found error.
63
+ *
64
+ * @param error - The error object, expected to have a `details` property of type Failure.
65
+ * @param methodName - The name of the method where the error occurred.
66
+ * @param moduleName - The name of the module where the error occurred.
67
+ * @returns An object containing the error instance and the reason string.
68
+ * @public
69
+ * @example
70
+ * const details = getErrorDetails(error, 'fetchData', 'DataModule');
71
+ * if (details.error) { handleError(details.error); }
72
+ * @ignore
73
+ */
74
+ exports.getStationLoginErrorData = getStationLoginErrorData;
75
+ const getErrorDetails = (error, methodName, moduleName) => {
76
+ let errData = {
77
+ message: '',
78
+ fieldName: ''
79
+ };
80
+ const failure = error.details;
81
+ const reason = failure?.data?.reason ?? `Error while performing ${methodName}`;
82
+ if (!(reason === 'AGENT_NOT_FOUND' && methodName === 'silentRelogin')) {
83
+ _loggerProxy.default.error(`${methodName} failed with reason: ${reason}`, {
84
+ module: moduleName,
85
+ method: methodName,
86
+ trackingId: failure?.trackingId
87
+ });
88
+ // we can add more conditions here if not needed for specific cases eg: silentReLogin
89
+ _WebexRequest.default.getInstance().uploadLogs({
90
+ correlationId: failure?.trackingId
91
+ });
92
+ }
93
+ if (methodName === 'stationLogin') {
94
+ errData = getStationLoginErrorData(failure, error.loginOption);
95
+ _loggerProxy.default.error(`${methodName} failed with reason: ${reason}, message: ${errData.message}, fieldName: ${errData.fieldName}`, {
96
+ module: moduleName,
97
+ method: methodName,
98
+ trackingId: failure?.trackingId
99
+ });
100
+ }
101
+ const err = new Error(reason ?? `Error while performing ${methodName}`);
102
+ // @ts-ignore - add custom property to the error object for backward compatibility
103
+ err.data = errData;
104
+ return {
105
+ error: err,
106
+ reason
107
+ };
108
+ };
109
+
110
+ /**
111
+ * Creates an error details object suitable for use with the Err.Details class.
112
+ *
113
+ * @param errObj - The Webex request payload object.
114
+ * @returns An instance of Err.Details with the generic failure message and extracted details.
115
+ * @public
116
+ * @example
117
+ * const errDetails = createErrDetailsObject(webexRequestPayload);
118
+ * @ignore
119
+ */
120
+ exports.getErrorDetails = getErrorDetails;
121
+ const createErrDetailsObject = errObj => {
122
+ const details = getCommonErrorDetails(errObj);
123
+ return new Err.Details('Service.reqs.generic.failure', details);
124
+ };
125
+ exports.createErrDetailsObject = createErrDetailsObject;
126
+ //# sourceMappingURL=Utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Err","_interopRequireWildcard","require","_types","_loggerProxy","_interopRequireDefault","_WebexRequest","obj","__esModule","default","_getRequireWildcardCache","e","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","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","createErrDetailsObject","Details"],"sources":["Utils.ts"],"sourcesContent":["import * as Err from './Err';\nimport {LoginOption, WebexRequestPayload} from '../../types';\nimport {Failure} from './GlobalTypes';\nimport LoggerProxy from '../../logger-proxy';\nimport WebexRequest from './WebexRequest';\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 * 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"],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _constants = require("../../constants");
8
+ var _loggerProxy = _interopRequireDefault(require("../../logger-proxy"));
9
+ var _constants2 = require("./constants");
10
+ var _constants3 = require("../../metrics/constants");
11
+ var _MetricsManager = _interopRequireDefault(require("../../metrics/MetricsManager"));
12
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
+ class WebexRequest {
14
+ static getInstance(options) {
15
+ if (!WebexRequest.instance && options && options.webex) {
16
+ WebexRequest.instance = new WebexRequest(options);
17
+ }
18
+ return WebexRequest.instance;
19
+ }
20
+ constructor(options) {
21
+ const {
22
+ webex
23
+ } = options;
24
+ this.webex = webex;
25
+ }
26
+ async request(options) {
27
+ const {
28
+ service,
29
+ resource,
30
+ method,
31
+ body
32
+ } = options;
33
+ return this.webex.request({
34
+ service,
35
+ resource,
36
+ method,
37
+ body
38
+ });
39
+ }
40
+
41
+ /**
42
+ * This is used for uploading the logs to backend/mats.
43
+ *
44
+ * @param metaData - meta data to be uploaded.
45
+ */
46
+ async uploadLogs(metaData = {}) {
47
+ const feedbackId = crypto.randomUUID();
48
+ try {
49
+ const response = await this.webex.internal.support.submitLogs({
50
+ ...metaData,
51
+ feedbackId
52
+ }, undefined,
53
+ // we dont send logs but take from webex logger
54
+ {
55
+ type: 'diff'
56
+ } // this is to take the diff logs from previous upload
57
+ );
58
+
59
+ _loggerProxy.default.info(`Logs uploaded successfully with feedbackId: ${feedbackId}`, {
60
+ module: _constants.WEBEX_REQUEST_FILE,
61
+ method: _constants2.METHODS.UPLOAD_LOGS
62
+ });
63
+ _MetricsManager.default.getInstance().trackEvent(_constants3.METRIC_EVENT_NAMES.UPLOAD_LOGS_SUCCESS, {
64
+ trackingId: response?.trackingid,
65
+ feedbackId,
66
+ correlationId: metaData?.correlationId
67
+ }, ['behavioral']);
68
+ return {
69
+ trackingid: response.trackingid,
70
+ ...(response.url ? {
71
+ url: response.url
72
+ } : {}),
73
+ ...(response.userId ? {
74
+ userId: response.userId
75
+ } : {}),
76
+ ...(response.correlationId ? {
77
+ correlationId: response.correlationId
78
+ } : {}),
79
+ feedbackId
80
+ };
81
+ } catch (error) {
82
+ _loggerProxy.default.error(`Error uploading logs: ${error}`, {
83
+ module: _constants.WEBEX_REQUEST_FILE,
84
+ method: _constants2.METHODS.UPLOAD_LOGS
85
+ });
86
+ _MetricsManager.default.getInstance().trackEvent(_constants3.METRIC_EVENT_NAMES.UPLOAD_LOGS_FAILED, {
87
+ stack: error?.stack,
88
+ feedbackId,
89
+ correlationId: metaData?.correlationId
90
+ }, ['behavioral']);
91
+ throw error;
92
+ }
93
+ }
94
+ }
95
+ var _default = exports.default = WebexRequest;
96
+ //# sourceMappingURL=WebexRequest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_constants","require","_loggerProxy","_interopRequireDefault","_constants2","_constants3","_MetricsManager","obj","__esModule","default","WebexRequest","getInstance","options","instance","webex","constructor","request","service","resource","method","body","uploadLogs","metaData","feedbackId","crypto","randomUUID","response","internal","support","submitLogs","undefined","type","LoggerProxy","info","module","WEBEX_REQUEST_FILE","METHODS","UPLOAD_LOGS","MetricsManager","trackEvent","METRIC_EVENT_NAMES","UPLOAD_LOGS_SUCCESS","trackingId","trackingid","correlationId","url","userId","error","UPLOAD_LOGS_FAILED","stack","_default","exports"],"sources":["WebexRequest.ts"],"sourcesContent":["import {WEBEX_REQUEST_FILE} from '../../constants';\nimport LoggerProxy from '../../logger-proxy';\nimport {METHODS} from './constants';\nimport {METRIC_EVENT_NAMES} from '../../metrics/constants';\nimport MetricsManager from '../../metrics/MetricsManager';\nimport {\n WebexSDK,\n HTTP_METHODS,\n IHttpResponse,\n RequestBody,\n UploadLogsResponse,\n LogsMetaData,\n} from '../../types';\n\nclass WebexRequest {\n private webex: WebexSDK;\n private static instance: WebexRequest;\n\n public static getInstance(options?: {webex: WebexSDK}): WebexRequest {\n if (!WebexRequest.instance && options && options.webex) {\n WebexRequest.instance = new WebexRequest(options);\n }\n\n return WebexRequest.instance;\n }\n\n private constructor(options: {webex: WebexSDK}) {\n const {webex} = options;\n this.webex = webex;\n }\n\n public async request(options: {\n service: string;\n resource: string;\n method: HTTP_METHODS;\n body?: RequestBody;\n }): Promise<IHttpResponse> {\n const {service, resource, method, body} = options;\n\n return this.webex.request({\n service,\n resource,\n method,\n body,\n });\n }\n\n /**\n * This is used for uploading the logs to backend/mats.\n *\n * @param metaData - meta data to be uploaded.\n */\n public async uploadLogs(metaData: LogsMetaData = {}): Promise<UploadLogsResponse> {\n const feedbackId = crypto.randomUUID();\n try {\n const response = await this.webex.internal.support.submitLogs(\n {...metaData, feedbackId},\n undefined, // we dont send logs but take from webex logger\n {type: 'diff'} // this is to take the diff logs from previous upload\n );\n LoggerProxy.info(`Logs uploaded successfully with feedbackId: ${feedbackId}`, {\n module: WEBEX_REQUEST_FILE,\n method: METHODS.UPLOAD_LOGS,\n });\n\n MetricsManager.getInstance().trackEvent(\n METRIC_EVENT_NAMES.UPLOAD_LOGS_SUCCESS,\n {\n trackingId: response?.trackingid,\n feedbackId,\n correlationId: metaData?.correlationId,\n },\n ['behavioral']\n );\n\n return {\n trackingid: response.trackingid,\n ...(response.url ? {url: response.url} : {}),\n ...(response.userId ? {userId: response.userId} : {}),\n ...(response.correlationId ? {correlationId: response.correlationId} : {}),\n feedbackId,\n };\n } catch (error) {\n LoggerProxy.error(`Error uploading logs: ${error}`, {\n module: WEBEX_REQUEST_FILE,\n method: METHODS.UPLOAD_LOGS,\n });\n\n MetricsManager.getInstance().trackEvent(\n METRIC_EVENT_NAMES.UPLOAD_LOGS_FAILED,\n {\n stack: error?.stack,\n feedbackId,\n correlationId: metaData?.correlationId,\n },\n ['behavioral']\n );\n throw error;\n }\n }\n}\n\nexport default WebexRequest;\n"],"mappings":"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"}
@@ -0,0 +1,246 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var Err = _interopRequireWildcard(require("./Err"));
8
+ var _types = require("../../types");
9
+ var _loggerProxy = _interopRequireDefault(require("../../logger-proxy"));
10
+ var _constants = require("./constants");
11
+ var _constants2 = require("../../constants");
12
+ var _WebexRequest = _interopRequireDefault(require("./WebexRequest"));
13
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
15
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
16
+ class AqmReqs {
17
+ pendingRequests = {};
18
+ pendingNotifCancelrequest = {};
19
+ constructor(webSocketManager) {
20
+ this.webexRequest = _WebexRequest.default.getInstance();
21
+ this.webSocketManager = webSocketManager;
22
+ this.webSocketManager.on('message', this.onMessage.bind(this));
23
+ }
24
+ req(c) {
25
+ return (p, cbRes) => this.makeAPIRequest(c(p), cbRes);
26
+ }
27
+ reqEmpty(c) {
28
+ return cbRes => this.makeAPIRequest(c(), cbRes);
29
+ }
30
+ async makeAPIRequest(c, cbRes) {
31
+ return this.createPromise(c, cbRes);
32
+ }
33
+ createPromise(c, cbRes) {
34
+ return new Promise((resolve, reject) => {
35
+ const keySuccess = this.bindPrint(c.notifSuccess.bind);
36
+ const keyFail = c.notifFail ? this.bindPrint(c.notifFail.bind) : null;
37
+ const keyCancel = c.notifCancel?.bind ? this.bindPrint(c.notifCancel.bind) : null;
38
+ let k = '';
39
+ if (this.pendingRequests[keySuccess]) {
40
+ k = keySuccess;
41
+ }
42
+ if (keyFail && this.pendingRequests[keyFail]) {
43
+ k += keyFail;
44
+ }
45
+ if (k && c.timeout !== 'disabled') {
46
+ reject(new Err.Details('Service.aqm.reqs.Pending', {
47
+ key: k,
48
+ msg: 'The request has been already created, multiple requests are not allowed.'
49
+ }));
50
+ return;
51
+ }
52
+ let isClear = false;
53
+ const clear = () => {
54
+ delete this.pendingRequests[keySuccess];
55
+ if (keyFail) {
56
+ delete this.pendingRequests[keyFail];
57
+ }
58
+ if (keyCancel) {
59
+ delete this.pendingNotifCancelrequest[keyCancel];
60
+ }
61
+ isClear = true;
62
+ };
63
+ this.pendingRequests[keySuccess] = {
64
+ check: msg => this.bindCheck(c.notifSuccess.bind, msg),
65
+ handle: msg => {
66
+ clear();
67
+ resolve(msg);
68
+ }
69
+ };
70
+ if (keyCancel) {
71
+ this.pendingRequests[keySuccess].alternateBind = keyCancel;
72
+ this.pendingNotifCancelrequest[keyCancel] = {
73
+ check: msg => this.bindCheck(c.notifCancel?.bind, msg),
74
+ handle: msg => {
75
+ const alternateBindKey = this.pendingNotifCancelrequest[keyCancel].alternateBind;
76
+ if (alternateBindKey) {
77
+ this.pendingRequests[alternateBindKey].handle(msg);
78
+ }
79
+ },
80
+ alternateBind: keySuccess
81
+ };
82
+ }
83
+ if (keyFail) {
84
+ this.pendingRequests[keyFail] = {
85
+ check: msg => this.bindCheck(c.notifFail.bind, msg),
86
+ handle: msg => {
87
+ clear();
88
+ const notifFail = c.notifFail;
89
+ if ('errId' in notifFail) {
90
+ _loggerProxy.default.log(`Routing request failed: ${JSON.stringify(msg)}`, {
91
+ module: _constants2.AQM_REQS_FILE,
92
+ method: _constants.METHODS.CREATE_PROMISE
93
+ });
94
+ const eerr = new Err.Details(notifFail.errId, msg);
95
+ _loggerProxy.default.log(`Routing request failed: ${eerr}`, {
96
+ module: _constants2.AQM_REQS_FILE,
97
+ method: _constants.METHODS.CREATE_PROMISE
98
+ });
99
+ reject(eerr);
100
+ } else {
101
+ reject(notifFail.err(msg));
102
+ }
103
+ }
104
+ };
105
+ }
106
+ let response = null;
107
+ this.webexRequest.request({
108
+ service: c.host ?? '',
109
+ resource: c.url,
110
+ // eslint-disable-next-line no-nested-ternary
111
+ method: c.method ? c.method : c.data ? _types.HTTP_METHODS.POST : _types.HTTP_METHODS.GET,
112
+ body: c.data
113
+ }).then(res => {
114
+ response = res;
115
+ if (cbRes) {
116
+ cbRes(res);
117
+ }
118
+ }).catch(error => {
119
+ clear();
120
+ if (error?.headers) {
121
+ error.headers.Authorization = '*';
122
+ }
123
+ if (error?.headers) {
124
+ error.headers.Authorization = '*';
125
+ }
126
+ if (typeof c.err === 'function') {
127
+ reject(c.err(error));
128
+ } else if (typeof c.err === 'string') {
129
+ reject(new Err.Message(c.err));
130
+ } else {
131
+ reject(new Err.Message('Service.aqm.reqs.GenericRequestError'));
132
+ }
133
+ });
134
+ if (c.timeout !== 'disabled') {
135
+ window.setTimeout(() => {
136
+ if (isClear) {
137
+ return;
138
+ }
139
+ clear();
140
+ if (response?.headers) {
141
+ response.headers.Authorization = '*';
142
+ }
143
+ _loggerProxy.default.error(`Routing request timeout${keySuccess}${response}${c.url}`, {
144
+ module: _constants2.AQM_REQS_FILE,
145
+ method: _constants.METHODS.CREATE_PROMISE
146
+ });
147
+ reject(new Err.Details('Service.aqm.reqs.Timeout', {
148
+ key: keySuccess,
149
+ response: response
150
+ }));
151
+ }, c.timeout && c.timeout > 0 ? c.timeout : _constants.TIMEOUT_REQ);
152
+ }
153
+ });
154
+ }
155
+ bindPrint(bind) {
156
+ let result = '';
157
+ // eslint-disable-next-line no-restricted-syntax
158
+ for (const k in bind) {
159
+ if (Array.isArray(bind[k])) {
160
+ result += `${k}=[${bind[k].join(',')}],`;
161
+ } else if (typeof bind[k] === 'object' && bind[k] !== null) {
162
+ result += `${k}=(${this.bindPrint(bind[k])}),`;
163
+ } else {
164
+ result += `${k}=${bind[k]},`;
165
+ }
166
+ }
167
+ return result ? result.slice(0, -1) : result;
168
+ }
169
+ bindCheck(bind, msg) {
170
+ // eslint-disable-next-line no-restricted-syntax
171
+ for (const k in bind) {
172
+ if (Array.isArray(bind[k])) {
173
+ // Check if the message value matches any of the values in the array
174
+ if (!bind[k].includes(msg[k])) {
175
+ return false;
176
+ }
177
+ } else if (typeof bind[k] === 'object' && bind[k] !== null) {
178
+ if (typeof msg[k] === 'object' && msg[k] !== null) {
179
+ if (!this.bindCheck(bind[k], msg[k])) {
180
+ return false;
181
+ }
182
+ } else {
183
+ return false;
184
+ }
185
+ } else if (!msg[k] || msg[k] !== bind[k]) {
186
+ return false;
187
+ }
188
+ }
189
+ return true;
190
+ }
191
+
192
+ // must be lambda
193
+ onMessage = msg => {
194
+ const event = JSON.parse(msg);
195
+ if (event.type === 'Welcome') {
196
+ _loggerProxy.default.info(`Welcome message from Notifs Websocket`, {
197
+ module: _constants2.AQM_REQS_FILE,
198
+ method: _constants.METHODS.ON_MESSAGE
199
+ });
200
+ return;
201
+ }
202
+ if (event.keepalive === 'true') {
203
+ _loggerProxy.default.info(`Keepalive from web socket`, {
204
+ module: _constants2.AQM_REQS_FILE,
205
+ method: _constants.METHODS.ON_MESSAGE
206
+ });
207
+ return;
208
+ }
209
+ if (event.type === 'AgentReloginFailed') {
210
+ _loggerProxy.default.info('Silently handling the agent relogin fail', {
211
+ module: _constants2.AQM_REQS_FILE,
212
+ method: _constants.METHODS.ON_MESSAGE
213
+ });
214
+ }
215
+ let isHandled = false;
216
+ const kReq = Object.keys(this.pendingRequests);
217
+ for (const thisReq of kReq) {
218
+ const req = this.pendingRequests[thisReq];
219
+ if (req.check(event)) {
220
+ req.handle(event);
221
+ isHandled = true;
222
+ break;
223
+ }
224
+ }
225
+ // pendingNotifCancelrequest stores the secondary bind key, checks for the secondary bind key and handles the event
226
+ const kReqAlt = Object.keys(this.pendingNotifCancelrequest);
227
+ for (const thisReq of kReqAlt) {
228
+ const req = this.pendingNotifCancelrequest[thisReq];
229
+ if (req.check(event)) {
230
+ req.handle(event);
231
+ isHandled = true;
232
+ }
233
+ }
234
+
235
+ // TODO: add event emitter for unhandled events to replicate event.listen or .on
236
+
237
+ if (!isHandled) {
238
+ _loggerProxy.default.info(`event=missingEventHandler | [AqmReqs] missing routing message handler`, {
239
+ module: _constants2.AQM_REQS_FILE,
240
+ method: _constants.METHODS.ON_MESSAGE
241
+ });
242
+ }
243
+ };
244
+ }
245
+ exports.default = AqmReqs;
246
+ //# sourceMappingURL=aqm-reqs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Err","_interopRequireWildcard","require","_types","_loggerProxy","_interopRequireDefault","_constants","_constants2","_WebexRequest","obj","__esModule","default","_getRequireWildcardCache","e","WeakMap","r","t","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","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 LoggerProxy.info(`Keepalive from web socket`, {\n module: AQM_REQS_FILE,\n method: METHODS.ON_MESSAGE,\n });\n\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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"}