@webex/internal-plugin-metrics 3.12.0-next.10 → 3.12.0-next.12

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.
@@ -244,9 +244,12 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
244
244
  }, {
245
245
  key: "getCallInitJoinReq",
246
246
  value: function getCallInitJoinReq() {
247
- return this.getDiffBetweenTimestamps('internal.client.interstitial-window.click.joinbutton', 'client.locus.join.request', {
248
- maximum: 1200000
249
- });
247
+ var interstitialShowedToJoinReq = this.getDiffBetweenTimestamps('internal.client.meeting.interstitial-window.showed', 'client.locus.join.request');
248
+ var showInterstitialTime = this.getShowInterstitialTime() || 0;
249
+ if (typeof interstitialShowedToJoinReq !== 'number') {
250
+ return undefined;
251
+ }
252
+ return (0, _lodash.clamp)(interstitialShowedToJoinReq - showInterstitialTime, 0, 1200000);
250
253
  }
251
254
 
252
255
  /**
@@ -392,10 +395,6 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
392
395
  }, {
393
396
  key: "getClickToInterstitial",
394
397
  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
398
  var clickToInterstitialLatency = this.precomputedLatencies.get('internal.click.to.interstitial');
400
399
  if (typeof clickToInterstitialLatency === 'number') {
401
400
  return (0, _lodash.clamp)(clickToInterstitialLatency, 0, this.MAX_INTEGER);
@@ -410,10 +409,6 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
410
409
  }, {
411
410
  key: "getClickToInterstitialWithUserDelay",
412
411
  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
412
  var clickToInterstitialWithUserDelayLatency = this.precomputedLatencies.get('internal.click.to.interstitial.with.user.delay');
418
413
  if (typeof clickToInterstitialWithUserDelayLatency === 'number') {
419
414
  return (0, _lodash.clamp)(clickToInterstitialWithUserDelayLatency, 0, this.MAX_INTEGER);
@@ -428,7 +423,12 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
428
423
  }, {
429
424
  key: "getInterstitialToJoinOK",
430
425
  value: function getInterstitialToJoinOK() {
431
- return this.getDiffBetweenTimestamps('internal.client.interstitial-window.click.joinbutton', 'client.locus.join.response');
426
+ var interstitialShowedToJoinResp = this.getDiffBetweenTimestamps('internal.client.meeting.interstitial-window.showed', 'client.locus.join.response');
427
+ var showInterstitialTime = this.getShowInterstitialTime() || 0;
428
+ if (typeof interstitialShowedToJoinResp !== 'number') {
429
+ return undefined;
430
+ }
431
+ return (0, _lodash.clamp)(interstitialShowedToJoinResp - showInterstitialTime, 0, this.MAX_INTEGER);
432
432
  }
433
433
 
434
434
  /**
@@ -448,10 +448,11 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
448
448
  }, {
449
449
  key: "getInterstitialToMediaOKJMT",
450
450
  value: function getInterstitialToMediaOKJMT() {
451
- var interstitialClickJoinToIceEnd = this.getDiffBetweenTimestamps('internal.client.interstitial-window.click.joinbutton', 'client.ice.end');
451
+ var interstitialShowedToIceEnd = this.getDiffBetweenTimestamps('internal.client.meeting.interstitial-window.showed', 'client.ice.end');
452
+ var showInterstitialTime = this.getShowInterstitialTime() || 0;
452
453
  var stayLobbyTimeCappedByIceEnd = this.getStayLobbyTimeCappedBy('client.ice.end');
453
- if (typeof interstitialClickJoinToIceEnd === 'number' && typeof stayLobbyTimeCappedByIceEnd === 'number') {
454
- return (0, _lodash.clamp)(interstitialClickJoinToIceEnd - stayLobbyTimeCappedByIceEnd, 0, this.MAX_INTEGER);
454
+ if (typeof interstitialShowedToIceEnd === 'number' && typeof stayLobbyTimeCappedByIceEnd === 'number') {
455
+ return (0, _lodash.clamp)(interstitialShowedToIceEnd - showInterstitialTime - stayLobbyTimeCappedByIceEnd, 0, this.MAX_INTEGER);
455
456
  }
456
457
  return undefined;
457
458
  }
@@ -464,9 +465,10 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
464
465
  key: "getTotalJMT",
465
466
  value: function getTotalJMT() {
466
467
  var clickToInterstitial = this.getClickToInterstitial();
467
- var interstitialClickJoinToJoinLocusResponse = this.getDiffBetweenTimestamps('internal.client.interstitial-window.click.joinbutton', 'client.locus.join.response');
468
- if (typeof clickToInterstitial === 'number' && typeof interstitialClickJoinToJoinLocusResponse === 'number') {
469
- return (0, _lodash.clamp)(clickToInterstitial + interstitialClickJoinToJoinLocusResponse, 0, this.MAX_INTEGER);
468
+ var interstitialShowedToJoinLocusResponse = this.getDiffBetweenTimestamps('internal.client.meeting.interstitial-window.showed', 'client.locus.join.response');
469
+ var showInterstitialTime = this.getShowInterstitialTime() || 0;
470
+ if (typeof clickToInterstitial === 'number' && typeof interstitialShowedToJoinLocusResponse === 'number') {
471
+ return (0, _lodash.clamp)(clickToInterstitial + interstitialShowedToJoinLocusResponse - showInterstitialTime, 0, this.MAX_INTEGER);
470
472
  }
471
473
  return undefined;
472
474
  }
@@ -509,10 +511,11 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
509
511
  key: "getTotalMediaJMT",
510
512
  value: function getTotalMediaJMT() {
511
513
  var clickToInterstitial = this.getClickToInterstitial();
512
- var interstitialClickJoinToMediaEngineReady = this.getDiffBetweenTimestamps('internal.client.interstitial-window.click.joinbutton', 'client.media-engine.ready');
514
+ var interstitialShowedToMediaEngineReady = this.getDiffBetweenTimestamps('internal.client.meeting.interstitial-window.showed', 'client.media-engine.ready');
515
+ var showInterstitialTime = this.getShowInterstitialTime() || 0;
513
516
  var stayLobbyTimeCappedByMediaEngineReady = this.getStayLobbyTimeCappedBy('client.media-engine.ready');
514
- if (typeof clickToInterstitial === 'number' && typeof interstitialClickJoinToMediaEngineReady === 'number' && typeof stayLobbyTimeCappedByMediaEngineReady === 'number') {
515
- return (0, _lodash.clamp)(clickToInterstitial + interstitialClickJoinToMediaEngineReady - stayLobbyTimeCappedByMediaEngineReady, 0, this.MAX_INTEGER);
517
+ if (typeof clickToInterstitial === 'number' && typeof interstitialShowedToMediaEngineReady === 'number' && typeof stayLobbyTimeCappedByMediaEngineReady === 'number') {
518
+ return (0, _lodash.clamp)(clickToInterstitial + interstitialShowedToMediaEngineReady - showInterstitialTime - stayLobbyTimeCappedByMediaEngineReady, 0, this.MAX_INTEGER);
516
519
  }
517
520
  return undefined;
518
521
  }
@@ -540,9 +543,10 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
540
543
  key: "getClientJMT",
541
544
  value: function getClientJMT() {
542
545
  var clickToInterstitialForClientJmt = this.precomputedLatencies.get('internal.click.to.interstitial.for.client.jmt');
543
- var interstitialJoinToLocusJoinRequest = this.getDiffBetweenTimestamps('internal.client.interstitial-window.click.joinbutton', 'client.locus.join.request');
544
- if (typeof clickToInterstitialForClientJmt === 'number' && typeof interstitialJoinToLocusJoinRequest === 'number') {
545
- return (0, _lodash.clamp)(clickToInterstitialForClientJmt + interstitialJoinToLocusJoinRequest, 0, this.MAX_INTEGER);
546
+ var interstitialShowedToLocusJoinRequest = this.getDiffBetweenTimestamps('internal.client.meeting.interstitial-window.showed', 'client.locus.join.request');
547
+ var showInterstitialTime = this.getShowInterstitialTime() || 0;
548
+ if (typeof clickToInterstitialForClientJmt === 'number' && typeof interstitialShowedToLocusJoinRequest === 'number') {
549
+ return (0, _lodash.clamp)(clickToInterstitialForClientJmt + interstitialShowedToLocusJoinRequest - showInterstitialTime, 0, this.MAX_INTEGER);
546
550
  }
547
551
  return undefined;
548
552
  }
@@ -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","interstitialShowedToJoinReq","showInterstitialTime","getJoinReqResp","getTurnDiscoveryTime","getLocalSDPGenRemoteSDPRecv","getICESetupTime","getAudioICESetupTime","getVideoICESetupTime","getShareICESetupTime","getStayLobbyTime","getStayLobbyTimeCappedBy","endTimestampKey","lobbyStartTimestamp","lobbyEndTimestamp","maximumEndTimestamp","endTimestamp","min","getPageJMT","latency","getDownloadTimeJMT","getClickToInterstitial","clickToInterstitialLatency","getClickToInterstitialWithUserDelay","clickToInterstitialWithUserDelayLatency","getInterstitialToJoinOK","interstitialShowedToJoinResp","getCallInitMediaEngineReady","getInterstitialToMediaOKJMT","interstitialShowedToIceEnd","stayLobbyTimeCappedByIceEnd","getTotalJMT","clickToInterstitial","interstitialShowedToJoinLocusResponse","getTotalJMTWithUserDelay","clickToInterstitialWithUserDelay","getJoinConfJMT","joinReqResp","ICESetupTime","getTotalMediaJMT","interstitialShowedToMediaEngineReady","stayLobbyTimeCappedByMediaEngineReady","getTotalMediaJMTWithUserDelay","getClientJMT","clickToInterstitialForClientJmt","interstitialShowedToLocusJoinRequest","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 const interstitialShowedToJoinReq = this.getDiffBetweenTimestamps(\n 'internal.client.meeting.interstitial-window.showed',\n 'client.locus.join.request'\n );\n const showInterstitialTime = this.getShowInterstitialTime() || 0;\n\n if (typeof interstitialShowedToJoinReq !== 'number') {\n return undefined;\n }\n\n return clamp(interstitialShowedToJoinReq - showInterstitialTime, 0, 1200000);\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 const interstitialShowedToJoinResp = this.getDiffBetweenTimestamps(\n 'internal.client.meeting.interstitial-window.showed',\n 'client.locus.join.response'\n );\n const showInterstitialTime = this.getShowInterstitialTime() || 0;\n\n if (typeof interstitialShowedToJoinResp !== 'number') {\n return undefined;\n }\n\n return clamp(interstitialShowedToJoinResp - showInterstitialTime, 0, this.MAX_INTEGER);\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 interstitialShowedToIceEnd = this.getDiffBetweenTimestamps(\n 'internal.client.meeting.interstitial-window.showed',\n 'client.ice.end'\n );\n const showInterstitialTime = this.getShowInterstitialTime() || 0;\n const stayLobbyTimeCappedByIceEnd = this.getStayLobbyTimeCappedBy('client.ice.end');\n\n if (\n typeof interstitialShowedToIceEnd === 'number' &&\n typeof stayLobbyTimeCappedByIceEnd === 'number'\n ) {\n return clamp(\n interstitialShowedToIceEnd - showInterstitialTime - 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 interstitialShowedToJoinLocusResponse = this.getDiffBetweenTimestamps(\n 'internal.client.meeting.interstitial-window.showed',\n 'client.locus.join.response'\n );\n const showInterstitialTime = this.getShowInterstitialTime() || 0;\n\n if (\n typeof clickToInterstitial === 'number' &&\n typeof interstitialShowedToJoinLocusResponse === 'number'\n ) {\n return clamp(\n clickToInterstitial + interstitialShowedToJoinLocusResponse - showInterstitialTime,\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 interstitialShowedToMediaEngineReady = this.getDiffBetweenTimestamps(\n 'internal.client.meeting.interstitial-window.showed',\n 'client.media-engine.ready'\n );\n const showInterstitialTime = this.getShowInterstitialTime() || 0;\n const stayLobbyTimeCappedByMediaEngineReady = this.getStayLobbyTimeCappedBy(\n 'client.media-engine.ready'\n );\n\n if (\n typeof clickToInterstitial === 'number' &&\n typeof interstitialShowedToMediaEngineReady === 'number' &&\n typeof stayLobbyTimeCappedByMediaEngineReady === 'number'\n ) {\n return clamp(\n clickToInterstitial +\n interstitialShowedToMediaEngineReady -\n showInterstitialTime -\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 interstitialShowedToLocusJoinRequest = this.getDiffBetweenTimestamps(\n 'internal.client.meeting.interstitial-window.showed',\n 'client.locus.join.request'\n );\n const showInterstitialTime = this.getShowInterstitialTime() || 0;\n\n if (\n typeof clickToInterstitialForClientJmt === 'number' &&\n typeof interstitialShowedToLocusJoinRequest === 'number'\n ) {\n return clamp(\n clickToInterstitialForClientJmt +\n interstitialShowedToLocusJoinRequest -\n showInterstitialTime,\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
@@ -147,7 +147,7 @@ var Metrics = _webexCore.WebexPlugin.extend({
147
147
  }
148
148
  });
149
149
  },
150
- version: "3.12.0-next.10"
150
+ version: "3.12.0-next.12"
151
151
  });
152
152
  var _default = exports.default = Metrics;
153
153
  //# sourceMappingURL=metrics.js.map
@@ -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.client.meeting.click.joinbutton'\n | 'internal.host.meeting.participant.admitted'\n | 'internal.client.meeting.interstitial-window.showed'\n | 'internal.client.interstitial-window.click.joinbutton'\n | 'internal.client.add-media.turn-discovery.start'\n | 'internal.client.add-media.turn-discovery.end'\n | '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":[]}
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.client.meeting.click.joinbutton' | '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';
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.10",
43
+ "@webex/webex-core": "3.12.0-next.12",
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.10"
56
+ "version": "3.12.0-next.12"
57
57
  }
@@ -224,11 +224,17 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
224
224
  * @returns - latency
225
225
  */
226
226
  public getCallInitJoinReq() {
227
- return this.getDiffBetweenTimestamps(
228
- 'internal.client.interstitial-window.click.joinbutton',
229
- 'client.locus.join.request',
230
- {maximum: 1200000}
227
+ const interstitialShowedToJoinReq = this.getDiffBetweenTimestamps(
228
+ 'internal.client.meeting.interstitial-window.showed',
229
+ 'client.locus.join.request'
231
230
  );
231
+ const showInterstitialTime = this.getShowInterstitialTime() || 0;
232
+
233
+ if (typeof interstitialShowedToJoinReq !== 'number') {
234
+ return undefined;
235
+ }
236
+
237
+ return clamp(interstitialShowedToJoinReq - showInterstitialTime, 0, 1200000);
232
238
  }
233
239
 
234
240
  /**
@@ -363,14 +369,6 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
363
369
  * @returns - latency
364
370
  */
365
371
  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
372
  const clickToInterstitialLatency = this.precomputedLatencies.get(
375
373
  'internal.click.to.interstitial'
376
374
  );
@@ -387,14 +385,6 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
387
385
  * @returns - latency
388
386
  */
389
387
  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
388
  const clickToInterstitialWithUserDelayLatency = this.precomputedLatencies.get(
399
389
  'internal.click.to.interstitial.with.user.delay'
400
390
  );
@@ -411,10 +401,17 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
411
401
  * @returns - latency
412
402
  */
413
403
  public getInterstitialToJoinOK() {
414
- return this.getDiffBetweenTimestamps(
415
- 'internal.client.interstitial-window.click.joinbutton',
404
+ const interstitialShowedToJoinResp = this.getDiffBetweenTimestamps(
405
+ 'internal.client.meeting.interstitial-window.showed',
416
406
  'client.locus.join.response'
417
407
  );
408
+ const showInterstitialTime = this.getShowInterstitialTime() || 0;
409
+
410
+ if (typeof interstitialShowedToJoinResp !== 'number') {
411
+ return undefined;
412
+ }
413
+
414
+ return clamp(interstitialShowedToJoinResp - showInterstitialTime, 0, this.MAX_INTEGER);
418
415
  }
419
416
 
420
417
  /**
@@ -430,18 +427,19 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
430
427
  * @returns - latency
431
428
  */
432
429
  public getInterstitialToMediaOKJMT() {
433
- const interstitialClickJoinToIceEnd = this.getDiffBetweenTimestamps(
434
- 'internal.client.interstitial-window.click.joinbutton',
430
+ const interstitialShowedToIceEnd = this.getDiffBetweenTimestamps(
431
+ 'internal.client.meeting.interstitial-window.showed',
435
432
  'client.ice.end'
436
433
  );
434
+ const showInterstitialTime = this.getShowInterstitialTime() || 0;
437
435
  const stayLobbyTimeCappedByIceEnd = this.getStayLobbyTimeCappedBy('client.ice.end');
438
436
 
439
437
  if (
440
- typeof interstitialClickJoinToIceEnd === 'number' &&
438
+ typeof interstitialShowedToIceEnd === 'number' &&
441
439
  typeof stayLobbyTimeCappedByIceEnd === 'number'
442
440
  ) {
443
441
  return clamp(
444
- interstitialClickJoinToIceEnd - stayLobbyTimeCappedByIceEnd,
442
+ interstitialShowedToIceEnd - showInterstitialTime - stayLobbyTimeCappedByIceEnd,
445
443
  0,
446
444
  this.MAX_INTEGER
447
445
  );
@@ -456,17 +454,18 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
456
454
  */
457
455
  public getTotalJMT() {
458
456
  const clickToInterstitial = this.getClickToInterstitial();
459
- const interstitialClickJoinToJoinLocusResponse = this.getDiffBetweenTimestamps(
460
- 'internal.client.interstitial-window.click.joinbutton',
457
+ const interstitialShowedToJoinLocusResponse = this.getDiffBetweenTimestamps(
458
+ 'internal.client.meeting.interstitial-window.showed',
461
459
  'client.locus.join.response'
462
460
  );
461
+ const showInterstitialTime = this.getShowInterstitialTime() || 0;
463
462
 
464
463
  if (
465
464
  typeof clickToInterstitial === 'number' &&
466
- typeof interstitialClickJoinToJoinLocusResponse === 'number'
465
+ typeof interstitialShowedToJoinLocusResponse === 'number'
467
466
  ) {
468
467
  return clamp(
469
- clickToInterstitial + interstitialClickJoinToJoinLocusResponse,
468
+ clickToInterstitial + interstitialShowedToJoinLocusResponse - showInterstitialTime,
470
469
  0,
471
470
  this.MAX_INTEGER
472
471
  );
@@ -521,22 +520,24 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
521
520
  */
522
521
  public getTotalMediaJMT() {
523
522
  const clickToInterstitial = this.getClickToInterstitial();
524
- const interstitialClickJoinToMediaEngineReady = this.getDiffBetweenTimestamps(
525
- 'internal.client.interstitial-window.click.joinbutton',
523
+ const interstitialShowedToMediaEngineReady = this.getDiffBetweenTimestamps(
524
+ 'internal.client.meeting.interstitial-window.showed',
526
525
  'client.media-engine.ready'
527
526
  );
527
+ const showInterstitialTime = this.getShowInterstitialTime() || 0;
528
528
  const stayLobbyTimeCappedByMediaEngineReady = this.getStayLobbyTimeCappedBy(
529
529
  'client.media-engine.ready'
530
530
  );
531
531
 
532
532
  if (
533
533
  typeof clickToInterstitial === 'number' &&
534
- typeof interstitialClickJoinToMediaEngineReady === 'number' &&
534
+ typeof interstitialShowedToMediaEngineReady === 'number' &&
535
535
  typeof stayLobbyTimeCappedByMediaEngineReady === 'number'
536
536
  ) {
537
537
  return clamp(
538
538
  clickToInterstitial +
539
- interstitialClickJoinToMediaEngineReady -
539
+ interstitialShowedToMediaEngineReady -
540
+ showInterstitialTime -
540
541
  stayLobbyTimeCappedByMediaEngineReady,
541
542
  0,
542
543
  this.MAX_INTEGER
@@ -579,17 +580,20 @@ export default class CallDiagnosticLatencies extends WebexPlugin {
579
580
  const clickToInterstitialForClientJmt = this.precomputedLatencies.get(
580
581
  'internal.click.to.interstitial.for.client.jmt'
581
582
  );
582
- const interstitialJoinToLocusJoinRequest = this.getDiffBetweenTimestamps(
583
- 'internal.client.interstitial-window.click.joinbutton',
583
+ const interstitialShowedToLocusJoinRequest = this.getDiffBetweenTimestamps(
584
+ 'internal.client.meeting.interstitial-window.showed',
584
585
  'client.locus.join.request'
585
586
  );
587
+ const showInterstitialTime = this.getShowInterstitialTime() || 0;
586
588
 
587
589
  if (
588
590
  typeof clickToInterstitialForClientJmt === 'number' &&
589
- typeof interstitialJoinToLocusJoinRequest === 'number'
591
+ typeof interstitialShowedToLocusJoinRequest === 'number'
590
592
  ) {
591
593
  return clamp(
592
- clickToInterstitialForClientJmt + interstitialJoinToLocusJoinRequest,
594
+ clickToInterstitialForClientJmt +
595
+ interstitialShowedToLocusJoinRequest -
596
+ showInterstitialTime,
593
597
  0,
594
598
  this.MAX_INTEGER
595
599
  );
@@ -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'
@@ -192,6 +192,12 @@ describe('plugin-metrics', () => {
192
192
  webex.internal.newMetrics.callDiagnosticLatencies.getTotalJMTWithUserDelay = sinon
193
193
  .stub()
194
194
  .returns(64);
195
+ webex.internal.newMetrics.callDiagnosticLatencies.getInterstitialToJoinOK = sinon
196
+ .stub()
197
+ .returns(10);
198
+ webex.internal.newMetrics.callDiagnosticLatencies.getTotalJMT = sinon
199
+ .stub()
200
+ .returns(20);
195
201
  const promise = webex.internal.newMetrics.callDiagnosticMetrics.submitToCallDiagnostics(
196
202
  //@ts-ignore
197
203
  {event: {name: 'client.locus.join.response'}}
@@ -349,6 +355,9 @@ describe('plugin-metrics', () => {
349
355
  webex.internal.newMetrics.callDiagnosticLatencies.getStayLobbyTimeCappedBy = sinon
350
356
  .stub()
351
357
  .returns(1);
358
+ webex.internal.newMetrics.callDiagnosticLatencies.getTotalMediaJMT = sinon
359
+ .stub()
360
+ .returns(44);
352
361
  webex.internal.newMetrics.callDiagnosticLatencies.getTotalMediaJMTWithUserDelay = sinon
353
362
  .stub()
354
363
  .returns(43);
@@ -412,8 +412,10 @@ describe('internal-plugin-metrics', () => {
412
412
  });
413
413
 
414
414
  it('calculates getCallInitJoinReq correctly', () => {
415
+ cdl.saveTimestamp({key: 'internal.client.meeting.interstitial-window.showed', value: 5});
415
416
  cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 10});
416
417
  cdl.saveTimestamp({key: 'client.locus.join.request', value: 20});
418
+ // showedToJoinReq = 20-5 = 15, showInterstitialTime = 10-5 = 5, result = 15-5 = 10
417
419
  assert.deepEqual(cdl.getCallInitJoinReq(), 10);
418
420
  });
419
421
 
@@ -574,76 +576,40 @@ describe('internal-plugin-metrics', () => {
574
576
  });
575
577
 
576
578
  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
579
  cdl.saveLatency('internal.click.to.interstitial', 5);
590
- cdl.saveTimestamp({
591
- key: 'internal.client.meeting.interstitial-window.showed',
592
- value: 20,
593
- });
594
580
  assert.deepEqual(cdl.getClickToInterstitial(), 5);
595
581
  });
596
582
 
597
- it('calculates getClickToInterstitial without join button timestamp when it is 0', () => {
583
+ it('calculates getClickToInterstitial correctly when it is 0', () => {
598
584
  cdl.saveLatency('internal.click.to.interstitial', 0);
599
- cdl.saveTimestamp({
600
- key: 'internal.client.meeting.interstitial-window.showed',
601
- value: 20,
602
- });
603
585
  assert.deepEqual(cdl.getClickToInterstitial(), 0);
604
586
  });
605
587
 
606
- it('calculates getClickToInterstitial without join button timestamp when it is greater than MAX_INTEGER', () => {
588
+ it('calculates getClickToInterstitial correctly when it is greater than MAX_INTEGER', () => {
607
589
  cdl.saveLatency('internal.click.to.interstitial', 2147483648);
608
590
  assert.deepEqual(cdl.getClickToInterstitial(), 2147483647);
609
591
  });
610
592
 
611
593
  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
594
  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
595
  assert.deepEqual(cdl.getClickToInterstitialWithUserDelay(), 5);
630
596
  });
631
597
 
632
- it('calculates getClickToInterstitialWithUserDelay without join button timestamp when it is 0', () => {
598
+ it('calculates getClickToInterstitialWithUserDelay correctly when it is 0', () => {
633
599
  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
600
  assert.deepEqual(cdl.getClickToInterstitialWithUserDelay(), 0);
639
601
  });
640
602
 
641
- it('calculates getClickToInterstitialWithUserDelay without join button timestamp when it is greater than MAX_INTEGER', () => {
603
+ it('calculates getClickToInterstitialWithUserDelay correctly when it is greater than MAX_INTEGER', () => {
642
604
  cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 2147483648);
643
605
  assert.deepEqual(cdl.getClickToInterstitialWithUserDelay(), 2147483647);
644
606
  });
645
607
 
646
608
  it('calculates getInterstitialToJoinOK correctly', () => {
609
+ cdl.saveTimestamp({
610
+ key: 'internal.client.meeting.interstitial-window.showed',
611
+ value: 5,
612
+ });
647
613
  cdl.saveTimestamp({
648
614
  key: 'internal.client.interstitial-window.click.joinbutton',
649
615
  value: 10,
@@ -652,12 +618,13 @@ describe('internal-plugin-metrics', () => {
652
618
  key: 'client.locus.join.response',
653
619
  value: 20,
654
620
  });
621
+ // showedToJoinResp = 20-5 = 15, showInterstitialTime = 10-5 = 5, result = 15-5 = 10
655
622
  assert.deepEqual(cdl.getInterstitialToJoinOK(), 10);
656
623
  });
657
624
 
658
625
  it('calculates getInterstitialToJoinOK correctly when one value is not a number', () => {
659
626
  cdl.saveTimestamp({
660
- key: 'internal.client.interstitial-window.click.joinbutton',
627
+ key: 'internal.client.meeting.interstitial-window.showed',
661
628
  value: 'ten' as unknown as number,
662
629
  });
663
630
  cdl.saveTimestamp({
@@ -673,10 +640,7 @@ describe('internal-plugin-metrics', () => {
673
640
  });
674
641
 
675
642
  it('calculates getTotalJMT correctly', () => {
676
- cdl.saveTimestamp({
677
- key: 'internal.client.interstitial-window.click.joinbutton',
678
- value: 5,
679
- });
643
+ cdl.saveLatency('internal.click.to.interstitial', 10);
680
644
  cdl.saveTimestamp({
681
645
  key: 'internal.client.meeting.click.joinbutton',
682
646
  value: 10,
@@ -685,29 +649,39 @@ describe('internal-plugin-metrics', () => {
685
649
  key: 'internal.client.meeting.interstitial-window.showed',
686
650
  value: 20,
687
651
  });
652
+ cdl.saveTimestamp({
653
+ key: 'internal.client.interstitial-window.click.joinbutton',
654
+ value: 25,
655
+ });
688
656
  cdl.saveTimestamp({
689
657
  key: 'client.locus.join.response',
690
658
  value: 40,
691
659
  });
692
- assert.deepEqual(cdl.getTotalJMT(), 45);
660
+ // clickToInterstitial = 20-10 = 10
661
+ // showedToJoinLocusResponse = 40-20 = 20
662
+ // showInterstitialTime = 25-20 = 5
663
+ // total = 10 + 20 - 5 = 25
664
+ assert.deepEqual(cdl.getTotalJMT(), 25);
693
665
  });
694
666
 
695
667
  it('calculates getTotalJMT correctly when clickToInterstitial is 0', () => {
696
668
  cdl.saveLatency('internal.click.to.interstitial', 0);
697
669
  cdl.saveTimestamp({
698
- key: 'internal.client.interstitial-window.click.joinbutton',
670
+ key: 'internal.client.meeting.interstitial-window.showed',
699
671
  value: 20,
700
672
  });
701
673
  cdl.saveTimestamp({
702
674
  key: 'client.locus.join.response',
703
675
  value: 40,
704
676
  });
677
+ // showedToJoinLocusResponse = 40-20 = 20, showInterstitialTime = 0
678
+ // total = 0 + 20 - 0 = 20
705
679
  assert.deepEqual(cdl.getTotalJMT(), 20);
706
680
  });
707
681
 
708
682
  it('calculates getTotalJMT correctly when interstitialClickJoinToJoinLocusResponse is 0', () => {
709
683
  cdl.saveTimestamp({
710
- key: 'internal.client.interstitial-window.click.joinbutton',
684
+ key: 'internal.client.meeting.interstitial-window.showed',
711
685
  value: 40,
712
686
  });
713
687
  cdl.saveLatency('internal.click.to.interstitial', 12);
@@ -715,12 +689,14 @@ describe('internal-plugin-metrics', () => {
715
689
  key: 'client.locus.join.response',
716
690
  value: 40,
717
691
  });
692
+ // showedToJoinLocusResponse = 0, showInterstitialTime = 0
693
+ // total = 12 + 0 - 0 = 12
718
694
  assert.deepEqual(cdl.getTotalJMT(), 12);
719
695
  });
720
696
 
721
697
  it('calculates getTotalJMT correctly when both clickToInterstitial and interstitialClickJoinToJoinLocusResponse are 0', () => {
722
698
  cdl.saveTimestamp({
723
- key: 'internal.client.interstitial-window.click.joinbutton',
699
+ key: 'internal.client.meeting.interstitial-window.showed',
724
700
  value: 40,
725
701
  });
726
702
  cdl.saveLatency('internal.click.to.interstitial', 0);
@@ -733,7 +709,7 @@ describe('internal-plugin-metrics', () => {
733
709
 
734
710
  it('calculates getTotalJMT correctly when both clickToInterstitial is not a number', () => {
735
711
  cdl.saveTimestamp({
736
- key: 'internal.client.interstitial-window.click.joinbutton',
712
+ key: 'internal.client.meeting.interstitial-window.showed',
737
713
  value: 40,
738
714
  });
739
715
  cdl.saveLatency('internal.click.to.interstitial', 'eleven' as unknown as number);
@@ -746,7 +722,7 @@ describe('internal-plugin-metrics', () => {
746
722
 
747
723
  it('calculates getTotalJMT correctly when it is greater than MAX_INTEGER', () => {
748
724
  cdl.saveTimestamp({
749
- key: 'internal.client.interstitial-window.click.joinbutton',
725
+ key: 'internal.client.meeting.interstitial-window.showed',
750
726
  value: 5,
751
727
  });
752
728
  cdl.saveTimestamp({
@@ -758,14 +734,7 @@ describe('internal-plugin-metrics', () => {
758
734
  });
759
735
 
760
736
  it('calculates getTotalJMTWithUserDelay correctly', () => {
761
- cdl.saveTimestamp({
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
- });
737
+ cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 10);
769
738
  cdl.saveTimestamp({
770
739
  key: 'internal.client.meeting.interstitial-window.showed',
771
740
  value: 20,
@@ -846,48 +815,51 @@ describe('internal-plugin-metrics', () => {
846
815
  });
847
816
 
848
817
  it('calculates getTotalMediaJMT correctly with lobby exiting before media-engine.ready', () => {
849
- cdl.saveTimestamp({key: 'internal.client.meeting.click.joinbutton', value: 5});
818
+ cdl.saveLatency('internal.click.to.interstitial', 3);
819
+ // clickToInterstitial = 3
850
820
  cdl.saveTimestamp({key: 'internal.client.meeting.interstitial-window.showed', value: 8});
851
- // clickToInterstitial = 8 - 5 = 3
852
821
  cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 10});
853
822
  cdl.saveTimestamp({key: 'client.media-engine.ready', value: 50});
854
- // interstitialClickJoinToMediaEngineReady = 50 - 10 = 40
823
+ // interstitialShowedToMediaEngineReady = 50 - 8 = 42
824
+ // showInterstitialTime = 10 - 8 = 2
855
825
  cdl.saveTimestamp({key: 'client.lobby.entered', value: 20});
856
826
  cdl.saveTimestamp({key: 'client.lobby.exited', value: 30});
857
827
  // stayLobbyTimeCappedByMediaEngineReady = min(30, 50) - 20 = 10
858
- // total = 3 + 40 - 10 = 33
828
+ // total = 3 + 42 - 2 - 10 = 33
859
829
  assert.deepEqual(cdl.getTotalMediaJMT(), 33);
860
830
  });
861
831
 
862
832
  it('calculates getTotalMediaJMT correctly without lobby', () => {
863
- cdl.saveTimestamp({key: 'internal.client.meeting.click.joinbutton', value: 5});
864
- cdl.saveTimestamp({key: 'internal.client.meeting.interstitial-window.showed', value: 8});
833
+ cdl.saveLatency('internal.click.to.interstitial', 3);
865
834
  // clickToInterstitial = 3
835
+ cdl.saveTimestamp({key: 'internal.client.meeting.interstitial-window.showed', value: 8});
866
836
  cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 10});
867
837
  cdl.saveTimestamp({key: 'client.media-engine.ready', value: 50});
868
- // interstitialClickJoinToMediaEngineReady = 40
838
+ // interstitialShowedToMediaEngineReady = 50 - 8 = 42
839
+ // showInterstitialTime = 10 - 8 = 2
869
840
  // no client.lobby.entered → stayLobbyTimeCappedByMediaEngineReady = 0
870
- // total = 3 + 40 - 0 = 43
841
+ // total = 3 + 42 - 2 - 0 = 43
871
842
  assert.deepEqual(cdl.getTotalMediaJMT(), 43);
872
843
  });
873
844
 
874
845
  it('calculates getTotalMediaJMT correctly with lobby exiting after media-engine.ready', () => {
875
- cdl.saveTimestamp({key: 'internal.client.meeting.click.joinbutton', value: 5});
876
- cdl.saveTimestamp({key: 'internal.client.meeting.interstitial-window.showed', value: 8});
846
+ cdl.saveLatency('internal.click.to.interstitial', 3);
877
847
  // clickToInterstitial = 3
848
+ cdl.saveTimestamp({key: 'internal.client.meeting.interstitial-window.showed', value: 8});
878
849
  cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 10});
879
850
  cdl.saveTimestamp({key: 'client.media-engine.ready', value: 50});
880
- // interstitialClickJoinToMediaEngineReady = 40
851
+ // interstitialShowedToMediaEngineReady = 50 - 8 = 42
852
+ // showInterstitialTime = 10 - 8 = 2
881
853
  cdl.saveTimestamp({key: 'client.lobby.entered', value: 20});
882
854
  cdl.saveTimestamp({key: 'client.lobby.exited', value: 60});
883
855
  // stayLobbyTimeCappedByMediaEngineReady = min(60, 50) - 20 = 30
884
- // total = 3 + 40 - 30 = 13
856
+ // total = 3 + 42 - 2 - 30 = 13
885
857
  assert.deepEqual(cdl.getTotalMediaJMT(), 13);
886
858
  });
887
859
 
888
860
  it('calculates getTotalMediaJMT correctly when it is greater than MAX_INTEGER', () => {
889
- cdl.saveTimestamp({key: 'internal.client.meeting.click.joinbutton', value: 5});
890
- cdl.saveTimestamp({key: 'internal.client.meeting.interstitial-window.showed', value: 8});
861
+ cdl.saveLatency('internal.click.to.interstitial', 5);
862
+ cdl.saveTimestamp({key: 'internal.client.meeting.interstitial-window.showed', value: 10});
891
863
  cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 10});
892
864
  cdl.saveTimestamp({key: 'client.media-engine.ready', value: 4294967400});
893
865
  cdl.saveTimestamp({key: 'client.lobby.entered', value: 28});
@@ -896,7 +868,7 @@ describe('internal-plugin-metrics', () => {
896
868
  });
897
869
 
898
870
  it('returns undefined for getTotalMediaJMT when media-engine.ready is missing', () => {
899
- cdl.saveTimestamp({key: 'internal.client.meeting.click.joinbutton', value: 5});
871
+ cdl.saveLatency('internal.click.to.interstitial', 3);
900
872
  cdl.saveTimestamp({key: 'internal.client.meeting.interstitial-window.showed', value: 8});
901
873
  cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 10});
902
874
  cdl.saveTimestamp({key: 'client.locus.join.response', value: 20});
@@ -904,14 +876,15 @@ describe('internal-plugin-metrics', () => {
904
876
  });
905
877
 
906
878
  it('calculates getTotalMediaJMT correctly when there is no lobby and stayLobbyTime defaults to 0', () => {
907
- cdl.saveTimestamp({key: 'internal.client.meeting.click.joinbutton', value: 5});
879
+ cdl.saveLatency('internal.click.to.interstitial', 3);
880
+ // clickToInterstitial = 3
908
881
  cdl.saveTimestamp({key: 'internal.client.meeting.interstitial-window.showed', value: 8});
909
- // clickToInterstitial = 8 - 5 = 3
910
882
  cdl.saveTimestamp({key: 'internal.client.interstitial-window.click.joinbutton', value: 10});
911
883
  cdl.saveTimestamp({key: 'client.media-engine.ready', value: 50});
912
- // interstitialClickJoinToMediaEngineReady = 50 - 10 = 40
884
+ // interstitialShowedToMediaEngineReady = 50 - 8 = 42
885
+ // showInterstitialTime = 10 - 8 = 2
913
886
  // no client.lobby.entered → stayLobbyTimeCappedByMediaEngineReady = 0
914
- // total = 3 + 40 - 0 = 43
887
+ // total = 3 + 42 - 2 - 0 = 43
915
888
  assert.deepEqual(cdl.getTotalMediaJMT(), 43);
916
889
  });
917
890
 
@@ -926,9 +899,9 @@ describe('internal-plugin-metrics', () => {
926
899
  });
927
900
 
928
901
  it('calculates getTotalMediaJMTWithUserDelay correctly for guest join', () => {
929
- cdl.saveTimestamp({key: 'internal.client.meeting.click.joinbutton', value: 5});
902
+ cdl.saveLatency('internal.click.to.interstitial.with.user.delay', 3);
903
+ // clickToInterstitialWithUserDelay = 3
930
904
  cdl.saveTimestamp({key: 'internal.client.meeting.interstitial-window.showed', value: 8});
931
- // clickToInterstitialWithUserDelay = 8 - 5 = 3
932
905
  cdl.saveTimestamp({key: 'client.media-engine.ready', value: 50});
933
906
  // interstitialShowedToMediaEngineReady = 50 - 8 = 42
934
907
  // total = 3 + 42 = 45
@@ -992,6 +965,10 @@ describe('internal-plugin-metrics', () => {
992
965
 
993
966
  it('calculates getClientJMT correctly', () => {
994
967
  cdl.saveLatency('internal.click.to.interstitial.for.client.jmt', 5);
968
+ cdl.saveTimestamp({
969
+ key: 'internal.client.meeting.interstitial-window.showed',
970
+ value: 1,
971
+ });
995
972
  cdl.saveTimestamp({
996
973
  key: 'internal.client.interstitial-window.click.joinbutton',
997
974
  value: 2,
@@ -1000,11 +977,16 @@ describe('internal-plugin-metrics', () => {
1000
977
  key: 'client.locus.join.request',
1001
978
  value: 6,
1002
979
  });
1003
- // clickToInterstitialForClientJmt (5) + interstitialJoinToLocusJoinRequest (6 - 2 = 4) = 9
980
+ // showedToLocusJoinRequest = 6-1 = 5, showInterstitialTime = 2-1 = 1
981
+ // clickToInterstitialForClientJmt (5) + 5 - 1 = 9
1004
982
  assert.deepEqual(cdl.getClientJMT(), 9);
1005
983
  });
1006
984
 
1007
985
  it('returns undefined for getClientJMT when clickToInterstitialForClientJmt is missing', () => {
986
+ cdl.saveTimestamp({
987
+ key: 'internal.client.meeting.interstitial-window.showed',
988
+ value: 1,
989
+ });
1008
990
  cdl.saveTimestamp({
1009
991
  key: 'internal.client.interstitial-window.click.joinbutton',
1010
992
  value: 2,
@@ -1070,6 +1052,10 @@ describe('internal-plugin-metrics', () => {
1070
1052
  });
1071
1053
 
1072
1054
  it('calculates getInterstitialToMediaOKJMT correctly', () => {
1055
+ cdl.saveTimestamp({
1056
+ key: 'internal.client.meeting.interstitial-window.showed',
1057
+ value: 2,
1058
+ });
1073
1059
  cdl.saveTimestamp({
1074
1060
  key: 'internal.client.interstitial-window.click.joinbutton',
1075
1061
  value: 4,
@@ -1086,10 +1072,17 @@ describe('internal-plugin-metrics', () => {
1086
1072
  key: 'client.ice.end',
1087
1073
  value: 14,
1088
1074
  });
1075
+ // showedToIceEnd = 14-2 = 12, showInterstitialTime = 4-2 = 2
1076
+ // stayLobbyTimeCappedByIceEnd = min(12,14)-10 = 2
1077
+ // result = 12 - 2 - 2 = 8
1089
1078
  assert.deepEqual(cdl.getInterstitialToMediaOKJMT(), 8);
1090
1079
  });
1091
1080
 
1092
1081
  it('calculates getInterstitialToMediaOKJMT correctly when it is greater than MAX_INTEGER', () => {
1082
+ cdl.saveTimestamp({
1083
+ key: 'internal.client.meeting.interstitial-window.showed',
1084
+ value: 4,
1085
+ });
1093
1086
  cdl.saveTimestamp({
1094
1087
  key: 'internal.client.interstitial-window.click.joinbutton',
1095
1088
  value: 4,
@@ -1110,6 +1103,10 @@ describe('internal-plugin-metrics', () => {
1110
1103
  });
1111
1104
 
1112
1105
  it('calculates getInterstitialToMediaOKJMT correctly without lobby', () => {
1106
+ cdl.saveTimestamp({
1107
+ key: 'internal.client.meeting.interstitial-window.showed',
1108
+ value: 2,
1109
+ });
1113
1110
  cdl.saveTimestamp({
1114
1111
  key: 'internal.client.interstitial-window.click.joinbutton',
1115
1112
  value: 4,
@@ -1118,12 +1115,17 @@ describe('internal-plugin-metrics', () => {
1118
1115
  key: 'client.ice.end',
1119
1116
  value: 14,
1120
1117
  });
1121
- // no client.lobby.entered stayLobbyTimeCappedByIceEnd = 0
1122
- // result = (14 - 4) - 0 = 10
1118
+ // showedToIceEnd = 14-2 = 12, showInterstitialTime = 4-2 = 2
1119
+ // stayLobbyTimeCappedByIceEnd = 0 (no lobby)
1120
+ // result = 12 - 2 - 0 = 10
1123
1121
  assert.deepEqual(cdl.getInterstitialToMediaOKJMT(), 10);
1124
1122
  });
1125
1123
 
1126
1124
  it('calculates getInterstitialToMediaOKJMT correctly when there is no lobby and stayLobbyTime defaults to 0', () => {
1125
+ cdl.saveTimestamp({
1126
+ key: 'internal.client.meeting.interstitial-window.showed',
1127
+ value: 2,
1128
+ });
1127
1129
  cdl.saveTimestamp({
1128
1130
  key: 'internal.client.interstitial-window.click.joinbutton',
1129
1131
  value: 4,
@@ -1132,8 +1134,9 @@ describe('internal-plugin-metrics', () => {
1132
1134
  key: 'client.ice.end',
1133
1135
  value: 14,
1134
1136
  });
1135
- // no client.lobby.entered stayLobbyTimeCappedByIceEnd = 0
1136
- // result = (14 - 4) - 0 = 10
1137
+ // showedToIceEnd = 14-2 = 12, showInterstitialTime = 4-2 = 2
1138
+ // stayLobbyTimeCappedByIceEnd = 0 (no lobby)
1139
+ // result = 12 - 2 - 0 = 10
1137
1140
  assert.deepEqual(cdl.getInterstitialToMediaOKJMT(), 10);
1138
1141
  });
1139
1142