@webex/internal-plugin-metrics 3.8.1-next.2 → 3.8.1-next.4

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.
@@ -359,6 +359,24 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
359
359
  return undefined;
360
360
  }
361
361
 
362
+ /**
363
+ * Click To Interstitial With User Delay
364
+ * @returns - latency
365
+ */
366
+ }, {
367
+ key: "getClickToInterstitialWithUserDelay",
368
+ value: function getClickToInterstitialWithUserDelay() {
369
+ // for normal join (where green join button exists before interstitial, i.e reminder, space list etc)
370
+ if (this.latencyTimestamps.get('internal.client.meeting.click.joinbutton')) {
371
+ return this.getDiffBetweenTimestamps('internal.client.meeting.click.joinbutton', 'internal.client.meeting.interstitial-window.showed');
372
+ }
373
+ var clickToInterstitialWithUserDelayLatency = this.precomputedLatencies.get('internal.click.to.interstitial.with.user.delay');
374
+ if (typeof clickToInterstitialWithUserDelayLatency === 'number') {
375
+ return clickToInterstitialWithUserDelayLatency;
376
+ }
377
+ return undefined;
378
+ }
379
+
362
380
  /**
363
381
  * Interstitial To Join Ok
364
382
  * @returns - latency
@@ -413,6 +431,21 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
413
431
  return undefined;
414
432
  }
415
433
 
434
+ /**
435
+ * Total JMT With User Delay
436
+ * @returns - latency
437
+ */
438
+ }, {
439
+ key: "getTotalJMTWithUserDelay",
440
+ value: function getTotalJMTWithUserDelay() {
441
+ var clickToInterstitialWithUserDelay = this.getClickToInterstitialWithUserDelay();
442
+ var interstitialToJoinOk = this.getInterstitialToJoinOK();
443
+ if (typeof clickToInterstitialWithUserDelay === 'number' && typeof interstitialToJoinOk === 'number') {
444
+ return clickToInterstitialWithUserDelay + interstitialToJoinOk;
445
+ }
446
+ return undefined;
447
+ }
448
+
416
449
  /**
417
450
  * Join Conf JMT
418
451
  * @returns - latency
@@ -450,6 +483,22 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
450
483
  return undefined;
451
484
  }
452
485
 
486
+ /**
487
+ * Total Media JMT With User Delay
488
+ * @returns - latency
489
+ */
490
+ }, {
491
+ key: "getTotalMediaJMTWithUserDelay",
492
+ value: function getTotalMediaJMTWithUserDelay() {
493
+ var clickToInterstitialWithUserDelay = this.getClickToInterstitialWithUserDelay();
494
+ var interstitialToJoinOk = this.getInterstitialToJoinOK();
495
+ var joinConfJMT = this.getJoinConfJMT();
496
+ if (clickToInterstitialWithUserDelay && interstitialToJoinOk && joinConfJMT) {
497
+ return clickToInterstitialWithUserDelay + interstitialToJoinOk + joinConfJMT;
498
+ }
499
+ return undefined;
500
+ }
501
+
453
502
  /**
454
503
  * Client JMT
455
504
  * @returns - latency
@@ -1 +1 @@
1
- {"version":3,"names":["_webexCore","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","CallDiagnosticLatencies","exports","_WebexPlugin","_inherits2","_super","_this","_classCallCheck2","_len","length","args","Array","_key","concat","_defineProperty2","_assertThisInitialized2","latencyTimestamps","_map","precomputedLatencies","_createClass2","key","value","clearTimestamps","clear","setMeetingId","meetingId","getMeeting","webex","meetings","getBasicMeetingInformation","undefined","saveTimestamp","_ref","_ref$value","Date","getTime","_ref$options","options","saveFirstTimestampOnly","set","delete","saveLatency","accumulate","existingValue","get","measureLatency","callback","_this2","start","performance","now","finally","has","getDiffBetweenTimestamps","a","b","end","getMeetingInfoReqResp","getShowInterstitialTime","getU2CTime","u2cLatency","Math","floor","getRegisterWDMDeviceJMT","getCallInitJoinReq","getJoinReqResp","getTurnDiscoveryTime","getLocalSDPGenRemoteSDPRecv","getICESetupTime","getAudioICESetupTime","getVideoICESetupTime","getShareICESetupTime","getStayLobbyTime","getPageJMT","latency","getDownloadTimeJMT","getClickToInterstitial","clickToInterstitialLatency","getInterstitialToJoinOK","getCallInitMediaEngineReady","getInterstitialToMediaOKJMT","interstitialJoinClickTimestamp","connectedMedia","lobbyTimeLatency","lobbyTime","getTotalJMT","clickToInterstitial","interstitialToJoinOk","getJoinConfJMT","joinReqResp","ICESetupTime","getTotalMediaJMT","joinConfJMT","_this$getMeeting","totalMediaJMT","allowMediaInLobby","getClientJMT","getAudioJoinRespRxStart","getVideoJoinRespRxStart","getReachabilityClustersReqResp","reachablityClusterReqResp","getAudioJoinRespTxStart","getVideoJoinRespTxStart","getExchangeCITokenJMT","exchangeCITokenJMT","getRefreshCaptchaReqResp","refreshCaptchaReqResp","getDownloadIntelligenceModelsReqResp","downloadIntelligenceModelsReqResp","getOtherAppApiReqResp","otherAppApiJMT","WebexPlugin"],"sources":["call-diagnostic-metrics-latencies.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable valid-jsdoc */\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport {MetricEventNames, PreComputedLatencies} from '../metrics.types';\n\n// we only care about client event and feature event for now\n\n/**\n * @description Helper class to store latencies timestamp and to calculate various latencies for CA.\n * @exports\n * @class CallDiagnosticLatencies\n */\nexport default class CallDiagnosticLatencies extends WebexPlugin {\n latencyTimestamps: Map<MetricEventNames, number>;\n precomputedLatencies: Map<PreComputedLatencies, number>;\n // meetingId that the current latencies are for\n private meetingId?: string;\n\n /**\n * @constructor\n */\n constructor(...args) {\n super(...args);\n this.latencyTimestamps = new Map();\n this.precomputedLatencies = new Map();\n }\n\n /**\n * Clear timestamps\n */\n public clearTimestamps() {\n this.latencyTimestamps.clear();\n this.precomputedLatencies.clear();\n }\n\n /**\n * Associate current latencies with a meeting id\n * @param meetingId\n */\n private setMeetingId(meetingId: string) {\n this.meetingId = meetingId;\n }\n\n /**\n * Returns the meeting object associated with current latencies\n * @returns meeting object\n */\n private getMeeting() {\n if (this.meetingId) {\n // @ts-ignore\n return this.webex.meetings.getBasicMeetingInformation(this.meetingId);\n }\n\n return undefined;\n }\n\n /**\n * Store timestamp value\n * @param key - key\n * @param value - value\n * @param options - store options\n * @throws\n * @returns\n */\n public saveTimestamp({\n key,\n value = new Date().getTime(),\n options = {},\n }: {\n key: MetricEventNames;\n value?: number;\n options?: {meetingId?: string};\n }) {\n // save the meetingId so we can use the meeting object in latency calculations if needed\n const {meetingId} = options;\n if (meetingId) {\n this.setMeetingId(meetingId);\n }\n // for some events we're only interested in the first timestamp not last\n // as these events can happen multiple times\n if (\n key === 'client.media.rx.start' ||\n key === 'client.media.tx.start' ||\n key === 'internal.client.meetinginfo.request' ||\n key === 'internal.client.meetinginfo.response' ||\n key === 'client.media-engine.remote-sdp-received'\n ) {\n this.saveFirstTimestampOnly(key, value);\n } else {\n this.latencyTimestamps.set(key, value);\n // new offer/answer so reset the remote SDP timestamp\n if (key === 'client.media-engine.local-sdp-generated') {\n this.latencyTimestamps.delete('client.media-engine.remote-sdp-received');\n }\n }\n }\n\n /**\n * Store precomputed latency value\n * @param key - key\n * @param value - value\n * @param accumulate - when it is true, it overwrites existing value with sum of the current value and the new measurement otherwise just store the new measurement\n * @throws\n * @returns\n */\n public saveLatency(key: PreComputedLatencies, value: number, accumulate = false) {\n const existingValue = accumulate ? this.precomputedLatencies.get(key) || 0 : 0;\n this.precomputedLatencies.set(key, value + existingValue);\n }\n\n /**\n * Measure latency for a request\n * @param callback - callback for which you would like to measure latency\n * @param key - key\n * @param accumulate - when it is true, it overwrites existing value with sum of the current value and the new measurement otherwise just store the new measurement\n * @returns\n */\n public measureLatency(\n callback: () => Promise<unknown>,\n key: PreComputedLatencies,\n accumulate = false\n ) {\n const start = performance.now();\n\n return callback().finally(() => {\n this.saveLatency(key, performance.now() - start, accumulate);\n });\n }\n\n /**\n * Store only the first timestamp value for the given key\n * @param key - key\n * @param value -value\n * @throws\n * @returns\n */\n saveFirstTimestampOnly(key: MetricEventNames, value: number = new Date().getTime()) {\n if (this.latencyTimestamps.has(key)) {\n return;\n }\n this.latencyTimestamps.set(key, value);\n }\n\n /**\n * Helper to calculate end - start\n * @param a start\n * @param b end\n * @returns latency\n */\n public getDiffBetweenTimestamps(a: MetricEventNames, b: MetricEventNames) {\n const start = this.latencyTimestamps.get(a);\n const end = this.latencyTimestamps.get(b);\n\n if (typeof start === 'number' && typeof end === 'number') {\n return end - start;\n }\n\n return undefined;\n }\n\n /**\n * Meeting Info Request\n * @note Meeting Info request happen not just in the join phase. CA requires\n * metrics around meeting info request that are only part of join phase.\n * This internal.* event is used to track the real timestamps\n * (when the actual request/response happen). This is because the actual CA event is\n * sent inside the join method on the meeting object based on some logic, but that's not exactly when\n * those events are actually fired. The logic only confirms that they have happened, and we send them over.\n * @returns - latency\n */\n public getMeetingInfoReqResp() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meetinginfo.request',\n 'internal.client.meetinginfo.response'\n );\n }\n\n /**\n * Interstitial Time\n * @returns - latency\n */\n public getShowInterstitialTime() {\n return this.getDiffBetweenTimestamps(\n 'client.interstitial-window.start-launch',\n 'internal.client.interstitial-window.click.joinbutton'\n );\n }\n\n /**\n * getU2CTime\n * @returns - latency\n */\n public getU2CTime() {\n const u2cLatency = this.precomputedLatencies.get('internal.get.u2c.time');\n\n return typeof u2cLatency === 'number' ? Math.floor(u2cLatency) : undefined;\n }\n\n /**\n * Device Register Time\n * @returns - latency\n */\n public getRegisterWDMDeviceJMT() {\n return this.getDiffBetweenTimestamps(\n 'internal.register.device.request',\n 'internal.register.device.response'\n );\n }\n\n /**\n * Call Init Join Request\n * @returns - latency\n */\n public getCallInitJoinReq() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.locus.join.request'\n );\n }\n\n /**\n * Locus Join Request\n * @returns - latency\n */\n public getJoinReqResp() {\n return this.getDiffBetweenTimestamps('client.locus.join.request', 'client.locus.join.response');\n }\n\n /**\n * Time taken to do turn discovery\n * @returns - latency\n */\n public getTurnDiscoveryTime() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.add-media.turn-discovery.start',\n 'internal.client.add-media.turn-discovery.end'\n );\n }\n\n /**\n * Local SDP Generated Remote SDP REceived\n * @returns - latency\n */\n public getLocalSDPGenRemoteSDPRecv() {\n return this.getDiffBetweenTimestamps(\n 'client.media-engine.local-sdp-generated',\n 'client.media-engine.remote-sdp-received'\n );\n }\n\n /**\n * ICE Setup Time\n * @returns - latency\n */\n public getICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Audio ICE time\n * @returns - latency\n */\n public getAudioICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Video ICE Time\n * @returns - latency\n */\n public getVideoICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Share ICE Time\n * @returns - latency\n */\n public getShareICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Stay Lobby Time\n * @returns - latency\n */\n public getStayLobbyTime() {\n return this.getDiffBetweenTimestamps(\n 'client.locus.join.response',\n 'internal.host.meeting.participant.admitted'\n );\n }\n\n /**\n * Page JMT\n * @returns - latency\n */\n public getPageJMT() {\n const latency = this.precomputedLatencies.get('internal.client.pageJMT');\n\n return typeof latency === 'number' ? latency : undefined;\n }\n\n /**\n * Download Time JMT\n * @returns - latency\n */\n public getDownloadTimeJMT() {\n const latency = this.precomputedLatencies.get('internal.download.time');\n\n return typeof latency === 'number' ? latency : undefined;\n }\n\n /**\n * Click To Interstitial\n * @returns - latency\n */\n public getClickToInterstitial() {\n // for normal join (where green join button exists before interstitial, i.e reminder, space list etc)\n if (this.latencyTimestamps.get('internal.client.meeting.click.joinbutton')) {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meeting.click.joinbutton',\n 'internal.client.meeting.interstitial-window.showed'\n );\n }\n\n const clickToInterstitialLatency = this.precomputedLatencies.get(\n 'internal.click.to.interstitial'\n );\n\n if (typeof clickToInterstitialLatency === 'number') {\n return clickToInterstitialLatency;\n }\n\n return undefined;\n }\n\n /**\n * Interstitial To Join Ok\n * @returns - latency\n */\n public getInterstitialToJoinOK() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.locus.join.response'\n );\n }\n\n /**\n * Call Init To MediaEngineReady\n * @returns - latency\n */\n public getCallInitMediaEngineReady() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.media-engine.ready'\n );\n }\n\n /**\n * Interstitial To Media Ok\n * @returns - latency\n */\n public getInterstitialToMediaOKJMT() {\n const interstitialJoinClickTimestamp = this.latencyTimestamps.get(\n 'internal.client.interstitial-window.click.joinbutton'\n );\n\n // get the first timestamp\n const connectedMedia = this.latencyTimestamps.get('client.ice.end');\n\n const lobbyTimeLatency = this.getStayLobbyTime();\n const lobbyTime = typeof lobbyTimeLatency === 'number' ? lobbyTimeLatency : 0;\n\n if (interstitialJoinClickTimestamp && connectedMedia) {\n return connectedMedia - interstitialJoinClickTimestamp - lobbyTime;\n }\n\n return undefined;\n }\n\n /**\n * Total JMT\n * @returns - latency\n */\n public getTotalJMT() {\n const clickToInterstitial = this.getClickToInterstitial();\n const interstitialToJoinOk = this.getInterstitialToJoinOK();\n\n if (typeof clickToInterstitial === 'number' && typeof interstitialToJoinOk === 'number') {\n return clickToInterstitial + interstitialToJoinOk;\n }\n\n return undefined;\n }\n\n /**\n * Join Conf JMT\n * @returns - latency\n */\n public getJoinConfJMT() {\n const joinReqResp = this.getJoinReqResp();\n const ICESetupTime = this.getICESetupTime();\n\n if (joinReqResp && ICESetupTime) {\n return joinReqResp + ICESetupTime;\n }\n\n return undefined;\n }\n\n /**\n * Total Media JMT\n * @returns - latency\n */\n public getTotalMediaJMT() {\n const clickToInterstitial = this.getClickToInterstitial();\n const interstitialToJoinOk = this.getInterstitialToJoinOK();\n const joinConfJMT = this.getJoinConfJMT();\n const lobbyTime = this.getStayLobbyTime();\n\n if (clickToInterstitial && interstitialToJoinOk && joinConfJMT) {\n const totalMediaJMT = clickToInterstitial + interstitialToJoinOk + joinConfJMT;\n if (this.getMeeting()?.allowMediaInLobby) {\n return totalMediaJMT;\n }\n\n return totalMediaJMT - lobbyTime;\n }\n\n return undefined;\n }\n\n /**\n * Client JMT\n * @returns - latency\n */\n public getClientJMT() {\n const interstitialToJoinOk = this.getInterstitialToJoinOK();\n const joinConfJMT = this.getJoinConfJMT();\n\n if (typeof interstitialToJoinOk === 'number' && typeof joinConfJMT === 'number') {\n return interstitialToJoinOk - joinConfJMT;\n }\n\n return undefined;\n }\n\n /**\n * Audio setup delay receive\n */\n public getAudioJoinRespRxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.rx.start');\n }\n\n /**\n * Video setup delay receive\n */\n public getVideoJoinRespRxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.rx.start');\n }\n\n /**\n * Total latency for all get cluster request.\n */\n public getReachabilityClustersReqResp() {\n const reachablityClusterReqResp = this.precomputedLatencies.get('internal.get.cluster.time');\n\n return typeof reachablityClusterReqResp === 'number'\n ? Math.floor(reachablityClusterReqResp)\n : undefined;\n }\n\n /**\n * Audio setup delay transmit\n */\n public getAudioJoinRespTxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.tx.start');\n }\n\n /**\n * Video setup delay transmit\n */\n public getVideoJoinRespTxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.tx.start');\n }\n\n /**\n * Total latency for all exchange ci token.\n */\n public getExchangeCITokenJMT() {\n const exchangeCITokenJMT = this.precomputedLatencies.get('internal.exchange.ci.token.time');\n\n return typeof exchangeCITokenJMT === 'number' ? Math.floor(exchangeCITokenJMT) : undefined;\n }\n\n /**\n * Total latency for all refresh captcha requests.\n */\n public getRefreshCaptchaReqResp() {\n const refreshCaptchaReqResp = this.precomputedLatencies.get('internal.refresh.captcha.time');\n\n return typeof refreshCaptchaReqResp === 'number'\n ? Math.floor(refreshCaptchaReqResp)\n : undefined;\n }\n\n /**\n * Get the latency for downloading intelligence models.\n * @returns - latency\n */\n public getDownloadIntelligenceModelsReqResp() {\n const downloadIntelligenceModelsReqResp = this.precomputedLatencies.get(\n 'internal.api.fetch.intelligence.models'\n );\n\n return typeof downloadIntelligenceModelsReqResp === 'number'\n ? Math.floor(downloadIntelligenceModelsReqResp)\n : undefined;\n }\n\n /**\n * Get the total latency for all other app API requests.\n * Excludes meeting info, because it's measured separately.\n * @returns - latency\n */\n public getOtherAppApiReqResp() {\n const otherAppApiJMT = this.precomputedLatencies.get('internal.other.app.api.time');\n\n return otherAppApiJMT > 0 ? Math.floor(otherAppApiJMT) : undefined;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAEA,IAAAA,UAAA,GAAAC,OAAA;AAA8C,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,sBAF9C,4CACA;AAKA;AAEA;AACA;AACA;AACA;AACA;AAJA,IAKqBC,uBAAuB,GAAAC,OAAA,CAAAjB,OAAA,0BAAAkB,YAAA;EAAA,IAAAC,UAAA,CAAAnB,OAAA,EAAAgB,uBAAA,EAAAE,YAAA;EAAA,IAAAE,MAAA,GAAA3B,YAAA,CAAAuB,uBAAA;EAM1C;AACF;AACA;EACE,SAAAA,wBAAA,EAAqB;IAAA,IAAAK,KAAA;IAAA,IAAAC,gBAAA,CAAAtB,OAAA,QAAAgB,uBAAA;IAAA,SAAAO,IAAA,GAAAlB,SAAA,CAAAmB,MAAA,EAANC,IAAI,OAAAC,KAAA,CAAAH,IAAA,GAAAI,IAAA,MAAAA,IAAA,GAAAJ,IAAA,EAAAI,IAAA;MAAJF,IAAI,CAAAE,IAAA,IAAAtB,SAAA,CAAAsB,IAAA;IAAA;IACjBN,KAAA,GAAAD,MAAA,CAAAN,IAAA,CAAAR,KAAA,CAAAc,MAAA,SAAAQ,MAAA,CAASH,IAAI;IAAE,IAAAI,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA;IAAA,IAAAQ,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA;IAPjB;IAAA,IAAAQ,gBAAA,CAAA7B,OAAA,MAAA8B,uBAAA,CAAA9B,OAAA,EAAAqB,KAAA;IAQEA,KAAA,CAAKU,iBAAiB,GAAG,IAAAC,IAAA,CAAAhC,OAAA,CAAQ,CAAC;IAClCqB,KAAA,CAAKY,oBAAoB,GAAG,IAAAD,IAAA,CAAAhC,OAAA,CAAQ,CAAC;IAAC,OAAAqB,KAAA;EACxC;;EAEA;AACF;AACA;EAFE,IAAAa,aAAA,CAAAlC,OAAA,EAAAgB,uBAAA;IAAAmB,GAAA;IAAAC,KAAA,EAGA,SAAAC,gBAAA,EAAyB;MACvB,IAAI,CAACN,iBAAiB,CAACO,KAAK,CAAC,CAAC;MAC9B,IAAI,CAACL,oBAAoB,CAACK,KAAK,CAAC,CAAC;IACnC;;IAEA;AACF;AACA;AACA;EAHE;IAAAH,GAAA;IAAAC,KAAA,EAIA,SAAAG,aAAqBC,SAAiB,EAAE;MACtC,IAAI,CAACA,SAAS,GAAGA,SAAS;IAC5B;;IAEA;AACF;AACA;AACA;EAHE;IAAAL,GAAA;IAAAC,KAAA,EAIA,SAAAK,WAAA,EAAqB;MACnB,IAAI,IAAI,CAACD,SAAS,EAAE;QAClB;QACA,OAAO,IAAI,CAACE,KAAK,CAACC,QAAQ,CAACC,0BAA0B,CAAC,IAAI,CAACJ,SAAS,CAAC;MACvE;MAEA,OAAOK,SAAS;IAClB;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAAV,GAAA;IAAAC,KAAA,EAQA,SAAAU,cAAAC,IAAA,EAQG;MAAA,IAPDZ,GAAG,GAAAY,IAAA,CAAHZ,GAAG;QAAAa,UAAA,GAAAD,IAAA,CACHX,KAAK;QAALA,KAAK,GAAAY,UAAA,cAAG,IAAIC,IAAI,CAAC,CAAC,CAACC,OAAO,CAAC,CAAC,GAAAF,UAAA;QAAAG,YAAA,GAAAJ,IAAA,CAC5BK,OAAO;QAAPA,OAAO,GAAAD,YAAA,cAAG,CAAC,CAAC,GAAAA,YAAA;MAMZ;MACA,IAAOX,SAAS,GAAIY,OAAO,CAApBZ,SAAS;MAChB,IAAIA,SAAS,EAAE;QACb,IAAI,CAACD,YAAY,CAACC,SAAS,CAAC;MAC9B;MACA;MACA;MACA,IACEL,GAAG,KAAK,uBAAuB,IAC/BA,GAAG,KAAK,uBAAuB,IAC/BA,GAAG,KAAK,qCAAqC,IAC7CA,GAAG,KAAK,sCAAsC,IAC9CA,GAAG,KAAK,yCAAyC,EACjD;QACA,IAAI,CAACkB,sBAAsB,CAAClB,GAAG,EAAEC,KAAK,CAAC;MACzC,CAAC,MAAM;QACL,IAAI,CAACL,iBAAiB,CAACuB,GAAG,CAACnB,GAAG,EAAEC,KAAK,CAAC;QACtC;QACA,IAAID,GAAG,KAAK,yCAAyC,EAAE;UACrD,IAAI,CAACJ,iBAAiB,CAACwB,MAAM,CAAC,yCAAyC,CAAC;QAC1E;MACF;IACF;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAApB,GAAA;IAAAC,KAAA,EAQA,SAAAoB,YAAmBrB,GAAyB,EAAEC,KAAa,EAAsB;MAAA,IAApBqB,UAAU,GAAApD,SAAA,CAAAmB,MAAA,QAAAnB,SAAA,QAAAwC,SAAA,GAAAxC,SAAA,MAAG,KAAK;MAC7E,IAAMqD,aAAa,GAAGD,UAAU,GAAG,IAAI,CAACxB,oBAAoB,CAAC0B,GAAG,CAACxB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC;MAC9E,IAAI,CAACF,oBAAoB,CAACqB,GAAG,CAACnB,GAAG,EAAEC,KAAK,GAAGsB,aAAa,CAAC;IAC3D;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAAvB,GAAA;IAAAC,KAAA,EAOA,SAAAwB,eACEC,QAAgC,EAChC1B,GAAyB,EAEzB;MAAA,IAAA2B,MAAA;MAAA,IADAL,UAAU,GAAApD,SAAA,CAAAmB,MAAA,QAAAnB,SAAA,QAAAwC,SAAA,GAAAxC,SAAA,MAAG,KAAK;MAElB,IAAM0D,KAAK,GAAGC,WAAW,CAACC,GAAG,CAAC,CAAC;MAE/B,OAAOJ,QAAQ,CAAC,CAAC,CAACK,OAAO,CAAC,YAAM;QAC9BJ,MAAI,CAACN,WAAW,CAACrB,GAAG,EAAE6B,WAAW,CAACC,GAAG,CAAC,CAAC,GAAGF,KAAK,EAAEN,UAAU,CAAC;MAC9D,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAAtB,GAAA;IAAAC,KAAA,EAOA,SAAAiB,uBAAuBlB,GAAqB,EAAwC;MAAA,IAAtCC,KAAa,GAAA/B,SAAA,CAAAmB,MAAA,QAAAnB,SAAA,QAAAwC,SAAA,GAAAxC,SAAA,MAAG,IAAI4C,IAAI,CAAC,CAAC,CAACC,OAAO,CAAC,CAAC;MAChF,IAAI,IAAI,CAACnB,iBAAiB,CAACoC,GAAG,CAAChC,GAAG,CAAC,EAAE;QACnC;MACF;MACA,IAAI,CAACJ,iBAAiB,CAACuB,GAAG,CAACnB,GAAG,EAAEC,KAAK,CAAC;IACxC;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAD,GAAA;IAAAC,KAAA,EAMA,SAAAgC,yBAAgCC,CAAmB,EAAEC,CAAmB,EAAE;MACxE,IAAMP,KAAK,GAAG,IAAI,CAAChC,iBAAiB,CAAC4B,GAAG,CAACU,CAAC,CAAC;MAC3C,IAAME,GAAG,GAAG,IAAI,CAACxC,iBAAiB,CAAC4B,GAAG,CAACW,CAAC,CAAC;MAEzC,IAAI,OAAOP,KAAK,KAAK,QAAQ,IAAI,OAAOQ,GAAG,KAAK,QAAQ,EAAE;QACxD,OAAOA,GAAG,GAAGR,KAAK;MACpB;MAEA,OAAOlB,SAAS;IAClB;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EATE;IAAAV,GAAA;IAAAC,KAAA,EAUA,SAAAoC,sBAAA,EAA+B;MAC7B,OAAO,IAAI,CAACJ,wBAAwB,CAClC,qCAAqC,EACrC,sCACF,CAAC;IACH;;IAEA;AACF;AACA;AACA;EAHE;IAAAjC,GAAA;IAAAC,KAAA,EAIA,SAAAqC,wBAAA,EAAiC;MAC/B,OAAO,IAAI,CAACL,wBAAwB,CAClC,yCAAyC,EACzC,sDACF,CAAC;IACH;;IAEA;AACF;AACA;AACA;EAHE;IAAAjC,GAAA;IAAAC,KAAA,EAIA,SAAAsC,WAAA,EAAoB;MAClB,IAAMC,UAAU,GAAG,IAAI,CAAC1C,oBAAoB,CAAC0B,GAAG,CAAC,uBAAuB,CAAC;MAEzE,OAAO,OAAOgB,UAAU,KAAK,QAAQ,GAAGC,IAAI,CAACC,KAAK,CAACF,UAAU,CAAC,GAAG9B,SAAS;IAC5E;;IAEA;AACF;AACA;AACA;EAHE;IAAAV,GAAA;IAAAC,KAAA,EAIA,SAAA0C,wBAAA,EAAiC;MAC/B,OAAO,IAAI,CAACV,wBAAwB,CAClC,kCAAkC,EAClC,mCACF,CAAC;IACH;;IAEA;AACF;AACA;AACA;EAHE;IAAAjC,GAAA;IAAAC,KAAA,EAIA,SAAA2C,mBAAA,EAA4B;MAC1B,OAAO,IAAI,CAACX,wBAAwB,CAClC,sDAAsD,EACtD,2BACF,CAAC;IACH;;IAEA;AACF;AACA;AACA;EAHE;IAAAjC,GAAA;IAAAC,KAAA,EAIA,SAAA4C,eAAA,EAAwB;MACtB,OAAO,IAAI,CAACZ,wBAAwB,CAAC,2BAA2B,EAAE,4BAA4B,CAAC;IACjG;;IAEA;AACF;AACA;AACA;EAHE;IAAAjC,GAAA;IAAAC,KAAA,EAIA,SAAA6C,qBAAA,EAA8B;MAC5B,OAAO,IAAI,CAACb,wBAAwB,CAClC,gDAAgD,EAChD,8CACF,CAAC;IACH;;IAEA;AACF;AACA;AACA;EAHE;IAAAjC,GAAA;IAAAC,KAAA,EAIA,SAAA8C,4BAAA,EAAqC;MACnC,OAAO,IAAI,CAACd,wBAAwB,CAClC,yCAAyC,EACzC,yCACF,CAAC;IACH;;IAEA;AACF;AACA;AACA;EAHE;IAAAjC,GAAA;IAAAC,KAAA,EAIA,SAAA+C,gBAAA,EAAyB;MACvB,OAAO,IAAI,CAACf,wBAAwB,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;IAC5E;;IAEA;AACF;AACA;AACA;EAHE;IAAAjC,GAAA;IAAAC,KAAA,EAIA,SAAAgD,qBAAA,EAA8B;MAC5B,OAAO,IAAI,CAAChB,wBAAwB,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;IAC5E;;IAEA;AACF;AACA;AACA;EAHE;IAAAjC,GAAA;IAAAC,KAAA,EAIA,SAAAiD,qBAAA,EAA8B;MAC5B,OAAO,IAAI,CAACjB,wBAAwB,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;IAC5E;;IAEA;AACF;AACA;AACA;EAHE;IAAAjC,GAAA;IAAAC,KAAA,EAIA,SAAAkD,qBAAA,EAA8B;MAC5B,OAAO,IAAI,CAAClB,wBAAwB,CAAC,kBAAkB,EAAE,gBAAgB,CAAC;IAC5E;;IAEA;AACF;AACA;AACA;EAHE;IAAAjC,GAAA;IAAAC,KAAA,EAIA,SAAAmD,iBAAA,EAA0B;MACxB,OAAO,IAAI,CAACnB,wBAAwB,CAClC,4BAA4B,EAC5B,4CACF,CAAC;IACH;;IAEA;AACF;AACA;AACA;EAHE;IAAAjC,GAAA;IAAAC,KAAA,EAIA,SAAAoD,WAAA,EAAoB;MAClB,IAAMC,OAAO,GAAG,IAAI,CAACxD,oBAAoB,CAAC0B,GAAG,CAAC,yBAAyB,CAAC;MAExE,OAAO,OAAO8B,OAAO,KAAK,QAAQ,GAAGA,OAAO,GAAG5C,SAAS;IAC1D;;IAEA;AACF;AACA;AACA;EAHE;IAAAV,GAAA;IAAAC,KAAA,EAIA,SAAAsD,mBAAA,EAA4B;MAC1B,IAAMD,OAAO,GAAG,IAAI,CAACxD,oBAAoB,CAAC0B,GAAG,CAAC,wBAAwB,CAAC;MAEvE,OAAO,OAAO8B,OAAO,KAAK,QAAQ,GAAGA,OAAO,GAAG5C,SAAS;IAC1D;;IAEA;AACF;AACA;AACA;EAHE;IAAAV,GAAA;IAAAC,KAAA,EAIA,SAAAuD,uBAAA,EAAgC;MAC9B;MACA,IAAI,IAAI,CAAC5D,iBAAiB,CAAC4B,GAAG,CAAC,0CAA0C,CAAC,EAAE;QAC1E,OAAO,IAAI,CAACS,wBAAwB,CAClC,0CAA0C,EAC1C,oDACF,CAAC;MACH;MAEA,IAAMwB,0BAA0B,GAAG,IAAI,CAAC3D,oBAAoB,CAAC0B,GAAG,CAC9D,gCACF,CAAC;MAED,IAAI,OAAOiC,0BAA0B,KAAK,QAAQ,EAAE;QAClD,OAAOA,0BAA0B;MACnC;MAEA,OAAO/C,SAAS;IAClB;;IAEA;AACF;AACA;AACA;EAHE;IAAAV,GAAA;IAAAC,KAAA,EAIA,SAAAyD,wBAAA,EAAiC;MAC/B,OAAO,IAAI,CAACzB,wBAAwB,CAClC,sDAAsD,EACtD,4BACF,CAAC;IACH;;IAEA;AACF;AACA;AACA;EAHE;IAAAjC,GAAA;IAAAC,KAAA,EAIA,SAAA0D,4BAAA,EAAqC;MACnC,OAAO,IAAI,CAAC1B,wBAAwB,CAClC,sDAAsD,EACtD,2BACF,CAAC;IACH;;IAEA;AACF;AACA;AACA;EAHE;IAAAjC,GAAA;IAAAC,KAAA,EAIA,SAAA2D,4BAAA,EAAqC;MACnC,IAAMC,8BAA8B,GAAG,IAAI,CAACjE,iBAAiB,CAAC4B,GAAG,CAC/D,sDACF,CAAC;;MAED;MACA,IAAMsC,cAAc,GAAG,IAAI,CAAClE,iBAAiB,CAAC4B,GAAG,CAAC,gBAAgB,CAAC;MAEnE,IAAMuC,gBAAgB,GAAG,IAAI,CAACX,gBAAgB,CAAC,CAAC;MAChD,IAAMY,SAAS,GAAG,OAAOD,gBAAgB,KAAK,QAAQ,GAAGA,gBAAgB,GAAG,CAAC;MAE7E,IAAIF,8BAA8B,IAAIC,cAAc,EAAE;QACpD,OAAOA,cAAc,GAAGD,8BAA8B,GAAGG,SAAS;MACpE;MAEA,OAAOtD,SAAS;IAClB;;IAEA;AACF;AACA;AACA;EAHE;IAAAV,GAAA;IAAAC,KAAA,EAIA,SAAAgE,YAAA,EAAqB;MACnB,IAAMC,mBAAmB,GAAG,IAAI,CAACV,sBAAsB,CAAC,CAAC;MACzD,IAAMW,oBAAoB,GAAG,IAAI,CAACT,uBAAuB,CAAC,CAAC;MAE3D,IAAI,OAAOQ,mBAAmB,KAAK,QAAQ,IAAI,OAAOC,oBAAoB,KAAK,QAAQ,EAAE;QACvF,OAAOD,mBAAmB,GAAGC,oBAAoB;MACnD;MAEA,OAAOzD,SAAS;IAClB;;IAEA;AACF;AACA;AACA;EAHE;IAAAV,GAAA;IAAAC,KAAA,EAIA,SAAAmE,eAAA,EAAwB;MACtB,IAAMC,WAAW,GAAG,IAAI,CAACxB,cAAc,CAAC,CAAC;MACzC,IAAMyB,YAAY,GAAG,IAAI,CAACtB,eAAe,CAAC,CAAC;MAE3C,IAAIqB,WAAW,IAAIC,YAAY,EAAE;QAC/B,OAAOD,WAAW,GAAGC,YAAY;MACnC;MAEA,OAAO5D,SAAS;IAClB;;IAEA;AACF;AACA;AACA;EAHE;IAAAV,GAAA;IAAAC,KAAA,EAIA,SAAAsE,iBAAA,EAA0B;MACxB,IAAML,mBAAmB,GAAG,IAAI,CAACV,sBAAsB,CAAC,CAAC;MACzD,IAAMW,oBAAoB,GAAG,IAAI,CAACT,uBAAuB,CAAC,CAAC;MAC3D,IAAMc,WAAW,GAAG,IAAI,CAACJ,cAAc,CAAC,CAAC;MACzC,IAAMJ,SAAS,GAAG,IAAI,CAACZ,gBAAgB,CAAC,CAAC;MAEzC,IAAIc,mBAAmB,IAAIC,oBAAoB,IAAIK,WAAW,EAAE;QAAA,IAAAC,gBAAA;QAC9D,IAAMC,aAAa,GAAGR,mBAAmB,GAAGC,oBAAoB,GAAGK,WAAW;QAC9E,KAAAC,gBAAA,GAAI,IAAI,CAACnE,UAAU,CAAC,CAAC,cAAAmE,gBAAA,eAAjBA,gBAAA,CAAmBE,iBAAiB,EAAE;UACxC,OAAOD,aAAa;QACtB;QAEA,OAAOA,aAAa,GAAGV,SAAS;MAClC;MAEA,OAAOtD,SAAS;IAClB;;IAEA;AACF;AACA;AACA;EAHE;IAAAV,GAAA;IAAAC,KAAA,EAIA,SAAA2E,aAAA,EAAsB;MACpB,IAAMT,oBAAoB,GAAG,IAAI,CAACT,uBAAuB,CAAC,CAAC;MAC3D,IAAMc,WAAW,GAAG,IAAI,CAACJ,cAAc,CAAC,CAAC;MAEzC,IAAI,OAAOD,oBAAoB,KAAK,QAAQ,IAAI,OAAOK,WAAW,KAAK,QAAQ,EAAE;QAC/E,OAAOL,oBAAoB,GAAGK,WAAW;MAC3C;MAEA,OAAO9D,SAAS;IAClB;;IAEA;AACF;AACA;EAFE;IAAAV,GAAA;IAAAC,KAAA,EAGA,SAAA4E,wBAAA,EAAiC;MAC/B,OAAO,IAAI,CAAC5C,wBAAwB,CAAC,4BAA4B,EAAE,uBAAuB,CAAC;IAC7F;;IAEA;AACF;AACA;EAFE;IAAAjC,GAAA;IAAAC,KAAA,EAGA,SAAA6E,wBAAA,EAAiC;MAC/B,OAAO,IAAI,CAAC7C,wBAAwB,CAAC,4BAA4B,EAAE,uBAAuB,CAAC;IAC7F;;IAEA;AACF;AACA;EAFE;IAAAjC,GAAA;IAAAC,KAAA,EAGA,SAAA8E,+BAAA,EAAwC;MACtC,IAAMC,yBAAyB,GAAG,IAAI,CAAClF,oBAAoB,CAAC0B,GAAG,CAAC,2BAA2B,CAAC;MAE5F,OAAO,OAAOwD,yBAAyB,KAAK,QAAQ,GAChDvC,IAAI,CAACC,KAAK,CAACsC,yBAAyB,CAAC,GACrCtE,SAAS;IACf;;IAEA;AACF;AACA;EAFE;IAAAV,GAAA;IAAAC,KAAA,EAGA,SAAAgF,wBAAA,EAAiC;MAC/B,OAAO,IAAI,CAAChD,wBAAwB,CAAC,4BAA4B,EAAE,uBAAuB,CAAC;IAC7F;;IAEA;AACF;AACA;EAFE;IAAAjC,GAAA;IAAAC,KAAA,EAGA,SAAAiF,wBAAA,EAAiC;MAC/B,OAAO,IAAI,CAACjD,wBAAwB,CAAC,4BAA4B,EAAE,uBAAuB,CAAC;IAC7F;;IAEA;AACF;AACA;EAFE;IAAAjC,GAAA;IAAAC,KAAA,EAGA,SAAAkF,sBAAA,EAA+B;MAC7B,IAAMC,kBAAkB,GAAG,IAAI,CAACtF,oBAAoB,CAAC0B,GAAG,CAAC,iCAAiC,CAAC;MAE3F,OAAO,OAAO4D,kBAAkB,KAAK,QAAQ,GAAG3C,IAAI,CAACC,KAAK,CAAC0C,kBAAkB,CAAC,GAAG1E,SAAS;IAC5F;;IAEA;AACF;AACA;EAFE;IAAAV,GAAA;IAAAC,KAAA,EAGA,SAAAoF,yBAAA,EAAkC;MAChC,IAAMC,qBAAqB,GAAG,IAAI,CAACxF,oBAAoB,CAAC0B,GAAG,CAAC,+BAA+B,CAAC;MAE5F,OAAO,OAAO8D,qBAAqB,KAAK,QAAQ,GAC5C7C,IAAI,CAACC,KAAK,CAAC4C,qBAAqB,CAAC,GACjC5E,SAAS;IACf;;IAEA;AACF;AACA;AACA;EAHE;IAAAV,GAAA;IAAAC,KAAA,EAIA,SAAAsF,qCAAA,EAA8C;MAC5C,IAAMC,iCAAiC,GAAG,IAAI,CAAC1F,oBAAoB,CAAC0B,GAAG,CACrE,wCACF,CAAC;MAED,OAAO,OAAOgE,iCAAiC,KAAK,QAAQ,GACxD/C,IAAI,CAACC,KAAK,CAAC8C,iCAAiC,CAAC,GAC7C9E,SAAS;IACf;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAV,GAAA;IAAAC,KAAA,EAKA,SAAAwF,sBAAA,EAA+B;MAC7B,IAAMC,cAAc,GAAG,IAAI,CAAC5F,oBAAoB,CAAC0B,GAAG,CAAC,6BAA6B,CAAC;MAEnF,OAAOkE,cAAc,GAAG,CAAC,GAAGjD,IAAI,CAACC,KAAK,CAACgD,cAAc,CAAC,GAAGhF,SAAS;IACpE;EAAC;EAAA,OAAA7B,uBAAA;AAAA,EAtgBkD8G,sBAAW"}
1
+ {"version":3,"names":["_webexCore","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","CallDiagnosticLatencies","exports","_WebexPlugin","_inherits2","_super","_this","_classCallCheck2","_len","length","args","Array","_key","concat","_defineProperty2","_assertThisInitialized2","latencyTimestamps","_map","precomputedLatencies","_createClass2","key","value","clearTimestamps","clear","setMeetingId","meetingId","getMeeting","webex","meetings","getBasicMeetingInformation","undefined","saveTimestamp","_ref","_ref$value","Date","getTime","_ref$options","options","saveFirstTimestampOnly","set","delete","saveLatency","accumulate","existingValue","get","measureLatency","callback","_this2","start","performance","now","finally","has","getDiffBetweenTimestamps","a","b","end","getMeetingInfoReqResp","getShowInterstitialTime","getU2CTime","u2cLatency","Math","floor","getRegisterWDMDeviceJMT","getCallInitJoinReq","getJoinReqResp","getTurnDiscoveryTime","getLocalSDPGenRemoteSDPRecv","getICESetupTime","getAudioICESetupTime","getVideoICESetupTime","getShareICESetupTime","getStayLobbyTime","getPageJMT","latency","getDownloadTimeJMT","getClickToInterstitial","clickToInterstitialLatency","getClickToInterstitialWithUserDelay","clickToInterstitialWithUserDelayLatency","getInterstitialToJoinOK","getCallInitMediaEngineReady","getInterstitialToMediaOKJMT","interstitialJoinClickTimestamp","connectedMedia","lobbyTimeLatency","lobbyTime","getTotalJMT","clickToInterstitial","interstitialToJoinOk","getTotalJMTWithUserDelay","clickToInterstitialWithUserDelay","getJoinConfJMT","joinReqResp","ICESetupTime","getTotalMediaJMT","joinConfJMT","_this$getMeeting","totalMediaJMT","allowMediaInLobby","getTotalMediaJMTWithUserDelay","getClientJMT","getAudioJoinRespRxStart","getVideoJoinRespRxStart","getReachabilityClustersReqResp","reachablityClusterReqResp","getAudioJoinRespTxStart","getVideoJoinRespTxStart","getExchangeCITokenJMT","exchangeCITokenJMT","getRefreshCaptchaReqResp","refreshCaptchaReqResp","getDownloadIntelligenceModelsReqResp","downloadIntelligenceModelsReqResp","getOtherAppApiReqResp","otherAppApiJMT","WebexPlugin"],"sources":["call-diagnostic-metrics-latencies.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable valid-jsdoc */\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport {MetricEventNames, PreComputedLatencies} from '../metrics.types';\n\n// we only care about client event and feature event for now\n\n/**\n * @description Helper class to store latencies timestamp and to calculate various latencies for CA.\n * @exports\n * @class CallDiagnosticLatencies\n */\nexport default class CallDiagnosticLatencies extends WebexPlugin {\n latencyTimestamps: Map<MetricEventNames, number>;\n precomputedLatencies: Map<PreComputedLatencies, number>;\n // meetingId that the current latencies are for\n private meetingId?: string;\n\n /**\n * @constructor\n */\n constructor(...args) {\n super(...args);\n this.latencyTimestamps = new Map();\n this.precomputedLatencies = new Map();\n }\n\n /**\n * Clear timestamps\n */\n public clearTimestamps() {\n this.latencyTimestamps.clear();\n this.precomputedLatencies.clear();\n }\n\n /**\n * Associate current latencies with a meeting id\n * @param meetingId\n */\n private setMeetingId(meetingId: string) {\n this.meetingId = meetingId;\n }\n\n /**\n * Returns the meeting object associated with current latencies\n * @returns meeting object\n */\n private getMeeting() {\n if (this.meetingId) {\n // @ts-ignore\n return this.webex.meetings.getBasicMeetingInformation(this.meetingId);\n }\n\n return undefined;\n }\n\n /**\n * Store timestamp value\n * @param key - key\n * @param value - value\n * @param options - store options\n * @throws\n * @returns\n */\n public saveTimestamp({\n key,\n value = new Date().getTime(),\n options = {},\n }: {\n key: MetricEventNames;\n value?: number;\n options?: {meetingId?: string};\n }) {\n // save the meetingId so we can use the meeting object in latency calculations if needed\n const {meetingId} = options;\n if (meetingId) {\n this.setMeetingId(meetingId);\n }\n // for some events we're only interested in the first timestamp not last\n // as these events can happen multiple times\n if (\n key === 'client.media.rx.start' ||\n key === 'client.media.tx.start' ||\n key === 'internal.client.meetinginfo.request' ||\n key === 'internal.client.meetinginfo.response' ||\n key === 'client.media-engine.remote-sdp-received'\n ) {\n this.saveFirstTimestampOnly(key, value);\n } else {\n this.latencyTimestamps.set(key, value);\n // new offer/answer so reset the remote SDP timestamp\n if (key === 'client.media-engine.local-sdp-generated') {\n this.latencyTimestamps.delete('client.media-engine.remote-sdp-received');\n }\n }\n }\n\n /**\n * Store precomputed latency value\n * @param key - key\n * @param value - value\n * @param accumulate - when it is true, it overwrites existing value with sum of the current value and the new measurement otherwise just store the new measurement\n * @throws\n * @returns\n */\n public saveLatency(key: PreComputedLatencies, value: number, accumulate = false) {\n const existingValue = accumulate ? this.precomputedLatencies.get(key) || 0 : 0;\n this.precomputedLatencies.set(key, value + existingValue);\n }\n\n /**\n * Measure latency for a request\n * @param callback - callback for which you would like to measure latency\n * @param key - key\n * @param accumulate - when it is true, it overwrites existing value with sum of the current value and the new measurement otherwise just store the new measurement\n * @returns\n */\n public measureLatency(\n callback: () => Promise<unknown>,\n key: PreComputedLatencies,\n accumulate = false\n ) {\n const start = performance.now();\n\n return callback().finally(() => {\n this.saveLatency(key, performance.now() - start, accumulate);\n });\n }\n\n /**\n * Store only the first timestamp value for the given key\n * @param key - key\n * @param value -value\n * @throws\n * @returns\n */\n saveFirstTimestampOnly(key: MetricEventNames, value: number = new Date().getTime()) {\n if (this.latencyTimestamps.has(key)) {\n return;\n }\n this.latencyTimestamps.set(key, value);\n }\n\n /**\n * Helper to calculate end - start\n * @param a start\n * @param b end\n * @returns latency\n */\n public getDiffBetweenTimestamps(a: MetricEventNames, b: MetricEventNames) {\n const start = this.latencyTimestamps.get(a);\n const end = this.latencyTimestamps.get(b);\n\n if (typeof start === 'number' && typeof end === 'number') {\n return end - start;\n }\n\n return undefined;\n }\n\n /**\n * Meeting Info Request\n * @note Meeting Info request happen not just in the join phase. CA requires\n * metrics around meeting info request that are only part of join phase.\n * This internal.* event is used to track the real timestamps\n * (when the actual request/response happen). This is because the actual CA event is\n * sent inside the join method on the meeting object based on some logic, but that's not exactly when\n * those events are actually fired. The logic only confirms that they have happened, and we send them over.\n * @returns - latency\n */\n public getMeetingInfoReqResp() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meetinginfo.request',\n 'internal.client.meetinginfo.response'\n );\n }\n\n /**\n * Interstitial Time\n * @returns - latency\n */\n public getShowInterstitialTime() {\n return this.getDiffBetweenTimestamps(\n 'client.interstitial-window.start-launch',\n 'internal.client.interstitial-window.click.joinbutton'\n );\n }\n\n /**\n * getU2CTime\n * @returns - latency\n */\n public getU2CTime() {\n const u2cLatency = this.precomputedLatencies.get('internal.get.u2c.time');\n\n return typeof u2cLatency === 'number' ? Math.floor(u2cLatency) : undefined;\n }\n\n /**\n * Device Register Time\n * @returns - latency\n */\n public getRegisterWDMDeviceJMT() {\n return this.getDiffBetweenTimestamps(\n 'internal.register.device.request',\n 'internal.register.device.response'\n );\n }\n\n /**\n * Call Init Join Request\n * @returns - latency\n */\n public getCallInitJoinReq() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.locus.join.request'\n );\n }\n\n /**\n * Locus Join Request\n * @returns - latency\n */\n public getJoinReqResp() {\n return this.getDiffBetweenTimestamps('client.locus.join.request', 'client.locus.join.response');\n }\n\n /**\n * Time taken to do turn discovery\n * @returns - latency\n */\n public getTurnDiscoveryTime() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.add-media.turn-discovery.start',\n 'internal.client.add-media.turn-discovery.end'\n );\n }\n\n /**\n * Local SDP Generated Remote SDP REceived\n * @returns - latency\n */\n public getLocalSDPGenRemoteSDPRecv() {\n return this.getDiffBetweenTimestamps(\n 'client.media-engine.local-sdp-generated',\n 'client.media-engine.remote-sdp-received'\n );\n }\n\n /**\n * ICE Setup Time\n * @returns - latency\n */\n public getICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Audio ICE time\n * @returns - latency\n */\n public getAudioICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Video ICE Time\n * @returns - latency\n */\n public getVideoICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Share ICE Time\n * @returns - latency\n */\n public getShareICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Stay Lobby Time\n * @returns - latency\n */\n public getStayLobbyTime() {\n return this.getDiffBetweenTimestamps(\n 'client.locus.join.response',\n 'internal.host.meeting.participant.admitted'\n );\n }\n\n /**\n * Page JMT\n * @returns - latency\n */\n public getPageJMT() {\n const latency = this.precomputedLatencies.get('internal.client.pageJMT');\n\n return typeof latency === 'number' ? latency : undefined;\n }\n\n /**\n * Download Time JMT\n * @returns - latency\n */\n public getDownloadTimeJMT() {\n const latency = this.precomputedLatencies.get('internal.download.time');\n\n return typeof latency === 'number' ? latency : undefined;\n }\n\n /**\n * Click To Interstitial\n * @returns - latency\n */\n public getClickToInterstitial() {\n // for normal join (where green join button exists before interstitial, i.e reminder, space list etc)\n if (this.latencyTimestamps.get('internal.client.meeting.click.joinbutton')) {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meeting.click.joinbutton',\n 'internal.client.meeting.interstitial-window.showed'\n );\n }\n\n const clickToInterstitialLatency = this.precomputedLatencies.get(\n 'internal.click.to.interstitial'\n );\n\n if (typeof clickToInterstitialLatency === 'number') {\n return clickToInterstitialLatency;\n }\n\n return undefined;\n }\n\n /**\n * Click To Interstitial With User Delay\n * @returns - latency\n */\n public getClickToInterstitialWithUserDelay() {\n // for normal join (where green join button exists before interstitial, i.e reminder, space list etc)\n if (this.latencyTimestamps.get('internal.client.meeting.click.joinbutton')) {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meeting.click.joinbutton',\n 'internal.client.meeting.interstitial-window.showed'\n );\n }\n\n const clickToInterstitialWithUserDelayLatency = this.precomputedLatencies.get(\n 'internal.click.to.interstitial.with.user.delay'\n );\n\n if (typeof clickToInterstitialWithUserDelayLatency === 'number') {\n return clickToInterstitialWithUserDelayLatency;\n }\n\n return undefined;\n }\n\n /**\n * Interstitial To Join Ok\n * @returns - latency\n */\n public getInterstitialToJoinOK() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.locus.join.response'\n );\n }\n\n /**\n * Call Init To MediaEngineReady\n * @returns - latency\n */\n public getCallInitMediaEngineReady() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.media-engine.ready'\n );\n }\n\n /**\n * Interstitial To Media Ok\n * @returns - latency\n */\n public getInterstitialToMediaOKJMT() {\n const interstitialJoinClickTimestamp = this.latencyTimestamps.get(\n 'internal.client.interstitial-window.click.joinbutton'\n );\n\n // get the first timestamp\n const connectedMedia = this.latencyTimestamps.get('client.ice.end');\n\n const lobbyTimeLatency = this.getStayLobbyTime();\n const lobbyTime = typeof lobbyTimeLatency === 'number' ? lobbyTimeLatency : 0;\n\n if (interstitialJoinClickTimestamp && connectedMedia) {\n return connectedMedia - interstitialJoinClickTimestamp - lobbyTime;\n }\n\n return undefined;\n }\n\n /**\n * Total JMT\n * @returns - latency\n */\n public getTotalJMT() {\n const clickToInterstitial = this.getClickToInterstitial();\n const interstitialToJoinOk = this.getInterstitialToJoinOK();\n\n if (typeof clickToInterstitial === 'number' && typeof interstitialToJoinOk === 'number') {\n return clickToInterstitial + interstitialToJoinOk;\n }\n\n return undefined;\n }\n\n /**\n * Total JMT With User Delay\n * @returns - latency\n */\n public getTotalJMTWithUserDelay() {\n const clickToInterstitialWithUserDelay = this.getClickToInterstitialWithUserDelay();\n const interstitialToJoinOk = this.getInterstitialToJoinOK();\n\n if (\n typeof clickToInterstitialWithUserDelay === 'number' &&\n typeof interstitialToJoinOk === 'number'\n ) {\n return clickToInterstitialWithUserDelay + interstitialToJoinOk;\n }\n\n return undefined;\n }\n\n /**\n * Join Conf JMT\n * @returns - latency\n */\n public getJoinConfJMT() {\n const joinReqResp = this.getJoinReqResp();\n const ICESetupTime = this.getICESetupTime();\n\n if (joinReqResp && ICESetupTime) {\n return joinReqResp + ICESetupTime;\n }\n\n return undefined;\n }\n\n /**\n * Total Media JMT\n * @returns - latency\n */\n public getTotalMediaJMT() {\n const clickToInterstitial = this.getClickToInterstitial();\n const interstitialToJoinOk = this.getInterstitialToJoinOK();\n const joinConfJMT = this.getJoinConfJMT();\n const lobbyTime = this.getStayLobbyTime();\n\n if (clickToInterstitial && interstitialToJoinOk && joinConfJMT) {\n const totalMediaJMT = clickToInterstitial + interstitialToJoinOk + joinConfJMT;\n if (this.getMeeting()?.allowMediaInLobby) {\n return totalMediaJMT;\n }\n\n return totalMediaJMT - lobbyTime;\n }\n\n return undefined;\n }\n\n /**\n * Total Media JMT With User Delay\n * @returns - latency\n */\n public getTotalMediaJMTWithUserDelay() {\n const clickToInterstitialWithUserDelay = this.getClickToInterstitialWithUserDelay();\n const interstitialToJoinOk = this.getInterstitialToJoinOK();\n const joinConfJMT = this.getJoinConfJMT();\n\n if (clickToInterstitialWithUserDelay && interstitialToJoinOk && joinConfJMT) {\n return clickToInterstitialWithUserDelay + interstitialToJoinOk + joinConfJMT;\n }\n\n return undefined;\n }\n\n /**\n * Client JMT\n * @returns - latency\n */\n public getClientJMT() {\n const interstitialToJoinOk = this.getInterstitialToJoinOK();\n const joinConfJMT = this.getJoinConfJMT();\n\n if (typeof interstitialToJoinOk === 'number' && typeof joinConfJMT === 'number') {\n return interstitialToJoinOk - joinConfJMT;\n }\n\n return undefined;\n }\n\n /**\n * Audio setup delay receive\n */\n public getAudioJoinRespRxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.rx.start');\n }\n\n /**\n * Video setup delay receive\n */\n public getVideoJoinRespRxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.rx.start');\n }\n\n /**\n * Total latency for all get cluster request.\n */\n public getReachabilityClustersReqResp() {\n const reachablityClusterReqResp = this.precomputedLatencies.get('internal.get.cluster.time');\n\n return typeof reachablityClusterReqResp === 'number'\n ? Math.floor(reachablityClusterReqResp)\n : undefined;\n }\n\n /**\n * Audio setup delay transmit\n */\n public getAudioJoinRespTxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.tx.start');\n }\n\n /**\n * Video setup delay transmit\n */\n public getVideoJoinRespTxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.tx.start');\n }\n\n /**\n * Total latency for all exchange ci token.\n */\n public getExchangeCITokenJMT() {\n const exchangeCITokenJMT = this.precomputedLatencies.get('internal.exchange.ci.token.time');\n\n return typeof exchangeCITokenJMT === 'number' ? Math.floor(exchangeCITokenJMT) : undefined;\n }\n\n /**\n * Total latency for all refresh captcha requests.\n */\n public getRefreshCaptchaReqResp() {\n const refreshCaptchaReqResp = this.precomputedLatencies.get('internal.refresh.captcha.time');\n\n return typeof refreshCaptchaReqResp === 'number'\n ? Math.floor(refreshCaptchaReqResp)\n : undefined;\n }\n\n /**\n * Get the latency for downloading intelligence models.\n * @returns - latency\n */\n public getDownloadIntelligenceModelsReqResp() {\n const downloadIntelligenceModelsReqResp = this.precomputedLatencies.get(\n 'internal.api.fetch.intelligence.models'\n );\n\n return typeof downloadIntelligenceModelsReqResp === 'number'\n ? Math.floor(downloadIntelligenceModelsReqResp)\n : undefined;\n }\n\n /**\n * Get the total latency for all other app API requests.\n * Excludes meeting info, because it's measured separately.\n * @returns - latency\n */\n public getOtherAppApiReqResp() {\n const otherAppApiJMT = this.precomputedLatencies.get('internal.other.app.api.time');\n\n return otherAppApiJMT > 0 ? Math.floor(otherAppApiJMT) : undefined;\n }\n}\n"],"mappings":"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"}
@@ -224,6 +224,7 @@ var prepareDiagnosticMetricItem = exports.prepareDiagnosticMetricItem = function
224
224
  switch (eventName) {
225
225
  case 'client.webexapp.launched':
226
226
  joinTimes.downloadTime = cdl.getDownloadTimeJMT();
227
+ joinTimes.pageJmt = cdl.getPageJMT();
227
228
  break;
228
229
  case 'client.login.end':
229
230
  joinTimes.otherAppApiReqResp = cdl.getOtherAppApiReqResp();
@@ -234,6 +235,7 @@ var prepareDiagnosticMetricItem = exports.prepareDiagnosticMetricItem = function
234
235
  joinTimes.clickToInterstitial = cdl.getClickToInterstitial();
235
236
  joinTimes.refreshCaptchaServiceReqResp = cdl.getRefreshCaptchaReqResp();
236
237
  joinTimes.downloadIntelligenceModelsReqResp = cdl.getDownloadIntelligenceModelsReqResp();
238
+ joinTimes.clickToInterstitialWithUserDelay = cdl.getClickToInterstitialWithUserDelay();
237
239
  break;
238
240
  case 'client.call.initiated':
239
241
  joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();
@@ -252,6 +254,8 @@ var prepareDiagnosticMetricItem = exports.prepareDiagnosticMetricItem = function
252
254
  joinTimes.totalJmt = cdl.getTotalJMT();
253
255
  joinTimes.clientJmt = cdl.getClientJMT();
254
256
  joinTimes.downloadTime = cdl.getDownloadTimeJMT();
257
+ joinTimes.clickToInterstitialWithUserDelay = cdl.getClickToInterstitialWithUserDelay();
258
+ joinTimes.totalJMTWithUserDelay = cdl.getTotalJMTWithUserDelay();
255
259
  break;
256
260
  case 'client.ice.end':
257
261
  joinTimes.ICESetupTime = cdl.getICESetupTime();
@@ -269,6 +273,8 @@ var prepareDiagnosticMetricItem = exports.prepareDiagnosticMetricItem = function
269
273
  joinTimes.interstitialToMediaOKJMT = cdl.getInterstitialToMediaOKJMT();
270
274
  joinTimes.callInitMediaEngineReady = cdl.getCallInitMediaEngineReady();
271
275
  joinTimes.stayLobbyTime = cdl.getStayLobbyTime();
276
+ joinTimes.totalMediaJMTWithUserDelay = cdl.getTotalMediaJMTWithUserDelay();
277
+ joinTimes.totalJMTWithUserDelay = cdl.getTotalJMTWithUserDelay();
272
278
  break;
273
279
  case 'client.media.tx.start':
274
280
  audioSetupDelay.joinRespTxStart = cdl.getAudioJoinRespTxStart();
@@ -1 +1 @@
1
- {"version":3,"names":["_ipAnonymize","_interopRequireDefault","require","_util","_common","_webexCore","_lodash","_config","_BrowserDetection","BrowserDetection","getOSName","getOSVersion","getBrowserName","getBrowserVersion","anonymizeIPAddress","exports","localIp","anonymize","userAgentToString","_ref","clientName","webexVersion","userAgentOption","browserInfo","clientInfo","util","format","concat","indexOf","toLowerCase","split","osInfo","process","env","NODE_ENV","clearEmptyKeysRecursively","obj","_keys","default","length","forEach","key","_typeof2","_isArray","isEmpty","_toConsumableArray2","filter","x","isLocusServiceErrorCode","errorCode","code","charAt","isMeetingInfoServiceError","rawError","_rawError$body","_rawError$body$data","_rawError$body2","_rawError$body2$url","body","data","meetingInfo","url","includes","WBX_APP_API_URL","isNetworkError","WebexHttpError","NetworkOrCORSError","isUnauthorizedError","Unauthorized","isSdpOfferCreationError","name","ERROR_DESCRIPTIONS","SDP_OFFER_CREATION_ERROR","isBrowserMediaErrorName","errorName","BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP","getBuildType","webex","webClientDomain","_webex$internal$metri","_webex$internal$metri2","markAsTestEvent","arguments","undefined","internal","metrics","config","caBuildType","prepareDiagnosticMetricItem","item","_item$eventPayload","_item$eventPayload$ev","_item$eventPayload$ev2","_item$eventPayload2","_item$eventPayload2$e","_item$eventPayload2$e2","_item$eventPayload3","_item$eventPayload3$e","buildType","eventPayload","event","eventData","upgradeChannel","origin","networkType","eventName","joinTimes","audioSetupDelay","videoSetupDelay","cdl","newMetrics","callDiagnosticLatencies","downloadTime","getDownloadTimeJMT","otherAppApiReqResp","getOtherAppApiReqResp","exchangeCITokenJMT","getExchangeCITokenJMT","meetingInfoReqResp","getMeetingInfoReqResp","clickToInterstitial","getClickToInterstitial","refreshCaptchaServiceReqResp","getRefreshCaptchaReqResp","downloadIntelligenceModelsReqResp","getDownloadIntelligenceModelsReqResp","showInterstitialTime","getShowInterstitialTime","registerWDMDeviceJMT","getRegisterWDMDeviceJMT","getU2CTime","getReachabilityClustersReqResp","callInitJoinReq","getCallInitJoinReq","joinReqResp","getJoinReqResp","pageJmt","getPageJMT","interstitialToJoinOK","getInterstitialToJoinOK","totalJmt","getTotalJMT","clientJmt","getClientJMT","ICESetupTime","getICESetupTime","audioICESetupTime","getAudioICESetupTime","videoICESetupTime","getVideoICESetupTime","shareICESetupTime","getShareICESetupTime","localSDPGenRemoteSDPRecv","getLocalSDPGenRemoteSDPRecv","joinRespRxStart","getAudioJoinRespRxStart","getVideoJoinRespRxStart","totalMediaJMT","getTotalMediaJMT","interstitialToMediaOKJMT","getInterstitialToMediaOKJMT","callInitMediaEngineReady","getCallInitMediaEngineReady","stayLobbyTime","getStayLobbyTime","joinRespTxStart","getAudioJoinRespTxStart","getVideoJoinRespTxStart","merge","_assign","logger","log","_stringify","latencies","Object","fromEntries","latencyTimestamps","setMetricTimings","options","json","_body$metrics","JSON","parse","now","Date","toISOString","metric","originTime","triggered","sent","extractVersionMetadata","version","_version$split","_version$split2","_slicedToArray2","majorVersion","minorVersion","_parseInt2","generateClientErrorCodeForIceFailure","_ref2","signalingState","iceConnected","turnServerUsed","unreachable","ICE_FAILURE_CLIENT_CODE","MISSING_ROAP_ANSWER_CLIENT_CODE","DTLS_HANDSHAKE_FAILED_CLIENT_CODE","ICE_AND_REACHABILITY_FAILED_CLIENT_CODE","ICE_FAILED_WITH_TURN_TLS_CLIENT_CODE","ICE_FAILED_WITHOUT_TURN_TLS_CLIENT_CODE"],"sources":["call-diagnostic-metrics.util.ts"],"sourcesContent":["/* eslint-disable valid-jsdoc */\nimport anonymize from 'ip-anonymize';\nimport util from 'util';\n\nimport {BrowserDetection} from '@webex/common';\nimport {WebexHttpError} from '@webex/webex-core';\nimport {isEmpty, merge} from 'lodash';\nimport {\n ClientEvent,\n Event,\n MediaQualityEventAudioSetupDelayPayload,\n MediaQualityEventVideoSetupDelayPayload,\n MetricEventNames,\n} from '../metrics.types';\nimport {\n BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP,\n DTLS_HANDSHAKE_FAILED_CLIENT_CODE,\n ICE_FAILED_WITHOUT_TURN_TLS_CLIENT_CODE,\n ICE_FAILED_WITH_TURN_TLS_CLIENT_CODE,\n ICE_FAILURE_CLIENT_CODE,\n MISSING_ROAP_ANSWER_CLIENT_CODE,\n WBX_APP_API_URL,\n ERROR_DESCRIPTIONS,\n ICE_AND_REACHABILITY_FAILED_CLIENT_CODE,\n} from './config';\n\nconst {getOSName, getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();\n\nexport const anonymizeIPAddress = (localIp) => anonymize(localIp, 28, 96);\n\n/**\n * Returns a formated string of the user agent.\n *\n * @returns {string} formatted user agent information\n */\nexport const userAgentToString = ({clientName, webexVersion}) => {\n let userAgentOption;\n let browserInfo;\n const clientInfo = util.format('client=%s', `${clientName}`);\n\n if (\n ['chrome', 'firefox', 'msie', 'msedge', 'safari'].indexOf(getBrowserName().toLowerCase()) !== -1\n ) {\n browserInfo = util.format(\n 'browser=%s',\n `${getBrowserName().toLowerCase()}/${getBrowserVersion().split('.')[0]}`\n );\n }\n const osInfo = util.format('os=%s', `${getOSName()}/${getOSVersion().split('.')[0]}`);\n\n if (browserInfo) {\n userAgentOption = `(${browserInfo}`;\n }\n if (osInfo) {\n userAgentOption = userAgentOption\n ? `${userAgentOption}; ${clientInfo}; ${osInfo}`\n : `${clientInfo}; (${osInfo}`;\n }\n if (userAgentOption) {\n userAgentOption += ')';\n\n return util.format(\n 'webex-js-sdk/%s %s',\n `${process.env.NODE_ENV}-${webexVersion}`,\n userAgentOption\n );\n }\n\n return util.format('webex-js-sdk/%s', `${process.env.NODE_ENV}-${webexVersion}`);\n};\n\n/**\n * Iterates object recursively and removes any\n * property that returns isEmpty for it's associated value\n * isEmpty = implementation from Lodash.\n *\n * It modifies the object in place (mutable)\n *\n * @param obj - input\n * @returns\n */\nexport const clearEmptyKeysRecursively = (obj: any) => {\n // Check if the object is empty\n if (Object.keys(obj).length === 0) {\n return;\n }\n\n Object.keys(obj).forEach((key) => {\n if (\n (typeof obj[key] === 'object' || typeof obj[key] === 'string' || Array.isArray(obj[key])) &&\n isEmpty(obj[key])\n ) {\n delete obj[key];\n }\n if (Array.isArray(obj[key])) {\n obj[key] = [...obj[key].filter((x) => !!x)];\n }\n if (typeof obj[key] === 'object') {\n clearEmptyKeysRecursively(obj[key]);\n }\n });\n};\n\n/**\n * Locus error codes start with 2. The next three digits are the\n * HTTP status code related to the error code (like 400, 403, 502, etc.)\n * The remaining three digits are just an increasing integer.\n * If it is 7 digits and starts with a 2, it is locus.\n *\n * @param errorCode\n * @returns {boolean}\n */\nexport const isLocusServiceErrorCode = (errorCode: string | number) => {\n const code = `${errorCode}`;\n\n if (code.length === 7 && code.charAt(0) === '2') {\n return true;\n }\n\n return false;\n};\n\n/**\n * MeetingInfo errors sometimes has body.data.meetingInfo object\n * MeetingInfo errors come with a wbxappapi url\n *\n * @param {Object} rawError\n * @returns {boolean}\n */\nexport const isMeetingInfoServiceError = (rawError: any) => {\n if (rawError.body?.data?.meetingInfo || rawError.body?.url?.includes(WBX_APP_API_URL)) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Returns true if the raw error is a network related error\n *\n * @param {Object} rawError\n * @returns {boolean}\n */\nexport const isNetworkError = (rawError: any) => {\n if (rawError instanceof WebexHttpError.NetworkOrCORSError) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Returns true if the error is an unauthorized error\n *\n * @param {Object} rawError\n * @returns {boolean}\n */\nexport const isUnauthorizedError = (rawError: any) => {\n if (rawError instanceof WebexHttpError.Unauthorized) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Returns true if the error is an SdpOfferCreation error\n *\n * @param {Object} rawError\n * @returns {boolean}\n */\nexport const isSdpOfferCreationError = (rawError: any) => {\n // would LIKE to do rawError instanceof Errors.SdpOfferCreationError\n // but including internal-media-core in plugin-metrics breaks meetings and metrics unit tests\n if (rawError.name === ERROR_DESCRIPTIONS.SDP_OFFER_CREATION_ERROR) {\n return true;\n }\n\n return false;\n};\n\n/**\n * MDN Media Devices getUserMedia() method returns a name if it errs\n * Documentation can be found here: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia\n *\n * @param errorCode\n * @returns\n */\nexport const isBrowserMediaErrorName = (errorName: any) => {\n if (BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP[errorName]) {\n return true;\n }\n\n return false;\n};\n\n/**\n * @param {Object} webex sdk instance\n * @param webClientDomain\n * @returns\n */\nexport const getBuildType = (\n webex,\n webClientDomain,\n markAsTestEvent = false\n): Event['origin']['buildType'] => {\n // used temporary to test pre join in production without creating noise data, SPARK-468456\n if (markAsTestEvent) {\n return 'test';\n }\n\n if (webex.internal.metrics?.config?.caBuildType) {\n return webex.internal.metrics.config.caBuildType;\n }\n\n if (\n webClientDomain?.includes('localhost') ||\n webClientDomain?.includes('127.0.0.1') ||\n process.env.NODE_ENV !== 'production'\n ) {\n return 'test';\n }\n\n return 'prod';\n};\n\n/**\n * Prepare metric item for submission.\n * @param {Object} webex sdk instance\n * @param {Object} item\n * @returns {Object} prepared item\n */\nexport const prepareDiagnosticMetricItem = (webex: any, item: any) => {\n const buildType = getBuildType(\n webex,\n item.eventPayload?.event?.eventData?.webClientDomain,\n item.eventPayload?.event?.eventData?.markAsTestEvent\n );\n\n // Set upgradeChannel to 'gold' if buildType is 'prod', otherwise to the buildType value\n const upgradeChannel = buildType === 'prod' ? 'gold' : buildType;\n\n const origin: Partial<Event['origin']> = {\n buildType,\n networkType: 'unknown',\n upgradeChannel,\n };\n\n // check event names and append latencies?\n const eventName = item.eventPayload?.event?.name as MetricEventNames;\n const joinTimes: ClientEvent['payload']['joinTimes'] = {};\n const audioSetupDelay: MediaQualityEventAudioSetupDelayPayload = {};\n const videoSetupDelay: MediaQualityEventVideoSetupDelayPayload = {};\n\n const cdl = webex.internal.newMetrics.callDiagnosticLatencies;\n\n switch (eventName) {\n case 'client.webexapp.launched':\n joinTimes.downloadTime = cdl.getDownloadTimeJMT();\n break;\n case 'client.login.end':\n joinTimes.otherAppApiReqResp = cdl.getOtherAppApiReqResp();\n joinTimes.exchangeCITokenJMT = cdl.getExchangeCITokenJMT();\n break;\n case 'client.interstitial-window.launched':\n joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();\n joinTimes.clickToInterstitial = cdl.getClickToInterstitial();\n joinTimes.refreshCaptchaServiceReqResp = cdl.getRefreshCaptchaReqResp();\n joinTimes.downloadIntelligenceModelsReqResp = cdl.getDownloadIntelligenceModelsReqResp();\n break;\n\n case 'client.call.initiated':\n joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();\n joinTimes.showInterstitialTime = cdl.getShowInterstitialTime();\n joinTimes.registerWDMDeviceJMT = cdl.getRegisterWDMDeviceJMT();\n joinTimes.getU2CTime = cdl.getU2CTime();\n joinTimes.getReachabilityClustersReqResp = cdl.getReachabilityClustersReqResp();\n break;\n\n case 'client.locus.join.response':\n joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();\n joinTimes.callInitJoinReq = cdl.getCallInitJoinReq();\n joinTimes.joinReqResp = cdl.getJoinReqResp();\n joinTimes.pageJmt = cdl.getPageJMT();\n joinTimes.clickToInterstitial = cdl.getClickToInterstitial();\n joinTimes.interstitialToJoinOK = cdl.getInterstitialToJoinOK();\n joinTimes.totalJmt = cdl.getTotalJMT();\n joinTimes.clientJmt = cdl.getClientJMT();\n joinTimes.downloadTime = cdl.getDownloadTimeJMT();\n break;\n\n case 'client.ice.end':\n joinTimes.ICESetupTime = cdl.getICESetupTime();\n joinTimes.audioICESetupTime = cdl.getAudioICESetupTime();\n joinTimes.videoICESetupTime = cdl.getVideoICESetupTime();\n joinTimes.shareICESetupTime = cdl.getShareICESetupTime();\n break;\n\n case 'client.media.rx.start':\n joinTimes.localSDPGenRemoteSDPRecv = cdl.getLocalSDPGenRemoteSDPRecv();\n audioSetupDelay.joinRespRxStart = cdl.getAudioJoinRespRxStart();\n videoSetupDelay.joinRespRxStart = cdl.getVideoJoinRespRxStart();\n break;\n\n case 'client.media-engine.ready':\n joinTimes.totalMediaJMT = cdl.getTotalMediaJMT();\n joinTimes.interstitialToMediaOKJMT = cdl.getInterstitialToMediaOKJMT();\n joinTimes.callInitMediaEngineReady = cdl.getCallInitMediaEngineReady();\n joinTimes.stayLobbyTime = cdl.getStayLobbyTime();\n break;\n\n case 'client.media.tx.start':\n audioSetupDelay.joinRespTxStart = cdl.getAudioJoinRespTxStart();\n videoSetupDelay.joinRespTxStart = cdl.getVideoJoinRespTxStart();\n }\n\n if (!isEmpty(joinTimes)) {\n item.eventPayload.event = merge(item.eventPayload.event, {joinTimes});\n }\n\n if (!isEmpty(audioSetupDelay)) {\n item.eventPayload.event = merge(item.eventPayload.event, {audioSetupDelay});\n }\n\n if (!isEmpty(videoSetupDelay)) {\n item.eventPayload.event = merge(item.eventPayload.event, {videoSetupDelay});\n }\n\n item.eventPayload.origin = Object.assign(origin, item.eventPayload.origin);\n\n webex.logger.log(\n `CallDiagnosticLatencies,prepareDiagnosticMetricItem: ${JSON.stringify({\n latencies: Object.fromEntries(cdl.latencyTimestamps),\n event: item,\n })}`\n );\n\n return item;\n};\n\n/**\n * Sets the originTime value(s) before the request/fetch.\n * This function is only useful if you are about to submit a metrics\n * request using pre-built fetch options;\n *\n * @param {any} options\n * @returns {any} the updated options object\n */\nexport const setMetricTimings = (options) => {\n if (options.body && options.json) {\n const body = JSON.parse(options.body);\n\n const now = new Date().toISOString();\n body.metrics?.forEach((metric) => {\n if (metric.eventPayload) {\n // The event will effectively be triggered and sent at the same time.\n // The existing triggered time is from when the options were built.\n metric.eventPayload.originTime = {\n triggered: now,\n sent: now,\n };\n }\n });\n options.body = JSON.stringify(body);\n }\n\n return options;\n};\n\nexport const extractVersionMetadata = (version: string) => {\n // extract major and minor version\n const [majorVersion, minorVersion] = version.split('.');\n\n return {\n majorVersion: parseInt(majorVersion, 10),\n minorVersion: parseInt(minorVersion, 10),\n };\n};\n\n/**\n * Generates client error codes for specific ice failures\n * that happen when trying to add media in a meeting.\n */\nexport const generateClientErrorCodeForIceFailure = ({\n signalingState,\n iceConnected,\n turnServerUsed,\n unreachable,\n}: {\n signalingState: RTCPeerConnection['signalingState'];\n iceConnected: boolean;\n turnServerUsed: boolean;\n unreachable: boolean;\n}) => {\n let errorCode = ICE_FAILURE_CLIENT_CODE; // default;\n\n if (signalingState === 'have-local-offer') {\n errorCode = MISSING_ROAP_ANSWER_CLIENT_CODE;\n }\n\n if (signalingState === 'stable' && iceConnected) {\n errorCode = DTLS_HANDSHAKE_FAILED_CLIENT_CODE;\n }\n\n if (signalingState !== 'have-local-offer' && !iceConnected) {\n if (turnServerUsed) {\n if (unreachable) {\n errorCode = ICE_AND_REACHABILITY_FAILED_CLIENT_CODE;\n } else {\n errorCode = ICE_FAILED_WITH_TURN_TLS_CLIENT_CODE;\n }\n } else {\n errorCode = ICE_FAILED_WITHOUT_TURN_TLS_CLIENT_CODE;\n }\n }\n\n return errorCode;\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["_ipAnonymize","_interopRequireDefault","require","_util","_common","_webexCore","_lodash","_config","_BrowserDetection","BrowserDetection","getOSName","getOSVersion","getBrowserName","getBrowserVersion","anonymizeIPAddress","exports","localIp","anonymize","userAgentToString","_ref","clientName","webexVersion","userAgentOption","browserInfo","clientInfo","util","format","concat","indexOf","toLowerCase","split","osInfo","process","env","NODE_ENV","clearEmptyKeysRecursively","obj","_keys","default","length","forEach","key","_typeof2","_isArray","isEmpty","_toConsumableArray2","filter","x","isLocusServiceErrorCode","errorCode","code","charAt","isMeetingInfoServiceError","rawError","_rawError$body","_rawError$body$data","_rawError$body2","_rawError$body2$url","body","data","meetingInfo","url","includes","WBX_APP_API_URL","isNetworkError","WebexHttpError","NetworkOrCORSError","isUnauthorizedError","Unauthorized","isSdpOfferCreationError","name","ERROR_DESCRIPTIONS","SDP_OFFER_CREATION_ERROR","isBrowserMediaErrorName","errorName","BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP","getBuildType","webex","webClientDomain","_webex$internal$metri","_webex$internal$metri2","markAsTestEvent","arguments","undefined","internal","metrics","config","caBuildType","prepareDiagnosticMetricItem","item","_item$eventPayload","_item$eventPayload$ev","_item$eventPayload$ev2","_item$eventPayload2","_item$eventPayload2$e","_item$eventPayload2$e2","_item$eventPayload3","_item$eventPayload3$e","buildType","eventPayload","event","eventData","upgradeChannel","origin","networkType","eventName","joinTimes","audioSetupDelay","videoSetupDelay","cdl","newMetrics","callDiagnosticLatencies","downloadTime","getDownloadTimeJMT","pageJmt","getPageJMT","otherAppApiReqResp","getOtherAppApiReqResp","exchangeCITokenJMT","getExchangeCITokenJMT","meetingInfoReqResp","getMeetingInfoReqResp","clickToInterstitial","getClickToInterstitial","refreshCaptchaServiceReqResp","getRefreshCaptchaReqResp","downloadIntelligenceModelsReqResp","getDownloadIntelligenceModelsReqResp","clickToInterstitialWithUserDelay","getClickToInterstitialWithUserDelay","showInterstitialTime","getShowInterstitialTime","registerWDMDeviceJMT","getRegisterWDMDeviceJMT","getU2CTime","getReachabilityClustersReqResp","callInitJoinReq","getCallInitJoinReq","joinReqResp","getJoinReqResp","interstitialToJoinOK","getInterstitialToJoinOK","totalJmt","getTotalJMT","clientJmt","getClientJMT","totalJMTWithUserDelay","getTotalJMTWithUserDelay","ICESetupTime","getICESetupTime","audioICESetupTime","getAudioICESetupTime","videoICESetupTime","getVideoICESetupTime","shareICESetupTime","getShareICESetupTime","localSDPGenRemoteSDPRecv","getLocalSDPGenRemoteSDPRecv","joinRespRxStart","getAudioJoinRespRxStart","getVideoJoinRespRxStart","totalMediaJMT","getTotalMediaJMT","interstitialToMediaOKJMT","getInterstitialToMediaOKJMT","callInitMediaEngineReady","getCallInitMediaEngineReady","stayLobbyTime","getStayLobbyTime","totalMediaJMTWithUserDelay","getTotalMediaJMTWithUserDelay","joinRespTxStart","getAudioJoinRespTxStart","getVideoJoinRespTxStart","merge","_assign","logger","log","_stringify","latencies","Object","fromEntries","latencyTimestamps","setMetricTimings","options","json","_body$metrics","JSON","parse","now","Date","toISOString","metric","originTime","triggered","sent","extractVersionMetadata","version","_version$split","_version$split2","_slicedToArray2","majorVersion","minorVersion","_parseInt2","generateClientErrorCodeForIceFailure","_ref2","signalingState","iceConnected","turnServerUsed","unreachable","ICE_FAILURE_CLIENT_CODE","MISSING_ROAP_ANSWER_CLIENT_CODE","DTLS_HANDSHAKE_FAILED_CLIENT_CODE","ICE_AND_REACHABILITY_FAILED_CLIENT_CODE","ICE_FAILED_WITH_TURN_TLS_CLIENT_CODE","ICE_FAILED_WITHOUT_TURN_TLS_CLIENT_CODE"],"sources":["call-diagnostic-metrics.util.ts"],"sourcesContent":["/* eslint-disable valid-jsdoc */\nimport anonymize from 'ip-anonymize';\nimport util from 'util';\n\nimport {BrowserDetection} from '@webex/common';\nimport {WebexHttpError} from '@webex/webex-core';\nimport {isEmpty, merge} from 'lodash';\nimport {\n ClientEvent,\n Event,\n MediaQualityEventAudioSetupDelayPayload,\n MediaQualityEventVideoSetupDelayPayload,\n MetricEventNames,\n} from '../metrics.types';\nimport {\n BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP,\n DTLS_HANDSHAKE_FAILED_CLIENT_CODE,\n ICE_FAILED_WITHOUT_TURN_TLS_CLIENT_CODE,\n ICE_FAILED_WITH_TURN_TLS_CLIENT_CODE,\n ICE_FAILURE_CLIENT_CODE,\n MISSING_ROAP_ANSWER_CLIENT_CODE,\n WBX_APP_API_URL,\n ERROR_DESCRIPTIONS,\n ICE_AND_REACHABILITY_FAILED_CLIENT_CODE,\n} from './config';\n\nconst {getOSName, getOSVersion, getBrowserName, getBrowserVersion} = BrowserDetection();\n\nexport const anonymizeIPAddress = (localIp) => anonymize(localIp, 28, 96);\n\n/**\n * Returns a formated string of the user agent.\n *\n * @returns {string} formatted user agent information\n */\nexport const userAgentToString = ({clientName, webexVersion}) => {\n let userAgentOption;\n let browserInfo;\n const clientInfo = util.format('client=%s', `${clientName}`);\n\n if (\n ['chrome', 'firefox', 'msie', 'msedge', 'safari'].indexOf(getBrowserName().toLowerCase()) !== -1\n ) {\n browserInfo = util.format(\n 'browser=%s',\n `${getBrowserName().toLowerCase()}/${getBrowserVersion().split('.')[0]}`\n );\n }\n const osInfo = util.format('os=%s', `${getOSName()}/${getOSVersion().split('.')[0]}`);\n\n if (browserInfo) {\n userAgentOption = `(${browserInfo}`;\n }\n if (osInfo) {\n userAgentOption = userAgentOption\n ? `${userAgentOption}; ${clientInfo}; ${osInfo}`\n : `${clientInfo}; (${osInfo}`;\n }\n if (userAgentOption) {\n userAgentOption += ')';\n\n return util.format(\n 'webex-js-sdk/%s %s',\n `${process.env.NODE_ENV}-${webexVersion}`,\n userAgentOption\n );\n }\n\n return util.format('webex-js-sdk/%s', `${process.env.NODE_ENV}-${webexVersion}`);\n};\n\n/**\n * Iterates object recursively and removes any\n * property that returns isEmpty for it's associated value\n * isEmpty = implementation from Lodash.\n *\n * It modifies the object in place (mutable)\n *\n * @param obj - input\n * @returns\n */\nexport const clearEmptyKeysRecursively = (obj: any) => {\n // Check if the object is empty\n if (Object.keys(obj).length === 0) {\n return;\n }\n\n Object.keys(obj).forEach((key) => {\n if (\n (typeof obj[key] === 'object' || typeof obj[key] === 'string' || Array.isArray(obj[key])) &&\n isEmpty(obj[key])\n ) {\n delete obj[key];\n }\n if (Array.isArray(obj[key])) {\n obj[key] = [...obj[key].filter((x) => !!x)];\n }\n if (typeof obj[key] === 'object') {\n clearEmptyKeysRecursively(obj[key]);\n }\n });\n};\n\n/**\n * Locus error codes start with 2. The next three digits are the\n * HTTP status code related to the error code (like 400, 403, 502, etc.)\n * The remaining three digits are just an increasing integer.\n * If it is 7 digits and starts with a 2, it is locus.\n *\n * @param errorCode\n * @returns {boolean}\n */\nexport const isLocusServiceErrorCode = (errorCode: string | number) => {\n const code = `${errorCode}`;\n\n if (code.length === 7 && code.charAt(0) === '2') {\n return true;\n }\n\n return false;\n};\n\n/**\n * MeetingInfo errors sometimes has body.data.meetingInfo object\n * MeetingInfo errors come with a wbxappapi url\n *\n * @param {Object} rawError\n * @returns {boolean}\n */\nexport const isMeetingInfoServiceError = (rawError: any) => {\n if (rawError.body?.data?.meetingInfo || rawError.body?.url?.includes(WBX_APP_API_URL)) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Returns true if the raw error is a network related error\n *\n * @param {Object} rawError\n * @returns {boolean}\n */\nexport const isNetworkError = (rawError: any) => {\n if (rawError instanceof WebexHttpError.NetworkOrCORSError) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Returns true if the error is an unauthorized error\n *\n * @param {Object} rawError\n * @returns {boolean}\n */\nexport const isUnauthorizedError = (rawError: any) => {\n if (rawError instanceof WebexHttpError.Unauthorized) {\n return true;\n }\n\n return false;\n};\n\n/**\n * Returns true if the error is an SdpOfferCreation error\n *\n * @param {Object} rawError\n * @returns {boolean}\n */\nexport const isSdpOfferCreationError = (rawError: any) => {\n // would LIKE to do rawError instanceof Errors.SdpOfferCreationError\n // but including internal-media-core in plugin-metrics breaks meetings and metrics unit tests\n if (rawError.name === ERROR_DESCRIPTIONS.SDP_OFFER_CREATION_ERROR) {\n return true;\n }\n\n return false;\n};\n\n/**\n * MDN Media Devices getUserMedia() method returns a name if it errs\n * Documentation can be found here: https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia\n *\n * @param errorCode\n * @returns\n */\nexport const isBrowserMediaErrorName = (errorName: any) => {\n if (BROWSER_MEDIA_ERROR_NAME_TO_CLIENT_ERROR_CODES_MAP[errorName]) {\n return true;\n }\n\n return false;\n};\n\n/**\n * @param {Object} webex sdk instance\n * @param webClientDomain\n * @returns\n */\nexport const getBuildType = (\n webex,\n webClientDomain,\n markAsTestEvent = false\n): Event['origin']['buildType'] => {\n // used temporary to test pre join in production without creating noise data, SPARK-468456\n if (markAsTestEvent) {\n return 'test';\n }\n\n if (webex.internal.metrics?.config?.caBuildType) {\n return webex.internal.metrics.config.caBuildType;\n }\n\n if (\n webClientDomain?.includes('localhost') ||\n webClientDomain?.includes('127.0.0.1') ||\n process.env.NODE_ENV !== 'production'\n ) {\n return 'test';\n }\n\n return 'prod';\n};\n\n/**\n * Prepare metric item for submission.\n * @param {Object} webex sdk instance\n * @param {Object} item\n * @returns {Object} prepared item\n */\nexport const prepareDiagnosticMetricItem = (webex: any, item: any) => {\n const buildType = getBuildType(\n webex,\n item.eventPayload?.event?.eventData?.webClientDomain,\n item.eventPayload?.event?.eventData?.markAsTestEvent\n );\n\n // Set upgradeChannel to 'gold' if buildType is 'prod', otherwise to the buildType value\n const upgradeChannel = buildType === 'prod' ? 'gold' : buildType;\n\n const origin: Partial<Event['origin']> = {\n buildType,\n networkType: 'unknown',\n upgradeChannel,\n };\n\n // check event names and append latencies?\n const eventName = item.eventPayload?.event?.name as MetricEventNames;\n const joinTimes: ClientEvent['payload']['joinTimes'] = {};\n const audioSetupDelay: MediaQualityEventAudioSetupDelayPayload = {};\n const videoSetupDelay: MediaQualityEventVideoSetupDelayPayload = {};\n\n const cdl = webex.internal.newMetrics.callDiagnosticLatencies;\n\n switch (eventName) {\n case 'client.webexapp.launched':\n joinTimes.downloadTime = cdl.getDownloadTimeJMT();\n joinTimes.pageJmt = cdl.getPageJMT();\n break;\n case 'client.login.end':\n joinTimes.otherAppApiReqResp = cdl.getOtherAppApiReqResp();\n joinTimes.exchangeCITokenJMT = cdl.getExchangeCITokenJMT();\n break;\n case 'client.interstitial-window.launched':\n joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();\n joinTimes.clickToInterstitial = cdl.getClickToInterstitial();\n joinTimes.refreshCaptchaServiceReqResp = cdl.getRefreshCaptchaReqResp();\n joinTimes.downloadIntelligenceModelsReqResp = cdl.getDownloadIntelligenceModelsReqResp();\n joinTimes.clickToInterstitialWithUserDelay = cdl.getClickToInterstitialWithUserDelay();\n break;\n\n case 'client.call.initiated':\n joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();\n joinTimes.showInterstitialTime = cdl.getShowInterstitialTime();\n joinTimes.registerWDMDeviceJMT = cdl.getRegisterWDMDeviceJMT();\n joinTimes.getU2CTime = cdl.getU2CTime();\n joinTimes.getReachabilityClustersReqResp = cdl.getReachabilityClustersReqResp();\n break;\n\n case 'client.locus.join.response':\n joinTimes.meetingInfoReqResp = cdl.getMeetingInfoReqResp();\n joinTimes.callInitJoinReq = cdl.getCallInitJoinReq();\n joinTimes.joinReqResp = cdl.getJoinReqResp();\n joinTimes.pageJmt = cdl.getPageJMT();\n joinTimes.clickToInterstitial = cdl.getClickToInterstitial();\n joinTimes.interstitialToJoinOK = cdl.getInterstitialToJoinOK();\n joinTimes.totalJmt = cdl.getTotalJMT();\n joinTimes.clientJmt = cdl.getClientJMT();\n joinTimes.downloadTime = cdl.getDownloadTimeJMT();\n joinTimes.clickToInterstitialWithUserDelay = cdl.getClickToInterstitialWithUserDelay();\n joinTimes.totalJMTWithUserDelay = cdl.getTotalJMTWithUserDelay();\n break;\n\n case 'client.ice.end':\n joinTimes.ICESetupTime = cdl.getICESetupTime();\n joinTimes.audioICESetupTime = cdl.getAudioICESetupTime();\n joinTimes.videoICESetupTime = cdl.getVideoICESetupTime();\n joinTimes.shareICESetupTime = cdl.getShareICESetupTime();\n break;\n\n case 'client.media.rx.start':\n joinTimes.localSDPGenRemoteSDPRecv = cdl.getLocalSDPGenRemoteSDPRecv();\n audioSetupDelay.joinRespRxStart = cdl.getAudioJoinRespRxStart();\n videoSetupDelay.joinRespRxStart = cdl.getVideoJoinRespRxStart();\n break;\n\n case 'client.media-engine.ready':\n joinTimes.totalMediaJMT = cdl.getTotalMediaJMT();\n joinTimes.interstitialToMediaOKJMT = cdl.getInterstitialToMediaOKJMT();\n joinTimes.callInitMediaEngineReady = cdl.getCallInitMediaEngineReady();\n joinTimes.stayLobbyTime = cdl.getStayLobbyTime();\n joinTimes.totalMediaJMTWithUserDelay = cdl.getTotalMediaJMTWithUserDelay();\n joinTimes.totalJMTWithUserDelay = cdl.getTotalJMTWithUserDelay();\n break;\n\n case 'client.media.tx.start':\n audioSetupDelay.joinRespTxStart = cdl.getAudioJoinRespTxStart();\n videoSetupDelay.joinRespTxStart = cdl.getVideoJoinRespTxStart();\n }\n\n if (!isEmpty(joinTimes)) {\n item.eventPayload.event = merge(item.eventPayload.event, {joinTimes});\n }\n\n if (!isEmpty(audioSetupDelay)) {\n item.eventPayload.event = merge(item.eventPayload.event, {audioSetupDelay});\n }\n\n if (!isEmpty(videoSetupDelay)) {\n item.eventPayload.event = merge(item.eventPayload.event, {videoSetupDelay});\n }\n\n item.eventPayload.origin = Object.assign(origin, item.eventPayload.origin);\n\n webex.logger.log(\n `CallDiagnosticLatencies,prepareDiagnosticMetricItem: ${JSON.stringify({\n latencies: Object.fromEntries(cdl.latencyTimestamps),\n event: item,\n })}`\n );\n\n return item;\n};\n\n/**\n * Sets the originTime value(s) before the request/fetch.\n * This function is only useful if you are about to submit a metrics\n * request using pre-built fetch options;\n *\n * @param {any} options\n * @returns {any} the updated options object\n */\nexport const setMetricTimings = (options) => {\n if (options.body && options.json) {\n const body = JSON.parse(options.body);\n\n const now = new Date().toISOString();\n body.metrics?.forEach((metric) => {\n if (metric.eventPayload) {\n // The event will effectively be triggered and sent at the same time.\n // The existing triggered time is from when the options were built.\n metric.eventPayload.originTime = {\n triggered: now,\n sent: now,\n };\n }\n });\n options.body = JSON.stringify(body);\n }\n\n return options;\n};\n\nexport const extractVersionMetadata = (version: string) => {\n // extract major and minor version\n const [majorVersion, minorVersion] = version.split('.');\n\n return {\n majorVersion: parseInt(majorVersion, 10),\n minorVersion: parseInt(minorVersion, 10),\n };\n};\n\n/**\n * Generates client error codes for specific ice failures\n * that happen when trying to add media in a meeting.\n */\nexport const generateClientErrorCodeForIceFailure = ({\n signalingState,\n iceConnected,\n turnServerUsed,\n unreachable,\n}: {\n signalingState: RTCPeerConnection['signalingState'];\n iceConnected: boolean;\n turnServerUsed: boolean;\n unreachable: boolean;\n}) => {\n let errorCode = ICE_FAILURE_CLIENT_CODE; // default;\n\n if (signalingState === 'have-local-offer') {\n errorCode = MISSING_ROAP_ANSWER_CLIENT_CODE;\n }\n\n if (signalingState === 'stable' && iceConnected) {\n errorCode = DTLS_HANDSHAKE_FAILED_CLIENT_CODE;\n }\n\n if (signalingState !== 'have-local-offer' && !iceConnected) {\n if (turnServerUsed) {\n if (unreachable) {\n errorCode = ICE_AND_REACHABILITY_FAILED_CLIENT_CODE;\n } else {\n errorCode = ICE_FAILED_WITH_TURN_TLS_CLIENT_CODE;\n }\n } else {\n errorCode = ICE_FAILED_WITHOUT_TURN_TLS_CLIENT_CODE;\n }\n }\n\n return errorCode;\n};\n"],"mappings":"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"}
package/dist/metrics.js CHANGED
@@ -148,7 +148,7 @@ var Metrics = _webexCore.WebexPlugin.extend({
148
148
  }
149
149
  });
150
150
  },
151
- version: "3.8.1-next.2"
151
+ version: "3.8.1-next.4"
152
152
  });
153
153
  var _default = exports.default = Metrics;
154
154
  //# sourceMappingURL=metrics.js.map
@@ -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 ClientUserNameInput = NonNullable<RawClientEvent['userNameInput']>;\n\nexport type ClientEmailInput = NonNullable<RawClientEvent['emailInput']>;\n\nexport type BrowserLaunchMethodType = NonNullable<\n RawEvent['origin']['clientInfo']\n>['browserLaunchMethod'];\n\nexport type MetricEventProduct = 'webex' | 'wxcc_desktop' | 'wxcc_crm' | 'wxcc_sdk';\n\nexport type MetricEventAgent = 'user' | 'browser' | 'system' | 'sdk' | 'redux' | 'service' | 'api';\n\nexport type MetricEventVerb =\n | 'abort'\n | 'accept'\n | 'activate'\n | 'apply'\n | 'answer'\n | 'authorize'\n | 'build'\n | 'cancel'\n | 'change'\n | 'click'\n | 'close'\n | 'complete'\n | 'connect'\n | 'create'\n | 'deactivate'\n | 'decrypt'\n | 'delete'\n | 'deliver'\n | 'destroy'\n | 'disable'\n | 'disconnect'\n | 'dismiss'\n | 'display'\n | 'download'\n | 'edit'\n | 'enable'\n | 'encrypt'\n | 'end'\n | 'expire'\n | 'fail'\n | 'fetch'\n | 'fire'\n | 'generate'\n | 'get'\n | 'hide'\n | 'hover'\n | 'ignore'\n | 'initialize'\n | 'initiate'\n | 'invalidate'\n | 'join'\n | 'list'\n | 'load'\n | 'login'\n | 'logout'\n | 'notify'\n | 'offer'\n | 'open'\n | 'press'\n | 'receive'\n | 'refer'\n | 'refresh'\n | 'register'\n | 'release'\n | 'reload'\n | 'reject'\n | 'request'\n | 'reset'\n | 'resize'\n | 'respond'\n | 'retry'\n | 'revoke'\n | 'save'\n | 'search'\n | 'select'\n | 'send'\n | 'set'\n | 'sign'\n | 'start'\n | 'submit'\n | 'switch'\n | 'sync'\n | 'toggle'\n | 'transfer'\n | 'unregister'\n | 'update'\n | 'upload'\n | 'use'\n | 'validate'\n | 'view'\n | 'visit'\n | 'wait'\n | 'warn'\n | 'exit';\n\nexport type MetricEventJoinFlowVersion = 'Other' | 'NewFTE';\nexport type MetricEventMeetingJoinPhase = 'pre-join' | 'join' | 'in-meeting';\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 joinFlowVersion?: MetricEventJoinFlowVersion;\n meetingJoinPhase?: MetricEventMeetingJoinPhase;\n triggeredTime?: string;\n emailInput?: ClientEmailInput;\n userNameInput?: ClientUserNameInput;\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\nexport type Table = 'wbxapp_callend_metrics' | 'business_metrics' | 'business_ucf' | 'default';\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 SubmitBusinessEvent = (args: {\n name: OperationalEvent['metricName'];\n payload: EventPayload;\n metadata?: EventPayload;\n table?: Table;\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\nexport interface IdType {\n meetingId?: string;\n callId?: string;\n}\n\nexport interface IMetricsAttributes {\n type: string;\n version: string;\n userId: string;\n correlationId: string;\n connectionId: string;\n data: any[];\n meetingId?: string;\n callId?: string;\n}\n\nexport interface DelayedClientEvent {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n}\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 ClientUserNameInput = NonNullable<RawClientEvent['userNameInput']>;\n\nexport type ClientEmailInput = NonNullable<RawClientEvent['emailInput']>;\n\nexport type BrowserLaunchMethodType = NonNullable<\n RawEvent['origin']['clientInfo']\n>['browserLaunchMethod'];\n\nexport type MetricEventProduct = 'webex' | 'wxcc_desktop' | 'wxcc_crm' | 'wxcc_sdk';\n\nexport type MetricEventAgent = 'user' | 'browser' | 'system' | 'sdk' | 'redux' | 'service' | 'api';\n\nexport type MetricEventVerb =\n | 'abort'\n | 'accept'\n | 'activate'\n | 'apply'\n | 'answer'\n | 'authorize'\n | 'build'\n | 'cancel'\n | 'change'\n | 'click'\n | 'close'\n | 'complete'\n | 'connect'\n | 'create'\n | 'deactivate'\n | 'decrypt'\n | 'delete'\n | 'deliver'\n | 'destroy'\n | 'disable'\n | 'disconnect'\n | 'dismiss'\n | 'display'\n | 'download'\n | 'edit'\n | 'enable'\n | 'encrypt'\n | 'end'\n | 'expire'\n | 'fail'\n | 'fetch'\n | 'fire'\n | 'generate'\n | 'get'\n | 'hide'\n | 'hover'\n | 'ignore'\n | 'initialize'\n | 'initiate'\n | 'invalidate'\n | 'join'\n | 'list'\n | 'load'\n | 'login'\n | 'logout'\n | 'notify'\n | 'offer'\n | 'open'\n | 'press'\n | 'receive'\n | 'refer'\n | 'refresh'\n | 'register'\n | 'release'\n | 'reload'\n | 'reject'\n | 'request'\n | 'reset'\n | 'resize'\n | 'respond'\n | 'retry'\n | 'revoke'\n | 'save'\n | 'search'\n | 'select'\n | 'send'\n | 'set'\n | 'sign'\n | 'start'\n | 'submit'\n | 'switch'\n | 'sync'\n | 'toggle'\n | 'transfer'\n | 'unregister'\n | 'update'\n | 'upload'\n | 'use'\n | 'validate'\n | 'view'\n | 'visit'\n | 'wait'\n | 'warn'\n | 'exit';\n\nexport type MetricEventJoinFlowVersion = 'Other' | 'NewFTE';\nexport type MetricEventMeetingJoinPhase = 'pre-join' | 'join' | 'in-meeting';\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 joinFlowVersion?: MetricEventJoinFlowVersion;\n meetingJoinPhase?: MetricEventMeetingJoinPhase;\n triggeredTime?: string;\n emailInput?: ClientEmailInput;\n userNameInput?: ClientUserNameInput;\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\nexport type Table = 'wbxapp_callend_metrics' | 'business_metrics' | 'business_ucf' | 'default';\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 SubmitBusinessEvent = (args: {\n name: OperationalEvent['metricName'];\n payload: EventPayload;\n metadata?: EventPayload;\n table?: Table;\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.click.to.interstitial.with.user.delay'\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\nexport interface IdType {\n meetingId?: string;\n callId?: string;\n}\n\nexport interface IMetricsAttributes {\n type: string;\n version: string;\n userId: string;\n correlationId: string;\n connectionId: string;\n data: any[];\n meetingId?: string;\n callId?: string;\n}\n\nexport interface DelayedClientEvent {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n}\n"],"mappings":""}
@@ -160,6 +160,11 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
160
160
  * @returns - latency
161
161
  */
162
162
  getClickToInterstitial(): number;
163
+ /**
164
+ * Click To Interstitial With User Delay
165
+ * @returns - latency
166
+ */
167
+ getClickToInterstitialWithUserDelay(): number;
163
168
  /**
164
169
  * Interstitial To Join Ok
165
170
  * @returns - latency
@@ -180,6 +185,11 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
180
185
  * @returns - latency
181
186
  */
182
187
  getTotalJMT(): number;
188
+ /**
189
+ * Total JMT With User Delay
190
+ * @returns - latency
191
+ */
192
+ getTotalJMTWithUserDelay(): number;
183
193
  /**
184
194
  * Join Conf JMT
185
195
  * @returns - latency
@@ -190,6 +200,11 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
190
200
  * @returns - latency
191
201
  */
192
202
  getTotalMediaJMT(): number;
203
+ /**
204
+ * Total Media JMT With User Delay
205
+ * @returns - latency
206
+ */
207
+ getTotalMediaJMTWithUserDelay(): number;
193
208
  /**
194
209
  * Client JMT
195
210
  * @returns - latency
@@ -76,7 +76,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
76
76
  * @returns
77
77
  */
78
78
  getOrigin(options: GetOriginOptions, meetingId?: string): {
79
- name: "endpoint" | "addin" | "antares" | "appapi" | "beech" | "breakout" | "calendar" | "cb" | "cca" | "ccc" | "cloudproxy" | "crc" | "edonus" | "givr" | "hecate" | "hedge" | "hesiod" | "homer" | "idbroker" | "superhomer" | "l2sip" | "linus" | "locus" | "mbs" | "mcc" | "mcs" | "mercury" | "mes" | "mjs" | "mmp" | "mygdon" | "ngservice" | "orpheus" | "page" | "poros" | "publicapi" | "rhesos" | "terminus" | "tpgw" | "ucc" | "wdm" | "webexivr" | "meetingcontainer";
79
+ name: "endpoint" | "addin" | "antares" | "appapi" | "beech" | "breakout" | "calendar" | "cb" | "cca" | "ccc" | "cloudproxy" | "crc" | "edonus" | "givr" | "hecate" | "hedge" | "hesiod" | "homer" | "idbroker" | "superhomer" | "l2sip" | "linus" | "locus" | "mbs" | "mcc" | "mcs" | "mercury" | "mes" | "mjs" | "mmp" | "mrs" | "mygdon" | "ngpage" | "ngservice" | "oauth" | "orpheus" | "page" | "poros" | "publicapi" | "rhesos" | "terminus" | "tpgw" | "ucc" | "wdm" | "webexivr" | "meetingcontainer";
80
80
  userAgent: string;
81
81
  buildType?: "debug" | "test" | "prod" | "tap" | "analyzer-test";
82
82
  upgradeChannel?: string;
@@ -96,7 +96,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
96
96
  localNetworkPrefix?: string;
97
97
  publicNetworkPrefix?: string;
98
98
  browserLaunchMethod?: "url-handler" | "activex" | "npapi" | "extension" | "cwsapi" | "java" | "tfs" | "webacd" | "thinclient" | "switch-to-web" | "switch-to-native";
99
- clientLaunchMethod?: "url-handler" | "universal-link" | "voice-command" | "notification" | "manual" | "teams-cross-launch" | "mc-cross-launch" | "cws" | "launcher" | "cws-launcher";
99
+ clientLaunchMethod?: "url-handler" | "universal-link" | "voice-command" | "notification" | "manual" | "teams-cross-launch" | "mc-cross-launch" | "cws" | "installer" | "installer-launcher" | "launcher" | "cws-launcher";
100
100
  browser?: string;
101
101
  browserVersion?: string;
102
102
  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" | "TEAMS_PHONE";
@@ -105,6 +105,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
105
105
  clientVersion?: string;
106
106
  clientVersionStatus?: "CURRENT" | "LEGACY" | "UNSUPPORTED";
107
107
  localClientVersion?: string;
108
+ launcherVersion?: string;
108
109
  modelNumber?: string;
109
110
  joinFirstUpdateLater?: "ep-enabled" | "sp-enabled" | "not-enabled";
110
111
  standbyUsed?: boolean;
@@ -186,6 +187,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
186
187
  ivrDialogId?: string;
187
188
  ivrId?: string;
188
189
  callId?: string;
190
+ pairCallId?: string;
189
191
  locusId?: string;
190
192
  locusJoinUrl?: string;
191
193
  locusSessionId?: string;
@@ -237,6 +239,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
237
239
  webexWebDomain?: string;
238
240
  recordingId?: string;
239
241
  clientCorrelationId?: string;
242
+ idForEndpointAB?: string;
240
243
  correlationId: string;
241
244
  additionalProperties?: false;
242
245
  } | {
@@ -270,6 +273,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
270
273
  ivrDialogId?: string;
271
274
  ivrId?: string;
272
275
  callId?: string;
276
+ pairCallId?: string;
273
277
  locusId?: string;
274
278
  locusJoinUrl?: string;
275
279
  locusSessionId?: string;
@@ -321,6 +325,7 @@ export default class CallDiagnosticMetrics extends StatelessWebexPlugin {
321
325
  webexWebDomain?: string;
322
326
  recordingId?: string;
323
327
  clientCorrelationId?: string;
328
+ idForEndpointAB?: string;
324
329
  correlationId: string;
325
330
  additionalProperties?: false;
326
331
  };
@@ -152,7 +152,7 @@ export type BuildClientEventFetchRequestOptions = (args: {
152
152
  payload?: RecursivePartial<ClientEvent['payload']>;
153
153
  options?: SubmitClientEventOptions;
154
154
  }) => Promise<any>;
155
- export type PreComputedLatencies = 'internal.client.pageJMT' | 'internal.download.time' | 'internal.get.cluster.time' | 'internal.click.to.interstitial' | 'internal.refresh.captcha.time' | 'internal.exchange.ci.token.time' | 'internal.get.u2c.time' | 'internal.call.init.join.req' | 'internal.other.app.api.time' | 'internal.api.fetch.intelligence.models';
155
+ export type PreComputedLatencies = 'internal.client.pageJMT' | 'internal.download.time' | 'internal.get.cluster.time' | 'internal.click.to.interstitial' | 'internal.click.to.interstitial.with.user.delay' | 'internal.refresh.captcha.time' | 'internal.exchange.ci.token.time' | 'internal.get.u2c.time' | 'internal.call.init.join.req' | 'internal.other.app.api.time' | 'internal.api.fetch.intelligence.models';
156
156
  export interface IdType {
157
157
  meetingId?: string;
158
158
  callId?: string;
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.8.1-next.2",
30
- "@webex/test-helper-mocha": "3.8.1-next.2",
31
- "@webex/test-helper-mock-webex": "3.8.1-next.2",
32
- "@webex/test-helper-test-users": "3.8.1-next.2",
29
+ "@webex/test-helper-chai": "3.8.1-next.4",
30
+ "@webex/test-helper-mocha": "3.8.1-next.4",
31
+ "@webex/test-helper-mock-webex": "3.8.1-next.4",
32
+ "@webex/test-helper-test-users": "3.8.1-next.4",
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.8.1-next.2",
39
- "@webex/common-timers": "3.8.1-next.2",
40
- "@webex/event-dictionary-ts": "^1.0.1753",
41
- "@webex/internal-plugin-metrics": "3.8.1-next.2",
42
- "@webex/test-helper-chai": "3.8.1-next.2",
43
- "@webex/test-helper-mock-webex": "3.8.1-next.2",
44
- "@webex/webex-core": "3.8.1-next.2",
38
+ "@webex/common": "3.8.1-next.4",
39
+ "@webex/common-timers": "3.8.1-next.4",
40
+ "@webex/event-dictionary-ts": "^1.0.1819",
41
+ "@webex/internal-plugin-metrics": "3.8.1-next.4",
42
+ "@webex/test-helper-chai": "3.8.1-next.4",
43
+ "@webex/test-helper-mock-webex": "3.8.1-next.4",
44
+ "@webex/webex-core": "3.8.1-next.4",
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.8.1-next.2"
57
+ "version": "3.8.1-next.4"
58
58
  }
@@ -336,6 +336,30 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
336
336
  return undefined;
337
337
  }
338
338
 
339
+ /**
340
+ * Click To Interstitial With User Delay
341
+ * @returns - latency
342
+ */
343
+ public getClickToInterstitialWithUserDelay() {
344
+ // for normal join (where green join button exists before interstitial, i.e reminder, space list etc)
345
+ if (this.latencyTimestamps.get('internal.client.meeting.click.joinbutton')) {
346
+ return this.getDiffBetweenTimestamps(
347
+ 'internal.client.meeting.click.joinbutton',
348
+ 'internal.client.meeting.interstitial-window.showed'
349
+ );
350
+ }
351
+
352
+ const clickToInterstitialWithUserDelayLatency = this.precomputedLatencies.get(
353
+ 'internal.click.to.interstitial.with.user.delay'
354
+ );
355
+
356
+ if (typeof clickToInterstitialWithUserDelayLatency === 'number') {
357
+ return clickToInterstitialWithUserDelayLatency;
358
+ }
359
+
360
+ return undefined;
361
+ }
362
+
339
363
  /**
340
364
  * Interstitial To Join Ok
341
365
  * @returns - latency
@@ -395,6 +419,24 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
395
419
  return undefined;
396
420
  }
397
421
 
422
+ /**
423
+ * Total JMT With User Delay
424
+ * @returns - latency
425
+ */
426
+ public getTotalJMTWithUserDelay() {
427
+ const clickToInterstitialWithUserDelay = this.getClickToInterstitialWithUserDelay();
428
+ const interstitialToJoinOk = this.getInterstitialToJoinOK();
429
+
430
+ if (
431
+ typeof clickToInterstitialWithUserDelay === 'number' &&
432
+ typeof interstitialToJoinOk === 'number'
433
+ ) {
434
+ return clickToInterstitialWithUserDelay + interstitialToJoinOk;
435
+ }
436
+
437
+ return undefined;
438
+ }
439
+
398
440
  /**
399
441
  * Join Conf JMT
400
442
  * @returns - latency
@@ -432,6 +474,22 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
432
474
  return undefined;
433
475
  }
434
476
 
477
+ /**
478
+ * Total Media JMT With User Delay
479
+ * @returns - latency
480
+ */
481
+ public getTotalMediaJMTWithUserDelay() {
482
+ const clickToInterstitialWithUserDelay = this.getClickToInterstitialWithUserDelay();
483
+ const interstitialToJoinOk = this.getInterstitialToJoinOK();
484
+ const joinConfJMT = this.getJoinConfJMT();
485
+
486
+ if (clickToInterstitialWithUserDelay && interstitialToJoinOk && joinConfJMT) {
487
+ return clickToInterstitialWithUserDelay + interstitialToJoinOk + joinConfJMT;
488
+ }
489
+
490
+ return undefined;
491
+ }
492
+
435
493
  /**
436
494
  * Client JMT
437
495
  * @returns - latency
@@ -257,6 +257,7 @@ export const prepareDiagnosticMetricItem = (webex: any, item: any) => {
257
257
  switch (eventName) {
258
258
  case 'client.webexapp.launched':
259
259
  joinTimes.downloadTime = cdl.getDownloadTimeJMT();
260
+ joinTimes.pageJmt = cdl.getPageJMT();
260
261
  break;
261
262
  case 'client.login.end':
262
263
  joinTimes.otherAppApiReqResp = cdl.getOtherAppApiReqResp();
@@ -267,6 +268,7 @@ export const prepareDiagnosticMetricItem = (webex: any, item: any) => {
267
268
  joinTimes.clickToInterstitial = cdl.getClickToInterstitial();
268
269
  joinTimes.refreshCaptchaServiceReqResp = cdl.getRefreshCaptchaReqResp();
269
270
  joinTimes.downloadIntelligenceModelsReqResp = cdl.getDownloadIntelligenceModelsReqResp();
271
+ joinTimes.clickToInterstitialWithUserDelay = cdl.getClickToInterstitialWithUserDelay();
270
272
  break;
271
273
 
272
274
  case 'client.call.initiated':
@@ -287,6 +289,8 @@ export const prepareDiagnosticMetricItem = (webex: any, item: any) => {
287
289
  joinTimes.totalJmt = cdl.getTotalJMT();
288
290
  joinTimes.clientJmt = cdl.getClientJMT();
289
291
  joinTimes.downloadTime = cdl.getDownloadTimeJMT();
292
+ joinTimes.clickToInterstitialWithUserDelay = cdl.getClickToInterstitialWithUserDelay();
293
+ joinTimes.totalJMTWithUserDelay = cdl.getTotalJMTWithUserDelay();
290
294
  break;
291
295
 
292
296
  case 'client.ice.end':
@@ -307,6 +311,8 @@ export const prepareDiagnosticMetricItem = (webex: any, item: any) => {
307
311
  joinTimes.interstitialToMediaOKJMT = cdl.getInterstitialToMediaOKJMT();
308
312
  joinTimes.callInitMediaEngineReady = cdl.getCallInitMediaEngineReady();
309
313
  joinTimes.stayLobbyTime = cdl.getStayLobbyTime();
314
+ joinTimes.totalMediaJMTWithUserDelay = cdl.getTotalMediaJMTWithUserDelay();
315
+ joinTimes.totalJMTWithUserDelay = cdl.getTotalJMTWithUserDelay();
310
316
  break;
311
317
 
312
318
  case 'client.media.tx.start':
@@ -311,6 +311,7 @@ export type PreComputedLatencies =
311
311
  | 'internal.download.time'
312
312
  | 'internal.get.cluster.time'
313
313
  | 'internal.click.to.interstitial'
314
+ | 'internal.click.to.interstitial.with.user.delay'
314
315
  | 'internal.refresh.captcha.time'
315
316
  | 'internal.exchange.ci.token.time'
316
317
  | 'internal.get.u2c.time'
@@ -108,6 +108,8 @@ describe('plugin-metrics', () => {
108
108
  .returns(10);
109
109
  webex.internal.newMetrics.callDiagnosticLatencies.getDownloadIntelligenceModelsReqResp =
110
110
  sinon.stub().returns(42);
111
+ webex.internal.newMetrics.callDiagnosticLatencies.getClickToInterstitialWithUserDelay =
112
+ sinon.stub().returns(12);
111
113
 
112
114
  const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
113
115
  //@ts-ignore
@@ -127,6 +129,7 @@ describe('plugin-metrics', () => {
127
129
  meetingInfoReqResp: 10,
128
130
  refreshCaptchaServiceReqResp: 10,
129
131
  downloadIntelligenceModelsReqResp: 42,
132
+ clickToInterstitialWithUserDelay: 12,
130
133
  },
131
134
  });
132
135
  assert.lengthOf(
@@ -183,9 +186,15 @@ describe('plugin-metrics', () => {
183
186
  webex.internal.newMetrics.callDiagnosticLatencies.getCallInitJoinReq = sinon
184
187
  .stub()
185
188
  .returns(10);
186
- webex.internal.newMetrics.callDiagnosticLatencies.getDownloadTimeJMT = sinon
189
+ webex.internal.newMetrics.callDiagnosticLatencies.getDownloadTimeJMT = sinon
187
190
  .stub()
188
191
  .returns(100);
192
+ webex.internal.newMetrics.callDiagnosticLatencies.getClickToInterstitialWithUserDelay = sinon
193
+ .stub()
194
+ .returns(43);
195
+ webex.internal.newMetrics.callDiagnosticLatencies.getTotalJMTWithUserDelay = sinon
196
+ .stub()
197
+ .returns(64);
189
198
  const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
190
199
  //@ts-ignore
191
200
  {event: {name: 'client.locus.join.response'}}
@@ -209,6 +218,8 @@ describe('plugin-metrics', () => {
209
218
  totalJmt: 20,
210
219
  clientJmt: 5,
211
220
  downloadTime: 100,
221
+ clickToInterstitialWithUserDelay: 43,
222
+ totalJMTWithUserDelay: 64,
212
223
  },
213
224
  });
214
225
  assert.lengthOf(
@@ -338,6 +349,12 @@ describe('plugin-metrics', () => {
338
349
  webex.internal.newMetrics.callDiagnosticLatencies.getStayLobbyTime = sinon
339
350
  .stub()
340
351
  .returns(1);
352
+ webex.internal.newMetrics.callDiagnosticLatencies.getTotalMediaJMTWithUserDelay = sinon
353
+ .stub()
354
+ .returns(43);
355
+ webex.internal.newMetrics.callDiagnosticLatencies.getTotalJMTWithUserDelay = sinon
356
+ .stub()
357
+ .returns(64);
341
358
  const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
342
359
  //@ts-ignore
343
360
  {event: {name: 'client.media-engine.ready'}}
@@ -356,6 +373,8 @@ describe('plugin-metrics', () => {
356
373
  interstitialToMediaOKJMT: 22,
357
374
  callInitMediaEngineReady: 10,
358
375
  stayLobbyTime: 1,
376
+ totalMediaJMTWithUserDelay: 43,
377
+ totalJMTWithUserDelay: 64,
359
378
  },
360
379
  });
361
380
  assert.lengthOf(
@@ -446,6 +446,36 @@ describe('internal-plugin-metrics', () => {
446
446
  assert.deepEqual(cdl.getClickToInterstitial(), 0);
447
447
  });
448
448
 
449
+ it('calculates getClickToInterstitialWithUserDelay correctly', () => {
450
+ cdl.saveTimestamp({
451
+ key: 'internal.client.meeting.click.joinbutton',
452
+ value: 10,
453
+ });
454
+ cdl.saveTimestamp({
455
+ key: 'internal.client.meeting.interstitial-window.showed',
456
+ value: 20,
457
+ });
458
+ assert.deepEqual(cdl.getClickToInterstitialWithUserDelay(), 10);
459
+ });
460
+
461
+ it('calculates getClickToInterstitialWithUserDelay without join button timestamp', () => {
462
+ cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 5);
463
+ cdl.saveTimestamp({
464
+ key: 'internal.client.meeting.interstitial-window.showed',
465
+ value: 20,
466
+ });
467
+ assert.deepEqual(cdl.getClickToInterstitialWithUserDelay(), 5);
468
+ });
469
+
470
+ it('calculates getClickToInterstitialWithUserDelay without join button timestamp when it is 0', () => {
471
+ cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 0);
472
+ cdl.saveTimestamp({
473
+ key: 'internal.client.meeting.interstitial-window.showed',
474
+ value: 20,
475
+ });
476
+ assert.deepEqual(cdl.getClickToInterstitialWithUserDelay(), 0);
477
+ });
478
+
449
479
  it('calculates getInterstitialToJoinOK correctly', () => {
450
480
  cdl.saveTimestamp({
451
481
  key: 'internal.client.interstitial-window.click.joinbutton',
@@ -554,6 +584,78 @@ describe('internal-plugin-metrics', () => {
554
584
  assert.deepEqual(cdl.getTotalJMT(), undefined);
555
585
  });
556
586
 
587
+ it('calculates getTotalJMTWithUserDelay correctly', () => {
588
+ cdl.saveTimestamp({
589
+ key: 'internal.client.interstitial-window.click.joinbutton',
590
+ value: 5,
591
+ });
592
+ cdl.saveTimestamp({
593
+ key: 'internal.client.meeting.click.joinbutton',
594
+ value: 10,
595
+ });
596
+ cdl.saveTimestamp({
597
+ key: 'internal.client.meeting.interstitial-window.showed',
598
+ value: 20,
599
+ });
600
+ cdl.saveTimestamp({
601
+ key: 'client.locus.join.response',
602
+ value: 40,
603
+ });
604
+ assert.deepEqual(cdl.getTotalJMTWithUserDelay(), 45);
605
+ });
606
+
607
+ it('calculates getTotalJMTWithUserDelay correctly when clickToInterstitialWithUserDelay is 0', () => {
608
+ cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 0);
609
+ cdl.saveTimestamp({
610
+ key: 'internal.client.interstitial-window.click.joinbutton',
611
+ value: 20,
612
+ });
613
+ cdl.saveTimestamp({
614
+ key: 'client.locus.join.response',
615
+ value: 40,
616
+ });
617
+ assert.deepEqual(cdl.getTotalJMTWithUserDelay(), 20);
618
+ });
619
+
620
+ it('calculates getTotalJMTWithUserDelay correctly when interstitialToJoinOk is 0', () => {
621
+ cdl.saveTimestamp({
622
+ key: 'internal.client.interstitial-window.click.joinbutton',
623
+ value: 40,
624
+ });
625
+ cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 12);
626
+ cdl.saveTimestamp({
627
+ key: 'client.locus.join.response',
628
+ value: 40,
629
+ });
630
+ assert.deepEqual(cdl.getTotalJMTWithUserDelay(), 12);
631
+ });
632
+
633
+ it('calculates getTotalJMTWithUserDelay correctly when both clickToInterstitialWithUserDelay and interstitialToJoinOk are 0', () => {
634
+ cdl.saveTimestamp({
635
+ key: 'internal.client.interstitial-window.click.joinbutton',
636
+ value: 40,
637
+ });
638
+ cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 0);
639
+ cdl.saveTimestamp({
640
+ key: 'client.locus.join.response',
641
+ value: 40,
642
+ });
643
+ assert.deepEqual(cdl.getTotalJMTWithUserDelay(), 0);
644
+ });
645
+
646
+ it('calculates getTotalJMTWithUserDelay correctly when both clickToInterstitialWithUserDelay is not a number', () => {
647
+ cdl.saveTimestamp({
648
+ key: 'internal.client.interstitial-window.click.joinbutton',
649
+ value: 40,
650
+ });
651
+ cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 'eleven' as unknown as number);
652
+ cdl.saveTimestamp({
653
+ key: 'client.locus.join.response',
654
+ value: 40,
655
+ });
656
+ assert.deepEqual(cdl.getTotalJMTWithUserDelay(), undefined);
657
+ });
658
+
557
659
  it('calculates getTotalMediaJMT correctly', () => {
558
660
  cdl.saveTimestamp({
559
661
  key: 'internal.client.meeting.click.joinbutton',
@@ -627,6 +729,71 @@ describe('internal-plugin-metrics', () => {
627
729
  assert.deepEqual(cdl.getTotalMediaJMT(), 31);
628
730
  });
629
731
 
732
+ it('calculates getTotalMediaJMTWithUserDelay correctly', () => {
733
+ cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 7);
734
+ cdl.saveTimestamp({
735
+ key: 'internal.client.interstitial-window.click.joinbutton',
736
+ value: 10,
737
+ });
738
+ cdl.saveTimestamp({
739
+ key: 'client.locus.join.request',
740
+ value: 12,
741
+ });
742
+ cdl.saveTimestamp({
743
+ key: 'client.locus.join.response',
744
+ value: 20,
745
+ });
746
+ cdl.saveTimestamp({
747
+ key: 'internal.host.meeting.participant.admitted',
748
+ value: 24,
749
+ });
750
+ cdl.saveTimestamp({
751
+ key: 'client.ice.start',
752
+ value: 30,
753
+ });
754
+ cdl.saveTimestamp({
755
+ key: 'client.ice.end',
756
+ value: 40,
757
+ });
758
+ assert.deepEqual(cdl.getTotalMediaJMTWithUserDelay(), 35);
759
+ });
760
+
761
+ it('calculates getTotalMediaJMTWithUserDelay correctly for guest join', () => {
762
+ cdl.saveTimestamp({
763
+ key: 'internal.client.meeting.click.joinbutton',
764
+ value: 5,
765
+ });
766
+ cdl.saveTimestamp({
767
+ key: 'internal.client.meeting.interstitial-window.showed',
768
+ value: 8,
769
+ });
770
+ cdl.saveTimestamp({
771
+ key: 'internal.client.interstitial-window.click.joinbutton',
772
+ value: 10,
773
+ });
774
+ cdl.saveTimestamp({
775
+ key: 'client.locus.join.request',
776
+ value: 12,
777
+ });
778
+ cdl.saveTimestamp({
779
+ key: 'client.locus.join.response',
780
+ value: 20,
781
+ });
782
+ cdl.saveTimestamp({
783
+ key: 'internal.host.meeting.participant.admitted',
784
+ value: 24,
785
+ });
786
+ cdl.saveTimestamp({
787
+ key: 'client.ice.start',
788
+ value: 30,
789
+ });
790
+ cdl.saveTimestamp({
791
+ key: 'client.ice.end',
792
+ value: 40,
793
+ });
794
+ assert.deepEqual(cdl.getTotalMediaJMTWithUserDelay(), 31);
795
+ });
796
+
630
797
  it('calculates getJoinConfJMT correctly', () => {
631
798
  cdl.saveTimestamp({
632
799
  key: 'client.locus.join.request',
@@ -327,6 +327,7 @@ describe('internal-plugin-metrics', () => {
327
327
  {
328
328
  joinTimes: {
329
329
  downloadTime: undefined,
330
+ pageJmt: undefined,
330
331
  },
331
332
  },
332
333
  ],
@@ -338,6 +339,7 @@ describe('internal-plugin-metrics', () => {
338
339
  meetingInfoReqResp: undefined,
339
340
  refreshCaptchaServiceReqResp: undefined,
340
341
  downloadIntelligenceModelsReqResp: undefined,
342
+ clickToInterstitialWithUserDelay: undefined,
341
343
  },
342
344
  },
343
345
  ],
@@ -366,6 +368,8 @@ describe('internal-plugin-metrics', () => {
366
368
  totalJmt: undefined,
367
369
  clientJmt: undefined,
368
370
  downloadTime: undefined,
371
+ clickToInterstitialWithUserDelay: undefined,
372
+ totalJMTWithUserDelay: undefined,
369
373
  },
370
374
  },
371
375
  ],
@@ -402,6 +406,8 @@ describe('internal-plugin-metrics', () => {
402
406
  interstitialToMediaOKJMT: undefined,
403
407
  callInitMediaEngineReady: undefined,
404
408
  stayLobbyTime: undefined,
409
+ totalMediaJMTWithUserDelay: undefined,
410
+ totalJMTWithUserDelay: undefined,
405
411
  },
406
412
  },
407
413
  ],
@@ -76,6 +76,7 @@ describe('internal-plugin-metrics', () => {
76
76
  clickToInterstitial: undefined,
77
77
  refreshCaptchaServiceReqResp: undefined,
78
78
  downloadIntelligenceModelsReqResp: undefined,
79
+ clickToInterstitialWithUserDelay: undefined,
79
80
  },
80
81
  name: 'client.interstitial-window.launched',
81
82
  },