@webex/internal-plugin-metrics 3.12.0 → 3.13.0-next.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/.repo-context.json +466 -0
  2. package/.sdd/manifest.json +626 -0
  3. package/AGENTS.md +208 -0
  4. package/README.md +274 -0
  5. package/dist/automated-user.js +19 -0
  6. package/dist/automated-user.js.map +1 -0
  7. package/dist/batcher.js +3 -0
  8. package/dist/batcher.js.map +1 -1
  9. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +639 -66
  10. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -1
  11. package/dist/call-diagnostic/call-diagnostic-metrics.js +240 -103
  12. package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -1
  13. package/dist/call-diagnostic/call-diagnostic-metrics.util.js +7 -2
  14. package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -1
  15. package/dist/call-diagnostic/config.js +19 -4
  16. package/dist/call-diagnostic/config.js.map +1 -1
  17. package/dist/config.js +8 -0
  18. package/dist/config.js.map +1 -1
  19. package/dist/index.js +25 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/metrics.js +118 -5
  22. package/dist/metrics.js.map +1 -1
  23. package/dist/metrics.types.js +4 -0
  24. package/dist/metrics.types.js.map +1 -1
  25. package/dist/network-telemetry.js +610 -0
  26. package/dist/network-telemetry.js.map +1 -0
  27. package/dist/new-metrics.js +63 -17
  28. package/dist/new-metrics.js.map +1 -1
  29. package/dist/privacy-and-security-permission-enricher/constants.js +18 -0
  30. package/dist/privacy-and-security-permission-enricher/constants.js.map +1 -0
  31. package/dist/privacy-and-security-permission-enricher/index.js +143 -0
  32. package/dist/privacy-and-security-permission-enricher/index.js.map +1 -0
  33. package/dist/privacy-and-security-permission-enricher/types.js +7 -0
  34. package/dist/privacy-and-security-permission-enricher/types.js.map +1 -0
  35. package/dist/privacy-and-security-permission-enricher/utils.js +71 -0
  36. package/dist/privacy-and-security-permission-enricher/utils.js.map +1 -0
  37. package/dist/types/automated-user.d.ts +2 -0
  38. package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +208 -5
  39. package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +83 -17
  40. package/dist/types/call-diagnostic/config.d.ts +6 -0
  41. package/dist/types/config.d.ts +9 -0
  42. package/dist/types/index.d.ts +5 -3
  43. package/dist/types/metrics.types.d.ts +11 -5
  44. package/dist/types/network-telemetry.d.ts +108 -0
  45. package/dist/types/new-metrics.d.ts +17 -1
  46. package/dist/types/privacy-and-security-permission-enricher/constants.d.ts +6 -0
  47. package/dist/types/privacy-and-security-permission-enricher/index.d.ts +40 -0
  48. package/dist/types/privacy-and-security-permission-enricher/types.d.ts +14 -0
  49. package/dist/types/privacy-and-security-permission-enricher/utils.d.ts +5 -0
  50. package/dist/types/unhandled-exception-telemetry/index.d.ts +60 -0
  51. package/dist/types/unhandled-exception-telemetry/utils.d.ts +6 -0
  52. package/dist/unhandled-exception-telemetry/index.js +331 -0
  53. package/dist/unhandled-exception-telemetry/index.js.map +1 -0
  54. package/dist/unhandled-exception-telemetry/utils.js +105 -0
  55. package/dist/unhandled-exception-telemetry/utils.js.map +1 -0
  56. package/docs/adr/index.md +27 -0
  57. package/docs/architecture.md +437 -0
  58. package/docs/getting-started.md +131 -0
  59. package/docs/index.md +52 -0
  60. package/docs/specs/README.md +88 -0
  61. package/package.json +12 -11
  62. package/schemas/repo-context.schema.json +796 -0
  63. package/src/automated-user.ts +16 -0
  64. package/src/batcher.js +4 -0
  65. package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +801 -74
  66. package/src/call-diagnostic/call-diagnostic-metrics.ts +184 -42
  67. package/src/call-diagnostic/call-diagnostic-metrics.util.ts +7 -1
  68. package/src/call-diagnostic/config.ts +16 -0
  69. package/src/call-diagnostic/docs/README.md +535 -0
  70. package/src/config.js +8 -0
  71. package/src/docs/README.md +703 -0
  72. package/src/index.ts +16 -0
  73. package/src/metrics.js +123 -5
  74. package/src/metrics.types.ts +29 -6
  75. package/src/network-telemetry.ts +757 -0
  76. package/src/new-metrics.ts +56 -6
  77. package/src/privacy-and-security-permission-enricher/constants.ts +33 -0
  78. package/src/privacy-and-security-permission-enricher/docs/README.md +356 -0
  79. package/src/privacy-and-security-permission-enricher/index.ts +142 -0
  80. package/src/privacy-and-security-permission-enricher/types.ts +21 -0
  81. package/src/privacy-and-security-permission-enricher/utils.ts +82 -0
  82. package/src/rtcMetrics/docs/README.md +447 -0
  83. package/src/unhandled-exception-telemetry/docs/README.md +536 -0
  84. package/src/unhandled-exception-telemetry/index.ts +404 -0
  85. package/src/unhandled-exception-telemetry/utils.ts +101 -0
  86. package/test/unit/spec/automated-user.ts +43 -0
  87. package/test/unit/spec/batcher.js +43 -0
  88. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +14 -2
  89. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +1435 -304
  90. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +1265 -207
  91. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +27 -0
  92. package/test/unit/spec/metrics.js +14 -5
  93. package/test/unit/spec/network-telemetry.ts +610 -0
  94. package/test/unit/spec/new-metrics.ts +203 -50
  95. package/test/unit/spec/prelogin-metrics-batcher.ts +71 -36
  96. package/test/unit/spec/privacy-and-security-permission-enricher.ts +318 -0
  97. package/test/unit/spec/unhandled-exception-telemetry/utils.ts +109 -0
  98. package/test/unit/spec/unhandled-exception-telemetry.ts +689 -0
@@ -18,6 +18,7 @@ type GetIdentifiersOptions = {
18
18
  preLoginId?: string;
19
19
  globalMeetingId?: string;
20
20
  webexConferenceIdStr?: string;
21
+ locusCluster?: string;
21
22
  };
22
23
  /**
23
24
  * @description Util class to handle Call Analyzer Metrics
@@ -27,7 +28,7 @@ type GetIdentifiersOptions = {
27
28
  export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
28
29
  private callDiagnosticEventsBatcher;
29
30
  private preLoginMetricsBatcher;
30
- private logger;
31
+ private get logger();
31
32
  private hasLoggedBrowserSerial;
32
33
  private device;
33
34
  private delayedClientEvents;
@@ -36,6 +37,8 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
36
37
  private isMercuryConnected;
37
38
  private eventLimitTracker;
38
39
  private eventLimitWarningsLogged;
40
+ private isTelemetryOptOutManual;
41
+ private isTelemetryOptOutAutomatic;
39
42
  validator: (options: {
40
43
  type: 'mqe' | 'ce';
41
44
  event: Event;
@@ -53,6 +56,29 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
53
56
  * @returns one of 'login-ci','unverified-guest', null
54
57
  */
55
58
  getCurLoginType(): "unverified-guest" | "login-ci";
59
+ /**
60
+ * Returns the user activation state reported from the browser's navigator.userActivation API
61
+ * @returns object with hasBeenActive and isActive booleans, or undefined if unavailable
62
+ */
63
+ getUserActivation(): {
64
+ hasBeenActive: boolean;
65
+ isActive: boolean;
66
+ } | undefined;
67
+ /**
68
+ * Returns the telemetryOptOut value of the current user
69
+ * @returns one of 'manual', 'automatic', undefined
70
+ */
71
+ getTelemetryOptOut(): "manual" | "automatic";
72
+ /**
73
+ * Sets the manual telemetry opt-out status for the current user
74
+ * @param value - boolean value indicating manual telemetry opt-out status
75
+ */
76
+ setIsTelemetryOptOutManual(value: boolean): void;
77
+ /**
78
+ * Sets the automatic telemetry opt-out status for the current user
79
+ * @param value - boolean value indicating automatic telemetry opt-out status
80
+ */
81
+ setIsTelemetryOptOutAutomatic(value: boolean): void;
56
82
  /**
57
83
  * Returns if the meeting has converged architecture enabled
58
84
  * @param options.meetingId
@@ -84,6 +110,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
84
110
  userAgent: string;
85
111
  buildType?: "debug" | "test" | "prod" | "tap" | "analyzer-test";
86
112
  upgradeChannel?: string;
113
+ upgradeSource?: string;
87
114
  instanceId?: string;
88
115
  networkType: "wifi" | "ethernet" | "cellular" | "unknown";
89
116
  localIP?: string;
@@ -106,6 +133,8 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
106
133
  urlProtocolLaunchMethod?: "manual" | "auto" | "extension-fallback";
107
134
  browser?: string;
108
135
  browserVersion?: string;
136
+ isSupportedBrowserFamily?: boolean;
137
+ isOutdatedBrowserVersion?: boolean;
109
138
  clientType?: "MEETING_CENTER" | "EVENT_CENTER" | "TRAINING_CENTER" | "TEAMS_CLIENT" | "TEAMS_DEVICE" | "TEAMS_SHARE" | "SIP" | "RECORDING" | "CLOUD_AWARE_SIP" | "TEAMS_WXC_CLIENT" | "WXC_CLIENT" | "WXC_DEVICE" | "WEBEX_JS_SDK" | "VOICEA_CLIENT" | "CISCO_SIP_GW" | "WEBEX_SDK" | "CPAAS_THIRD_PARTY_SDK" | "WXC_THIRD_PARTY" | "WXCC" | "TEAMS_PHONE" | "WEBEX_RELAY";
110
139
  subClientType?: "TEAMS_DEVICE" | "SIP" | "AUTOMOTIVE_APP" | "BROWSER_EXTENSION" | "DESKTOP_APP" | "DESKTOP_APP_VDI" | "DEVICE_CURRENT" | "DEVICE_LEGACY_2020" | "HOLOGRAM_HEADSET_APP" | "HVDI_APP" | "MIXED" | "MOBILE_APP" | "MOBILE_NETWORK" | "PAGE" | "VDI_APP" | "WEB_APP" | "PHONE_NOVUM" | "PHONE_ESPRESSO" | "PHONE_BUMBLEBEE" | "SIP_PSTN";
111
140
  schedulingClientType?: "TEAMS_CLIENT" | "GOOGLE_ADDON" | "PT" | "PUBLIC_API" | "UNIFIED_PAGE" | "WEBEX_PAGE" | "GOOGLE_NOTIFICATION_CALENDAR" | "MSFT_NOTIFICATION_ADDIN" | "MSFT_NOTIFICATION_CALENDAR" | "OUTLOOK_ADDIN";
@@ -113,6 +142,10 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
113
142
  clientVersionStatus?: "CURRENT" | "LEGACY" | "UNSUPPORTED";
114
143
  localClientVersion?: string;
115
144
  launcherVersion?: string;
145
+ installerVersion?: string;
146
+ installerMajorVersion?: number;
147
+ installerMinorVersion?: number;
148
+ installerRevision?: number;
116
149
  modelNumber?: string;
117
150
  joinFirstUpdateLater?: "ep-enabled" | "sp-enabled" | "not-enabled";
118
151
  standbyUsed?: boolean;
@@ -137,11 +170,12 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
137
170
  architecture: "unknown" | "intel32" | "intel64" | "amd32" | "amd64" | "arm32" | "arm64" | "armv9" | "armv8" | "armv7" | "armv6" | "x86_64" | "x86_32";
138
171
  staticPerformance?: string;
139
172
  clockSpeedGigaHertz?: number;
140
- additionalProperties?: false;
173
+ additionalProperties?: never;
141
174
  };
142
175
  shareType?: "cb-normal-share" | "ce-airplay-share" | "ce-direct-share" | "ce-gui-loopback-share" | "ce-input-source-share" | "ce-input-source-share-hdmi" | "ce-input-source-share-usbc" | "ce-jpg-share" | "ce-miracast-share" | "mcs-normal-share" | "mcs-normal-audio-share" | "mcs-hfps-share" | "mcs-hfps-audio-share";
143
176
  videoDisplayMode?: "grid-view" | "active-speaker-view";
144
- videoLayoutType?: "stack" | "stackWithShare" | "sideBySide" | "sideBySideWithShare" | "grid" | "floatingActive" | "floatingThumbnail" | "floatingGrid" | "overlay" | "focus" | "prominent" | "focusWithShare" | "prominentWithShare" | "equal" | "equalWithShare" | "largeGallery";
177
+ videoLayoutType?: "auto" | "stack" | "stackWithShare" | "sideBySide" | "sideBySideWithShare" | "grid" | "floatingActive" | "floatingThumbnail" | "floatingGrid" | "overlay" | "focus" | "prominent" | "focusWithShare" | "prominentWithShare" | "equal" | "equalWithShare" | "largeGallery" | "autoWithShare";
178
+ appliedLayout?: "auto" | "stack" | "stackWithShare" | "sideBySide" | "sideBySideWithShare" | "grid" | "floatingActive" | "floatingThumbnail" | "floatingGrid" | "overlay" | "focus" | "prominent" | "focusWithShare" | "prominentWithShare" | "equal" | "equalWithShare" | "largeGallery" | "autoWithShare";
145
179
  videoRenderType?: "wme" | "client_d3d" | "client_gdi";
146
180
  vdiInfo?: {};
147
181
  is64BitsClient?: boolean;
@@ -153,14 +187,31 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
153
187
  vendorId?: string;
154
188
  staticPerformanceLevel?: string;
155
189
  staticPerformanceScore?: number;
156
- additionalProperties?: false;
190
+ preInstalledTime?: string;
191
+ preInstalledType?: "installer" | "launcher" | "app";
192
+ preInstalledVersion?: string;
193
+ additionalProperties?: never;
194
+ };
195
+ installerInfo?: {
196
+ packageSuffix?: string;
197
+ packageArch?: string;
198
+ launchId?: string;
199
+ packageCount?: number;
200
+ totalSize?: number;
201
+ additionalProperties?: never;
157
202
  };
158
203
  emmVendorId?: string;
159
204
  isHybridMedia?: boolean;
160
205
  originData?: {};
161
206
  serviceVersion?: string;
162
- additionalProperties?: false;
207
+ additionalProperties?: never;
163
208
  };
209
+ /**
210
+ * Returns the signed-in user's CI ID derived from credentials tokens.
211
+ * Used as a fallback when no device is registered.
212
+ * @returns the userId, or undefined if it can't be determined
213
+ */
214
+ private getUserIdFromCredentials;
164
215
  /**
165
216
  * Gather identifier details for call diagnostic payload.
166
217
  * @throws Error if initialization fails.
@@ -172,6 +223,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
172
223
  participantId?: string;
173
224
  breakoutGroupId?: string;
174
225
  breakoutMoveId?: string;
226
+ breakoutTrackingId?: string;
175
227
  breakoutSessionId?: string;
176
228
  browserId?: string;
177
229
  ciExchangeTokenUrl?: string;
@@ -183,7 +235,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
183
235
  imiAppId: string;
184
236
  sessionId: string;
185
237
  sessionInstanceId: string;
186
- additionalProperties?: false;
238
+ additionalProperties?: never;
187
239
  };
188
240
  csdmDeviceUrl?: string;
189
241
  destinationBreakoutSessionId?: string;
@@ -199,6 +251,8 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
199
251
  ivrId?: string;
200
252
  callId?: string;
201
253
  pairCallId?: string;
254
+ llmWebsocketUrl?: string;
255
+ locusCluster?: string;
202
256
  locusId?: string;
203
257
  locusJoinUrl?: string;
204
258
  locusSessionId?: string;
@@ -212,9 +266,11 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
212
266
  meetingLookupUrl?: string;
213
267
  meetingOrgId?: string;
214
268
  metricServiceUrl?: string;
269
+ mercuryWebsocketUrl?: string;
215
270
  msteamsTenantGuid?: string;
216
271
  msteamsConferenceId?: string;
217
272
  msteamsMeetingId?: string;
273
+ mtid?: string;
218
274
  oauth2ClientId?: string;
219
275
  orgId?: string;
220
276
  provisionalCorrelationId?: string;
@@ -225,7 +281,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
225
281
  sipSessionId?: {
226
282
  local?: string;
227
283
  remote?: string;
228
- additionalProperties?: false;
284
+ additionalProperties?: never;
229
285
  };
230
286
  sipUri?: string;
231
287
  subConfId?: string;
@@ -253,13 +309,14 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
253
309
  idForEndpointAB?: string;
254
310
  customerOrgId?: string;
255
311
  correlationId: string;
256
- additionalProperties?: false;
312
+ additionalProperties?: never;
257
313
  } | {
258
314
  aggregatedBreakoutMoveId?: string;
259
315
  attendeeId?: string;
260
316
  participantId?: string;
261
317
  breakoutGroupId?: string;
262
318
  breakoutMoveId?: string;
319
+ breakoutTrackingId?: string;
263
320
  breakoutSessionId?: string;
264
321
  browserId?: string;
265
322
  ciExchangeTokenUrl?: string;
@@ -271,7 +328,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
271
328
  imiAppId: string;
272
329
  sessionId: string;
273
330
  sessionInstanceId: string;
274
- additionalProperties?: false;
331
+ additionalProperties?: never;
275
332
  };
276
333
  csdmDeviceUrl?: string;
277
334
  destinationBreakoutSessionId?: string;
@@ -287,6 +344,8 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
287
344
  ivrId?: string;
288
345
  callId?: string;
289
346
  pairCallId?: string;
347
+ llmWebsocketUrl?: string;
348
+ locusCluster?: string;
290
349
  locusId?: string;
291
350
  locusJoinUrl?: string;
292
351
  locusSessionId?: string;
@@ -300,9 +359,11 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
300
359
  meetingLookupUrl?: string;
301
360
  meetingOrgId?: string;
302
361
  metricServiceUrl?: string;
362
+ mercuryWebsocketUrl?: string;
303
363
  msteamsTenantGuid?: string;
304
364
  msteamsConferenceId?: string;
305
365
  msteamsMeetingId?: string;
366
+ mtid?: string;
306
367
  oauth2ClientId?: string;
307
368
  orgId?: string;
308
369
  provisionalCorrelationId?: string;
@@ -313,7 +374,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
313
374
  sipSessionId?: {
314
375
  local?: string;
315
376
  remote?: string;
316
- additionalProperties?: false;
377
+ additionalProperties?: never;
317
378
  };
318
379
  sipUri?: string;
319
380
  subConfId?: string;
@@ -341,13 +402,14 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
341
402
  idForEndpointAB?: string;
342
403
  customerOrgId?: string;
343
404
  correlationId: string;
344
- additionalProperties?: false;
405
+ additionalProperties?: never;
345
406
  } | {
346
407
  aggregatedBreakoutMoveId?: string;
347
408
  attendeeId?: string;
348
409
  participantId?: string;
349
410
  breakoutGroupId?: string;
350
411
  breakoutMoveId?: string;
412
+ breakoutTrackingId?: string;
351
413
  breakoutSessionId?: string;
352
414
  browserId?: string;
353
415
  ciExchangeTokenUrl?: string;
@@ -359,7 +421,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
359
421
  imiAppId: string;
360
422
  sessionId: string;
361
423
  sessionInstanceId: string;
362
- additionalProperties?: false;
424
+ additionalProperties?: never;
363
425
  };
364
426
  csdmDeviceUrl?: string;
365
427
  destinationBreakoutSessionId?: string;
@@ -375,6 +437,8 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
375
437
  ivrId?: string;
376
438
  callId?: string;
377
439
  pairCallId?: string;
440
+ llmWebsocketUrl?: string;
441
+ locusCluster?: string;
378
442
  locusId?: string;
379
443
  locusJoinUrl?: string;
380
444
  locusSessionId?: string;
@@ -388,9 +452,11 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
388
452
  meetingLookupUrl?: string;
389
453
  meetingOrgId?: string;
390
454
  metricServiceUrl?: string;
455
+ mercuryWebsocketUrl?: string;
391
456
  msteamsTenantGuid?: string;
392
457
  msteamsConferenceId?: string;
393
458
  msteamsMeetingId?: string;
459
+ mtid?: string;
394
460
  oauth2ClientId?: string;
395
461
  orgId?: string;
396
462
  provisionalCorrelationId?: string;
@@ -401,7 +467,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
401
467
  sipSessionId?: {
402
468
  local?: string;
403
469
  remote?: string;
404
- additionalProperties?: false;
470
+ additionalProperties?: never;
405
471
  };
406
472
  sipUri?: string;
407
473
  subConfId?: string;
@@ -429,7 +495,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
429
495
  idForEndpointAB?: string;
430
496
  customerOrgId?: string;
431
497
  correlationId: string;
432
- additionalProperties?: false;
498
+ additionalProperties?: never;
433
499
  };
434
500
  /**
435
501
  * Create diagnostic event, which can hold client event, feature event or MQE event data.
@@ -482,16 +548,16 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
482
548
  * @param arg.clientErrorCode
483
549
  * @param arg.serviceErrorCode
484
550
  * @param arg.payloadOverrides
485
- * @param arg.httpStatusCode
551
+ * @param arg.httpCode
486
552
  * @returns
487
553
  */
488
- getErrorPayloadForClientErrorCode({ clientErrorCode, serviceErrorCode, serviceErrorName, rawErrorMessage, payloadOverrides, httpStatusCode, }: {
554
+ getErrorPayloadForClientErrorCode({ clientErrorCode, serviceErrorCode, serviceErrorName, rawErrorMessage, payloadOverrides, httpCode, }: {
489
555
  clientErrorCode: number;
490
556
  serviceErrorCode: any;
491
557
  serviceErrorName?: any;
492
558
  rawErrorMessage?: string;
493
559
  payloadOverrides?: any;
494
- httpStatusCode?: number;
560
+ httpCode?: number;
495
561
  }): ClientEventError;
496
562
  /**
497
563
  * Clear the error cache
@@ -2,6 +2,8 @@ import { ClientEventError, ClientSubServiceType } from '../metrics.types';
2
2
  export declare const CALL_DIAGNOSTIC_LOG_IDENTIFIER = "call-diagnostic-events -> ";
3
3
  export declare const CALL_FEATURE_LOG_IDENTIFIER = "call-diagnostic-events-feature -> ";
4
4
  export declare const AUTHENTICATION_FAILED_CODE = 1010;
5
+ export declare const LOCUS_RATE_LIMITED_OUTGOING_CLIENT_CODE = 1002;
6
+ export declare const LOCUS_UNAVAILABLE_CLIENT_CODE = 1003;
5
7
  export declare const NETWORK_ERROR = 1026;
6
8
  export declare const NEW_LOCUS_ERROR_CLIENT_CODE = 4008;
7
9
  export declare const MEETING_INFO_LOOKUP_ERROR_CLIENT_CODE = 4100;
@@ -102,11 +104,13 @@ export declare const ERROR_DESCRIPTIONS: {
102
104
  WEBRTC_API_NOT_AVAILABLE: string;
103
105
  WDM_RESTRICTED_REGION: string;
104
106
  USER_NOT_ALLOWED_JOIN_WEBINAR: string;
107
+ INVALID_MEETING_INFO: string;
105
108
  };
106
109
  export declare const SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP: {
107
110
  58400: number;
108
111
  99002: number;
109
112
  99009: number;
113
+ 99019: number;
110
114
  58500: number;
111
115
  400001: number;
112
116
  403004: number;
@@ -134,6 +138,7 @@ export declare const SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP: {
134
138
  423001: number;
135
139
  423005: number;
136
140
  423006: number;
141
+ 423008: number;
137
142
  423010: number;
138
143
  423012: number;
139
144
  423013: number;
@@ -147,6 +152,7 @@ export declare const SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP: {
147
152
  403037: number;
148
153
  403003: number;
149
154
  403030: number;
155
+ 403106: number;
150
156
  2403001: number;
151
157
  2403002: number;
152
158
  2403003: number;
@@ -8,10 +8,19 @@ declare namespace _default {
8
8
  }
9
9
  export namespace metrics_1 {
10
10
  const appType: string;
11
+ namespace unhandledExceptionTelemetry {
12
+ const enabled: boolean;
13
+ }
14
+ namespace networkTelemetry {
15
+ const enabled_1: boolean;
16
+ export { enabled_1 as enabled };
17
+ export const intervalMs: number;
18
+ }
11
19
  const batcherWait: number;
12
20
  const batcherMaxCalls: number;
13
21
  const batcherMaxWait: number;
14
22
  const batcherRetryPlateau: number;
23
+ const batcherRetryOnNetworkError: boolean;
15
24
  const waitForServiceTimeout: number;
16
25
  }
17
26
  export { metrics_1 as metrics };
@@ -4,7 +4,8 @@
4
4
  import config from './config';
5
5
  import NewMetrics from './new-metrics';
6
6
  import * as Utils from './utils';
7
- import { ClientEvent, ClientEventLeaveReason, SubmitBehavioralEvent, SubmitClientEvent, SubmitInternalEvent, SubmitOperationalEvent, SubmitBusinessEvent, SubmitMQE, PreComputedLatencies, SubmitFeatureEvent } from './metrics.types';
7
+ import * as AutomatedUserUtils from './automated-user';
8
+ import { ClientEvent, ClientEventLeaveReason, SubmitBehavioralEvent, SubmitClientEvent, SubmitInternalEvent, SubmitOperationalEvent, SubmitBusinessEvent, SubmitMQE, PreComputedLatencies, SubmitFeatureEvent, LocusSyncLatencyEventName, PrivacyAndSecurityPermission } from './metrics.types';
8
9
  import * as CALL_DIAGNOSTIC_CONFIG from './call-diagnostic/config';
9
10
  import * as CallDiagnosticUtils from './call-diagnostic/call-diagnostic-metrics.util';
10
11
  import CallDiagnosticMetrics from './call-diagnostic/call-diagnostic-metrics';
@@ -15,5 +16,6 @@ import BusinessMetrics from './business-metrics';
15
16
  import RtcMetrics from './rtcMetrics';
16
17
  import PreLoginMetrics from './prelogin-metrics';
17
18
  export { default, getOSNameInternal } from './metrics';
18
- export { config, CALL_DIAGNOSTIC_CONFIG, NewMetrics, Utils, CallDiagnosticUtils, CallDiagnosticLatencies, CallDiagnosticMetrics, BehavioralMetrics, OperationalMetrics, BusinessMetrics, RtcMetrics, PreLoginMetrics, };
19
- export type { ClientEvent, ClientEventLeaveReason, SubmitBehavioralEvent, SubmitClientEvent, SubmitInternalEvent, SubmitMQE, SubmitOperationalEvent, SubmitBusinessEvent, PreComputedLatencies, SubmitFeatureEvent, };
19
+ export { config, CALL_DIAGNOSTIC_CONFIG, AutomatedUserUtils, NewMetrics, Utils, CallDiagnosticUtils, CallDiagnosticLatencies, CallDiagnosticMetrics, BehavioralMetrics, OperationalMetrics, BusinessMetrics, RtcMetrics, PreLoginMetrics, };
20
+ export { isAutomatedUser, isAutomatedUserAgent } from './automated-user';
21
+ export type { ClientEvent, ClientEventLeaveReason, SubmitBehavioralEvent, SubmitClientEvent, SubmitInternalEvent, SubmitMQE, SubmitOperationalEvent, SubmitBusinessEvent, PreComputedLatencies, SubmitFeatureEvent, LocusSyncLatencyEventName, PrivacyAndSecurityPermission, };
@@ -8,6 +8,9 @@ export type NewEnvironmentType = NonNullable<RawEvent['origin']['newEnvironment'
8
8
  export type ClientLaunchMethodType = NonNullable<RawEvent['origin']['clientInfo']>['clientLaunchMethod'];
9
9
  export type ClientUserNameInput = NonNullable<RawClientEvent['userNameInput']>;
10
10
  export type ClientEmailInput = NonNullable<RawClientEvent['emailInput']>;
11
+ export type PrivacyAndSecurityPermission = NonNullable<RawClientEvent['privacyAndSecurityPermission']>;
12
+ export type PrivacyAndSecurityPermissionResource = keyof PrivacyAndSecurityPermission;
13
+ export type PrivacyAndSecurityPermissionState = PrivacyAndSecurityPermission[PrivacyAndSecurityPermissionResource];
11
14
  export type BrowserLaunchMethodType = NonNullable<RawEvent['origin']['clientInfo']>['browserLaunchMethod'];
12
15
  export type MetricEventProduct = 'webex' | 'wxcc_desktop' | 'wxcc_crm' | 'wxcc_sdk';
13
16
  export type MetricEventAgent = 'user' | 'browser' | 'system' | 'sdk' | 'redux' | 'service' | 'api';
@@ -27,6 +30,7 @@ export type SubmitClientEventOptions = {
27
30
  browserLaunchMethod?: BrowserLaunchMethodType;
28
31
  webexConferenceIdStr?: string;
29
32
  globalMeetingId?: string;
33
+ locusCluster?: string;
30
34
  joinFlowVersion?: MetricEventJoinFlowVersion;
31
35
  meetingJoinPhase?: MetricEventMeetingJoinPhase;
32
36
  triggeredTime?: string;
@@ -41,8 +45,10 @@ export type SubmitMQEOptions = {
41
45
  webexConferenceIdStr?: string;
42
46
  globalMeetingId?: string;
43
47
  };
48
+ export declare const LOCUS_SYNC_LATENCY_EVENT_NAMES: readonly ["internal.client.locus.sync.start", "internal.client.locus.hashtree.request", "internal.client.locus.hashtree.response", "internal.client.locus.sync.request", "internal.client.locus.sync.response", "internal.client.locus.sync.message.received"];
49
+ export type LocusSyncLatencyEventName = (typeof LOCUS_SYNC_LATENCY_EVENT_NAMES)[number];
44
50
  export type InternalEvent = {
45
- name: 'internal.client.meetinginfo.request' | 'internal.client.meetinginfo.response' | 'internal.register.device.request' | 'internal.register.device.response' | 'internal.reset.join.latencies' | 'internal.client.meeting.click.joinbutton' | 'internal.host.meeting.participant.admitted' | 'internal.client.meeting.interstitial-window.showed' | 'internal.client.interstitial-window.click.joinbutton' | 'internal.client.add-media.turn-discovery.start' | 'internal.client.add-media.turn-discovery.end' | 'internal.client.share.initiated' | 'internal.client.share.stopped';
51
+ name: 'internal.client.meetinginfo.request' | 'internal.client.meetinginfo.response' | 'internal.register.device.request' | 'internal.register.device.response' | 'internal.reset.join.latencies' | 'internal.host.meeting.participant.admitted' | 'internal.client.meeting.interstitial-window.showed' | 'internal.client.interstitial-window.click.joinbutton' | 'internal.client.add-media.turn-discovery.start' | 'internal.client.add-media.turn-discovery.end' | 'internal.client.share.initiated' | 'internal.client.share.stopped' | LocusSyncLatencyEventName;
46
52
  payload?: never;
47
53
  options?: never;
48
54
  };
@@ -107,10 +113,10 @@ export type ClientInfo = NonNullable<RawEvent['origin']['clientInfo']>;
107
113
  export type ClientType = NonNullable<RawEvent['origin']['clientInfo']>['clientType'];
108
114
  export type SubClientType = NonNullable<RawEvent['origin']['clientInfo']>['subClientType'];
109
115
  export type NetworkType = NonNullable<RawEvent['origin']>['networkType'];
110
- export type ClientSubServiceType = ClientEvent['payload']['webexSubServiceType'];
116
+ export type ClientSubServiceType = NonNullable<ClientEvent['payload']>['webexSubServiceType'];
111
117
  export type ClientEventPayload = RecursivePartial<ClientEvent['payload']>;
112
- export type ClientEventLeaveReason = ClientEvent['payload']['leaveReason'];
113
- export type ClientEventPayloadError = ClientEvent['payload']['errors'];
118
+ export type ClientEventLeaveReason = NonNullable<ClientEvent['payload']>['leaveReason'];
119
+ export type ClientEventPayloadError = NonNullable<ClientEvent['payload']>['errors'];
114
120
  export type ClientFeatureEventPayload = RecursivePartial<FeatureEvent['payload']>;
115
121
  export type MediaQualityEventAudioSetupDelayPayload = NonNullable<MediaQualityEvent['payload']>['audioSetupDelay'];
116
122
  export type MediaQualityEventVideoSetupDelayPayload = NonNullable<MediaQualityEvent['payload']>['videoSetupDelay'];
@@ -154,7 +160,7 @@ export type BuildClientEventFetchRequestOptions = (args: {
154
160
  payload?: RecursivePartial<ClientEvent['payload']>;
155
161
  options?: SubmitClientEventOptions;
156
162
  }) => Promise<any>;
157
- export type PreComputedLatencies = 'internal.client.pageJMT' | 'internal.download.time' | 'internal.get.cluster.time' | 'internal.click.to.interstitial' | 'internal.click.to.interstitial.with.user.delay' | 'internal.refresh.captcha.time' | 'internal.exchange.ci.token.time' | 'internal.get.u2c.time' | 'internal.call.init.join.req' | 'internal.other.app.api.time' | 'internal.api.fetch.intelligence.models';
163
+ export type PreComputedLatencies = 'internal.client.pageJMT' | 'internal.download.time' | 'internal.get.cluster.time' | 'internal.click.to.interstitial' | 'internal.click.to.interstitial.with.user.delay' | 'internal.click.to.interstitial.for.client.jmt' | 'internal.refresh.captcha.time' | 'internal.exchange.ci.token.time' | 'internal.get.u2c.time' | 'internal.call.init.join.req' | 'internal.other.app.api.time' | 'internal.api.fetch.intelligence.models' | 'internal.client.locus.sync.random.backoff';
158
164
  export interface IdType {
159
165
  meetingId?: string;
160
166
  callId?: string;
@@ -0,0 +1,108 @@
1
+ export declare const NETWORK_REQUEST_SUMMARY_METRIC = "JS_SDK_NETWORK_REQUEST_SUMMARY";
2
+ export declare const NETWORK_TELEMETRY_INTERVAL_MS: number;
3
+ type Headers = Record<string, unknown>;
4
+ type MetricsSummary = {
5
+ totalSendRequest: number;
6
+ totalFailedRequest: number;
7
+ totalRecvdResponse: number;
8
+ totalFailedResponse: number;
9
+ };
10
+ type RequestMetric = {
11
+ host: string;
12
+ endPoint: string;
13
+ countSendRequest: number;
14
+ countFailedRequest: number;
15
+ countRecvdResponse: number;
16
+ countFailedResponse: number;
17
+ averageNetworkDurationMs: number;
18
+ maxNetworkDurationP90Ms: number;
19
+ maxNetworkDurationP99Ms: number;
20
+ };
21
+ export type NetworkErrorMetric = {
22
+ host: string;
23
+ endPoint: string;
24
+ statusCode: number;
25
+ errorCode: string;
26
+ method: string;
27
+ errorType: string;
28
+ errorMessage: string;
29
+ trackingIds: string[];
30
+ countError: number;
31
+ };
32
+ export type NetworkTelemetry = {
33
+ metricsSummary: MetricsSummary;
34
+ metrics: RequestMetric[];
35
+ errorMetrics: NetworkErrorMetric[];
36
+ errorMetricsSummary: Record<string, {
37
+ count: number;
38
+ }>;
39
+ };
40
+ type ErrorDetails = {
41
+ code?: number | string;
42
+ errorCode?: number | string;
43
+ message?: string;
44
+ name?: string;
45
+ };
46
+ type RequestOptions = {
47
+ api?: string;
48
+ headers?: Headers;
49
+ method?: string;
50
+ resource?: string;
51
+ service?: string;
52
+ timeout?: number;
53
+ uri?: string;
54
+ url?: string;
55
+ $timings?: {
56
+ networkEnd?: number;
57
+ networkStart?: number;
58
+ };
59
+ };
60
+ type RequestFailure = ErrorDetails & {
61
+ body?: ErrorDetails | string;
62
+ status?: number;
63
+ statusCode?: number;
64
+ };
65
+ type NetworkMetricProperties = {
66
+ type: 'operational';
67
+ tags: Record<string, string>;
68
+ fields: MetricsSummary;
69
+ eventPayload: NetworkTelemetry;
70
+ };
71
+ type NetworkTelemetryCollectorOptions = {
72
+ intervalMs?: number;
73
+ onSubmissionFailure: () => void;
74
+ submitMetric: (name: string, properties: NetworkMetricProperties) => unknown;
75
+ };
76
+ type NetworkTelemetryCollector = {
77
+ recordRequest: (options?: RequestOptions) => void;
78
+ recordResponse: (options?: RequestOptions) => void;
79
+ recordFailure: (options?: RequestOptions, reason?: RequestFailure) => void;
80
+ flush: () => Promise<void>;
81
+ stop: () => Promise<void>;
82
+ };
83
+ /**
84
+ * Removes query data and redacts dynamic-looking endpoint segments.
85
+ * @param resource SDK resource path.
86
+ * @returns The normalized endpoint.
87
+ */
88
+ export declare function getOperation(resource?: string): string;
89
+ /**
90
+ * Excludes the transports used to submit telemetry, preventing self-reporting.
91
+ * @param options Request options.
92
+ * @returns Whether the request should be tracked.
93
+ */
94
+ export declare function shouldTrackNetworkRequest(options?: RequestOptions): boolean;
95
+ /**
96
+ * Creates the error entry produced by one failed request.
97
+ * @param options Request options.
98
+ * @param reason Request failure.
99
+ * @returns The normalized error metric.
100
+ */
101
+ export declare function createNetworkErrorMetric(options?: RequestOptions, reason?: RequestFailure): NetworkErrorMetric;
102
+ /**
103
+ * Creates a network telemetry collector and starts its periodic timer.
104
+ * @param options Submission callbacks.
105
+ * @returns The network telemetry collector.
106
+ */
107
+ export declare function createNetworkTelemetryCollector({ intervalMs, onSubmissionFailure, submitMetric, }: NetworkTelemetryCollectorOptions): NetworkTelemetryCollector;
108
+ export {};
@@ -4,7 +4,7 @@ import BehavioralMetrics from './behavioral-metrics';
4
4
  import OperationalMetrics from './operational-metrics';
5
5
  import BusinessMetrics from './business-metrics';
6
6
  import PreLoginMetrics from './prelogin-metrics';
7
- import { RecursivePartial, MetricEventProduct, MetricEventAgent, MetricEventVerb, ClientEvent, FeatureEvent, EventPayload, MediaQualityEvent, InternalEvent, SubmitClientEventOptions, Table, DelayedClientEvent, DelayedClientFeatureEvent } from './metrics.types';
7
+ import { RecursivePartial, MetricEventProduct, MetricEventAgent, MetricEventVerb, ClientEvent, FeatureEvent, EventPayload, MediaQualityEvent, InternalEvent, SubmitClientEventOptions, Table, DelayedClientEvent, DelayedClientFeatureEvent, PrivacyAndSecurityPermission } from './metrics.types';
8
8
  import CallDiagnosticLatencies from './call-diagnostic/call-diagnostic-metrics-latencies';
9
9
  /**
10
10
  * Metrics plugin to centralize all types of metrics.
@@ -33,6 +33,7 @@ declare class Metrics extends WebexPlugin {
33
33
  */
34
34
  delayedClientEventsOverrides: Partial<DelayedClientEvent['options']>;
35
35
  delayedClientFeatureEventsOverrides: Partial<DelayedClientFeatureEvent['options']>;
36
+ private privacyAndSecurityPermissionEnricher;
36
37
  /**
37
38
  * Constructor
38
39
  * @param args
@@ -78,6 +79,10 @@ declare class Metrics extends WebexPlugin {
78
79
  * @returns true once we have the deviceId we need to submit business events
79
80
  */
80
81
  isReadyToSubmitBusinessEvents(): boolean;
82
+ /**
83
+ * @returns whether the current user agent belongs to an automated user
84
+ */
85
+ isAutomatedUser(): boolean;
81
86
  /**
82
87
  * Behavioral event
83
88
  * @param args
@@ -147,6 +152,17 @@ declare class Metrics extends WebexPlugin {
147
152
  payload?: RecursivePartial<ClientEvent['payload']>;
148
153
  options?: SubmitClientEventOptions;
149
154
  }): Promise<any>;
155
+ /**
156
+ * Stores the latest browser permission state supplied by the client.
157
+ * @param permission latest normalized permission snapshot
158
+ */
159
+ setPrivacyAndSecurityPermission(permission: PrivacyAndSecurityPermission): void;
160
+ /**
161
+ * Resolves event options to the call identity used by Call Diagnostic where possible.
162
+ * @param options client event options
163
+ * @returns the permission history scope
164
+ */
165
+ private getPermissionScope;
150
166
  /**
151
167
  * Issue request to alias a user's pre-login ID with their CI UUID
152
168
  * @param {string} preLoginId