@webex/internal-plugin-metrics 3.0.0-beta.319 → 3.0.0-beta.320

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.
@@ -430,6 +430,7 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
430
430
  var clientErrorCode = _ref3.clientErrorCode,
431
431
  serviceErrorCode = _ref3.serviceErrorCode,
432
432
  serviceErrorName = _ref3.serviceErrorName,
433
+ rawErrorMessage = _ref3.rawErrorMessage,
433
434
  payloadOverrides = _ref3.payloadOverrides;
434
435
  var error;
435
436
  if (clientErrorCode) {
@@ -450,6 +451,8 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
450
451
  }
451
452
  } : {}, {
452
453
  serviceErrorCode: serviceErrorCode
454
+ }, {
455
+ rawErrorMessage: rawErrorMessage
453
456
  }, partialParsedError, payloadOverrides || {});
454
457
  return error;
455
458
  }
@@ -465,12 +468,14 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
465
468
  key: "generateClientEventErrorPayload",
466
469
  value: function generateClientEventErrorPayload(rawError) {
467
470
  var _rawError$error, _rawError$error$body, _rawError$body, _rawError$body2, _rawError$body3, _rawError$body3$reaso;
471
+ var rawErrorMessage = rawError.message;
468
472
  if (rawError.name) {
469
473
  if ((0, _callDiagnosticMetrics.isBrowserMediaErrorName)(rawError.name)) {
470
474
  return this.getErrorPayloadForClientErrorCode({
471
475
  serviceErrorCode: undefined,
472
476
  clientErrorCode: _config2.BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP[rawError.name],
473
- serviceErrorName: rawError.name
477
+ serviceErrorName: rawError.name,
478
+ rawErrorMessage: rawErrorMessage
474
479
  });
475
480
  }
476
481
  }
@@ -480,7 +485,8 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
480
485
  if (clientErrorCode) {
481
486
  return this.getErrorPayloadForClientErrorCode({
482
487
  clientErrorCode: clientErrorCode,
483
- serviceErrorCode: serviceErrorCode
488
+ serviceErrorCode: serviceErrorCode,
489
+ rawErrorMessage: rawErrorMessage
484
490
  });
485
491
  }
486
492
 
@@ -488,39 +494,40 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
488
494
  if ((0, _callDiagnosticMetrics.isLocusServiceErrorCode)(serviceErrorCode)) {
489
495
  return this.getErrorPayloadForClientErrorCode({
490
496
  clientErrorCode: _config2.NEW_LOCUS_ERROR_CLIENT_CODE,
491
- serviceErrorCode: serviceErrorCode
497
+ serviceErrorCode: serviceErrorCode,
498
+ rawErrorMessage: rawErrorMessage
492
499
  });
493
500
  }
494
501
  }
495
502
  if ((0, _callDiagnosticMetrics.isMeetingInfoServiceError)(rawError)) {
496
503
  return this.getErrorPayloadForClientErrorCode({
497
504
  clientErrorCode: _config2.MEETING_INFO_LOOKUP_ERROR_CLIENT_CODE,
498
- serviceErrorCode: serviceErrorCode
505
+ serviceErrorCode: serviceErrorCode,
506
+ rawErrorMessage: rawErrorMessage
499
507
  });
500
508
  }
501
509
  if ((0, _callDiagnosticMetrics.isNetworkError)(rawError)) {
502
- var payload = this.getErrorPayloadForClientErrorCode({
510
+ return this.getErrorPayloadForClientErrorCode({
503
511
  clientErrorCode: _config2.NETWORK_ERROR,
504
512
  serviceErrorCode: serviceErrorCode,
505
- payloadOverrides: rawError.payloadOverrides
513
+ payloadOverrides: rawError.payloadOverrides,
514
+ rawErrorMessage: rawErrorMessage
506
515
  });
507
- payload.errorDescription = rawError.message;
508
- return payload;
509
516
  }
510
517
  if ((0, _callDiagnosticMetrics.isUnauthorizedError)(rawError)) {
511
- var _payload = this.getErrorPayloadForClientErrorCode({
518
+ return this.getErrorPayloadForClientErrorCode({
512
519
  clientErrorCode: _config2.AUTHENTICATION_FAILED_CODE,
513
520
  serviceErrorCode: serviceErrorCode,
514
- payloadOverrides: rawError.payloadOverrides
521
+ payloadOverrides: rawError.payloadOverrides,
522
+ rawErrorMessage: rawErrorMessage
515
523
  });
516
- _payload.errorDescription = rawError.message;
517
- return _payload;
518
524
  }
519
525
 
520
526
  // otherwise return unkown error
521
527
  return this.getErrorPayloadForClientErrorCode({
522
528
  clientErrorCode: _config2.UNKNOWN_ERROR,
523
- serviceErrorCode: _config2.UNKNOWN_ERROR
529
+ serviceErrorCode: _config2.UNKNOWN_ERROR,
530
+ rawErrorMessage: rawErrorMessage
524
531
  });
525
532
  }
526
533
 
@@ -534,7 +541,6 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
534
541
  }, {
535
542
  key: "createClientEventObjectInMeeting",
536
543
  value: function createClientEventObjectInMeeting(_ref4) {
537
- var _options$rawError;
538
544
  var name = _ref4.name,
539
545
  options = _ref4.options,
540
546
  errors = _ref4.errors;
@@ -581,11 +587,6 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
581
587
  }),
582
588
  webexSubServiceType: this.getSubServiceType(meeting)
583
589
  };
584
- if (options !== null && options !== void 0 && (_options$rawError = options.rawError) !== null && _options$rawError !== void 0 && _options$rawError.message) {
585
- var _options$rawError2;
586
- // @ts-ignore
587
- clientEventObject.eventData.rawErrorMessage = options === null || options === void 0 ? void 0 : (_options$rawError2 = options.rawError) === null || _options$rawError2 === void 0 ? void 0 : _options$rawError2.message;
588
- }
589
590
  return clientEventObject;
590
591
  }
591
592
 
@@ -599,7 +600,6 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
599
600
  }, {
600
601
  key: "createClientEventObjectPreMeeting",
601
602
  value: function createClientEventObjectPreMeeting(_ref5) {
602
- var _options$rawError3;
603
603
  var name = _ref5.name,
604
604
  options = _ref5.options,
605
605
  errors = _ref5.errors;
@@ -627,11 +627,6 @@ var CallDiagnosticMetrics = /*#__PURE__*/function (_StatelessWebexPlugin) {
627
627
  },
628
628
  loginType: this.getCurLoginType()
629
629
  };
630
- if (options !== null && options !== void 0 && (_options$rawError3 = options.rawError) !== null && _options$rawError3 !== void 0 && _options$rawError3.message) {
631
- var _options$rawError4;
632
- // @ts-ignore
633
- clientEventObject.eventData.rawErrorMessage = options === null || options === void 0 ? void 0 : (_options$rawError4 = options.rawError) === null || _options$rawError4 === void 0 ? void 0 : _options$rawError4.message;
634
- }
635
630
  return clientEventObject;
636
631
  }
637
632
 
@@ -1 +1 @@
1
- {"version":3,"names":["BrowserDetection","getOSVersion","getBrowserName","getBrowserVersion","CallDiagnosticMetrics","args","options","resolve","event","valid","preLoginId","diagnosticEvent","prepareDiagnosticMetricItem","webex","eventPayload","type","originTime","sent","Date","toISOString","internal","newMetrics","postPreLoginMetric","logger","callDiagnosticEventsBatcher","CallDiagnosticEventsBatcher","parent","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","origin","name","networkType","userAgent","userAgentToString","clientName","webexVersion","clientInfo","localNetworkPrefix","anonymizeIPAddress","geoHintInfo","clientAddress","osVersion","os","getOSNameInternal","browser","browserVersion","environment","newEnvironment","clientLaunchMethod","Error","mediaConnections","correlationId","webexConferenceIdStr","globalMeetingId","identifiers","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","triggered","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","prepareDiagnosticEvent","validator","submitToCallDiagnostics","clientErrorCode","serviceErrorCode","serviceErrorName","payloadOverrides","error","partialParsedError","CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD","fatal","shownToUser","category","errorCode","errorData","errorName","rawError","isBrowserMediaErrorName","getErrorPayloadForClientErrorCode","BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP","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","errorDescription","message","isUnauthorizedError","AUTHENTICATION_FAILED_CODE","UNKNOWN_ERROR","errors","userType","getCurUserType","loginType","getCurLoginType","isConvergedArchitectureEnabled","getIsConvergedArchitectureEnabled","webexSubServiceType","getSubServiceType","rawErrorMessage","generatedError","generateClientEventErrorPayload","push","log","CALL_DIAGNOSTIC_LOG_IDENTIFIER","createClientEventObjectInMeeting","createClientEventObjectPreMeeting","prepareClientEvent","submitToCallDiagnosticsPreLogin","finalEvent","request","clientEvent","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} 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} 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 {\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} from './config';\nimport {generateCommonErrorMetadata} from '../utils';\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 private logger: any; // to avoid adding @ts-ignore everywhere\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 }\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 (\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 localNetworkPrefix:\n // @ts-ignore\n anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress) || 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 payloadOverrides,\n }: {\n clientErrorCode: number;\n serviceErrorCode: any;\n serviceErrorName?: any;\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 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 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 });\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({clientErrorCode, serviceErrorCode});\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 });\n }\n }\n\n if (isMeetingInfoServiceError(rawError)) {\n return this.getErrorPayloadForClientErrorCode({\n clientErrorCode: MEETING_INFO_LOOKUP_ERROR_CLIENT_CODE,\n serviceErrorCode,\n });\n }\n\n if (isNetworkError(rawError)) {\n const payload = this.getErrorPayloadForClientErrorCode({\n clientErrorCode: NETWORK_ERROR,\n serviceErrorCode,\n payloadOverrides: rawError.payloadOverrides,\n });\n payload.errorDescription = rawError.message;\n\n return payload;\n }\n\n if (isUnauthorizedError(rawError)) {\n const payload = this.getErrorPayloadForClientErrorCode({\n clientErrorCode: AUTHENTICATION_FAILED_CODE,\n serviceErrorCode,\n payloadOverrides: rawError.payloadOverrides,\n });\n payload.errorDescription = rawError.message;\n\n return payload;\n }\n\n // otherwise return unkown error\n return this.getErrorPayloadForClientErrorCode({\n clientErrorCode: UNKNOWN_ERROR,\n serviceErrorCode: UNKNOWN_ERROR,\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: this.getCurLoginType(),\n isConvergedArchitectureEnabled: this.getIsConvergedArchitectureEnabled({\n meetingId,\n }),\n webexSubServiceType: this.getSubServiceType(meeting),\n };\n\n if (options?.rawError?.message) {\n // @ts-ignore\n clientEventObject.eventData.rawErrorMessage = options?.rawError?.message;\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 if (options?.rawError?.message) {\n // @ts-ignore\n clientEventObject.eventData.rawErrorMessage = options?.rawError?.message;\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 * Pre login events are not batched. We make the request directly.\n * @param event\n * @param preLoginId\n * @returns\n */\n public submitToCallDiagnosticsPreLogin = (event: Event, preLoginId?: string): Promise<any> => {\n // build metrics-a event type\n // @ts-ignore\n const diagnosticEvent = prepareDiagnosticMetricItem(this.webex, {\n eventPayload: event,\n type: ['diagnostic-event'],\n });\n\n // append sent timestamp\n diagnosticEvent.eventPayload.originTime.sent = new Date().toISOString();\n\n // @ts-ignore\n return this.webex.internal.newMetrics.postPreLoginMetric(diagnosticEvent, preLoginId);\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","diagnosticEvent","prepareDiagnosticMetricItem","webex","eventPayload","type","originTime","sent","Date","toISOString","internal","newMetrics","postPreLoginMetric","logger","callDiagnosticEventsBatcher","CallDiagnosticEventsBatcher","parent","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","origin","name","networkType","userAgent","userAgentToString","clientName","webexVersion","clientInfo","localNetworkPrefix","anonymizeIPAddress","geoHintInfo","clientAddress","osVersion","os","getOSNameInternal","browser","browserVersion","environment","newEnvironment","clientLaunchMethod","Error","mediaConnections","correlationId","webexConferenceIdStr","globalMeetingId","identifiers","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","triggered","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","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","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","getCurLoginType","isConvergedArchitectureEnabled","getIsConvergedArchitectureEnabled","webexSubServiceType","getSubServiceType","generatedError","generateClientEventErrorPayload","push","log","CALL_DIAGNOSTIC_LOG_IDENTIFIER","createClientEventObjectInMeeting","createClientEventObjectPreMeeting","prepareClientEvent","submitToCallDiagnosticsPreLogin","finalEvent","request","clientEvent","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} 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} 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 {\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} from './config';\nimport {generateCommonErrorMetadata} from '../utils';\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 private logger: any; // to avoid adding @ts-ignore everywhere\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 }\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 (\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 localNetworkPrefix:\n // @ts-ignore\n anonymizeIPAddress(this.webex.meetings.geoHintInfo?.clientAddress) || 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 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: 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 * Pre login events are not batched. We make the request directly.\n * @param event\n * @param preLoginId\n * @returns\n */\n public submitToCallDiagnosticsPreLogin = (event: Event, preLoginId?: string): Promise<any> => {\n // build metrics-a event type\n // @ts-ignore\n const diagnosticEvent = prepareDiagnosticMetricItem(this.webex, {\n eventPayload: event,\n type: ['diagnostic-event'],\n });\n\n // append sent timestamp\n diagnosticEvent.eventPayload.originTime.sent = new Date().toISOString();\n\n // @ts-ignore\n return this.webex.internal.newMetrics.postPreLoginMetric(diagnosticEvent, preLoginId);\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
@@ -161,7 +161,7 @@ var Metrics = _webexCore.WebexPlugin.extend({
161
161
  });
162
162
  });
163
163
  },
164
- version: "3.0.0-beta.319"
164
+ version: "3.0.0-beta.320"
165
165
  });
166
166
  var _default = Metrics;
167
167
  exports.default = _default;
@@ -73,7 +73,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
73
73
  environment?: string;
74
74
  newEnvironment?: string;
75
75
  clientInfo?: {
76
- os?: "windows" | "mac" | "ios" | "android" | "chrome" | "linux" | "other" | "android-x64" | "uwp-arm64";
76
+ os?: "windows" | "mac" | "ios" | "android" | "chrome" | "linux" | "other" | "android-x64" | "android-arm64" | "uwp-arm64";
77
77
  osVersion?: string;
78
78
  localIP?: string;
79
79
  gatewayIP?: string;
@@ -172,6 +172,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
172
172
  mediaAgentAlias?: string;
173
173
  mediaAgentGroupId?: string;
174
174
  meetClusterName?: string;
175
+ meetingInstanceId?: string;
175
176
  meetingLookupUrl?: string;
176
177
  meetingOrgId?: string;
177
178
  msteamsTenantGuid?: string;
@@ -203,6 +204,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
203
204
  webexNodeId?: number;
204
205
  webexSiteId?: number;
205
206
  webexSiteName?: string;
207
+ webexSiteUuid?: string;
206
208
  webexUserId?: number;
207
209
  webexWebDomain?: string;
208
210
  correlationId: string;
@@ -241,6 +243,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
241
243
  mediaAgentAlias?: string;
242
244
  mediaAgentGroupId?: string;
243
245
  meetClusterName?: string;
246
+ meetingInstanceId?: string;
244
247
  meetingLookupUrl?: string;
245
248
  meetingOrgId?: string;
246
249
  msteamsTenantGuid?: string;
@@ -272,6 +275,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
272
275
  webexNodeId?: number;
273
276
  webexSiteId?: number;
274
277
  webexSiteName?: string;
278
+ webexSiteUuid?: string;
275
279
  webexUserId?: number;
276
280
  webexWebDomain?: string;
277
281
  correlationId: string;
@@ -311,10 +315,11 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
311
315
  * @param arg.payloadOverrides
312
316
  * @returns
313
317
  */
314
- getErrorPayloadForClientErrorCode({ clientErrorCode, serviceErrorCode, serviceErrorName, payloadOverrides, }: {
318
+ getErrorPayloadForClientErrorCode({ clientErrorCode, serviceErrorCode, serviceErrorName, rawErrorMessage, payloadOverrides, }: {
315
319
  clientErrorCode: number;
316
320
  serviceErrorCode: any;
317
321
  serviceErrorName?: any;
322
+ rawErrorMessage?: string;
318
323
  payloadOverrides?: any;
319
324
  }): ClientEventError;
320
325
  /**
@@ -330,6 +335,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
330
335
  httpCode?: number;
331
336
  errorCodeExt1?: number;
332
337
  errorData?: {};
338
+ rawErrorMessage?: string;
333
339
  shownToUser: boolean;
334
340
  serviceErrorCode?: number;
335
341
  name: "other" | "locus.response" | "media-engine" | "ice.failed" | "locus.leave" | "client.leave" | "media-device" | "media-sca" | "wxc";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webex/internal-plugin-metrics",
3
- "version": "3.0.0-beta.319",
3
+ "version": "3.0.0-beta.320",
4
4
  "description": "",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -28,13 +28,13 @@
28
28
  "build": "yarn run -T tsc --declaration true --declarationDir ./dist/types"
29
29
  },
30
30
  "dependencies": {
31
- "@webex/common": "3.0.0-beta.319",
32
- "@webex/common-timers": "3.0.0-beta.319",
33
- "@webex/event-dictionary-ts": "^1.0.1313",
34
- "@webex/internal-plugin-device": "3.0.0-beta.319",
35
- "@webex/internal-plugin-metrics": "3.0.0-beta.319",
36
- "@webex/test-helper-chai": "3.0.0-beta.319",
37
- "@webex/test-helper-mock-webex": "3.0.0-beta.319",
38
- "@webex/webex-core": "3.0.0-beta.319"
31
+ "@webex/common": "3.0.0-beta.320",
32
+ "@webex/common-timers": "3.0.0-beta.320",
33
+ "@webex/event-dictionary-ts": "^1.0.1329",
34
+ "@webex/internal-plugin-device": "3.0.0-beta.320",
35
+ "@webex/internal-plugin-metrics": "3.0.0-beta.320",
36
+ "@webex/test-helper-chai": "3.0.0-beta.320",
37
+ "@webex/test-helper-mock-webex": "3.0.0-beta.320",
38
+ "@webex/webex-core": "3.0.0-beta.320"
39
39
  }
40
40
  }
@@ -451,11 +451,13 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
451
451
  clientErrorCode,
452
452
  serviceErrorCode,
453
453
  serviceErrorName,
454
+ rawErrorMessage,
454
455
  payloadOverrides,
455
456
  }: {
456
457
  clientErrorCode: number;
457
458
  serviceErrorCode: any;
458
459
  serviceErrorName?: any;
460
+ rawErrorMessage?: string;
459
461
  payloadOverrides?: any;
460
462
  }): ClientEventError {
461
463
  let error: ClientEventError;
@@ -469,6 +471,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
469
471
  {errorCode: clientErrorCode},
470
472
  serviceErrorName ? {errorData: {errorName: serviceErrorName}} : {},
471
473
  {serviceErrorCode},
474
+ {rawErrorMessage},
472
475
  partialParsedError,
473
476
  payloadOverrides || {}
474
477
  );
@@ -485,12 +488,14 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
485
488
  * @param rawError
486
489
  */
487
490
  generateClientEventErrorPayload(rawError: any) {
491
+ const rawErrorMessage = rawError.message;
488
492
  if (rawError.name) {
489
493
  if (isBrowserMediaErrorName(rawError.name)) {
490
494
  return this.getErrorPayloadForClientErrorCode({
491
495
  serviceErrorCode: undefined,
492
496
  clientErrorCode: BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP[rawError.name],
493
497
  serviceErrorName: rawError.name,
498
+ rawErrorMessage,
494
499
  });
495
500
  }
496
501
  }
@@ -504,7 +509,11 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
504
509
  if (serviceErrorCode) {
505
510
  const clientErrorCode = SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP[serviceErrorCode];
506
511
  if (clientErrorCode) {
507
- return this.getErrorPayloadForClientErrorCode({clientErrorCode, serviceErrorCode});
512
+ return this.getErrorPayloadForClientErrorCode({
513
+ clientErrorCode,
514
+ serviceErrorCode,
515
+ rawErrorMessage,
516
+ });
508
517
  }
509
518
 
510
519
  // by default, if it is locus error, return new locus err
@@ -512,6 +521,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
512
521
  return this.getErrorPayloadForClientErrorCode({
513
522
  clientErrorCode: NEW_LOCUS_ERROR_CLIENT_CODE,
514
523
  serviceErrorCode,
524
+ rawErrorMessage,
515
525
  });
516
526
  }
517
527
  }
@@ -520,35 +530,33 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
520
530
  return this.getErrorPayloadForClientErrorCode({
521
531
  clientErrorCode: MEETING_INFO_LOOKUP_ERROR_CLIENT_CODE,
522
532
  serviceErrorCode,
533
+ rawErrorMessage,
523
534
  });
524
535
  }
525
536
 
526
537
  if (isNetworkError(rawError)) {
527
- const payload = this.getErrorPayloadForClientErrorCode({
538
+ return this.getErrorPayloadForClientErrorCode({
528
539
  clientErrorCode: NETWORK_ERROR,
529
540
  serviceErrorCode,
530
541
  payloadOverrides: rawError.payloadOverrides,
542
+ rawErrorMessage,
531
543
  });
532
- payload.errorDescription = rawError.message;
533
-
534
- return payload;
535
544
  }
536
545
 
537
546
  if (isUnauthorizedError(rawError)) {
538
- const payload = this.getErrorPayloadForClientErrorCode({
547
+ return this.getErrorPayloadForClientErrorCode({
539
548
  clientErrorCode: AUTHENTICATION_FAILED_CODE,
540
549
  serviceErrorCode,
541
550
  payloadOverrides: rawError.payloadOverrides,
551
+ rawErrorMessage,
542
552
  });
543
- payload.errorDescription = rawError.message;
544
-
545
- return payload;
546
553
  }
547
554
 
548
555
  // otherwise return unkown error
549
556
  return this.getErrorPayloadForClientErrorCode({
550
557
  clientErrorCode: UNKNOWN_ERROR,
551
558
  serviceErrorCode: UNKNOWN_ERROR,
559
+ rawErrorMessage,
552
560
  });
553
561
  }
554
562
 
@@ -614,11 +622,6 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
614
622
  webexSubServiceType: this.getSubServiceType(meeting),
615
623
  };
616
624
 
617
- if (options?.rawError?.message) {
618
- // @ts-ignore
619
- clientEventObject.eventData.rawErrorMessage = options?.rawError?.message;
620
- }
621
-
622
625
  return clientEventObject;
623
626
  }
624
627
 
@@ -660,11 +663,6 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
660
663
  loginType: this.getCurLoginType(),
661
664
  };
662
665
 
663
- if (options?.rawError?.message) {
664
- // @ts-ignore
665
- clientEventObject.eventData.rawErrorMessage = options?.rawError?.message;
666
- }
667
-
668
666
  return clientEventObject;
669
667
  }
670
668