@webex/internal-plugin-metrics 3.4.0-next.4 → 3.4.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.
- package/dist/business-metrics.js +2 -2
- package/dist/business-metrics.js.map +1 -1
- package/dist/call-diagnostic/call-diagnostic-metrics.js +12 -4
- package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -1
- package/dist/metrics.js +1 -1
- package/dist/metrics.types.js.map +1 -1
- package/dist/new-metrics.js +48 -18
- package/dist/new-metrics.js.map +1 -1
- package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +19 -3
- package/dist/types/metrics.types.d.ts +1 -0
- package/dist/types/new-metrics.d.ts +12 -0
- package/package.json +12 -12
- package/src/business-metrics.ts +2 -2
- package/src/call-diagnostic/call-diagnostic-metrics.ts +17 -2
- package/src/metrics.types.ts +1 -0
- package/src/new-metrics.ts +39 -12
- package/test/unit/spec/business/business-metrics.ts +3 -3
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +13 -1
- package/test/unit/spec/new-metrics.ts +14 -0
package/dist/business-metrics.js
CHANGED
|
@@ -43,8 +43,8 @@ var BusinessMetrics = exports.default = /*#__PURE__*/function (_GenericMetrics)
|
|
|
43
43
|
var event = {
|
|
44
44
|
type: ['business'],
|
|
45
45
|
eventPayload: {
|
|
46
|
-
|
|
47
|
-
|
|
46
|
+
key: name,
|
|
47
|
+
client_timestamp: (0, _now.default)(),
|
|
48
48
|
context: this.getContext(),
|
|
49
49
|
browserDetails: this.getBrowserDetails(),
|
|
50
50
|
value: payload
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_genericMetrics","_interopRequireDefault","require","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","BusinessMetrics","exports","_GenericMetrics","_inherits2","_super","_classCallCheck2","_createClass2","key","value","submitBusinessEvent","_ref","name","payload","event","type","eventPayload","
|
|
1
|
+
{"version":3,"names":["_genericMetrics","_interopRequireDefault","require","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","BusinessMetrics","exports","_GenericMetrics","_inherits2","_super","_classCallCheck2","_createClass2","key","value","submitBusinessEvent","_ref","name","payload","event","type","eventPayload","client_timestamp","_now","context","getContext","browserDetails","getBrowserDetails","submitEvent","kind","GenericMetrics"],"sources":["business-metrics.ts"],"sourcesContent":["import GenericMetrics from './generic-metrics';\nimport {EventPayload} from './metrics.types';\n\n/**\n * @description Util class to handle Buisness Metrics\n * @export\n * @class BusinessMetrics\n */\nexport default class BusinessMetrics extends GenericMetrics {\n /**\n * Submit a buisness metric to our metrics endpoint.\n * @param {string} name of the metric\n * @param {EventPayload} user payload of the metric\n * @returns {Promise<any>}\n */\n public submitBusinessEvent({name, payload}: {name: string; payload: EventPayload}) {\n const event = {\n type: ['business'],\n eventPayload: {\n key: name,\n client_timestamp: Date.now(),\n context: this.getContext(),\n browserDetails: this.getBrowserDetails(),\n value: payload,\n },\n };\n\n this.submitEvent({kind: 'buisness-events -> ', name, event});\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAAA,IAAAA,eAAA,GAAAC,sBAAA,CAAAC,OAAA;AAA+C,SAAAC,aAAAC,OAAA,QAAAC,yBAAA,GAAAC,yBAAA,oBAAAC,qBAAA,QAAAC,KAAA,OAAAC,gBAAA,CAAAC,OAAA,EAAAN,OAAA,GAAAO,MAAA,MAAAN,yBAAA,QAAAO,SAAA,OAAAH,gBAAA,CAAAC,OAAA,QAAAG,WAAA,EAAAF,MAAA,GAAAG,kBAAA,CAAAN,KAAA,EAAAO,SAAA,EAAAH,SAAA,YAAAD,MAAA,GAAAH,KAAA,CAAAQ,KAAA,OAAAD,SAAA,gBAAAE,2BAAA,CAAAP,OAAA,QAAAC,MAAA;AAAA,SAAAL,0BAAA,eAAAY,OAAA,qBAAAJ,kBAAA,oBAAAA,kBAAA,CAAAK,IAAA,2BAAAC,KAAA,oCAAAC,OAAA,CAAAC,SAAA,CAAAC,OAAA,CAAAC,IAAA,CAAAV,kBAAA,CAAAO,OAAA,8CAAAI,CAAA;AAG/C;AACA;AACA;AACA;AACA;AAJA,IAKqBC,eAAe,GAAAC,OAAA,CAAAjB,OAAA,0BAAAkB,eAAA;EAAA,IAAAC,UAAA,CAAAnB,OAAA,EAAAgB,eAAA,EAAAE,eAAA;EAAA,IAAAE,MAAA,GAAA3B,YAAA,CAAAuB,eAAA;EAAA,SAAAA,gBAAA;IAAA,IAAAK,gBAAA,CAAArB,OAAA,QAAAgB,eAAA;IAAA,OAAAI,MAAA,CAAAd,KAAA,OAAAD,SAAA;EAAA;EAAA,IAAAiB,aAAA,CAAAtB,OAAA,EAAAgB,eAAA;IAAAO,GAAA;IAAAC,KAAA;IAClC;AACF;AACA;AACA;AACA;AACA;IACE,SAAAC,oBAAAC,IAAA,EAAmF;MAAA,IAAvDC,IAAI,GAAAD,IAAA,CAAJC,IAAI;QAAEC,OAAO,GAAAF,IAAA,CAAPE,OAAO;MACvC,IAAMC,KAAK,GAAG;QACZC,IAAI,EAAE,CAAC,UAAU,CAAC;QAClBC,YAAY,EAAE;UACZR,GAAG,EAAEI,IAAI;UACTK,gBAAgB,EAAE,IAAAC,IAAA,CAAAjC,OAAA,EAAS,CAAC;UAC5BkC,OAAO,EAAE,IAAI,CAACC,UAAU,CAAC,CAAC;UAC1BC,cAAc,EAAE,IAAI,CAACC,iBAAiB,CAAC,CAAC;UACxCb,KAAK,EAAEI;QACT;MACF,CAAC;MAED,IAAI,CAACU,WAAW,CAAC;QAACC,IAAI,EAAE,qBAAqB;QAAEZ,IAAI,EAAJA,IAAI;QAAEE,KAAK,EAALA;MAAK,CAAC,CAAC;IAC9D;EAAC;EAAA,OAAAb,eAAA;AAAA,EApB0CwB,uBAAc"}
|
|
@@ -256,13 +256,17 @@ var CallDiagnosticMetrics = exports.default = /*#__PURE__*/function (_StatelessW
|
|
|
256
256
|
correlationId = options.correlationId,
|
|
257
257
|
webexConferenceIdStr = options.webexConferenceIdStr,
|
|
258
258
|
globalMeetingId = options.globalMeetingId,
|
|
259
|
-
preLoginId = options.preLoginId
|
|
259
|
+
preLoginId = options.preLoginId,
|
|
260
|
+
sessionCorrelationId = options.sessionCorrelationId;
|
|
260
261
|
var identifiers = {
|
|
261
262
|
correlationId: 'unknown'
|
|
262
263
|
};
|
|
263
264
|
if (meeting) {
|
|
264
265
|
identifiers.correlationId = meeting.correlationId;
|
|
265
266
|
}
|
|
267
|
+
if (sessionCorrelationId) {
|
|
268
|
+
identifiers.sessionCorrelationId = sessionCorrelationId;
|
|
269
|
+
}
|
|
266
270
|
if (correlationId) {
|
|
267
271
|
identifiers.correlationId = correlationId;
|
|
268
272
|
}
|
|
@@ -596,7 +600,8 @@ var CallDiagnosticMetrics = exports.default = /*#__PURE__*/function (_StatelessW
|
|
|
596
600
|
var meetingId = options.meetingId,
|
|
597
601
|
mediaConnections = options.mediaConnections,
|
|
598
602
|
globalMeetingId = options.globalMeetingId,
|
|
599
|
-
webexConferenceIdStr = options.webexConferenceIdStr
|
|
603
|
+
webexConferenceIdStr = options.webexConferenceIdStr,
|
|
604
|
+
sessionCorrelationId = options.sessionCorrelationId;
|
|
600
605
|
|
|
601
606
|
// @ts-ignore
|
|
602
607
|
var meeting = this.webex.meetings.meetingCollection.get(meetingId);
|
|
@@ -617,7 +622,8 @@ var CallDiagnosticMetrics = exports.default = /*#__PURE__*/function (_StatelessW
|
|
|
617
622
|
meeting: meeting,
|
|
618
623
|
mediaConnections: (meeting === null || meeting === void 0 ? void 0 : meeting.mediaConnections) || mediaConnections,
|
|
619
624
|
webexConferenceIdStr: webexConferenceIdStr,
|
|
620
|
-
globalMeetingId: globalMeetingId
|
|
625
|
+
globalMeetingId: globalMeetingId,
|
|
626
|
+
sessionCorrelationId: sessionCorrelationId
|
|
621
627
|
});
|
|
622
628
|
|
|
623
629
|
// create client event object
|
|
@@ -655,11 +661,13 @@ var CallDiagnosticMetrics = exports.default = /*#__PURE__*/function (_StatelessW
|
|
|
655
661
|
var correlationId = options.correlationId,
|
|
656
662
|
globalMeetingId = options.globalMeetingId,
|
|
657
663
|
webexConferenceIdStr = options.webexConferenceIdStr,
|
|
658
|
-
preLoginId = options.preLoginId
|
|
664
|
+
preLoginId = options.preLoginId,
|
|
665
|
+
sessionCorrelationId = options.sessionCorrelationId;
|
|
659
666
|
|
|
660
667
|
// grab identifiers
|
|
661
668
|
var identifiers = this.getIdentifiers({
|
|
662
669
|
correlationId: correlationId,
|
|
670
|
+
sessionCorrelationId: sessionCorrelationId,
|
|
663
671
|
preLoginId: preLoginId,
|
|
664
672
|
globalMeetingId: globalMeetingId,
|
|
665
673
|
webexConferenceIdStr: webexConferenceIdStr
|
|
@@ -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","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 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 } = options;\n const identifiers: Event['event']['identifiers'] = {\n correlationId: 'unknown',\n };\n\n if (meeting) {\n identifiers.correlationId = meeting.correlationId;\n }\n\n if (correlationId) {\n identifiers.correlationId = correlationId;\n }\n\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 {meetingId, mediaConnections, globalMeetingId, webexConferenceIdStr} = options;\n\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.get(meetingId);\n\n if (!meeting) {\n console.warn(\n 'Attempt to send client event but no meeting was found...',\n `name: ${name}, meetingId: ${meetingId}`\n );\n // @ts-ignore\n this.webex.internal.metrics.submitClientMetrics(CALL_DIAGNOSTIC_EVENT_FAILED_TO_SEND, {\n fields: {\n meetingId,\n name,\n },\n });\n\n return undefined;\n }\n\n // grab identifiers\n const identifiers = this.getIdentifiers({\n meeting,\n mediaConnections: meeting?.mediaConnections || mediaConnections,\n webexConferenceIdStr,\n globalMeetingId,\n });\n\n // create client event object\n const clientEventObject: ClientEvent['payload'] = {\n name,\n canProceed: true,\n identifiers,\n errors,\n eventData: {\n webClientDomain: window.location.hostname,\n },\n userType: meeting.getCurUserType(),\n loginType:\n 'loginType' in meeting.callStateForMetrics\n ? meeting.callStateForMetrics.loginType\n : this.getCurLoginType(),\n isConvergedArchitectureEnabled: this.getIsConvergedArchitectureEnabled({\n meetingId,\n }),\n webexSubServiceType: this.getSubServiceType(meeting),\n };\n\n return clientEventObject;\n }\n\n /**\n * Create client event object for pre meeting events\n * @param arg - create args\n * @param arg.event - event key\n * @param arg.options - payload\n * @returns object\n */\n private createClientEventObjectPreMeeting({\n name,\n options,\n errors,\n }: {\n name: ClientEvent['name'];\n options?: SubmitClientEventOptions;\n errors?: ClientEventPayloadError;\n }) {\n const {correlationId, globalMeetingId, webexConferenceIdStr, preLoginId} = options;\n\n // grab identifiers\n const identifiers = this.getIdentifiers({\n correlationId,\n preLoginId,\n globalMeetingId,\n webexConferenceIdStr,\n });\n\n // create client event object\n const clientEventObject: ClientEvent['payload'] = {\n name,\n errors,\n canProceed: true,\n identifiers,\n eventData: {\n webClientDomain: window.location.hostname,\n },\n loginType: this.getCurLoginType(),\n };\n\n return clientEventObject;\n }\n\n /**\n * Prepare Client Event CA event.\n * @param arg - submit params\n * @param arg.event - event key\n * @param arg.payload - additional payload to be merged with default payload\n * @param arg.options - payload\n * @returns {any} options to be with fetch\n * @throws\n */\n private prepareClientEvent({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: ClientEventPayload;\n options?: SubmitClientEventOptions;\n }) {\n const {meetingId, correlationId, rawError} = options;\n let clientEventObject: ClientEvent['payload'];\n\n // check if we need to generate errors\n const errors: ClientEventPayloadError = [];\n\n if (rawError) {\n const generatedError = this.generateClientEventErrorPayload(rawError);\n if (generatedError) {\n errors.push(generatedError);\n }\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n 'CallDiagnosticMetrics: @prepareClientEvent. Generated errors:',\n `generatedError: ${JSON.stringify(generatedError)}`\n );\n }\n\n // events that will most likely happen in join phase\n if (meetingId) {\n clientEventObject = this.createClientEventObjectInMeeting({name, options, errors});\n } else if (correlationId) {\n // any pre join events or events that are outside the meeting.\n clientEventObject = this.createClientEventObjectPreMeeting({name, options, errors});\n } else {\n throw new Error('Not implemented');\n }\n\n // merge any new properties, or override existing ones\n clientEventObject = merge(clientEventObject, payload);\n\n // append client event data to the call diagnostic event\n const diagnosticEvent = this.prepareDiagnosticEvent(clientEventObject, options);\n\n return diagnosticEvent;\n }\n\n /**\n * Submit Client Event CA event.\n * @param arg - submit params\n * @param arg.event - event key\n * @param arg.payload - additional payload to be merged with default payload\n * @param arg.options - payload\n * @throws\n */\n public submitClientEvent({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: ClientEventPayload;\n options?: SubmitClientEventOptions;\n }) {\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n 'CallDiagnosticMetrics: @submitClientEvent. Submit Client Event CA event.',\n `name: ${name}`\n );\n const diagnosticEvent = this.prepareClientEvent({name, payload, options});\n\n if (options?.preLoginId) {\n return this.submitToCallDiagnosticsPreLogin(diagnosticEvent, options?.preLoginId);\n }\n\n this.validator({type: 'ce', event: diagnosticEvent});\n\n return this.submitToCallDiagnostics(diagnosticEvent);\n }\n\n /**\n * Prepare the event and send the request to metrics-a service.\n * @param event\n * @returns promise\n */\n submitToCallDiagnostics(event: Event): Promise<any> {\n // build metrics-a event type\n const finalEvent = {\n eventPayload: event,\n type: ['diagnostic-event'],\n };\n\n return this.callDiagnosticEventsBatcher.request(finalEvent);\n }\n\n /**\n * Prepare the event and send the request to metrics-a service, pre login.\n * @param event\n * @param preLoginId\n * @returns\n */\n submitToCallDiagnosticsPreLogin = (event: Event, preLoginId?: string): Promise<any> => {\n // build metrics-a event type\n const finalEvent = {\n eventPayload: event,\n type: ['diagnostic-event'],\n };\n this.preLoginMetricsBatcher.savePreLoginId(preLoginId);\n\n return this.preLoginMetricsBatcher.request(finalEvent);\n };\n\n /**\n * Builds a request options object to later be passed to fetch().\n * @param arg - submit params\n * @param arg.event - event key\n * @param arg.payload - additional payload to be merged with default payload\n * @param arg.options - client event options\n * @returns {Promise<any>}\n * @throws\n */\n public async buildClientEventFetchRequestOptions({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: ClientEventPayload;\n options?: SubmitClientEventOptions;\n }): Promise<any> {\n this.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n 'CallDiagnosticMetrics: @buildClientEventFetchRequestOptions. Building request options object for fetch()...',\n `name: ${name}`\n );\n\n const clientEvent = this.prepareClientEvent({name, payload, options});\n\n // build metrics-a event type\n // @ts-ignore\n const diagnosticEvent = prepareDiagnosticMetricItem(this.webex, {\n eventPayload: clientEvent,\n type: ['diagnostic-event'],\n });\n\n const request = {\n method: 'POST',\n service: 'metrics',\n resource: 'clientmetrics',\n body: {\n metrics: [diagnosticEvent],\n },\n headers: {},\n // @ts-ignore\n waitForServiceTimeout: this.webex.internal.metrics.config.waitForServiceTimeout,\n };\n\n if (options.preLoginId) {\n request.headers = {\n authorization: false,\n 'x-prelogin-userid': options.preLoginId,\n };\n request.resource = 'clientmetrics-prelogin';\n }\n\n // @ts-ignore\n return this.webex.prepareFetchOptions(request);\n }\n\n /**\n * Returns true if the specified serviceErrorCode maps to an expected error.\n * @param {number} serviceErrorCode the service error code\n * @returns {boolean}\n */\n public isServiceErrorExpected(serviceErrorCode: number): boolean {\n const clientErrorCode = SERVICE_ERROR_CODES_TO_CLIENT_ERROR_CODES_MAP[serviceErrorCode];\n const clientErrorPayload = CLIENT_ERROR_CODE_TO_ERROR_PAYLOAD[clientErrorCode];\n\n return clientErrorPayload?.category === 'expected';\n }\n\n /**\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":";;;;;;;;;;;;;;;;;;;;;;;;;AAGA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,OAAA,GAAAH,OAAA;AACA,IAAAI,UAAA,GAAAJ,OAAA;AACA,IAAAK,QAAA,GAAAL,OAAA;AAEA,IAAAM,sBAAA,GAAAN,OAAA;AAaA,IAAAO,OAAA,GAAAP,OAAA;AAqBA,IAAAQ,6BAAA,GAAAN,sBAAA,CAAAF,OAAA;AACA,IAAAS,uBAAA,GAAAP,sBAAA,CAAAF,OAAA;AAEA,IAAAU,QAAA,GAAAV,OAAA;AAakB,SAAAW,QAAAC,CAAA,EAAAC,CAAA,QAAAC,CAAA,GAAAC,YAAA,CAAAH,CAAA,OAAAI,6BAAA,QAAAC,CAAA,GAAAD,6BAAA,CAAAJ,CAAA,GAAAC,CAAA,KAAAI,CAAA,GAAAA,CAAA,CAAAC,MAAA,WAAAL,CAAA,WAAAM,gCAAA,CAAAP,CAAA,EAAAC,CAAA,EAAAO,UAAA,OAAAN,CAAA,CAAAO,IAAA,CAAAC,KAAA,CAAAR,CAAA,EAAAG,CAAA,YAAAH,CAAA;AAAA,SAAAS,cAAAX,CAAA,aAAAC,CAAA,MAAAA,CAAA,GAAAW,SAAA,CAAAC,MAAA,EAAAZ,CAAA,UAAAC,CAAA,WAAAU,SAAA,CAAAX,CAAA,IAAAW,SAAA,CAAAX,CAAA,QAAAA,CAAA,OAAAF,OAAA,CAAAe,MAAA,CAAAZ,CAAA,OAAAa,OAAA,WAAAd,CAAA,QAAAe,gBAAA,CAAAC,OAAA,EAAAjB,CAAA,EAAAC,CAAA,EAAAC,CAAA,CAAAD,CAAA,SAAAiB,iCAAA,GAAAC,wBAAA,CAAAnB,CAAA,EAAAkB,iCAAA,CAAAhB,CAAA,KAAAH,OAAA,CAAAe,MAAA,CAAAZ,CAAA,GAAAa,OAAA,WAAAd,CAAA,IAAAmB,sBAAA,CAAApB,CAAA,EAAAC,CAAA,EAAAM,gCAAA,CAAAL,CAAA,EAAAD,CAAA,iBAAAD,CAAA;AAAA,SAAAqB,aAAAC,OAAA,QAAAC,yBAAA,GAAAC,yBAAA,oBAAAC,qBAAA,QAAAC,KAAA,OAAAC,gBAAA,CAAAV,OAAA,EAAAK,OAAA,GAAAM,MAAA,MAAAL,yBAAA,QAAAM,SAAA,OAAAF,gBAAA,CAAAV,OAAA,QAAAa,WAAA,EAAAF,MAAA,GAAAG,kBAAA,CAAAL,KAAA,EAAAd,SAAA,EAAAiB,SAAA,YAAAD,MAAA,GAAAF,KAAA,CAAAhB,KAAA,OAAAE,SAAA,gBAAAoB,2BAAA,CAAAf,OAAA,QAAAW,MAAA;AAAA,SAAAJ,0BAAA,eAAAS,OAAA,qBAAAF,kBAAA,oBAAAA,kBAAA,CAAAG,IAAA,2BAAAC,KAAA,oCAAAC,OAAA,CAAAC,SAAA,CAAAC,OAAA,CAAAC,IAAA,CAAAR,kBAAA,CAAAK,OAAA,8CAAApC,CAAA,sBA3DlB,uDACA,4CACA;AA2DA,IAAAwC,iBAAA,GAA0D,IAAAC,wBAAgB,EAAC,CAAC;EAArEC,YAAY,GAAAF,iBAAA,CAAZE,YAAY;EAAEC,cAAc,GAAAH,iBAAA,CAAdG,cAAc;EAAEC,iBAAiB,GAAAJ,iBAAA,CAAjBI,iBAAiB;AAqBtD;AACA;AACA;AACA;AACA;AAJA,IAKqBC,qBAAqB,GAAAC,OAAA,CAAA7B,OAAA,0BAAA8B,qBAAA;EAAA,IAAAC,UAAA,CAAA/B,OAAA,EAAA4B,qBAAA,EAAAE,qBAAA;EAAA,IAAAE,MAAA,GAAA5B,YAAA,CAAAwB,qBAAA;EAkBxC;AACF;AACA;AACA;EACE,SAAAA,sBAAA,EAAqB;IAAA,IAAAK,KAAA;IAAA,IAAAC,gBAAA,CAAAlC,OAAA,QAAA4B,qBAAA;IAAA,SAAAO,IAAA,GAAAxC,SAAA,CAAAC,MAAA,EAANwC,IAAI,OAAAC,KAAA,CAAAF,IAAA,GAAAG,IAAA,MAAAA,IAAA,GAAAH,IAAA,EAAAG,IAAA;MAAJF,IAAI,CAAAE,IAAA,IAAA3C,SAAA,CAAA2C,IAAA;IAAA;IACjBL,KAAA,GAAAD,MAAA,CAAAV,IAAA,CAAA7B,KAAA,CAAAuC,MAAA,SAAAO,MAAA,CAASH,IAAI;IACb;IAvBF;IAAA,IAAArC,gBAAA,CAAAC,OAAA,MAAAwC,uBAAA,CAAAxC,OAAA,EAAAiC,KAAA;IAEA;IAAA,IAAAlC,gBAAA,CAAAC,OAAA,MAAAwC,uBAAA,CAAAxC,OAAA,EAAAiC,KAAA;IAAA,IAAAlC,gBAAA,CAAAC,OAAA,MAAAwC,uBAAA,CAAAxC,OAAA,EAAAiC,KAAA;IAGqB;IAAA,IAAAlC,gBAAA,CAAAC,OAAA,MAAAwC,uBAAA,CAAAxC,OAAA,EAAAiC,KAAA;IAAA,IAAAlC,gBAAA,CAAAC,OAAA,MAAAwC,uBAAA,CAAAxC,OAAA,EAAAiC,KAAA;IAIrB;IACA;IAAA,IAAAlC,gBAAA,CAAAC,OAAA,MAAAwC,uBAAA,CAAAxC,OAAA,EAAAiC,KAAA,gBAIgD,UAACQ,OAA2C;MAAA,OAC1FC,QAAA,CAAA1C,OAAA,CAAQ2C,OAAO,CAAC;QAACC,KAAK,EAAEH,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEG,KAAK;QAAEC,KAAK,EAAE;MAAI,CAAC,CAAC;IAAA;IAquBvD;AACF;AACA;AACA;AACA;AACA;IALE,IAAA9C,gBAAA,CAAAC,OAAA,MAAAwC,uBAAA,CAAAxC,OAAA,EAAAiC,KAAA,sCAMkC,UAACW,KAAY,EAAEE,UAAmB,EAAmB;MACrF;MACA,IAAMC,UAAU,GAAG;QACjBC,YAAY,EAAEJ,KAAK;QACnBK,IAAI,EAAE,CAAC,kBAAkB;MAC3B,CAAC;MACDhB,KAAA,CAAKiB,sBAAsB,CAACC,cAAc,CAACL,UAAU,CAAC;MAEtD,OAAOb,KAAA,CAAKiB,sBAAsB,CAACE,OAAO,CAACL,UAAU,CAAC;IACxD,CAAC;IA3uBCd,KAAA,CAAKoB,MAAM,GAAGpB,KAAA,CAAKqB,KAAK,CAACD,MAAM;IAC/B;IACApB,KAAA,CAAKsB,2BAA2B,GAAG,IAAIC,qCAA2B,CAAC,CAAC,CAAC,EAAE;MAACC,MAAM,EAAExB,KAAA,CAAKqB;IAAK,CAAC,CAAC;IAC5F;IACArB,KAAA,CAAKiB,sBAAsB,GAAG,IAAIQ,+BAAsB,CAAC,CAAC,CAAC,EAAE;MAACD,MAAM,EAAExB,KAAA,CAAKqB;IAAK,CAAC,CAAC;IAAC,OAAArB,KAAA;EACrF;;EAEA;AACF;AACA;AACA;EAHE,IAAA0B,aAAA,CAAA3D,OAAA,EAAA4B,qBAAA;IAAAgC,GAAA;IAAAC,KAAA,EAIA,SAAAC,gBAAA,EAAkB;MAChB;MACA,IAAI,IAAI,CAACR,KAAK,CAACS,YAAY,EAAE;QAC3B;QACA,OAAO,IAAI,CAACT,KAAK,CAACU,WAAW,CAACC,iBAAiB,GAAG,kBAAkB,GAAG,UAAU;MACnF;MAEA,OAAO,IAAI;IACb;;IAEA;AACF;AACA;AACA;EAHE;IAAAL,GAAA;IAAAC,KAAA,EAIA,SAAAK,kCAAAC,IAAA,EAA8E;MAAA,IAA3CC,SAAS,GAAAD,IAAA,CAATC,SAAS;MAC1C,IAAIA,SAAS,EAAE;QAAA,IAAAC,oBAAA;QACb;QACA,IAAMC,OAAO,GAAG,IAAI,CAAChB,KAAK,CAACiB,QAAQ,CAACC,iBAAiB,CAACC,GAAG,CAACL,SAAS,CAAC;QAEpE,OAAOE,OAAO,aAAPA,OAAO,wBAAAD,oBAAA,GAAPC,OAAO,CAAEI,WAAW,cAAAL,oBAAA,uBAApBA,oBAAA,CAAsBM,2BAA2B;MAC1D;MAEA,OAAOC,SAAS;IAClB;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAhB,GAAA;IAAAC,KAAA,EAKA,SAAAgB,kBAAkBP,OAAa,EAAwB;MACrD,IAAIA,OAAO,EAAE;QACX;QACA,IAAMI,WAAW,GAAGJ,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEI,WAAW;QACxC;QACA,IAAI,EAACA,WAAW,aAAXA,WAAW,eAAXA,WAAW,CAAEI,cAAc,KAAI,EAACJ,WAAW,aAAXA,WAAW,eAAXA,WAAW,CAAEK,WAAW,KAAIL,WAAW,aAAXA,WAAW,eAAXA,WAAW,CAAEM,GAAG,EAAE;UACjF,OAAOC,gCAAuB,CAACC,GAAG;QACpC;QACA;QACA,IAAIR,WAAW,aAAXA,WAAW,eAAXA,WAAW,CAAEI,cAAc,IAAI,EAACJ,WAAW,aAAXA,WAAW,eAAXA,WAAW,CAAEK,WAAW,KAAI,EAACL,WAAW,aAAXA,WAAW,eAAXA,WAAW,CAAEM,GAAG,GAAE;UACjF,OAAOC,gCAAuB,CAACE,iBAAiB;QAClD;QACA;QACA,IAAIT,WAAW,aAAXA,WAAW,eAAXA,WAAW,CAAEI,cAAc,IAAIJ,WAAW,aAAXA,WAAW,eAAXA,WAAW,CAAEK,WAAW,IAAI,EAACL,WAAW,aAAXA,WAAW,eAAXA,WAAW,CAAEM,GAAG,GAAE;UAChF,OAAOC,gCAAuB,CAACG,OAAO;QACxC;MACF;MAEA,OAAOR,SAAS;IAClB;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAhB,GAAA;IAAAC,KAAA,EAMA,SAAAwB,UAAU5C,OAAyB,EAAE2B,SAAkB,EAAE;MAAA,IAAAkB,qBAAA,EAAAC,sBAAA,EAAAC,sBAAA,EAAAC,sBAAA,EAAAC,sBAAA,EAAAC,sBAAA;MACvD,IAAMC,iBAA6B,GACjC;MAAA,CAAAN,qBAAA,GACA,IAAI,CAAChC,KAAK,CAACiB,QAAQ,CAACsB,MAAM,cAAAP,qBAAA,wBAAAC,sBAAA,GAA1BD,qBAAA,CAA4BQ,OAAO,cAAAP,sBAAA,uBAAnCA,sBAAA,CAAqCQ,UAAU;MACjD,IAAMC,oBAAmC,GACvC;MAAA,CAAAR,sBAAA,GACA,IAAI,CAAClC,KAAK,CAACiB,QAAQ,CAACsB,MAAM,cAAAL,sBAAA,wBAAAC,sBAAA,GAA1BD,sBAAA,CAA4BM,OAAO,cAAAL,sBAAA,uBAAnCA,sBAAA,CAAqCQ,aAAa;MACpD;MACA,IAAMC,qBAA6B,IAAAR,sBAAA,GAAG,IAAI,CAACpC,KAAK,CAACiB,QAAQ,CAACsB,MAAM,cAAAH,sBAAA,wBAAAC,sBAAA,GAA1BD,sBAAA,CAA4BI,OAAO,cAAAH,sBAAA,uBAAnCA,sBAAA,CAAqCQ,aAAa;MACxF;MACA,IAAMC,uBAAuB,MAAA7D,MAAA,CAAM8D,mBAAW,OAAA9D,MAAA,CAAI,IAAI,CAACe,KAAK,CAACgD,OAAO,CAAE;MAEtE,IAAIC,eAAkE,GAAG,CAAC,CAAC;;MAE3E;MACA,IAAIL,qBAAqB,EAAE;QACzBK,eAAe,GAAG,IAAAC,6CAAsB,EAACN,qBAAqB,CAAC;MACjE;MAEA,IAAI,CAAC,IAAI,CAACO,sBAAsB,EAAE;QAChC,IAAI,CAACpD,MAAM,CAACqD,GAAG,CACbC,uCAA8B,wFAE9B,IAAAC,UAAA,CAAA5G,OAAA,EAAe,IAAA6G,wBAAgB,EAAC,CAAC,CACnC,CAAC;QAED,IAAI,CAACJ,sBAAsB,GAAG,IAAI;MACpC;MAEA,IACGb,iBAAiB,IAAII,oBAAoB,IACzCvD,OAAO,CAACsD,UAAU,IAAItD,OAAO,CAACwD,aAAc,EAC7C;QAAA,IAAAa,oBAAA,EAAAC,sBAAA,EAAAC,sBAAA,EAAAC,sBAAA,EAAAC,uBAAA,EAAAC,uBAAA;QACA,IAAMC,MAAuB,GAAG;UAC9BC,IAAI,EAAE,UAAU;UAChBC,WAAW,EAAE,CAAA7E,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAE6E,WAAW,KAAI,SAAS;UAC9CC,SAAS,EAAE,IAAAC,wCAAiB,EAAC;YAC3B;YACAC,UAAU,GAAAX,oBAAA,GAAE,IAAI,CAACxD,KAAK,CAACiB,QAAQ,cAAAuC,oBAAA,wBAAAC,sBAAA,GAAnBD,oBAAA,CAAqBjB,MAAM,cAAAkB,sBAAA,wBAAAC,sBAAA,GAA3BD,sBAAA,CAA6BjB,OAAO,cAAAkB,sBAAA,uBAApCA,sBAAA,CAAsCS,UAAU;YAC5D;YACAC,YAAY,EAAE,IAAI,CAACpE,KAAK,CAACgD;UAC3B,CAAC,CAAC;UACFqB,UAAU,EAAAjI,aAAA,CAAAA,aAAA;YACRqG,UAAU,EAAE,CAAAtD,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEsD,UAAU,KAAIH,iBAAiB;YACpDO,aAAa,EAAED,qBAAqB,IAAIE;UAAuB,GAC5DG,eAAe;YAClBqB,mBAAmB;YACjB;YACA,IAAAC,yCAAkB,GAAAZ,sBAAA,GAAC,IAAI,CAAC3D,KAAK,CAACiB,QAAQ,CAACuD,WAAW,cAAAb,sBAAA,uBAA/BA,sBAAA,CAAiCc,aAAa,CAAC,IAAInD,SAAS;YACjFoD,kBAAkB,EAChB,IAAAH,yCAAkB,GAChB;YAAA,CAAAX,uBAAA,GACA,IAAI,CAAC5D,KAAK,CAACiB,QAAQ,CAACC,iBAAiB,CAClCC,GAAG,CAACL,SAAS,CAAC,cAAA8C,uBAAA,wBAAAC,uBAAA,GADjBD,uBAAA,CAEIe,aAAa,cAAAd,uBAAA,uBAFjBA,uBAAA,CAEmBe,iBAAiB,CAAC,CACvC,CAAC,IAAItD,SAAS;YAChBuD,SAAS,EAAE1G,YAAY,CAAC,CAAC,IAAI,SAAS;YACtCwE,aAAa,EAAE,CAAAxD,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEwD,aAAa,KAAID,oBAAoB;YAC7DoC,EAAE,EAAE,IAAAC,0BAAiB,EAAC,CAAC;YACvBC,OAAO,EAAE5G,cAAc,CAAC,CAAC;YACzB6G,cAAc,EAAE5G,iBAAiB,CAAC;UAAC;QAEvC,CAAC;QAED,IAAIyC,SAAS,EAAE;UACb;UACA,IAAME,OAAO,GAAG,IAAI,CAAChB,KAAK,CAACiB,QAAQ,CAACC,iBAAiB,CAACC,GAAG,CAACL,SAAS,CAAC;UACpE,IAAIE,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAEkE,WAAW,EAAE;YACxBpB,MAAM,CAACoB,WAAW,GAAGlE,OAAO,CAACkE,WAAW;UAC1C;QACF;QAEA,IAAI/F,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAE+F,WAAW,EAAE;UACxBpB,MAAM,CAACoB,WAAW,GAAG/F,OAAO,CAAC+F,WAAW;QAC1C;QAEA,IAAI/F,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAEgG,cAAc,EAAE;UAC3BrB,MAAM,CAACqB,cAAc,GAAGhG,OAAO,CAACgG,cAAc;QAChD;QAEA,IAAIhG,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAEiG,kBAAkB,EAAE;UAC/BtB,MAAM,CAACO,UAAU,CAACe,kBAAkB,GAAGjG,OAAO,CAACiG,kBAAkB;QACnE;QAEA,IAAIjG,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAEkG,mBAAmB,EAAE;UAChCvB,MAAM,CAACO,UAAU,CAACgB,mBAAmB,GAAGlG,OAAO,CAACkG,mBAAmB;QACrE;QAEA,OAAOvB,MAAM;MACf;MAEA,MAAM,IAAIwB,KAAK,CAAC,iDAAiD,CAAC;IACpE;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAhF,GAAA;IAAAC,KAAA,EAKA,SAAAgF,eAAepG,OAA8B,EAAE;MAAA,IAAAqG,kBAAA,EAAAC,qBAAA,EAAAC,qBAAA,EAAAC,qBAAA,EAAAC,qBAAA;MAC7C,IACE5E,OAAO,GAML7B,OAAO,CANT6B,OAAO;QACP6E,gBAAgB,GAKd1G,OAAO,CALT0G,gBAAgB;QAChBC,aAAa,GAIX3G,OAAO,CAJT2G,aAAa;QACbC,oBAAoB,GAGlB5G,OAAO,CAHT4G,oBAAoB;QACpBC,eAAe,GAEb7G,OAAO,CAFT6G,eAAe;QACfxG,UAAU,GACRL,OAAO,CADTK,UAAU;MAEZ,IAAMyG,WAA0C,GAAG;QACjDH,aAAa,EAAE;MACjB,CAAC;MAED,IAAI9E,OAAO,EAAE;QACXiF,WAAW,CAACH,aAAa,GAAG9E,OAAO,CAAC8E,aAAa;MACnD;MAEA,IAAIA,aAAa,EAAE;QACjBG,WAAW,CAACH,aAAa,GAAGA,aAAa;MAC3C;MAEA,IAAI,IAAI,CAACI,MAAM,EAAE;QACf,IAAOA,MAAM,GAAI,IAAI,CAAdA,MAAM;QACb,IAAAC,KAAA,GAAyB,CAAAD,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAE3D,MAAM,KAAI,CAAC,CAAC;UAAtC6D,cAAc,GAAAD,KAAA,CAAdC,cAAc;QAErBH,WAAW,CAACI,MAAM,GAAG,CAAAH,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEG,MAAM,KAAI7G,UAAU;QACjDyG,WAAW,CAACK,QAAQ,GAAGJ,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEK,GAAG;QAClCN,WAAW,CAACO,KAAK,GAAGN,MAAM,aAANA,MAAM,uBAANA,MAAM,CAAEM,KAAK;QACjC;QACAP,WAAW,CAACQ,QAAQ,GAAG,IAAI,CAACzG,KAAK,CAAC0G,QAAQ,CAACC,QAAQ,CAACxF,GAAG,CAAC,OAAO,CAAC;QAEhE,IAAIiF,cAAc,EAAE;UAClBH,WAAW,CAACW,SAAS,GAAGR,cAAc;QACxC;MACF;MAEA,IAAIpF,OAAO,aAAPA,OAAO,gBAAAwE,kBAAA,GAAPxE,OAAO,CAAE6F,SAAS,cAAArB,kBAAA,eAAlBA,kBAAA,CAAoBsB,SAAS,EAAE;QACjCb,WAAW,CAACQ,QAAQ,GAAGzF,OAAO,CAACyF,QAAQ;QACvCR,WAAW,CAACc,OAAO,GAAG/F,OAAO,CAACyF,QAAQ,IAAIzF,OAAO,CAACyF,QAAQ,CAACO,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,CAAC;QAC3EhB,WAAW,CAACiB,cAAc,GACxBlG,OAAO,CAAC6F,SAAS,CAACC,SAAS,IAAI9F,OAAO,CAAC6F,SAAS,CAACC,SAAS,CAACK,UAAU;MACzE;MAEA,IAAInG,OAAO,aAAPA,OAAO,gBAAAyE,qBAAA,GAAPzE,OAAO,CAAEI,WAAW,cAAAqE,qBAAA,eAApBA,qBAAA,CAAsB2B,SAAS,IAAIpG,OAAO,aAAPA,OAAO,gBAAA0E,qBAAA,GAAP1E,OAAO,CAAEI,WAAW,cAAAsE,qBAAA,eAApBA,qBAAA,CAAsB2B,MAAM,EAAE;QAAA,IAAAC,qBAAA,EAAAC,qBAAA;QACnEtB,WAAW,CAACF,oBAAoB,MAAA9G,MAAA,CAC9B,EAAAqI,qBAAA,GAAAtG,OAAO,CAACI,WAAW,cAAAkG,qBAAA,uBAAnBA,qBAAA,CAAqBF,SAAS,OAAAG,qBAAA,GAAIvG,OAAO,CAACI,WAAW,cAAAmG,qBAAA,uBAAnBA,qBAAA,CAAqBF,MAAM,EAC7D;MACJ;MAEA,IAAIrG,OAAO,aAAPA,OAAO,gBAAA2E,qBAAA,GAAP3E,OAAO,CAAEI,WAAW,cAAAuE,qBAAA,eAApBA,qBAAA,CAAsB7E,SAAS,EAAE;QAAA,IAAA0G,qBAAA;QACnCvB,WAAW,CAACD,eAAe,IAAAwB,qBAAA,GAAGxG,OAAO,CAACI,WAAW,cAAAoG,qBAAA,uBAAnBA,qBAAA,CAAqB1G,SAAS;MAC9D;MAEA,IAAIE,OAAO,aAAPA,OAAO,gBAAA4E,qBAAA,GAAP5E,OAAO,CAAEI,WAAW,cAAAwE,qBAAA,eAApBA,qBAAA,CAAsB6B,QAAQ,EAAE;QAAA,IAAAC,qBAAA;QAClCzB,WAAW,CAAC0B,aAAa,IAAAD,qBAAA,GAAG1G,OAAO,CAACI,WAAW,cAAAsG,qBAAA,uBAAnBA,qBAAA,CAAqBD,QAAQ;MAC3D;MAEA,IAAI5B,gBAAgB,EAAE;QAAA,IAAA+B,kBAAA,EAAAC,mBAAA;QACpB5B,WAAW,CAAC6B,eAAe,GAAGjC,gBAAgB,aAAhBA,gBAAgB,wBAAA+B,kBAAA,GAAhB/B,gBAAgB,CAAG,CAAC,CAAC,cAAA+B,kBAAA,uBAArBA,kBAAA,CAAuBE,eAAe;QACpE7B,WAAW,CAAC8B,iBAAiB,GAAGlC,gBAAgB,aAAhBA,gBAAgB,wBAAAgC,mBAAA,GAAhBhC,gBAAgB,CAAG,CAAC,CAAC,cAAAgC,mBAAA,uBAArBA,mBAAA,CAAuBE,iBAAiB;MAC1E;MAEA,IAAI,EAAC9B,WAAW,aAAXA,WAAW,eAAXA,WAAW,CAAEF,oBAAoB,KAAIA,oBAAoB,EAAE;QAC9DE,WAAW,CAACF,oBAAoB,MAAA9G,MAAA,CAAM8G,oBAAoB,CAAE;MAC9D;MAEA,IAAI,EAACE,WAAW,aAAXA,WAAW,eAAXA,WAAW,CAAED,eAAe,KAAIA,eAAe,EAAE;QACpDC,WAAW,CAACD,eAAe,GAAGA,eAAe;MAC/C;MAEA,IAAIC,WAAW,CAACH,aAAa,KAAKxE,SAAS,EAAE;QAC3C,MAAM,IAAIgE,KAAK,CAAC,oCAAoC,CAAC;MACvD;MAEA,OAAOW,WAAW;IACpB;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA3F,GAAA;IAAAC,KAAA,EAOA,SAAAyH,uBAAuBC,SAAyB,EAAE9I,OAAY,EAAE;MAAA,IAAA+I,uBAAA;MAC9D,IAAOpH,SAAS,GAAI3B,OAAO,CAApB2B,SAAS;MAChB,IAAMgD,MAAM,GAAG,IAAI,CAAC/B,SAAS,CAAC5C,OAAO,EAAE2B,SAAS,CAAC;MAEjD,IAAMxB,KAAY,GAAG;QACnB6I,OAAO,EAAEC,aAAI,CAACC,EAAE,CAAC,CAAC;QAClBrF,OAAO,EAAE,CAAC;QACVc,MAAM,EAANA,MAAM;QACNwE,UAAU,EAAE;UACVC,SAAS,EAAE,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;UACnC;UACAC,IAAI,EAAE;QACR,CAAC;QACD;QACAC,iBAAiB,GAAAT,uBAAA,GAAE,IAAI,CAAClI,KAAK,CAACiB,QAAQ,CAACuD,WAAW,cAAA0D,uBAAA,uBAA/BA,uBAAA,CAAiCU,WAAW;QAC/DtJ,KAAK,EAAE2I;MACT,CAAC;;MAED;MACA;MACA;MACA,IAAIA,SAAS,CAAClE,IAAI,KAAK,2BAA2B,EAAE;QAClD,IAAA8E,gDAAyB,EAACvJ,KAAK,CAAC;MAClC;MAEA,OAAOA,KAAK;IACd;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAgB,GAAA;IAAAC,KAAA,EAKA,SAAAuI,mBAAA,EAA4B;MAC1B,MAAMxD,KAAK,CAAC,iBAAiB,CAAC;IAChC;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAAhF,GAAA;IAAAC,KAAA,EAOA,SAAAwI,UAAAC,KAAA,EAQG;MAAA,IAPDjF,IAAI,GAAAiF,KAAA,CAAJjF,IAAI;QACJkF,OAAO,GAAAD,KAAA,CAAPC,OAAO;QACP9J,OAAO,GAAA6J,KAAA,CAAP7J,OAAO;MAMP,IAAO2B,SAAS,GAA6D3B,OAAO,CAA7E2B,SAAS;QAAE+E,gBAAgB,GAA2C1G,OAAO,CAAlE0G,gBAAgB;QAAEE,oBAAoB,GAAqB5G,OAAO,CAAhD4G,oBAAoB;QAAEC,eAAe,GAAI7G,OAAO,CAA1B6G,eAAe;;MAEzE;MACA,IAAIlF,SAAS,EAAE;QACb;QACA,IAAME,OAAO,GAAG,IAAI,CAAChB,KAAK,CAACiB,QAAQ,CAACC,iBAAiB,CAACC,GAAG,CAACL,SAAS,CAAC;QAEpE,IAAI,CAACE,OAAO,EAAE;UACZkI,OAAO,CAACC,IAAI,CACV,iDAAiD,YAAAlK,MAAA,CACvC8E,IAAI,mBAAA9E,MAAA,CAAgB6B,SAAS,CACzC,CAAC;UACD;UACA,IAAI,CAACd,KAAK,CAAC0G,QAAQ,CAAClE,OAAO,CAAC4G,mBAAmB,CAACC,6CAAoC,EAAE;YACpFC,MAAM,EAAE;cACNxI,SAAS,EAATA,SAAS;cACTiD,IAAI,EAAJA;YACF;UACF,CAAC,CAAC;UAEF;QACF;;QAEA;QACA,IAAMkC,WAAW,GAAG,IAAI,CAACV,cAAc,CAAC;UACtCvE,OAAO,EAAPA,OAAO;UACP6E,gBAAgB,EAAE7E,OAAO,CAAC6E,gBAAgB,IAAIA,gBAAgB;UAC9DE,oBAAoB,EAApBA,oBAAoB;UACpBC,eAAe,EAAfA;QACF,CAAC,CAAC;;QAEF;QACA,IAAIuD,iBAA+C,GAAG;UACpDxF,IAAI,EAAJA,IAAI;UACJyF,UAAU,EAAE,IAAI;UAChBvD,WAAW,EAAXA,WAAW;UACXgC,SAAS,EAAE;YACTwB,eAAe,EAAEC,MAAM,CAACC,QAAQ,CAACC;UACnC,CAAC;UACDC,SAAS,EAAEZ,OAAO,CAACY,SAAS;UAC5BC,kBAAkB,EAAE,OAAO;UAC3BC,eAAe,EAAE;YACfC,wBAAwB,EAAE;UAC5B,CAAC;UACDC,cAAc,EAAE;YACdC,uBAAuB,EAAEnH,mBAAW;YACpC;YACAoH,0BAA0B,EAAE,IAAI,CAACnK,KAAK,CAACgD,OAAO;YAC9CoH,uBAAuB,EAAEhM,cAAc,CAAC,CAAC,IAAI,SAAS;YACtDiM,0BAA0B,EAAElM,YAAY,CAAC,CAAC,IAAI,SAAS;YACvDmM,SAAS,EAAE,IAAI9B,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC;UACpC;QACF,CAAC;;QAED;QACAc,iBAAiB,GAAG,IAAAgB,aAAK,EAAChB,iBAAiB,EAAEN,OAAO,CAAC;;QAErD;QACA,IAAMuB,eAAe,GAAG,IAAI,CAACxC,sBAAsB,CAACuB,iBAAiB,EAAEpK,OAAO,CAAC;QAC/E,IAAI,CAACsL,SAAS,CAAC;UAAC9K,IAAI,EAAE,KAAK;UAAEL,KAAK,EAAEkL;QAAe,CAAC,CAAC;QACrD,IAAI,CAACE,uBAAuB,CAACF,eAAe,CAAC;MAC/C,CAAC,MAAM;QACL,MAAM,IAAIlF,KAAK,CACb,6FACF,CAAC;MACH;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EARE;IAAAhF,GAAA;IAAAC,KAAA,EASA,SAAAoK,kCAAAC,KAAA,EAcqB;MAAA,IAbnBC,eAAe,GAAAD,KAAA,CAAfC,eAAe;QACfC,gBAAgB,GAAAF,KAAA,CAAhBE,gBAAgB;QAChBC,gBAAgB,GAAAH,KAAA,CAAhBG,gBAAgB;QAChBC,eAAe,GAAAJ,KAAA,CAAfI,eAAe;QACfC,gBAAgB,GAAAL,KAAA,CAAhBK,gBAAgB;QAChBC,cAAc,GAAAN,KAAA,CAAdM,cAAc;MASd,IAAIC,KAAuB;MAE3B,IAAIN,eAAe,EAAE;QACnB,IAAMO,kBAAkB,GAAGC,2CAAkC,CAACR,eAAe,CAAC;QAE9E,IAAIO,kBAAkB,EAAE;UACtBD,KAAK,GAAG,IAAAZ,aAAK,EACX;YAACe,KAAK,EAAE,IAAI;YAAEC,WAAW,EAAE,KAAK;YAAExH,IAAI,EAAE,OAAO;YAAEyH,QAAQ,EAAE;UAAO,CAAC;UAAE;UACrE;YAACC,SAAS,EAAEZ;UAAe,CAAC,EAC5BE,gBAAgB,GAAG;YAACW,SAAS,EAAE;cAACC,SAAS,EAAEZ;YAAgB;UAAC,CAAC,GAAG,CAAC,CAAC,EAClE;YAACD,gBAAgB,EAAhBA;UAAgB,CAAC,EAClB;YAACE,eAAe,EAAfA;UAAe,CAAC,EACjBE,cAAc,KAAK5J,SAAS,GAAG,CAAC,CAAC,GAAG;YAAC4J,cAAc,EAAdA;UAAc,CAAC,EACpDE,kBAAkB,EAClBH,gBAAgB,IAAI,CAAC,CACvB,CAAC;UAED,OAAOE,KAAK;QACd;MACF;MAEA,OAAO7J,SAAS;IAClB;;IAEA;AACF;AACA;AACA;EAHE;IAAAhB,GAAA;IAAAC,KAAA,EAIA,SAAAqL,gCAAgCC,QAAa,EAAE;MAAA,IAAAC,eAAA,EAAAC,oBAAA,EAAAC,cAAA,EAAAC,eAAA,EAAAC,eAAA,EAAAC,qBAAA;MAC7C,IAAMnB,eAAe,GAAGa,QAAQ,CAACO,OAAO;MACxC,IAAMlB,cAAc,GAAGW,QAAQ,CAACQ,UAAU;MAC1C,IAAIR,QAAQ,CAAC9H,IAAI,EAAE;QACjB,IAAI,IAAAuI,8CAAuB,EAACT,QAAQ,CAAC9H,IAAI,CAAC,EAAE;UAC1C,OAAO,IAAI,CAAC4G,iCAAiC,CAAC;YAC5CG,gBAAgB,EAAExJ,SAAS;YAC3BuJ,eAAe,EAAE0B,2DAAkD,CAACV,QAAQ,CAAC9H,IAAI,CAAC;YAClFgH,gBAAgB,EAAEc,QAAQ,CAAC9H,IAAI;YAC/BiH,eAAe,EAAfA,eAAe;YACfE,cAAc,EAAdA;UACF,CAAC,CAAC;QACJ;MACF;MAEA,IAAI,IAAAsB,8CAAuB,EAACX,QAAQ,CAAC,EAAE;QAAA,IAAAY,eAAA;QACrC;QACA,IAAMC,SAAS,IAAAD,eAAA,GAAGZ,QAAQ,CAACc,KAAK,cAAAF,eAAA,uBAAdA,eAAA,CAAgB9M,IAAI;QAEtC,OAAO,IAAI,CAACgL,iCAAiC,CAAC;UAC5CG,gBAAgB,EAAExJ,SAAS;UAC3BuJ,eAAe,EACb+B,qCAA4B,CAACF,SAAS,CAAC,IAAIE,qCAA4B,CAACC,OAAO;UACjF9B,gBAAgB,EAAEc,QAAQ,CAAC9H,IAAI;UAC/BiH,eAAe,EAAfA,eAAe;UACfE,cAAc,EAAdA;QACF,CAAC,CAAC;MACJ;MAEA,IAAMJ,gBAAgB,GACpB,CAAAe,QAAQ,aAARA,QAAQ,wBAAAC,eAAA,GAARD,QAAQ,CAAEV,KAAK,cAAAW,eAAA,wBAAAC,oBAAA,GAAfD,eAAA,CAAiBgB,IAAI,cAAAf,oBAAA,uBAArBA,oBAAA,CAAuBN,SAAS,MAChCI,QAAQ,aAARA,QAAQ,wBAAAG,cAAA,GAARH,QAAQ,CAAEiB,IAAI,cAAAd,cAAA,uBAAdA,cAAA,CAAgBP,SAAS,MACzBI,QAAQ,aAARA,QAAQ,wBAAAI,eAAA,GAARJ,QAAQ,CAAEiB,IAAI,cAAAb,eAAA,uBAAdA,eAAA,CAAgBc,IAAI,MACpBlB,QAAQ,aAARA,QAAQ,wBAAAK,eAAA,GAARL,QAAQ,CAAEiB,IAAI,cAAAZ,eAAA,wBAAAC,qBAAA,GAAdD,eAAA,CAAgBc,MAAM,cAAAb,qBAAA,uBAAtBA,qBAAA,CAAwBc,UAAU;MAEpC,IAAInC,gBAAgB,EAAE;QACpB,IAAMD,eAAe,GAAGqC,sDAA6C,CAACpC,gBAAgB,CAAC;QACvF,IAAID,eAAe,EAAE;UACnB,OAAO,IAAI,CAACF,iCAAiC,CAAC;YAC5CE,eAAe,EAAfA,eAAe;YACfC,gBAAgB,EAAhBA,gBAAgB;YAChBE,eAAe,EAAfA,eAAe;YACfE,cAAc,EAAdA;UACF,CAAC,CAAC;QACJ;;QAEA;QACA,IAAI,IAAAiC,8CAAuB,EAACrC,gBAAgB,CAAC,EAAE;UAC7C,OAAO,IAAI,CAACH,iCAAiC,CAAC;YAC5CE,eAAe,EAAEuC,oCAA2B;YAC5CtC,gBAAgB,EAAhBA,gBAAgB;YAChBE,eAAe,EAAfA,eAAe;YACfE,cAAc,EAAdA;UACF,CAAC,CAAC;QACJ;MACF;MAEA,IAAI,IAAAmC,gDAAyB,EAACxB,QAAQ,CAAC,EAAE;QACvC,OAAO,IAAI,CAAClB,iCAAiC,CAAC;UAC5CE,eAAe,EAAEyC,8CAAqC;UACtDxC,gBAAgB,EAAhBA,gBAAgB;UAChBE,eAAe,EAAfA,eAAe;UACfE,cAAc,EAAdA;QACF,CAAC,CAAC;MACJ;MAEA,IAAI,IAAAqC,qCAAc,EAAC1B,QAAQ,CAAC,EAAE;QAC5B,OAAO,IAAI,CAAClB,iCAAiC,CAAC;UAC5CE,eAAe,EAAE2C,sBAAa;UAC9B1C,gBAAgB,EAAhBA,gBAAgB;UAChBG,gBAAgB,EAAEY,QAAQ,CAACZ,gBAAgB;UAC3CD,eAAe,EAAfA,eAAe;UACfE,cAAc,EAAdA;QACF,CAAC,CAAC;MACJ;MAEA,IAAI,IAAAuC,0CAAmB,EAAC5B,QAAQ,CAAC,EAAE;QACjC,OAAO,IAAI,CAAClB,iCAAiC,CAAC;UAC5CE,eAAe,EAAE6C,mCAA0B;UAC3C5C,gBAAgB,EAAhBA,gBAAgB;UAChBG,gBAAgB,EAAEY,QAAQ,CAACZ,gBAAgB;UAC3CD,eAAe,EAAfA,eAAe;UACfE,cAAc,EAAdA;QACF,CAAC,CAAC;MACJ;;MAEA;MACA,OAAO,IAAI,CAACP,iCAAiC,CAAC;QAC5CE,eAAe,EAAE8C,sBAAa;QAC9B7C,gBAAgB,EAAE6C,sBAAa;QAC/B1C,gBAAgB,EAAEY,QAAQ,CAACZ,gBAAgB;QAC3CD,eAAe,EAAfA,eAAe;QACfE,cAAc,EAAdA;MACF,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAA5K,GAAA;IAAAC,KAAA,EAOA,SAAAqN,iCAAAC,KAAA,EAQG;MAAA,IAPD9J,IAAI,GAAA8J,KAAA,CAAJ9J,IAAI;QACJ5E,OAAO,GAAA0O,KAAA,CAAP1O,OAAO;QACP2O,MAAM,GAAAD,KAAA,CAANC,MAAM;MAMN,IAAOhN,SAAS,GAA6D3B,OAAO,CAA7E2B,SAAS;QAAE+E,gBAAgB,GAA2C1G,OAAO,CAAlE0G,gBAAgB;QAAEG,eAAe,GAA0B7G,OAAO,CAAhD6G,eAAe;QAAED,oBAAoB,GAAI5G,OAAO,CAA/B4G,oBAAoB;;MAEzE;MACA,IAAM/E,OAAO,GAAG,IAAI,CAAChB,KAAK,CAACiB,QAAQ,CAACC,iBAAiB,CAACC,GAAG,CAACL,SAAS,CAAC;MAEpE,IAAI,CAACE,OAAO,EAAE;QACZkI,OAAO,CAACC,IAAI,CACV,0DAA0D,WAAAlK,MAAA,CACjD8E,IAAI,mBAAA9E,MAAA,CAAgB6B,SAAS,CACxC,CAAC;QACD;QACA,IAAI,CAACd,KAAK,CAAC0G,QAAQ,CAAClE,OAAO,CAAC4G,mBAAmB,CAACC,6CAAoC,EAAE;UACpFC,MAAM,EAAE;YACNxI,SAAS,EAATA,SAAS;YACTiD,IAAI,EAAJA;UACF;QACF,CAAC,CAAC;QAEF,OAAOzC,SAAS;MAClB;;MAEA;MACA,IAAM2E,WAAW,GAAG,IAAI,CAACV,cAAc,CAAC;QACtCvE,OAAO,EAAPA,OAAO;QACP6E,gBAAgB,EAAE,CAAA7E,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAE6E,gBAAgB,KAAIA,gBAAgB;QAC/DE,oBAAoB,EAApBA,oBAAoB;QACpBC,eAAe,EAAfA;MACF,CAAC,CAAC;;MAEF;MACA,IAAMuD,iBAAyC,GAAG;QAChDxF,IAAI,EAAJA,IAAI;QACJyF,UAAU,EAAE,IAAI;QAChBvD,WAAW,EAAXA,WAAW;QACX6H,MAAM,EAANA,MAAM;QACN7F,SAAS,EAAE;UACTwB,eAAe,EAAEC,MAAM,CAACC,QAAQ,CAACC;QACnC,CAAC;QACDmE,QAAQ,EAAE/M,OAAO,CAACgN,cAAc,CAAC,CAAC;QAClCC,SAAS,EACP,WAAW,IAAIjN,OAAO,CAACkN,mBAAmB,GACtClN,OAAO,CAACkN,mBAAmB,CAACD,SAAS,GACrC,IAAI,CAACzN,eAAe,CAAC,CAAC;QAC5B2N,8BAA8B,EAAE,IAAI,CAACvN,iCAAiC,CAAC;UACrEE,SAAS,EAATA;QACF,CAAC,CAAC;QACFsN,mBAAmB,EAAE,IAAI,CAAC7M,iBAAiB,CAACP,OAAO;MACrD,CAAC;MAED,OAAOuI,iBAAiB;IAC1B;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAAjJ,GAAA;IAAAC,KAAA,EAOA,SAAA8N,kCAAAC,KAAA,EAQG;MAAA,IAPDvK,IAAI,GAAAuK,KAAA,CAAJvK,IAAI;QACJ5E,OAAO,GAAAmP,KAAA,CAAPnP,OAAO;QACP2O,MAAM,GAAAQ,KAAA,CAANR,MAAM;MAMN,IAAOhI,aAAa,GAAuD3G,OAAO,CAA3E2G,aAAa;QAAEE,eAAe,GAAsC7G,OAAO,CAA5D6G,eAAe;QAAED,oBAAoB,GAAgB5G,OAAO,CAA3C4G,oBAAoB;QAAEvG,UAAU,GAAIL,OAAO,CAArBK,UAAU;;MAEvE;MACA,IAAMyG,WAAW,GAAG,IAAI,CAACV,cAAc,CAAC;QACtCO,aAAa,EAAbA,aAAa;QACbtG,UAAU,EAAVA,UAAU;QACVwG,eAAe,EAAfA,eAAe;QACfD,oBAAoB,EAApBA;MACF,CAAC,CAAC;;MAEF;MACA,IAAMwD,iBAAyC,GAAG;QAChDxF,IAAI,EAAJA,IAAI;QACJ+J,MAAM,EAANA,MAAM;QACNtE,UAAU,EAAE,IAAI;QAChBvD,WAAW,EAAXA,WAAW;QACXgC,SAAS,EAAE;UACTwB,eAAe,EAAEC,MAAM,CAACC,QAAQ,CAACC;QACnC,CAAC;QACDqE,SAAS,EAAE,IAAI,CAACzN,eAAe,CAAC;MAClC,CAAC;MAED,OAAO+I,iBAAiB;IAC1B;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EARE;IAAAjJ,GAAA;IAAAC,KAAA,EASA,SAAAgO,mBAAAC,KAAA,EAQG;MAAA,IAPDzK,IAAI,GAAAyK,KAAA,CAAJzK,IAAI;QACJkF,OAAO,GAAAuF,KAAA,CAAPvF,OAAO;QACP9J,OAAO,GAAAqP,KAAA,CAAPrP,OAAO;MAMP,IAAO2B,SAAS,GAA6B3B,OAAO,CAA7C2B,SAAS;QAAEgF,aAAa,GAAc3G,OAAO,CAAlC2G,aAAa;QAAE+F,QAAQ,GAAI1M,OAAO,CAAnB0M,QAAQ;MACzC,IAAItC,iBAAyC;;MAE7C;MACA,IAAMuE,MAA+B,GAAG,EAAE;MAE1C,IAAIjC,QAAQ,EAAE;QACZ,IAAM4C,cAAc,GAAG,IAAI,CAAC7C,+BAA+B,CAACC,QAAQ,CAAC;QACrE,IAAI4C,cAAc,EAAE;UAClBX,MAAM,CAAC5R,IAAI,CAACuS,cAAc,CAAC;QAC7B;QACA,IAAI,CAAC1O,MAAM,CAACqD,GAAG,CACbC,uCAA8B,EAC9B,+DAA+D,qBAAApE,MAAA,CAC5C,IAAAqE,UAAA,CAAA5G,OAAA,EAAe+R,cAAc,CAAC,CACnD,CAAC;MACH;;MAEA;MACA,IAAI3N,SAAS,EAAE;QACbyI,iBAAiB,GAAG,IAAI,CAACqE,gCAAgC,CAAC;UAAC7J,IAAI,EAAJA,IAAI;UAAE5E,OAAO,EAAPA,OAAO;UAAE2O,MAAM,EAANA;QAAM,CAAC,CAAC;MACpF,CAAC,MAAM,IAAIhI,aAAa,EAAE;QACxB;QACAyD,iBAAiB,GAAG,IAAI,CAAC8E,iCAAiC,CAAC;UAACtK,IAAI,EAAJA,IAAI;UAAE5E,OAAO,EAAPA,OAAO;UAAE2O,MAAM,EAANA;QAAM,CAAC,CAAC;MACrF,CAAC,MAAM;QACL,MAAM,IAAIxI,KAAK,CAAC,iBAAiB,CAAC;MACpC;;MAEA;MACAiE,iBAAiB,GAAG,IAAAgB,aAAK,EAAChB,iBAAiB,EAAEN,OAAO,CAAC;;MAErD;MACA,IAAMuB,eAAe,GAAG,IAAI,CAACxC,sBAAsB,CAACuB,iBAAiB,EAAEpK,OAAO,CAAC;MAE/E,OAAOqL,eAAe;IACxB;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAAlK,GAAA;IAAAC,KAAA,EAQA,SAAAmO,kBAAAC,KAAA,EAQG;MAAA,IAPD5K,IAAI,GAAA4K,KAAA,CAAJ5K,IAAI;QACJkF,OAAO,GAAA0F,KAAA,CAAP1F,OAAO;QACP9J,OAAO,GAAAwP,KAAA,CAAPxP,OAAO;MAMP,IAAI,CAACY,MAAM,CAACqD,GAAG,CACbC,uCAA8B,EAC9B,0EAA0E,WAAApE,MAAA,CACjE8E,IAAI,CACf,CAAC;MACD,IAAMyG,eAAe,GAAG,IAAI,CAAC+D,kBAAkB,CAAC;QAACxK,IAAI,EAAJA,IAAI;QAAEkF,OAAO,EAAPA,OAAO;QAAE9J,OAAO,EAAPA;MAAO,CAAC,CAAC;MAEzE,IAAIA,OAAO,aAAPA,OAAO,eAAPA,OAAO,CAAEK,UAAU,EAAE;QACvB,OAAO,IAAI,CAACoP,+BAA+B,CAACpE,eAAe,EAAErL,OAAO,aAAPA,OAAO,uBAAPA,OAAO,CAAEK,UAAU,CAAC;MACnF;MAEA,IAAI,CAACiL,SAAS,CAAC;QAAC9K,IAAI,EAAE,IAAI;QAAEL,KAAK,EAAEkL;MAAe,CAAC,CAAC;MAEpD,OAAO,IAAI,CAACE,uBAAuB,CAACF,eAAe,CAAC;IACtD;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAlK,GAAA;IAAAC,KAAA,EAKA,SAAAmK,wBAAwBpL,KAAY,EAAgB;MAClD;MACA,IAAMG,UAAU,GAAG;QACjBC,YAAY,EAAEJ,KAAK;QACnBK,IAAI,EAAE,CAAC,kBAAkB;MAC3B,CAAC;MAED,OAAO,IAAI,CAACM,2BAA2B,CAACH,OAAO,CAACL,UAAU,CAAC;IAC7D;EAAC;IAAAa,GAAA;IAAAC,KAAA;IAmBD;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IARE;MAAA,IAAAsO,oCAAA,OAAAC,kBAAA,CAAApS,OAAA,gBAAAqS,YAAA,CAAArS,OAAA,CAAAsS,IAAA,CASA,SAAAC,QAAAC,KAAA;QAAA,IAAAnL,IAAA,EAAAkF,OAAA,EAAA9J,OAAA,EAAAgQ,WAAA,EAAA3E,eAAA,EAAA1K,OAAA;QAAA,OAAAiP,YAAA,CAAArS,OAAA,CAAA0S,IAAA,UAAAC,SAAAC,QAAA;UAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;YAAA;cACEzL,IAAI,GAAAmL,KAAA,CAAJnL,IAAI,EACJkF,OAAO,GAAAiG,KAAA,CAAPjG,OAAO,EACP9J,OAAO,GAAA+P,KAAA,CAAP/P,OAAO;cAMP,IAAI,CAACY,MAAM,CAACqD,GAAG,CACbC,uCAA8B,EAC9B,6GAA6G,WAAApE,MAAA,CACpG8E,IAAI,CACf,CAAC;cAEKoL,WAAW,GAAG,IAAI,CAACZ,kBAAkB,CAAC;gBAACxK,IAAI,EAAJA,IAAI;gBAAEkF,OAAO,EAAPA,OAAO;gBAAE9J,OAAO,EAAPA;cAAO,CAAC,CAAC,EAErE;cACA;cACMqL,eAAe,GAAG,IAAAiF,kDAA2B,EAAC,IAAI,CAACzP,KAAK,EAAE;gBAC9DN,YAAY,EAAEyP,WAAW;gBACzBxP,IAAI,EAAE,CAAC,kBAAkB;cAC3B,CAAC,CAAC;cAEIG,OAAO,GAAG;gBACd4P,MAAM,EAAE,MAAM;gBACdC,OAAO,EAAE,SAAS;gBAClBC,QAAQ,EAAE,eAAe;gBACzB9C,IAAI,EAAE;kBACJtK,OAAO,EAAE,CAACgI,eAAe;gBAC3B,CAAC;gBACDqF,OAAO,EAAE,CAAC,CAAC;gBACX;gBACAC,qBAAqB,EAAE,IAAI,CAAC9P,KAAK,CAAC0G,QAAQ,CAAClE,OAAO,CAACD,MAAM,CAACuN;cAC5D,CAAC;cAED,IAAI3Q,OAAO,CAACK,UAAU,EAAE;gBACtBM,OAAO,CAAC+P,OAAO,GAAG;kBAChBE,aAAa,EAAE,KAAK;kBACpB,mBAAmB,EAAE5Q,OAAO,CAACK;gBAC/B,CAAC;gBACDM,OAAO,CAAC8P,QAAQ,GAAG,wBAAwB;cAC7C;;cAEA;cAAA,OAAAN,QAAA,CAAAU,MAAA,WACO,IAAI,CAAChQ,KAAK,CAACiQ,mBAAmB,CAACnQ,OAAO,CAAC;YAAA;YAAA;cAAA,OAAAwP,QAAA,CAAAY,IAAA;UAAA;QAAA,GAAAjB,OAAA;MAAA,CAC/C;MAAA,SAAAkB,oCAAAC,EAAA;QAAA,OAAAvB,oCAAA,CAAA1S,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAA8T,mCAAA;IAAA;IAED;AACF;AACA;AACA;AACA;IAJE;EAAA;IAAA7P,GAAA;IAAAC,KAAA,EAKA,SAAA8P,uBAA8BvF,gBAAwB,EAAW;MAC/D,IAAMD,eAAe,GAAGqC,sDAA6C,CAACpC,gBAAgB,CAAC;MACvF,IAAMwF,kBAAkB,GAAGjF,2CAAkC,CAACR,eAAe,CAAC;MAE9E,OAAO,CAAAyF,kBAAkB,aAAlBA,kBAAkB,uBAAlBA,kBAAkB,CAAE9E,QAAQ,MAAK,UAAU;IACpD;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAlL,GAAA;IAAAC,KAAA,EAKA,SAAAgQ,cAAqBrK,MAAW,EAAQ;MACtC;MACA,IAAI,CAACnG,MAAM,CAACqD,GAAG,CAAC,8CAA8C,EAAE8C,MAAM,CAAC;MAEvE,IAAI,CAACA,MAAM,GAAGA,MAAM;IACtB;EAAC;EAAA,OAAA5H,qBAAA;AAAA,EAr1BgDkS,+BAAoB"}
|
|
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',\n };\n\n if (meeting) {\n identifiers.correlationId = meeting.correlationId;\n }\n\n if (sessionCorrelationId) {\n identifiers.sessionCorrelationId = sessionCorrelationId;\n }\n\n if (correlationId) {\n identifiers.correlationId = correlationId;\n }\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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"}
|
package/dist/metrics.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["metrics.types.ts"],"sourcesContent":["import {\n ClientEvent as RawClientEvent,\n Event as RawEvent,\n MediaQualityEvent as RawMediaQualityEvent,\n} from '@webex/event-dictionary-ts';\n\nexport type Event = Omit<RawEvent, 'event'> & {event: RawClientEvent | RawMediaQualityEvent};\n\nexport type ClientEventError = NonNullable<RawClientEvent['errors']>[0];\n\nexport type EnvironmentType = NonNullable<RawEvent['origin']['environment']>;\n\nexport type NewEnvironmentType = NonNullable<RawEvent['origin']['newEnvironment']>;\n\nexport type ClientLaunchMethodType = NonNullable<\n RawEvent['origin']['clientInfo']\n>['clientLaunchMethod'];\n\nexport type BrowserLaunchMethodType = NonNullable<\n RawEvent['origin']['clientInfo']\n>['browserLaunchMethod'];\n\nexport type MetricEventProduct = 'webex' | 'wxcc_desktop';\n\nexport type MetricEventAgent = 'user' | 'browser' | 'system' | 'sdk' | 'redux' | 'service';\n\nexport type MetricEventVerb =\n | 'create'\n | 'get'\n | 'fetch'\n | 'update'\n | 'list'\n | 'delete'\n | 'select'\n | 'view'\n | 'set'\n | 'toggle'\n | 'load'\n | 'reload'\n | 'click'\n | 'hover'\n | 'register'\n | 'unregister'\n | 'enable'\n | 'disable'\n | 'use'\n | 'complete'\n | 'submit'\n | 'apply'\n | 'cancel'\n | 'abort'\n | 'sync'\n | 'login'\n | 'logout'\n | 'answer'\n | 'activate'\n | 'deactivate';\n\nexport type SubmitClientEventOptions = {\n meetingId?: string;\n mediaConnections?: any[];\n rawError?: any;\n correlationId?: string;\n preLoginId?: string;\n environment?: EnvironmentType;\n newEnvironmentType?: NewEnvironmentType;\n clientLaunchMethod?: ClientLaunchMethodType;\n browserLaunchMethod?: BrowserLaunchMethodType;\n webexConferenceIdStr?: string;\n globalMeetingId?: string;\n};\n\nexport type SubmitMQEOptions = {\n meetingId: string;\n mediaConnections?: any[];\n networkType?: Event['origin']['networkType'];\n webexConferenceIdStr?: string;\n globalMeetingId?: string;\n};\n\nexport type InternalEvent = {\n name:\n | 'internal.client.meetinginfo.request'\n | 'internal.client.meetinginfo.response'\n | 'internal.register.device.request'\n | 'internal.register.device.response'\n | 'internal.reset.join.latencies'\n | 'internal.client.meeting.click.joinbutton'\n | 'internal.host.meeting.participant.admitted'\n | 'internal.client.meeting.interstitial-window.showed'\n | 'internal.client.interstitial-window.click.joinbutton'\n | 'internal.client.add-media.turn-discovery.start'\n | 'internal.client.add-media.turn-discovery.end';\n\n payload?: never;\n options?: never;\n};\n\nexport interface ClientEvent {\n name: RawClientEvent['name'];\n payload?: RawClientEvent;\n options?: SubmitClientEventOptions;\n}\n\nexport interface DeviceContext {\n app: {version: string};\n device: {id: string};\n locale: string;\n os: {\n name: string;\n version: string;\n };\n}\n\nexport type MetricType = 'behavioral' | 'operational' | 'business';\n\ntype InternalEventPayload = string | number | boolean;\nexport type EventPayload = Record<string, InternalEventPayload>;\nexport type BehavioralEventPayload = EventPayload; // for compatibilty, can be remove after wxcc-desktop did change their imports.\n\nexport interface BusinessEventPayload {\n metricName: string;\n timestamp: number;\n context: DeviceContext;\n browserDetails: EventPayload;\n value: EventPayload;\n}\n\nexport interface BusinessEvent {\n type: string[];\n eventPayload: BusinessEventPayload;\n}\n\nexport interface TaggedEvent {\n context: DeviceContext;\n metricName: string;\n tags: EventPayload;\n timestamp: number;\n type: [MetricType];\n}\n\nexport type BehavioralEvent = TaggedEvent;\nexport type OperationalEvent = TaggedEvent;\n\nexport interface FeatureEvent {\n // TODO: not implemented\n name: never;\n payload?: never;\n options?: never;\n}\n\nexport interface MediaQualityEvent {\n name: RawMediaQualityEvent['name'];\n payload?: RawMediaQualityEvent;\n options: SubmitMQEOptions;\n}\n\nexport type RecursivePartial<T> = {\n [P in keyof T]?: T[P] extends (infer U)[]\n ? RecursivePartial<U>[]\n : T[P] extends object\n ? RecursivePartial<T[P]>\n : T[P];\n};\n\nexport type MetricEventNames =\n | InternalEvent['name']\n | ClientEvent['name']\n | BehavioralEvent['metricName']\n | OperationalEvent['metricName']\n | BusinessEvent['eventPayload']['metricName']\n | FeatureEvent['name']\n | MediaQualityEvent['name'];\n\nexport type ClientInfo = NonNullable<RawEvent['origin']['clientInfo']>;\nexport type ClientType = NonNullable<RawEvent['origin']['clientInfo']>['clientType'];\nexport type SubClientType = NonNullable<RawEvent['origin']['clientInfo']>['subClientType'];\nexport type NetworkType = NonNullable<RawEvent['origin']>['networkType'];\n\nexport type ClientSubServiceType = ClientEvent['payload']['webexSubServiceType'];\nexport type ClientEventPayload = RecursivePartial<ClientEvent['payload']>;\nexport type ClientEventLeaveReason = ClientEvent['payload']['leaveReason'];\nexport type ClientEventPayloadError = ClientEvent['payload']['errors'];\n\nexport type MediaQualityEventAudioSetupDelayPayload = NonNullable<\n MediaQualityEvent['payload']\n>['audioSetupDelay'];\nexport type MediaQualityEventVideoSetupDelayPayload = NonNullable<\n MediaQualityEvent['payload']\n>['videoSetupDelay'];\n\nexport type SubmitMQEPayload = RecursivePartial<MediaQualityEvent['payload']> & {\n intervals: NonNullable<MediaQualityEvent['payload']>['intervals'];\n};\n\nexport type SubmitInternalEvent = (args: {\n name: InternalEvent['name'];\n payload?: RecursivePartial<InternalEvent['payload']>;\n options?: any;\n}) => void;\n\nexport type SubmitBehavioralEvent = (args: {\n product: MetricEventProduct;\n agent: MetricEventAgent;\n target: string;\n verb: MetricEventVerb;\n payload?: EventPayload;\n}) => void;\n\nexport type SubmitClientEvent = (args: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n}) => Promise<any>;\n\nexport type SubmitOperationalEvent = (args: {\n name: OperationalEvent['metricName'];\n payload: EventPayload;\n}) => void;\n\nexport type SubmitMQE = (args: {\n name: MediaQualityEvent['name'];\n payload: SubmitMQEPayload;\n options: any;\n}) => void;\n\nexport type BuildClientEventFetchRequestOptions = (args: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n}) => Promise<any>;\n\nexport type PreComputedLatencies =\n | 'internal.client.pageJMT'\n | 'internal.download.time'\n | 'internal.get.cluster.time'\n | 'internal.click.to.interstitial'\n | 'internal.refresh.captcha.time'\n | 'internal.exchange.ci.token.time'\n | 'internal.get.u2c.time'\n | 'internal.call.init.join.req'\n | 'internal.other.app.api.time'\n | 'internal.api.fetch.intelligence.models';\n"],"mappings":""}
|
|
1
|
+
{"version":3,"names":[],"sources":["metrics.types.ts"],"sourcesContent":["import {\n ClientEvent as RawClientEvent,\n Event as RawEvent,\n MediaQualityEvent as RawMediaQualityEvent,\n} from '@webex/event-dictionary-ts';\n\nexport type Event = Omit<RawEvent, 'event'> & {event: RawClientEvent | RawMediaQualityEvent};\n\nexport type ClientEventError = NonNullable<RawClientEvent['errors']>[0];\n\nexport type EnvironmentType = NonNullable<RawEvent['origin']['environment']>;\n\nexport type NewEnvironmentType = NonNullable<RawEvent['origin']['newEnvironment']>;\n\nexport type ClientLaunchMethodType = NonNullable<\n RawEvent['origin']['clientInfo']\n>['clientLaunchMethod'];\n\nexport type BrowserLaunchMethodType = NonNullable<\n RawEvent['origin']['clientInfo']\n>['browserLaunchMethod'];\n\nexport type MetricEventProduct = 'webex' | 'wxcc_desktop';\n\nexport type MetricEventAgent = 'user' | 'browser' | 'system' | 'sdk' | 'redux' | 'service';\n\nexport type MetricEventVerb =\n | 'create'\n | 'get'\n | 'fetch'\n | 'update'\n | 'list'\n | 'delete'\n | 'select'\n | 'view'\n | 'set'\n | 'toggle'\n | 'load'\n | 'reload'\n | 'click'\n | 'hover'\n | 'register'\n | 'unregister'\n | 'enable'\n | 'disable'\n | 'use'\n | 'complete'\n | 'submit'\n | 'apply'\n | 'cancel'\n | 'abort'\n | 'sync'\n | 'login'\n | 'logout'\n | 'answer'\n | 'activate'\n | 'deactivate';\n\nexport type SubmitClientEventOptions = {\n meetingId?: string;\n mediaConnections?: any[];\n rawError?: any;\n correlationId?: string;\n sessionCorrelationId?: string;\n preLoginId?: string;\n environment?: EnvironmentType;\n newEnvironmentType?: NewEnvironmentType;\n clientLaunchMethod?: ClientLaunchMethodType;\n browserLaunchMethod?: BrowserLaunchMethodType;\n webexConferenceIdStr?: string;\n globalMeetingId?: string;\n};\n\nexport type SubmitMQEOptions = {\n meetingId: string;\n mediaConnections?: any[];\n networkType?: Event['origin']['networkType'];\n webexConferenceIdStr?: string;\n globalMeetingId?: string;\n};\n\nexport type InternalEvent = {\n name:\n | 'internal.client.meetinginfo.request'\n | 'internal.client.meetinginfo.response'\n | 'internal.register.device.request'\n | 'internal.register.device.response'\n | 'internal.reset.join.latencies'\n | 'internal.client.meeting.click.joinbutton'\n | 'internal.host.meeting.participant.admitted'\n | 'internal.client.meeting.interstitial-window.showed'\n | 'internal.client.interstitial-window.click.joinbutton'\n | 'internal.client.add-media.turn-discovery.start'\n | 'internal.client.add-media.turn-discovery.end';\n\n payload?: never;\n options?: never;\n};\n\nexport interface ClientEvent {\n name: RawClientEvent['name'];\n payload?: RawClientEvent;\n options?: SubmitClientEventOptions;\n}\n\nexport interface DeviceContext {\n app: {version: string};\n device: {id: string};\n locale: string;\n os: {\n name: string;\n version: string;\n };\n}\n\nexport type MetricType = 'behavioral' | 'operational' | 'business';\n\ntype InternalEventPayload = string | number | boolean;\nexport type EventPayload = Record<string, InternalEventPayload>;\nexport type BehavioralEventPayload = EventPayload; // for compatibilty, can be remove after wxcc-desktop did change their imports.\n\nexport interface BusinessEventPayload {\n metricName: string;\n timestamp: number;\n context: DeviceContext;\n browserDetails: EventPayload;\n value: EventPayload;\n}\n\nexport interface BusinessEvent {\n type: string[];\n eventPayload: BusinessEventPayload;\n}\n\nexport interface TaggedEvent {\n context: DeviceContext;\n metricName: string;\n tags: EventPayload;\n timestamp: number;\n type: [MetricType];\n}\n\nexport type BehavioralEvent = TaggedEvent;\nexport type OperationalEvent = TaggedEvent;\n\nexport interface FeatureEvent {\n // TODO: not implemented\n name: never;\n payload?: never;\n options?: never;\n}\n\nexport interface MediaQualityEvent {\n name: RawMediaQualityEvent['name'];\n payload?: RawMediaQualityEvent;\n options: SubmitMQEOptions;\n}\n\nexport type RecursivePartial<T> = {\n [P in keyof T]?: T[P] extends (infer U)[]\n ? RecursivePartial<U>[]\n : T[P] extends object\n ? RecursivePartial<T[P]>\n : T[P];\n};\n\nexport type MetricEventNames =\n | InternalEvent['name']\n | ClientEvent['name']\n | BehavioralEvent['metricName']\n | OperationalEvent['metricName']\n | BusinessEvent['eventPayload']['metricName']\n | FeatureEvent['name']\n | MediaQualityEvent['name'];\n\nexport type ClientInfo = NonNullable<RawEvent['origin']['clientInfo']>;\nexport type ClientType = NonNullable<RawEvent['origin']['clientInfo']>['clientType'];\nexport type SubClientType = NonNullable<RawEvent['origin']['clientInfo']>['subClientType'];\nexport type NetworkType = NonNullable<RawEvent['origin']>['networkType'];\n\nexport type ClientSubServiceType = ClientEvent['payload']['webexSubServiceType'];\nexport type ClientEventPayload = RecursivePartial<ClientEvent['payload']>;\nexport type ClientEventLeaveReason = ClientEvent['payload']['leaveReason'];\nexport type ClientEventPayloadError = ClientEvent['payload']['errors'];\n\nexport type MediaQualityEventAudioSetupDelayPayload = NonNullable<\n MediaQualityEvent['payload']\n>['audioSetupDelay'];\nexport type MediaQualityEventVideoSetupDelayPayload = NonNullable<\n MediaQualityEvent['payload']\n>['videoSetupDelay'];\n\nexport type SubmitMQEPayload = RecursivePartial<MediaQualityEvent['payload']> & {\n intervals: NonNullable<MediaQualityEvent['payload']>['intervals'];\n};\n\nexport type SubmitInternalEvent = (args: {\n name: InternalEvent['name'];\n payload?: RecursivePartial<InternalEvent['payload']>;\n options?: any;\n}) => void;\n\nexport type SubmitBehavioralEvent = (args: {\n product: MetricEventProduct;\n agent: MetricEventAgent;\n target: string;\n verb: MetricEventVerb;\n payload?: EventPayload;\n}) => void;\n\nexport type SubmitClientEvent = (args: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n}) => Promise<any>;\n\nexport type SubmitOperationalEvent = (args: {\n name: OperationalEvent['metricName'];\n payload: EventPayload;\n}) => void;\n\nexport type SubmitMQE = (args: {\n name: MediaQualityEvent['name'];\n payload: SubmitMQEPayload;\n options: any;\n}) => void;\n\nexport type BuildClientEventFetchRequestOptions = (args: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n}) => Promise<any>;\n\nexport type PreComputedLatencies =\n | 'internal.client.pageJMT'\n | 'internal.download.time'\n | 'internal.get.cluster.time'\n | 'internal.click.to.interstitial'\n | 'internal.refresh.captcha.time'\n | 'internal.exchange.ci.token.time'\n | 'internal.get.u2c.time'\n | 'internal.call.init.join.req'\n | 'internal.other.app.api.time'\n | 'internal.api.fetch.intelligence.models';\n"],"mappings":""}
|
package/dist/new-metrics.js
CHANGED
|
@@ -106,6 +106,48 @@ var Metrics = /*#__PURE__*/function (_WebexPlugin) {
|
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
108
|
|
|
109
|
+
/**
|
|
110
|
+
* if webex metrics is ready, build behavioral metric backend if not already done.
|
|
111
|
+
*/
|
|
112
|
+
}, {
|
|
113
|
+
key: "lazyBuildBehavioralMetrics",
|
|
114
|
+
value: function lazyBuildBehavioralMetrics() {
|
|
115
|
+
if (this.isReady && !this.behavioralMetrics) {
|
|
116
|
+
// @ts-ignore
|
|
117
|
+
this.behavioralMetrics = new _behavioralMetrics.default({}, {
|
|
118
|
+
parent: this.webex
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* if webex metrics is ready, build operational metric backend if not already done.
|
|
125
|
+
*/
|
|
126
|
+
}, {
|
|
127
|
+
key: "lazyBuildOperationalMetrics",
|
|
128
|
+
value: function lazyBuildOperationalMetrics() {
|
|
129
|
+
if (this.isReady && !this.operationalMetrics) {
|
|
130
|
+
// @ts-ignore
|
|
131
|
+
this.operationalMetrics = new _operationalMetrics.default({}, {
|
|
132
|
+
parent: this.webex
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* if webex metrics is ready, build business metric backend if not already done.
|
|
139
|
+
*/
|
|
140
|
+
}, {
|
|
141
|
+
key: "lazyBuildBusinessMetrics",
|
|
142
|
+
value: function lazyBuildBusinessMetrics() {
|
|
143
|
+
if (this.isReady && !this.businessMetrics) {
|
|
144
|
+
// @ts-ignore
|
|
145
|
+
this.businessMetrics = new _businessMetrics.default({}, {
|
|
146
|
+
parent: this.webex
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
109
151
|
/**
|
|
110
152
|
* @returns true once we have the deviceId we need to submit behavioral events to Amplitude
|
|
111
153
|
*/
|
|
@@ -113,6 +155,7 @@ var Metrics = /*#__PURE__*/function (_WebexPlugin) {
|
|
|
113
155
|
key: "isReadyToSubmitBehavioralEvents",
|
|
114
156
|
value: function isReadyToSubmitBehavioralEvents() {
|
|
115
157
|
var _this$behavioralMetri, _this$behavioralMetri2;
|
|
158
|
+
this.lazyBuildBehavioralMetrics();
|
|
116
159
|
return (_this$behavioralMetri = (_this$behavioralMetri2 = this.behavioralMetrics) === null || _this$behavioralMetri2 === void 0 ? void 0 : _this$behavioralMetri2.isReadyToSubmitEvents()) !== null && _this$behavioralMetri !== void 0 ? _this$behavioralMetri : false;
|
|
117
160
|
}
|
|
118
161
|
|
|
@@ -123,6 +166,7 @@ var Metrics = /*#__PURE__*/function (_WebexPlugin) {
|
|
|
123
166
|
key: "isReadyToSubmitOperationalEvents",
|
|
124
167
|
value: function isReadyToSubmitOperationalEvents() {
|
|
125
168
|
var _this$operationalMetr, _this$operationalMetr2;
|
|
169
|
+
this.lazyBuildOperationalMetrics();
|
|
126
170
|
return (_this$operationalMetr = (_this$operationalMetr2 = this.operationalMetrics) === null || _this$operationalMetr2 === void 0 ? void 0 : _this$operationalMetr2.isReadyToSubmitEvents()) !== null && _this$operationalMetr !== void 0 ? _this$operationalMetr : false;
|
|
127
171
|
}
|
|
128
172
|
|
|
@@ -133,6 +177,7 @@ var Metrics = /*#__PURE__*/function (_WebexPlugin) {
|
|
|
133
177
|
key: "isReadyToSubmitBusinessEvents",
|
|
134
178
|
value: function isReadyToSubmitBusinessEvents() {
|
|
135
179
|
var _this$businessMetrics, _this$businessMetrics2;
|
|
180
|
+
this.lazyBuildBusinessMetrics();
|
|
136
181
|
return (_this$businessMetrics = (_this$businessMetrics2 = this.businessMetrics) === null || _this$businessMetrics2 === void 0 ? void 0 : _this$businessMetrics2.isReadyToSubmitEvents()) !== null && _this$businessMetrics !== void 0 ? _this$businessMetrics : false;
|
|
137
182
|
}
|
|
138
183
|
|
|
@@ -153,12 +198,7 @@ var Metrics = /*#__PURE__*/function (_WebexPlugin) {
|
|
|
153
198
|
this.webex.logger.log("NewMetrics: @submitBehavioralEvent. Attempted to submit before webex.ready: ".concat(product, ".").concat(agent, ".").concat(target, ".").concat(verb));
|
|
154
199
|
return _promise.default.resolve();
|
|
155
200
|
}
|
|
156
|
-
|
|
157
|
-
// @ts-ignore
|
|
158
|
-
this.behavioralMetrics = new _behavioralMetrics.default({}, {
|
|
159
|
-
parent: this.webex
|
|
160
|
-
});
|
|
161
|
-
}
|
|
201
|
+
this.lazyBuildBehavioralMetrics();
|
|
162
202
|
return this.behavioralMetrics.submitBehavioralEvent({
|
|
163
203
|
product: product,
|
|
164
204
|
agent: agent,
|
|
@@ -182,12 +222,7 @@ var Metrics = /*#__PURE__*/function (_WebexPlugin) {
|
|
|
182
222
|
this.webex.logger.log("NewMetrics: @submitOperationalEvent. Attempted to submit before webex.ready: ".concat(name));
|
|
183
223
|
return _promise.default.resolve();
|
|
184
224
|
}
|
|
185
|
-
|
|
186
|
-
// @ts-ignore
|
|
187
|
-
this.operationalMetrics = new _operationalMetrics.default({}, {
|
|
188
|
-
parent: this.webex
|
|
189
|
-
});
|
|
190
|
-
}
|
|
225
|
+
this.lazyBuildOperationalMetrics();
|
|
191
226
|
return this.operationalMetrics.submitOperationalEvent({
|
|
192
227
|
name: name,
|
|
193
228
|
payload: payload
|
|
@@ -208,12 +243,7 @@ var Metrics = /*#__PURE__*/function (_WebexPlugin) {
|
|
|
208
243
|
this.webex.logger.log("NewMetrics: @submitBusinessEvent. Attempted to submit before webex.ready: ".concat(name));
|
|
209
244
|
return _promise.default.resolve();
|
|
210
245
|
}
|
|
211
|
-
|
|
212
|
-
// @ts-ignore
|
|
213
|
-
this.businessMetrics = new _businessMetrics.default({}, {
|
|
214
|
-
parent: this.webex
|
|
215
|
-
});
|
|
216
|
-
}
|
|
246
|
+
this.lazyBuildBusinessMetrics();
|
|
217
247
|
return this.businessMetrics.submitBusinessEvent({
|
|
218
248
|
name: name,
|
|
219
249
|
payload: payload
|
package/dist/new-metrics.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_webexCore","require","_callDiagnosticMetrics","_interopRequireDefault","_behavioralMetrics","_operationalMetrics","_businessMetrics","_callDiagnosticMetricsLatencies","_callDiagnosticMetrics2","_utils","_class","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","Metrics","_WebexPlugin","_inherits2","_super","_this","_classCallCheck2","_len","length","args","Array","_key","concat","_defineProperty2","_assertThisInitialized2","callDiagnosticLatencies","CallDiagnosticLatencies","parent","webex","onReady","_createClass2","key","value","_this2","once","callDiagnosticMetrics","CallDiagnosticMetrics","isReady","submitInternalEvent","_ref","name","payload","options","clearTimestamps","saveTimestamp","isReadyToSubmitBehavioralEvents","_this$behavioralMetri","_this$behavioralMetri2","behavioralMetrics","isReadyToSubmitEvents","isReadyToSubmitOperationalEvents","_this$operationalMetr","_this$operationalMetr2","operationalMetrics","isReadyToSubmitBusinessEvents","_this$businessMetrics","_this$businessMetrics2","businessMetrics","submitBehavioralEvent","_ref2","product","agent","target","verb","logger","log","_promise","resolve","BehavioralMetrics","submitOperationalEvent","_ref3","OperationalMetrics","submitBusinessEvent","_ref4","BusinessMetrics","submitMQE","_ref5","submitFeatureEvent","_ref6","Error","submitClientEvent","_ref7","meetingId","clientMetricsAliasUser","preLoginId","_this3","request","method","api","resource","headers","body","qs","alias","then","res","catch","err","error","generateCommonErrorMetadata","reject","_buildClientEventFetchRequestOptions","_asyncToGenerator2","_regenerator","mark","_callee","_ref8","wrap","_callee$","_context","prev","next","abrupt","buildClientEventFetchRequestOptions","stop","_x","setMetricTimingsAndFetch","setTimingsAndFetch","setMetricTimings","isServiceErrorExpected","serviceErrorCode","WebexPlugin","_default","exports"],"sources":["new-metrics.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable class-methods-use-this */\n/* eslint-disable valid-jsdoc */\n\n// @ts-ignore\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport CallDiagnosticMetrics from './call-diagnostic/call-diagnostic-metrics';\nimport BehavioralMetrics from './behavioral-metrics';\nimport OperationalMetrics from './operational-metrics';\nimport BusinessMetrics from './business-metrics';\nimport {\n RecursivePartial,\n MetricEventProduct,\n MetricEventAgent,\n MetricEventVerb,\n ClientEvent,\n FeatureEvent,\n EventPayload,\n OperationalEvent,\n MediaQualityEvent,\n InternalEvent,\n SubmitClientEventOptions,\n} from './metrics.types';\nimport CallDiagnosticLatencies from './call-diagnostic/call-diagnostic-metrics-latencies';\nimport {setMetricTimings} from './call-diagnostic/call-diagnostic-metrics.util';\nimport {generateCommonErrorMetadata} from './utils';\n\n/**\n * Metrics plugin to centralize all types of metrics.\n * @class\n */\nclass Metrics extends WebexPlugin {\n // eslint-disable-next-line no-use-before-define\n static instance: Metrics;\n\n // Call Diagnostic latencies\n callDiagnosticLatencies: CallDiagnosticLatencies;\n // Helper classes to handle the different types of metrics\n callDiagnosticMetrics: CallDiagnosticMetrics;\n behavioralMetrics: BehavioralMetrics;\n operationalMetrics: OperationalMetrics;\n businessMetrics: BusinessMetrics;\n isReady = false;\n\n /**\n * Constructor\n * @param args\n * @constructor\n * @private\n * @returns\n */\n constructor(...args) {\n super(...args);\n\n // @ts-ignore\n this.callDiagnosticLatencies = new CallDiagnosticLatencies({}, {parent: this.webex});\n this.onReady();\n }\n\n /**\n * On Ready\n */\n private onReady() {\n // @ts-ignore\n this.webex.once('ready', () => {\n // @ts-ignore\n this.callDiagnosticMetrics = new CallDiagnosticMetrics({}, {parent: this.webex});\n this.isReady = true;\n });\n }\n\n /**\n * Used for internal purposes only\n * @param args\n */\n submitInternalEvent({\n name,\n payload,\n options,\n }: {\n name: InternalEvent['name'];\n payload?: RecursivePartial<InternalEvent['payload']>;\n options?: any;\n }) {\n if (name === 'internal.reset.join.latencies') {\n this.callDiagnosticLatencies.clearTimestamps();\n } else {\n this.callDiagnosticLatencies.saveTimestamp({key: name});\n }\n }\n\n /**\n * @returns true once we have the deviceId we need to submit behavioral events to Amplitude\n */\n isReadyToSubmitBehavioralEvents() {\n return this.behavioralMetrics?.isReadyToSubmitEvents() ?? false;\n }\n\n /**\n * @returns true once we have the deviceId we need to submit operational events\n */\n isReadyToSubmitOperationalEvents() {\n return this.operationalMetrics?.isReadyToSubmitEvents() ?? false;\n }\n\n /**\n * @returns true once we have the deviceId we need to submit buisness events\n */\n isReadyToSubmitBusinessEvents() {\n return this.businessMetrics?.isReadyToSubmitEvents() ?? false;\n }\n\n /**\n * Behavioral event\n * @param args\n */\n submitBehavioralEvent({\n product,\n agent,\n target,\n verb,\n payload,\n }: {\n product: MetricEventProduct;\n agent: MetricEventAgent;\n target: string;\n verb: MetricEventVerb;\n payload?: EventPayload;\n }) {\n if (!this.isReady) {\n // @ts-ignore\n this.webex.logger.log(\n `NewMetrics: @submitBehavioralEvent. Attempted to submit before webex.ready: ${product}.${agent}.${target}.${verb}`\n );\n\n return Promise.resolve();\n }\n\n if (!this.behavioralMetrics) {\n // @ts-ignore\n this.behavioralMetrics = new BehavioralMetrics({}, {parent: this.webex});\n }\n\n return this.behavioralMetrics.submitBehavioralEvent({product, agent, target, verb, payload});\n }\n\n /**\n * Operational event\n * @param args\n */\n submitOperationalEvent({name, payload}: {name: string; payload?: EventPayload}) {\n if (!this.isReady) {\n // @ts-ignore\n this.webex.logger.log(\n `NewMetrics: @submitOperationalEvent. Attempted to submit before webex.ready: ${name}`\n );\n\n return Promise.resolve();\n }\n\n if (!this.operationalMetrics) {\n // @ts-ignore\n this.operationalMetrics = new OperationalMetrics({}, {parent: this.webex});\n }\n\n return this.operationalMetrics.submitOperationalEvent({name, payload});\n }\n\n /**\n * Buisness event\n * @param args\n */\n submitBusinessEvent({name, payload}: {name: string; payload: EventPayload}) {\n if (!this.isReady) {\n // @ts-ignore\n this.webex.logger.log(\n `NewMetrics: @submitBusinessEvent. Attempted to submit before webex.ready: ${name}`\n );\n\n return Promise.resolve();\n }\n\n if (!this.businessMetrics) {\n // @ts-ignore\n this.businessMetrics = new BusinessMetrics({}, {parent: this.webex});\n }\n\n return this.businessMetrics.submitBusinessEvent({name, payload});\n }\n\n /**\n * Call Analyzer: Media Quality Event\n * @param args\n */\n submitMQE({\n name,\n payload,\n options,\n }: {\n name: MediaQualityEvent['name'];\n payload: RecursivePartial<MediaQualityEvent['payload']> & {\n intervals: MediaQualityEvent['payload']['intervals'];\n };\n options: any;\n }) {\n this.callDiagnosticLatencies.saveTimestamp({key: name});\n this.callDiagnosticMetrics.submitMQE({name, payload, options});\n }\n\n /**\n * Call Analyzer: Feature Usage Event\n * @param args\n */\n submitFeatureEvent({\n name,\n payload,\n options,\n }: {\n name: FeatureEvent['name'];\n payload?: RecursivePartial<FeatureEvent['payload']>;\n options: any;\n }) {\n throw new Error('Not implemented.');\n }\n\n /**\n * Call Analyzer: Client Event\n * @public\n * @param args\n */\n public submitClientEvent({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n }): Promise<any> {\n if (!this.callDiagnosticLatencies || !this.callDiagnosticMetrics) {\n // @ts-ignore\n this.webex.logger.log(\n `NewMetrics: @submitClientEvent. Attempted to submit before webex.ready. Event name: ${name}`\n );\n\n return Promise.resolve();\n }\n this.callDiagnosticLatencies.saveTimestamp({\n key: name,\n options: {meetingId: options?.meetingId},\n });\n\n return this.callDiagnosticMetrics.submitClientEvent({name, payload, options});\n }\n\n /**\n * Issue request to alias a user's pre-login ID with their CI UUID\n * @param {string} preLoginId\n * @returns {Object} HttpResponse object\n */\n public clientMetricsAliasUser(preLoginId: string) {\n // @ts-ignore\n return this.webex\n .request({\n method: 'POST',\n api: 'metrics',\n resource: 'clientmetrics',\n headers: {\n 'x-prelogin-userid': preLoginId,\n },\n body: {},\n qs: {\n alias: true,\n },\n })\n .then((res) => {\n // @ts-ignore\n this.webex.logger.log(`NewMetrics: @clientMetricsAliasUser. Request successful.`);\n\n return res;\n })\n .catch((err) => {\n // @ts-ignore\n this.logger.error(\n `NewMetrics: @clientMetricsAliasUser. Request failed:`,\n `err: ${generateCommonErrorMetadata(err)}`\n );\n\n return Promise.reject(err);\n });\n }\n\n /**\n * Returns a promise that will resolve to fetch options for submitting a metric.\n *\n * This is to support quickly submitting metrics when the browser/tab is closing.\n * Calling submitClientEvent will not work because there some async steps that will\n * not complete before the browser is closed. Instead, we pre-gather all the\n * information/options needed for the request(s), and then simply and quickly\n * fire the fetch(es) when beforeUnload is triggered.\n *\n * We must use fetch instead of request because fetch has a keepalive option that\n * allows the request it to outlive the page.\n *\n * Note: the timings values will be wrong, but setMetricTimingsAndFetch() will\n * properly adjust them before submitting.\n *\n * @public\n * @param {Object} arg\n * @param {String} arg.name - event name\n * @param {Object} arg.payload - event payload\n * @param {Object} arg.options - other options\n * @returns {Promise} promise that resolves to options to be used with fetch\n */\n public async buildClientEventFetchRequestOptions({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n }): Promise<any> {\n return this.callDiagnosticMetrics.buildClientEventFetchRequestOptions({\n name,\n payload,\n options,\n });\n }\n\n /**\n * Submits a metric from pre-built request options via the fetch API. Updates\n * the \"$timings\" and \"originTime\" values to Date.now() since the existing times\n * were set when the options were built (not submitted).\n\n * @param {any} options - the pre-built request options for submitting a metric\n * @returns {Promise} promise that resolves to the response object\n */\n public setMetricTimingsAndFetch(options: any): Promise<any> {\n // @ts-ignore\n return this.webex.setTimingsAndFetch(setMetricTimings(options));\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 return this.callDiagnosticMetrics.isServiceErrorExpected(serviceErrorCode);\n }\n}\n\nexport default Metrics;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["_webexCore","require","_callDiagnosticMetrics","_interopRequireDefault","_behavioralMetrics","_operationalMetrics","_businessMetrics","_callDiagnosticMetricsLatencies","_callDiagnosticMetrics2","_utils","_class","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","Metrics","_WebexPlugin","_inherits2","_super","_this","_classCallCheck2","_len","length","args","Array","_key","concat","_defineProperty2","_assertThisInitialized2","callDiagnosticLatencies","CallDiagnosticLatencies","parent","webex","onReady","_createClass2","key","value","_this2","once","callDiagnosticMetrics","CallDiagnosticMetrics","isReady","submitInternalEvent","_ref","name","payload","options","clearTimestamps","saveTimestamp","lazyBuildBehavioralMetrics","behavioralMetrics","BehavioralMetrics","lazyBuildOperationalMetrics","operationalMetrics","OperationalMetrics","lazyBuildBusinessMetrics","businessMetrics","BusinessMetrics","isReadyToSubmitBehavioralEvents","_this$behavioralMetri","_this$behavioralMetri2","isReadyToSubmitEvents","isReadyToSubmitOperationalEvents","_this$operationalMetr","_this$operationalMetr2","isReadyToSubmitBusinessEvents","_this$businessMetrics","_this$businessMetrics2","submitBehavioralEvent","_ref2","product","agent","target","verb","logger","log","_promise","resolve","submitOperationalEvent","_ref3","submitBusinessEvent","_ref4","submitMQE","_ref5","submitFeatureEvent","_ref6","Error","submitClientEvent","_ref7","meetingId","clientMetricsAliasUser","preLoginId","_this3","request","method","api","resource","headers","body","qs","alias","then","res","catch","err","error","generateCommonErrorMetadata","reject","_buildClientEventFetchRequestOptions","_asyncToGenerator2","_regenerator","mark","_callee","_ref8","wrap","_callee$","_context","prev","next","abrupt","buildClientEventFetchRequestOptions","stop","_x","setMetricTimingsAndFetch","setTimingsAndFetch","setMetricTimings","isServiceErrorExpected","serviceErrorCode","WebexPlugin","_default","exports"],"sources":["new-metrics.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable class-methods-use-this */\n/* eslint-disable valid-jsdoc */\n\n// @ts-ignore\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport CallDiagnosticMetrics from './call-diagnostic/call-diagnostic-metrics';\nimport BehavioralMetrics from './behavioral-metrics';\nimport OperationalMetrics from './operational-metrics';\nimport BusinessMetrics from './business-metrics';\nimport {\n RecursivePartial,\n MetricEventProduct,\n MetricEventAgent,\n MetricEventVerb,\n ClientEvent,\n FeatureEvent,\n EventPayload,\n OperationalEvent,\n MediaQualityEvent,\n InternalEvent,\n SubmitClientEventOptions,\n} from './metrics.types';\nimport CallDiagnosticLatencies from './call-diagnostic/call-diagnostic-metrics-latencies';\nimport {setMetricTimings} from './call-diagnostic/call-diagnostic-metrics.util';\nimport {generateCommonErrorMetadata} from './utils';\n\n/**\n * Metrics plugin to centralize all types of metrics.\n * @class\n */\nclass Metrics extends WebexPlugin {\n // eslint-disable-next-line no-use-before-define\n static instance: Metrics;\n\n // Call Diagnostic latencies\n callDiagnosticLatencies: CallDiagnosticLatencies;\n // Helper classes to handle the different types of metrics\n callDiagnosticMetrics: CallDiagnosticMetrics;\n behavioralMetrics: BehavioralMetrics;\n operationalMetrics: OperationalMetrics;\n businessMetrics: BusinessMetrics;\n isReady = false;\n\n /**\n * Constructor\n * @param args\n * @constructor\n * @private\n * @returns\n */\n constructor(...args) {\n super(...args);\n\n // @ts-ignore\n this.callDiagnosticLatencies = new CallDiagnosticLatencies({}, {parent: this.webex});\n this.onReady();\n }\n\n /**\n * On Ready\n */\n private onReady() {\n // @ts-ignore\n this.webex.once('ready', () => {\n // @ts-ignore\n this.callDiagnosticMetrics = new CallDiagnosticMetrics({}, {parent: this.webex});\n this.isReady = true;\n });\n }\n\n /**\n * Used for internal purposes only\n * @param args\n */\n submitInternalEvent({\n name,\n payload,\n options,\n }: {\n name: InternalEvent['name'];\n payload?: RecursivePartial<InternalEvent['payload']>;\n options?: any;\n }) {\n if (name === 'internal.reset.join.latencies') {\n this.callDiagnosticLatencies.clearTimestamps();\n } else {\n this.callDiagnosticLatencies.saveTimestamp({key: name});\n }\n }\n\n /**\n * if webex metrics is ready, build behavioral metric backend if not already done.\n */\n private lazyBuildBehavioralMetrics() {\n if (this.isReady && !this.behavioralMetrics) {\n // @ts-ignore\n this.behavioralMetrics = new BehavioralMetrics({}, {parent: this.webex});\n }\n }\n\n /**\n * if webex metrics is ready, build operational metric backend if not already done.\n */\n private lazyBuildOperationalMetrics() {\n if (this.isReady && !this.operationalMetrics) {\n // @ts-ignore\n this.operationalMetrics = new OperationalMetrics({}, {parent: this.webex});\n }\n }\n\n /**\n * if webex metrics is ready, build business metric backend if not already done.\n */\n private lazyBuildBusinessMetrics() {\n if (this.isReady && !this.businessMetrics) {\n // @ts-ignore\n this.businessMetrics = new BusinessMetrics({}, {parent: this.webex});\n }\n }\n\n /**\n * @returns true once we have the deviceId we need to submit behavioral events to Amplitude\n */\n isReadyToSubmitBehavioralEvents() {\n this.lazyBuildBehavioralMetrics();\n\n return this.behavioralMetrics?.isReadyToSubmitEvents() ?? false;\n }\n\n /**\n * @returns true once we have the deviceId we need to submit operational events\n */\n isReadyToSubmitOperationalEvents() {\n this.lazyBuildOperationalMetrics();\n\n return this.operationalMetrics?.isReadyToSubmitEvents() ?? false;\n }\n\n /**\n * @returns true once we have the deviceId we need to submit buisness events\n */\n isReadyToSubmitBusinessEvents() {\n this.lazyBuildBusinessMetrics();\n\n return this.businessMetrics?.isReadyToSubmitEvents() ?? false;\n }\n\n /**\n * Behavioral event\n * @param args\n */\n submitBehavioralEvent({\n product,\n agent,\n target,\n verb,\n payload,\n }: {\n product: MetricEventProduct;\n agent: MetricEventAgent;\n target: string;\n verb: MetricEventVerb;\n payload?: EventPayload;\n }) {\n if (!this.isReady) {\n // @ts-ignore\n this.webex.logger.log(\n `NewMetrics: @submitBehavioralEvent. Attempted to submit before webex.ready: ${product}.${agent}.${target}.${verb}`\n );\n\n return Promise.resolve();\n }\n\n this.lazyBuildBehavioralMetrics();\n\n return this.behavioralMetrics.submitBehavioralEvent({product, agent, target, verb, payload});\n }\n\n /**\n * Operational event\n * @param args\n */\n submitOperationalEvent({name, payload}: {name: string; payload?: EventPayload}) {\n if (!this.isReady) {\n // @ts-ignore\n this.webex.logger.log(\n `NewMetrics: @submitOperationalEvent. Attempted to submit before webex.ready: ${name}`\n );\n\n return Promise.resolve();\n }\n\n this.lazyBuildOperationalMetrics();\n\n return this.operationalMetrics.submitOperationalEvent({name, payload});\n }\n\n /**\n * Buisness event\n * @param args\n */\n submitBusinessEvent({name, payload}: {name: string; payload: EventPayload}) {\n if (!this.isReady) {\n // @ts-ignore\n this.webex.logger.log(\n `NewMetrics: @submitBusinessEvent. Attempted to submit before webex.ready: ${name}`\n );\n\n return Promise.resolve();\n }\n\n this.lazyBuildBusinessMetrics();\n\n return this.businessMetrics.submitBusinessEvent({name, payload});\n }\n\n /**\n * Call Analyzer: Media Quality Event\n * @param args\n */\n submitMQE({\n name,\n payload,\n options,\n }: {\n name: MediaQualityEvent['name'];\n payload: RecursivePartial<MediaQualityEvent['payload']> & {\n intervals: MediaQualityEvent['payload']['intervals'];\n };\n options: any;\n }) {\n this.callDiagnosticLatencies.saveTimestamp({key: name});\n this.callDiagnosticMetrics.submitMQE({name, payload, options});\n }\n\n /**\n * Call Analyzer: Feature Usage Event\n * @param args\n */\n submitFeatureEvent({\n name,\n payload,\n options,\n }: {\n name: FeatureEvent['name'];\n payload?: RecursivePartial<FeatureEvent['payload']>;\n options: any;\n }) {\n throw new Error('Not implemented.');\n }\n\n /**\n * Call Analyzer: Client Event\n * @public\n * @param args\n */\n public submitClientEvent({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n }): Promise<any> {\n if (!this.callDiagnosticLatencies || !this.callDiagnosticMetrics) {\n // @ts-ignore\n this.webex.logger.log(\n `NewMetrics: @submitClientEvent. Attempted to submit before webex.ready. Event name: ${name}`\n );\n\n return Promise.resolve();\n }\n this.callDiagnosticLatencies.saveTimestamp({\n key: name,\n options: {meetingId: options?.meetingId},\n });\n\n return this.callDiagnosticMetrics.submitClientEvent({name, payload, options});\n }\n\n /**\n * Issue request to alias a user's pre-login ID with their CI UUID\n * @param {string} preLoginId\n * @returns {Object} HttpResponse object\n */\n public clientMetricsAliasUser(preLoginId: string) {\n // @ts-ignore\n return this.webex\n .request({\n method: 'POST',\n api: 'metrics',\n resource: 'clientmetrics',\n headers: {\n 'x-prelogin-userid': preLoginId,\n },\n body: {},\n qs: {\n alias: true,\n },\n })\n .then((res) => {\n // @ts-ignore\n this.webex.logger.log(`NewMetrics: @clientMetricsAliasUser. Request successful.`);\n\n return res;\n })\n .catch((err) => {\n // @ts-ignore\n this.logger.error(\n `NewMetrics: @clientMetricsAliasUser. Request failed:`,\n `err: ${generateCommonErrorMetadata(err)}`\n );\n\n return Promise.reject(err);\n });\n }\n\n /**\n * Returns a promise that will resolve to fetch options for submitting a metric.\n *\n * This is to support quickly submitting metrics when the browser/tab is closing.\n * Calling submitClientEvent will not work because there some async steps that will\n * not complete before the browser is closed. Instead, we pre-gather all the\n * information/options needed for the request(s), and then simply and quickly\n * fire the fetch(es) when beforeUnload is triggered.\n *\n * We must use fetch instead of request because fetch has a keepalive option that\n * allows the request it to outlive the page.\n *\n * Note: the timings values will be wrong, but setMetricTimingsAndFetch() will\n * properly adjust them before submitting.\n *\n * @public\n * @param {Object} arg\n * @param {String} arg.name - event name\n * @param {Object} arg.payload - event payload\n * @param {Object} arg.options - other options\n * @returns {Promise} promise that resolves to options to be used with fetch\n */\n public async buildClientEventFetchRequestOptions({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n }): Promise<any> {\n return this.callDiagnosticMetrics.buildClientEventFetchRequestOptions({\n name,\n payload,\n options,\n });\n }\n\n /**\n * Submits a metric from pre-built request options via the fetch API. Updates\n * the \"$timings\" and \"originTime\" values to Date.now() since the existing times\n * were set when the options were built (not submitted).\n\n * @param {any} options - the pre-built request options for submitting a metric\n * @returns {Promise} promise that resolves to the response object\n */\n public setMetricTimingsAndFetch(options: any): Promise<any> {\n // @ts-ignore\n return this.webex.setTimingsAndFetch(setMetricTimings(options));\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 return this.callDiagnosticMetrics.isServiceErrorExpected(serviceErrorCode);\n }\n}\n\nexport default Metrics;\n"],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ type GetIdentifiersOptions = {
|
|
|
13
13
|
meeting?: any;
|
|
14
14
|
mediaConnections?: any[];
|
|
15
15
|
correlationId?: string;
|
|
16
|
+
sessionCorrelationId?: string;
|
|
16
17
|
preLoginId?: string;
|
|
17
18
|
globalMeetingId?: string;
|
|
18
19
|
webexConferenceIdStr?: string;
|
|
@@ -65,7 +66,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
65
66
|
* @returns
|
|
66
67
|
*/
|
|
67
68
|
getOrigin(options: GetOriginOptions, meetingId?: string): {
|
|
68
|
-
name: "endpoint" | "antares" | "beech" | "breakout" | "cb" | "cloudproxy" | "edonus" | "givr" | "hecate" | "hedge" | "hesiod" | "homer" | "superhomer" | "l2sip" | "linus" | "locus" | "mcc" | "mcs" | "mercury" | "mes" | "mjs" | "mmp" | "mygdon" | "orpheus" | "page" | "poros" | "rhesos" | "terminus" | "tpgw" | "ucc" | "wdm" | "webexivr";
|
|
69
|
+
name: "endpoint" | "addin" | "antares" | "appapi" | "beech" | "breakout" | "calendar" | "cb" | "cca" | "ccc" | "cloudproxy" | "edonus" | "givr" | "hecate" | "hedge" | "hesiod" | "homer" | "superhomer" | "l2sip" | "linus" | "locus" | "mbs" | "mcc" | "mcs" | "mercury" | "mes" | "mjs" | "mmp" | "mygdon" | "ngservice" | "orpheus" | "page" | "poros" | "publicapi" | "rhesos" | "terminus" | "tpgw" | "ucc" | "wdm" | "webexivr";
|
|
69
70
|
userAgent: string;
|
|
70
71
|
buildType?: "debug" | "test" | "prod" | "tap" | "analyzer-test";
|
|
71
72
|
upgradeChannel?: string;
|
|
@@ -89,7 +90,8 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
89
90
|
browser?: string;
|
|
90
91
|
browserVersion?: string;
|
|
91
92
|
clientType?: "MEETING_CENTER" | "EVENT_CENTER" | "TRAINING_CENTER" | "TEAMS_CLIENT" | "TEAMS_DEVICE" | "TEAMS_SHARE" | "SIP" | "RECORDING" | "CLOUD_AWARE_SIP" | "TEAMS_WXC_CLIENT" | "WXC_CLIENT" | "WXC_DEVICE" | "WEBEX_JS_SDK" | "VOICEA_CLIENT" | "CISCO_SIP_GW" | "WEBEX_SDK" | "CPAAS_THIRD_PARTY_SDK" | "WXC_THIRD_PARTY" | "WXCC";
|
|
92
|
-
subClientType?: "TEAMS_DEVICE" | "DESKTOP_APP" | "DESKTOP_APP_VDI" | "DEVICE_CURRENT" | "DEVICE_LEGACY_2020" | "HOLOGRAM_HEADSET_APP" | "HVDI_APP" | "MIXED" | "MOBILE_APP" | "MOBILE_NETWORK" | "PAGE" | "VDI_APP" | "WEB_APP";
|
|
93
|
+
subClientType?: "TEAMS_DEVICE" | "AUTOMOTIVE_APP" | "DESKTOP_APP" | "DESKTOP_APP_VDI" | "DEVICE_CURRENT" | "DEVICE_LEGACY_2020" | "HOLOGRAM_HEADSET_APP" | "HVDI_APP" | "MIXED" | "MOBILE_APP" | "MOBILE_NETWORK" | "PAGE" | "VDI_APP" | "WEB_APP";
|
|
94
|
+
schedulingClientType?: "TEAMS_CLIENT" | "GOOGLE_ADDON" | "PT" | "PUBLIC_API" | "UNIFIED_PAGE" | "WEBEX_PAGE" | "GOOGLE_NOTIFICATION_CALENDAR" | "MSFT_NOTIFICATION_ADDIN" | "MSFT_NOTIFICATION_CALENDAR" | "OUTLOOK_ADDIN";
|
|
93
95
|
clientVersion?: string;
|
|
94
96
|
clientVersionStatus?: "CURRENT" | "LEGACY" | "UNSUPPORTED";
|
|
95
97
|
localClientVersion?: string;
|
|
@@ -113,10 +115,10 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
113
115
|
isValidClientVersion?: boolean;
|
|
114
116
|
cpuInfo?: {
|
|
115
117
|
description: string;
|
|
116
|
-
clockSpeedGigaHertz: number;
|
|
117
118
|
numberOfCores: number;
|
|
118
119
|
architecture: "unknown" | "intel32" | "intel64" | "amd32" | "amd64" | "arm32" | "arm64";
|
|
119
120
|
staticPerformance?: string;
|
|
121
|
+
clockSpeedGigaHertz?: number;
|
|
120
122
|
additionalProperties?: false;
|
|
121
123
|
};
|
|
122
124
|
shareType?: "cb-normal-share" | "ce-airplay-share" | "ce-direct-share" | "ce-gui-loopback-share" | "ce-input-source-share" | "ce-input-source-share-hdmi" | "ce-input-source-share-usbc" | "ce-jpg-share" | "ce-miracast-share" | "mcs-normal-share" | "mcs-normal-audio-share" | "mcs-hfps-share" | "mcs-hfps-audio-share";
|
|
@@ -147,6 +149,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
147
149
|
breakoutGroupId?: string;
|
|
148
150
|
breakoutMoveId?: string;
|
|
149
151
|
breakoutSessionId?: string;
|
|
152
|
+
ciExchangeTokenUrl?: string;
|
|
150
153
|
confluenceId?: string;
|
|
151
154
|
cpaasIdentifiers?: {
|
|
152
155
|
imiTenantId: string;
|
|
@@ -164,11 +167,14 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
164
167
|
destinationVenueId?: string;
|
|
165
168
|
deviceId?: string;
|
|
166
169
|
globalMeetingId?: string;
|
|
170
|
+
installationId?: string;
|
|
171
|
+
webexMeetingUUID?: string;
|
|
167
172
|
ivrCallId?: string;
|
|
168
173
|
ivrDialogId?: string;
|
|
169
174
|
ivrId?: string;
|
|
170
175
|
callId?: string;
|
|
171
176
|
locusId?: string;
|
|
177
|
+
locusJoinUrl?: string;
|
|
172
178
|
locusSessionId?: string;
|
|
173
179
|
locusStartTime?: string;
|
|
174
180
|
locusUrl?: string;
|
|
@@ -179,6 +185,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
179
185
|
meetingInstanceId?: string;
|
|
180
186
|
meetingLookupUrl?: string;
|
|
181
187
|
meetingOrgId?: string;
|
|
188
|
+
metricServiceUrl?: string;
|
|
182
189
|
msteamsTenantGuid?: string;
|
|
183
190
|
msteamsConferenceId?: string;
|
|
184
191
|
msteamsMeetingId?: string;
|
|
@@ -186,6 +193,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
186
193
|
orgId?: string;
|
|
187
194
|
provisionalCorrelationId?: string;
|
|
188
195
|
roomId?: string;
|
|
196
|
+
sessionCorrelationId?: string;
|
|
189
197
|
sipCallId?: string;
|
|
190
198
|
sipSessionId?: {
|
|
191
199
|
local?: string;
|
|
@@ -200,6 +208,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
200
208
|
venueId?: string;
|
|
201
209
|
venueUrl?: string;
|
|
202
210
|
whiteboardUrl?: string;
|
|
211
|
+
wdmDeviceRegistrationUrl?: string;
|
|
203
212
|
webexConferenceId?: number;
|
|
204
213
|
webexClusterName?: string;
|
|
205
214
|
webexConferenceIdStr?: string;
|
|
@@ -219,6 +228,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
219
228
|
breakoutGroupId?: string;
|
|
220
229
|
breakoutMoveId?: string;
|
|
221
230
|
breakoutSessionId?: string;
|
|
231
|
+
ciExchangeTokenUrl?: string;
|
|
222
232
|
confluenceId?: string;
|
|
223
233
|
cpaasIdentifiers?: {
|
|
224
234
|
imiTenantId: string;
|
|
@@ -236,11 +246,14 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
236
246
|
destinationVenueId?: string;
|
|
237
247
|
deviceId?: string;
|
|
238
248
|
globalMeetingId?: string;
|
|
249
|
+
installationId?: string;
|
|
250
|
+
webexMeetingUUID?: string;
|
|
239
251
|
ivrCallId?: string;
|
|
240
252
|
ivrDialogId?: string;
|
|
241
253
|
ivrId?: string;
|
|
242
254
|
callId?: string;
|
|
243
255
|
locusId?: string;
|
|
256
|
+
locusJoinUrl?: string;
|
|
244
257
|
locusSessionId?: string;
|
|
245
258
|
locusStartTime?: string;
|
|
246
259
|
locusUrl?: string;
|
|
@@ -251,6 +264,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
251
264
|
meetingInstanceId?: string;
|
|
252
265
|
meetingLookupUrl?: string;
|
|
253
266
|
meetingOrgId?: string;
|
|
267
|
+
metricServiceUrl?: string;
|
|
254
268
|
msteamsTenantGuid?: string;
|
|
255
269
|
msteamsConferenceId?: string;
|
|
256
270
|
msteamsMeetingId?: string;
|
|
@@ -258,6 +272,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
258
272
|
orgId?: string;
|
|
259
273
|
provisionalCorrelationId?: string;
|
|
260
274
|
roomId?: string;
|
|
275
|
+
sessionCorrelationId?: string;
|
|
261
276
|
sipCallId?: string;
|
|
262
277
|
sipSessionId?: {
|
|
263
278
|
local?: string;
|
|
@@ -272,6 +287,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
272
287
|
venueId?: string;
|
|
273
288
|
venueUrl?: string;
|
|
274
289
|
whiteboardUrl?: string;
|
|
290
|
+
wdmDeviceRegistrationUrl?: string;
|
|
275
291
|
webexConferenceId?: number;
|
|
276
292
|
webexClusterName?: string;
|
|
277
293
|
webexConferenceIdStr?: string;
|
|
@@ -38,6 +38,18 @@ declare class Metrics extends WebexPlugin {
|
|
|
38
38
|
payload?: RecursivePartial<InternalEvent['payload']>;
|
|
39
39
|
options?: any;
|
|
40
40
|
}): void;
|
|
41
|
+
/**
|
|
42
|
+
* if webex metrics is ready, build behavioral metric backend if not already done.
|
|
43
|
+
*/
|
|
44
|
+
private lazyBuildBehavioralMetrics;
|
|
45
|
+
/**
|
|
46
|
+
* if webex metrics is ready, build operational metric backend if not already done.
|
|
47
|
+
*/
|
|
48
|
+
private lazyBuildOperationalMetrics;
|
|
49
|
+
/**
|
|
50
|
+
* if webex metrics is ready, build business metric backend if not already done.
|
|
51
|
+
*/
|
|
52
|
+
private lazyBuildBusinessMetrics;
|
|
41
53
|
/**
|
|
42
54
|
* @returns true once we have the deviceId we need to submit behavioral events to Amplitude
|
|
43
55
|
*/
|
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.4.0-next.
|
|
30
|
-
"@webex/test-helper-mocha": "3.4.0-next.
|
|
31
|
-
"@webex/test-helper-mock-webex": "3.4.0-next.
|
|
32
|
-
"@webex/test-helper-test-users": "3.4.0-next.
|
|
29
|
+
"@webex/test-helper-chai": "3.4.0-next.6",
|
|
30
|
+
"@webex/test-helper-mocha": "3.4.0-next.6",
|
|
31
|
+
"@webex/test-helper-mock-webex": "3.4.0-next.6",
|
|
32
|
+
"@webex/test-helper-test-users": "3.4.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.4.0-next.
|
|
39
|
-
"@webex/common-timers": "3.4.0-next.
|
|
40
|
-
"@webex/event-dictionary-ts": "^1.0.
|
|
41
|
-
"@webex/internal-plugin-metrics": "3.4.0-next.
|
|
42
|
-
"@webex/test-helper-chai": "3.4.0-next.
|
|
43
|
-
"@webex/test-helper-mock-webex": "3.4.0-next.
|
|
44
|
-
"@webex/webex-core": "3.4.0-next.
|
|
38
|
+
"@webex/common": "3.4.0-next.6",
|
|
39
|
+
"@webex/common-timers": "3.4.0-next.6",
|
|
40
|
+
"@webex/event-dictionary-ts": "^1.0.1546",
|
|
41
|
+
"@webex/internal-plugin-metrics": "3.4.0-next.6",
|
|
42
|
+
"@webex/test-helper-chai": "3.4.0-next.6",
|
|
43
|
+
"@webex/test-helper-mock-webex": "3.4.0-next.6",
|
|
44
|
+
"@webex/webex-core": "3.4.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.4.0-next.
|
|
57
|
+
"version": "3.4.0-next.6"
|
|
58
58
|
}
|
package/src/business-metrics.ts
CHANGED
|
@@ -17,8 +17,8 @@ export default class BusinessMetrics extends GenericMetrics {
|
|
|
17
17
|
const event = {
|
|
18
18
|
type: ['business'],
|
|
19
19
|
eventPayload: {
|
|
20
|
-
|
|
21
|
-
|
|
20
|
+
key: name,
|
|
21
|
+
client_timestamp: Date.now(),
|
|
22
22
|
context: this.getContext(),
|
|
23
23
|
browserDetails: this.getBrowserDetails(),
|
|
24
24
|
value: payload,
|
|
@@ -75,6 +75,7 @@ type GetIdentifiersOptions = {
|
|
|
75
75
|
meeting?: any;
|
|
76
76
|
mediaConnections?: any[];
|
|
77
77
|
correlationId?: string;
|
|
78
|
+
sessionCorrelationId?: string;
|
|
78
79
|
preLoginId?: string;
|
|
79
80
|
globalMeetingId?: string;
|
|
80
81
|
webexConferenceIdStr?: string;
|
|
@@ -285,6 +286,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
285
286
|
webexConferenceIdStr,
|
|
286
287
|
globalMeetingId,
|
|
287
288
|
preLoginId,
|
|
289
|
+
sessionCorrelationId,
|
|
288
290
|
} = options;
|
|
289
291
|
const identifiers: Event['event']['identifiers'] = {
|
|
290
292
|
correlationId: 'unknown',
|
|
@@ -294,6 +296,10 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
294
296
|
identifiers.correlationId = meeting.correlationId;
|
|
295
297
|
}
|
|
296
298
|
|
|
299
|
+
if (sessionCorrelationId) {
|
|
300
|
+
identifiers.sessionCorrelationId = sessionCorrelationId;
|
|
301
|
+
}
|
|
302
|
+
|
|
297
303
|
if (correlationId) {
|
|
298
304
|
identifiers.correlationId = correlationId;
|
|
299
305
|
}
|
|
@@ -646,7 +652,13 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
646
652
|
options?: SubmitClientEventOptions;
|
|
647
653
|
errors?: ClientEventPayloadError;
|
|
648
654
|
}) {
|
|
649
|
-
const {
|
|
655
|
+
const {
|
|
656
|
+
meetingId,
|
|
657
|
+
mediaConnections,
|
|
658
|
+
globalMeetingId,
|
|
659
|
+
webexConferenceIdStr,
|
|
660
|
+
sessionCorrelationId,
|
|
661
|
+
} = options;
|
|
650
662
|
|
|
651
663
|
// @ts-ignore
|
|
652
664
|
const meeting = this.webex.meetings.meetingCollection.get(meetingId);
|
|
@@ -673,6 +685,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
673
685
|
mediaConnections: meeting?.mediaConnections || mediaConnections,
|
|
674
686
|
webexConferenceIdStr,
|
|
675
687
|
globalMeetingId,
|
|
688
|
+
sessionCorrelationId,
|
|
676
689
|
});
|
|
677
690
|
|
|
678
691
|
// create client event object
|
|
@@ -714,11 +727,13 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
|
|
|
714
727
|
options?: SubmitClientEventOptions;
|
|
715
728
|
errors?: ClientEventPayloadError;
|
|
716
729
|
}) {
|
|
717
|
-
const {correlationId, globalMeetingId, webexConferenceIdStr, preLoginId} =
|
|
730
|
+
const {correlationId, globalMeetingId, webexConferenceIdStr, preLoginId, sessionCorrelationId} =
|
|
731
|
+
options;
|
|
718
732
|
|
|
719
733
|
// grab identifiers
|
|
720
734
|
const identifiers = this.getIdentifiers({
|
|
721
735
|
correlationId,
|
|
736
|
+
sessionCorrelationId,
|
|
722
737
|
preLoginId,
|
|
723
738
|
globalMeetingId,
|
|
724
739
|
webexConferenceIdStr,
|
package/src/metrics.types.ts
CHANGED
package/src/new-metrics.ts
CHANGED
|
@@ -90,10 +90,42 @@ class Metrics extends WebexPlugin {
|
|
|
90
90
|
}
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
+
/**
|
|
94
|
+
* if webex metrics is ready, build behavioral metric backend if not already done.
|
|
95
|
+
*/
|
|
96
|
+
private lazyBuildBehavioralMetrics() {
|
|
97
|
+
if (this.isReady && !this.behavioralMetrics) {
|
|
98
|
+
// @ts-ignore
|
|
99
|
+
this.behavioralMetrics = new BehavioralMetrics({}, {parent: this.webex});
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* if webex metrics is ready, build operational metric backend if not already done.
|
|
105
|
+
*/
|
|
106
|
+
private lazyBuildOperationalMetrics() {
|
|
107
|
+
if (this.isReady && !this.operationalMetrics) {
|
|
108
|
+
// @ts-ignore
|
|
109
|
+
this.operationalMetrics = new OperationalMetrics({}, {parent: this.webex});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* if webex metrics is ready, build business metric backend if not already done.
|
|
115
|
+
*/
|
|
116
|
+
private lazyBuildBusinessMetrics() {
|
|
117
|
+
if (this.isReady && !this.businessMetrics) {
|
|
118
|
+
// @ts-ignore
|
|
119
|
+
this.businessMetrics = new BusinessMetrics({}, {parent: this.webex});
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
93
123
|
/**
|
|
94
124
|
* @returns true once we have the deviceId we need to submit behavioral events to Amplitude
|
|
95
125
|
*/
|
|
96
126
|
isReadyToSubmitBehavioralEvents() {
|
|
127
|
+
this.lazyBuildBehavioralMetrics();
|
|
128
|
+
|
|
97
129
|
return this.behavioralMetrics?.isReadyToSubmitEvents() ?? false;
|
|
98
130
|
}
|
|
99
131
|
|
|
@@ -101,6 +133,8 @@ class Metrics extends WebexPlugin {
|
|
|
101
133
|
* @returns true once we have the deviceId we need to submit operational events
|
|
102
134
|
*/
|
|
103
135
|
isReadyToSubmitOperationalEvents() {
|
|
136
|
+
this.lazyBuildOperationalMetrics();
|
|
137
|
+
|
|
104
138
|
return this.operationalMetrics?.isReadyToSubmitEvents() ?? false;
|
|
105
139
|
}
|
|
106
140
|
|
|
@@ -108,6 +142,8 @@ class Metrics extends WebexPlugin {
|
|
|
108
142
|
* @returns true once we have the deviceId we need to submit buisness events
|
|
109
143
|
*/
|
|
110
144
|
isReadyToSubmitBusinessEvents() {
|
|
145
|
+
this.lazyBuildBusinessMetrics();
|
|
146
|
+
|
|
111
147
|
return this.businessMetrics?.isReadyToSubmitEvents() ?? false;
|
|
112
148
|
}
|
|
113
149
|
|
|
@@ -137,10 +173,7 @@ class Metrics extends WebexPlugin {
|
|
|
137
173
|
return Promise.resolve();
|
|
138
174
|
}
|
|
139
175
|
|
|
140
|
-
|
|
141
|
-
// @ts-ignore
|
|
142
|
-
this.behavioralMetrics = new BehavioralMetrics({}, {parent: this.webex});
|
|
143
|
-
}
|
|
176
|
+
this.lazyBuildBehavioralMetrics();
|
|
144
177
|
|
|
145
178
|
return this.behavioralMetrics.submitBehavioralEvent({product, agent, target, verb, payload});
|
|
146
179
|
}
|
|
@@ -159,10 +192,7 @@ class Metrics extends WebexPlugin {
|
|
|
159
192
|
return Promise.resolve();
|
|
160
193
|
}
|
|
161
194
|
|
|
162
|
-
|
|
163
|
-
// @ts-ignore
|
|
164
|
-
this.operationalMetrics = new OperationalMetrics({}, {parent: this.webex});
|
|
165
|
-
}
|
|
195
|
+
this.lazyBuildOperationalMetrics();
|
|
166
196
|
|
|
167
197
|
return this.operationalMetrics.submitOperationalEvent({name, payload});
|
|
168
198
|
}
|
|
@@ -181,10 +211,7 @@ class Metrics extends WebexPlugin {
|
|
|
181
211
|
return Promise.resolve();
|
|
182
212
|
}
|
|
183
213
|
|
|
184
|
-
|
|
185
|
-
// @ts-ignore
|
|
186
|
-
this.businessMetrics = new BusinessMetrics({}, {parent: this.webex});
|
|
187
|
-
}
|
|
214
|
+
this.lazyBuildBusinessMetrics();
|
|
188
215
|
|
|
189
216
|
return this.businessMetrics.submitBusinessEvent({name, payload});
|
|
190
217
|
}
|
|
@@ -95,7 +95,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
95
95
|
version: getOSVersion(),
|
|
96
96
|
},
|
|
97
97
|
},
|
|
98
|
-
|
|
98
|
+
key: 'foobar',
|
|
99
99
|
browserDetails: {
|
|
100
100
|
browser: getBrowserName(),
|
|
101
101
|
browserHeight: window.innerHeight,
|
|
@@ -106,14 +106,14 @@ describe('internal-plugin-metrics', () => {
|
|
|
106
106
|
locale: window.navigator.language,
|
|
107
107
|
os: getOSNameInternal(),
|
|
108
108
|
},
|
|
109
|
-
|
|
109
|
+
client_timestamp: requestCalls[0].eventPayload.client_timestamp, // This is to bypass time check, which is checked below.
|
|
110
110
|
value: {
|
|
111
111
|
bar: "gee"
|
|
112
112
|
}
|
|
113
113
|
},
|
|
114
114
|
type: ['business'],
|
|
115
115
|
});
|
|
116
|
-
assert.isNumber(requestCalls[0].eventPayload.
|
|
116
|
+
assert.isNumber(requestCalls[0].eventPayload.client_timestamp)
|
|
117
117
|
})
|
|
118
118
|
})
|
|
119
119
|
});
|
|
@@ -372,6 +372,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
372
372
|
{mediaAgentAlias: 'mediaAgentAlias', mediaAgentGroupId: 'mediaAgentGroupId'},
|
|
373
373
|
],
|
|
374
374
|
webexConferenceIdStr: 'webexConferenceIdStr',
|
|
375
|
+
sessionCorrelationId: 'sessionCorrelationId',
|
|
375
376
|
globalMeetingId: 'globalMeetingId',
|
|
376
377
|
meeting: {
|
|
377
378
|
...fakeMeeting,
|
|
@@ -386,6 +387,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
386
387
|
assert.deepEqual(res, {
|
|
387
388
|
correlationId: 'correlationId',
|
|
388
389
|
webexConferenceIdStr: 'webexConferenceIdStr1',
|
|
390
|
+
sessionCorrelationId: 'sessionCorrelationId',
|
|
389
391
|
globalMeetingId: 'globalMeetingId1',
|
|
390
392
|
deviceId: 'deviceUrl',
|
|
391
393
|
locusId: 'url',
|
|
@@ -608,6 +610,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
608
610
|
meeting: fakeMeeting,
|
|
609
611
|
mediaConnections: [{mediaAgentAlias: 'alias', mediaAgentGroupId: '1'}],
|
|
610
612
|
webexConferenceIdStr: undefined,
|
|
613
|
+
sessionCorrelationId: undefined,
|
|
611
614
|
globalMeetingId: undefined,
|
|
612
615
|
});
|
|
613
616
|
assert.notCalled(generateClientEventErrorPayloadSpy);
|
|
@@ -762,7 +765,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
762
765
|
]);
|
|
763
766
|
});
|
|
764
767
|
|
|
765
|
-
it('should submit client event successfully with correlationId, webexConferenceIdStr and globalMeetingId', () => {
|
|
768
|
+
it('should submit client event successfully with correlationId, webexConferenceIdStr, sessionCorrelationId, and globalMeetingId', () => {
|
|
766
769
|
const prepareDiagnosticEventSpy = sinon.spy(cd, 'prepareDiagnosticEvent');
|
|
767
770
|
const submitToCallDiagnosticsSpy = sinon.spy(cd, 'submitToCallDiagnostics');
|
|
768
771
|
const generateClientEventErrorPayloadSpy = sinon.spy(cd, 'generateClientEventErrorPayload');
|
|
@@ -773,6 +776,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
773
776
|
correlationId: 'correlationId',
|
|
774
777
|
webexConferenceIdStr: 'webexConferenceIdStr1',
|
|
775
778
|
globalMeetingId: 'globalMeetingId1',
|
|
779
|
+
sessionCorrelationId: 'sessionCorrelationId1'
|
|
776
780
|
};
|
|
777
781
|
|
|
778
782
|
cd.submitClientEvent({
|
|
@@ -784,6 +788,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
784
788
|
correlationId: 'correlationId',
|
|
785
789
|
webexConferenceIdStr: 'webexConferenceIdStr1',
|
|
786
790
|
globalMeetingId: 'globalMeetingId1',
|
|
791
|
+
sessionCorrelationId: 'sessionCorrelationId1',
|
|
787
792
|
preLoginId: undefined,
|
|
788
793
|
});
|
|
789
794
|
|
|
@@ -798,6 +803,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
798
803
|
identifiers: {
|
|
799
804
|
correlationId: 'correlationId',
|
|
800
805
|
webexConferenceIdStr: 'webexConferenceIdStr1',
|
|
806
|
+
sessionCorrelationId: 'sessionCorrelationId1',
|
|
801
807
|
globalMeetingId: 'globalMeetingId1',
|
|
802
808
|
deviceId: 'deviceUrl',
|
|
803
809
|
locusUrl: 'locus-url',
|
|
@@ -818,6 +824,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
818
824
|
identifiers: {
|
|
819
825
|
correlationId: 'correlationId',
|
|
820
826
|
webexConferenceIdStr: 'webexConferenceIdStr1',
|
|
827
|
+
sessionCorrelationId: 'sessionCorrelationId1',
|
|
821
828
|
globalMeetingId: 'globalMeetingId1',
|
|
822
829
|
deviceId: 'deviceUrl',
|
|
823
830
|
locusUrl: 'locus-url',
|
|
@@ -863,6 +870,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
863
870
|
webexConferenceIdStr: 'webexConferenceIdStr1',
|
|
864
871
|
globalMeetingId: 'globalMeetingId1',
|
|
865
872
|
preLoginId: 'myPreLoginId',
|
|
873
|
+
sessionCorrelationId: 'sessionCorrelationId1'
|
|
866
874
|
};
|
|
867
875
|
|
|
868
876
|
cd.submitClientEvent({
|
|
@@ -875,6 +883,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
875
883
|
webexConferenceIdStr: 'webexConferenceIdStr1',
|
|
876
884
|
globalMeetingId: 'globalMeetingId1',
|
|
877
885
|
preLoginId: 'myPreLoginId',
|
|
886
|
+
sessionCorrelationId: 'sessionCorrelationId1'
|
|
878
887
|
});
|
|
879
888
|
|
|
880
889
|
assert.notCalled(generateClientEventErrorPayloadSpy);
|
|
@@ -887,6 +896,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
887
896
|
},
|
|
888
897
|
identifiers: {
|
|
889
898
|
correlationId: 'correlationId',
|
|
899
|
+
sessionCorrelationId: 'sessionCorrelationId1',
|
|
890
900
|
webexConferenceIdStr: 'webexConferenceIdStr1',
|
|
891
901
|
globalMeetingId: 'globalMeetingId1',
|
|
892
902
|
deviceId: 'deviceUrl',
|
|
@@ -913,6 +923,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
913
923
|
canProceed: true,
|
|
914
924
|
identifiers: {
|
|
915
925
|
correlationId: 'correlationId',
|
|
926
|
+
sessionCorrelationId: 'sessionCorrelationId1',
|
|
916
927
|
userId: 'myPreLoginId',
|
|
917
928
|
deviceId: 'deviceUrl',
|
|
918
929
|
orgId: 'orgId',
|
|
@@ -1417,6 +1428,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
1417
1428
|
meetingId: fakeMeeting.id,
|
|
1418
1429
|
webexConferenceIdStr: 'webexConferenceIdStr1',
|
|
1419
1430
|
globalMeetingId: 'globalMeetingId1',
|
|
1431
|
+
sessionCorrelationId: 'sessionCorrelationId1'
|
|
1420
1432
|
};
|
|
1421
1433
|
|
|
1422
1434
|
cd.submitMQE({
|
|
@@ -73,6 +73,20 @@ describe('internal-plugin-metrics', () => {
|
|
|
73
73
|
sinon.restore();
|
|
74
74
|
})
|
|
75
75
|
|
|
76
|
+
it('lazy metrics backend initialization when checking if backend ready', () => {
|
|
77
|
+
assert.isUndefined(webex.internal.newMetrics.behavioralMetrics);
|
|
78
|
+
webex.internal.newMetrics.isReadyToSubmitBehavioralEvents();
|
|
79
|
+
assert.isDefined(webex.internal.newMetrics.behavioralMetrics);
|
|
80
|
+
|
|
81
|
+
assert.isUndefined(webex.internal.newMetrics.operationalMetrics);
|
|
82
|
+
webex.internal.newMetrics.isReadyToSubmitOperationalEvents();
|
|
83
|
+
assert.isDefined(webex.internal.newMetrics.operationalMetrics);
|
|
84
|
+
|
|
85
|
+
assert.isUndefined(webex.internal.newMetrics.businessMetrics)
|
|
86
|
+
webex.internal.newMetrics.isReadyToSubmitBusinessEvents();
|
|
87
|
+
assert.isDefined(webex.internal.newMetrics.businessMetrics);
|
|
88
|
+
})
|
|
89
|
+
|
|
76
90
|
it('submits Client Event successfully', () => {
|
|
77
91
|
webex.internal.newMetrics.submitClientEvent({
|
|
78
92
|
name: 'client.alert.displayed',
|