@webex/internal-plugin-metrics 3.12.0-next.10 → 3.12.0-next.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +0 -8
- package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -1
- package/dist/metrics.js +1 -1
- package/dist/metrics.types.js.map +1 -1
- package/dist/types/metrics.types.d.ts +1 -1
- package/package.json +2 -2
- package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +0 -16
- package/src/metrics.types.ts +0 -1
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +16 -76
|
@@ -392,10 +392,6 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
|
|
|
392
392
|
}, {
|
|
393
393
|
key: "getClickToInterstitial",
|
|
394
394
|
value: function getClickToInterstitial() {
|
|
395
|
-
// for normal join (where green join button exists before interstitial, i.e reminder, space list etc)
|
|
396
|
-
if (this.latencyTimestamps.get('internal.client.meeting.click.joinbutton')) {
|
|
397
|
-
return this.getDiffBetweenTimestamps('internal.client.meeting.click.joinbutton', 'internal.client.meeting.interstitial-window.showed');
|
|
398
|
-
}
|
|
399
395
|
var clickToInterstitialLatency = this.precomputedLatencies.get('internal.click.to.interstitial');
|
|
400
396
|
if (typeof clickToInterstitialLatency === 'number') {
|
|
401
397
|
return (0, _lodash.clamp)(clickToInterstitialLatency, 0, this.MAX_INTEGER);
|
|
@@ -410,10 +406,6 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
|
|
|
410
406
|
}, {
|
|
411
407
|
key: "getClickToInterstitialWithUserDelay",
|
|
412
408
|
value: function getClickToInterstitialWithUserDelay() {
|
|
413
|
-
// for normal join (where green join button exists before interstitial, i.e reminder, space list etc)
|
|
414
|
-
if (this.latencyTimestamps.get('internal.client.meeting.click.joinbutton')) {
|
|
415
|
-
return this.getDiffBetweenTimestamps('internal.client.meeting.click.joinbutton', 'internal.client.meeting.interstitial-window.showed');
|
|
416
|
-
}
|
|
417
409
|
var clickToInterstitialWithUserDelayLatency = this.precomputedLatencies.get('internal.click.to.interstitial.with.user.delay');
|
|
418
410
|
if (typeof clickToInterstitialWithUserDelayLatency === 'number') {
|
|
419
411
|
return (0, _lodash.clamp)(clickToInterstitialWithUserDelayLatency, 0, this.MAX_INTEGER);
|
|
@@ -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","getStayLobbyTimeCappedBy","endTimestampKey","lobbyStartTimestamp","lobbyEndTimestamp","maximumEndTimestamp","endTimestamp","min","getPageJMT","latency","getDownloadTimeJMT","getClickToInterstitial","clickToInterstitialLatency","getClickToInterstitialWithUserDelay","clickToInterstitialWithUserDelayLatency","getInterstitialToJoinOK","getCallInitMediaEngineReady","getInterstitialToMediaOKJMT","interstitialClickJoinToIceEnd","stayLobbyTimeCappedByIceEnd","getTotalJMT","clickToInterstitial","interstitialClickJoinToJoinLocusResponse","getTotalJMTWithUserDelay","clickToInterstitialWithUserDelay","interstitialShowedToJoinLocusResponse","getJoinConfJMT","joinReqResp","ICESetupTime","getTotalMediaJMT","interstitialClickJoinToMediaEngineReady","stayLobbyTimeCappedByMediaEngineReady","getTotalMediaJMTWithUserDelay","interstitialShowedToMediaEngineReady","getClientJMT","clickToInterstitialForClientJmt","interstitialJoinToLocusJoinRequest","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.lobby.entered', 'client.lobby.exited');\n }\n\n /**\n * Stay lobby time capped by a certain timestamp.\n * This is to handle the case where the target end timestamp could happen before the lobby is exited,\n * for example media-engine.ready or client.ice.end\n * This is supposed to be called AFTER the end timestamp happens\n * @param endTimestampKey name of the target end event\n * @returns - latency\n */\n public getStayLobbyTimeCappedBy(endTimestampKey: MetricEventNames) {\n const lobbyStartTimestamp = this.latencyTimestamps.get('client.lobby.entered'); // might not exist (some meetings don't have lobby)\n\n if (typeof lobbyStartTimestamp !== 'number') {\n // no lobby in the meeting, stayLobbyTime is 0\n return 0;\n }\n\n const lobbyEndTimestamp = this.latencyTimestamps.get('client.lobby.exited'); // might not exist (if user still in lobby at the time of measurement)\n const maximumEndTimestamp = this.latencyTimestamps.get(endTimestampKey); // must exist\n\n if (typeof maximumEndTimestamp !== 'number') {\n // the provided timestamp to be used as a cap should exist, return undefined if it doesn't\n return undefined;\n }\n\n const endTimestamp =\n typeof lobbyEndTimestamp === 'number'\n ? Math.min(lobbyEndTimestamp, maximumEndTimestamp)\n : maximumEndTimestamp;\n\n return clamp(endTimestamp - lobbyStartTimestamp, 0, this.MAX_INTEGER);\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.getInterstitialToMediaOKJMT();\n }\n\n /**\n * Interstitial To Media Ok\n * @returns - latency\n */\n public getInterstitialToMediaOKJMT() {\n const interstitialClickJoinToIceEnd = this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.ice.end'\n );\n const stayLobbyTimeCappedByIceEnd = this.getStayLobbyTimeCappedBy('client.ice.end');\n\n if (\n typeof interstitialClickJoinToIceEnd === 'number' &&\n typeof stayLobbyTimeCappedByIceEnd === 'number'\n ) {\n return clamp(\n interstitialClickJoinToIceEnd - stayLobbyTimeCappedByIceEnd,\n 0,\n this.MAX_INTEGER\n );\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 interstitialClickJoinToMediaEngineReady = this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.media-engine.ready'\n );\n const stayLobbyTimeCappedByMediaEngineReady = this.getStayLobbyTimeCappedBy(\n 'client.media-engine.ready'\n );\n\n if (\n typeof clickToInterstitial === 'number' &&\n typeof interstitialClickJoinToMediaEngineReady === 'number' &&\n typeof stayLobbyTimeCappedByMediaEngineReady === 'number'\n ) {\n return clamp(\n clickToInterstitial +\n interstitialClickJoinToMediaEngineReady -\n stayLobbyTimeCappedByMediaEngineReady,\n 0,\n this.MAX_INTEGER\n );\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 interstitialShowedToMediaEngineReady = this.getDiffBetweenTimestamps(\n 'internal.client.meeting.interstitial-window.showed',\n 'client.media-engine.ready'\n );\n\n if (\n typeof clickToInterstitialWithUserDelay === 'number' &&\n typeof interstitialShowedToMediaEngineReady === 'number'\n ) {\n return clamp(\n clickToInterstitialWithUserDelay + interstitialShowedToMediaEngineReady,\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 clickToInterstitialForClientJmt = this.precomputedLatencies.get(\n 'internal.click.to.interstitial.for.client.jmt'\n );\n const interstitialJoinToLocusJoinRequest = this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.locus.join.request'\n );\n\n if (\n typeof clickToInterstitialForClientJmt === 'number' &&\n typeof interstitialJoinToLocusJoinRequest === 'number'\n ) {\n return clamp(\n clickToInterstitialForClientJmt + interstitialJoinToLocusJoinRequest,\n 0,\n this.MAX_INTEGER\n );\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","getStayLobbyTimeCappedBy","endTimestampKey","lobbyStartTimestamp","lobbyEndTimestamp","maximumEndTimestamp","endTimestamp","min","getPageJMT","latency","getDownloadTimeJMT","getClickToInterstitial","clickToInterstitialLatency","getClickToInterstitialWithUserDelay","clickToInterstitialWithUserDelayLatency","getInterstitialToJoinOK","getCallInitMediaEngineReady","getInterstitialToMediaOKJMT","interstitialClickJoinToIceEnd","stayLobbyTimeCappedByIceEnd","getTotalJMT","clickToInterstitial","interstitialClickJoinToJoinLocusResponse","getTotalJMTWithUserDelay","clickToInterstitialWithUserDelay","interstitialShowedToJoinLocusResponse","getJoinConfJMT","joinReqResp","ICESetupTime","getTotalMediaJMT","interstitialClickJoinToMediaEngineReady","stayLobbyTimeCappedByMediaEngineReady","getTotalMediaJMTWithUserDelay","interstitialShowedToMediaEngineReady","getClientJMT","clickToInterstitialForClientJmt","interstitialJoinToLocusJoinRequest","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.lobby.entered', 'client.lobby.exited');\n }\n\n /**\n * Stay lobby time capped by a certain timestamp.\n * This is to handle the case where the target end timestamp could happen before the lobby is exited,\n * for example media-engine.ready or client.ice.end\n * This is supposed to be called AFTER the end timestamp happens\n * @param endTimestampKey name of the target end event\n * @returns - latency\n */\n public getStayLobbyTimeCappedBy(endTimestampKey: MetricEventNames) {\n const lobbyStartTimestamp = this.latencyTimestamps.get('client.lobby.entered'); // might not exist (some meetings don't have lobby)\n\n if (typeof lobbyStartTimestamp !== 'number') {\n // no lobby in the meeting, stayLobbyTime is 0\n return 0;\n }\n\n const lobbyEndTimestamp = this.latencyTimestamps.get('client.lobby.exited'); // might not exist (if user still in lobby at the time of measurement)\n const maximumEndTimestamp = this.latencyTimestamps.get(endTimestampKey); // must exist\n\n if (typeof maximumEndTimestamp !== 'number') {\n // the provided timestamp to be used as a cap should exist, return undefined if it doesn't\n return undefined;\n }\n\n const endTimestamp =\n typeof lobbyEndTimestamp === 'number'\n ? Math.min(lobbyEndTimestamp, maximumEndTimestamp)\n : maximumEndTimestamp;\n\n return clamp(endTimestamp - lobbyStartTimestamp, 0, this.MAX_INTEGER);\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 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 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.getInterstitialToMediaOKJMT();\n }\n\n /**\n * Interstitial To Media Ok\n * @returns - latency\n */\n public getInterstitialToMediaOKJMT() {\n const interstitialClickJoinToIceEnd = this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.ice.end'\n );\n const stayLobbyTimeCappedByIceEnd = this.getStayLobbyTimeCappedBy('client.ice.end');\n\n if (\n typeof interstitialClickJoinToIceEnd === 'number' &&\n typeof stayLobbyTimeCappedByIceEnd === 'number'\n ) {\n return clamp(\n interstitialClickJoinToIceEnd - stayLobbyTimeCappedByIceEnd,\n 0,\n this.MAX_INTEGER\n );\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 interstitialClickJoinToMediaEngineReady = this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.media-engine.ready'\n );\n const stayLobbyTimeCappedByMediaEngineReady = this.getStayLobbyTimeCappedBy(\n 'client.media-engine.ready'\n );\n\n if (\n typeof clickToInterstitial === 'number' &&\n typeof interstitialClickJoinToMediaEngineReady === 'number' &&\n typeof stayLobbyTimeCappedByMediaEngineReady === 'number'\n ) {\n return clamp(\n clickToInterstitial +\n interstitialClickJoinToMediaEngineReady -\n stayLobbyTimeCappedByMediaEngineReady,\n 0,\n this.MAX_INTEGER\n );\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 interstitialShowedToMediaEngineReady = this.getDiffBetweenTimestamps(\n 'internal.client.meeting.interstitial-window.showed',\n 'client.media-engine.ready'\n );\n\n if (\n typeof clickToInterstitialWithUserDelay === 'number' &&\n typeof interstitialShowedToMediaEngineReady === 'number'\n ) {\n return clamp(\n clickToInterstitialWithUserDelay + interstitialShowedToMediaEngineReady,\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 clickToInterstitialForClientJmt = this.precomputedLatencies.get(\n 'internal.click.to.interstitial.for.client.jmt'\n );\n const interstitialJoinToLocusJoinRequest = this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.locus.join.request'\n );\n\n if (\n typeof clickToInterstitialForClientJmt === 'number' &&\n typeof interstitialJoinToLocusJoinRequest === 'number'\n ) {\n return clamp(\n clickToInterstitialForClientJmt + interstitialJoinToLocusJoinRequest,\n 0,\n this.MAX_INTEGER\n );\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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":[],"sources":["metrics.types.ts"],"sourcesContent":["import type {\n ClientEvent as RawClientEvent,\n Event as RawEvent,\n MediaQualityEvent as RawMediaQualityEvent,\n FeatureEvent as RawFeatureEvent,\n} from '@webex/event-dictionary-ts';\n\nexport type Event = Omit<RawEvent, 'event'> & {\n event: RawClientEvent | RawMediaQualityEvent | RawFeatureEvent;\n};\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 vendorId?: string;\n};\n\nexport type SubmitMQEOptions = {\n meetingId: string;\n mediaConnections?: any[];\n networkType?: Event['origin']['networkType'];\n webexConferenceIdStr?: string;\n globalMeetingId?: string;\n};\n\nexport type InternalEvent = {\n name:\n | 'internal.client.meetinginfo.request'\n | 'internal.client.meetinginfo.response'\n | 'internal.register.device.request'\n | 'internal.register.device.response'\n | 'internal.reset.join.latencies'\n | 'internal.
|
|
1
|
+
{"version":3,"names":[],"sources":["metrics.types.ts"],"sourcesContent":["import type {\n ClientEvent as RawClientEvent,\n Event as RawEvent,\n MediaQualityEvent as RawMediaQualityEvent,\n FeatureEvent as RawFeatureEvent,\n} from '@webex/event-dictionary-ts';\n\nexport type Event = Omit<RawEvent, 'event'> & {\n event: RawClientEvent | RawMediaQualityEvent | RawFeatureEvent;\n};\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 vendorId?: string;\n};\n\nexport type SubmitMQEOptions = {\n meetingId: string;\n mediaConnections?: any[];\n networkType?: Event['origin']['networkType'];\n webexConferenceIdStr?: string;\n globalMeetingId?: string;\n};\n\nexport type InternalEvent = {\n name:\n | 'internal.client.meetinginfo.request'\n | 'internal.client.meetinginfo.response'\n | 'internal.register.device.request'\n | 'internal.register.device.response'\n | 'internal.reset.join.latencies'\n | 'internal.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 | 'internal.client.share.initiated'\n | 'internal.client.share.stopped';\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: object;\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 name: RawFeatureEvent['name'];\n payload?: RawFeatureEvent;\n options?: SubmitClientEventOptions;\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 ClientFeatureEventPayload = RecursivePartial<FeatureEvent['payload']>;\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.click.to.interstitial.for.client.jmt'\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\nexport type SubmitFeatureEvent = (args: {\n name: FeatureEvent['name'];\n payload?: RecursivePartial<FeatureEvent['payload']>;\n options?: SubmitClientEventOptions;\n}) => Promise<any>;\n\nexport interface DelayedClientFeatureEvent {\n name: FeatureEvent['name'];\n payload?: RecursivePartial<FeatureEvent['payload']>;\n options?: SubmitClientEventOptions;\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -42,7 +42,7 @@ export type SubmitMQEOptions = {
|
|
|
42
42
|
globalMeetingId?: string;
|
|
43
43
|
};
|
|
44
44
|
export type InternalEvent = {
|
|
45
|
-
name: 'internal.client.meetinginfo.request' | 'internal.client.meetinginfo.response' | 'internal.register.device.request' | 'internal.register.device.response' | 'internal.reset.join.latencies' | 'internal.
|
|
45
|
+
name: 'internal.client.meetinginfo.request' | 'internal.client.meetinginfo.response' | 'internal.register.device.request' | 'internal.register.device.response' | 'internal.reset.join.latencies' | 'internal.host.meeting.participant.admitted' | 'internal.client.meeting.interstitial-window.showed' | 'internal.client.interstitial-window.click.joinbutton' | 'internal.client.add-media.turn-discovery.start' | 'internal.client.add-media.turn-discovery.end' | 'internal.client.share.initiated' | 'internal.client.share.stopped';
|
|
46
46
|
payload?: never;
|
|
47
47
|
options?: never;
|
|
48
48
|
};
|
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.
|
|
43
|
+
"@webex/webex-core": "3.12.0-next.11",
|
|
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.
|
|
56
|
+
"version": "3.12.0-next.11"
|
|
57
57
|
}
|
|
@@ -363,14 +363,6 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
363
363
|
* @returns - latency
|
|
364
364
|
*/
|
|
365
365
|
public getClickToInterstitial() {
|
|
366
|
-
// for normal join (where green join button exists before interstitial, i.e reminder, space list etc)
|
|
367
|
-
if (this.latencyTimestamps.get('internal.client.meeting.click.joinbutton')) {
|
|
368
|
-
return this.getDiffBetweenTimestamps(
|
|
369
|
-
'internal.client.meeting.click.joinbutton',
|
|
370
|
-
'internal.client.meeting.interstitial-window.showed'
|
|
371
|
-
);
|
|
372
|
-
}
|
|
373
|
-
|
|
374
366
|
const clickToInterstitialLatency = this.precomputedLatencies.get(
|
|
375
367
|
'internal.click.to.interstitial'
|
|
376
368
|
);
|
|
@@ -387,14 +379,6 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
|
387
379
|
* @returns - latency
|
|
388
380
|
*/
|
|
389
381
|
public getClickToInterstitialWithUserDelay() {
|
|
390
|
-
// for normal join (where green join button exists before interstitial, i.e reminder, space list etc)
|
|
391
|
-
if (this.latencyTimestamps.get('internal.client.meeting.click.joinbutton')) {
|
|
392
|
-
return this.getDiffBetweenTimestamps(
|
|
393
|
-
'internal.client.meeting.click.joinbutton',
|
|
394
|
-
'internal.client.meeting.interstitial-window.showed'
|
|
395
|
-
);
|
|
396
|
-
}
|
|
397
|
-
|
|
398
382
|
const clickToInterstitialWithUserDelayLatency = this.precomputedLatencies.get(
|
|
399
383
|
'internal.click.to.interstitial.with.user.delay'
|
|
400
384
|
);
|
package/src/metrics.types.ts
CHANGED
|
@@ -156,7 +156,6 @@ export type InternalEvent = {
|
|
|
156
156
|
| 'internal.register.device.request'
|
|
157
157
|
| 'internal.register.device.response'
|
|
158
158
|
| 'internal.reset.join.latencies'
|
|
159
|
-
| 'internal.client.meeting.click.joinbutton'
|
|
160
159
|
| 'internal.host.meeting.participant.admitted'
|
|
161
160
|
| 'internal.client.meeting.interstitial-window.showed'
|
|
162
161
|
| 'internal.client.interstitial-window.click.joinbutton'
|
|
@@ -574,71 +574,31 @@ describe('internal-plugin-metrics', () => {
|
|
|
574
574
|
});
|
|
575
575
|
|
|
576
576
|
it('calculates getClickToInterstitial correctly', () => {
|
|
577
|
-
cdl.saveTimestamp({
|
|
578
|
-
key: 'internal.client.meeting.click.joinbutton',
|
|
579
|
-
value: 10,
|
|
580
|
-
});
|
|
581
|
-
cdl.saveTimestamp({
|
|
582
|
-
key: 'internal.client.meeting.interstitial-window.showed',
|
|
583
|
-
value: 20,
|
|
584
|
-
});
|
|
585
|
-
assert.deepEqual(cdl.getClickToInterstitial(), 10);
|
|
586
|
-
});
|
|
587
|
-
|
|
588
|
-
it('calculates getClickToInterstitial without join button timestamp', () => {
|
|
589
577
|
cdl.saveLatency('internal.click.to.interstitial', 5);
|
|
590
|
-
cdl.saveTimestamp({
|
|
591
|
-
key: 'internal.client.meeting.interstitial-window.showed',
|
|
592
|
-
value: 20,
|
|
593
|
-
});
|
|
594
578
|
assert.deepEqual(cdl.getClickToInterstitial(), 5);
|
|
595
579
|
});
|
|
596
580
|
|
|
597
|
-
it('calculates getClickToInterstitial
|
|
581
|
+
it('calculates getClickToInterstitial correctly when it is 0', () => {
|
|
598
582
|
cdl.saveLatency('internal.click.to.interstitial', 0);
|
|
599
|
-
cdl.saveTimestamp({
|
|
600
|
-
key: 'internal.client.meeting.interstitial-window.showed',
|
|
601
|
-
value: 20,
|
|
602
|
-
});
|
|
603
583
|
assert.deepEqual(cdl.getClickToInterstitial(), 0);
|
|
604
584
|
});
|
|
605
585
|
|
|
606
|
-
it('calculates getClickToInterstitial
|
|
586
|
+
it('calculates getClickToInterstitial correctly when it is greater than MAX_INTEGER', () => {
|
|
607
587
|
cdl.saveLatency('internal.click.to.interstitial', 2147483648);
|
|
608
588
|
assert.deepEqual(cdl.getClickToInterstitial(), 2147483647);
|
|
609
589
|
});
|
|
610
590
|
|
|
611
591
|
it('calculates getClickToInterstitialWithUserDelay correctly', () => {
|
|
612
|
-
cdl.saveTimestamp({
|
|
613
|
-
key: 'internal.client.meeting.click.joinbutton',
|
|
614
|
-
value: 10,
|
|
615
|
-
});
|
|
616
|
-
cdl.saveTimestamp({
|
|
617
|
-
key: 'internal.client.meeting.interstitial-window.showed',
|
|
618
|
-
value: 20,
|
|
619
|
-
});
|
|
620
|
-
assert.deepEqual(cdl.getClickToInterstitialWithUserDelay(), 10);
|
|
621
|
-
});
|
|
622
|
-
|
|
623
|
-
it('calculates getClickToInterstitialWithUserDelay without join button timestamp', () => {
|
|
624
592
|
cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 5);
|
|
625
|
-
cdl.saveTimestamp({
|
|
626
|
-
key: 'internal.client.meeting.interstitial-window.showed',
|
|
627
|
-
value: 20,
|
|
628
|
-
});
|
|
629
593
|
assert.deepEqual(cdl.getClickToInterstitialWithUserDelay(), 5);
|
|
630
594
|
});
|
|
631
595
|
|
|
632
|
-
it('calculates getClickToInterstitialWithUserDelay
|
|
596
|
+
it('calculates getClickToInterstitialWithUserDelay correctly when it is 0', () => {
|
|
633
597
|
cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 0);
|
|
634
|
-
cdl.saveTimestamp({
|
|
635
|
-
key: 'internal.client.meeting.interstitial-window.showed',
|
|
636
|
-
value: 20,
|
|
637
|
-
});
|
|
638
598
|
assert.deepEqual(cdl.getClickToInterstitialWithUserDelay(), 0);
|
|
639
599
|
});
|
|
640
600
|
|
|
641
|
-
it('calculates getClickToInterstitialWithUserDelay
|
|
601
|
+
it('calculates getClickToInterstitialWithUserDelay correctly when it is greater than MAX_INTEGER', () => {
|
|
642
602
|
cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 2147483648);
|
|
643
603
|
assert.deepEqual(cdl.getClickToInterstitialWithUserDelay(), 2147483647);
|
|
644
604
|
});
|
|
@@ -673,18 +633,11 @@ describe('internal-plugin-metrics', () => {
|
|
|
673
633
|
});
|
|
674
634
|
|
|
675
635
|
it('calculates getTotalJMT correctly', () => {
|
|
636
|
+
cdl.saveLatency('internal.click.to.interstitial', 10);
|
|
676
637
|
cdl.saveTimestamp({
|
|
677
638
|
key: 'internal.client.interstitial-window.click.joinbutton',
|
|
678
639
|
value: 5,
|
|
679
640
|
});
|
|
680
|
-
cdl.saveTimestamp({
|
|
681
|
-
key: 'internal.client.meeting.click.joinbutton',
|
|
682
|
-
value: 10,
|
|
683
|
-
});
|
|
684
|
-
cdl.saveTimestamp({
|
|
685
|
-
key: 'internal.client.meeting.interstitial-window.showed',
|
|
686
|
-
value: 20,
|
|
687
|
-
});
|
|
688
641
|
cdl.saveTimestamp({
|
|
689
642
|
key: 'client.locus.join.response',
|
|
690
643
|
value: 40,
|
|
@@ -758,14 +711,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
758
711
|
});
|
|
759
712
|
|
|
760
713
|
it('calculates getTotalJMTWithUserDelay correctly', () => {
|
|
761
|
-
cdl.
|
|
762
|
-
key: 'internal.client.interstitial-window.click.joinbutton',
|
|
763
|
-
value: 5,
|
|
764
|
-
});
|
|
765
|
-
cdl.saveTimestamp({
|
|
766
|
-
key: 'internal.client.meeting.click.joinbutton',
|
|
767
|
-
value: 10,
|
|
768
|
-
});
|
|
714
|
+
cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 10);
|
|
769
715
|
cdl.saveTimestamp({
|
|
770
716
|
key: 'internal.client.meeting.interstitial-window.showed',
|
|
771
717
|
value: 20,
|
|
@@ -846,9 +792,8 @@ describe('internal-plugin-metrics', () => {
|
|
|
846
792
|
});
|
|
847
793
|
|
|
848
794
|
it('calculates getTotalMediaJMT correctly with lobby exiting before media-engine.ready', () => {
|
|
849
|
-
cdl.
|
|
850
|
-
|
|
851
|
-
// clickToInterstitial = 8 - 5 = 3
|
|
795
|
+
cdl.saveLatency('internal.click.to.interstitial', 3);
|
|
796
|
+
// clickToInterstitial = 3
|
|
852
797
|
cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 10});
|
|
853
798
|
cdl.saveTimestamp({key: 'client.media-engine.ready', value: 50});
|
|
854
799
|
// interstitialClickJoinToMediaEngineReady = 50 - 10 = 40
|
|
@@ -860,8 +805,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
860
805
|
});
|
|
861
806
|
|
|
862
807
|
it('calculates getTotalMediaJMT correctly without lobby', () => {
|
|
863
|
-
cdl.
|
|
864
|
-
cdl.saveTimestamp({key: 'internal.client.meeting.interstitial-window.showed', value: 8});
|
|
808
|
+
cdl.saveLatency('internal.click.to.interstitial', 3);
|
|
865
809
|
// clickToInterstitial = 3
|
|
866
810
|
cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 10});
|
|
867
811
|
cdl.saveTimestamp({key: 'client.media-engine.ready', value: 50});
|
|
@@ -872,8 +816,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
872
816
|
});
|
|
873
817
|
|
|
874
818
|
it('calculates getTotalMediaJMT correctly with lobby exiting after media-engine.ready', () => {
|
|
875
|
-
cdl.
|
|
876
|
-
cdl.saveTimestamp({key: 'internal.client.meeting.interstitial-window.showed', value: 8});
|
|
819
|
+
cdl.saveLatency('internal.click.to.interstitial', 3);
|
|
877
820
|
// clickToInterstitial = 3
|
|
878
821
|
cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 10});
|
|
879
822
|
cdl.saveTimestamp({key: 'client.media-engine.ready', value: 50});
|
|
@@ -886,8 +829,7 @@ describe('internal-plugin-metrics', () => {
|
|
|
886
829
|
});
|
|
887
830
|
|
|
888
831
|
it('calculates getTotalMediaJMT correctly when it is greater than MAX_INTEGER', () => {
|
|
889
|
-
cdl.
|
|
890
|
-
cdl.saveTimestamp({key: 'internal.client.meeting.interstitial-window.showed', value: 8});
|
|
832
|
+
cdl.saveLatency('internal.click.to.interstitial', 3);
|
|
891
833
|
cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 10});
|
|
892
834
|
cdl.saveTimestamp({key: 'client.media-engine.ready', value: 4294967400});
|
|
893
835
|
cdl.saveTimestamp({key: 'client.lobby.entered', value: 28});
|
|
@@ -896,17 +838,15 @@ describe('internal-plugin-metrics', () => {
|
|
|
896
838
|
});
|
|
897
839
|
|
|
898
840
|
it('returns undefined for getTotalMediaJMT when media-engine.ready is missing', () => {
|
|
899
|
-
cdl.
|
|
900
|
-
cdl.saveTimestamp({key: 'internal.client.meeting.interstitial-window.showed', value: 8});
|
|
841
|
+
cdl.saveLatency('internal.click.to.interstitial', 3);
|
|
901
842
|
cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 10});
|
|
902
843
|
cdl.saveTimestamp({key: 'client.locus.join.response', value: 20});
|
|
903
844
|
assert.deepEqual(cdl.getTotalMediaJMT(), undefined);
|
|
904
845
|
});
|
|
905
846
|
|
|
906
847
|
it('calculates getTotalMediaJMT correctly when there is no lobby and stayLobbyTime defaults to 0', () => {
|
|
907
|
-
cdl.
|
|
908
|
-
|
|
909
|
-
// clickToInterstitial = 8 - 5 = 3
|
|
848
|
+
cdl.saveLatency('internal.click.to.interstitial', 3);
|
|
849
|
+
// clickToInterstitial = 3
|
|
910
850
|
cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 10});
|
|
911
851
|
cdl.saveTimestamp({key: 'client.media-engine.ready', value: 50});
|
|
912
852
|
// interstitialClickJoinToMediaEngineReady = 50 - 10 = 40
|
|
@@ -926,9 +866,9 @@ describe('internal-plugin-metrics', () => {
|
|
|
926
866
|
});
|
|
927
867
|
|
|
928
868
|
it('calculates getTotalMediaJMTWithUserDelay correctly for guest join', () => {
|
|
929
|
-
cdl.
|
|
869
|
+
cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 3);
|
|
870
|
+
// clickToInterstitialWithUserDelay = 3
|
|
930
871
|
cdl.saveTimestamp({key: 'internal.client.meeting.interstitial-window.showed', value: 8});
|
|
931
|
-
// clickToInterstitialWithUserDelay = 8 - 5 = 3
|
|
932
872
|
cdl.saveTimestamp({key: 'client.media-engine.ready', value: 50});
|
|
933
873
|
// interstitialShowedToMediaEngineReady = 50 - 8 = 42
|
|
934
874
|
// total = 3 + 42 = 45
|