@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 @@
1
+ {"version":3,"names":["_types","require","_constants","LoggerProxy","initialize","logger","log","message","context","format","LOGGING_LEVEL","info","warn","trace","error","level","timestamp","Date","toISOString","moduleName","module","methodName","method","interactionId","trackingId","LOG_PREFIX","exports","default"],"sources":["logger-proxy.ts"],"sourcesContent":["import {Logger, LogContext, LOGGING_LEVEL} from './types';\nimport {LOG_PREFIX} from './constants';\n\n/**\n * LoggerProxy acts as a static proxy to route logging calls to an injected logger implementation.\n * Ensures a consistent log format and centralizes logging behavior for the SDK.\n * @ignore\n */\nexport default class LoggerProxy {\n /**\n * The static logger instance to be used by the proxy.\n * @ignore\n */\n public static logger: Logger;\n\n /**\n * Initializes the logger proxy with a provided logger implementation.\n *\n * @param {Logger} logger - A logger object implementing standard logging methods.\n * @ignore\n */\n public static initialize(logger: Logger): void {\n LoggerProxy.logger = logger;\n }\n\n /**\n * Logs a generic message using the default log level.\n *\n * @param {string} message - The log message.\n * @param {LogContext} [context={}] - Optional context providing module and method names.\n * @ignore\n */\n public static log(message: string, context: LogContext = {}): void {\n if (LoggerProxy.logger) {\n LoggerProxy.logger.log(LoggerProxy.format(LOGGING_LEVEL.log, message, context));\n }\n }\n\n /**\n * Logs an informational message.\n *\n * @param {string} message - The log message.\n * @param {LogContext} [context={}] - Optional context providing module and method names.\n * @ignore\n */\n public static info(message: string, context: LogContext = {}): void {\n if (LoggerProxy.logger) {\n LoggerProxy.logger.info(LoggerProxy.format(LOGGING_LEVEL.info, message, context));\n }\n }\n\n /**\n * Logs a warning message.\n *\n * @param {string} message - The warning message.\n * @param {LogContext} [context={}] - Optional context providing module and method names.\n * @ignore\n */\n public static warn(message: string, context: LogContext = {}): void {\n if (LoggerProxy.logger) {\n LoggerProxy.logger.warn(LoggerProxy.format(LOGGING_LEVEL.warn, message, context));\n }\n }\n\n /**\n * Logs a trace-level message, useful for debugging.\n *\n * @param {string} message - The trace message.\n * @param {LogContext} [context={}] - Optional context providing module and method names.\n * @ignore\n */\n public static trace(message: string, context: LogContext = {}): void {\n if (LoggerProxy.logger) {\n LoggerProxy.logger.trace(LoggerProxy.format(LOGGING_LEVEL.trace, message, context));\n }\n }\n\n /**\n * Logs an error message.\n *\n * @param {string} message - The error message.\n * @param {LogContext} [context={}] - Optional context providing module and method names.\n * @ignore\n */\n public static error(message: string, context: LogContext = {}): void {\n if (LoggerProxy.logger) {\n LoggerProxy.logger.error(LoggerProxy.format(LOGGING_LEVEL.error, message, context));\n }\n }\n\n /**\n * Formats a log message with timestamp, log level, and context details.\n *\n * @private\n * @param {LOGGING_LEVEL} level - Logging level (e.g., info, error).\n * @param {string} message - The message to be logged.\n * @param {LogContext} context - Context containing module and method metadata.\n * @returns {string} The formatted log string.\n * @ignore\n */\n private static format(level: LOGGING_LEVEL, message: string, context: LogContext): string {\n const timestamp = new Date().toISOString();\n const moduleName = context.module || 'unknown';\n const methodName = context.method || 'unknown';\n const interactionId = context.interactionId ? ` - interactionId:${context.interactionId}` : '';\n const trackingId = context.trackingId ? ` - trackingId:${context.trackingId}` : '';\n\n return `${timestamp} ${LOG_PREFIX} - [${level}]: module:${moduleName} - method:${methodName}${interactionId}${trackingId} - ${message}`;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,474 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _behavioralEvents = require("./behavioral-events");
8
+ var _loggerProxy = _interopRequireDefault(require("../logger-proxy"));
9
+ var _constants = require("../constants");
10
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11
+ const PRODUCT_NAME_UPPER = _constants.PRODUCT_NAME.toUpperCase();
12
+ /**
13
+ * @class MetricsManager
14
+ * @classdesc Manages the collection, batching, and submission of behavioral, operational, and business metrics for the Webex SDK.
15
+ * Implements a singleton pattern to ensure a single instance throughout the application lifecycle.
16
+ *
17
+ * @remarks
18
+ * This class is responsible for tracking, batching, and submitting various types of metric events.
19
+ * It also provides utility methods for extracting common tracking fields from AQM responses.
20
+ * @ignore
21
+ */
22
+ class MetricsManager {
23
+ /**
24
+ * The Webex SDK instance used for submitting metrics.
25
+ * @private
26
+ */
27
+
28
+ /**
29
+ * Stores currently running timed events.
30
+ * @private
31
+ */
32
+ runningEvents = {};
33
+
34
+ /**
35
+ * Queue for pending behavioral events.
36
+ * @private
37
+ */
38
+ pendingBehavioralEvents = [];
39
+
40
+ /**
41
+ * Queue for pending operational events.
42
+ * @private
43
+ */
44
+ pendingOperationalEvents = [];
45
+
46
+ /**
47
+ * Queue for pending business events.
48
+ * @private
49
+ */
50
+ pendingBusinessEvents = [];
51
+
52
+ /**
53
+ * Indicates if the manager is ready to submit events.
54
+ * @private
55
+ */
56
+ readyToSubmitEvents = false;
57
+
58
+ /**
59
+ * Lock to prevent concurrent submissions.
60
+ * @private
61
+ */
62
+ submittingEvents = false; // Add a lock for submitting events
63
+
64
+ /**
65
+ * Singleton instance of MetricsManager.
66
+ * @private
67
+ */
68
+ /**
69
+ * Flag to disable metrics collection.
70
+ * @private
71
+ */
72
+ metricsDisabled = false; // TODO: SPARK-637285
73
+
74
+ /**
75
+ * Private constructor to enforce singleton pattern.
76
+ * @private
77
+ */
78
+ // eslint-disable-next-line no-useless-constructor
79
+ constructor() {}
80
+
81
+ /**
82
+ * Marks the manager as ready to submit events and triggers submission.
83
+ * @private
84
+ */
85
+ setReadyToSubmitEvents() {
86
+ this.readyToSubmitEvents = true;
87
+ this.submitPendingEvents();
88
+ }
89
+
90
+ /**
91
+ * Submits all pending events if not already submitting.
92
+ * @private
93
+ */
94
+ async submitPendingEvents() {
95
+ if (this.submittingEvents) {
96
+ return;
97
+ }
98
+ this.submittingEvents = true;
99
+ try {
100
+ await this.submitPendingBehavioralEvents();
101
+ await this.submitPendingOperationalEvents();
102
+ await this.submitPendingBusinessEvents();
103
+ } finally {
104
+ this.submittingEvents = false;
105
+ }
106
+ }
107
+
108
+ /**
109
+ * Submits all pending behavioral events if ready.
110
+ * @private
111
+ */
112
+ async submitPendingBehavioralEvents() {
113
+ if (this.pendingBehavioralEvents.length === 0) {
114
+ return;
115
+ }
116
+ if (this.readyToSubmitEvents) {
117
+ const eventsToSubmit = [...this.pendingBehavioralEvents];
118
+ this.pendingBehavioralEvents.length = 0;
119
+ eventsToSubmit.forEach(event => {
120
+ this.webex.internal.newMetrics.submitBehavioralEvent({
121
+ product: event.taxonomy.product,
122
+ agent: event.taxonomy.agent,
123
+ target: event.taxonomy.target,
124
+ verb: event.taxonomy.verb,
125
+ payload: event.payload
126
+ });
127
+ });
128
+ }
129
+ }
130
+
131
+ /**
132
+ * Submits all pending operational events if ready.
133
+ * @private
134
+ */
135
+ async submitPendingOperationalEvents() {
136
+ if (this.pendingOperationalEvents.length === 0) {
137
+ return;
138
+ }
139
+ if (this.readyToSubmitEvents) {
140
+ const eventsToSubmit = [...this.pendingOperationalEvents];
141
+ this.pendingOperationalEvents.length = 0;
142
+ eventsToSubmit.forEach(event => {
143
+ this.webex.internal.newMetrics.submitOperationalEvent({
144
+ name: `${PRODUCT_NAME_UPPER}_${event.name}`,
145
+ payload: event.payload
146
+ });
147
+ });
148
+ }
149
+ }
150
+
151
+ /**
152
+ * Submits all pending business events if ready.
153
+ * @private
154
+ */
155
+ async submitPendingBusinessEvents() {
156
+ if (this.pendingBusinessEvents.length === 0) {
157
+ return;
158
+ }
159
+ if (this.readyToSubmitEvents) {
160
+ const eventsToSubmit = [...this.pendingBusinessEvents];
161
+ this.pendingBusinessEvents.length = 0;
162
+ eventsToSubmit.forEach(event => {
163
+ this.webex.internal.newMetrics.submitBusinessEvent({
164
+ name: `${PRODUCT_NAME_UPPER}_${event.name}`,
165
+ payload: event.payload,
166
+ metadata: {
167
+ appType: _constants.PRODUCT_NAME
168
+ }
169
+ });
170
+ });
171
+ }
172
+ }
173
+
174
+ /**
175
+ * Adds a duration property to the event payload if the event was timed.
176
+ * @param eventName - The name of the event.
177
+ * @param options - Optional event payload.
178
+ * @returns The event payload with duration if applicable.
179
+ * @private
180
+ */
181
+ addDurationIfTimed(eventName, options) {
182
+ const durationKey = 'duration_ms';
183
+ for (const [genericKey, timing] of Object.entries(this.runningEvents)) {
184
+ if (timing.keys.has(eventName)) {
185
+ const startTime = timing.startTime;
186
+ // Remove all keys for this operation.
187
+ delete this.runningEvents[genericKey];
188
+ options = options || {};
189
+ options[durationKey] = Date.now() - startTime;
190
+ return options;
191
+ }
192
+ }
193
+ return options || {};
194
+ }
195
+
196
+ /**
197
+ * Converts spaces in a string to underscores.
198
+ * @param str - The input string.
199
+ * @returns The string with spaces replaced by underscores.
200
+ * @public
201
+ * @example
202
+ * MetricsManager.spacesToUnderscore('my event name'); // 'my_event_name'
203
+ */
204
+ static spacesToUnderscore(str) {
205
+ return str.replace(/ /g, '_');
206
+ }
207
+
208
+ /**
209
+ * Prepares the event payload by removing empty or undefined fields and adding common metadata.
210
+ * @param obj - The original event payload.
211
+ * @returns The cleaned and enriched event payload.
212
+ * @private
213
+ */
214
+ static preparePayload(obj) {
215
+ const payload = {};
216
+ Object.keys(obj).forEach(key => {
217
+ if (obj[key] !== undefined && obj[key] !== null && obj[key] !== '' && !Array.isArray(obj[key]) && !(typeof obj[key] === 'object' && Object.keys(obj[key]).length === 0)) {
218
+ payload[MetricsManager.spacesToUnderscore(key)] = obj[key];
219
+ }
220
+ });
221
+ if (typeof window === 'undefined') {
222
+ return payload;
223
+ }
224
+ const payloadWithCommonMetadata = {
225
+ ...payload
226
+ };
227
+ payloadWithCommonMetadata.tabHidden = document.hidden;
228
+ return payloadWithCommonMetadata;
229
+ }
230
+
231
+ /**
232
+ * Checks if metrics collection is currently disabled.
233
+ * @returns True if metrics are disabled, false otherwise.
234
+ * @private
235
+ */
236
+ isMetricsDisabled() {
237
+ // TODO: SPARK-637285 Need to return true if in development mode to avoid sending metrics to the server
238
+ return this.metricsDisabled;
239
+ }
240
+
241
+ /**
242
+ * Enables or disables metrics collection. Clears pending events if disabled.
243
+ * @param disabled - Whether to disable metrics.
244
+ * @public
245
+ * @example
246
+ * MetricsManager.getInstance().setMetricsDisabled(true);
247
+ */
248
+ setMetricsDisabled(disabled) {
249
+ this.metricsDisabled = disabled;
250
+ if (disabled) {
251
+ this.clearPendingEvents();
252
+ }
253
+ }
254
+
255
+ /**
256
+ * Clears all pending events from the queues.
257
+ * @private
258
+ */
259
+ clearPendingEvents() {
260
+ this.pendingBehavioralEvents.length = 0;
261
+ this.pendingOperationalEvents.length = 0;
262
+ this.pendingBusinessEvents.length = 0;
263
+ }
264
+
265
+ /**
266
+ * Tracks a behavioral event and submits it if possible.
267
+ * @param name - The metric event name.
268
+ * @param options - Optional event payload.
269
+ * @public
270
+ * @example
271
+ * MetricsManager.getInstance().trackBehavioralEvent('AGENT_LOGIN', {agentId: '123'});
272
+ */
273
+ trackBehavioralEvent(name, options) {
274
+ if (this.isMetricsDisabled()) {
275
+ return;
276
+ }
277
+ const taxonomy = (0, _behavioralEvents.getEventTaxonomy)(name);
278
+ const payload = MetricsManager.preparePayload(this.addDurationIfTimed(name, options));
279
+ this.pendingBehavioralEvents.push({
280
+ taxonomy,
281
+ payload
282
+ });
283
+ this.submitPendingBehavioralEvents();
284
+ }
285
+
286
+ /**
287
+ * Tracks an operational event and submits it if possible.
288
+ * @param name - The metric event name.
289
+ * @param options - Optional event payload.
290
+ * @public
291
+ * @example
292
+ * MetricsManager.getInstance().trackOperationalEvent('AGENT_LOGOUT', {agentId: '123'});
293
+ */
294
+ trackOperationalEvent(name, options) {
295
+ if (this.isMetricsDisabled()) {
296
+ return;
297
+ }
298
+ const payload = this.addDurationIfTimed(name, options);
299
+ this.pendingOperationalEvents.push({
300
+ name: MetricsManager.spacesToUnderscore(name).toUpperCase(),
301
+ payload: MetricsManager.preparePayload(payload)
302
+ });
303
+ this.submitPendingOperationalEvents();
304
+ }
305
+
306
+ /**
307
+ * Tracks a business event and submits it if possible.
308
+ * @param name - The metric event name.
309
+ * @param options - Optional event payload.
310
+ * @public
311
+ * @example
312
+ * MetricsManager.getInstance().trackBusinessEvent('AGENT_TRANSFER', {agentId: '123'});
313
+ */
314
+ trackBusinessEvent(name, options) {
315
+ if (this.isMetricsDisabled()) {
316
+ return;
317
+ }
318
+ const payload = this.addDurationIfTimed(name, options);
319
+ this.pendingBusinessEvents.push({
320
+ name: MetricsManager.spacesToUnderscore(name).toUpperCase(),
321
+ payload: MetricsManager.preparePayload(payload)
322
+ });
323
+ this.submitPendingBusinessEvents();
324
+ }
325
+
326
+ /**
327
+ * Tracks an event across one or more metric services.
328
+ * @param name - The metric event name.
329
+ * @param payload - Optional event payload.
330
+ * @param metricServices - Array of metric types to track (default: ['behavioral']).
331
+ * @public
332
+ * @example
333
+ * MetricsManager.getInstance().trackEvent('AGENT_LOGIN', {agentId: '123'}, ['behavioral', 'operational']);
334
+ */
335
+ trackEvent(name, payload, metricServices = ['behavioral']) {
336
+ if (this.isMetricsDisabled()) {
337
+ return;
338
+ }
339
+ for (const metricService of metricServices) {
340
+ switch (metricService) {
341
+ case 'behavioral':
342
+ this.trackBehavioralEvent(name, payload);
343
+ break;
344
+ case 'operational':
345
+ this.trackOperationalEvent(name, payload);
346
+ break;
347
+ case 'business':
348
+ this.trackBusinessEvent(name, payload);
349
+ break;
350
+ default:
351
+ _loggerProxy.default.error(`[MetricsManager] Invalid metric type: ${metricService}`);
352
+ }
353
+ }
354
+ }
355
+
356
+ /**
357
+ * Starts timing for one or more event keys.
358
+ * @param keys - A string or array of strings representing event keys.
359
+ * @public
360
+ * @example
361
+ * MetricsManager.getInstance().timeEvent('AGENT_LOGIN');
362
+ * MetricsManager.getInstance().timeEvent(['AGENT_LOGIN', 'AGENT_LOGOUT']);
363
+ */
364
+ timeEvent(keys) {
365
+ if (this.isMetricsDisabled()) {
366
+ return;
367
+ }
368
+ const keyArray = Array.isArray(keys) ? keys : [keys];
369
+ // Use the first key as the tracking key.
370
+ if (keyArray.length === 0) {
371
+ _loggerProxy.default.error('[MetricsManager] No keys provided for timeEvent');
372
+ return;
373
+ }
374
+ const genericKey = keyArray[0];
375
+ this.runningEvents[genericKey] = {
376
+ startTime: Date.now(),
377
+ keys: new Set(keyArray)
378
+ };
379
+ }
380
+
381
+ /**
382
+ * Sets the Webex SDK instance and marks the manager as ready when the SDK is ready.
383
+ * @param webex - The Webex SDK instance.
384
+ * @private
385
+ */
386
+ setWebex(webex) {
387
+ this.webex = webex;
388
+ if (this.webex.ready) {
389
+ this.setReadyToSubmitEvents();
390
+ }
391
+ this.webex.once('ready', () => {
392
+ this.setReadyToSubmitEvents();
393
+ });
394
+ }
395
+
396
+ /**
397
+ * Returns the singleton instance of MetricsManager, initializing it if necessary.
398
+ * @param options - Optional object containing the Webex SDK instance.
399
+ * @returns The singleton MetricsManager instance.
400
+ * @public
401
+ * @example
402
+ * const metrics = MetricsManager.getInstance({webex});
403
+ */
404
+ static getInstance(options) {
405
+ if (!MetricsManager.instance) {
406
+ MetricsManager.instance = new MetricsManager();
407
+ }
408
+ if (!MetricsManager.instance.webex && options && options.webex) {
409
+ MetricsManager.instance.setWebex(options.webex);
410
+ }
411
+ return MetricsManager.instance;
412
+ }
413
+
414
+ /**
415
+ * Resets the singleton instance of MetricsManager. Useful for testing.
416
+ * @public
417
+ * @example
418
+ * MetricsManager.resetInstance();
419
+ */
420
+ static resetInstance() {
421
+ MetricsManager.instance = undefined;
422
+ }
423
+
424
+ /**
425
+ * Extracts common tracking fields from an AQM response object.
426
+ * @param response - The AQM response object.
427
+ * @returns An object containing common tracking fields.
428
+ * @public
429
+ * @example
430
+ * const fields = MetricsManager.getCommonTrackingFieldForAQMResponse(response);
431
+ */
432
+ static getCommonTrackingFieldForAQMResponse(response) {
433
+ // This method is used to extract common tracking fields from the AQM response
434
+ // and return them as an object. The fields are extracted from the response
435
+ // object and its data property.
436
+ const fields = {
437
+ agentId: response?.data?.agentId || response?.agentId,
438
+ agentSessionId: response?.data?.agentSessionId || response?.agentSessionId,
439
+ teamId: response?.teamId ?? response?.data?.teamId ?? undefined,
440
+ siteId: response?.data?.siteId || response?.siteId,
441
+ orgId: response?.data?.orgId || response?.orgId,
442
+ eventType: response?.type,
443
+ trackingId: response?.data?.trackingId,
444
+ notifTrackingId: response?.trackingId
445
+ };
446
+ return fields;
447
+ }
448
+
449
+ /**
450
+ * Extracts common tracking fields from an AQM failure response object.
451
+ * @param failureResponse - The AQM failure response object.
452
+ * @returns An object containing common tracking fields for failures.
453
+ * @public
454
+ * @example
455
+ * const fields = MetricsManager.getCommonTrackingFieldForAQMResponseFailed(failureResponse);
456
+ */
457
+ static getCommonTrackingFieldForAQMResponseFailed(failureResponse) {
458
+ // This method is used to extract common tracking fields from the AQM response failure
459
+ // and return them as an object. The fields are extracted from the response
460
+ // object and its data property.
461
+ const fields = {
462
+ agentId: failureResponse?.data?.agentId,
463
+ trackingId: failureResponse?.trackingId,
464
+ notifTrackingId: failureResponse?.trackingId,
465
+ orgId: failureResponse?.orgId,
466
+ failureType: failureResponse?.type,
467
+ failureReason: failureResponse?.data?.reason,
468
+ reasonCode: failureResponse?.data?.reasonCode
469
+ };
470
+ return fields;
471
+ }
472
+ }
473
+ exports.default = MetricsManager;
474
+ //# sourceMappingURL=MetricsManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_behavioralEvents","require","_loggerProxy","_interopRequireDefault","_constants","obj","__esModule","default","PRODUCT_NAME_UPPER","PRODUCT_NAME","toUpperCase","MetricsManager","runningEvents","pendingBehavioralEvents","pendingOperationalEvents","pendingBusinessEvents","readyToSubmitEvents","submittingEvents","metricsDisabled","constructor","setReadyToSubmitEvents","submitPendingEvents","submitPendingBehavioralEvents","submitPendingOperationalEvents","submitPendingBusinessEvents","length","eventsToSubmit","forEach","event","webex","internal","newMetrics","submitBehavioralEvent","product","taxonomy","agent","target","verb","payload","submitOperationalEvent","name","submitBusinessEvent","metadata","appType","addDurationIfTimed","eventName","options","durationKey","genericKey","timing","Object","entries","keys","has","startTime","Date","now","spacesToUnderscore","str","replace","preparePayload","key","undefined","Array","isArray","window","payloadWithCommonMetadata","tabHidden","document","hidden","isMetricsDisabled","setMetricsDisabled","disabled","clearPendingEvents","trackBehavioralEvent","getEventTaxonomy","push","trackOperationalEvent","trackBusinessEvent","trackEvent","metricServices","metricService","LoggerProxy","error","timeEvent","keyArray","Set","setWebex","ready","once","getInstance","instance","resetInstance","getCommonTrackingFieldForAQMResponse","response","fields","agentId","data","agentSessionId","teamId","siteId","orgId","eventType","type","trackingId","notifTrackingId","getCommonTrackingFieldForAQMResponseFailed","failureResponse","failureType","failureReason","reason","reasonCode","exports"],"sources":["MetricsManager.ts"],"sourcesContent":["import {\n EventPayload,\n MetricEventAgent,\n MetricEventProduct,\n MetricEventVerb,\n} from '@webex/internal-plugin-metrics/src/metrics.types';\n\nimport {WebexSDK} from '../types';\nimport {BehavioralEventTaxonomy, getEventTaxonomy} from './behavioral-events';\nimport LoggerProxy from '../logger-proxy';\nimport {METRIC_EVENT_NAMES} from './constants';\nimport {Failure} from '../services/core/GlobalTypes';\nimport {PRODUCT_NAME} from '../constants';\n\ntype BehavioralEvent = {\n taxonomy: BehavioralEventTaxonomy;\n payload: EventPayload;\n};\n\ntype GenericEvent = {\n name: string;\n payload: EventPayload;\n};\n\nexport type MetricsType = 'behavioral' | 'operational' | 'business';\n\nconst PRODUCT_NAME_UPPER = PRODUCT_NAME.toUpperCase();\n/**\n * @class MetricsManager\n * @classdesc Manages the collection, batching, and submission of behavioral, operational, and business metrics for the Webex SDK.\n * Implements a singleton pattern to ensure a single instance throughout the application lifecycle.\n *\n * @remarks\n * This class is responsible for tracking, batching, and submitting various types of metric events.\n * It also provides utility methods for extracting common tracking fields from AQM responses.\n * @ignore\n */\nexport default class MetricsManager {\n /**\n * The Webex SDK instance used for submitting metrics.\n * @private\n */\n private webex: WebexSDK;\n\n /**\n * Stores currently running timed events.\n * @private\n */\n private readonly runningEvents: Record<string, {startTime: number; keys: Set<string>}> = {};\n\n /**\n * Queue for pending behavioral events.\n * @private\n */\n private pendingBehavioralEvents: BehavioralEvent[] = [];\n\n /**\n * Queue for pending operational events.\n * @private\n */\n private pendingOperationalEvents: GenericEvent[] = [];\n\n /**\n * Queue for pending business events.\n * @private\n */\n private pendingBusinessEvents: GenericEvent[] = [];\n\n /**\n * Indicates if the manager is ready to submit events.\n * @private\n */\n private readyToSubmitEvents = false;\n\n /**\n * Lock to prevent concurrent submissions.\n * @private\n */\n private submittingEvents = false; // Add a lock for submitting events\n\n /**\n * Singleton instance of MetricsManager.\n * @private\n */\n private static instance: MetricsManager;\n\n /**\n * Flag to disable metrics collection.\n * @private\n */\n private metricsDisabled = false; // TODO: SPARK-637285\n\n /**\n * Private constructor to enforce singleton pattern.\n * @private\n */\n // eslint-disable-next-line no-useless-constructor\n private constructor() {}\n\n /**\n * Marks the manager as ready to submit events and triggers submission.\n * @private\n */\n private setReadyToSubmitEvents() {\n this.readyToSubmitEvents = true;\n this.submitPendingEvents();\n }\n\n /**\n * Submits all pending events if not already submitting.\n * @private\n */\n private async submitPendingEvents() {\n if (this.submittingEvents) {\n return;\n }\n this.submittingEvents = true;\n try {\n await this.submitPendingBehavioralEvents();\n await this.submitPendingOperationalEvents();\n await this.submitPendingBusinessEvents();\n } finally {\n this.submittingEvents = false;\n }\n }\n\n /**\n * Submits all pending behavioral events if ready.\n * @private\n */\n private async submitPendingBehavioralEvents() {\n if (this.pendingBehavioralEvents.length === 0) {\n return;\n }\n if (this.readyToSubmitEvents) {\n const eventsToSubmit = [...this.pendingBehavioralEvents];\n this.pendingBehavioralEvents.length = 0;\n eventsToSubmit.forEach((event) => {\n this.webex.internal.newMetrics.submitBehavioralEvent({\n product: event.taxonomy.product as MetricEventProduct,\n agent: event.taxonomy.agent as MetricEventAgent,\n target: event.taxonomy.target,\n verb: event.taxonomy.verb as MetricEventVerb,\n payload: event.payload,\n });\n });\n }\n }\n\n /**\n * Submits all pending operational events if ready.\n * @private\n */\n private async submitPendingOperationalEvents() {\n if (this.pendingOperationalEvents.length === 0) {\n return;\n }\n if (this.readyToSubmitEvents) {\n const eventsToSubmit = [...this.pendingOperationalEvents];\n this.pendingOperationalEvents.length = 0;\n eventsToSubmit.forEach((event) => {\n this.webex.internal.newMetrics.submitOperationalEvent({\n name: `${PRODUCT_NAME_UPPER}_${event.name}`,\n payload: event.payload,\n });\n });\n }\n }\n\n /**\n * Submits all pending business events if ready.\n * @private\n */\n private async submitPendingBusinessEvents() {\n if (this.pendingBusinessEvents.length === 0) {\n return;\n }\n if (this.readyToSubmitEvents) {\n const eventsToSubmit = [...this.pendingBusinessEvents];\n this.pendingBusinessEvents.length = 0;\n eventsToSubmit.forEach((event) => {\n this.webex.internal.newMetrics.submitBusinessEvent({\n name: `${PRODUCT_NAME_UPPER}_${event.name}`,\n payload: event.payload,\n metadata: {\n appType: PRODUCT_NAME,\n },\n });\n });\n }\n }\n\n /**\n * Adds a duration property to the event payload if the event was timed.\n * @param eventName - The name of the event.\n * @param options - Optional event payload.\n * @returns The event payload with duration if applicable.\n * @private\n */\n private addDurationIfTimed(eventName: string, options?: EventPayload): EventPayload {\n const durationKey = 'duration_ms';\n for (const [genericKey, timing] of Object.entries(this.runningEvents)) {\n if (timing.keys.has(eventName)) {\n const startTime = timing.startTime;\n // Remove all keys for this operation.\n delete this.runningEvents[genericKey];\n options = options || {};\n options[durationKey] = Date.now() - startTime;\n\n return options;\n }\n }\n\n return options || {};\n }\n\n /**\n * Converts spaces in a string to underscores.\n * @param str - The input string.\n * @returns The string with spaces replaced by underscores.\n * @public\n * @example\n * MetricsManager.spacesToUnderscore('my event name'); // 'my_event_name'\n */\n static spacesToUnderscore(str: string): string {\n return str.replace(/ /g, '_');\n }\n\n /**\n * Prepares the event payload by removing empty or undefined fields and adding common metadata.\n * @param obj - The original event payload.\n * @returns The cleaned and enriched event payload.\n * @private\n */\n private static preparePayload(obj: EventPayload): EventPayload {\n const payload: EventPayload = {};\n\n Object.keys(obj).forEach((key) => {\n if (\n obj[key] !== undefined &&\n obj[key] !== null &&\n obj[key] !== '' &&\n !Array.isArray(obj[key]) &&\n !(typeof obj[key] === 'object' && Object.keys(obj[key]).length === 0)\n ) {\n payload[MetricsManager.spacesToUnderscore(key)] = obj[key];\n }\n });\n\n if (typeof window === 'undefined') {\n return payload;\n }\n\n const payloadWithCommonMetadata = {...payload};\n payloadWithCommonMetadata.tabHidden = document.hidden;\n\n return payloadWithCommonMetadata;\n }\n\n /**\n * Checks if metrics collection is currently disabled.\n * @returns True if metrics are disabled, false otherwise.\n * @private\n */\n private isMetricsDisabled(): boolean {\n // TODO: SPARK-637285 Need to return true if in development mode to avoid sending metrics to the server\n return this.metricsDisabled;\n }\n\n /**\n * Enables or disables metrics collection. Clears pending events if disabled.\n * @param disabled - Whether to disable metrics.\n * @public\n * @example\n * MetricsManager.getInstance().setMetricsDisabled(true);\n */\n public setMetricsDisabled(disabled: boolean) {\n this.metricsDisabled = disabled;\n if (disabled) {\n this.clearPendingEvents();\n }\n }\n\n /**\n * Clears all pending events from the queues.\n * @private\n */\n private clearPendingEvents() {\n this.pendingBehavioralEvents.length = 0;\n this.pendingOperationalEvents.length = 0;\n this.pendingBusinessEvents.length = 0;\n }\n\n /**\n * Tracks a behavioral event and submits it if possible.\n * @param name - The metric event name.\n * @param options - Optional event payload.\n * @public\n * @example\n * MetricsManager.getInstance().trackBehavioralEvent('AGENT_LOGIN', {agentId: '123'});\n */\n public trackBehavioralEvent(name: METRIC_EVENT_NAMES, options?: EventPayload) {\n if (this.isMetricsDisabled()) {\n return;\n }\n\n const taxonomy = getEventTaxonomy(name);\n\n const payload = MetricsManager.preparePayload(this.addDurationIfTimed(name, options));\n\n this.pendingBehavioralEvents.push({taxonomy, payload});\n this.submitPendingBehavioralEvents();\n }\n\n /**\n * Tracks an operational event and submits it if possible.\n * @param name - The metric event name.\n * @param options - Optional event payload.\n * @public\n * @example\n * MetricsManager.getInstance().trackOperationalEvent('AGENT_LOGOUT', {agentId: '123'});\n */\n public trackOperationalEvent(name: METRIC_EVENT_NAMES, options?: EventPayload) {\n if (this.isMetricsDisabled()) {\n return;\n }\n\n const payload = this.addDurationIfTimed(name, options);\n this.pendingOperationalEvents.push({\n name: MetricsManager.spacesToUnderscore(name).toUpperCase(),\n payload: MetricsManager.preparePayload(payload),\n });\n this.submitPendingOperationalEvents();\n }\n\n /**\n * Tracks a business event and submits it if possible.\n * @param name - The metric event name.\n * @param options - Optional event payload.\n * @public\n * @example\n * MetricsManager.getInstance().trackBusinessEvent('AGENT_TRANSFER', {agentId: '123'});\n */\n public trackBusinessEvent(name: METRIC_EVENT_NAMES, options?: EventPayload) {\n if (this.isMetricsDisabled()) {\n return;\n }\n\n const payload = this.addDurationIfTimed(name, options);\n this.pendingBusinessEvents.push({\n name: MetricsManager.spacesToUnderscore(name).toUpperCase(),\n payload: MetricsManager.preparePayload(payload),\n });\n this.submitPendingBusinessEvents();\n }\n\n /**\n * Tracks an event across one or more metric services.\n * @param name - The metric event name.\n * @param payload - Optional event payload.\n * @param metricServices - Array of metric types to track (default: ['behavioral']).\n * @public\n * @example\n * MetricsManager.getInstance().trackEvent('AGENT_LOGIN', {agentId: '123'}, ['behavioral', 'operational']);\n */\n public trackEvent(\n name: METRIC_EVENT_NAMES,\n payload?: EventPayload,\n metricServices: MetricsType[] = ['behavioral']\n ) {\n if (this.isMetricsDisabled()) {\n return;\n }\n\n for (const metricService of metricServices) {\n switch (metricService) {\n case 'behavioral':\n this.trackBehavioralEvent(name, payload);\n break;\n case 'operational':\n this.trackOperationalEvent(name, payload);\n break;\n case 'business':\n this.trackBusinessEvent(name, payload);\n break;\n default:\n LoggerProxy.error(`[MetricsManager] Invalid metric type: ${metricService}`);\n }\n }\n }\n\n /**\n * Starts timing for one or more event keys.\n * @param keys - A string or array of strings representing event keys.\n * @public\n * @example\n * MetricsManager.getInstance().timeEvent('AGENT_LOGIN');\n * MetricsManager.getInstance().timeEvent(['AGENT_LOGIN', 'AGENT_LOGOUT']);\n */\n public timeEvent(keys: string | string[]) {\n if (this.isMetricsDisabled()) {\n return;\n }\n const keyArray = Array.isArray(keys) ? keys : [keys];\n // Use the first key as the tracking key.\n if (keyArray.length === 0) {\n LoggerProxy.error('[MetricsManager] No keys provided for timeEvent');\n\n return;\n }\n const genericKey = keyArray[0];\n this.runningEvents[genericKey] = {startTime: Date.now(), keys: new Set(keyArray)};\n }\n\n /**\n * Sets the Webex SDK instance and marks the manager as ready when the SDK is ready.\n * @param webex - The Webex SDK instance.\n * @private\n */\n private setWebex(webex: WebexSDK) {\n this.webex = webex;\n if (this.webex.ready) {\n this.setReadyToSubmitEvents();\n }\n this.webex.once('ready', () => {\n this.setReadyToSubmitEvents();\n });\n }\n\n /**\n * Returns the singleton instance of MetricsManager, initializing it if necessary.\n * @param options - Optional object containing the Webex SDK instance.\n * @returns The singleton MetricsManager instance.\n * @public\n * @example\n * const metrics = MetricsManager.getInstance({webex});\n */\n public static getInstance(options?: {webex: WebexSDK}): MetricsManager {\n if (!MetricsManager.instance) {\n MetricsManager.instance = new MetricsManager();\n }\n\n if (!MetricsManager.instance.webex && options && options.webex) {\n MetricsManager.instance.setWebex(options.webex);\n }\n\n return MetricsManager.instance;\n }\n\n /**\n * Resets the singleton instance of MetricsManager. Useful for testing.\n * @public\n * @example\n * MetricsManager.resetInstance();\n */\n public static resetInstance() {\n MetricsManager.instance = undefined;\n }\n\n /**\n * Extracts common tracking fields from an AQM response object.\n * @param response - The AQM response object.\n * @returns An object containing common tracking fields.\n * @public\n * @example\n * const fields = MetricsManager.getCommonTrackingFieldForAQMResponse(response);\n */\n public static getCommonTrackingFieldForAQMResponse(response: any): Record<string, any> {\n // This method is used to extract common tracking fields from the AQM response\n // and return them as an object. The fields are extracted from the response\n // object and its data property.\n const fields = {\n agentId: response?.data?.agentId || response?.agentId,\n agentSessionId: response?.data?.agentSessionId || response?.agentSessionId,\n teamId: response?.teamId ?? response?.data?.teamId ?? undefined,\n siteId: response?.data?.siteId || response?.siteId,\n orgId: response?.data?.orgId || response?.orgId,\n eventType: response?.type,\n trackingId: response?.data?.trackingId,\n notifTrackingId: response?.trackingId,\n };\n\n return fields;\n }\n\n /**\n * Extracts common tracking fields from an AQM failure response object.\n * @param failureResponse - The AQM failure response object.\n * @returns An object containing common tracking fields for failures.\n * @public\n * @example\n * const fields = MetricsManager.getCommonTrackingFieldForAQMResponseFailed(failureResponse);\n */\n public static getCommonTrackingFieldForAQMResponseFailed(\n failureResponse: Failure\n ): Record<string, any> {\n // This method is used to extract common tracking fields from the AQM response failure\n // and return them as an object. The fields are extracted from the response\n // object and its data property.\n const fields = {\n agentId: failureResponse?.data?.agentId,\n trackingId: failureResponse?.trackingId,\n notifTrackingId: failureResponse?.trackingId,\n orgId: failureResponse?.orgId,\n failureType: failureResponse?.type,\n failureReason: failureResponse?.data?.reason,\n reasonCode: failureResponse?.data?.reasonCode,\n };\n\n return fields;\n }\n}\n"],"mappings":"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"}