@webex/internal-plugin-metrics 3.0.0-beta.380 → 3.0.0-beta.382
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.js +22 -9
- package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -1
- package/dist/metrics.js +1 -1
- package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +3 -1
- package/package.json +8 -8
- package/src/call-diagnostic/call-diagnostic-metrics.ts +13 -0
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +140 -1
|
@@ -433,6 +433,7 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
433
433
|
* @param arg.clientErrorCode
|
|
434
434
|
* @param arg.serviceErrorCode
|
|
435
435
|
* @param arg.payloadOverrides
|
|
436
|
+
* @param arg.httpStatusCode
|
|
436
437
|
* @returns
|
|
437
438
|
*/
|
|
438
439
|
}, {
|
|
@@ -442,7 +443,8 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
442
443
|
serviceErrorCode = _ref3.serviceErrorCode,
|
|
443
444
|
serviceErrorName = _ref3.serviceErrorName,
|
|
444
445
|
rawErrorMessage = _ref3.rawErrorMessage,
|
|
445
|
-
payloadOverrides = _ref3.payloadOverrides
|
|
446
|
+
payloadOverrides = _ref3.payloadOverrides,
|
|
447
|
+
httpStatusCode = _ref3.httpStatusCode;
|
|
446
448
|
var error;
|
|
447
449
|
if (clientErrorCode) {
|
|
448
450
|
var partialParsedError = _config2.CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD[clientErrorCode];
|
|
@@ -464,6 +466,8 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
464
466
|
serviceErrorCode: serviceErrorCode
|
|
465
467
|
}, {
|
|
466
468
|
rawErrorMessage: rawErrorMessage
|
|
469
|
+
}, httpStatusCode === undefined ? {} : {
|
|
470
|
+
httpStatusCode: httpStatusCode
|
|
467
471
|
}, partialParsedError, payloadOverrides || {});
|
|
468
472
|
return error;
|
|
469
473
|
}
|
|
@@ -480,13 +484,15 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
480
484
|
value: function generateClientEventErrorPayload(rawError) {
|
|
481
485
|
var _rawError$error, _rawError$error$body, _rawError$body, _rawError$body2, _rawError$body3, _rawError$body3$reaso;
|
|
482
486
|
var rawErrorMessage = rawError.message;
|
|
487
|
+
var httpStatusCode = rawError.statusCode;
|
|
483
488
|
if (rawError.name) {
|
|
484
489
|
if ((0, _callDiagnosticMetrics.isBrowserMediaErrorName)(rawError.name)) {
|
|
485
490
|
return this.getErrorPayloadForClientErrorCode({
|
|
486
491
|
serviceErrorCode: undefined,
|
|
487
492
|
clientErrorCode: _config2.BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP[rawError.name],
|
|
488
493
|
serviceErrorName: rawError.name,
|
|
489
|
-
rawErrorMessage: rawErrorMessage
|
|
494
|
+
rawErrorMessage: rawErrorMessage,
|
|
495
|
+
httpStatusCode: httpStatusCode
|
|
490
496
|
});
|
|
491
497
|
}
|
|
492
498
|
}
|
|
@@ -498,7 +504,8 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
498
504
|
serviceErrorCode: undefined,
|
|
499
505
|
clientErrorCode: _config2.SDP_OFFER_CREATION_ERROR_MAP[causeType] || _config2.SDP_OFFER_CREATION_ERROR_MAP.GENERAL,
|
|
500
506
|
serviceErrorName: rawError.name,
|
|
501
|
-
rawErrorMessage: rawErrorMessage
|
|
507
|
+
rawErrorMessage: rawErrorMessage,
|
|
508
|
+
httpStatusCode: httpStatusCode
|
|
502
509
|
});
|
|
503
510
|
}
|
|
504
511
|
var serviceErrorCode = (rawError === null || rawError === void 0 ? void 0 : (_rawError$error = rawError.error) === null || _rawError$error === void 0 ? void 0 : (_rawError$error$body = _rawError$error.body) === null || _rawError$error$body === void 0 ? void 0 : _rawError$error$body.errorCode) || (rawError === null || rawError === void 0 ? void 0 : (_rawError$body = rawError.body) === null || _rawError$body === void 0 ? void 0 : _rawError$body.errorCode) || (rawError === null || rawError === void 0 ? void 0 : (_rawError$body2 = rawError.body) === null || _rawError$body2 === void 0 ? void 0 : _rawError$body2.code) || (rawError === null || rawError === void 0 ? void 0 : (_rawError$body3 = rawError.body) === null || _rawError$body3 === void 0 ? void 0 : (_rawError$body3$reaso = _rawError$body3.reason) === null || _rawError$body3$reaso === void 0 ? void 0 : _rawError$body3$reaso.reasonCode);
|
|
@@ -508,7 +515,8 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
508
515
|
return this.getErrorPayloadForClientErrorCode({
|
|
509
516
|
clientErrorCode: clientErrorCode,
|
|
510
517
|
serviceErrorCode: serviceErrorCode,
|
|
511
|
-
rawErrorMessage: rawErrorMessage
|
|
518
|
+
rawErrorMessage: rawErrorMessage,
|
|
519
|
+
httpStatusCode: httpStatusCode
|
|
512
520
|
});
|
|
513
521
|
}
|
|
514
522
|
|
|
@@ -517,7 +525,8 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
517
525
|
return this.getErrorPayloadForClientErrorCode({
|
|
518
526
|
clientErrorCode: _config2.NEW_LOCUS_ERROR_CLIENT_CODE,
|
|
519
527
|
serviceErrorCode: serviceErrorCode,
|
|
520
|
-
rawErrorMessage: rawErrorMessage
|
|
528
|
+
rawErrorMessage: rawErrorMessage,
|
|
529
|
+
httpStatusCode: httpStatusCode
|
|
521
530
|
});
|
|
522
531
|
}
|
|
523
532
|
}
|
|
@@ -525,7 +534,8 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
525
534
|
return this.getErrorPayloadForClientErrorCode({
|
|
526
535
|
clientErrorCode: _config2.MEETING_INFO_LOOKUP_ERROR_CLIENT_CODE,
|
|
527
536
|
serviceErrorCode: serviceErrorCode,
|
|
528
|
-
rawErrorMessage: rawErrorMessage
|
|
537
|
+
rawErrorMessage: rawErrorMessage,
|
|
538
|
+
httpStatusCode: httpStatusCode
|
|
529
539
|
});
|
|
530
540
|
}
|
|
531
541
|
if ((0, _callDiagnosticMetrics.isNetworkError)(rawError)) {
|
|
@@ -533,7 +543,8 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
533
543
|
clientErrorCode: _config2.NETWORK_ERROR,
|
|
534
544
|
serviceErrorCode: serviceErrorCode,
|
|
535
545
|
payloadOverrides: rawError.payloadOverrides,
|
|
536
|
-
rawErrorMessage: rawErrorMessage
|
|
546
|
+
rawErrorMessage: rawErrorMessage,
|
|
547
|
+
httpStatusCode: httpStatusCode
|
|
537
548
|
});
|
|
538
549
|
}
|
|
539
550
|
if ((0, _callDiagnosticMetrics.isUnauthorizedError)(rawError)) {
|
|
@@ -541,7 +552,8 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
541
552
|
clientErrorCode: _config2.AUTHENTICATION_FAILED_CODE,
|
|
542
553
|
serviceErrorCode: serviceErrorCode,
|
|
543
554
|
payloadOverrides: rawError.payloadOverrides,
|
|
544
|
-
rawErrorMessage: rawErrorMessage
|
|
555
|
+
rawErrorMessage: rawErrorMessage,
|
|
556
|
+
httpStatusCode: httpStatusCode
|
|
545
557
|
});
|
|
546
558
|
}
|
|
547
559
|
|
|
@@ -549,7 +561,8 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
|
|
|
549
561
|
return this.getErrorPayloadForClientErrorCode({
|
|
550
562
|
clientErrorCode: _config2.UNKNOWN_ERROR,
|
|
551
563
|
serviceErrorCode: _config2.UNKNOWN_ERROR,
|
|
552
|
-
rawErrorMessage: rawErrorMessage
|
|
564
|
+
rawErrorMessage: rawErrorMessage,
|
|
565
|
+
httpStatusCode: httpStatusCode
|
|
553
566
|
});
|
|
554
567
|
}
|
|
555
568
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["BrowserDetection","getOSVersion","getBrowserName","getBrowserVersion","CallDiagnosticMetrics","args","options","resolve","event","valid","preLoginId","finalEvent","eventPayload","type","preLoginMetricsBatcher","savePreLoginId","request","logger","webex","callDiagnosticEventsBatcher","CallDiagnosticEventsBatcher","parent","PreLoginMetricsBatcher","canAuthorize","credentials","isUnverifiedGuest","meetingId","meeting","meetings","meetingCollection","get","meetingInfo","enableConvergedArchitecture","undefined","webexScheduled","enableEvent","pmr","WEBEX_SUB_SERVICE_TYPES","PMR","SCHEDULED_MEETING","WEBINAR","defaultClientType","config","metrics","clientType","defaultSubClientType","subClientType","providedClientVersion","clientVersion","defaultSDKClientVersion","CLIENT_NAME","version","versionMetadata","extractVersionMetadata","hasLoggedBrowserSerial","log","CALL_DIAGNOSTIC_LOG_IDENTIFIER","getBrowserSerial","origin","name","networkType","userAgent","userAgentToString","clientName","webexVersion","clientInfo","publicNetworkPrefix","anonymizeIPAddress","geoHintInfo","clientAddress","localNetworkPrefix","statsAnalyzer","getLocalIpAddress","osVersion","os","getOSNameInternal","browser","browserVersion","environment","newEnvironment","clientLaunchMethod","Error","mediaConnections","correlationId","webexConferenceIdStr","globalMeetingId","identifiers","internal","device","userId","deviceId","url","orgId","locusUrl","services","locusInfo","fullState","locusId","split","pop","locusStartTime","lastActive","confIdStr","confID","siteName","webexSiteName","mediaAgentAlias","mediaAgentGroupId","eventData","getOrigin","eventId","uuid","v4","originTime","triggered","Date","toISOString","sent","senderCountryCode","countryCode","clearEmptyKeysRecursively","payload","console","warn","submitClientMetrics","CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND","fields","getIdentifiers","clientEventObject","canProceed","webClientDomain","window","location","hostname","intervals","sourceMetadata","applicationSoftwareType","applicationSoftwareVersion","mediaEngineSoftwareType","mediaEngineSoftwareVersion","startTime","diagnosticEvent","prepareDiagnosticEvent","validator","submitToCallDiagnostics","clientErrorCode","serviceErrorCode","serviceErrorName","rawErrorMessage","payloadOverrides","error","partialParsedError","CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD","fatal","shownToUser","category","errorCode","errorData","errorName","rawError","message","isBrowserMediaErrorName","getErrorPayloadForClientErrorCode","BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP","isSdpOfferCreationError","causeType","cause","SDP_OFFER_CREATION_ERROR_MAP","GENERAL","body","code","reason","reasonCode","SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP","isLocusServiceErrorCode","NEW_LOCUS_ERROR_CLIENT_CODE","isMeetingInfoServiceError","MEETING_INFO_LOOKUP_ERROR_CLIENT_CODE","isNetworkError","NETWORK_ERROR","isUnauthorizedError","AUTHENTICATION_FAILED_CODE","UNKNOWN_ERROR","errors","userType","getCurUserType","loginType","callStateForMetrics","getCurLoginType","isConvergedArchitectureEnabled","getIsConvergedArchitectureEnabled","webexSubServiceType","getSubServiceType","generatedError","generateClientEventErrorPayload","push","createClientEventObjectInMeeting","createClientEventObjectPreMeeting","prepareClientEvent","submitToCallDiagnosticsPreLogin","clientEvent","prepareDiagnosticMetricItem","method","service","resource","headers","waitForServiceTimeout","authorization","prepareFetchOptions","clientErrorPayload","StatelessWebexPlugin"],"sources":["call-diagnostic-metrics.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable class-methods-use-this */\n/* eslint-disable valid-jsdoc */\nimport {getOSNameInternal} from '@webex/internal-plugin-metrics';\nimport {BrowserDetection, getBrowserSerial} from '@webex/common';\nimport uuid from 'uuid';\nimport {merge} from 'lodash';\nimport {StatelessWebexPlugin} from '@webex/webex-core';\n\nimport {\n anonymizeIPAddress,\n clearEmptyKeysRecursively,\n isLocusServiceErrorCode,\n prepareDiagnosticMetricItem,\n userAgentToString,\n extractVersionMetadata,\n isMeetingInfoServiceError,\n isBrowserMediaErrorName,\n isNetworkError,\n isUnauthorizedError,\n isSdpOfferCreationError,\n} from './call-diagnostic-metrics.util';\nimport {CLIENT_NAME} from '../config';\nimport {\n Event,\n ClientType,\n SubClientType,\n NetworkType,\n EnvironmentType,\n NewEnvironmentType,\n ClientEvent,\n SubmitClientEventOptions,\n MediaQualityEvent,\n SubmitMQEOptions,\n SubmitMQEPayload,\n ClientLaunchMethodType,\n ClientEventError,\n ClientEventPayload,\n ClientInfo,\n ClientEventPayloadError,\n ClientSubServiceType,\n} from '../metrics.types';\nimport CallDiagnosticEventsBatcher from './call-diagnostic-metrics-batcher';\nimport PreLoginMetricsBatcher from '../prelogin-metrics-batcher';\n\nimport {\n CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD,\n CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND,\n NEW_LOCUS_ERROR_CLIENT_CODE,\n SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP,\n UNKNOWN_ERROR,\n BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP,\n MEETING_INFO_LOOKUP_ERROR_CLIENT_CODE,\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n NETWORK_ERROR,\n AUTHENTICATION_FAILED_CODE,\n WEBEX_SUB_SERVICE_TYPES,\n SDP_OFFER_CREATION_ERROR_MAP,\n} from './config';\n\nconst {getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();\n\ntype GetOriginOptions = {\n clientType: ClientType;\n subClientType: SubClientType;\n networkType?: NetworkType;\n clientLaunchMethod?: ClientLaunchMethodType;\n environment?: EnvironmentType;\n newEnvironment?: NewEnvironmentType;\n};\n\ntype GetIdentifiersOptions = {\n meeting?: any;\n mediaConnections?: any[];\n correlationId?: string;\n preLoginId?: string;\n globalMeetingId?: string;\n webexConferenceIdStr?: string;\n};\n\n/**\n * @description Util class to handle Call Analyzer Metrics\n * @export\n * @class CallDiagnosticMetrics\n */\nexport default class CallDiagnosticMetrics extends StatelessWebexPlugin {\n // @ts-ignore\n private callDiagnosticEventsBatcher: CallDiagnosticEventsBatcher;\n // @ts-ignore\n private preLoginMetricsBatcher: PreLoginMetricsBatcher;\n\n private logger: any; // to avoid adding @ts-ignore everywhere\n private hasLoggedBrowserSerial: boolean;\n // the default validator before piping an event to the batcher\n // this function can be overridden by the user\n public validator: (options: {\n type: 'mqe' | 'ce';\n event: Event;\n }) => Promise<{event: Event; valid: boolean}> = (options: {type: 'mqe' | 'ce'; event: Event}) =>\n Promise.resolve({event: options?.event, valid: true});\n\n /**\n * Constructor\n * @param args\n */\n constructor(...args) {\n super(...args);\n // @ts-ignore\n this.logger = this.webex.logger;\n // @ts-ignore\n this.callDiagnosticEventsBatcher = new CallDiagnosticEventsBatcher({}, {parent: this.webex});\n // @ts-ignore\n this.preLoginMetricsBatcher = new PreLoginMetricsBatcher({}, {parent: this.webex});\n }\n\n /**\n * Returns the login type of the current user\n * @returns one of 'login-ci','unverified-guest', null\n */\n getCurLoginType() {\n // @ts-ignore\n if (this.webex.canAuthorize) {\n // @ts-ignore\n return this.webex.credentials.isUnverifiedGuest ? 'unverified-guest' : 'login-ci';\n }\n\n return null;\n }\n\n /**\n * Returns if the meeting has converged architecture enabled\n * @param options.meetingId\n */\n getIsConvergedArchitectureEnabled({meetingId}: {meetingId?: string}): boolean {\n if (meetingId) {\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.get(meetingId);\n\n return meeting?.meetingInfo?.enableConvergedArchitecture;\n }\n\n return undefined;\n }\n\n /**\n * Returns meeting's subServiceType\n * @param meeting\n * @returns\n */\n getSubServiceType(meeting?: any): ClientSubServiceType {\n if (meeting) {\n // @ts-ignore\n const meetingInfo = meeting?.meetingInfo;\n // if not Scheduled, not Webinar, pmr - then pmr\n if (!meetingInfo?.webexScheduled && !meetingInfo?.enableEvent && meetingInfo?.pmr) {\n return WEBEX_SUB_SERVICE_TYPES.PMR;\n }\n // if Scheduled, not Webinar, not pmr - then ScheduledMeeting\n if (meetingInfo?.webexScheduled && !meetingInfo?.enableEvent && !meetingInfo?.pmr) {\n return WEBEX_SUB_SERVICE_TYPES.SCHEDULED_MEETING;\n }\n // if Scheduled, Webinar, not pmr - then Webinar\n if (meetingInfo?.webexScheduled && meetingInfo?.enableEvent && !meetingInfo?.pmr) {\n return WEBEX_SUB_SERVICE_TYPES.WEBINAR;\n }\n }\n\n return undefined;\n }\n\n /**\n * Get origin object for Call Diagnostic Event payload.\n * @param options\n * @param meetingId\n * @returns\n */\n getOrigin(options: GetOriginOptions, meetingId?: string) {\n const defaultClientType: ClientType =\n // @ts-ignore\n this.webex.meetings.config?.metrics?.clientType;\n const defaultSubClientType: SubClientType =\n // @ts-ignore\n this.webex.meetings.config?.metrics?.subClientType;\n // @ts-ignore\n const providedClientVersion: string = this.webex.meetings.config?.metrics?.clientVersion;\n // @ts-ignore\n const defaultSDKClientVersion = `${CLIENT_NAME}/${this.webex.version}`;\n\n let versionMetadata: Pick<ClientInfo, 'majorVersion' | 'minorVersion'> = {};\n\n // sdk version split doesn't really make sense for now...\n if (providedClientVersion) {\n versionMetadata = extractVersionMetadata(providedClientVersion);\n }\n\n if (!this.hasLoggedBrowserSerial) {\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n `CallDiagnosticMetrics: @createClientEventObjectInMeeting => collected browser data`,\n JSON.stringify(getBrowserSerial())\n );\n\n this.hasLoggedBrowserSerial = true;\n }\n\n if (\n (defaultClientType && defaultSubClientType) ||\n (options.clientType && options.subClientType)\n ) {\n const origin: Event['origin'] = {\n name: 'endpoint',\n networkType: options?.networkType || 'unknown',\n userAgent: userAgentToString({\n // @ts-ignore\n clientName: this.webex.meetings?.config?.metrics?.clientName,\n // @ts-ignore\n webexVersion: this.webex.version,\n }),\n clientInfo: {\n clientType: options?.clientType || defaultClientType,\n clientVersion: providedClientVersion || defaultSDKClientVersion,\n ...versionMetadata,\n publicNetworkPrefix:\n // @ts-ignore\n anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress) || undefined,\n localNetworkPrefix:\n anonymizeIPAddress(\n // @ts-ignore\n this.webex.meetings.meetingCollection\n .get(meetingId)\n ?.statsAnalyzer?.getLocalIpAddress()\n ) || undefined,\n osVersion: getOSVersion() || 'unknown',\n subClientType: options?.subClientType || defaultSubClientType,\n os: getOSNameInternal(),\n browser: getBrowserName(),\n browserVersion: getBrowserVersion(),\n },\n };\n\n if (meetingId) {\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.get(meetingId);\n if (meeting?.environment) {\n origin.environment = meeting.environment;\n }\n }\n\n if (options?.environment) {\n origin.environment = options.environment;\n }\n\n if (options?.newEnvironment) {\n origin.newEnvironment = options.newEnvironment;\n }\n\n if (options?.clientLaunchMethod) {\n origin.clientInfo.clientLaunchMethod = options.clientLaunchMethod;\n }\n\n return origin;\n }\n\n throw new Error(\"ClientType and SubClientType can't be undefined\");\n }\n\n /**\n * Gather identifier details for call diagnostic payload.\n * @throws Error if initialization fails.\n * @param options\n */\n getIdentifiers(options: GetIdentifiersOptions) {\n const {\n meeting,\n mediaConnections,\n correlationId,\n webexConferenceIdStr,\n globalMeetingId,\n preLoginId,\n } = options;\n const identifiers: Event['event']['identifiers'] = {\n correlationId: 'unknown',\n };\n\n if (meeting) {\n identifiers.correlationId = meeting.correlationId;\n }\n\n if (correlationId) {\n identifiers.correlationId = correlationId;\n }\n // @ts-ignore\n if (this.webex.internal) {\n // @ts-ignore\n const {device} = this.webex.internal;\n identifiers.userId = device.userId || preLoginId;\n identifiers.deviceId = device.url;\n identifiers.orgId = device.orgId;\n // @ts-ignore\n identifiers.locusUrl = this.webex.internal.services.get('locus');\n }\n\n if (meeting?.locusInfo?.fullState) {\n identifiers.locusUrl = meeting.locusUrl;\n identifiers.locusId = meeting.locusUrl && meeting.locusUrl.split('/').pop();\n identifiers.locusStartTime =\n meeting.locusInfo.fullState && meeting.locusInfo.fullState.lastActive;\n }\n\n if (meeting?.meetingInfo?.confIdStr || meeting?.meetingInfo?.confID) {\n identifiers.webexConferenceIdStr = `${\n meeting.meetingInfo?.confIdStr || meeting.meetingInfo?.confID\n }`;\n }\n\n if (meeting?.meetingInfo?.meetingId) {\n identifiers.globalMeetingId = meeting.meetingInfo?.meetingId;\n }\n\n if (meeting?.meetingInfo?.siteName) {\n identifiers.webexSiteName = meeting.meetingInfo?.siteName;\n }\n\n if (mediaConnections) {\n identifiers.mediaAgentAlias = mediaConnections?.[0]?.mediaAgentAlias;\n identifiers.mediaAgentGroupId = mediaConnections?.[0]?.mediaAgentGroupId;\n }\n\n if (!identifiers?.webexConferenceIdStr && webexConferenceIdStr) {\n identifiers.webexConferenceIdStr = `${webexConferenceIdStr}`;\n }\n\n if (!identifiers?.globalMeetingId && globalMeetingId) {\n identifiers.globalMeetingId = globalMeetingId;\n }\n\n if (identifiers.correlationId === undefined) {\n throw new Error('Identifiers initialization failed.');\n }\n\n return identifiers;\n }\n\n /**\n * Create diagnostic event, which can hold client event, feature event or MQE event data.\n * This just initiates the shared properties that are required for all the 3 event categories.\n * @param eventData\n * @param options\n * @returns\n */\n prepareDiagnosticEvent(eventData: Event['event'], options: any) {\n const {meetingId} = options;\n const origin = this.getOrigin(options, meetingId);\n\n const event: Event = {\n eventId: uuid.v4(),\n version: 1,\n origin,\n originTime: {\n triggered: new Date().toISOString(),\n // is overridden in prepareRequest batcher\n sent: 'not_defined_yet',\n },\n // @ts-ignore\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: eventData,\n };\n\n // sanitize (remove empty properties, CA requires it)\n // but we don't want to sanitize MQE as most of the times\n // values will be 0, [] etc, and they are required.\n if (eventData.name !== 'client.mediaquality.event') {\n clearEmptyKeysRecursively(event);\n }\n\n return event;\n }\n\n /**\n * TODO: NOT IMPLEMENTED\n * Submit Feature Event\n * @returns\n */\n public submitFeatureEvent() {\n throw Error('Not implemented');\n }\n\n /**\n * Submit Media Quality Event\n * @param args - submit params\n * @param arg.name - event key\n * @param arg.payload - additional payload to be merge with the default payload\n * @param arg.options - options\n */\n submitMQE({\n name,\n payload,\n options,\n }: {\n name: MediaQualityEvent['name'];\n payload: SubmitMQEPayload;\n options: SubmitMQEOptions;\n }) {\n const {meetingId, mediaConnections, webexConferenceIdStr, globalMeetingId} = options;\n\n // events that will most likely happen in join phase\n if (meetingId) {\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.get(meetingId);\n\n if (!meeting) {\n console.warn(\n 'Attempt to send MQE but no meeting was found...',\n `event: ${name}, meetingId: ${meetingId}`\n );\n // @ts-ignore\n this.webex.internal.metrics.submitClientMetrics(CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND, {\n fields: {\n meetingId,\n name,\n },\n });\n\n return;\n }\n\n // merge identifiers\n const identifiers = this.getIdentifiers({\n meeting,\n mediaConnections: meeting.mediaConnections || mediaConnections,\n webexConferenceIdStr,\n globalMeetingId,\n });\n\n // create media quality event object\n let clientEventObject: MediaQualityEvent['payload'] = {\n name,\n canProceed: true,\n identifiers,\n eventData: {\n webClientDomain: window.location.hostname,\n },\n intervals: payload.intervals,\n sourceMetadata: {\n applicationSoftwareType: CLIENT_NAME,\n // @ts-ignore\n applicationSoftwareVersion: this.webex.version,\n mediaEngineSoftwareType: getBrowserName() || 'browser',\n mediaEngineSoftwareVersion: getOSVersion() || 'unknown',\n startTime: new Date().toISOString(),\n },\n };\n\n // merge any new properties, or override existing ones\n clientEventObject = merge(clientEventObject, payload);\n\n // append media quality event data to the call diagnostic event\n const diagnosticEvent = this.prepareDiagnosticEvent(clientEventObject, options);\n this.validator({type: 'mqe', event: diagnosticEvent});\n this.submitToCallDiagnostics(diagnosticEvent);\n } else {\n throw new Error(\n 'Media quality events cant be sent outside the context of a meeting. Meeting id is required.'\n );\n }\n }\n\n /**\n * Return Client Event payload by client error code\n * @param arg - get error arg\n * @param arg.clientErrorCode\n * @param arg.serviceErrorCode\n * @param arg.payloadOverrides\n * @returns\n */\n public getErrorPayloadForClientErrorCode({\n clientErrorCode,\n serviceErrorCode,\n serviceErrorName,\n rawErrorMessage,\n payloadOverrides,\n }: {\n clientErrorCode: number;\n serviceErrorCode: any;\n serviceErrorName?: any;\n rawErrorMessage?: string;\n payloadOverrides?: any;\n }): ClientEventError {\n let error: ClientEventError;\n\n if (clientErrorCode) {\n const partialParsedError = CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD[clientErrorCode];\n\n if (partialParsedError) {\n error = merge(\n {fatal: true, shownToUser: false, name: 'other', category: 'other'}, // default values\n {errorCode: clientErrorCode},\n serviceErrorName ? {errorData: {errorName: serviceErrorName}} : {},\n {serviceErrorCode},\n {rawErrorMessage},\n partialParsedError,\n payloadOverrides || {}\n );\n\n return error;\n }\n }\n\n return undefined;\n }\n\n /**\n * Generate error payload for Client Event\n * @param rawError\n */\n generateClientEventErrorPayload(rawError: any) {\n const rawErrorMessage = rawError.message;\n if (rawError.name) {\n if (isBrowserMediaErrorName(rawError.name)) {\n return this.getErrorPayloadForClientErrorCode({\n serviceErrorCode: undefined,\n clientErrorCode: BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP[rawError.name],\n serviceErrorName: rawError.name,\n rawErrorMessage,\n });\n }\n }\n\n if (isSdpOfferCreationError(rawError)) {\n // error code is 30005, but that's not specific enough. we also need to check error.cause.type\n const causeType = rawError.cause?.type;\n\n return this.getErrorPayloadForClientErrorCode({\n serviceErrorCode: undefined,\n clientErrorCode:\n SDP_OFFER_CREATION_ERROR_MAP[causeType] || SDP_OFFER_CREATION_ERROR_MAP.GENERAL,\n serviceErrorName: rawError.name,\n rawErrorMessage,\n });\n }\n\n const serviceErrorCode =\n rawError?.error?.body?.errorCode ||\n rawError?.body?.errorCode ||\n rawError?.body?.code ||\n rawError?.body?.reason?.reasonCode;\n\n if (serviceErrorCode) {\n const clientErrorCode = SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP[serviceErrorCode];\n if (clientErrorCode) {\n return this.getErrorPayloadForClientErrorCode({\n clientErrorCode,\n serviceErrorCode,\n rawErrorMessage,\n });\n }\n\n // by default, if it is locus error, return new locus err\n if (isLocusServiceErrorCode(serviceErrorCode)) {\n return this.getErrorPayloadForClientErrorCode({\n clientErrorCode: NEW_LOCUS_ERROR_CLIENT_CODE,\n serviceErrorCode,\n rawErrorMessage,\n });\n }\n }\n\n if (isMeetingInfoServiceError(rawError)) {\n return this.getErrorPayloadForClientErrorCode({\n clientErrorCode: MEETING_INFO_LOOKUP_ERROR_CLIENT_CODE,\n serviceErrorCode,\n rawErrorMessage,\n });\n }\n\n if (isNetworkError(rawError)) {\n return this.getErrorPayloadForClientErrorCode({\n clientErrorCode: NETWORK_ERROR,\n serviceErrorCode,\n payloadOverrides: rawError.payloadOverrides,\n rawErrorMessage,\n });\n }\n\n if (isUnauthorizedError(rawError)) {\n return this.getErrorPayloadForClientErrorCode({\n clientErrorCode: AUTHENTICATION_FAILED_CODE,\n serviceErrorCode,\n payloadOverrides: rawError.payloadOverrides,\n rawErrorMessage,\n });\n }\n\n // otherwise return unkown error\n return this.getErrorPayloadForClientErrorCode({\n clientErrorCode: UNKNOWN_ERROR,\n serviceErrorCode: UNKNOWN_ERROR,\n rawErrorMessage,\n });\n }\n\n /**\n * Create client event object for in meeting events\n * @param arg - create args\n * @param arg.event - event key\n * @param arg.options - options\n * @returns object\n */\n private createClientEventObjectInMeeting({\n name,\n options,\n errors,\n }: {\n name: ClientEvent['name'];\n options?: SubmitClientEventOptions;\n errors?: ClientEventPayloadError;\n }) {\n const {meetingId, mediaConnections, globalMeetingId, webexConferenceIdStr} = options;\n\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.get(meetingId);\n\n if (!meeting) {\n console.warn(\n 'Attempt to send client event but no meeting was found...',\n `name: ${name}, meetingId: ${meetingId}`\n );\n // @ts-ignore\n this.webex.internal.metrics.submitClientMetrics(CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND, {\n fields: {\n meetingId,\n name,\n },\n });\n\n return undefined;\n }\n\n // grab identifiers\n const identifiers = this.getIdentifiers({\n meeting,\n mediaConnections: meeting?.mediaConnections || mediaConnections,\n webexConferenceIdStr,\n globalMeetingId,\n });\n\n // create client event object\n const clientEventObject: ClientEvent['payload'] = {\n name,\n canProceed: true,\n identifiers,\n errors,\n eventData: {\n webClientDomain: window.location.hostname,\n },\n userType: meeting.getCurUserType(),\n loginType:\n 'loginType' in meeting.callStateForMetrics\n ? meeting.callStateForMetrics.loginType\n : this.getCurLoginType(),\n isConvergedArchitectureEnabled: this.getIsConvergedArchitectureEnabled({\n meetingId,\n }),\n webexSubServiceType: this.getSubServiceType(meeting),\n };\n\n return clientEventObject;\n }\n\n /**\n * Create client event object for pre meeting events\n * @param arg - create args\n * @param arg.event - event key\n * @param arg.options - payload\n * @returns object\n */\n private createClientEventObjectPreMeeting({\n name,\n options,\n errors,\n }: {\n name: ClientEvent['name'];\n options?: SubmitClientEventOptions;\n errors?: ClientEventPayloadError;\n }) {\n const {correlationId, globalMeetingId, webexConferenceIdStr, preLoginId} = options;\n\n // grab identifiers\n const identifiers = this.getIdentifiers({\n correlationId,\n preLoginId,\n globalMeetingId,\n webexConferenceIdStr,\n });\n\n // create client event object\n const clientEventObject: ClientEvent['payload'] = {\n name,\n errors,\n canProceed: true,\n identifiers,\n eventData: {\n webClientDomain: window.location.hostname,\n },\n loginType: this.getCurLoginType(),\n };\n\n return clientEventObject;\n }\n\n /**\n * Prepare Client Event CA event.\n * @param arg - submit params\n * @param arg.event - event key\n * @param arg.payload - additional payload to be merged with default payload\n * @param arg.options - payload\n * @returns {any} options to be with fetch\n * @throws\n */\n private prepareClientEvent({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: ClientEventPayload;\n options?: SubmitClientEventOptions;\n }) {\n const {meetingId, correlationId, rawError} = options;\n let clientEventObject: ClientEvent['payload'];\n\n // check if we need to generate errors\n const errors: ClientEventPayloadError = [];\n\n if (rawError) {\n const generatedError = this.generateClientEventErrorPayload(rawError);\n if (generatedError) {\n errors.push(generatedError);\n }\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n 'CallDiagnosticMetrics: @prepareClientEvent. Generated errors:',\n `generatedError: ${JSON.stringify(generatedError)}`\n );\n }\n\n // events that will most likely happen in join phase\n if (meetingId) {\n clientEventObject = this.createClientEventObjectInMeeting({name, options, errors});\n } else if (correlationId) {\n // any pre join events or events that are outside the meeting.\n clientEventObject = this.createClientEventObjectPreMeeting({name, options, errors});\n } else {\n throw new Error('Not implemented');\n }\n\n // merge any new properties, or override existing ones\n clientEventObject = merge(clientEventObject, payload);\n\n // append client event data to the call diagnostic event\n const diagnosticEvent = this.prepareDiagnosticEvent(clientEventObject, options);\n\n return diagnosticEvent;\n }\n\n /**\n * Submit Client Event CA event.\n * @param arg - submit params\n * @param arg.event - event key\n * @param arg.payload - additional payload to be merged with default payload\n * @param arg.options - payload\n * @throws\n */\n public submitClientEvent({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: ClientEventPayload;\n options?: SubmitClientEventOptions;\n }) {\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n 'CallDiagnosticMetrics: @submitClientEvent. Submit Client Event CA event.',\n `name: ${name}`\n );\n const diagnosticEvent = this.prepareClientEvent({name, payload, options});\n\n if (options?.preLoginId) {\n return this.submitToCallDiagnosticsPreLogin(diagnosticEvent, options?.preLoginId);\n }\n\n this.validator({type: 'ce', event: diagnosticEvent});\n\n return this.submitToCallDiagnostics(diagnosticEvent);\n }\n\n /**\n * Prepare the event and send the request to metrics-a service.\n * @param event\n * @returns promise\n */\n submitToCallDiagnostics(event: Event): Promise<any> {\n // build metrics-a event type\n const finalEvent = {\n eventPayload: event,\n type: ['diagnostic-event'],\n };\n\n return this.callDiagnosticEventsBatcher.request(finalEvent);\n }\n\n /**\n * Prepare the event and send the request to metrics-a service, pre login.\n * @param event\n * @param preLoginId\n * @returns\n */\n submitToCallDiagnosticsPreLogin = (event: Event, preLoginId?: string): Promise<any> => {\n // build metrics-a event type\n const finalEvent = {\n eventPayload: event,\n type: ['diagnostic-event'],\n };\n this.preLoginMetricsBatcher.savePreLoginId(preLoginId);\n\n return this.preLoginMetricsBatcher.request(finalEvent);\n };\n\n /**\n * Builds a request options object to later be passed to fetch().\n * @param arg - submit params\n * @param arg.event - event key\n * @param arg.payload - additional payload to be merged with default payload\n * @param arg.options - client event options\n * @returns {Promise<any>}\n * @throws\n */\n public async buildClientEventFetchRequestOptions({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: ClientEventPayload;\n options?: SubmitClientEventOptions;\n }): Promise<any> {\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n 'CallDiagnosticMetrics: @buildClientEventFetchRequestOptions. Building request options object for fetch()...',\n `name: ${name}`\n );\n\n const clientEvent = this.prepareClientEvent({name, payload, options});\n\n // build metrics-a event type\n // @ts-ignore\n const diagnosticEvent = prepareDiagnosticMetricItem(this.webex, {\n eventPayload: clientEvent,\n type: ['diagnostic-event'],\n });\n\n const request = {\n method: 'POST',\n service: 'metrics',\n resource: 'clientmetrics',\n body: {\n metrics: [diagnosticEvent],\n },\n headers: {},\n // @ts-ignore\n waitForServiceTimeout: this.webex.internal.metrics.config.waitForServiceTimeout,\n };\n\n if (options.preLoginId) {\n request.headers = {\n authorization: false,\n 'x-prelogin-userid': options.preLoginId,\n };\n request.resource = 'clientmetrics-prelogin';\n }\n\n // @ts-ignore\n return this.webex.prepareFetchOptions(request);\n }\n\n /**\n * Returns true if the specified serviceErrorCode maps to an expected error.\n * @param {number} serviceErrorCode the service error code\n * @returns {boolean}\n */\n public isServiceErrorExpected(serviceErrorCode: number): boolean {\n const clientErrorCode = SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP[serviceErrorCode];\n const clientErrorPayload = CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD[clientErrorCode];\n\n return clientErrorPayload?.category === 'expected';\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["BrowserDetection","getOSVersion","getBrowserName","getBrowserVersion","CallDiagnosticMetrics","args","options","resolve","event","valid","preLoginId","finalEvent","eventPayload","type","preLoginMetricsBatcher","savePreLoginId","request","logger","webex","callDiagnosticEventsBatcher","CallDiagnosticEventsBatcher","parent","PreLoginMetricsBatcher","canAuthorize","credentials","isUnverifiedGuest","meetingId","meeting","meetings","meetingCollection","get","meetingInfo","enableConvergedArchitecture","undefined","webexScheduled","enableEvent","pmr","WEBEX_SUB_SERVICE_TYPES","PMR","SCHEDULED_MEETING","WEBINAR","defaultClientType","config","metrics","clientType","defaultSubClientType","subClientType","providedClientVersion","clientVersion","defaultSDKClientVersion","CLIENT_NAME","version","versionMetadata","extractVersionMetadata","hasLoggedBrowserSerial","log","CALL_DIAGNOSTIC_LOG_IDENTIFIER","getBrowserSerial","origin","name","networkType","userAgent","userAgentToString","clientName","webexVersion","clientInfo","publicNetworkPrefix","anonymizeIPAddress","geoHintInfo","clientAddress","localNetworkPrefix","statsAnalyzer","getLocalIpAddress","osVersion","os","getOSNameInternal","browser","browserVersion","environment","newEnvironment","clientLaunchMethod","Error","mediaConnections","correlationId","webexConferenceIdStr","globalMeetingId","identifiers","internal","device","userId","deviceId","url","orgId","locusUrl","services","locusInfo","fullState","locusId","split","pop","locusStartTime","lastActive","confIdStr","confID","siteName","webexSiteName","mediaAgentAlias","mediaAgentGroupId","eventData","getOrigin","eventId","uuid","v4","originTime","triggered","Date","toISOString","sent","senderCountryCode","countryCode","clearEmptyKeysRecursively","payload","console","warn","submitClientMetrics","CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND","fields","getIdentifiers","clientEventObject","canProceed","webClientDomain","window","location","hostname","intervals","sourceMetadata","applicationSoftwareType","applicationSoftwareVersion","mediaEngineSoftwareType","mediaEngineSoftwareVersion","startTime","diagnosticEvent","prepareDiagnosticEvent","validator","submitToCallDiagnostics","clientErrorCode","serviceErrorCode","serviceErrorName","rawErrorMessage","payloadOverrides","httpStatusCode","error","partialParsedError","CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD","fatal","shownToUser","category","errorCode","errorData","errorName","rawError","message","statusCode","isBrowserMediaErrorName","getErrorPayloadForClientErrorCode","BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP","isSdpOfferCreationError","causeType","cause","SDP_OFFER_CREATION_ERROR_MAP","GENERAL","body","code","reason","reasonCode","SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP","isLocusServiceErrorCode","NEW_LOCUS_ERROR_CLIENT_CODE","isMeetingInfoServiceError","MEETING_INFO_LOOKUP_ERROR_CLIENT_CODE","isNetworkError","NETWORK_ERROR","isUnauthorizedError","AUTHENTICATION_FAILED_CODE","UNKNOWN_ERROR","errors","userType","getCurUserType","loginType","callStateForMetrics","getCurLoginType","isConvergedArchitectureEnabled","getIsConvergedArchitectureEnabled","webexSubServiceType","getSubServiceType","generatedError","generateClientEventErrorPayload","push","createClientEventObjectInMeeting","createClientEventObjectPreMeeting","prepareClientEvent","submitToCallDiagnosticsPreLogin","clientEvent","prepareDiagnosticMetricItem","method","service","resource","headers","waitForServiceTimeout","authorization","prepareFetchOptions","clientErrorPayload","StatelessWebexPlugin"],"sources":["call-diagnostic-metrics.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable class-methods-use-this */\n/* eslint-disable valid-jsdoc */\nimport {getOSNameInternal} from '@webex/internal-plugin-metrics';\nimport {BrowserDetection, getBrowserSerial} from '@webex/common';\nimport uuid from 'uuid';\nimport {merge} from 'lodash';\nimport {StatelessWebexPlugin} from '@webex/webex-core';\n\nimport {\n anonymizeIPAddress,\n clearEmptyKeysRecursively,\n isLocusServiceErrorCode,\n prepareDiagnosticMetricItem,\n userAgentToString,\n extractVersionMetadata,\n isMeetingInfoServiceError,\n isBrowserMediaErrorName,\n isNetworkError,\n isUnauthorizedError,\n isSdpOfferCreationError,\n} from './call-diagnostic-metrics.util';\nimport {CLIENT_NAME} from '../config';\nimport {\n Event,\n ClientType,\n SubClientType,\n NetworkType,\n EnvironmentType,\n NewEnvironmentType,\n ClientEvent,\n SubmitClientEventOptions,\n MediaQualityEvent,\n SubmitMQEOptions,\n SubmitMQEPayload,\n ClientLaunchMethodType,\n ClientEventError,\n ClientEventPayload,\n ClientInfo,\n ClientEventPayloadError,\n ClientSubServiceType,\n} from '../metrics.types';\nimport CallDiagnosticEventsBatcher from './call-diagnostic-metrics-batcher';\nimport PreLoginMetricsBatcher from '../prelogin-metrics-batcher';\n\nimport {\n CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD,\n CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND,\n NEW_LOCUS_ERROR_CLIENT_CODE,\n SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP,\n UNKNOWN_ERROR,\n BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP,\n MEETING_INFO_LOOKUP_ERROR_CLIENT_CODE,\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n NETWORK_ERROR,\n AUTHENTICATION_FAILED_CODE,\n WEBEX_SUB_SERVICE_TYPES,\n SDP_OFFER_CREATION_ERROR_MAP,\n} from './config';\n\nconst {getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();\n\ntype GetOriginOptions = {\n clientType: ClientType;\n subClientType: SubClientType;\n networkType?: NetworkType;\n clientLaunchMethod?: ClientLaunchMethodType;\n environment?: EnvironmentType;\n newEnvironment?: NewEnvironmentType;\n};\n\ntype GetIdentifiersOptions = {\n meeting?: any;\n mediaConnections?: any[];\n correlationId?: string;\n preLoginId?: string;\n globalMeetingId?: string;\n webexConferenceIdStr?: string;\n};\n\n/**\n * @description Util class to handle Call Analyzer Metrics\n * @export\n * @class CallDiagnosticMetrics\n */\nexport default class CallDiagnosticMetrics extends StatelessWebexPlugin {\n // @ts-ignore\n private callDiagnosticEventsBatcher: CallDiagnosticEventsBatcher;\n // @ts-ignore\n private preLoginMetricsBatcher: PreLoginMetricsBatcher;\n\n private logger: any; // to avoid adding @ts-ignore everywhere\n private hasLoggedBrowserSerial: boolean;\n // the default validator before piping an event to the batcher\n // this function can be overridden by the user\n public validator: (options: {\n type: 'mqe' | 'ce';\n event: Event;\n }) => Promise<{event: Event; valid: boolean}> = (options: {type: 'mqe' | 'ce'; event: Event}) =>\n Promise.resolve({event: options?.event, valid: true});\n\n /**\n * Constructor\n * @param args\n */\n constructor(...args) {\n super(...args);\n // @ts-ignore\n this.logger = this.webex.logger;\n // @ts-ignore\n this.callDiagnosticEventsBatcher = new CallDiagnosticEventsBatcher({}, {parent: this.webex});\n // @ts-ignore\n this.preLoginMetricsBatcher = new PreLoginMetricsBatcher({}, {parent: this.webex});\n }\n\n /**\n * Returns the login type of the current user\n * @returns one of 'login-ci','unverified-guest', null\n */\n getCurLoginType() {\n // @ts-ignore\n if (this.webex.canAuthorize) {\n // @ts-ignore\n return this.webex.credentials.isUnverifiedGuest ? 'unverified-guest' : 'login-ci';\n }\n\n return null;\n }\n\n /**\n * Returns if the meeting has converged architecture enabled\n * @param options.meetingId\n */\n getIsConvergedArchitectureEnabled({meetingId}: {meetingId?: string}): boolean {\n if (meetingId) {\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.get(meetingId);\n\n return meeting?.meetingInfo?.enableConvergedArchitecture;\n }\n\n return undefined;\n }\n\n /**\n * Returns meeting's subServiceType\n * @param meeting\n * @returns\n */\n getSubServiceType(meeting?: any): ClientSubServiceType {\n if (meeting) {\n // @ts-ignore\n const meetingInfo = meeting?.meetingInfo;\n // if not Scheduled, not Webinar, pmr - then pmr\n if (!meetingInfo?.webexScheduled && !meetingInfo?.enableEvent && meetingInfo?.pmr) {\n return WEBEX_SUB_SERVICE_TYPES.PMR;\n }\n // if Scheduled, not Webinar, not pmr - then ScheduledMeeting\n if (meetingInfo?.webexScheduled && !meetingInfo?.enableEvent && !meetingInfo?.pmr) {\n return WEBEX_SUB_SERVICE_TYPES.SCHEDULED_MEETING;\n }\n // if Scheduled, Webinar, not pmr - then Webinar\n if (meetingInfo?.webexScheduled && meetingInfo?.enableEvent && !meetingInfo?.pmr) {\n return WEBEX_SUB_SERVICE_TYPES.WEBINAR;\n }\n }\n\n return undefined;\n }\n\n /**\n * Get origin object for Call Diagnostic Event payload.\n * @param options\n * @param meetingId\n * @returns\n */\n getOrigin(options: GetOriginOptions, meetingId?: string) {\n const defaultClientType: ClientType =\n // @ts-ignore\n this.webex.meetings.config?.metrics?.clientType;\n const defaultSubClientType: SubClientType =\n // @ts-ignore\n this.webex.meetings.config?.metrics?.subClientType;\n // @ts-ignore\n const providedClientVersion: string = this.webex.meetings.config?.metrics?.clientVersion;\n // @ts-ignore\n const defaultSDKClientVersion = `${CLIENT_NAME}/${this.webex.version}`;\n\n let versionMetadata: Pick<ClientInfo, 'majorVersion' | 'minorVersion'> = {};\n\n // sdk version split doesn't really make sense for now...\n if (providedClientVersion) {\n versionMetadata = extractVersionMetadata(providedClientVersion);\n }\n\n if (!this.hasLoggedBrowserSerial) {\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n `CallDiagnosticMetrics: @createClientEventObjectInMeeting => collected browser data`,\n JSON.stringify(getBrowserSerial())\n );\n\n this.hasLoggedBrowserSerial = true;\n }\n\n if (\n (defaultClientType && defaultSubClientType) ||\n (options.clientType && options.subClientType)\n ) {\n const origin: Event['origin'] = {\n name: 'endpoint',\n networkType: options?.networkType || 'unknown',\n userAgent: userAgentToString({\n // @ts-ignore\n clientName: this.webex.meetings?.config?.metrics?.clientName,\n // @ts-ignore\n webexVersion: this.webex.version,\n }),\n clientInfo: {\n clientType: options?.clientType || defaultClientType,\n clientVersion: providedClientVersion || defaultSDKClientVersion,\n ...versionMetadata,\n publicNetworkPrefix:\n // @ts-ignore\n anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress) || undefined,\n localNetworkPrefix:\n anonymizeIPAddress(\n // @ts-ignore\n this.webex.meetings.meetingCollection\n .get(meetingId)\n ?.statsAnalyzer?.getLocalIpAddress()\n ) || undefined,\n osVersion: getOSVersion() || 'unknown',\n subClientType: options?.subClientType || defaultSubClientType,\n os: getOSNameInternal(),\n browser: getBrowserName(),\n browserVersion: getBrowserVersion(),\n },\n };\n\n if (meetingId) {\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.get(meetingId);\n if (meeting?.environment) {\n origin.environment = meeting.environment;\n }\n }\n\n if (options?.environment) {\n origin.environment = options.environment;\n }\n\n if (options?.newEnvironment) {\n origin.newEnvironment = options.newEnvironment;\n }\n\n if (options?.clientLaunchMethod) {\n origin.clientInfo.clientLaunchMethod = options.clientLaunchMethod;\n }\n\n return origin;\n }\n\n throw new Error(\"ClientType and SubClientType can't be undefined\");\n }\n\n /**\n * Gather identifier details for call diagnostic payload.\n * @throws Error if initialization fails.\n * @param options\n */\n getIdentifiers(options: GetIdentifiersOptions) {\n const {\n meeting,\n mediaConnections,\n correlationId,\n webexConferenceIdStr,\n globalMeetingId,\n preLoginId,\n } = options;\n const identifiers: Event['event']['identifiers'] = {\n correlationId: 'unknown',\n };\n\n if (meeting) {\n identifiers.correlationId = meeting.correlationId;\n }\n\n if (correlationId) {\n identifiers.correlationId = correlationId;\n }\n // @ts-ignore\n if (this.webex.internal) {\n // @ts-ignore\n const {device} = this.webex.internal;\n identifiers.userId = device.userId || preLoginId;\n identifiers.deviceId = device.url;\n identifiers.orgId = device.orgId;\n // @ts-ignore\n identifiers.locusUrl = this.webex.internal.services.get('locus');\n }\n\n if (meeting?.locusInfo?.fullState) {\n identifiers.locusUrl = meeting.locusUrl;\n identifiers.locusId = meeting.locusUrl && meeting.locusUrl.split('/').pop();\n identifiers.locusStartTime =\n meeting.locusInfo.fullState && meeting.locusInfo.fullState.lastActive;\n }\n\n if (meeting?.meetingInfo?.confIdStr || meeting?.meetingInfo?.confID) {\n identifiers.webexConferenceIdStr = `${\n meeting.meetingInfo?.confIdStr || meeting.meetingInfo?.confID\n }`;\n }\n\n if (meeting?.meetingInfo?.meetingId) {\n identifiers.globalMeetingId = meeting.meetingInfo?.meetingId;\n }\n\n if (meeting?.meetingInfo?.siteName) {\n identifiers.webexSiteName = meeting.meetingInfo?.siteName;\n }\n\n if (mediaConnections) {\n identifiers.mediaAgentAlias = mediaConnections?.[0]?.mediaAgentAlias;\n identifiers.mediaAgentGroupId = mediaConnections?.[0]?.mediaAgentGroupId;\n }\n\n if (!identifiers?.webexConferenceIdStr && webexConferenceIdStr) {\n identifiers.webexConferenceIdStr = `${webexConferenceIdStr}`;\n }\n\n if (!identifiers?.globalMeetingId && globalMeetingId) {\n identifiers.globalMeetingId = globalMeetingId;\n }\n\n if (identifiers.correlationId === undefined) {\n throw new Error('Identifiers initialization failed.');\n }\n\n return identifiers;\n }\n\n /**\n * Create diagnostic event, which can hold client event, feature event or MQE event data.\n * This just initiates the shared properties that are required for all the 3 event categories.\n * @param eventData\n * @param options\n * @returns\n */\n prepareDiagnosticEvent(eventData: Event['event'], options: any) {\n const {meetingId} = options;\n const origin = this.getOrigin(options, meetingId);\n\n const event: Event = {\n eventId: uuid.v4(),\n version: 1,\n origin,\n originTime: {\n triggered: new Date().toISOString(),\n // is overridden in prepareRequest batcher\n sent: 'not_defined_yet',\n },\n // @ts-ignore\n senderCountryCode: this.webex.meetings.geoHintInfo?.countryCode,\n event: eventData,\n };\n\n // sanitize (remove empty properties, CA requires it)\n // but we don't want to sanitize MQE as most of the times\n // values will be 0, [] etc, and they are required.\n if (eventData.name !== 'client.mediaquality.event') {\n clearEmptyKeysRecursively(event);\n }\n\n return event;\n }\n\n /**\n * TODO: NOT IMPLEMENTED\n * Submit Feature Event\n * @returns\n */\n public submitFeatureEvent() {\n throw Error('Not implemented');\n }\n\n /**\n * Submit Media Quality Event\n * @param args - submit params\n * @param arg.name - event key\n * @param arg.payload - additional payload to be merge with the default payload\n * @param arg.options - options\n */\n submitMQE({\n name,\n payload,\n options,\n }: {\n name: MediaQualityEvent['name'];\n payload: SubmitMQEPayload;\n options: SubmitMQEOptions;\n }) {\n const {meetingId, mediaConnections, webexConferenceIdStr, globalMeetingId} = options;\n\n // events that will most likely happen in join phase\n if (meetingId) {\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.get(meetingId);\n\n if (!meeting) {\n console.warn(\n 'Attempt to send MQE but no meeting was found...',\n `event: ${name}, meetingId: ${meetingId}`\n );\n // @ts-ignore\n this.webex.internal.metrics.submitClientMetrics(CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND, {\n fields: {\n meetingId,\n name,\n },\n });\n\n return;\n }\n\n // merge identifiers\n const identifiers = this.getIdentifiers({\n meeting,\n mediaConnections: meeting.mediaConnections || mediaConnections,\n webexConferenceIdStr,\n globalMeetingId,\n });\n\n // create media quality event object\n let clientEventObject: MediaQualityEvent['payload'] = {\n name,\n canProceed: true,\n identifiers,\n eventData: {\n webClientDomain: window.location.hostname,\n },\n intervals: payload.intervals,\n sourceMetadata: {\n applicationSoftwareType: CLIENT_NAME,\n // @ts-ignore\n applicationSoftwareVersion: this.webex.version,\n mediaEngineSoftwareType: getBrowserName() || 'browser',\n mediaEngineSoftwareVersion: getOSVersion() || 'unknown',\n startTime: new Date().toISOString(),\n },\n };\n\n // merge any new properties, or override existing ones\n clientEventObject = merge(clientEventObject, payload);\n\n // append media quality event data to the call diagnostic event\n const diagnosticEvent = this.prepareDiagnosticEvent(clientEventObject, options);\n this.validator({type: 'mqe', event: diagnosticEvent});\n this.submitToCallDiagnostics(diagnosticEvent);\n } else {\n throw new Error(\n 'Media quality events cant be sent outside the context of a meeting. Meeting id is required.'\n );\n }\n }\n\n /**\n * Return Client Event payload by client error code\n * @param arg - get error arg\n * @param arg.clientErrorCode\n * @param arg.serviceErrorCode\n * @param arg.payloadOverrides\n * @param arg.httpStatusCode\n * @returns\n */\n public getErrorPayloadForClientErrorCode({\n clientErrorCode,\n serviceErrorCode,\n serviceErrorName,\n rawErrorMessage,\n payloadOverrides,\n httpStatusCode,\n }: {\n clientErrorCode: number;\n serviceErrorCode: any;\n serviceErrorName?: any;\n rawErrorMessage?: string;\n payloadOverrides?: any;\n httpStatusCode?: number;\n }): ClientEventError {\n let error: ClientEventError;\n\n if (clientErrorCode) {\n const partialParsedError = CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD[clientErrorCode];\n\n if (partialParsedError) {\n error = merge(\n {fatal: true, shownToUser: false, name: 'other', category: 'other'}, // default values\n {errorCode: clientErrorCode},\n serviceErrorName ? {errorData: {errorName: serviceErrorName}} : {},\n {serviceErrorCode},\n {rawErrorMessage},\n httpStatusCode === undefined ? {} : {httpStatusCode},\n partialParsedError,\n payloadOverrides || {}\n );\n\n return error;\n }\n }\n\n return undefined;\n }\n\n /**\n * Generate error payload for Client Event\n * @param rawError\n */\n generateClientEventErrorPayload(rawError: any) {\n const rawErrorMessage = rawError.message;\n const httpStatusCode = rawError.statusCode;\n if (rawError.name) {\n if (isBrowserMediaErrorName(rawError.name)) {\n return this.getErrorPayloadForClientErrorCode({\n serviceErrorCode: undefined,\n clientErrorCode: BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP[rawError.name],\n serviceErrorName: rawError.name,\n rawErrorMessage,\n httpStatusCode,\n });\n }\n }\n\n if (isSdpOfferCreationError(rawError)) {\n // error code is 30005, but that's not specific enough. we also need to check error.cause.type\n const causeType = rawError.cause?.type;\n\n return this.getErrorPayloadForClientErrorCode({\n serviceErrorCode: undefined,\n clientErrorCode:\n SDP_OFFER_CREATION_ERROR_MAP[causeType] || SDP_OFFER_CREATION_ERROR_MAP.GENERAL,\n serviceErrorName: rawError.name,\n rawErrorMessage,\n httpStatusCode,\n });\n }\n\n const serviceErrorCode =\n rawError?.error?.body?.errorCode ||\n rawError?.body?.errorCode ||\n rawError?.body?.code ||\n rawError?.body?.reason?.reasonCode;\n\n if (serviceErrorCode) {\n const clientErrorCode = SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP[serviceErrorCode];\n if (clientErrorCode) {\n return this.getErrorPayloadForClientErrorCode({\n clientErrorCode,\n serviceErrorCode,\n rawErrorMessage,\n httpStatusCode,\n });\n }\n\n // by default, if it is locus error, return new locus err\n if (isLocusServiceErrorCode(serviceErrorCode)) {\n return this.getErrorPayloadForClientErrorCode({\n clientErrorCode: NEW_LOCUS_ERROR_CLIENT_CODE,\n serviceErrorCode,\n rawErrorMessage,\n httpStatusCode,\n });\n }\n }\n\n if (isMeetingInfoServiceError(rawError)) {\n return this.getErrorPayloadForClientErrorCode({\n clientErrorCode: MEETING_INFO_LOOKUP_ERROR_CLIENT_CODE,\n serviceErrorCode,\n rawErrorMessage,\n httpStatusCode,\n });\n }\n\n if (isNetworkError(rawError)) {\n return this.getErrorPayloadForClientErrorCode({\n clientErrorCode: NETWORK_ERROR,\n serviceErrorCode,\n payloadOverrides: rawError.payloadOverrides,\n rawErrorMessage,\n httpStatusCode,\n });\n }\n\n if (isUnauthorizedError(rawError)) {\n return this.getErrorPayloadForClientErrorCode({\n clientErrorCode: AUTHENTICATION_FAILED_CODE,\n serviceErrorCode,\n payloadOverrides: rawError.payloadOverrides,\n rawErrorMessage,\n httpStatusCode,\n });\n }\n\n // otherwise return unkown error\n return this.getErrorPayloadForClientErrorCode({\n clientErrorCode: UNKNOWN_ERROR,\n serviceErrorCode: UNKNOWN_ERROR,\n rawErrorMessage,\n httpStatusCode,\n });\n }\n\n /**\n * Create client event object for in meeting events\n * @param arg - create args\n * @param arg.event - event key\n * @param arg.options - options\n * @returns object\n */\n private createClientEventObjectInMeeting({\n name,\n options,\n errors,\n }: {\n name: ClientEvent['name'];\n options?: SubmitClientEventOptions;\n errors?: ClientEventPayloadError;\n }) {\n const {meetingId, mediaConnections, globalMeetingId, webexConferenceIdStr} = options;\n\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.get(meetingId);\n\n if (!meeting) {\n console.warn(\n 'Attempt to send client event but no meeting was found...',\n `name: ${name}, meetingId: ${meetingId}`\n );\n // @ts-ignore\n this.webex.internal.metrics.submitClientMetrics(CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND, {\n fields: {\n meetingId,\n name,\n },\n });\n\n return undefined;\n }\n\n // grab identifiers\n const identifiers = this.getIdentifiers({\n meeting,\n mediaConnections: meeting?.mediaConnections || mediaConnections,\n webexConferenceIdStr,\n globalMeetingId,\n });\n\n // create client event object\n const clientEventObject: ClientEvent['payload'] = {\n name,\n canProceed: true,\n identifiers,\n errors,\n eventData: {\n webClientDomain: window.location.hostname,\n },\n userType: meeting.getCurUserType(),\n loginType:\n 'loginType' in meeting.callStateForMetrics\n ? meeting.callStateForMetrics.loginType\n : this.getCurLoginType(),\n isConvergedArchitectureEnabled: this.getIsConvergedArchitectureEnabled({\n meetingId,\n }),\n webexSubServiceType: this.getSubServiceType(meeting),\n };\n\n return clientEventObject;\n }\n\n /**\n * Create client event object for pre meeting events\n * @param arg - create args\n * @param arg.event - event key\n * @param arg.options - payload\n * @returns object\n */\n private createClientEventObjectPreMeeting({\n name,\n options,\n errors,\n }: {\n name: ClientEvent['name'];\n options?: SubmitClientEventOptions;\n errors?: ClientEventPayloadError;\n }) {\n const {correlationId, globalMeetingId, webexConferenceIdStr, preLoginId} = options;\n\n // grab identifiers\n const identifiers = this.getIdentifiers({\n correlationId,\n preLoginId,\n globalMeetingId,\n webexConferenceIdStr,\n });\n\n // create client event object\n const clientEventObject: ClientEvent['payload'] = {\n name,\n errors,\n canProceed: true,\n identifiers,\n eventData: {\n webClientDomain: window.location.hostname,\n },\n loginType: this.getCurLoginType(),\n };\n\n return clientEventObject;\n }\n\n /**\n * Prepare Client Event CA event.\n * @param arg - submit params\n * @param arg.event - event key\n * @param arg.payload - additional payload to be merged with default payload\n * @param arg.options - payload\n * @returns {any} options to be with fetch\n * @throws\n */\n private prepareClientEvent({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: ClientEventPayload;\n options?: SubmitClientEventOptions;\n }) {\n const {meetingId, correlationId, rawError} = options;\n let clientEventObject: ClientEvent['payload'];\n\n // check if we need to generate errors\n const errors: ClientEventPayloadError = [];\n\n if (rawError) {\n const generatedError = this.generateClientEventErrorPayload(rawError);\n if (generatedError) {\n errors.push(generatedError);\n }\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n 'CallDiagnosticMetrics: @prepareClientEvent. Generated errors:',\n `generatedError: ${JSON.stringify(generatedError)}`\n );\n }\n\n // events that will most likely happen in join phase\n if (meetingId) {\n clientEventObject = this.createClientEventObjectInMeeting({name, options, errors});\n } else if (correlationId) {\n // any pre join events or events that are outside the meeting.\n clientEventObject = this.createClientEventObjectPreMeeting({name, options, errors});\n } else {\n throw new Error('Not implemented');\n }\n\n // merge any new properties, or override existing ones\n clientEventObject = merge(clientEventObject, payload);\n\n // append client event data to the call diagnostic event\n const diagnosticEvent = this.prepareDiagnosticEvent(clientEventObject, options);\n\n return diagnosticEvent;\n }\n\n /**\n * Submit Client Event CA event.\n * @param arg - submit params\n * @param arg.event - event key\n * @param arg.payload - additional payload to be merged with default payload\n * @param arg.options - payload\n * @throws\n */\n public submitClientEvent({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: ClientEventPayload;\n options?: SubmitClientEventOptions;\n }) {\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n 'CallDiagnosticMetrics: @submitClientEvent. Submit Client Event CA event.',\n `name: ${name}`\n );\n const diagnosticEvent = this.prepareClientEvent({name, payload, options});\n\n if (options?.preLoginId) {\n return this.submitToCallDiagnosticsPreLogin(diagnosticEvent, options?.preLoginId);\n }\n\n this.validator({type: 'ce', event: diagnosticEvent});\n\n return this.submitToCallDiagnostics(diagnosticEvent);\n }\n\n /**\n * Prepare the event and send the request to metrics-a service.\n * @param event\n * @returns promise\n */\n submitToCallDiagnostics(event: Event): Promise<any> {\n // build metrics-a event type\n const finalEvent = {\n eventPayload: event,\n type: ['diagnostic-event'],\n };\n\n return this.callDiagnosticEventsBatcher.request(finalEvent);\n }\n\n /**\n * Prepare the event and send the request to metrics-a service, pre login.\n * @param event\n * @param preLoginId\n * @returns\n */\n submitToCallDiagnosticsPreLogin = (event: Event, preLoginId?: string): Promise<any> => {\n // build metrics-a event type\n const finalEvent = {\n eventPayload: event,\n type: ['diagnostic-event'],\n };\n this.preLoginMetricsBatcher.savePreLoginId(preLoginId);\n\n return this.preLoginMetricsBatcher.request(finalEvent);\n };\n\n /**\n * Builds a request options object to later be passed to fetch().\n * @param arg - submit params\n * @param arg.event - event key\n * @param arg.payload - additional payload to be merged with default payload\n * @param arg.options - client event options\n * @returns {Promise<any>}\n * @throws\n */\n public async buildClientEventFetchRequestOptions({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: ClientEventPayload;\n options?: SubmitClientEventOptions;\n }): Promise<any> {\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n 'CallDiagnosticMetrics: @buildClientEventFetchRequestOptions. Building request options object for fetch()...',\n `name: ${name}`\n );\n\n const clientEvent = this.prepareClientEvent({name, payload, options});\n\n // build metrics-a event type\n // @ts-ignore\n const diagnosticEvent = prepareDiagnosticMetricItem(this.webex, {\n eventPayload: clientEvent,\n type: ['diagnostic-event'],\n });\n\n const request = {\n method: 'POST',\n service: 'metrics',\n resource: 'clientmetrics',\n body: {\n metrics: [diagnosticEvent],\n },\n headers: {},\n // @ts-ignore\n waitForServiceTimeout: this.webex.internal.metrics.config.waitForServiceTimeout,\n };\n\n if (options.preLoginId) {\n request.headers = {\n authorization: false,\n 'x-prelogin-userid': options.preLoginId,\n };\n request.resource = 'clientmetrics-prelogin';\n }\n\n // @ts-ignore\n return this.webex.prepareFetchOptions(request);\n }\n\n /**\n * Returns true if the specified serviceErrorCode maps to an expected error.\n * @param {number} serviceErrorCode the service error code\n * @returns {boolean}\n */\n public isServiceErrorExpected(serviceErrorCode: number): boolean {\n const clientErrorCode = SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP[serviceErrorCode];\n const clientErrorPayload = CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD[clientErrorCode];\n\n return clientErrorPayload?.category === 'expected';\n }\n}\n"],"mappings":"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"}
|
package/dist/metrics.js
CHANGED
|
@@ -321,14 +321,16 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
321
321
|
* @param arg.clientErrorCode
|
|
322
322
|
* @param arg.serviceErrorCode
|
|
323
323
|
* @param arg.payloadOverrides
|
|
324
|
+
* @param arg.httpStatusCode
|
|
324
325
|
* @returns
|
|
325
326
|
*/
|
|
326
|
-
getErrorPayloadForClientErrorCode({ clientErrorCode, serviceErrorCode, serviceErrorName, rawErrorMessage, payloadOverrides, }: {
|
|
327
|
+
getErrorPayloadForClientErrorCode({ clientErrorCode, serviceErrorCode, serviceErrorName, rawErrorMessage, payloadOverrides, httpStatusCode, }: {
|
|
327
328
|
clientErrorCode: number;
|
|
328
329
|
serviceErrorCode: any;
|
|
329
330
|
serviceErrorName?: any;
|
|
330
331
|
rawErrorMessage?: string;
|
|
331
332
|
payloadOverrides?: any;
|
|
333
|
+
httpStatusCode?: number;
|
|
332
334
|
}): ClientEventError;
|
|
333
335
|
/**
|
|
334
336
|
* Generate error payload for Client Event
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/internal-plugin-metrics",
|
|
3
|
-
"version": "3.0.0-beta.
|
|
3
|
+
"version": "3.0.0-beta.382",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -28,14 +28,14 @@
|
|
|
28
28
|
"build": "yarn run -T tsc --declaration true --declarationDir ./dist/types"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@webex/common": "3.0.0-beta.
|
|
32
|
-
"@webex/common-timers": "3.0.0-beta.
|
|
31
|
+
"@webex/common": "3.0.0-beta.382",
|
|
32
|
+
"@webex/common-timers": "3.0.0-beta.382",
|
|
33
33
|
"@webex/event-dictionary-ts": "^1.0.1329",
|
|
34
|
-
"@webex/internal-plugin-device": "3.0.0-beta.
|
|
35
|
-
"@webex/internal-plugin-metrics": "3.0.0-beta.
|
|
36
|
-
"@webex/test-helper-chai": "3.0.0-beta.
|
|
37
|
-
"@webex/test-helper-mock-webex": "3.0.0-beta.
|
|
38
|
-
"@webex/webex-core": "3.0.0-beta.
|
|
34
|
+
"@webex/internal-plugin-device": "3.0.0-beta.382",
|
|
35
|
+
"@webex/internal-plugin-metrics": "3.0.0-beta.382",
|
|
36
|
+
"@webex/test-helper-chai": "3.0.0-beta.382",
|
|
37
|
+
"@webex/test-helper-mock-webex": "3.0.0-beta.382",
|
|
38
|
+
"@webex/webex-core": "3.0.0-beta.382",
|
|
39
39
|
"ip-anonymize": "^0.1.0",
|
|
40
40
|
"lodash": "^4.17.21",
|
|
41
41
|
"uuid": "^3.3.2"
|
|
@@ -471,6 +471,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
471
471
|
* @param arg.clientErrorCode
|
|
472
472
|
* @param arg.serviceErrorCode
|
|
473
473
|
* @param arg.payloadOverrides
|
|
474
|
+
* @param arg.httpStatusCode
|
|
474
475
|
* @returns
|
|
475
476
|
*/
|
|
476
477
|
public getErrorPayloadForClientErrorCode({
|
|
@@ -479,12 +480,14 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
479
480
|
serviceErrorName,
|
|
480
481
|
rawErrorMessage,
|
|
481
482
|
payloadOverrides,
|
|
483
|
+
httpStatusCode,
|
|
482
484
|
}: {
|
|
483
485
|
clientErrorCode: number;
|
|
484
486
|
serviceErrorCode: any;
|
|
485
487
|
serviceErrorName?: any;
|
|
486
488
|
rawErrorMessage?: string;
|
|
487
489
|
payloadOverrides?: any;
|
|
490
|
+
httpStatusCode?: number;
|
|
488
491
|
}): ClientEventError {
|
|
489
492
|
let error: ClientEventError;
|
|
490
493
|
|
|
@@ -498,6 +501,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
498
501
|
serviceErrorName ? {errorData: {errorName: serviceErrorName}} : {},
|
|
499
502
|
{serviceErrorCode},
|
|
500
503
|
{rawErrorMessage},
|
|
504
|
+
httpStatusCode === undefined ? {} : {httpStatusCode},
|
|
501
505
|
partialParsedError,
|
|
502
506
|
payloadOverrides || {}
|
|
503
507
|
);
|
|
@@ -515,6 +519,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
515
519
|
*/
|
|
516
520
|
generateClientEventErrorPayload(rawError: any) {
|
|
517
521
|
const rawErrorMessage = rawError.message;
|
|
522
|
+
const httpStatusCode = rawError.statusCode;
|
|
518
523
|
if (rawError.name) {
|
|
519
524
|
if (isBrowserMediaErrorName(rawError.name)) {
|
|
520
525
|
return this.getErrorPayloadForClientErrorCode({
|
|
@@ -522,6 +527,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
522
527
|
clientErrorCode: BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP[rawError.name],
|
|
523
528
|
serviceErrorName: rawError.name,
|
|
524
529
|
rawErrorMessage,
|
|
530
|
+
httpStatusCode,
|
|
525
531
|
});
|
|
526
532
|
}
|
|
527
533
|
}
|
|
@@ -536,6 +542,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
536
542
|
SDP_OFFER_CREATION_ERROR_MAP[causeType] || SDP_OFFER_CREATION_ERROR_MAP.GENERAL,
|
|
537
543
|
serviceErrorName: rawError.name,
|
|
538
544
|
rawErrorMessage,
|
|
545
|
+
httpStatusCode,
|
|
539
546
|
});
|
|
540
547
|
}
|
|
541
548
|
|
|
@@ -552,6 +559,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
552
559
|
clientErrorCode,
|
|
553
560
|
serviceErrorCode,
|
|
554
561
|
rawErrorMessage,
|
|
562
|
+
httpStatusCode,
|
|
555
563
|
});
|
|
556
564
|
}
|
|
557
565
|
|
|
@@ -561,6 +569,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
561
569
|
clientErrorCode: NEW_LOCUS_ERROR_CLIENT_CODE,
|
|
562
570
|
serviceErrorCode,
|
|
563
571
|
rawErrorMessage,
|
|
572
|
+
httpStatusCode,
|
|
564
573
|
});
|
|
565
574
|
}
|
|
566
575
|
}
|
|
@@ -570,6 +579,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
570
579
|
clientErrorCode: MEETING_INFO_LOOKUP_ERROR_CLIENT_CODE,
|
|
571
580
|
serviceErrorCode,
|
|
572
581
|
rawErrorMessage,
|
|
582
|
+
httpStatusCode,
|
|
573
583
|
});
|
|
574
584
|
}
|
|
575
585
|
|
|
@@ -579,6 +589,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
579
589
|
serviceErrorCode,
|
|
580
590
|
payloadOverrides: rawError.payloadOverrides,
|
|
581
591
|
rawErrorMessage,
|
|
592
|
+
httpStatusCode,
|
|
582
593
|
});
|
|
583
594
|
}
|
|
584
595
|
|
|
@@ -588,6 +599,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
588
599
|
serviceErrorCode,
|
|
589
600
|
payloadOverrides: rawError.payloadOverrides,
|
|
590
601
|
rawErrorMessage,
|
|
602
|
+
httpStatusCode,
|
|
591
603
|
});
|
|
592
604
|
}
|
|
593
605
|
|
|
@@ -596,6 +608,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
596
608
|
clientErrorCode: UNKNOWN_ERROR,
|
|
597
609
|
serviceErrorCode: UNKNOWN_ERROR,
|
|
598
610
|
rawErrorMessage,
|
|
611
|
+
httpStatusCode,
|
|
599
612
|
});
|
|
600
613
|
}
|
|
601
614
|
|
|
@@ -1730,6 +1730,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
1730
1730
|
serviceErrorCode: undefined,
|
|
1731
1731
|
errorCode: 1026,
|
|
1732
1732
|
rawErrorMessage: '{}\nundefined https://example.com\nWEBEX_TRACKING_ID: undefined\n',
|
|
1733
|
+
httpStatusCode: 0,
|
|
1733
1734
|
});
|
|
1734
1735
|
});
|
|
1735
1736
|
|
|
@@ -1822,6 +1823,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
1822
1823
|
serviceErrorCode: undefined,
|
|
1823
1824
|
errorCode: 1026,
|
|
1824
1825
|
rawErrorMessage: '{}\nundefined https://example.com\nWEBEX_TRACKING_ID: undefined\n',
|
|
1826
|
+
httpStatusCode: 0,
|
|
1825
1827
|
});
|
|
1826
1828
|
});
|
|
1827
1829
|
|
|
@@ -1843,6 +1845,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
1843
1845
|
serviceErrorCode: undefined,
|
|
1844
1846
|
errorCode: 1010,
|
|
1845
1847
|
rawErrorMessage: '{}\nundefined https://example.com\nWEBEX_TRACKING_ID: undefined\n',
|
|
1848
|
+
httpStatusCode: 0,
|
|
1846
1849
|
});
|
|
1847
1850
|
});
|
|
1848
1851
|
|
|
@@ -1869,11 +1872,12 @@ describe('internal-plugin-metrics', () => {
|
|
|
1869
1872
|
serviceErrorCode: undefined,
|
|
1870
1873
|
errorCode: 1010,
|
|
1871
1874
|
rawErrorMessage: '{}\nundefined https://example.com\nWEBEX_TRACKING_ID: undefined\n',
|
|
1875
|
+
httpStatusCode: 0,
|
|
1872
1876
|
});
|
|
1873
1877
|
});
|
|
1874
1878
|
|
|
1875
1879
|
it('should return unknown error otherwise', () => {
|
|
1876
|
-
const res = cd.generateClientEventErrorPayload({
|
|
1880
|
+
const res = cd.generateClientEventErrorPayload({something: 'new', message: 'bad times'});
|
|
1877
1881
|
assert.deepEqual(res, {
|
|
1878
1882
|
category: 'other',
|
|
1879
1883
|
errorDescription: 'UnknownError',
|
|
@@ -1935,6 +1939,141 @@ describe('internal-plugin-metrics', () => {
|
|
|
1935
1939
|
rawErrorMessage: 'bad times',
|
|
1936
1940
|
});
|
|
1937
1941
|
});
|
|
1942
|
+
|
|
1943
|
+
describe('httpStatusCode', () => {
|
|
1944
|
+
it('should include httpStatusCode for browser media errors', () => {
|
|
1945
|
+
const res = cd.generateClientEventErrorPayload({name: 'PermissionDeniedError', message: 'bad times', statusCode: 401});
|
|
1946
|
+
assert.deepEqual(res, {
|
|
1947
|
+
category: 'expected',
|
|
1948
|
+
errorCode: 4032,
|
|
1949
|
+
errorData: {
|
|
1950
|
+
errorName: 'PermissionDeniedError'
|
|
1951
|
+
},
|
|
1952
|
+
errorDescription: 'CameraPermissionDenied',
|
|
1953
|
+
fatal: true,
|
|
1954
|
+
name: 'other',
|
|
1955
|
+
rawErrorMessage: 'bad times',
|
|
1956
|
+
serviceErrorCode: undefined,
|
|
1957
|
+
shownToUser: false,
|
|
1958
|
+
httpStatusCode: 401,
|
|
1959
|
+
});
|
|
1960
|
+
});
|
|
1961
|
+
|
|
1962
|
+
it('should include httpStatusCode for SdpOfferCreationErrors', () => {
|
|
1963
|
+
const res = cd.generateClientEventErrorPayload({name: 'SdpOfferCreationError', message: 'bad times', statusCode: 404});
|
|
1964
|
+
assert.deepEqual(res, {
|
|
1965
|
+
category: 'media',
|
|
1966
|
+
errorCode: 2050,
|
|
1967
|
+
errorData: {
|
|
1968
|
+
errorName: 'SdpOfferCreationError'
|
|
1969
|
+
},
|
|
1970
|
+
errorDescription: 'SdpOfferCreationError',
|
|
1971
|
+
fatal: true,
|
|
1972
|
+
name: 'other',
|
|
1973
|
+
rawErrorMessage: 'bad times',
|
|
1974
|
+
serviceErrorCode: undefined,
|
|
1975
|
+
shownToUser: true,
|
|
1976
|
+
httpStatusCode: 404,
|
|
1977
|
+
});
|
|
1978
|
+
});
|
|
1979
|
+
|
|
1980
|
+
it('should include httpStatusCode for service error codes', () => {
|
|
1981
|
+
const res = cd.generateClientEventErrorPayload({body: {errorCode: 58400}, message: 'bad times', statusCode: 400});
|
|
1982
|
+
assert.deepEqual(res, {
|
|
1983
|
+
category: 'signaling',
|
|
1984
|
+
errorCode: 4100,
|
|
1985
|
+
errorDescription: 'MeetingInfoLookupError',
|
|
1986
|
+
fatal: true,
|
|
1987
|
+
name: 'other',
|
|
1988
|
+
rawErrorMessage: 'bad times',
|
|
1989
|
+
serviceErrorCode: 58400,
|
|
1990
|
+
shownToUser: false,
|
|
1991
|
+
httpStatusCode: 400,
|
|
1992
|
+
});
|
|
1993
|
+
});
|
|
1994
|
+
|
|
1995
|
+
it('should include httpStatusCode for locus service error codes', () => {
|
|
1996
|
+
const res = cd.generateClientEventErrorPayload({body: {errorCode: 2403001}, message: 'bad times', statusCode: 400});
|
|
1997
|
+
assert.deepEqual(res, {
|
|
1998
|
+
category: 'expected',
|
|
1999
|
+
errorCode: 3007,
|
|
2000
|
+
errorDescription: 'StreamErrorNoMedia',
|
|
2001
|
+
fatal: true,
|
|
2002
|
+
name: 'other',
|
|
2003
|
+
rawErrorMessage: 'bad times',
|
|
2004
|
+
serviceErrorCode: 2403001,
|
|
2005
|
+
shownToUser: false,
|
|
2006
|
+
httpStatusCode: 400,
|
|
2007
|
+
});
|
|
2008
|
+
});
|
|
2009
|
+
|
|
2010
|
+
it('should include httpStatusCode for meetingInfo service error codes', () => {
|
|
2011
|
+
const res = cd.generateClientEventErrorPayload({body: {data: {meetingInfo: {}}}, message: 'bad times', statusCode: 400});
|
|
2012
|
+
assert.deepEqual(res, {
|
|
2013
|
+
category: 'signaling',
|
|
2014
|
+
errorCode: 4100,
|
|
2015
|
+
errorDescription: 'MeetingInfoLookupError',
|
|
2016
|
+
fatal: true,
|
|
2017
|
+
name: 'other',
|
|
2018
|
+
rawErrorMessage: 'bad times',
|
|
2019
|
+
serviceErrorCode: undefined,
|
|
2020
|
+
shownToUser: false,
|
|
2021
|
+
httpStatusCode: 400,
|
|
2022
|
+
});
|
|
2023
|
+
});
|
|
2024
|
+
|
|
2025
|
+
it('should include httpStatusCode for network errors', () => {
|
|
2026
|
+
const error = new WebexHttpError.NetworkOrCORSError(
|
|
2027
|
+
{statusCode: 400, options: {service: '', headers: {}}});
|
|
2028
|
+
const res = cd.generateClientEventErrorPayload(error);
|
|
2029
|
+
assert.deepEqual(res, {
|
|
2030
|
+
category: 'network',
|
|
2031
|
+
errorCode: 1026,
|
|
2032
|
+
errorDescription: 'NetworkError',
|
|
2033
|
+
fatal: true,
|
|
2034
|
+
name: 'other',
|
|
2035
|
+
rawErrorMessage: 'undefined\nundefined /undefined\nWEBEX_TRACKING_ID: undefined\n',
|
|
2036
|
+
serviceErrorCode: undefined,
|
|
2037
|
+
shownToUser: false,
|
|
2038
|
+
httpStatusCode: 400,
|
|
2039
|
+
});
|
|
2040
|
+
});
|
|
2041
|
+
|
|
2042
|
+
it('should include httpStatusCode for unauthorized errors', () => {
|
|
2043
|
+
const error = new WebexHttpError.Unauthorized(
|
|
2044
|
+
{statusCode: 401, options: {service: '', headers: {}}});
|
|
2045
|
+
const res = cd.generateClientEventErrorPayload(error);
|
|
2046
|
+
assert.deepEqual(res, {
|
|
2047
|
+
category: 'network',
|
|
2048
|
+
errorCode: 1010,
|
|
2049
|
+
errorDescription: 'AuthenticationFailed',
|
|
2050
|
+
fatal: true,
|
|
2051
|
+
name: 'other',
|
|
2052
|
+
rawErrorMessage: 'undefined\nundefined /undefined\nWEBEX_TRACKING_ID: undefined\n',
|
|
2053
|
+
serviceErrorCode: undefined,
|
|
2054
|
+
shownToUser: false,
|
|
2055
|
+
httpStatusCode: 401,
|
|
2056
|
+
});
|
|
2057
|
+
});
|
|
2058
|
+
|
|
2059
|
+
it('should include httpStatusCode for unknown errors', () => {
|
|
2060
|
+
const res = cd.generateClientEventErrorPayload({
|
|
2061
|
+
message: 'bad times',
|
|
2062
|
+
statusCode: 404,
|
|
2063
|
+
});
|
|
2064
|
+
assert.deepEqual(res, {
|
|
2065
|
+
fatal: true,
|
|
2066
|
+
shownToUser: false,
|
|
2067
|
+
name: 'other',
|
|
2068
|
+
category: 'other',
|
|
2069
|
+
errorCode: 9999,
|
|
2070
|
+
serviceErrorCode: 9999,
|
|
2071
|
+
errorDescription: 'UnknownError',
|
|
2072
|
+
rawErrorMessage: 'bad times',
|
|
2073
|
+
httpStatusCode: 404,
|
|
2074
|
+
});
|
|
2075
|
+
});
|
|
2076
|
+
});
|
|
1938
2077
|
});
|
|
1939
2078
|
|
|
1940
2079
|
describe('#getCurLoginType', () => {
|