@webex/internal-plugin-metrics 3.12.0-next.4 → 3.12.0-next.5

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.
@@ -443,9 +443,9 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
443
443
  key: "getTotalJMT",
444
444
  value: function getTotalJMT() {
445
445
  var clickToInterstitial = this.getClickToInterstitial();
446
- var interstitialToJoinOk = this.getInterstitialToJoinOK();
447
- if (typeof clickToInterstitial === 'number' && typeof interstitialToJoinOk === 'number') {
448
- return (0, _lodash.clamp)(clickToInterstitial + interstitialToJoinOk, 0, this.MAX_INTEGER);
446
+ var interstitialClickJoinToJoinLocusResponse = this.getDiffBetweenTimestamps('internal.client.interstitial-window.click.joinbutton', 'client.locus.join.response');
447
+ if (typeof clickToInterstitial === 'number' && typeof interstitialClickJoinToJoinLocusResponse === 'number') {
448
+ return (0, _lodash.clamp)(clickToInterstitial + interstitialClickJoinToJoinLocusResponse, 0, this.MAX_INTEGER);
449
449
  }
450
450
  return undefined;
451
451
  }
@@ -458,9 +458,9 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
458
458
  key: "getTotalJMTWithUserDelay",
459
459
  value: function getTotalJMTWithUserDelay() {
460
460
  var clickToInterstitialWithUserDelay = this.getClickToInterstitialWithUserDelay();
461
- var interstitialToJoinOk = this.getInterstitialToJoinOK();
462
- if (typeof clickToInterstitialWithUserDelay === 'number' && typeof interstitialToJoinOk === 'number') {
463
- return (0, _lodash.clamp)(clickToInterstitialWithUserDelay + interstitialToJoinOk, 0, this.MAX_INTEGER);
461
+ var interstitialShowedToJoinLocusResponse = this.getDiffBetweenTimestamps('internal.client.meeting.interstitial-window.showed', 'client.locus.join.response');
462
+ if (typeof clickToInterstitialWithUserDelay === 'number' && typeof interstitialShowedToJoinLocusResponse === 'number') {
463
+ return (0, _lodash.clamp)(clickToInterstitialWithUserDelay + interstitialShowedToJoinLocusResponse, 0, this.MAX_INTEGER);
464
464
  }
465
465
  return undefined;
466
466
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_webexCore","require","_lodash","_callSuper","t","o","e","_getPrototypeOf2","default","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","apply","Boolean","prototype","valueOf","call","CallDiagnosticLatencies","exports","_WebexPlugin","_this","_classCallCheck2","_len","arguments","length","args","Array","_key","concat","_defineProperty2","latencyTimestamps","_map","precomputedLatencies","_inherits2","_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","clampValues","end","diff","_ref2","_ref2$minimum","minimum","_ref2$maximum","maximum","MAX_INTEGER","clamp","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","interstitialToMediaOKJmt","getTotalJMT","clickToInterstitial","interstitialToJoinOk","getTotalJMTWithUserDelay","clickToInterstitialWithUserDelay","getJoinConfJMT","joinReqResp","ICESetupTime","getTotalMediaJMT","joinConfJMT","_this$getMeeting","totalMediaJMT","Infinity","allowMediaInLobby","getTotalMediaJMTWithUserDelay","getClientJMT","getAudioJoinRespRxStart","getVideoJoinRespRxStart","getReachabilityClustersReqResp","reachablityClusterReqResp","getAudioJoinRespTxStart","getVideoJoinRespTxStart","getShareDuration","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';\nimport {clamp} from 'lodash';\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 private MAX_INTEGER = 2147483647;\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(\n a: MetricEventNames,\n b: MetricEventNames,\n clampValues?: {minimum?: number; maximum?: number}\n ) {\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 undefined;\n }\n\n const diff = end - start;\n\n const {minimum = 0, maximum = this.MAX_INTEGER} = clampValues || {};\n\n return clamp(diff, minimum, maximum);\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 {maximum: 1200000}\n );\n }\n\n /**\n * Interstitial Time\n * @returns - latency\n */\n public getShowInterstitialTime() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meeting.interstitial-window.showed',\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 {maximum: 1200000}\n );\n }\n\n /**\n * Locus Join Request\n * @returns - latency\n */\n public getJoinReqResp() {\n return this.getDiffBetweenTimestamps(\n 'client.locus.join.request',\n 'client.locus.join.response',\n {maximum: 1200000}\n );\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 {maximum: 1200000}\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', {maximum: 1200000});\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('client.locus.join.response', 'client.lobby.exited');\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' ? clamp(latency, 0, this.MAX_INTEGER) : 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' ? clamp(latency, 0, this.MAX_INTEGER) : 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 clamp(clickToInterstitialLatency, 0, this.MAX_INTEGER);\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 clamp(clickToInterstitialWithUserDelayLatency, 0, this.MAX_INTEGER);\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 {maximum: 1200000}\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 const interstitialToMediaOKJmt = connectedMedia - interstitialJoinClickTimestamp - lobbyTime;\n\n return clamp(interstitialToMediaOKJmt, 0, this.MAX_INTEGER);\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 clamp(clickToInterstitial + interstitialToJoinOk, 0, this.MAX_INTEGER);\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 clamp(clickToInterstitialWithUserDelay + interstitialToJoinOk, 0, this.MAX_INTEGER);\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 clamp(joinReqResp + ICESetupTime, 0, this.MAX_INTEGER);\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 lobbyTimeLatency = this.getStayLobbyTime();\n const lobbyTime = typeof lobbyTimeLatency === 'number' ? lobbyTimeLatency : 0;\n\n if (clickToInterstitial && interstitialToJoinOk && joinConfJMT) {\n const totalMediaJMT = clamp(\n clickToInterstitial + interstitialToJoinOk + joinConfJMT,\n 0,\n Infinity\n );\n if (this.getMeeting()?.allowMediaInLobby) {\n return clamp(totalMediaJMT, 0, this.MAX_INTEGER);\n }\n\n return clamp(totalMediaJMT - lobbyTime, 0, this.MAX_INTEGER);\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 clamp(\n clickToInterstitialWithUserDelay + interstitialToJoinOk + joinConfJMT,\n 0,\n this.MAX_INTEGER\n );\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 clamp(interstitialToJoinOk - joinConfJMT, 0, this.MAX_INTEGER);\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 ? clamp(Math.floor(reachablityClusterReqResp), 0, this.MAX_INTEGER)\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 * Time from share initiation to share stop (ms).\n */\n public getShareDuration() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.share.initiated',\n 'internal.client.share.stopped'\n );\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'\n ? clamp(Math.floor(exchangeCITokenJMT), 0, this.MAX_INTEGER)\n : 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 ? clamp(Math.floor(refreshCaptchaReqResp), 0, this.MAX_INTEGER)\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 ? clamp(Math.floor(downloadIntelligenceModelsReqResp), 0, this.MAX_INTEGER)\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 ? clamp(Math.floor(otherAppApiJMT), 0, this.MAX_INTEGER) : undefined;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_webexCore","require","_lodash","_callSuper","t","o","e","_getPrototypeOf2","default","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","apply","Boolean","prototype","valueOf","call","CallDiagnosticLatencies","exports","_WebexPlugin","_this","_classCallCheck2","_len","arguments","length","args","Array","_key","concat","_defineProperty2","latencyTimestamps","_map","precomputedLatencies","_inherits2","_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","clampValues","end","diff","_ref2","_ref2$minimum","minimum","_ref2$maximum","maximum","MAX_INTEGER","clamp","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","interstitialToMediaOKJmt","getTotalJMT","clickToInterstitial","interstitialClickJoinToJoinLocusResponse","getTotalJMTWithUserDelay","clickToInterstitialWithUserDelay","interstitialShowedToJoinLocusResponse","getJoinConfJMT","joinReqResp","ICESetupTime","getTotalMediaJMT","interstitialToJoinOk","joinConfJMT","_this$getMeeting","totalMediaJMT","Infinity","allowMediaInLobby","getTotalMediaJMTWithUserDelay","getClientJMT","getAudioJoinRespRxStart","getVideoJoinRespRxStart","getReachabilityClustersReqResp","reachablityClusterReqResp","getAudioJoinRespTxStart","getVideoJoinRespTxStart","getShareDuration","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';\nimport {clamp} from 'lodash';\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 private MAX_INTEGER = 2147483647;\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(\n a: MetricEventNames,\n b: MetricEventNames,\n clampValues?: {minimum?: number; maximum?: number}\n ) {\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 undefined;\n }\n\n const diff = end - start;\n\n const {minimum = 0, maximum = this.MAX_INTEGER} = clampValues || {};\n\n return clamp(diff, minimum, maximum);\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 {maximum: 1200000}\n );\n }\n\n /**\n * Interstitial Time\n * @returns - latency\n */\n public getShowInterstitialTime() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meeting.interstitial-window.showed',\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 {maximum: 1200000}\n );\n }\n\n /**\n * Locus Join Request\n * @returns - latency\n */\n public getJoinReqResp() {\n return this.getDiffBetweenTimestamps(\n 'client.locus.join.request',\n 'client.locus.join.response',\n {maximum: 1200000}\n );\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 {maximum: 1200000}\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', {maximum: 1200000});\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('client.locus.join.response', 'client.lobby.exited');\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' ? clamp(latency, 0, this.MAX_INTEGER) : 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' ? clamp(latency, 0, this.MAX_INTEGER) : 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 clamp(clickToInterstitialLatency, 0, this.MAX_INTEGER);\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 clamp(clickToInterstitialWithUserDelayLatency, 0, this.MAX_INTEGER);\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 {maximum: 1200000}\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 const interstitialToMediaOKJmt = connectedMedia - interstitialJoinClickTimestamp - lobbyTime;\n\n return clamp(interstitialToMediaOKJmt, 0, this.MAX_INTEGER);\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 interstitialClickJoinToJoinLocusResponse = this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.locus.join.response'\n );\n\n if (\n typeof clickToInterstitial === 'number' &&\n typeof interstitialClickJoinToJoinLocusResponse === 'number'\n ) {\n return clamp(\n clickToInterstitial + interstitialClickJoinToJoinLocusResponse,\n 0,\n this.MAX_INTEGER\n );\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 interstitialShowedToJoinLocusResponse = this.getDiffBetweenTimestamps(\n 'internal.client.meeting.interstitial-window.showed',\n 'client.locus.join.response'\n );\n\n if (\n typeof clickToInterstitialWithUserDelay === 'number' &&\n typeof interstitialShowedToJoinLocusResponse === 'number'\n ) {\n return clamp(\n clickToInterstitialWithUserDelay + interstitialShowedToJoinLocusResponse,\n 0,\n this.MAX_INTEGER\n );\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 clamp(joinReqResp + ICESetupTime, 0, this.MAX_INTEGER);\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 lobbyTimeLatency = this.getStayLobbyTime();\n const lobbyTime = typeof lobbyTimeLatency === 'number' ? lobbyTimeLatency : 0;\n\n if (clickToInterstitial && interstitialToJoinOk && joinConfJMT) {\n const totalMediaJMT = clamp(\n clickToInterstitial + interstitialToJoinOk + joinConfJMT,\n 0,\n Infinity\n );\n if (this.getMeeting()?.allowMediaInLobby) {\n return clamp(totalMediaJMT, 0, this.MAX_INTEGER);\n }\n\n return clamp(totalMediaJMT - lobbyTime, 0, this.MAX_INTEGER);\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 clamp(\n clickToInterstitialWithUserDelay + interstitialToJoinOk + joinConfJMT,\n 0,\n this.MAX_INTEGER\n );\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 clamp(interstitialToJoinOk - joinConfJMT, 0, this.MAX_INTEGER);\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 ? clamp(Math.floor(reachablityClusterReqResp), 0, this.MAX_INTEGER)\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 * Time from share initiation to share stop (ms).\n */\n public getShareDuration() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.share.initiated',\n 'internal.client.share.stopped'\n );\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'\n ? clamp(Math.floor(exchangeCITokenJMT), 0, this.MAX_INTEGER)\n : 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 ? clamp(Math.floor(refreshCaptchaReqResp), 0, this.MAX_INTEGER)\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 ? clamp(Math.floor(downloadIntelligenceModelsReqResp), 0, this.MAX_INTEGER)\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 ? clamp(Math.floor(otherAppApiJMT), 0, this.MAX_INTEGER) : undefined;\n }\n}\n"],"mappings":"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","ignoreList":[]}
package/dist/metrics.js CHANGED
@@ -147,7 +147,7 @@ var Metrics = _webexCore.WebexPlugin.extend({
147
147
  }
148
148
  });
149
149
  },
150
- version: "3.12.0-next.4"
150
+ version: "3.12.0-next.5"
151
151
  });
152
152
  var _default = exports.default = Metrics;
153
153
  //# sourceMappingURL=metrics.js.map
package/package.json CHANGED
@@ -40,7 +40,7 @@
40
40
  "@webex/common-timers": "3.11.0-next.1",
41
41
  "@webex/test-helper-chai": "3.11.0-next.1",
42
42
  "@webex/test-helper-mock-webex": "3.11.0-next.1",
43
- "@webex/webex-core": "3.12.0-next.4",
43
+ "@webex/webex-core": "3.12.0-next.5",
44
44
  "ip-anonymize": "^0.1.0",
45
45
  "lodash": "^4.17.21",
46
46
  "uuid": "^3.3.2"
@@ -53,5 +53,5 @@
53
53
  "test:style": "eslint ./src/**/*.*",
54
54
  "test:unit": "webex-legacy-tools test --unit --runner mocha"
55
55
  },
56
- "version": "3.12.0-next.4"
56
+ "version": "3.12.0-next.5"
57
57
  }
@@ -427,10 +427,20 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
427
427
  */
428
428
  public getTotalJMT() {
429
429
  const clickToInterstitial = this.getClickToInterstitial();
430
- const interstitialToJoinOk = this.getInterstitialToJoinOK();
430
+ const interstitialClickJoinToJoinLocusResponse = this.getDiffBetweenTimestamps(
431
+ 'internal.client.interstitial-window.click.joinbutton',
432
+ 'client.locus.join.response'
433
+ );
431
434
 
432
- if (typeof clickToInterstitial === 'number' && typeof interstitialToJoinOk === 'number') {
433
- return clamp(clickToInterstitial + interstitialToJoinOk, 0, this.MAX_INTEGER);
435
+ if (
436
+ typeof clickToInterstitial === 'number' &&
437
+ typeof interstitialClickJoinToJoinLocusResponse === 'number'
438
+ ) {
439
+ return clamp(
440
+ clickToInterstitial + interstitialClickJoinToJoinLocusResponse,
441
+ 0,
442
+ this.MAX_INTEGER
443
+ );
434
444
  }
435
445
 
436
446
  return undefined;
@@ -442,13 +452,20 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
442
452
  */
443
453
  public getTotalJMTWithUserDelay() {
444
454
  const clickToInterstitialWithUserDelay = this.getClickToInterstitialWithUserDelay();
445
- const interstitialToJoinOk = this.getInterstitialToJoinOK();
455
+ const interstitialShowedToJoinLocusResponse = this.getDiffBetweenTimestamps(
456
+ 'internal.client.meeting.interstitial-window.showed',
457
+ 'client.locus.join.response'
458
+ );
446
459
 
447
460
  if (
448
461
  typeof clickToInterstitialWithUserDelay === 'number' &&
449
- typeof interstitialToJoinOk === 'number'
462
+ typeof interstitialShowedToJoinLocusResponse === 'number'
450
463
  ) {
451
- return clamp(clickToInterstitialWithUserDelay + interstitialToJoinOk, 0, this.MAX_INTEGER);
464
+ return clamp(
465
+ clickToInterstitialWithUserDelay + interstitialShowedToJoinLocusResponse,
466
+ 0,
467
+ this.MAX_INTEGER
468
+ );
452
469
  }
453
470
 
454
471
  return undefined;
@@ -668,7 +668,7 @@ describe('internal-plugin-metrics', () => {
668
668
  assert.deepEqual(cdl.getTotalJMT(), 20);
669
669
  });
670
670
 
671
- it('calculates getTotalJMT correctly when interstitialToJoinOk is 0', () => {
671
+ it('calculates getTotalJMT correctly when interstitialClickJoinToJoinLocusResponse is 0', () => {
672
672
  cdl.saveTimestamp({
673
673
  key: 'internal.client.interstitial-window.click.joinbutton',
674
674
  value: 40,
@@ -681,7 +681,7 @@ describe('internal-plugin-metrics', () => {
681
681
  assert.deepEqual(cdl.getTotalJMT(), 12);
682
682
  });
683
683
 
684
- it('calculates getTotalJMT correctly when both clickToInterstitial and interstitialToJoinOk are 0', () => {
684
+ it('calculates getTotalJMT correctly when both clickToInterstitial and interstitialClickJoinToJoinLocusResponse are 0', () => {
685
685
  cdl.saveTimestamp({
686
686
  key: 'internal.client.interstitial-window.click.joinbutton',
687
687
  value: 40,
@@ -737,13 +737,13 @@ describe('internal-plugin-metrics', () => {
737
737
  key: 'client.locus.join.response',
738
738
  value: 40,
739
739
  });
740
- assert.deepEqual(cdl.getTotalJMTWithUserDelay(), 45);
740
+ assert.deepEqual(cdl.getTotalJMTWithUserDelay(), 30);
741
741
  });
742
742
 
743
743
  it('calculates getTotalJMTWithUserDelay correctly when clickToInterstitialWithUserDelay is 0', () => {
744
744
  cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 0);
745
745
  cdl.saveTimestamp({
746
- key: 'internal.client.interstitial-window.click.joinbutton',
746
+ key: 'internal.client.meeting.interstitial-window.showed',
747
747
  value: 20,
748
748
  });
749
749
  cdl.saveTimestamp({
@@ -753,9 +753,9 @@ describe('internal-plugin-metrics', () => {
753
753
  assert.deepEqual(cdl.getTotalJMTWithUserDelay(), 20);
754
754
  });
755
755
 
756
- it('calculates getTotalJMTWithUserDelay correctly when interstitialToJoinOk is 0', () => {
756
+ it('calculates getTotalJMTWithUserDelay correctly when interstitialShowedToJoinLocusResponse is 0', () => {
757
757
  cdl.saveTimestamp({
758
- key: 'internal.client.interstitial-window.click.joinbutton',
758
+ key: 'internal.client.meeting.interstitial-window.showed',
759
759
  value: 40,
760
760
  });
761
761
  cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 12);
@@ -766,9 +766,9 @@ describe('internal-plugin-metrics', () => {
766
766
  assert.deepEqual(cdl.getTotalJMTWithUserDelay(), 12);
767
767
  });
768
768
 
769
- it('calculates getTotalJMTWithUserDelay correctly when both clickToInterstitialWithUserDelay and interstitialToJoinOk are 0', () => {
769
+ it('calculates getTotalJMTWithUserDelay correctly when both clickToInterstitialWithUserDelay and interstitialShowedToJoinLocusResponse are 0', () => {
770
770
  cdl.saveTimestamp({
771
- key: 'internal.client.interstitial-window.click.joinbutton',
771
+ key: 'internal.client.meeting.interstitial-window.showed',
772
772
  value: 40,
773
773
  });
774
774
  cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 0);
@@ -781,7 +781,7 @@ describe('internal-plugin-metrics', () => {
781
781
 
782
782
  it('calculates getTotalJMTWithUserDelay correctly when both clickToInterstitialWithUserDelay is not a number', () => {
783
783
  cdl.saveTimestamp({
784
- key: 'internal.client.interstitial-window.click.joinbutton',
784
+ key: 'internal.client.meeting.interstitial-window.showed',
785
785
  value: 40,
786
786
  });
787
787
  cdl.saveLatency(
@@ -798,7 +798,7 @@ describe('internal-plugin-metrics', () => {
798
798
  it('calculates getTotalJMTWithUserDelay correctly when it is greater than MAX_INTEGER', () => {
799
799
  cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 2147483648);
800
800
  cdl.saveTimestamp({
801
- key: 'internal.client.interstitial-window.click.joinbutton',
801
+ key: 'internal.client.meeting.interstitial-window.showed',
802
802
  value: 20,
803
803
  });
804
804
  cdl.saveTimestamp({