@webex/internal-plugin-metrics 3.5.0-next.4 → 3.5.0-next.6

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.
@@ -581,10 +581,11 @@ var CallDiagnosticMetrics = exports.default = /*#__PURE__*/function (_StatelessW
581
581
  });
582
582
  }
583
583
 
584
- // otherwise return unkown error
584
+ // otherwise return unkown error but passing serviceErrorCode and serviceErrorName so that we know the issue
585
585
  return this.getErrorPayloadForClientErrorCode({
586
586
  clientErrorCode: _config2.UNKNOWN_ERROR,
587
- serviceErrorCode: _config2.UNKNOWN_ERROR,
587
+ serviceErrorCode: serviceErrorCode || _config2.UNKNOWN_ERROR,
588
+ serviceErrorName: rawError === null || rawError === void 0 ? void 0 : rawError.name,
588
589
  payloadOverrides: rawError.payloadOverrides,
589
590
  rawErrorMessage: rawErrorMessage,
590
591
  httpStatusCode: httpStatusCode
@@ -1 +1 @@
1
- {"version":3,"names":["_common","require","_uuid","_interopRequireDefault","_lodash","_webexCore","_metrics","_callDiagnosticMetrics","_config","_callDiagnosticMetricsBatcher","_preloginMetricsBatcher","_config2","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","result","NewTarget","constructor","_Reflect$construct","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","_BrowserDetection","BrowserDetection","getOSVersion","getBrowserName","getBrowserVersion","CallDiagnosticMetrics","exports","_StatelessWebexPlugin","_inherits2","_super","_this","_classCallCheck2","_len","args","Array","_key","concat","_assertThisInitialized2","options","_promise","resolve","event","valid","preLoginId","finalEvent","eventPayload","type","preLoginMetricsBatcher","savePreLoginId","request","logger","webex","callDiagnosticEventsBatcher","CallDiagnosticEventsBatcher","parent","PreLoginMetricsBatcher","_createClass2","key","value","getCurLoginType","canAuthorize","credentials","isUnverifiedGuest","getIsConvergedArchitectureEnabled","_ref","meetingId","_meeting$meetingInfo","meeting","meetings","meetingCollection","get","meetingInfo","enableConvergedArchitecture","undefined","getSubServiceType","webexScheduled","enableEvent","pmr","WEBEX_SUB_SERVICE_TYPES","PMR","SCHEDULED_MEETING","WEBINAR","getOrigin","_this$webex$meetings$","_this$webex$meetings$2","_this$webex$meetings$3","_this$webex$meetings$4","_this$webex$meetings$5","_this$webex$meetings$6","defaultClientType","config","metrics","clientType","defaultSubClientType","subClientType","providedClientVersion","clientVersion","defaultSDKClientVersion","CLIENT_NAME","version","versionMetadata","extractVersionMetadata","hasLoggedBrowserSerial","log","CALL_DIAGNOSTIC_LOG_IDENTIFIER","_stringify","getBrowserSerial","_this$webex$meetings","_this$webex$meetings$7","_this$webex$meetings$8","_this$webex$meetings$9","_this$webex$meetings$10","_this$webex$meetings$11","origin","name","networkType","userAgent","userAgentToString","clientName","webexVersion","clientInfo","publicNetworkPrefix","anonymizeIPAddress","geoHintInfo","clientAddress","localNetworkPrefix","statsAnalyzer","getLocalIpAddress","osVersion","os","getOSNameInternal","browser","browserVersion","environment","newEnvironment","clientLaunchMethod","browserLaunchMethod","Error","getIdentifiers","_meeting$locusInfo","_meeting$meetingInfo2","_meeting$meetingInfo3","_meeting$meetingInfo6","_meeting$meetingInfo8","mediaConnections","correlationId","webexConferenceIdStr","globalMeetingId","sessionCorrelationId","identifiers","device","_ref2","installationId","userId","deviceId","url","orgId","locusUrl","internal","services","machineId","locusInfo","fullState","locusId","split","pop","locusStartTime","lastActive","confIdStr","confID","_meeting$meetingInfo4","_meeting$meetingInfo5","_meeting$meetingInfo7","siteName","_meeting$meetingInfo9","webexSiteName","_mediaConnections$","_mediaConnections$2","mediaAgentAlias","mediaAgentGroupId","prepareDiagnosticEvent","eventData","_this$webex$meetings$12","eventId","uuid","v4","originTime","triggered","Date","toISOString","sent","senderCountryCode","countryCode","clearEmptyKeysRecursively","submitFeatureEvent","submitMQE","_ref3","payload","console","warn","submitClientMetrics","CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND","fields","clientEventObject","canProceed","webClientDomain","window","location","hostname","intervals","callingServiceType","meetingJoinInfo","clientSignallingProtocol","sourceMetadata","applicationSoftwareType","applicationSoftwareVersion","mediaEngineSoftwareType","mediaEngineSoftwareVersion","startTime","merge","diagnosticEvent","validator","submitToCallDiagnostics","getErrorPayloadForClientErrorCode","_ref4","clientErrorCode","serviceErrorCode","serviceErrorName","rawErrorMessage","payloadOverrides","httpStatusCode","error","partialParsedError","CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD","fatal","shownToUser","category","errorCode","errorData","errorName","generateClientEventErrorPayload","rawError","_rawError$error","_rawError$error$body","_rawError$body","_rawError$body2","_rawError$body3","_rawError$body3$reaso","message","statusCode","isBrowserMediaErrorName","BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP","isSdpOfferCreationError","_rawError$cause","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","createClientEventObjectInMeeting","_ref5","errors","userType","getCurUserType","loginType","callStateForMetrics","isConvergedArchitectureEnabled","webexSubServiceType","createClientEventObjectPreMeeting","_ref6","prepareClientEvent","_ref7","generatedError","submitClientEvent","_ref8","submitToCallDiagnosticsPreLogin","_buildClientEventFetchRequestOptions","_asyncToGenerator2","_regenerator","mark","_callee","_ref9","clientEvent","wrap","_callee$","_context","prev","next","prepareDiagnosticMetricItem","method","service","resource","headers","waitForServiceTimeout","authorization","abrupt","prepareFetchOptions","stop","buildClientEventFetchRequestOptions","_x","isServiceErrorExpected","clientErrorPayload","setDeviceInfo","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 {BrowserDetection, getBrowserSerial} from '@webex/common';\nimport uuid from 'uuid';\nimport {merge} from 'lodash';\nimport {StatelessWebexPlugin} from '@webex/webex-core';\nimport {getOSNameInternal} from '../metrics';\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 BrowserLaunchMethodType,\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 browserLaunchMethod?: BrowserLaunchMethodType;\n environment?: EnvironmentType;\n newEnvironment?: NewEnvironmentType;\n};\n\ntype GetIdentifiersOptions = {\n meeting?: any;\n mediaConnections?: any[];\n correlationId?: string;\n sessionCorrelationId?: 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 private device: any;\n\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 if (options?.browserLaunchMethod) {\n origin.clientInfo.browserLaunchMethod = options.browserLaunchMethod;\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 sessionCorrelationId,\n } = options;\n const identifiers: Event['event']['identifiers'] = {\n correlationId: 'unknown', // concerned with setting this to unknown. This will fail diagnostic events parsing because it's not a uuid pattern\n };\n\n if (meeting) {\n identifiers.correlationId = meeting.correlationId;\n if (meeting.sessionCorrelationId) {\n identifiers.sessionCorrelationId = meeting.sessionCorrelationId;\n }\n }\n\n if (sessionCorrelationId) {\n identifiers.sessionCorrelationId = sessionCorrelationId;\n }\n\n if (correlationId) {\n identifiers.correlationId = correlationId;\n }\n\n // TODO: should we use patterns.uuid to validate correlationId and session correlation id? they will fail the diagnostic events validation pipeline if improperly formatted\n\n if (this.device) {\n const {device} = this;\n const {installationId} = device?.config || {};\n\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 if (installationId) {\n identifiers.machineId = installationId;\n }\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 callingServiceType: 'LOCUS',\n meetingJoinInfo: {\n clientSignallingProtocol: 'WebRTC',\n },\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 payloadOverrides: rawError.payloadOverrides,\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 {\n meetingId,\n mediaConnections,\n globalMeetingId,\n webexConferenceIdStr,\n sessionCorrelationId,\n } = 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 sessionCorrelationId,\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, sessionCorrelationId} =\n options;\n\n // grab identifiers\n const identifiers = this.getIdentifiers({\n correlationId,\n sessionCorrelationId,\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 /**\n * This method is used to set the device information by internal-plugin-device\n * @param {device} object The webex.internal.device object\n * @returns {undefined}\n */\n public setDeviceInfo(device: any): void {\n // This was created to fix the circular dependency between internal-plugin-device and internal-plugin-metrics\n this.logger.log('CallDiagnosticMetrics: @setDeviceInfo called', device);\n\n this.device = device;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["_common","require","_uuid","_interopRequireDefault","_lodash","_webexCore","_metrics","_callDiagnosticMetrics","_config","_callDiagnosticMetricsBatcher","_preloginMetricsBatcher","_config2","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","result","NewTarget","constructor","_Reflect$construct","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","_BrowserDetection","BrowserDetection","getOSVersion","getBrowserName","getBrowserVersion","CallDiagnosticMetrics","exports","_StatelessWebexPlugin","_inherits2","_super","_this","_classCallCheck2","_len","args","Array","_key","concat","_assertThisInitialized2","options","_promise","resolve","event","valid","preLoginId","finalEvent","eventPayload","type","preLoginMetricsBatcher","savePreLoginId","request","logger","webex","callDiagnosticEventsBatcher","CallDiagnosticEventsBatcher","parent","PreLoginMetricsBatcher","_createClass2","key","value","getCurLoginType","canAuthorize","credentials","isUnverifiedGuest","getIsConvergedArchitectureEnabled","_ref","meetingId","_meeting$meetingInfo","meeting","meetings","meetingCollection","get","meetingInfo","enableConvergedArchitecture","undefined","getSubServiceType","webexScheduled","enableEvent","pmr","WEBEX_SUB_SERVICE_TYPES","PMR","SCHEDULED_MEETING","WEBINAR","getOrigin","_this$webex$meetings$","_this$webex$meetings$2","_this$webex$meetings$3","_this$webex$meetings$4","_this$webex$meetings$5","_this$webex$meetings$6","defaultClientType","config","metrics","clientType","defaultSubClientType","subClientType","providedClientVersion","clientVersion","defaultSDKClientVersion","CLIENT_NAME","version","versionMetadata","extractVersionMetadata","hasLoggedBrowserSerial","log","CALL_DIAGNOSTIC_LOG_IDENTIFIER","_stringify","getBrowserSerial","_this$webex$meetings","_this$webex$meetings$7","_this$webex$meetings$8","_this$webex$meetings$9","_this$webex$meetings$10","_this$webex$meetings$11","origin","name","networkType","userAgent","userAgentToString","clientName","webexVersion","clientInfo","publicNetworkPrefix","anonymizeIPAddress","geoHintInfo","clientAddress","localNetworkPrefix","statsAnalyzer","getLocalIpAddress","osVersion","os","getOSNameInternal","browser","browserVersion","environment","newEnvironment","clientLaunchMethod","browserLaunchMethod","Error","getIdentifiers","_meeting$locusInfo","_meeting$meetingInfo2","_meeting$meetingInfo3","_meeting$meetingInfo6","_meeting$meetingInfo8","mediaConnections","correlationId","webexConferenceIdStr","globalMeetingId","sessionCorrelationId","identifiers","device","_ref2","installationId","userId","deviceId","url","orgId","locusUrl","internal","services","machineId","locusInfo","fullState","locusId","split","pop","locusStartTime","lastActive","confIdStr","confID","_meeting$meetingInfo4","_meeting$meetingInfo5","_meeting$meetingInfo7","siteName","_meeting$meetingInfo9","webexSiteName","_mediaConnections$","_mediaConnections$2","mediaAgentAlias","mediaAgentGroupId","prepareDiagnosticEvent","eventData","_this$webex$meetings$12","eventId","uuid","v4","originTime","triggered","Date","toISOString","sent","senderCountryCode","countryCode","clearEmptyKeysRecursively","submitFeatureEvent","submitMQE","_ref3","payload","console","warn","submitClientMetrics","CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND","fields","clientEventObject","canProceed","webClientDomain","window","location","hostname","intervals","callingServiceType","meetingJoinInfo","clientSignallingProtocol","sourceMetadata","applicationSoftwareType","applicationSoftwareVersion","mediaEngineSoftwareType","mediaEngineSoftwareVersion","startTime","merge","diagnosticEvent","validator","submitToCallDiagnostics","getErrorPayloadForClientErrorCode","_ref4","clientErrorCode","serviceErrorCode","serviceErrorName","rawErrorMessage","payloadOverrides","httpStatusCode","error","partialParsedError","CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD","fatal","shownToUser","category","errorCode","errorData","errorName","generateClientEventErrorPayload","rawError","_rawError$error","_rawError$error$body","_rawError$body","_rawError$body2","_rawError$body3","_rawError$body3$reaso","message","statusCode","isBrowserMediaErrorName","BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP","isSdpOfferCreationError","_rawError$cause","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","createClientEventObjectInMeeting","_ref5","errors","userType","getCurUserType","loginType","callStateForMetrics","isConvergedArchitectureEnabled","webexSubServiceType","createClientEventObjectPreMeeting","_ref6","prepareClientEvent","_ref7","generatedError","submitClientEvent","_ref8","submitToCallDiagnosticsPreLogin","_buildClientEventFetchRequestOptions","_asyncToGenerator2","_regenerator","mark","_callee","_ref9","clientEvent","wrap","_callee$","_context","prev","next","prepareDiagnosticMetricItem","method","service","resource","headers","waitForServiceTimeout","authorization","abrupt","prepareFetchOptions","stop","buildClientEventFetchRequestOptions","_x","isServiceErrorExpected","clientErrorPayload","setDeviceInfo","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 {BrowserDetection, getBrowserSerial} from '@webex/common';\nimport uuid from 'uuid';\nimport {merge} from 'lodash';\nimport {StatelessWebexPlugin} from '@webex/webex-core';\nimport {getOSNameInternal} from '../metrics';\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 BrowserLaunchMethodType,\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 browserLaunchMethod?: BrowserLaunchMethodType;\n environment?: EnvironmentType;\n newEnvironment?: NewEnvironmentType;\n};\n\ntype GetIdentifiersOptions = {\n meeting?: any;\n mediaConnections?: any[];\n correlationId?: string;\n sessionCorrelationId?: 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 private device: any;\n\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 if (options?.browserLaunchMethod) {\n origin.clientInfo.browserLaunchMethod = options.browserLaunchMethod;\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 sessionCorrelationId,\n } = options;\n const identifiers: Event['event']['identifiers'] = {\n correlationId: 'unknown', // concerned with setting this to unknown. This will fail diagnostic events parsing because it's not a uuid pattern\n };\n\n if (meeting) {\n identifiers.correlationId = meeting.correlationId;\n if (meeting.sessionCorrelationId) {\n identifiers.sessionCorrelationId = meeting.sessionCorrelationId;\n }\n }\n\n if (sessionCorrelationId) {\n identifiers.sessionCorrelationId = sessionCorrelationId;\n }\n\n if (correlationId) {\n identifiers.correlationId = correlationId;\n }\n\n // TODO: should we use patterns.uuid to validate correlationId and session correlation id? they will fail the diagnostic events validation pipeline if improperly formatted\n\n if (this.device) {\n const {device} = this;\n const {installationId} = device?.config || {};\n\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 if (installationId) {\n identifiers.machineId = installationId;\n }\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 callingServiceType: 'LOCUS',\n meetingJoinInfo: {\n clientSignallingProtocol: 'WebRTC',\n },\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 but passing serviceErrorCode and serviceErrorName so that we know the issue\n return this.getErrorPayloadForClientErrorCode({\n clientErrorCode: UNKNOWN_ERROR,\n serviceErrorCode: serviceErrorCode || UNKNOWN_ERROR,\n serviceErrorName: rawError?.name,\n payloadOverrides: rawError.payloadOverrides,\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 {\n meetingId,\n mediaConnections,\n globalMeetingId,\n webexConferenceIdStr,\n sessionCorrelationId,\n } = 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 sessionCorrelationId,\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, sessionCorrelationId} =\n options;\n\n // grab identifiers\n const identifiers = this.getIdentifiers({\n correlationId,\n sessionCorrelationId,\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 /**\n * This method is used to set the device information by internal-plugin-device\n * @param {device} object The webex.internal.device object\n * @returns {undefined}\n */\n public setDeviceInfo(device: any): void {\n // This was created to fix the circular dependency between internal-plugin-device and internal-plugin-metrics\n this.logger.log('CallDiagnosticMetrics: @setDeviceInfo called', device);\n\n this.device = device;\n }\n}\n"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -46,6 +46,12 @@ _Object$defineProperty(exports, "OperationalMetrics", {
46
46
  return _operationalMetrics.default;
47
47
  }
48
48
  });
49
+ _Object$defineProperty(exports, "RtcMetrics", {
50
+ enumerable: true,
51
+ get: function get() {
52
+ return _rtcMetrics.default;
53
+ }
54
+ });
49
55
  exports.Utils = void 0;
50
56
  _Object$defineProperty(exports, "config", {
51
57
  enumerable: true,
@@ -80,6 +86,7 @@ var _callDiagnosticMetricsLatencies = _interopRequireDefault(require("./call-dia
80
86
  var _behavioralMetrics = _interopRequireDefault(require("./behavioral-metrics"));
81
87
  var _operationalMetrics = _interopRequireDefault(require("./operational-metrics"));
82
88
  var _businessMetrics = _interopRequireDefault(require("./business-metrics"));
89
+ var _rtcMetrics = _interopRequireDefault(require("./rtcMetrics"));
83
90
  function _getRequireWildcardCache(e) { if ("function" != typeof _WeakMap) return null; var r = new _WeakMap(), t = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
84
91
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? _Object$getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? _Object$defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
85
92
  /*!
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["_webexCore","require","_metrics","_interopRequireWildcard","_config","_interopRequireDefault","_newMetrics","Utils","exports","CALL_DIAGNOSTIC_CONFIG","CallDiagnosticUtils","_callDiagnosticMetrics2","_callDiagnosticMetricsLatencies","_behavioralMetrics","_operationalMetrics","_businessMetrics","_getRequireWildcardCache","e","_WeakMap","r","t","__esModule","_typeof","default","has","get","n","__proto__","a","_Object$defineProperty","_Object$getOwnPropertyDescriptor","u","Object","prototype","hasOwnProperty","call","i","set","registerInternalPlugin","Metrics","config","NewMetrics"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {registerInternalPlugin} from '@webex/webex-core';\n\nimport Metrics from './metrics';\nimport config from './config';\nimport NewMetrics from './new-metrics';\nimport * as Utils from './utils';\nimport {\n ClientEvent,\n ClientEventLeaveReason,\n SubmitBehavioralEvent,\n SubmitClientEvent,\n SubmitInternalEvent,\n SubmitOperationalEvent,\n SubmitMQE,\n PreComputedLatencies,\n} from './metrics.types';\nimport * as CALL_DIAGNOSTIC_CONFIG from './call-diagnostic/config';\nimport * as CallDiagnosticUtils from './call-diagnostic/call-diagnostic-metrics.util';\nimport CallDiagnosticMetrics from './call-diagnostic/call-diagnostic-metrics';\nimport CallDiagnosticLatencies from './call-diagnostic/call-diagnostic-metrics-latencies';\nimport BehavioralMetrics from './behavioral-metrics';\nimport OperationalMetrics from './operational-metrics';\nimport BusinessMetrics from './business-metrics';\n\nregisterInternalPlugin('metrics', Metrics, {\n config,\n});\n\nregisterInternalPlugin('newMetrics', NewMetrics, {\n config,\n});\n\nexport {default, getOSNameInternal} from './metrics';\n\nexport {\n config,\n CALL_DIAGNOSTIC_CONFIG,\n NewMetrics,\n Utils,\n CallDiagnosticUtils,\n CallDiagnosticLatencies,\n CallDiagnosticMetrics,\n BehavioralMetrics,\n OperationalMetrics,\n BusinessMetrics,\n};\nexport type {\n ClientEvent,\n ClientEventLeaveReason,\n SubmitBehavioralEvent,\n SubmitClientEvent,\n SubmitInternalEvent,\n SubmitMQE,\n SubmitOperationalEvent,\n PreComputedLatencies,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAAA,UAAA,GAAAC,OAAA;AAEA,IAAAC,QAAA,GAAAC,uBAAA,CAAAF,OAAA;AACA,IAAAG,OAAA,GAAAC,sBAAA,CAAAJ,OAAA;AACA,IAAAK,WAAA,GAAAD,sBAAA,CAAAJ,OAAA;AACA,IAAAM,KAAA,GAAAJ,uBAAA,CAAAF,OAAA;AAAiCO,OAAA,CAAAD,KAAA,GAAAA,KAAA;AAWjC,IAAAE,sBAAA,GAAAN,uBAAA,CAAAF,OAAA;AAAmEO,OAAA,CAAAC,sBAAA,GAAAA,sBAAA;AACnE,IAAAC,mBAAA,GAAAP,uBAAA,CAAAF,OAAA;AAAsFO,OAAA,CAAAE,mBAAA,GAAAA,mBAAA;AACtF,IAAAC,uBAAA,GAAAN,sBAAA,CAAAJ,OAAA;AACA,IAAAW,+BAAA,GAAAP,sBAAA,CAAAJ,OAAA;AACA,IAAAY,kBAAA,GAAAR,sBAAA,CAAAJ,OAAA;AACA,IAAAa,mBAAA,GAAAT,sBAAA,CAAAJ,OAAA;AACA,IAAAc,gBAAA,GAAAV,sBAAA,CAAAJ,OAAA;AAAiD,SAAAe,yBAAAC,CAAA,6BAAAC,QAAA,mBAAAC,CAAA,OAAAD,QAAA,IAAAE,CAAA,OAAAF,QAAA,YAAAF,wBAAA,YAAAA,yBAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAd,wBAAAc,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,gBAAAK,OAAA,CAAAL,CAAA,0BAAAA,CAAA,WAAAM,OAAA,EAAAN,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAI,GAAA,CAAAP,CAAA,UAAAG,CAAA,CAAAK,GAAA,CAAAR,CAAA,OAAAS,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,sBAAA,IAAAC,gCAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,IAAAC,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAlB,CAAA,EAAAc,CAAA,SAAAK,CAAA,GAAAR,CAAA,GAAAE,gCAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAK,CAAA,KAAAA,CAAA,CAAAX,GAAA,IAAAW,CAAA,CAAAC,GAAA,IAAAR,sBAAA,CAAAH,CAAA,EAAAK,CAAA,EAAAK,CAAA,IAAAV,CAAA,CAAAK,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAL,CAAA,CAAAH,OAAA,GAAAN,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAiB,GAAA,CAAApB,CAAA,EAAAS,CAAA,GAAAA,CAAA;AA1BjD;AACA;AACA;;AA0BA,IAAAY,iCAAsB,EAAC,SAAS,EAAEC,gBAAO,EAAE;EACzCC,MAAM,EAANA;AACF,CAAC,CAAC;AAEF,IAAAF,iCAAsB,EAAC,YAAY,EAAEG,mBAAU,EAAE;EAC/CD,MAAM,EAANA;AACF,CAAC,CAAC"}
1
+ {"version":3,"names":["_webexCore","require","_metrics","_interopRequireWildcard","_config","_interopRequireDefault","_newMetrics","Utils","exports","CALL_DIAGNOSTIC_CONFIG","CallDiagnosticUtils","_callDiagnosticMetrics2","_callDiagnosticMetricsLatencies","_behavioralMetrics","_operationalMetrics","_businessMetrics","_rtcMetrics","_getRequireWildcardCache","e","_WeakMap","r","t","__esModule","_typeof","default","has","get","n","__proto__","a","_Object$defineProperty","_Object$getOwnPropertyDescriptor","u","Object","prototype","hasOwnProperty","call","i","set","registerInternalPlugin","Metrics","config","NewMetrics"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {registerInternalPlugin} from '@webex/webex-core';\n\nimport Metrics from './metrics';\nimport config from './config';\nimport NewMetrics from './new-metrics';\nimport * as Utils from './utils';\nimport {\n ClientEvent,\n ClientEventLeaveReason,\n SubmitBehavioralEvent,\n SubmitClientEvent,\n SubmitInternalEvent,\n SubmitOperationalEvent,\n SubmitMQE,\n PreComputedLatencies,\n} from './metrics.types';\nimport * as CALL_DIAGNOSTIC_CONFIG from './call-diagnostic/config';\nimport * as CallDiagnosticUtils from './call-diagnostic/call-diagnostic-metrics.util';\nimport CallDiagnosticMetrics from './call-diagnostic/call-diagnostic-metrics';\nimport CallDiagnosticLatencies from './call-diagnostic/call-diagnostic-metrics-latencies';\nimport BehavioralMetrics from './behavioral-metrics';\nimport OperationalMetrics from './operational-metrics';\nimport BusinessMetrics from './business-metrics';\nimport RtcMetrics from './rtcMetrics';\n\nregisterInternalPlugin('metrics', Metrics, {\n config,\n});\n\nregisterInternalPlugin('newMetrics', NewMetrics, {\n config,\n});\n\nexport {default, getOSNameInternal} from './metrics';\n\nexport {\n config,\n CALL_DIAGNOSTIC_CONFIG,\n NewMetrics,\n Utils,\n CallDiagnosticUtils,\n CallDiagnosticLatencies,\n CallDiagnosticMetrics,\n BehavioralMetrics,\n OperationalMetrics,\n BusinessMetrics,\n RtcMetrics,\n};\nexport type {\n ClientEvent,\n ClientEventLeaveReason,\n SubmitBehavioralEvent,\n SubmitClientEvent,\n SubmitInternalEvent,\n SubmitMQE,\n SubmitOperationalEvent,\n PreComputedLatencies,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAAA,UAAA,GAAAC,OAAA;AAEA,IAAAC,QAAA,GAAAC,uBAAA,CAAAF,OAAA;AACA,IAAAG,OAAA,GAAAC,sBAAA,CAAAJ,OAAA;AACA,IAAAK,WAAA,GAAAD,sBAAA,CAAAJ,OAAA;AACA,IAAAM,KAAA,GAAAJ,uBAAA,CAAAF,OAAA;AAAiCO,OAAA,CAAAD,KAAA,GAAAA,KAAA;AAWjC,IAAAE,sBAAA,GAAAN,uBAAA,CAAAF,OAAA;AAAmEO,OAAA,CAAAC,sBAAA,GAAAA,sBAAA;AACnE,IAAAC,mBAAA,GAAAP,uBAAA,CAAAF,OAAA;AAAsFO,OAAA,CAAAE,mBAAA,GAAAA,mBAAA;AACtF,IAAAC,uBAAA,GAAAN,sBAAA,CAAAJ,OAAA;AACA,IAAAW,+BAAA,GAAAP,sBAAA,CAAAJ,OAAA;AACA,IAAAY,kBAAA,GAAAR,sBAAA,CAAAJ,OAAA;AACA,IAAAa,mBAAA,GAAAT,sBAAA,CAAAJ,OAAA;AACA,IAAAc,gBAAA,GAAAV,sBAAA,CAAAJ,OAAA;AACA,IAAAe,WAAA,GAAAX,sBAAA,CAAAJ,OAAA;AAAsC,SAAAgB,yBAAAC,CAAA,6BAAAC,QAAA,mBAAAC,CAAA,OAAAD,QAAA,IAAAE,CAAA,OAAAF,QAAA,YAAAF,wBAAA,YAAAA,yBAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAf,wBAAAe,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,gBAAAK,OAAA,CAAAL,CAAA,0BAAAA,CAAA,WAAAM,OAAA,EAAAN,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAI,GAAA,CAAAP,CAAA,UAAAG,CAAA,CAAAK,GAAA,CAAAR,CAAA,OAAAS,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,sBAAA,IAAAC,gCAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,IAAAC,MAAA,CAAAC,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAlB,CAAA,EAAAc,CAAA,SAAAK,CAAA,GAAAR,CAAA,GAAAE,gCAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAK,CAAA,KAAAA,CAAA,CAAAX,GAAA,IAAAW,CAAA,CAAAC,GAAA,IAAAR,sBAAA,CAAAH,CAAA,EAAAK,CAAA,EAAAK,CAAA,IAAAV,CAAA,CAAAK,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAL,CAAA,CAAAH,OAAA,GAAAN,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAiB,GAAA,CAAApB,CAAA,EAAAS,CAAA,GAAAA,CAAA;AA3BtC;AACA;AACA;;AA2BA,IAAAY,iCAAsB,EAAC,SAAS,EAAEC,gBAAO,EAAE;EACzCC,MAAM,EAANA;AACF,CAAC,CAAC;AAEF,IAAAF,iCAAsB,EAAC,YAAY,EAAEG,mBAAU,EAAE;EAC/CD,MAAM,EAANA;AACF,CAAC,CAAC"}
package/dist/metrics.js CHANGED
@@ -148,7 +148,7 @@ var Metrics = _webexCore.WebexPlugin.extend({
148
148
  }
149
149
  });
150
150
  },
151
- version: "3.5.0-next.4"
151
+ version: "3.5.0-next.6"
152
152
  });
153
153
  var _default = exports.default = Metrics;
154
154
  //# sourceMappingURL=metrics.js.map
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+ _Object$defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var RTC_METRICS = exports.default = {
9
+ APP_ID: 'FFB51ED5-4319-4C55-8303-B1F2FCCDE231'
10
+ };
11
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["RTC_METRICS","exports","default","APP_ID"],"sources":["constants.ts"],"sourcesContent":["const RTC_METRICS = {APP_ID: 'FFB51ED5-4319-4C55-8303-B1F2FCCDE231'};\n\nexport {RTC_METRICS as default};\n"],"mappings":";;;;;;;AAAA,IAAMA,WAAW,GAAAC,OAAA,CAAAC,OAAA,GAAG;EAACC,MAAM,EAAE;AAAsC,CAAC"}
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+
3
+ var _typeof = require("@babel/runtime-corejs2/helpers/typeof");
4
+ var _WeakMap = require("@babel/runtime-corejs2/core-js/weak-map");
5
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
6
+ var _Object$getOwnPropertyDescriptor = require("@babel/runtime-corejs2/core-js/object/get-own-property-descriptor");
7
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
8
+ _Object$defineProperty(exports, "__esModule", {
9
+ value: true
10
+ });
11
+ exports.default = void 0;
12
+ var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
13
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
14
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
15
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
16
+ var _uuid = _interopRequireDefault(require("uuid"));
17
+ var CallDiagnosticUtils = _interopRequireWildcard(require("../call-diagnostic/call-diagnostic-metrics.util"));
18
+ var _constants = _interopRequireDefault(require("./constants"));
19
+ function _getRequireWildcardCache(e) { if ("function" != typeof _WeakMap) return null; var r = new _WeakMap(), t = new _WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
20
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = _Object$defineProperty && _Object$getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? _Object$getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? _Object$defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
21
+ /* eslint-disable class-methods-use-this */
22
+
23
+ var parseJsonPayload = function parseJsonPayload(payload) {
24
+ try {
25
+ if (payload && payload[0]) {
26
+ return JSON.parse(payload[0]);
27
+ }
28
+ return null;
29
+ } catch (_) {
30
+ return null;
31
+ }
32
+ };
33
+
34
+ /**
35
+ * Rtc Metrics
36
+ */
37
+ var RtcMetrics = exports.default = /*#__PURE__*/function () {
38
+ /**
39
+ * Initialize the interval.
40
+ *
41
+ * @param {object} webex - The main `webex` object.
42
+ * @param {string} meetingId - The meeting id.
43
+ * @param {string} correlationId - The correlation id.
44
+ */
45
+ function RtcMetrics(webex, meetingId, correlationId) {
46
+ (0, _classCallCheck2.default)(this, RtcMetrics);
47
+ /**
48
+ * Array of MetricData items to be sent to the metrics service.
49
+ */
50
+ (0, _defineProperty2.default)(this, "metricsQueue", []);
51
+ (0, _defineProperty2.default)(this, "intervalId", void 0);
52
+ (0, _defineProperty2.default)(this, "webex", void 0);
53
+ (0, _defineProperty2.default)(this, "meetingId", void 0);
54
+ (0, _defineProperty2.default)(this, "correlationId", void 0);
55
+ (0, _defineProperty2.default)(this, "connectionId", void 0);
56
+ (0, _defineProperty2.default)(this, "shouldSendMetricsOnNextStatsReport", void 0);
57
+ // `window` is used to prevent typescript from returning a NodeJS.Timer.
58
+ this.intervalId = window.setInterval(this.sendMetricsInQueue.bind(this), 30 * 1000);
59
+ this.meetingId = meetingId;
60
+ this.webex = webex;
61
+ this.correlationId = correlationId;
62
+ this.resetConnection();
63
+ }
64
+
65
+ /**
66
+ * Check to see if the metrics queue has any items.
67
+ *
68
+ * @returns {void}
69
+ */
70
+ (0, _createClass2.default)(RtcMetrics, [{
71
+ key: "sendMetricsInQueue",
72
+ value: function sendMetricsInQueue() {
73
+ if (this.metricsQueue.length) {
74
+ this.sendMetrics();
75
+ this.metricsQueue = [];
76
+ }
77
+ }
78
+
79
+ /**
80
+ * Forces sending metrics when we get the next stats-report
81
+ *
82
+ * This is useful for cases when something important happens that affects the media connection,
83
+ * for example when we move from lobby into the meeting.
84
+ *
85
+ * @returns {void}
86
+ */
87
+ }, {
88
+ key: "sendNextMetrics",
89
+ value: function sendNextMetrics() {
90
+ this.shouldSendMetricsOnNextStatsReport = true;
91
+ }
92
+
93
+ /**
94
+ * Add metrics items to the metrics queue.
95
+ *
96
+ * @param {object} data - An object with a payload array of metrics items.
97
+ *
98
+ * @returns {void}
99
+ */
100
+ }, {
101
+ key: "addMetrics",
102
+ value: function addMetrics(data) {
103
+ if (data.payload.length) {
104
+ if (data.name === 'stats-report') {
105
+ data.payload = data.payload.map(this.anonymizeIp);
106
+ }
107
+ this.metricsQueue.push(data);
108
+ if (this.shouldSendMetricsOnNextStatsReport && data.name === 'stats-report') {
109
+ // this is the first useful set of data (WCME gives it to us after 5s), send it out immediately
110
+ // in case the user is unhappy and closes the browser early
111
+ this.sendMetricsInQueue();
112
+ this.shouldSendMetricsOnNextStatsReport = false;
113
+ }
114
+ try {
115
+ // If a connection fails, send the rest of the metrics in queue and get a new connection id.
116
+ var parsedPayload = parseJsonPayload(data.payload);
117
+ if (data.name === 'onconnectionstatechange' && parsedPayload && parsedPayload.value === 'failed') {
118
+ this.sendMetricsInQueue();
119
+ this.resetConnection();
120
+ }
121
+ } catch (e) {
122
+ console.error(e);
123
+ }
124
+ }
125
+ }
126
+
127
+ /**
128
+ * Clear the metrics interval.
129
+ *
130
+ * @returns {void}
131
+ */
132
+ }, {
133
+ key: "closeMetrics",
134
+ value: function closeMetrics() {
135
+ this.sendMetricsInQueue();
136
+ clearInterval(this.intervalId);
137
+ }
138
+
139
+ /**
140
+ * Anonymize IP addresses.
141
+ *
142
+ * @param {array} stats - An RTCStatsReport organized into an array of strings.
143
+ * @returns {string}
144
+ */
145
+ }, {
146
+ key: "anonymizeIp",
147
+ value: function anonymizeIp(stats) {
148
+ var data = JSON.parse(stats);
149
+ // on local and remote candidates, anonymize the last 4 bits.
150
+ if (data.type === 'local-candidate' || data.type === 'remote-candidate') {
151
+ data.ip = CallDiagnosticUtils.anonymizeIPAddress(data.ip) || undefined;
152
+ data.address = CallDiagnosticUtils.anonymizeIPAddress(data.address) || undefined;
153
+ data.relatedAddress = CallDiagnosticUtils.anonymizeIPAddress(data.relatedAddress) || undefined;
154
+ }
155
+ return (0, _stringify.default)(data);
156
+ }
157
+
158
+ /**
159
+ * Set a new connection id.
160
+ *
161
+ * @returns {void}
162
+ */
163
+ }, {
164
+ key: "resetConnection",
165
+ value: function resetConnection() {
166
+ this.connectionId = _uuid.default.v4();
167
+ this.shouldSendMetricsOnNextStatsReport = true;
168
+ }
169
+
170
+ /**
171
+ * Send metrics to the metrics service.
172
+ *
173
+ * @returns {void}
174
+ */
175
+ }, {
176
+ key: "sendMetrics",
177
+ value: function sendMetrics() {
178
+ this.webex.request({
179
+ method: 'POST',
180
+ service: 'unifiedTelemetry',
181
+ resource: 'metric/v2',
182
+ headers: {
183
+ type: 'webrtcMedia',
184
+ appId: _constants.default.APP_ID
185
+ },
186
+ body: {
187
+ metrics: [{
188
+ type: 'webrtc',
189
+ version: '1.1.0',
190
+ userId: this.webex.internal.device.userId,
191
+ meetingId: this.meetingId,
192
+ correlationId: this.correlationId,
193
+ connectionId: this.connectionId,
194
+ data: this.metricsQueue
195
+ }]
196
+ }
197
+ });
198
+ }
199
+ }]);
200
+ return RtcMetrics;
201
+ }();
202
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_uuid","_interopRequireDefault","require","CallDiagnosticUtils","_interopRequireWildcard","_constants","_getRequireWildcardCache","e","_WeakMap","r","t","__esModule","_typeof","default","has","get","n","__proto__","a","_Object$defineProperty","_Object$getOwnPropertyDescriptor","u","Object","prototype","hasOwnProperty","call","i","set","parseJsonPayload","payload","JSON","parse","_","RtcMetrics","exports","webex","meetingId","correlationId","_classCallCheck2","_defineProperty2","intervalId","window","setInterval","sendMetricsInQueue","bind","resetConnection","_createClass2","key","value","metricsQueue","length","sendMetrics","sendNextMetrics","shouldSendMetricsOnNextStatsReport","addMetrics","data","name","map","anonymizeIp","push","parsedPayload","console","error","closeMetrics","clearInterval","stats","type","ip","anonymizeIPAddress","undefined","address","relatedAddress","_stringify","connectionId","uuid","v4","request","method","service","resource","headers","appId","RTC_METRICS","APP_ID","body","metrics","version","userId","internal","device"],"sources":["index.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\nimport uuid from 'uuid';\nimport * as CallDiagnosticUtils from '../call-diagnostic/call-diagnostic-metrics.util';\nimport RTC_METRICS from './constants';\n\nconst parseJsonPayload = (payload: any[]): any | null => {\n try {\n if (payload && payload[0]) {\n return JSON.parse(payload[0]);\n }\n\n return null;\n } catch (_) {\n return null;\n }\n};\n\n/**\n * Rtc Metrics\n */\nexport default class RtcMetrics {\n /**\n * Array of MetricData items to be sent to the metrics service.\n */\n metricsQueue = [];\n\n intervalId: number;\n\n webex: any;\n\n meetingId: string;\n\n correlationId: string;\n\n connectionId: string;\n\n shouldSendMetricsOnNextStatsReport: boolean;\n\n /**\n * Initialize the interval.\n *\n * @param {object} webex - The main `webex` object.\n * @param {string} meetingId - The meeting id.\n * @param {string} correlationId - The correlation id.\n */\n constructor(webex, meetingId, correlationId) {\n // `window` is used to prevent typescript from returning a NodeJS.Timer.\n this.intervalId = window.setInterval(this.sendMetricsInQueue.bind(this), 30 * 1000);\n this.meetingId = meetingId;\n this.webex = webex;\n this.correlationId = correlationId;\n this.resetConnection();\n }\n\n /**\n * Check to see if the metrics queue has any items.\n *\n * @returns {void}\n */\n public sendMetricsInQueue() {\n if (this.metricsQueue.length) {\n this.sendMetrics();\n this.metricsQueue = [];\n }\n }\n\n /**\n * Forces sending metrics when we get the next stats-report\n *\n * This is useful for cases when something important happens that affects the media connection,\n * for example when we move from lobby into the meeting.\n *\n * @returns {void}\n */\n public sendNextMetrics() {\n this.shouldSendMetricsOnNextStatsReport = true;\n }\n\n /**\n * Add metrics items to the metrics queue.\n *\n * @param {object} data - An object with a payload array of metrics items.\n *\n * @returns {void}\n */\n addMetrics(data) {\n if (data.payload.length) {\n if (data.name === 'stats-report') {\n data.payload = data.payload.map(this.anonymizeIp);\n }\n\n this.metricsQueue.push(data);\n\n if (this.shouldSendMetricsOnNextStatsReport && data.name === 'stats-report') {\n // this is the first useful set of data (WCME gives it to us after 5s), send it out immediately\n // in case the user is unhappy and closes the browser early\n this.sendMetricsInQueue();\n this.shouldSendMetricsOnNextStatsReport = false;\n }\n\n try {\n // If a connection fails, send the rest of the metrics in queue and get a new connection id.\n const parsedPayload = parseJsonPayload(data.payload);\n if (\n data.name === 'onconnectionstatechange' &&\n parsedPayload &&\n parsedPayload.value === 'failed'\n ) {\n this.sendMetricsInQueue();\n this.resetConnection();\n }\n } catch (e) {\n console.error(e);\n }\n }\n }\n\n /**\n * Clear the metrics interval.\n *\n * @returns {void}\n */\n closeMetrics() {\n this.sendMetricsInQueue();\n clearInterval(this.intervalId);\n }\n\n /**\n * Anonymize IP addresses.\n *\n * @param {array} stats - An RTCStatsReport organized into an array of strings.\n * @returns {string}\n */\n anonymizeIp(stats: string): string {\n const data = JSON.parse(stats);\n // on local and remote candidates, anonymize the last 4 bits.\n if (data.type === 'local-candidate' || data.type === 'remote-candidate') {\n data.ip = CallDiagnosticUtils.anonymizeIPAddress(data.ip) || undefined;\n data.address = CallDiagnosticUtils.anonymizeIPAddress(data.address) || undefined;\n data.relatedAddress =\n CallDiagnosticUtils.anonymizeIPAddress(data.relatedAddress) || undefined;\n }\n\n return JSON.stringify(data);\n }\n\n /**\n * Set a new connection id.\n *\n * @returns {void}\n */\n private resetConnection() {\n this.connectionId = uuid.v4();\n this.shouldSendMetricsOnNextStatsReport = true;\n }\n\n /**\n * Send metrics to the metrics service.\n *\n * @returns {void}\n */\n private sendMetrics() {\n this.webex.request({\n method: 'POST',\n service: 'unifiedTelemetry',\n resource: 'metric/v2',\n headers: {\n type: 'webrtcMedia',\n appId: RTC_METRICS.APP_ID,\n },\n body: {\n metrics: [\n {\n type: 'webrtc',\n version: '1.1.0',\n userId: this.webex.internal.device.userId,\n meetingId: this.meetingId,\n correlationId: this.correlationId,\n connectionId: this.connectionId,\n data: this.metricsQueue,\n },\n ],\n },\n });\n }\n}\n"],"mappings":"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"}
@@ -12,6 +12,7 @@ import CallDiagnosticLatencies from './call-diagnostic/call-diagnostic-metrics-l
12
12
  import BehavioralMetrics from './behavioral-metrics';
13
13
  import OperationalMetrics from './operational-metrics';
14
14
  import BusinessMetrics from './business-metrics';
15
+ import RtcMetrics from './rtcMetrics';
15
16
  export { default, getOSNameInternal } from './metrics';
16
- export { config, CALL_DIAGNOSTIC_CONFIG, NewMetrics, Utils, CallDiagnosticUtils, CallDiagnosticLatencies, CallDiagnosticMetrics, BehavioralMetrics, OperationalMetrics, BusinessMetrics, };
17
+ export { config, CALL_DIAGNOSTIC_CONFIG, NewMetrics, Utils, CallDiagnosticUtils, CallDiagnosticLatencies, CallDiagnosticMetrics, BehavioralMetrics, OperationalMetrics, BusinessMetrics, RtcMetrics, };
17
18
  export type { ClientEvent, ClientEventLeaveReason, SubmitBehavioralEvent, SubmitClientEvent, SubmitInternalEvent, SubmitMQE, SubmitOperationalEvent, PreComputedLatencies, };
@@ -0,0 +1,4 @@
1
+ declare const RTC_METRICS: {
2
+ APP_ID: string;
3
+ };
4
+ export { RTC_METRICS as default };
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Rtc Metrics
3
+ */
4
+ export default class RtcMetrics {
5
+ /**
6
+ * Array of MetricData items to be sent to the metrics service.
7
+ */
8
+ metricsQueue: any[];
9
+ intervalId: number;
10
+ webex: any;
11
+ meetingId: string;
12
+ correlationId: string;
13
+ connectionId: string;
14
+ shouldSendMetricsOnNextStatsReport: boolean;
15
+ /**
16
+ * Initialize the interval.
17
+ *
18
+ * @param {object} webex - The main `webex` object.
19
+ * @param {string} meetingId - The meeting id.
20
+ * @param {string} correlationId - The correlation id.
21
+ */
22
+ constructor(webex: any, meetingId: any, correlationId: any);
23
+ /**
24
+ * Check to see if the metrics queue has any items.
25
+ *
26
+ * @returns {void}
27
+ */
28
+ sendMetricsInQueue(): void;
29
+ /**
30
+ * Forces sending metrics when we get the next stats-report
31
+ *
32
+ * This is useful for cases when something important happens that affects the media connection,
33
+ * for example when we move from lobby into the meeting.
34
+ *
35
+ * @returns {void}
36
+ */
37
+ sendNextMetrics(): void;
38
+ /**
39
+ * Add metrics items to the metrics queue.
40
+ *
41
+ * @param {object} data - An object with a payload array of metrics items.
42
+ *
43
+ * @returns {void}
44
+ */
45
+ addMetrics(data: any): void;
46
+ /**
47
+ * Clear the metrics interval.
48
+ *
49
+ * @returns {void}
50
+ */
51
+ closeMetrics(): void;
52
+ /**
53
+ * Anonymize IP addresses.
54
+ *
55
+ * @param {array} stats - An RTCStatsReport organized into an array of strings.
56
+ * @returns {string}
57
+ */
58
+ anonymizeIp(stats: string): string;
59
+ /**
60
+ * Set a new connection id.
61
+ *
62
+ * @returns {void}
63
+ */
64
+ private resetConnection;
65
+ /**
66
+ * Send metrics to the metrics service.
67
+ *
68
+ * @returns {void}
69
+ */
70
+ private sendMetrics;
71
+ }
package/package.json CHANGED
@@ -26,22 +26,22 @@
26
26
  "@webex/eslint-config-legacy": "0.0.0",
27
27
  "@webex/jest-config-legacy": "0.0.0",
28
28
  "@webex/legacy-tools": "0.0.0",
29
- "@webex/test-helper-chai": "3.5.0-next.4",
30
- "@webex/test-helper-mocha": "3.5.0-next.4",
31
- "@webex/test-helper-mock-webex": "3.5.0-next.4",
32
- "@webex/test-helper-test-users": "3.5.0-next.4",
29
+ "@webex/test-helper-chai": "3.5.0-next.6",
30
+ "@webex/test-helper-mocha": "3.5.0-next.6",
31
+ "@webex/test-helper-mock-webex": "3.5.0-next.6",
32
+ "@webex/test-helper-test-users": "3.5.0-next.6",
33
33
  "eslint": "^8.24.0",
34
34
  "prettier": "^2.7.1",
35
35
  "sinon": "^9.2.4"
36
36
  },
37
37
  "dependencies": {
38
- "@webex/common": "3.5.0-next.4",
39
- "@webex/common-timers": "3.5.0-next.4",
38
+ "@webex/common": "3.5.0-next.6",
39
+ "@webex/common-timers": "3.5.0-next.6",
40
40
  "@webex/event-dictionary-ts": "^1.0.1546",
41
- "@webex/internal-plugin-metrics": "3.5.0-next.4",
42
- "@webex/test-helper-chai": "3.5.0-next.4",
43
- "@webex/test-helper-mock-webex": "3.5.0-next.4",
44
- "@webex/webex-core": "3.5.0-next.4",
41
+ "@webex/internal-plugin-metrics": "3.5.0-next.6",
42
+ "@webex/test-helper-chai": "3.5.0-next.6",
43
+ "@webex/test-helper-mock-webex": "3.5.0-next.6",
44
+ "@webex/webex-core": "3.5.0-next.6",
45
45
  "ip-anonymize": "^0.1.0",
46
46
  "lodash": "^4.17.21",
47
47
  "uuid": "^3.3.2"
@@ -54,5 +54,5 @@
54
54
  "test:style": "eslint ./src/**/*.*",
55
55
  "test:unit": "webex-legacy-tools test --unit --runner mocha"
56
56
  },
57
- "version": "3.5.0-next.4"
57
+ "version": "3.5.0-next.6"
58
58
  }
@@ -631,10 +631,11 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
631
631
  });
632
632
  }
633
633
 
634
- // otherwise return unkown error
634
+ // otherwise return unkown error but passing serviceErrorCode and serviceErrorName so that we know the issue
635
635
  return this.getErrorPayloadForClientErrorCode({
636
636
  clientErrorCode: UNKNOWN_ERROR,
637
- serviceErrorCode: UNKNOWN_ERROR,
637
+ serviceErrorCode: serviceErrorCode || UNKNOWN_ERROR,
638
+ serviceErrorName: rawError?.name,
638
639
  payloadOverrides: rawError.payloadOverrides,
639
640
  rawErrorMessage,
640
641
  httpStatusCode,
package/src/index.ts CHANGED
@@ -25,6 +25,7 @@ import CallDiagnosticLatencies from './call-diagnostic/call-diagnostic-metrics-l
25
25
  import BehavioralMetrics from './behavioral-metrics';
26
26
  import OperationalMetrics from './operational-metrics';
27
27
  import BusinessMetrics from './business-metrics';
28
+ import RtcMetrics from './rtcMetrics';
28
29
 
29
30
  registerInternalPlugin('metrics', Metrics, {
30
31
  config,
@@ -47,6 +48,7 @@ export {
47
48
  BehavioralMetrics,
48
49
  OperationalMetrics,
49
50
  BusinessMetrics,
51
+ RtcMetrics,
50
52
  };
51
53
  export type {
52
54
  ClientEvent,
@@ -0,0 +1,3 @@
1
+ const RTC_METRICS = {APP_ID: 'FFB51ED5-4319-4C55-8303-B1F2FCCDE231'};
2
+
3
+ export {RTC_METRICS as default};
@@ -0,0 +1,186 @@
1
+ /* eslint-disable class-methods-use-this */
2
+ import uuid from 'uuid';
3
+ import * as CallDiagnosticUtils from '../call-diagnostic/call-diagnostic-metrics.util';
4
+ import RTC_METRICS from './constants';
5
+
6
+ const parseJsonPayload = (payload: any[]): any | null => {
7
+ try {
8
+ if (payload && payload[0]) {
9
+ return JSON.parse(payload[0]);
10
+ }
11
+
12
+ return null;
13
+ } catch (_) {
14
+ return null;
15
+ }
16
+ };
17
+
18
+ /**
19
+ * Rtc Metrics
20
+ */
21
+ export default class RtcMetrics {
22
+ /**
23
+ * Array of MetricData items to be sent to the metrics service.
24
+ */
25
+ metricsQueue = [];
26
+
27
+ intervalId: number;
28
+
29
+ webex: any;
30
+
31
+ meetingId: string;
32
+
33
+ correlationId: string;
34
+
35
+ connectionId: string;
36
+
37
+ shouldSendMetricsOnNextStatsReport: boolean;
38
+
39
+ /**
40
+ * Initialize the interval.
41
+ *
42
+ * @param {object} webex - The main `webex` object.
43
+ * @param {string} meetingId - The meeting id.
44
+ * @param {string} correlationId - The correlation id.
45
+ */
46
+ constructor(webex, meetingId, correlationId) {
47
+ // `window` is used to prevent typescript from returning a NodeJS.Timer.
48
+ this.intervalId = window.setInterval(this.sendMetricsInQueue.bind(this), 30 * 1000);
49
+ this.meetingId = meetingId;
50
+ this.webex = webex;
51
+ this.correlationId = correlationId;
52
+ this.resetConnection();
53
+ }
54
+
55
+ /**
56
+ * Check to see if the metrics queue has any items.
57
+ *
58
+ * @returns {void}
59
+ */
60
+ public sendMetricsInQueue() {
61
+ if (this.metricsQueue.length) {
62
+ this.sendMetrics();
63
+ this.metricsQueue = [];
64
+ }
65
+ }
66
+
67
+ /**
68
+ * Forces sending metrics when we get the next stats-report
69
+ *
70
+ * This is useful for cases when something important happens that affects the media connection,
71
+ * for example when we move from lobby into the meeting.
72
+ *
73
+ * @returns {void}
74
+ */
75
+ public sendNextMetrics() {
76
+ this.shouldSendMetricsOnNextStatsReport = true;
77
+ }
78
+
79
+ /**
80
+ * Add metrics items to the metrics queue.
81
+ *
82
+ * @param {object} data - An object with a payload array of metrics items.
83
+ *
84
+ * @returns {void}
85
+ */
86
+ addMetrics(data) {
87
+ if (data.payload.length) {
88
+ if (data.name === 'stats-report') {
89
+ data.payload = data.payload.map(this.anonymizeIp);
90
+ }
91
+
92
+ this.metricsQueue.push(data);
93
+
94
+ if (this.shouldSendMetricsOnNextStatsReport && data.name === 'stats-report') {
95
+ // this is the first useful set of data (WCME gives it to us after 5s), send it out immediately
96
+ // in case the user is unhappy and closes the browser early
97
+ this.sendMetricsInQueue();
98
+ this.shouldSendMetricsOnNextStatsReport = false;
99
+ }
100
+
101
+ try {
102
+ // If a connection fails, send the rest of the metrics in queue and get a new connection id.
103
+ const parsedPayload = parseJsonPayload(data.payload);
104
+ if (
105
+ data.name === 'onconnectionstatechange' &&
106
+ parsedPayload &&
107
+ parsedPayload.value === 'failed'
108
+ ) {
109
+ this.sendMetricsInQueue();
110
+ this.resetConnection();
111
+ }
112
+ } catch (e) {
113
+ console.error(e);
114
+ }
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Clear the metrics interval.
120
+ *
121
+ * @returns {void}
122
+ */
123
+ closeMetrics() {
124
+ this.sendMetricsInQueue();
125
+ clearInterval(this.intervalId);
126
+ }
127
+
128
+ /**
129
+ * Anonymize IP addresses.
130
+ *
131
+ * @param {array} stats - An RTCStatsReport organized into an array of strings.
132
+ * @returns {string}
133
+ */
134
+ anonymizeIp(stats: string): string {
135
+ const data = JSON.parse(stats);
136
+ // on local and remote candidates, anonymize the last 4 bits.
137
+ if (data.type === 'local-candidate' || data.type === 'remote-candidate') {
138
+ data.ip = CallDiagnosticUtils.anonymizeIPAddress(data.ip) || undefined;
139
+ data.address = CallDiagnosticUtils.anonymizeIPAddress(data.address) || undefined;
140
+ data.relatedAddress =
141
+ CallDiagnosticUtils.anonymizeIPAddress(data.relatedAddress) || undefined;
142
+ }
143
+
144
+ return JSON.stringify(data);
145
+ }
146
+
147
+ /**
148
+ * Set a new connection id.
149
+ *
150
+ * @returns {void}
151
+ */
152
+ private resetConnection() {
153
+ this.connectionId = uuid.v4();
154
+ this.shouldSendMetricsOnNextStatsReport = true;
155
+ }
156
+
157
+ /**
158
+ * Send metrics to the metrics service.
159
+ *
160
+ * @returns {void}
161
+ */
162
+ private sendMetrics() {
163
+ this.webex.request({
164
+ method: 'POST',
165
+ service: 'unifiedTelemetry',
166
+ resource: 'metric/v2',
167
+ headers: {
168
+ type: 'webrtcMedia',
169
+ appId: RTC_METRICS.APP_ID,
170
+ },
171
+ body: {
172
+ metrics: [
173
+ {
174
+ type: 'webrtc',
175
+ version: '1.1.0',
176
+ userId: this.webex.internal.device.userId,
177
+ meetingId: this.meetingId,
178
+ correlationId: this.correlationId,
179
+ connectionId: this.connectionId,
180
+ data: this.metricsQueue,
181
+ },
182
+ ],
183
+ },
184
+ });
185
+ }
186
+ }
@@ -1,7 +1,9 @@
1
1
  import sinon from 'sinon';
2
+ import bowser from 'bowser';
2
3
  import {assert} from '@webex/test-helper-chai';
3
4
  import {WebexHttpError} from '@webex/webex-core';
4
5
  import {BrowserDetection} from '@webex/common';
6
+ import window from 'global/window';
5
7
  import {
6
8
  CallDiagnosticLatencies,
7
9
  CallDiagnosticMetrics,
@@ -1012,6 +1014,9 @@ describe('internal-plugin-metrics', () => {
1012
1014
  const getIdentifiersSpy = sinon.spy(cd, 'getIdentifiers');
1013
1015
  const getSubServiceTypeSpy = sinon.spy(cd, 'getSubServiceType');
1014
1016
  const validatorSpy = sinon.spy(cd, 'validator');
1017
+ sinon.stub(window.navigator, 'userAgent').get(() => userAgent);
1018
+ sinon.stub(bowser, 'getParser').returns(userAgent);
1019
+
1015
1020
  const options = {
1016
1021
  meetingId: fakeMeeting.id,
1017
1022
  mediaConnections: [{mediaAgentAlias: 'alias', mediaAgentGroupId: '1'}],
@@ -1040,7 +1045,7 @@ describe('internal-plugin-metrics', () => {
1040
1045
  assert.deepEqual(webexLoggerLogCalls[2].args, [
1041
1046
  'call-diagnostic-events -> ',
1042
1047
  'CallDiagnosticMetrics: @createClientEventObjectInMeeting => collected browser data',
1043
- '{"error":"unable to access window.navigator.userAgent"}',
1048
+ `${JSON.stringify(userAgent)}`,
1044
1049
  ]);
1045
1050
 
1046
1051
  assert.deepEqual(webexLoggerLogCalls[3].args, [
@@ -1447,6 +1452,9 @@ describe('internal-plugin-metrics', () => {
1447
1452
  name: 'other',
1448
1453
  category: 'other',
1449
1454
  errorCode: 9999,
1455
+ errorData: {
1456
+ errorName: 'Error'
1457
+ },
1450
1458
  serviceErrorCode: 9999,
1451
1459
  errorDescription: 'UnknownError',
1452
1460
  rawErrorMessage: 'bad times',
@@ -1480,7 +1488,7 @@ describe('internal-plugin-metrics', () => {
1480
1488
  assert.deepEqual(webexLoggerLogCalls[2].args, [
1481
1489
  'call-diagnostic-events -> ',
1482
1490
  'CallDiagnosticMetrics: @prepareClientEvent. Generated errors:',
1483
- `generatedError: {"fatal":true,"shownToUser":false,"name":"other","category":"other","errorCode":9999,"serviceErrorCode":9999,"rawErrorMessage":"bad times","errorDescription":"UnknownError"}`,
1491
+ `generatedError: {"fatal":true,"shownToUser":false,"name":"other","category":"other","errorCode":9999,"errorData":{"errorName":"Error"},"serviceErrorCode":9999,"rawErrorMessage":"bad times","errorDescription":"UnknownError"}`,
1484
1492
  ]);
1485
1493
  });
1486
1494
 
@@ -1518,6 +1526,9 @@ describe('internal-plugin-metrics', () => {
1518
1526
  name: 'other',
1519
1527
  category: 'other',
1520
1528
  errorCode: 9999,
1529
+ errorData: {
1530
+ errorName: 'Error'
1531
+ },
1521
1532
  serviceErrorCode: 9999,
1522
1533
  errorDescription: 'UnknownError',
1523
1534
  rawErrorMessage: 'bad times',
@@ -1549,7 +1560,7 @@ describe('internal-plugin-metrics', () => {
1549
1560
  assert.deepEqual(webexLoggerLogCalls[2].args, [
1550
1561
  'call-diagnostic-events -> ',
1551
1562
  'CallDiagnosticMetrics: @prepareClientEvent. Generated errors:',
1552
- `generatedError: {"fatal":true,"shownToUser":false,"name":"other","category":"other","errorCode":9999,"serviceErrorCode":9999,"rawErrorMessage":"bad times","errorDescription":"UnknownError"}`,
1563
+ `generatedError: {"fatal":true,"shownToUser":false,"name":"other","category":"other","errorCode":9999,"errorData":{"errorName":"Error"},"serviceErrorCode":9999,"rawErrorMessage":"bad times","errorDescription":"UnknownError"}`,
1553
1564
  ]);
1554
1565
  });
1555
1566
 
@@ -2229,6 +2240,9 @@ describe('internal-plugin-metrics', () => {
2229
2240
  shownToUser: true,
2230
2241
  serviceErrorCode: 9999,
2231
2242
  errorCode: 9999,
2243
+ errorData: {
2244
+ errorName: 'Error'
2245
+ },
2232
2246
  rawErrorMessage: 'bad times',
2233
2247
  });
2234
2248
  });
@@ -2768,11 +2782,11 @@ describe('internal-plugin-metrics', () => {
2768
2782
  // The method is called in beforeEach itself. We are just testing it here
2769
2783
  it('sets the received deviceInfo to call-diagnostics', () => {
2770
2784
  const webexLoggerLogCalls = webex.logger.log.getCalls();
2771
- const device = { userId: 'userId', url: 'deviceUrl', orgId: 'orgId' };
2785
+ const device = {userId: 'userId', url: 'deviceUrl', orgId: 'orgId'};
2772
2786
 
2773
2787
  assert.deepEqual(webexLoggerLogCalls[0].args, [
2774
2788
  'CallDiagnosticMetrics: @setDeviceInfo called',
2775
- device
2789
+ device,
2776
2790
  ]);
2777
2791
 
2778
2792
  assert.deepEqual(cd.device, device);
@@ -0,0 +1,155 @@
1
+ import 'jsdom-global/register';
2
+ import RtcMetrics from '../../../../src/rtcMetrics';
3
+ import MockWebex from '@webex/test-helper-mock-webex';
4
+ import {assert} from '@webex/test-helper-chai';
5
+ import sinon from 'sinon';
6
+ import RTC_METRICS from '../../../../src/rtcMetrics/constants';
7
+
8
+ const FAKE_METRICS_ITEM = {payload: ['{"type":"string","value":"fake-metrics","id":""}']};
9
+ const FAILURE_METRICS_ITEM = {
10
+ name: "onconnectionstatechange",
11
+ payload: ['{"type":"string","value":"failed","id":""}'],
12
+ timestamp: 1707929986667
13
+ };
14
+
15
+ const STATS_WITH_IP = '{"id":"RTCIceCandidate_/kQs0ZNU","type":"remote-candidate","transportId":"RTCTransport_0_1","isRemote":true,"ip":"11.22.111.255","address":"11.22.111.255","port":5004,"protocol":"udp","candidateType":"host","priority":2130706431}';
16
+ const STATS_WITH_IP_RESULT = '{"id":"RTCIceCandidate_/kQs0ZNU","type":"remote-candidate","transportId":"RTCTransport_0_1","isRemote":true,"ip":"11.22.111.240","address":"11.22.111.240","port":5004,"protocol":"udp","candidateType":"host","priority":2130706431}';
17
+
18
+ describe('RtcMetrics', () => {
19
+ let metrics: RtcMetrics;
20
+ let webex: MockWebex;
21
+ let clock;
22
+ let anonymizeIpSpy;
23
+
24
+ const sandbox = sinon.createSandbox();
25
+
26
+ beforeEach(() => {
27
+ clock = sinon.useFakeTimers();
28
+ window.setInterval = setInterval;
29
+ webex = new MockWebex();
30
+ metrics = new RtcMetrics(webex, 'mock-meeting-id', 'mock-correlation-id');
31
+ anonymizeIpSpy = sandbox.spy(metrics, 'anonymizeIp');
32
+ });
33
+
34
+ afterEach(() => {
35
+ sandbox.restore();
36
+ });
37
+
38
+ it('sendMetrics should send a webex request', () => {
39
+ assert.notCalled(webex.request);
40
+
41
+ metrics.addMetrics(FAKE_METRICS_ITEM);
42
+ (metrics as any).sendMetrics();
43
+
44
+ assert.callCount(webex.request, 1);
45
+ assert.calledWithMatch(webex.request, sinon.match.has('headers', {
46
+ type: 'webrtcMedia',
47
+ appId: RTC_METRICS.APP_ID,
48
+ }));
49
+ assert.calledWithMatch(webex.request, sinon.match.hasNested('body.metrics[0].data[0].payload', FAKE_METRICS_ITEM.payload));
50
+ assert.calledWithMatch(webex.request, sinon.match.hasNested('body.metrics[0].meetingId', 'mock-meeting-id'));
51
+ assert.calledWithMatch(webex.request, sinon.match.hasNested('body.metrics[0].correlationId', 'mock-correlation-id'));
52
+ });
53
+
54
+ it('should have a defined sendMetricsInQueue function which is public', () => {
55
+ assert.isDefined(metrics.sendMetricsInQueue);
56
+ assert.isFunction(metrics.sendMetricsInQueue);
57
+ });
58
+
59
+ it('should send metrics requests over time', () => {
60
+ assert.notCalled(webex.request);
61
+
62
+ metrics.addMetrics(FAKE_METRICS_ITEM);
63
+ assert.deepEqual(metrics.metricsQueue, [FAKE_METRICS_ITEM]);
64
+ clock.tick(60 * 1000);
65
+
66
+ assert.callCount(webex.request, 1);
67
+ });
68
+
69
+ it('should not send requests with no items in the queue', () => {
70
+ clock.tick(60 * 1000);
71
+ assert.notCalled(webex.request);
72
+ });
73
+
74
+ it('sendMetricsInQueue should send metrics if any exist in the queue', () => {
75
+ assert.notCalled(webex.request);
76
+
77
+ metrics.addMetrics(FAKE_METRICS_ITEM);
78
+ (metrics as any).sendMetricsInQueue();
79
+
80
+ assert.callCount(webex.request, 1);
81
+ });
82
+
83
+ it('should clear out metrics on close', () => {
84
+ assert.notCalled(webex.request);
85
+
86
+ metrics.addMetrics(FAKE_METRICS_ITEM);
87
+ metrics.closeMetrics();
88
+
89
+ assert.callCount(webex.request, 1);
90
+ });
91
+
92
+ it('should clear out metrics on failure', () => {
93
+ assert.notCalled(webex.request);
94
+
95
+ metrics.addMetrics(FAILURE_METRICS_ITEM);
96
+
97
+ assert.callCount(webex.request, 1);
98
+ });
99
+
100
+ it('should have the same connectionId on success', () => {
101
+ const originalId = metrics.connectionId;
102
+
103
+ metrics.addMetrics(FAKE_METRICS_ITEM);
104
+
105
+ assert.strictEqual(originalId, metrics.connectionId);
106
+ });
107
+
108
+ it('should have a new connectionId on failure', () => {
109
+ const originalId = metrics.connectionId;
110
+
111
+ metrics.addMetrics(FAILURE_METRICS_ITEM);
112
+
113
+ assert.notEqual(originalId, metrics.connectionId);
114
+ });
115
+
116
+ it('should anonymize IP addresses', () => {
117
+ assert.strictEqual(metrics.anonymizeIp(STATS_WITH_IP), STATS_WITH_IP_RESULT);
118
+ });
119
+
120
+ it('should call anonymizeIp', () => {
121
+ metrics.addMetrics({ name: 'stats-report', payload: [STATS_WITH_IP] });
122
+ assert.calledOnce(anonymizeIpSpy);
123
+ })
124
+
125
+ it('should send metrics on first stats-report', () => {
126
+ assert.callCount(webex.request, 0);
127
+
128
+ metrics.addMetrics(FAKE_METRICS_ITEM);
129
+ assert.callCount(webex.request, 0);
130
+
131
+ // first stats-report should trigger a call to webex.request
132
+ metrics.addMetrics({ name: 'stats-report', payload: [STATS_WITH_IP] });
133
+ assert.callCount(webex.request, 1);
134
+ });
135
+
136
+ it('should send metrics on first stats-report after a new connection', () => {
137
+ assert.callCount(webex.request, 0);
138
+
139
+ // first stats-report should trigger a call to webex.request
140
+ metrics.addMetrics({ name: 'stats-report', payload: [STATS_WITH_IP] });
141
+ assert.callCount(webex.request, 1);
142
+
143
+ // subsequent stats-report doesn't trigger it
144
+ metrics.addMetrics({ name: 'stats-report', payload: [STATS_WITH_IP] });
145
+ assert.callCount(webex.request, 1);
146
+
147
+ // now, simulate a failure - that triggers a new connection and upload of the metrics
148
+ metrics.addMetrics(FAILURE_METRICS_ITEM);
149
+ assert.callCount(webex.request, 2);
150
+
151
+ // and another stats-report should trigger another upload of the metrics
152
+ metrics.addMetrics({ name: 'stats-report', payload: [STATS_WITH_IP] });
153
+ assert.callCount(webex.request, 3);
154
+ });
155
+ });