@webex/internal-plugin-metrics 3.12.0-next.2 → 3.12.0-next.20
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.
- package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +68 -51
- package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -1
- package/dist/call-diagnostic/call-diagnostic-metrics.js +7 -2
- package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -1
- package/dist/call-diagnostic/call-diagnostic-metrics.util.js +2 -2
- package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -1
- package/dist/call-diagnostic/config.js +16 -3
- package/dist/call-diagnostic/config.js.map +1 -1
- package/dist/metrics.js +1 -1
- package/dist/metrics.types.js.map +1 -1
- package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +9 -0
- package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +22 -13
- package/dist/types/call-diagnostic/config.d.ts +4 -0
- package/dist/types/metrics.types.d.ts +2 -2
- package/package.json +11 -11
- package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +140 -69
- package/src/call-diagnostic/call-diagnostic-metrics.ts +6 -0
- package/src/call-diagnostic/call-diagnostic-metrics.util.ts +2 -1
- package/src/call-diagnostic/config.ts +14 -0
- package/src/metrics.types.ts +1 -1
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +14 -2
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +243 -288
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +403 -157
|
@@ -137,11 +137,11 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
137
137
|
architecture: "unknown" | "intel32" | "intel64" | "amd32" | "amd64" | "arm32" | "arm64" | "armv9" | "armv8" | "armv7" | "armv6" | "x86_64" | "x86_32";
|
|
138
138
|
staticPerformance?: string;
|
|
139
139
|
clockSpeedGigaHertz?: number;
|
|
140
|
-
additionalProperties?:
|
|
140
|
+
additionalProperties?: never;
|
|
141
141
|
};
|
|
142
142
|
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
143
|
videoDisplayMode?: "grid-view" | "active-speaker-view";
|
|
144
|
-
videoLayoutType?: "stack" | "stackWithShare" | "sideBySide" | "sideBySideWithShare" | "grid" | "floatingActive" | "floatingThumbnail" | "floatingGrid" | "overlay" | "focus" | "prominent" | "focusWithShare" | "prominentWithShare" | "equal" | "equalWithShare" | "largeGallery";
|
|
144
|
+
videoLayoutType?: "auto" | "stack" | "stackWithShare" | "sideBySide" | "sideBySideWithShare" | "grid" | "floatingActive" | "floatingThumbnail" | "floatingGrid" | "overlay" | "focus" | "prominent" | "focusWithShare" | "prominentWithShare" | "equal" | "equalWithShare" | "largeGallery" | "autoWithShare";
|
|
145
145
|
videoRenderType?: "wme" | "client_d3d" | "client_gdi";
|
|
146
146
|
vdiInfo?: {};
|
|
147
147
|
is64BitsClient?: boolean;
|
|
@@ -153,13 +153,16 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
153
153
|
vendorId?: string;
|
|
154
154
|
staticPerformanceLevel?: string;
|
|
155
155
|
staticPerformanceScore?: number;
|
|
156
|
-
|
|
156
|
+
preInstalledTime?: string;
|
|
157
|
+
preInstalledType?: "installer" | "launcher" | "app";
|
|
158
|
+
preInstalledVersion?: string;
|
|
159
|
+
additionalProperties?: never;
|
|
157
160
|
};
|
|
158
161
|
emmVendorId?: string;
|
|
159
162
|
isHybridMedia?: boolean;
|
|
160
163
|
originData?: {};
|
|
161
164
|
serviceVersion?: string;
|
|
162
|
-
additionalProperties?:
|
|
165
|
+
additionalProperties?: never;
|
|
163
166
|
};
|
|
164
167
|
/**
|
|
165
168
|
* Gather identifier details for call diagnostic payload.
|
|
@@ -183,7 +186,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
183
186
|
imiAppId: string;
|
|
184
187
|
sessionId: string;
|
|
185
188
|
sessionInstanceId: string;
|
|
186
|
-
additionalProperties?:
|
|
189
|
+
additionalProperties?: never;
|
|
187
190
|
};
|
|
188
191
|
csdmDeviceUrl?: string;
|
|
189
192
|
destinationBreakoutSessionId?: string;
|
|
@@ -199,6 +202,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
199
202
|
ivrId?: string;
|
|
200
203
|
callId?: string;
|
|
201
204
|
pairCallId?: string;
|
|
205
|
+
llmWebsocketUrl?: string;
|
|
202
206
|
locusId?: string;
|
|
203
207
|
locusJoinUrl?: string;
|
|
204
208
|
locusSessionId?: string;
|
|
@@ -212,6 +216,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
212
216
|
meetingLookupUrl?: string;
|
|
213
217
|
meetingOrgId?: string;
|
|
214
218
|
metricServiceUrl?: string;
|
|
219
|
+
mercuryWebsocketUrl?: string;
|
|
215
220
|
msteamsTenantGuid?: string;
|
|
216
221
|
msteamsConferenceId?: string;
|
|
217
222
|
msteamsMeetingId?: string;
|
|
@@ -225,7 +230,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
225
230
|
sipSessionId?: {
|
|
226
231
|
local?: string;
|
|
227
232
|
remote?: string;
|
|
228
|
-
additionalProperties?:
|
|
233
|
+
additionalProperties?: never;
|
|
229
234
|
};
|
|
230
235
|
sipUri?: string;
|
|
231
236
|
subConfId?: string;
|
|
@@ -253,7 +258,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
253
258
|
idForEndpointAB?: string;
|
|
254
259
|
customerOrgId?: string;
|
|
255
260
|
correlationId: string;
|
|
256
|
-
additionalProperties?:
|
|
261
|
+
additionalProperties?: never;
|
|
257
262
|
} | {
|
|
258
263
|
aggregatedBreakoutMoveId?: string;
|
|
259
264
|
attendeeId?: string;
|
|
@@ -271,7 +276,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
271
276
|
imiAppId: string;
|
|
272
277
|
sessionId: string;
|
|
273
278
|
sessionInstanceId: string;
|
|
274
|
-
additionalProperties?:
|
|
279
|
+
additionalProperties?: never;
|
|
275
280
|
};
|
|
276
281
|
csdmDeviceUrl?: string;
|
|
277
282
|
destinationBreakoutSessionId?: string;
|
|
@@ -287,6 +292,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
287
292
|
ivrId?: string;
|
|
288
293
|
callId?: string;
|
|
289
294
|
pairCallId?: string;
|
|
295
|
+
llmWebsocketUrl?: string;
|
|
290
296
|
locusId?: string;
|
|
291
297
|
locusJoinUrl?: string;
|
|
292
298
|
locusSessionId?: string;
|
|
@@ -300,6 +306,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
300
306
|
meetingLookupUrl?: string;
|
|
301
307
|
meetingOrgId?: string;
|
|
302
308
|
metricServiceUrl?: string;
|
|
309
|
+
mercuryWebsocketUrl?: string;
|
|
303
310
|
msteamsTenantGuid?: string;
|
|
304
311
|
msteamsConferenceId?: string;
|
|
305
312
|
msteamsMeetingId?: string;
|
|
@@ -313,7 +320,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
313
320
|
sipSessionId?: {
|
|
314
321
|
local?: string;
|
|
315
322
|
remote?: string;
|
|
316
|
-
additionalProperties?:
|
|
323
|
+
additionalProperties?: never;
|
|
317
324
|
};
|
|
318
325
|
sipUri?: string;
|
|
319
326
|
subConfId?: string;
|
|
@@ -341,7 +348,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
341
348
|
idForEndpointAB?: string;
|
|
342
349
|
customerOrgId?: string;
|
|
343
350
|
correlationId: string;
|
|
344
|
-
additionalProperties?:
|
|
351
|
+
additionalProperties?: never;
|
|
345
352
|
} | {
|
|
346
353
|
aggregatedBreakoutMoveId?: string;
|
|
347
354
|
attendeeId?: string;
|
|
@@ -359,7 +366,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
359
366
|
imiAppId: string;
|
|
360
367
|
sessionId: string;
|
|
361
368
|
sessionInstanceId: string;
|
|
362
|
-
additionalProperties?:
|
|
369
|
+
additionalProperties?: never;
|
|
363
370
|
};
|
|
364
371
|
csdmDeviceUrl?: string;
|
|
365
372
|
destinationBreakoutSessionId?: string;
|
|
@@ -375,6 +382,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
375
382
|
ivrId?: string;
|
|
376
383
|
callId?: string;
|
|
377
384
|
pairCallId?: string;
|
|
385
|
+
llmWebsocketUrl?: string;
|
|
378
386
|
locusId?: string;
|
|
379
387
|
locusJoinUrl?: string;
|
|
380
388
|
locusSessionId?: string;
|
|
@@ -388,6 +396,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
388
396
|
meetingLookupUrl?: string;
|
|
389
397
|
meetingOrgId?: string;
|
|
390
398
|
metricServiceUrl?: string;
|
|
399
|
+
mercuryWebsocketUrl?: string;
|
|
391
400
|
msteamsTenantGuid?: string;
|
|
392
401
|
msteamsConferenceId?: string;
|
|
393
402
|
msteamsMeetingId?: string;
|
|
@@ -401,7 +410,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
401
410
|
sipSessionId?: {
|
|
402
411
|
local?: string;
|
|
403
412
|
remote?: string;
|
|
404
|
-
additionalProperties?:
|
|
413
|
+
additionalProperties?: never;
|
|
405
414
|
};
|
|
406
415
|
sipUri?: string;
|
|
407
416
|
subConfId?: string;
|
|
@@ -429,7 +438,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
429
438
|
idForEndpointAB?: string;
|
|
430
439
|
customerOrgId?: string;
|
|
431
440
|
correlationId: string;
|
|
432
|
-
additionalProperties?:
|
|
441
|
+
additionalProperties?: never;
|
|
433
442
|
};
|
|
434
443
|
/**
|
|
435
444
|
* Create diagnostic event, which can hold client event, feature event or MQE event data.
|
|
@@ -102,11 +102,13 @@ export declare const ERROR_DESCRIPTIONS: {
|
|
|
102
102
|
WEBRTC_API_NOT_AVAILABLE: string;
|
|
103
103
|
WDM_RESTRICTED_REGION: string;
|
|
104
104
|
USER_NOT_ALLOWED_JOIN_WEBINAR: string;
|
|
105
|
+
INVALID_MEETING_INFO: string;
|
|
105
106
|
};
|
|
106
107
|
export declare const SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP: {
|
|
107
108
|
58400: number;
|
|
108
109
|
99002: number;
|
|
109
110
|
99009: number;
|
|
111
|
+
99019: number;
|
|
110
112
|
58500: number;
|
|
111
113
|
400001: number;
|
|
112
114
|
403004: number;
|
|
@@ -134,6 +136,7 @@ export declare const SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP: {
|
|
|
134
136
|
423001: number;
|
|
135
137
|
423005: number;
|
|
136
138
|
423006: number;
|
|
139
|
+
423008: number;
|
|
137
140
|
423010: number;
|
|
138
141
|
423012: number;
|
|
139
142
|
423013: number;
|
|
@@ -147,6 +150,7 @@ export declare const SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP: {
|
|
|
147
150
|
403037: number;
|
|
148
151
|
403003: number;
|
|
149
152
|
403030: number;
|
|
153
|
+
403106: number;
|
|
150
154
|
2403001: number;
|
|
151
155
|
2403002: number;
|
|
152
156
|
2403003: number;
|
|
@@ -42,7 +42,7 @@ export type SubmitMQEOptions = {
|
|
|
42
42
|
globalMeetingId?: string;
|
|
43
43
|
};
|
|
44
44
|
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.
|
|
45
|
+
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';
|
|
46
46
|
payload?: never;
|
|
47
47
|
options?: never;
|
|
48
48
|
};
|
|
@@ -154,7 +154,7 @@ export type BuildClientEventFetchRequestOptions = (args: {
|
|
|
154
154
|
payload?: RecursivePartial<ClientEvent['payload']>;
|
|
155
155
|
options?: SubmitClientEventOptions;
|
|
156
156
|
}) => 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';
|
|
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.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';
|
|
158
158
|
export interface IdType {
|
|
159
159
|
meetingId?: string;
|
|
160
160
|
callId?: string;
|
package/package.json
CHANGED
|
@@ -24,23 +24,23 @@
|
|
|
24
24
|
"@sinonjs/fake-timers": "^6.0.1",
|
|
25
25
|
"@webex/babel-config-legacy": "0.0.0",
|
|
26
26
|
"@webex/eslint-config-legacy": "0.0.0",
|
|
27
|
-
"@webex/event-dictionary-ts": "^1.0.
|
|
27
|
+
"@webex/event-dictionary-ts": "^1.0.2138",
|
|
28
28
|
"@webex/jest-config-legacy": "0.0.0",
|
|
29
29
|
"@webex/legacy-tools": "0.0.0",
|
|
30
|
-
"@webex/test-helper-chai": "3.
|
|
31
|
-
"@webex/test-helper-mocha": "3.
|
|
32
|
-
"@webex/test-helper-mock-webex": "3.
|
|
33
|
-
"@webex/test-helper-test-users": "3.
|
|
30
|
+
"@webex/test-helper-chai": "3.12.0-next.3",
|
|
31
|
+
"@webex/test-helper-mocha": "3.12.0-next.3",
|
|
32
|
+
"@webex/test-helper-mock-webex": "3.12.0-next.3",
|
|
33
|
+
"@webex/test-helper-test-users": "3.12.0-next.3",
|
|
34
34
|
"eslint": "^8.24.0",
|
|
35
35
|
"prettier": "^2.7.1",
|
|
36
36
|
"sinon": "^9.2.4"
|
|
37
37
|
},
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@webex/common": "3.
|
|
40
|
-
"@webex/common-timers": "3.
|
|
41
|
-
"@webex/test-helper-chai": "3.
|
|
42
|
-
"@webex/test-helper-mock-webex": "3.
|
|
43
|
-
"@webex/webex-core": "3.12.0-next.
|
|
39
|
+
"@webex/common": "3.12.0-next.3",
|
|
40
|
+
"@webex/common-timers": "3.12.0-next.3",
|
|
41
|
+
"@webex/test-helper-chai": "3.12.0-next.3",
|
|
42
|
+
"@webex/test-helper-mock-webex": "3.12.0-next.3",
|
|
43
|
+
"@webex/webex-core": "3.12.0-next.20",
|
|
44
44
|
"ip-anonymize": "^0.1.0",
|
|
45
45
|
"lodash": "^4.17.21",
|
|
46
46
|
"uuid": "^3.3.2"
|
|
@@ -53,5 +53,5 @@
|
|
|
53
53
|
"test:style": "eslint ./src/**/*.*",
|
|
54
54
|
"test:unit": "webex-legacy-tools test --unit --runner mocha"
|
|
55
55
|
},
|
|
56
|
-
"version": "3.12.0-next.
|
|
56
|
+
"version": "3.12.0-next.20"
|
|
57
57
|
}
|
|
@@ -193,7 +193,7 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
193
193
|
*/
|
|
194
194
|
public getShowInterstitialTime() {
|
|
195
195
|
return this.getDiffBetweenTimestamps(
|
|
196
|
-
'client.interstitial-window.
|
|
196
|
+
'internal.client.meeting.interstitial-window.showed',
|
|
197
197
|
'internal.client.interstitial-window.click.joinbutton'
|
|
198
198
|
);
|
|
199
199
|
}
|
|
@@ -224,11 +224,17 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
224
224
|
* @returns - latency
|
|
225
225
|
*/
|
|
226
226
|
public getCallInitJoinReq() {
|
|
227
|
-
|
|
228
|
-
'internal.client.interstitial-window.
|
|
229
|
-
'client.locus.join.request'
|
|
230
|
-
{maximum: 1200000}
|
|
227
|
+
const interstitialShowedToJoinReq = this.getDiffBetweenTimestamps(
|
|
228
|
+
'internal.client.meeting.interstitial-window.showed',
|
|
229
|
+
'client.locus.join.request'
|
|
231
230
|
);
|
|
231
|
+
const showInterstitialTime = this.getShowInterstitialTime() || 0;
|
|
232
|
+
|
|
233
|
+
if (typeof interstitialShowedToJoinReq !== 'number') {
|
|
234
|
+
return undefined;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
return clamp(interstitialShowedToJoinReq - showInterstitialTime, 0, 1200000);
|
|
232
238
|
}
|
|
233
239
|
|
|
234
240
|
/**
|
|
@@ -303,7 +309,39 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
303
309
|
* @returns - latency
|
|
304
310
|
*/
|
|
305
311
|
public getStayLobbyTime() {
|
|
306
|
-
return this.getDiffBetweenTimestamps('client.
|
|
312
|
+
return this.getDiffBetweenTimestamps('client.lobby.entered', 'client.lobby.exited');
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Stay lobby time capped by a certain timestamp.
|
|
317
|
+
* This is to handle the case where the target end timestamp could happen before the lobby is exited,
|
|
318
|
+
* for example media-engine.ready or client.ice.end
|
|
319
|
+
* This is supposed to be called AFTER the end timestamp happens
|
|
320
|
+
* @param endTimestampKey name of the target end event
|
|
321
|
+
* @returns - latency
|
|
322
|
+
*/
|
|
323
|
+
public getStayLobbyTimeCappedBy(endTimestampKey: MetricEventNames) {
|
|
324
|
+
const lobbyStartTimestamp = this.latencyTimestamps.get('client.lobby.entered'); // might not exist (some meetings don't have lobby)
|
|
325
|
+
|
|
326
|
+
if (typeof lobbyStartTimestamp !== 'number') {
|
|
327
|
+
// no lobby in the meeting, stayLobbyTime is 0
|
|
328
|
+
return 0;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
const lobbyEndTimestamp = this.latencyTimestamps.get('client.lobby.exited'); // might not exist (if user still in lobby at the time of measurement)
|
|
332
|
+
const maximumEndTimestamp = this.latencyTimestamps.get(endTimestampKey); // must exist
|
|
333
|
+
|
|
334
|
+
if (typeof maximumEndTimestamp !== 'number') {
|
|
335
|
+
// the provided timestamp to be used as a cap should exist, return undefined if it doesn't
|
|
336
|
+
return undefined;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
const endTimestamp =
|
|
340
|
+
typeof lobbyEndTimestamp === 'number'
|
|
341
|
+
? Math.min(lobbyEndTimestamp, maximumEndTimestamp)
|
|
342
|
+
: maximumEndTimestamp;
|
|
343
|
+
|
|
344
|
+
return clamp(endTimestamp - lobbyStartTimestamp, 0, this.MAX_INTEGER);
|
|
307
345
|
}
|
|
308
346
|
|
|
309
347
|
/**
|
|
@@ -331,14 +369,6 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
331
369
|
* @returns - latency
|
|
332
370
|
*/
|
|
333
371
|
public getClickToInterstitial() {
|
|
334
|
-
// for normal join (where green join button exists before interstitial, i.e reminder, space list etc)
|
|
335
|
-
if (this.latencyTimestamps.get('internal.client.meeting.click.joinbutton')) {
|
|
336
|
-
return this.getDiffBetweenTimestamps(
|
|
337
|
-
'internal.client.meeting.click.joinbutton',
|
|
338
|
-
'internal.client.meeting.interstitial-window.showed'
|
|
339
|
-
);
|
|
340
|
-
}
|
|
341
|
-
|
|
342
372
|
const clickToInterstitialLatency = this.precomputedLatencies.get(
|
|
343
373
|
'internal.click.to.interstitial'
|
|
344
374
|
);
|
|
@@ -355,14 +385,6 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
355
385
|
* @returns - latency
|
|
356
386
|
*/
|
|
357
387
|
public getClickToInterstitialWithUserDelay() {
|
|
358
|
-
// for normal join (where green join button exists before interstitial, i.e reminder, space list etc)
|
|
359
|
-
if (this.latencyTimestamps.get('internal.client.meeting.click.joinbutton')) {
|
|
360
|
-
return this.getDiffBetweenTimestamps(
|
|
361
|
-
'internal.client.meeting.click.joinbutton',
|
|
362
|
-
'internal.client.meeting.interstitial-window.showed'
|
|
363
|
-
);
|
|
364
|
-
}
|
|
365
|
-
|
|
366
388
|
const clickToInterstitialWithUserDelayLatency = this.precomputedLatencies.get(
|
|
367
389
|
'internal.click.to.interstitial.with.user.delay'
|
|
368
390
|
);
|
|
@@ -379,10 +401,17 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
379
401
|
* @returns - latency
|
|
380
402
|
*/
|
|
381
403
|
public getInterstitialToJoinOK() {
|
|
382
|
-
|
|
383
|
-
'internal.client.interstitial-window.
|
|
404
|
+
const interstitialShowedToJoinResp = this.getDiffBetweenTimestamps(
|
|
405
|
+
'internal.client.meeting.interstitial-window.showed',
|
|
384
406
|
'client.locus.join.response'
|
|
385
407
|
);
|
|
408
|
+
const showInterstitialTime = this.getShowInterstitialTime() || 0;
|
|
409
|
+
|
|
410
|
+
if (typeof interstitialShowedToJoinResp !== 'number') {
|
|
411
|
+
return undefined;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
return clamp(interstitialShowedToJoinResp - showInterstitialTime, 0, this.MAX_INTEGER);
|
|
386
415
|
}
|
|
387
416
|
|
|
388
417
|
/**
|
|
@@ -390,11 +419,7 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
390
419
|
* @returns - latency
|
|
391
420
|
*/
|
|
392
421
|
public getCallInitMediaEngineReady() {
|
|
393
|
-
return this.
|
|
394
|
-
'internal.client.interstitial-window.click.joinbutton',
|
|
395
|
-
'client.media-engine.ready',
|
|
396
|
-
{maximum: 1200000}
|
|
397
|
-
);
|
|
422
|
+
return this.getInterstitialToMediaOKJMT();
|
|
398
423
|
}
|
|
399
424
|
|
|
400
425
|
/**
|
|
@@ -402,20 +427,22 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
402
427
|
* @returns - latency
|
|
403
428
|
*/
|
|
404
429
|
public getInterstitialToMediaOKJMT() {
|
|
405
|
-
const
|
|
406
|
-
'internal.client.interstitial-window.
|
|
430
|
+
const interstitialShowedToIceEnd = this.getDiffBetweenTimestamps(
|
|
431
|
+
'internal.client.meeting.interstitial-window.showed',
|
|
432
|
+
'client.ice.end'
|
|
407
433
|
);
|
|
434
|
+
const showInterstitialTime = this.getShowInterstitialTime() || 0;
|
|
435
|
+
const stayLobbyTimeCappedByIceEnd = this.getStayLobbyTimeCappedBy('client.ice.end');
|
|
408
436
|
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
return clamp(interstitialToMediaOKJmt, 0, this.MAX_INTEGER);
|
|
437
|
+
if (
|
|
438
|
+
typeof interstitialShowedToIceEnd === 'number' &&
|
|
439
|
+
typeof stayLobbyTimeCappedByIceEnd === 'number'
|
|
440
|
+
) {
|
|
441
|
+
return clamp(
|
|
442
|
+
interstitialShowedToIceEnd - showInterstitialTime - stayLobbyTimeCappedByIceEnd,
|
|
443
|
+
0,
|
|
444
|
+
this.MAX_INTEGER
|
|
445
|
+
);
|
|
419
446
|
}
|
|
420
447
|
|
|
421
448
|
return undefined;
|
|
@@ -427,10 +454,21 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
427
454
|
*/
|
|
428
455
|
public getTotalJMT() {
|
|
429
456
|
const clickToInterstitial = this.getClickToInterstitial();
|
|
430
|
-
const
|
|
457
|
+
const interstitialShowedToJoinLocusResponse = this.getDiffBetweenTimestamps(
|
|
458
|
+
'internal.client.meeting.interstitial-window.showed',
|
|
459
|
+
'client.locus.join.response'
|
|
460
|
+
);
|
|
461
|
+
const showInterstitialTime = this.getShowInterstitialTime() || 0;
|
|
431
462
|
|
|
432
|
-
if (
|
|
433
|
-
|
|
463
|
+
if (
|
|
464
|
+
typeof clickToInterstitial === 'number' &&
|
|
465
|
+
typeof interstitialShowedToJoinLocusResponse === 'number'
|
|
466
|
+
) {
|
|
467
|
+
return clamp(
|
|
468
|
+
clickToInterstitial + interstitialShowedToJoinLocusResponse - showInterstitialTime,
|
|
469
|
+
0,
|
|
470
|
+
this.MAX_INTEGER
|
|
471
|
+
);
|
|
434
472
|
}
|
|
435
473
|
|
|
436
474
|
return undefined;
|
|
@@ -442,13 +480,20 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
442
480
|
*/
|
|
443
481
|
public getTotalJMTWithUserDelay() {
|
|
444
482
|
const clickToInterstitialWithUserDelay = this.getClickToInterstitialWithUserDelay();
|
|
445
|
-
const
|
|
483
|
+
const interstitialShowedToJoinLocusResponse = this.getDiffBetweenTimestamps(
|
|
484
|
+
'internal.client.meeting.interstitial-window.showed',
|
|
485
|
+
'client.locus.join.response'
|
|
486
|
+
);
|
|
446
487
|
|
|
447
488
|
if (
|
|
448
489
|
typeof clickToInterstitialWithUserDelay === 'number' &&
|
|
449
|
-
typeof
|
|
490
|
+
typeof interstitialShowedToJoinLocusResponse === 'number'
|
|
450
491
|
) {
|
|
451
|
-
return clamp(
|
|
492
|
+
return clamp(
|
|
493
|
+
clickToInterstitialWithUserDelay + interstitialShowedToJoinLocusResponse,
|
|
494
|
+
0,
|
|
495
|
+
this.MAX_INTEGER
|
|
496
|
+
);
|
|
452
497
|
}
|
|
453
498
|
|
|
454
499
|
return undefined;
|
|
@@ -475,22 +520,28 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
475
520
|
*/
|
|
476
521
|
public getTotalMediaJMT() {
|
|
477
522
|
const clickToInterstitial = this.getClickToInterstitial();
|
|
478
|
-
const
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
523
|
+
const interstitialShowedToMediaEngineReady = this.getDiffBetweenTimestamps(
|
|
524
|
+
'internal.client.meeting.interstitial-window.showed',
|
|
525
|
+
'client.media-engine.ready'
|
|
526
|
+
);
|
|
527
|
+
const showInterstitialTime = this.getShowInterstitialTime() || 0;
|
|
528
|
+
const stayLobbyTimeCappedByMediaEngineReady = this.getStayLobbyTimeCappedBy(
|
|
529
|
+
'client.media-engine.ready'
|
|
530
|
+
);
|
|
531
|
+
|
|
532
|
+
if (
|
|
533
|
+
typeof clickToInterstitial === 'number' &&
|
|
534
|
+
typeof interstitialShowedToMediaEngineReady === 'number' &&
|
|
535
|
+
typeof stayLobbyTimeCappedByMediaEngineReady === 'number'
|
|
536
|
+
) {
|
|
537
|
+
return clamp(
|
|
538
|
+
clickToInterstitial +
|
|
539
|
+
interstitialShowedToMediaEngineReady -
|
|
540
|
+
showInterstitialTime -
|
|
541
|
+
stayLobbyTimeCappedByMediaEngineReady,
|
|
486
542
|
0,
|
|
487
|
-
|
|
543
|
+
this.MAX_INTEGER
|
|
488
544
|
);
|
|
489
|
-
if (this.getMeeting()?.allowMediaInLobby) {
|
|
490
|
-
return clamp(totalMediaJMT, 0, this.MAX_INTEGER);
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
return clamp(totalMediaJMT - lobbyTime, 0, this.MAX_INTEGER);
|
|
494
545
|
}
|
|
495
546
|
|
|
496
547
|
return undefined;
|
|
@@ -502,12 +553,17 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
502
553
|
*/
|
|
503
554
|
public getTotalMediaJMTWithUserDelay() {
|
|
504
555
|
const clickToInterstitialWithUserDelay = this.getClickToInterstitialWithUserDelay();
|
|
505
|
-
const
|
|
506
|
-
|
|
556
|
+
const interstitialShowedToMediaEngineReady = this.getDiffBetweenTimestamps(
|
|
557
|
+
'internal.client.meeting.interstitial-window.showed',
|
|
558
|
+
'client.media-engine.ready'
|
|
559
|
+
);
|
|
507
560
|
|
|
508
|
-
if (
|
|
561
|
+
if (
|
|
562
|
+
typeof clickToInterstitialWithUserDelay === 'number' &&
|
|
563
|
+
typeof interstitialShowedToMediaEngineReady === 'number'
|
|
564
|
+
) {
|
|
509
565
|
return clamp(
|
|
510
|
-
clickToInterstitialWithUserDelay +
|
|
566
|
+
clickToInterstitialWithUserDelay + interstitialShowedToMediaEngineReady,
|
|
511
567
|
0,
|
|
512
568
|
this.MAX_INTEGER
|
|
513
569
|
);
|
|
@@ -521,11 +577,26 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
521
577
|
* @returns - latency
|
|
522
578
|
*/
|
|
523
579
|
public getClientJMT() {
|
|
524
|
-
const
|
|
525
|
-
|
|
580
|
+
const clickToInterstitialForClientJmt = this.precomputedLatencies.get(
|
|
581
|
+
'internal.click.to.interstitial.for.client.jmt'
|
|
582
|
+
);
|
|
583
|
+
const interstitialShowedToLocusJoinRequest = this.getDiffBetweenTimestamps(
|
|
584
|
+
'internal.client.meeting.interstitial-window.showed',
|
|
585
|
+
'client.locus.join.request'
|
|
586
|
+
);
|
|
587
|
+
const showInterstitialTime = this.getShowInterstitialTime() || 0;
|
|
526
588
|
|
|
527
|
-
if (
|
|
528
|
-
|
|
589
|
+
if (
|
|
590
|
+
typeof clickToInterstitialForClientJmt === 'number' &&
|
|
591
|
+
typeof interstitialShowedToLocusJoinRequest === 'number'
|
|
592
|
+
) {
|
|
593
|
+
return clamp(
|
|
594
|
+
clickToInterstitialForClientJmt +
|
|
595
|
+
interstitialShowedToLocusJoinRequest -
|
|
596
|
+
showInterstitialTime,
|
|
597
|
+
0,
|
|
598
|
+
this.MAX_INTEGER
|
|
599
|
+
);
|
|
529
600
|
}
|
|
530
601
|
|
|
531
602
|
return undefined;
|
|
@@ -190,6 +190,11 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
190
190
|
|
|
191
191
|
// if ConvergedArchitecture enable and isConvergedWebinarWebcast -- then webcast
|
|
192
192
|
if (meetingInfo?.enableConvergedArchitecture && meetingInfo?.enableEvent) {
|
|
193
|
+
// if enableConvergedWebinarLargeScale - then large scale webinar
|
|
194
|
+
if (meetingInfo?.enableConvergedWebinarLargeScale) {
|
|
195
|
+
return WEBEX_SUB_SERVICE_TYPES.LARGE_SCALE_WEBINAR;
|
|
196
|
+
}
|
|
197
|
+
|
|
193
198
|
return meetingInfo?.isConvergedWebinarWebcast
|
|
194
199
|
? WEBEX_SUB_SERVICE_TYPES.WEBCAST
|
|
195
200
|
: WEBEX_SUB_SERVICE_TYPES.WEBINAR;
|
|
@@ -1005,6 +1010,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
1005
1010
|
webexSubServiceType: this.getSubServiceType(meeting),
|
|
1006
1011
|
// @ts-ignore
|
|
1007
1012
|
webClientPreload: this.webex.meetings?.config?.metrics?.webClientPreload,
|
|
1013
|
+
isVipMeeting: meeting?.meetingInfo?.vipmeeting || false,
|
|
1008
1014
|
};
|
|
1009
1015
|
|
|
1010
1016
|
const joinFlowVersion = options.joinFlowVersion ?? meeting.callStateForMetrics?.joinFlowVersion;
|
|
@@ -284,7 +284,8 @@ export const prepareDiagnosticMetricItem = (webex: any, item: any) => {
|
|
|
284
284
|
devicePairingType: webex.devicemanager.getPairedMethod(),
|
|
285
285
|
deviceURL: pairedDevice.url,
|
|
286
286
|
isPersonalDevice: pairedDevice.mode === 'personal',
|
|
287
|
-
productName:
|
|
287
|
+
productName:
|
|
288
|
+
pairedDevice.devices?.length > 0 ? pairedDevice.devices[0]?.productName : undefined,
|
|
288
289
|
};
|
|
289
290
|
item.eventPayload.event.pairingState = 'paired';
|
|
290
291
|
item.eventPayload.event.pairedDevice = devicePayload;
|
|
@@ -26,6 +26,7 @@ export const WEBEX_SUB_SERVICE_TYPES: Record<string, ClientSubServiceType> = {
|
|
|
26
26
|
SCHEDULED_MEETING: 'ScheduledMeeting',
|
|
27
27
|
WEBINAR: 'Webinar',
|
|
28
28
|
WEBCAST: 'Webcast',
|
|
29
|
+
LARGE_SCALE_WEBINAR: 'LargeScaleWebinar',
|
|
29
30
|
};
|
|
30
31
|
|
|
31
32
|
// Found in https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia
|
|
@@ -136,6 +137,7 @@ export const ERROR_DESCRIPTIONS = {
|
|
|
136
137
|
WEBRTC_API_NOT_AVAILABLE: 'WebrtcApiNotAvailableError',
|
|
137
138
|
WDM_RESTRICTED_REGION: 'WdmRestrictedRegion',
|
|
138
139
|
USER_NOT_ALLOWED_JOIN_WEBINAR: 'UserNotAllowedJoinWebinar',
|
|
140
|
+
INVALID_MEETING_INFO: 'InvalidMeetingInfo',
|
|
139
141
|
};
|
|
140
142
|
|
|
141
143
|
export const SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP = {
|
|
@@ -146,6 +148,8 @@ export const SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP = {
|
|
|
146
148
|
99002: 4100,
|
|
147
149
|
// Cannot find the data. Unkown meeting.
|
|
148
150
|
99009: 4100,
|
|
151
|
+
// The input parameters contain invalid item
|
|
152
|
+
99019: 4105,
|
|
149
153
|
// Meeting is not allow to cross env
|
|
150
154
|
58500: 4100,
|
|
151
155
|
// Input parameters contain invalit item
|
|
@@ -201,6 +205,8 @@ export const SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP = {
|
|
|
201
205
|
423005: 4005,
|
|
202
206
|
// Wrong password or host key with too many requests
|
|
203
207
|
423006: 4005,
|
|
208
|
+
// PanelistPasswordError too many time,please input captcha code
|
|
209
|
+
423008: 4005,
|
|
204
210
|
// PasswordError with right captcha, please input captcha code
|
|
205
211
|
423010: 4005,
|
|
206
212
|
// PasswordOrHostKeyError with right captcha, please input captcha code
|
|
@@ -227,6 +233,8 @@ export const SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP = {
|
|
|
227
233
|
403003: 4101,
|
|
228
234
|
// Attendee email is required
|
|
229
235
|
403030: 4101,
|
|
236
|
+
// webinar need login when un-invited attendee join
|
|
237
|
+
403106: 4104,
|
|
230
238
|
|
|
231
239
|
// ---- Locus ------
|
|
232
240
|
// FREE_USER_MAX_PARTICIPANTS_EXCEEDED
|
|
@@ -696,6 +704,12 @@ export const CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD: Record<number, Partial<ClientEv
|
|
|
696
704
|
category: 'expected',
|
|
697
705
|
fatal: true,
|
|
698
706
|
},
|
|
707
|
+
4105: {
|
|
708
|
+
errorDescription: ERROR_DESCRIPTIONS.INVALID_MEETING_INFO,
|
|
709
|
+
category: 'expected',
|
|
710
|
+
fatal: false,
|
|
711
|
+
shownToUser: true,
|
|
712
|
+
},
|
|
699
713
|
2729: {
|
|
700
714
|
errorDescription: ERROR_DESCRIPTIONS.NO_MEDIA_FOUND,
|
|
701
715
|
category: 'expected',
|
package/src/metrics.types.ts
CHANGED
|
@@ -156,7 +156,6 @@ export type InternalEvent = {
|
|
|
156
156
|
| 'internal.register.device.request'
|
|
157
157
|
| 'internal.register.device.response'
|
|
158
158
|
| 'internal.reset.join.latencies'
|
|
159
|
-
| 'internal.client.meeting.click.joinbutton'
|
|
160
159
|
| 'internal.host.meeting.participant.admitted'
|
|
161
160
|
| 'internal.client.meeting.interstitial-window.showed'
|
|
162
161
|
| 'internal.client.interstitial-window.click.joinbutton'
|
|
@@ -319,6 +318,7 @@ export type PreComputedLatencies =
|
|
|
319
318
|
| 'internal.get.cluster.time'
|
|
320
319
|
| 'internal.click.to.interstitial'
|
|
321
320
|
| 'internal.click.to.interstitial.with.user.delay'
|
|
321
|
+
| 'internal.click.to.interstitial.for.client.jmt'
|
|
322
322
|
| 'internal.refresh.captcha.time'
|
|
323
323
|
| 'internal.exchange.ci.token.time'
|
|
324
324
|
| 'internal.get.u2c.time'
|