@webex/internal-plugin-metrics 3.12.0-next.3 → 3.12.0-next.31
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/batcher.js +3 -0
- package/dist/batcher.js.map +1 -1
- package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js +23 -0
- package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js.map +1 -1
- 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 +80 -8
- package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -1
- package/dist/call-diagnostic/call-diagnostic-metrics.util.js +5 -0
- 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/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/metrics.js +1 -1
- package/dist/metrics.types.js.map +1 -1
- package/dist/prelogin-metrics-batcher.js +23 -0
- package/dist/prelogin-metrics-batcher.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 +69 -13
- package/dist/types/call-diagnostic/config.d.ts +4 -0
- package/dist/types/config.d.ts +1 -0
- package/dist/types/metrics.types.d.ts +2 -2
- package/package.json +11 -11
- package/src/batcher.js +4 -0
- package/src/call-diagnostic/call-diagnostic-metrics-batcher.ts +26 -0
- package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +140 -69
- package/src/call-diagnostic/call-diagnostic-metrics.ts +74 -1
- package/src/call-diagnostic/call-diagnostic-metrics.util.ts +5 -0
- package/src/call-diagnostic/config.ts +14 -0
- package/src/config.js +1 -0
- package/src/metrics.types.ts +1 -1
- package/src/prelogin-metrics-batcher.ts +26 -0
- package/test/unit/spec/batcher.js +43 -0
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +150 -2
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +243 -288
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +764 -159
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +27 -0
- package/test/unit/spec/prelogin-metrics-batcher.ts +190 -36
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_lodash","require","_batcher","_interopRequireDefault","_callDiagnosticMetrics","_utils","PRE_LOGIN_METRICS_IDENTIFIER","PreLoginMetricsBatcher","Batcher","extend","namespace","preLoginId","undefined","savePreLoginId","prepareItem","item","_promise","default","resolve","prepareDiagnosticMetricItem","webex","prepareRequest","queue","forEach","eventPayload","originTime","sent","Date","toISOString","submitHttpRequest","payload","_this","batchId","uniqueId","logger","error","concat","reject","Error","request","method","service","resource","headers","authorization","body","metrics","waitForServiceTimeout","config","then","res","log","catch","err","generateCommonErrorMetadata","_default","exports"],"sources":["prelogin-metrics-batcher.ts"],"sourcesContent":["import {uniqueId} from 'lodash';\nimport Batcher from './batcher';\nimport {prepareDiagnosticMetricItem} from './call-diagnostic/call-diagnostic-metrics.util';\nimport {generateCommonErrorMetadata} from './utils';\n\nconst PRE_LOGIN_METRICS_IDENTIFIER = 'Pre Login Metrics -->';\n\nconst PreLoginMetricsBatcher = Batcher.extend({\n namespace: 'Metrics',\n preLoginId: undefined,\n\n /**\n * Save the pre-login ID.\n * @param {string} preLoginId The pre-login ID to be saved.\n * @returns {void}\n */\n savePreLoginId(preLoginId) {\n this.preLoginId = preLoginId;\n },\n\n /**\n * Prepare item\n * @param {any} item\n * @returns {Promise<any>}\n */\n prepareItem(item) {\n return Promise.resolve(prepareDiagnosticMetricItem(this.webex, item));\n },\n\n /**\n * Prepare request, add time sensitive date etc.\n * @param {any[]} queue\n * @returns {Promise<any[]>}\n */\n prepareRequest(queue) {\n // Add sent timestamp\n queue.forEach((item) => {\n item.eventPayload.originTime = item.eventPayload.originTime || {};\n item.eventPayload.originTime.sent = new Date().toISOString();\n });\n\n return Promise.resolve(queue);\n },\n\n /**\n *\n * @param {any} payload\n * @returns {Promise<any>}\n */\n submitHttpRequest(payload: any) {\n const batchId = uniqueId('prelogin-batch-');\n if (this.preLoginId === undefined) {\n this.webex.logger.error(\n PRE_LOGIN_METRICS_IDENTIFIER,\n `PreLoginMetricsBatcher: @submitHttpRequest#${batchId}. PreLoginId is not set.`\n );\n\n return Promise.reject(new Error('PreLoginId is not set.'));\n }\n\n return this.webex\n .request({\n method: 'POST',\n service: 'metrics',\n resource: 'clientmetrics-prelogin',\n headers: {\n authorization: false,\n 'x-prelogin-userid': this.preLoginId,\n },\n body: {\n metrics: payload,\n },\n waitForServiceTimeout: this.webex.config.metrics.waitForServiceTimeout,\n })\n .then((res) => {\n this.webex.logger.log(\n PRE_LOGIN_METRICS_IDENTIFIER,\n `PreLoginMetricsBatcher: @submitHttpRequest#${batchId}. Request successful.`\n );\n\n return res;\n })\n .catch((err) => {\n this.webex.logger.error(\n PRE_LOGIN_METRICS_IDENTIFIER,\n `PreLoginMetricsBatcher: @submitHttpRequest#${batchId}. Request failed:`,\n `error: ${generateCommonErrorMetadata(err)}`\n );\n\n return Promise.reject(err);\n });\n },\n});\n\nexport default PreLoginMetricsBatcher;\n"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_lodash","require","_batcher","_interopRequireDefault","_callDiagnosticMetrics","_utils","PRE_LOGIN_METRICS_IDENTIFIER","PreLoginMetricsBatcher","Batcher","extend","namespace","preLoginId","undefined","savePreLoginId","prepareItem","item","_promise","default","resolve","prepareDiagnosticMetricItem","webex","prepareRequest","queue","forEach","eventPayload","originTime","sent","Date","toISOString","submitHttpRequest","payload","_this","batchId","uniqueId","logger","error","concat","reject","Error","request","method","service","resource","headers","authorization","body","metrics","waitForServiceTimeout","config","then","res","log","handleHttpResponseStatus","statusCode","catch","err","generateCommonErrorMetadata","shouldMark","_isArray","some","markTelemetryOptOutOnResponse","_this$webex$internal$","_this$webex$internal$2","internal","newMetrics","callDiagnosticMetrics","setIsTelemetryOptOutAutomatic","_default","exports"],"sources":["prelogin-metrics-batcher.ts"],"sourcesContent":["import {uniqueId} from 'lodash';\nimport Batcher from './batcher';\nimport {prepareDiagnosticMetricItem} from './call-diagnostic/call-diagnostic-metrics.util';\nimport {generateCommonErrorMetadata} from './utils';\n\nconst PRE_LOGIN_METRICS_IDENTIFIER = 'Pre Login Metrics -->';\n\nconst PreLoginMetricsBatcher = Batcher.extend({\n namespace: 'Metrics',\n preLoginId: undefined,\n\n /**\n * Save the pre-login ID.\n * @param {string} preLoginId The pre-login ID to be saved.\n * @returns {void}\n */\n savePreLoginId(preLoginId) {\n this.preLoginId = preLoginId;\n },\n\n /**\n * Prepare item\n * @param {any} item\n * @returns {Promise<any>}\n */\n prepareItem(item) {\n return Promise.resolve(prepareDiagnosticMetricItem(this.webex, item));\n },\n\n /**\n * Prepare request, add time sensitive date etc.\n * @param {any[]} queue\n * @returns {Promise<any[]>}\n */\n prepareRequest(queue) {\n // Add sent timestamp\n queue.forEach((item) => {\n item.eventPayload.originTime = item.eventPayload.originTime || {};\n item.eventPayload.originTime.sent = new Date().toISOString();\n });\n\n return Promise.resolve(queue);\n },\n\n /**\n *\n * @param {any} payload\n * @returns {Promise<any>}\n */\n submitHttpRequest(payload: any) {\n const batchId = uniqueId('prelogin-batch-');\n if (this.preLoginId === undefined) {\n this.webex.logger.error(\n PRE_LOGIN_METRICS_IDENTIFIER,\n `PreLoginMetricsBatcher: @submitHttpRequest#${batchId}. PreLoginId is not set.`\n );\n\n return Promise.reject(new Error('PreLoginId is not set.'));\n }\n\n return this.webex\n .request({\n method: 'POST',\n service: 'metrics',\n resource: 'clientmetrics-prelogin',\n headers: {\n authorization: false,\n 'x-prelogin-userid': this.preLoginId,\n },\n body: {\n metrics: payload,\n },\n waitForServiceTimeout: this.webex.config.metrics.waitForServiceTimeout,\n })\n .then((res) => {\n this.webex.logger.log(\n PRE_LOGIN_METRICS_IDENTIFIER,\n `PreLoginMetricsBatcher: @submitHttpRequest#${batchId}. Request successful.`\n );\n\n this.handleHttpResponseStatus(res?.statusCode, payload);\n\n return res;\n })\n .catch((err) => {\n this.webex.logger.error(\n PRE_LOGIN_METRICS_IDENTIFIER,\n `PreLoginMetricsBatcher: @submitHttpRequest#${batchId}. Request failed:`,\n `error: ${generateCommonErrorMetadata(err)}`\n );\n\n this.handleHttpResponseStatus(err?.statusCode, payload);\n\n return Promise.reject(err);\n });\n },\n\n /**\n * React to the HTTP status code returned by the prelogin metrics endpoint.\n * Only items submitted with `markTelemetryOptOutOnResponse: true` opt into\n * this behavior.\n * @param {number | undefined} statusCode\n * @param {any[]} payload Items flushed in this HTTP batch.\n * @returns {void}\n */\n handleHttpResponseStatus(statusCode: number | undefined, payload: any[]) {\n const shouldMark =\n Array.isArray(payload) &&\n payload.some((item) => item?.markTelemetryOptOutOnResponse === true);\n\n if (!shouldMark) {\n return;\n }\n\n if (statusCode === 200) {\n this.webex.internal.newMetrics?.callDiagnosticMetrics?.setIsTelemetryOptOutAutomatic(true);\n }\n },\n});\n\nexport default PreLoginMetricsBatcher;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -149,6 +149,15 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
149
149
|
* @returns - latency
|
|
150
150
|
*/
|
|
151
151
|
getStayLobbyTime(): number;
|
|
152
|
+
/**
|
|
153
|
+
* Stay lobby time capped by a certain timestamp.
|
|
154
|
+
* This is to handle the case where the target end timestamp could happen before the lobby is exited,
|
|
155
|
+
* for example media-engine.ready or client.ice.end
|
|
156
|
+
* This is supposed to be called AFTER the end timestamp happens
|
|
157
|
+
* @param endTimestampKey name of the target end event
|
|
158
|
+
* @returns - latency
|
|
159
|
+
*/
|
|
160
|
+
getStayLobbyTimeCappedBy(endTimestampKey: MetricEventNames): number;
|
|
152
161
|
/**
|
|
153
162
|
* Page JMT
|
|
154
163
|
* @returns - latency
|
|
@@ -36,6 +36,8 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
36
36
|
private isMercuryConnected;
|
|
37
37
|
private eventLimitTracker;
|
|
38
38
|
private eventLimitWarningsLogged;
|
|
39
|
+
private isTelemetryOptOutManual;
|
|
40
|
+
private isTelemetryOptOutAutomatic;
|
|
39
41
|
validator: (options: {
|
|
40
42
|
type: 'mqe' | 'ce';
|
|
41
43
|
event: Event;
|
|
@@ -53,6 +55,29 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
53
55
|
* @returns one of 'login-ci','unverified-guest', null
|
|
54
56
|
*/
|
|
55
57
|
getCurLoginType(): "unverified-guest" | "login-ci";
|
|
58
|
+
/**
|
|
59
|
+
* Returns the user activation state reported from the browser's navigator.userActivation API
|
|
60
|
+
* @returns object with hasBeenActive and isActive booleans, or undefined if unavailable
|
|
61
|
+
*/
|
|
62
|
+
getUserActivation(): {
|
|
63
|
+
hasBeenActive: boolean;
|
|
64
|
+
isActive: boolean;
|
|
65
|
+
} | undefined;
|
|
66
|
+
/**
|
|
67
|
+
* Returns the telemetryOptOut value of the current user
|
|
68
|
+
* @returns one of 'manual', 'automatic', undefined
|
|
69
|
+
*/
|
|
70
|
+
getTelemetryOptOut(): "manual" | "automatic";
|
|
71
|
+
/**
|
|
72
|
+
* Sets the manual telemetry opt-out status for the current user
|
|
73
|
+
* @param value - boolean value indicating manual telemetry opt-out status
|
|
74
|
+
*/
|
|
75
|
+
setIsTelemetryOptOutManual(value: boolean): void;
|
|
76
|
+
/**
|
|
77
|
+
* Sets the automatic telemetry opt-out status for the current user
|
|
78
|
+
* @param value - boolean value indicating automatic telemetry opt-out status
|
|
79
|
+
*/
|
|
80
|
+
setIsTelemetryOptOutAutomatic(value: boolean): void;
|
|
56
81
|
/**
|
|
57
82
|
* Returns if the meeting has converged architecture enabled
|
|
58
83
|
* @param options.meetingId
|
|
@@ -84,6 +109,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
84
109
|
userAgent: string;
|
|
85
110
|
buildType?: "debug" | "test" | "prod" | "tap" | "analyzer-test";
|
|
86
111
|
upgradeChannel?: string;
|
|
112
|
+
upgradeSource?: string;
|
|
87
113
|
instanceId?: string;
|
|
88
114
|
networkType: "wifi" | "ethernet" | "cellular" | "unknown";
|
|
89
115
|
localIP?: string;
|
|
@@ -113,9 +139,17 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
113
139
|
clientVersionStatus?: "CURRENT" | "LEGACY" | "UNSUPPORTED";
|
|
114
140
|
localClientVersion?: string;
|
|
115
141
|
launcherVersion?: string;
|
|
142
|
+
installerVersion?: string;
|
|
143
|
+
installerMajorVersion?: number;
|
|
144
|
+
installerMinorVersion?: number;
|
|
145
|
+
installerRevision?: number;
|
|
116
146
|
modelNumber?: string;
|
|
117
147
|
joinFirstUpdateLater?: "ep-enabled" | "sp-enabled" | "not-enabled";
|
|
118
148
|
standbyUsed?: boolean;
|
|
149
|
+
/**
|
|
150
|
+
* Sets the manual telemetry opt-out status for the current user
|
|
151
|
+
* @param value - boolean value indicating manual telemetry opt-out status
|
|
152
|
+
*/
|
|
119
153
|
prefetchDocShowUsed?: boolean;
|
|
120
154
|
fastJoinUsed?: boolean;
|
|
121
155
|
clientDownloadSize?: number;
|
|
@@ -137,11 +171,12 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
137
171
|
architecture: "unknown" | "intel32" | "intel64" | "amd32" | "amd64" | "arm32" | "arm64" | "armv9" | "armv8" | "armv7" | "armv6" | "x86_64" | "x86_32";
|
|
138
172
|
staticPerformance?: string;
|
|
139
173
|
clockSpeedGigaHertz?: number;
|
|
140
|
-
additionalProperties?:
|
|
174
|
+
additionalProperties?: never;
|
|
141
175
|
};
|
|
142
176
|
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
177
|
videoDisplayMode?: "grid-view" | "active-speaker-view";
|
|
144
|
-
videoLayoutType?: "stack" | "stackWithShare" | "sideBySide" | "sideBySideWithShare" | "grid" | "floatingActive" | "floatingThumbnail" | "floatingGrid" | "overlay" | "focus" | "prominent" | "focusWithShare" | "prominentWithShare" | "equal" | "equalWithShare" | "largeGallery";
|
|
178
|
+
videoLayoutType?: "auto" | "stack" | "stackWithShare" | "sideBySide" | "sideBySideWithShare" | "grid" | "floatingActive" | "floatingThumbnail" | "floatingGrid" | "overlay" | "focus" | "prominent" | "focusWithShare" | "prominentWithShare" | "equal" | "equalWithShare" | "largeGallery" | "autoWithShare";
|
|
179
|
+
appliedLayout?: "auto" | "stack" | "stackWithShare" | "sideBySide" | "sideBySideWithShare" | "grid" | "floatingActive" | "floatingThumbnail" | "floatingGrid" | "overlay" | "focus" | "prominent" | "focusWithShare" | "prominentWithShare" | "equal" | "equalWithShare" | "largeGallery" | "autoWithShare";
|
|
145
180
|
videoRenderType?: "wme" | "client_d3d" | "client_gdi";
|
|
146
181
|
vdiInfo?: {};
|
|
147
182
|
is64BitsClient?: boolean;
|
|
@@ -153,13 +188,24 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
153
188
|
vendorId?: string;
|
|
154
189
|
staticPerformanceLevel?: string;
|
|
155
190
|
staticPerformanceScore?: number;
|
|
156
|
-
|
|
191
|
+
preInstalledTime?: string;
|
|
192
|
+
preInstalledType?: "installer" | "launcher" | "app";
|
|
193
|
+
preInstalledVersion?: string;
|
|
194
|
+
additionalProperties?: never;
|
|
195
|
+
};
|
|
196
|
+
installerInfo?: {
|
|
197
|
+
packageSuffix?: string;
|
|
198
|
+
packageArch?: string;
|
|
199
|
+
launchId?: string;
|
|
200
|
+
packageCount?: number;
|
|
201
|
+
totalSize?: number;
|
|
202
|
+
additionalProperties?: never;
|
|
157
203
|
};
|
|
158
204
|
emmVendorId?: string;
|
|
159
205
|
isHybridMedia?: boolean;
|
|
160
206
|
originData?: {};
|
|
161
207
|
serviceVersion?: string;
|
|
162
|
-
additionalProperties?:
|
|
208
|
+
additionalProperties?: never;
|
|
163
209
|
};
|
|
164
210
|
/**
|
|
165
211
|
* Gather identifier details for call diagnostic payload.
|
|
@@ -172,6 +218,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
172
218
|
participantId?: string;
|
|
173
219
|
breakoutGroupId?: string;
|
|
174
220
|
breakoutMoveId?: string;
|
|
221
|
+
breakoutTrackingId?: string;
|
|
175
222
|
breakoutSessionId?: string;
|
|
176
223
|
browserId?: string;
|
|
177
224
|
ciExchangeTokenUrl?: string;
|
|
@@ -183,7 +230,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
183
230
|
imiAppId: string;
|
|
184
231
|
sessionId: string;
|
|
185
232
|
sessionInstanceId: string;
|
|
186
|
-
additionalProperties?:
|
|
233
|
+
additionalProperties?: never;
|
|
187
234
|
};
|
|
188
235
|
csdmDeviceUrl?: string;
|
|
189
236
|
destinationBreakoutSessionId?: string;
|
|
@@ -200,6 +247,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
200
247
|
callId?: string;
|
|
201
248
|
pairCallId?: string;
|
|
202
249
|
llmWebsocketUrl?: string;
|
|
250
|
+
locusCluster?: string;
|
|
203
251
|
locusId?: string;
|
|
204
252
|
locusJoinUrl?: string;
|
|
205
253
|
locusSessionId?: string;
|
|
@@ -217,6 +265,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
217
265
|
msteamsTenantGuid?: string;
|
|
218
266
|
msteamsConferenceId?: string;
|
|
219
267
|
msteamsMeetingId?: string;
|
|
268
|
+
mtid?: string;
|
|
220
269
|
oauth2ClientId?: string;
|
|
221
270
|
orgId?: string;
|
|
222
271
|
provisionalCorrelationId?: string;
|
|
@@ -227,7 +276,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
227
276
|
sipSessionId?: {
|
|
228
277
|
local?: string;
|
|
229
278
|
remote?: string;
|
|
230
|
-
additionalProperties?:
|
|
279
|
+
additionalProperties?: never;
|
|
231
280
|
};
|
|
232
281
|
sipUri?: string;
|
|
233
282
|
subConfId?: string;
|
|
@@ -255,13 +304,14 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
255
304
|
idForEndpointAB?: string;
|
|
256
305
|
customerOrgId?: string;
|
|
257
306
|
correlationId: string;
|
|
258
|
-
additionalProperties?:
|
|
307
|
+
additionalProperties?: never;
|
|
259
308
|
} | {
|
|
260
309
|
aggregatedBreakoutMoveId?: string;
|
|
261
310
|
attendeeId?: string;
|
|
262
311
|
participantId?: string;
|
|
263
312
|
breakoutGroupId?: string;
|
|
264
313
|
breakoutMoveId?: string;
|
|
314
|
+
breakoutTrackingId?: string;
|
|
265
315
|
breakoutSessionId?: string;
|
|
266
316
|
browserId?: string;
|
|
267
317
|
ciExchangeTokenUrl?: string;
|
|
@@ -273,7 +323,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
273
323
|
imiAppId: string;
|
|
274
324
|
sessionId: string;
|
|
275
325
|
sessionInstanceId: string;
|
|
276
|
-
additionalProperties?:
|
|
326
|
+
additionalProperties?: never;
|
|
277
327
|
};
|
|
278
328
|
csdmDeviceUrl?: string;
|
|
279
329
|
destinationBreakoutSessionId?: string;
|
|
@@ -290,6 +340,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
290
340
|
callId?: string;
|
|
291
341
|
pairCallId?: string;
|
|
292
342
|
llmWebsocketUrl?: string;
|
|
343
|
+
locusCluster?: string;
|
|
293
344
|
locusId?: string;
|
|
294
345
|
locusJoinUrl?: string;
|
|
295
346
|
locusSessionId?: string;
|
|
@@ -307,6 +358,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
307
358
|
msteamsTenantGuid?: string;
|
|
308
359
|
msteamsConferenceId?: string;
|
|
309
360
|
msteamsMeetingId?: string;
|
|
361
|
+
mtid?: string;
|
|
310
362
|
oauth2ClientId?: string;
|
|
311
363
|
orgId?: string;
|
|
312
364
|
provisionalCorrelationId?: string;
|
|
@@ -317,7 +369,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
317
369
|
sipSessionId?: {
|
|
318
370
|
local?: string;
|
|
319
371
|
remote?: string;
|
|
320
|
-
additionalProperties?:
|
|
372
|
+
additionalProperties?: never;
|
|
321
373
|
};
|
|
322
374
|
sipUri?: string;
|
|
323
375
|
subConfId?: string;
|
|
@@ -345,13 +397,14 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
345
397
|
idForEndpointAB?: string;
|
|
346
398
|
customerOrgId?: string;
|
|
347
399
|
correlationId: string;
|
|
348
|
-
additionalProperties?:
|
|
400
|
+
additionalProperties?: never;
|
|
349
401
|
} | {
|
|
350
402
|
aggregatedBreakoutMoveId?: string;
|
|
351
403
|
attendeeId?: string;
|
|
352
404
|
participantId?: string;
|
|
353
405
|
breakoutGroupId?: string;
|
|
354
406
|
breakoutMoveId?: string;
|
|
407
|
+
breakoutTrackingId?: string;
|
|
355
408
|
breakoutSessionId?: string;
|
|
356
409
|
browserId?: string;
|
|
357
410
|
ciExchangeTokenUrl?: string;
|
|
@@ -363,7 +416,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
363
416
|
imiAppId: string;
|
|
364
417
|
sessionId: string;
|
|
365
418
|
sessionInstanceId: string;
|
|
366
|
-
additionalProperties?:
|
|
419
|
+
additionalProperties?: never;
|
|
367
420
|
};
|
|
368
421
|
csdmDeviceUrl?: string;
|
|
369
422
|
destinationBreakoutSessionId?: string;
|
|
@@ -380,6 +433,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
380
433
|
callId?: string;
|
|
381
434
|
pairCallId?: string;
|
|
382
435
|
llmWebsocketUrl?: string;
|
|
436
|
+
locusCluster?: string;
|
|
383
437
|
locusId?: string;
|
|
384
438
|
locusJoinUrl?: string;
|
|
385
439
|
locusSessionId?: string;
|
|
@@ -397,6 +451,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
397
451
|
msteamsTenantGuid?: string;
|
|
398
452
|
msteamsConferenceId?: string;
|
|
399
453
|
msteamsMeetingId?: string;
|
|
454
|
+
mtid?: string;
|
|
400
455
|
oauth2ClientId?: string;
|
|
401
456
|
orgId?: string;
|
|
402
457
|
provisionalCorrelationId?: string;
|
|
@@ -407,7 +462,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
407
462
|
sipSessionId?: {
|
|
408
463
|
local?: string;
|
|
409
464
|
remote?: string;
|
|
410
|
-
additionalProperties?:
|
|
465
|
+
additionalProperties?: never;
|
|
411
466
|
};
|
|
412
467
|
sipUri?: string;
|
|
413
468
|
subConfId?: string;
|
|
@@ -435,7 +490,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
435
490
|
idForEndpointAB?: string;
|
|
436
491
|
customerOrgId?: string;
|
|
437
492
|
correlationId: string;
|
|
438
|
-
additionalProperties?:
|
|
493
|
+
additionalProperties?: never;
|
|
439
494
|
};
|
|
440
495
|
/**
|
|
441
496
|
* Create diagnostic event, which can hold client event, feature event or MQE event data.
|
|
@@ -606,6 +661,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
606
661
|
* Prepare the event and send the request to metrics-a service, pre login.
|
|
607
662
|
* @param event
|
|
608
663
|
* @param preLoginId
|
|
664
|
+
* @param markTelemetryOptOutOnResponse
|
|
609
665
|
* @returns
|
|
610
666
|
*/
|
|
611
667
|
submitToCallDiagnosticsPreLogin: (event: Event, preLoginId?: string) => Promise<any>;
|
|
@@ -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;
|
package/dist/types/config.d.ts
CHANGED
|
@@ -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.2073",
|
|
28
27
|
"@webex/jest-config-legacy": "0.0.0",
|
|
29
28
|
"@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.
|
|
29
|
+
"@webex/test-helper-chai": "3.12.0-next.5",
|
|
30
|
+
"@webex/test-helper-mocha": "3.12.0-next.5",
|
|
31
|
+
"@webex/test-helper-mock-webex": "3.12.0-next.5",
|
|
32
|
+
"@webex/test-helper-test-users": "3.12.0-next.5",
|
|
34
33
|
"eslint": "^8.24.0",
|
|
35
34
|
"prettier": "^2.7.1",
|
|
36
35
|
"sinon": "^9.2.4"
|
|
37
36
|
},
|
|
38
37
|
"dependencies": {
|
|
39
|
-
"@webex/common": "3.
|
|
40
|
-
"@webex/common-timers": "3.
|
|
41
|
-
"@webex/
|
|
42
|
-
"@webex/test-helper-
|
|
43
|
-
"@webex/webex
|
|
38
|
+
"@webex/common": "3.12.0-next.5",
|
|
39
|
+
"@webex/common-timers": "3.12.0-next.5",
|
|
40
|
+
"@webex/event-dictionary-ts": "^1.0.2215",
|
|
41
|
+
"@webex/test-helper-chai": "3.12.0-next.5",
|
|
42
|
+
"@webex/test-helper-mock-webex": "3.12.0-next.5",
|
|
43
|
+
"@webex/webex-core": "3.12.0-next.31",
|
|
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.31"
|
|
57
57
|
}
|
package/src/batcher.js
CHANGED
|
@@ -75,6 +75,10 @@ const MetricsBatcher = Batcher.extend({
|
|
|
75
75
|
*/
|
|
76
76
|
handleHttpError(reason) {
|
|
77
77
|
if (reason instanceof WebexHttpError.NetworkOrCORSError) {
|
|
78
|
+
if (!this.config.batcherRetryOnNetworkError) {
|
|
79
|
+
return Reflect.apply(Batcher.prototype.handleHttpError, this, [reason]);
|
|
80
|
+
}
|
|
81
|
+
|
|
78
82
|
this.logger.warn(
|
|
79
83
|
'metrics-batcher: received network error submitting metrics, reenqueuing payload'
|
|
80
84
|
);
|
|
@@ -55,6 +55,8 @@ const CallDiagnosticEventsBatcher = Batcher.extend({
|
|
|
55
55
|
`CallDiagnosticEventsBatcher: @submitHttpRequest#${batchId}. Request successful.`
|
|
56
56
|
);
|
|
57
57
|
|
|
58
|
+
this.handleHttpResponseStatus(res?.statusCode, payload);
|
|
59
|
+
|
|
58
60
|
return res;
|
|
59
61
|
})
|
|
60
62
|
.catch((err) => {
|
|
@@ -64,9 +66,33 @@ const CallDiagnosticEventsBatcher = Batcher.extend({
|
|
|
64
66
|
`error: ${generateCommonErrorMetadata(err)}`
|
|
65
67
|
);
|
|
66
68
|
|
|
69
|
+
this.handleHttpResponseStatus(err?.statusCode, payload);
|
|
70
|
+
|
|
67
71
|
return Promise.reject(err);
|
|
68
72
|
});
|
|
69
73
|
},
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* React to the HTTP status code returned by the metrics endpoint.
|
|
77
|
+
* Only items submitted with `markTelemetryOptOutOnResponse: true` opt into
|
|
78
|
+
* this behavior.
|
|
79
|
+
* @param {number | undefined} statusCode
|
|
80
|
+
* @param {any[]} payload Items flushed in this HTTP batch.
|
|
81
|
+
* @returns {void}
|
|
82
|
+
*/
|
|
83
|
+
handleHttpResponseStatus(statusCode: number | undefined, payload: any[]) {
|
|
84
|
+
const shouldMark =
|
|
85
|
+
Array.isArray(payload) &&
|
|
86
|
+
payload.some((item) => item?.markTelemetryOptOutOnResponse === true);
|
|
87
|
+
|
|
88
|
+
if (!shouldMark) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (statusCode === 200) {
|
|
93
|
+
this.webex.internal.newMetrics?.callDiagnosticMetrics?.setIsTelemetryOptOutAutomatic(true);
|
|
94
|
+
}
|
|
95
|
+
},
|
|
70
96
|
});
|
|
71
97
|
|
|
72
98
|
export default CallDiagnosticEventsBatcher;
|