@webex/internal-plugin-metrics 3.12.0-next.6 → 3.12.0-next.61

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 +613 -53
  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 +5 -0
  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 +200 -5
  39. package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +77 -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 +737 -60
  66. package/src/call-diagnostic/call-diagnostic-metrics.ts +184 -42
  67. package/src/call-diagnostic/call-diagnostic-metrics.util.ts +5 -0
  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 +10 -1
  89. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +1336 -131
  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;
@@ -200,6 +252,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
200
252
  callId?: string;
201
253
  pairCallId?: string;
202
254
  llmWebsocketUrl?: string;
255
+ locusCluster?: string;
203
256
  locusId?: string;
204
257
  locusJoinUrl?: string;
205
258
  locusSessionId?: string;
@@ -217,6 +270,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
217
270
  msteamsTenantGuid?: string;
218
271
  msteamsConferenceId?: string;
219
272
  msteamsMeetingId?: string;
273
+ mtid?: string;
220
274
  oauth2ClientId?: string;
221
275
  orgId?: string;
222
276
  provisionalCorrelationId?: string;
@@ -227,7 +281,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
227
281
  sipSessionId?: {
228
282
  local?: string;
229
283
  remote?: string;
230
- additionalProperties?: false;
284
+ additionalProperties?: never;
231
285
  };
232
286
  sipUri?: string;
233
287
  subConfId?: string;
@@ -255,13 +309,14 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
255
309
  idForEndpointAB?: string;
256
310
  customerOrgId?: string;
257
311
  correlationId: string;
258
- additionalProperties?: false;
312
+ additionalProperties?: never;
259
313
  } | {
260
314
  aggregatedBreakoutMoveId?: string;
261
315
  attendeeId?: string;
262
316
  participantId?: string;
263
317
  breakoutGroupId?: string;
264
318
  breakoutMoveId?: string;
319
+ breakoutTrackingId?: string;
265
320
  breakoutSessionId?: string;
266
321
  browserId?: string;
267
322
  ciExchangeTokenUrl?: string;
@@ -273,7 +328,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
273
328
  imiAppId: string;
274
329
  sessionId: string;
275
330
  sessionInstanceId: string;
276
- additionalProperties?: false;
331
+ additionalProperties?: never;
277
332
  };
278
333
  csdmDeviceUrl?: string;
279
334
  destinationBreakoutSessionId?: string;
@@ -290,6 +345,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
290
345
  callId?: string;
291
346
  pairCallId?: string;
292
347
  llmWebsocketUrl?: string;
348
+ locusCluster?: string;
293
349
  locusId?: string;
294
350
  locusJoinUrl?: string;
295
351
  locusSessionId?: string;
@@ -307,6 +363,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
307
363
  msteamsTenantGuid?: string;
308
364
  msteamsConferenceId?: string;
309
365
  msteamsMeetingId?: string;
366
+ mtid?: string;
310
367
  oauth2ClientId?: string;
311
368
  orgId?: string;
312
369
  provisionalCorrelationId?: string;
@@ -317,7 +374,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
317
374
  sipSessionId?: {
318
375
  local?: string;
319
376
  remote?: string;
320
- additionalProperties?: false;
377
+ additionalProperties?: never;
321
378
  };
322
379
  sipUri?: string;
323
380
  subConfId?: string;
@@ -345,13 +402,14 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
345
402
  idForEndpointAB?: string;
346
403
  customerOrgId?: string;
347
404
  correlationId: string;
348
- additionalProperties?: false;
405
+ additionalProperties?: never;
349
406
  } | {
350
407
  aggregatedBreakoutMoveId?: string;
351
408
  attendeeId?: string;
352
409
  participantId?: string;
353
410
  breakoutGroupId?: string;
354
411
  breakoutMoveId?: string;
412
+ breakoutTrackingId?: string;
355
413
  breakoutSessionId?: string;
356
414
  browserId?: string;
357
415
  ciExchangeTokenUrl?: string;
@@ -363,7 +421,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
363
421
  imiAppId: string;
364
422
  sessionId: string;
365
423
  sessionInstanceId: string;
366
- additionalProperties?: false;
424
+ additionalProperties?: never;
367
425
  };
368
426
  csdmDeviceUrl?: string;
369
427
  destinationBreakoutSessionId?: string;
@@ -380,6 +438,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
380
438
  callId?: string;
381
439
  pairCallId?: string;
382
440
  llmWebsocketUrl?: string;
441
+ locusCluster?: string;
383
442
  locusId?: string;
384
443
  locusJoinUrl?: string;
385
444
  locusSessionId?: string;
@@ -397,6 +456,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
397
456
  msteamsTenantGuid?: string;
398
457
  msteamsConferenceId?: string;
399
458
  msteamsMeetingId?: string;
459
+ mtid?: string;
400
460
  oauth2ClientId?: string;
401
461
  orgId?: string;
402
462
  provisionalCorrelationId?: string;
@@ -407,7 +467,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
407
467
  sipSessionId?: {
408
468
  local?: string;
409
469
  remote?: string;
410
- additionalProperties?: false;
470
+ additionalProperties?: never;
411
471
  };
412
472
  sipUri?: string;
413
473
  subConfId?: string;
@@ -435,7 +495,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
435
495
  idForEndpointAB?: string;
436
496
  customerOrgId?: string;
437
497
  correlationId: string;
438
- additionalProperties?: false;
498
+ additionalProperties?: never;
439
499
  };
440
500
  /**
441
501
  * Create diagnostic event, which can hold client event, feature event or MQE event data.
@@ -488,16 +548,16 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
488
548
  * @param arg.clientErrorCode
489
549
  * @param arg.serviceErrorCode
490
550
  * @param arg.payloadOverrides
491
- * @param arg.httpStatusCode
551
+ * @param arg.httpCode
492
552
  * @returns
493
553
  */
494
- getErrorPayloadForClientErrorCode({ clientErrorCode, serviceErrorCode, serviceErrorName, rawErrorMessage, payloadOverrides, httpStatusCode, }: {
554
+ getErrorPayloadForClientErrorCode({ clientErrorCode, serviceErrorCode, serviceErrorName, rawErrorMessage, payloadOverrides, httpCode, }: {
495
555
  clientErrorCode: number;
496
556
  serviceErrorCode: any;
497
557
  serviceErrorName?: any;
498
558
  rawErrorMessage?: string;
499
559
  payloadOverrides?: any;
500
- httpStatusCode?: number;
560
+ httpCode?: number;
501
561
  }): ClientEventError;
502
562
  /**
503
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