@webex/internal-plugin-metrics 3.7.0 → 3.8.0-next.1

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.
Files changed (38) hide show
  1. package/dist/business-metrics.js +74 -100
  2. package/dist/business-metrics.js.map +1 -1
  3. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +24 -15
  4. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -1
  5. package/dist/call-diagnostic/call-diagnostic-metrics.js +56 -7
  6. package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -1
  7. package/dist/call-diagnostic/config.js +19 -12
  8. package/dist/call-diagnostic/config.js.map +1 -1
  9. package/dist/generic-metrics.js +2 -2
  10. package/dist/generic-metrics.js.map +1 -1
  11. package/dist/metrics.js +1 -1
  12. package/dist/metrics.types.js.map +1 -1
  13. package/dist/new-metrics.js +28 -5
  14. package/dist/new-metrics.js.map +1 -1
  15. package/dist/types/business-metrics.d.ts +10 -28
  16. package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +14 -1
  17. package/dist/types/call-diagnostic/config.d.ts +2 -0
  18. package/dist/types/generic-metrics.d.ts +2 -2
  19. package/dist/types/metrics.types.d.ts +9 -1
  20. package/dist/types/new-metrics.d.ts +15 -3
  21. package/package.json +12 -12
  22. package/src/business-metrics.ts +66 -76
  23. package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +36 -14
  24. package/src/call-diagnostic/call-diagnostic-metrics.ts +72 -3
  25. package/src/call-diagnostic/config.ts +8 -0
  26. package/src/generic-metrics.ts +2 -2
  27. package/src/metrics.types.ts +10 -1
  28. package/src/new-metrics.ts +32 -4
  29. package/test/unit/spec/business/business-metrics.ts +2 -2
  30. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +85 -0
  31. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +243 -2
  32. package/test/unit/spec/new-metrics.ts +23 -0
  33. package/dist/behavioral/behavioral-metrics.js +0 -199
  34. package/dist/behavioral/behavioral-metrics.js.map +0 -1
  35. package/dist/behavioral/config.js +0 -11
  36. package/dist/behavioral/config.js.map +0 -1
  37. package/dist/types/behavioral/behavioral-metrics.d.ts +0 -63
  38. package/dist/types/behavioral/config.d.ts +0 -1
@@ -24,7 +24,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
24
24
  function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = _Reflect$construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
25
25
  function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
26
26
  /**
27
- * @description Util class to handle Buisness Metrics
27
+ * @description Util class to handle Business Metrics
28
28
  * @export
29
29
  * @class BusinessMetrics
30
30
  */
@@ -36,134 +36,108 @@ var BusinessMetrics = exports.default = /*#__PURE__*/function (_GenericMetrics)
36
36
  return _super.apply(this, arguments);
37
37
  }
38
38
  (0, _createClass2.default)(BusinessMetrics, [{
39
- key: "submitCallEndEvent",
39
+ key: "buildEvent",
40
40
  value:
41
41
  /**
42
- * unfortunately, the pinot team does not allow changes to the schema of wbxapp_callend_metrics
43
- * so we have to shim this layer specifically for this
44
- * https://confluence-eng-gpk2.cisco.com/conf/display/WAP/Table+wbxapp_callend_metrics
45
- * @param {EventPayload} payload payload of the metric
46
- * @returns {Promise<any>}
47
- */
48
- function submitCallEndEvent(_ref) {
49
- var payload = _ref.payload;
50
- var event = {
51
- type: ['business'],
52
- eventPayload: {
53
- key: 'callEnd',
54
- client_timestamp: new Date().toISOString(),
55
- appType: 'Web Client',
56
- value: _objectSpread({}, payload)
57
- }
58
- };
59
- return this.submitEvent({
60
- kind: 'buisness-events:wbxapp_callend_metrics -> ',
61
- name: 'wbxapp_callend_metrics',
62
- event: event
63
- });
64
- }
65
-
66
- /**
67
- * Submit a buisness metric to our metrics endpoint, going to the default business_ucf table
68
- * all event payload keys are converted into a hex string value
69
- * unfortunately, the pinot team does not allow changes to the schema of business_metrics
70
- * so we have to shim this layer specifically for this
71
- * https://confluence-eng-gpk2.cisco.com/conf/display/WAP/Table%3A+business_metrics
42
+ * Build the metric event to submit.
72
43
  * @param {string} name of the metric
73
- * @param {EventPayload} payload payload of the metric
74
- * @returns {Promise<any>}
75
- */
76
- }, {
77
- key: "submitBusinessMetricsEvent",
78
- value: function submitBusinessMetricsEvent(_ref2) {
79
- var name = _ref2.name,
80
- payload = _ref2.payload;
81
- var event = {
82
- type: ['business'],
83
- eventPayload: {
84
- key: name,
85
- client_timestamp: new Date().toISOString(),
86
- appType: 'Web Client',
87
- value: _objectSpread(_objectSpread(_objectSpread({}, this.getContext()), this.getBrowserDetails()), payload)
88
- }
89
- };
90
- return this.submitEvent({
91
- kind: 'buisness-events:business_metrics -> ',
92
- name: name,
93
- event: event
94
- });
95
- }
96
-
97
- /**
98
- * Submit a buisness metric to our metrics endpoint, going to the default business_ucf table
99
- * all event payload keys are converted into a hex string value
100
- * https://confluence-eng-gpk2.cisco.com/conf/display/WAP/Business+metrics++-%3E+ROMA
101
- * @param {string} name of the metric
102
- * @param {EventPayload} user payload of the metric
103
- * @returns {Promise<any>}
44
+ * @param {EventPayload} payload user payload of the metric
45
+ * @param {EventPayload} metadata to include outside of eventPayload.value
46
+ * @returns {MetricEvent} The constructed metric event
104
47
  */
105
- }, {
106
- key: "submitDefaultEvent",
107
- value: function submitDefaultEvent(_ref3) {
108
- var name = _ref3.name,
109
- payload = _ref3.payload;
110
- var event = {
48
+ function buildEvent(_ref) {
49
+ var name = _ref.name,
50
+ payload = _ref.payload,
51
+ metadata = _ref.metadata;
52
+ return {
111
53
  type: ['business'],
112
- eventPayload: {
54
+ eventPayload: _objectSpread(_objectSpread({
113
55
  key: name,
114
- appType: 'Web Client',
115
- client_timestamp: new Date().toISOString(),
116
- context: this.getContext(),
117
- browserDetails: this.getBrowserDetails(),
56
+ client_timestamp: new Date().toISOString()
57
+ }, metadata), {}, {
118
58
  value: payload
119
- }
59
+ })
120
60
  };
121
- return this.submitEvent({
122
- kind: 'buisness-events:default -> ',
123
- name: name,
124
- event: event
125
- });
126
61
  }
127
62
 
128
63
  /**
129
- * Submit a buisness metric to our metrics endpoint.
64
+ * Submit a business metric to our metrics endpoint.
130
65
  * routes to the correct table with the correct schema payload by table
131
66
  * https://confluence-eng-gpk2.cisco.com/conf/display/WAP/Business+metrics++-%3E+ROMA
132
67
  * @param {string} name of the metric, ignored if going to wbxapp_callend_metrics
133
68
  * @param {EventPayload} payload user payload of the metric
134
69
  * @param {Table} table optional - to submit the metric to and adapt the sent schema
70
+ * @param {EventPayload} metadata optional - to include outside of eventPayload.value
135
71
  * @returns {Promise<any>}
136
72
  */
137
73
  }, {
138
74
  key: "submitBusinessEvent",
139
- value: function submitBusinessEvent(_ref4) {
140
- var name = _ref4.name,
141
- payload = _ref4.payload,
142
- table = _ref4.table;
75
+ value: function submitBusinessEvent(_ref2) {
76
+ var name = _ref2.name,
77
+ payload = _ref2.payload,
78
+ table = _ref2.table,
79
+ metadata = _ref2.metadata;
143
80
  if (!table) {
144
81
  table = 'default';
145
82
  }
83
+ if (!metadata) {
84
+ metadata = {};
85
+ }
86
+ if (!metadata.appType) {
87
+ metadata.appType = 'Web Client';
88
+ }
146
89
  switch (table) {
147
90
  case 'wbxapp_callend_metrics':
148
- return this.submitCallEndEvent({
149
- payload: payload
150
- });
91
+ {
92
+ // https://confluence-eng-gpk2.cisco.com/conf/display/WAP/Table+wbxapp_callend_metrics
93
+ var callEndEvent = this.buildEvent({
94
+ name: 'callEnd',
95
+ payload: payload,
96
+ metadata: metadata
97
+ });
98
+ return this.submitEvent({
99
+ kind: 'business-events:wbxapp_callend_metrics -> ',
100
+ name: 'wbxapp_callend_metrics',
101
+ event: callEndEvent
102
+ });
103
+ }
151
104
  case 'business_metrics':
152
- return this.submitBusinessMetricsEvent({
153
- name: name,
154
- payload: payload
155
- });
105
+ {
106
+ // all event payload keys are converted into a hex string value
107
+ // unfortunately, the pinot team does not allow changes to the schema of business_metrics
108
+ // so we have to shim this layer specifically for this
109
+ // https://confluence-eng-gpk2.cisco.com/conf/display/WAP/Table%3A+business_metrics
110
+ var businessEvent = this.buildEvent({
111
+ name: name,
112
+ payload: _objectSpread(_objectSpread(_objectSpread({}, this.getContext()), this.getBrowserDetails()), payload),
113
+ metadata: metadata
114
+ });
115
+ return this.submitEvent({
116
+ kind: 'business-events:business_metrics -> ',
117
+ name: name,
118
+ event: businessEvent
119
+ });
120
+ }
156
121
  case 'business_ucf':
157
- return this.submitDefaultEvent({
158
- name: name,
159
- payload: payload
160
- });
161
122
  case 'default':
162
123
  default:
163
- return this.submitDefaultEvent({
164
- name: name,
165
- payload: payload
166
- });
124
+ {
125
+ // all event payload keys are converted into a hex string value
126
+ // https://confluence-eng-gpk2.cisco.com/conf/display/WAP/Business+metrics++-%3E+ROMA
127
+ var defaultEvent = this.buildEvent({
128
+ name: name,
129
+ payload: payload,
130
+ metadata: _objectSpread({
131
+ context: this.getContext(),
132
+ browserDetails: this.getBrowserDetails()
133
+ }, metadata)
134
+ });
135
+ return this.submitEvent({
136
+ kind: 'business-events:default -> ',
137
+ name: name,
138
+ event: defaultEvent
139
+ });
140
+ }
167
141
  }
168
142
  }
169
143
  }]);
@@ -1 +1 @@
1
- {"version":3,"names":["_genericMetrics","_interopRequireDefault","require","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","result","NewTarget","constructor","_Reflect$construct","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","BusinessMetrics","exports","_GenericMetrics","_inherits2","_super","_classCallCheck2","_createClass2","key","value","submitCallEndEvent","_ref","payload","event","type","eventPayload","client_timestamp","Date","toISOString","appType","submitEvent","kind","name","submitBusinessMetricsEvent","_ref2","getContext","getBrowserDetails","submitDefaultEvent","_ref3","context","browserDetails","submitBusinessEvent","_ref4","table","GenericMetrics"],"sources":["business-metrics.ts"],"sourcesContent":["import GenericMetrics from './generic-metrics';\nimport {EventPayload, Table} from './metrics.types';\n\n/**\n * @description Util class to handle Buisness Metrics\n * @export\n * @class BusinessMetrics\n */\nexport default class BusinessMetrics extends GenericMetrics {\n /**\n * unfortunately, the pinot team does not allow changes to the schema of wbxapp_callend_metrics\n * so we have to shim this layer specifically for this\n * https://confluence-eng-gpk2.cisco.com/conf/display/WAP/Table+wbxapp_callend_metrics\n * @param {EventPayload} payload payload of the metric\n * @returns {Promise<any>}\n */\n private submitCallEndEvent({payload}: {payload: EventPayload}) {\n const event = {\n type: ['business'],\n eventPayload: {\n key: 'callEnd',\n client_timestamp: new Date().toISOString(),\n appType: 'Web Client',\n value: {\n ...payload,\n },\n },\n };\n\n return this.submitEvent({\n kind: 'buisness-events:wbxapp_callend_metrics -> ',\n name: 'wbxapp_callend_metrics',\n event,\n });\n }\n\n /**\n * Submit a buisness metric to our metrics endpoint, going to the default business_ucf table\n * all event payload keys are converted into a hex string value\n * unfortunately, the pinot team does not allow changes to the schema of business_metrics\n * so we have to shim this layer specifically for this\n * https://confluence-eng-gpk2.cisco.com/conf/display/WAP/Table%3A+business_metrics\n * @param {string} name of the metric\n * @param {EventPayload} payload payload of the metric\n * @returns {Promise<any>}\n */\n private submitBusinessMetricsEvent({name, payload}: {name: string; payload: EventPayload}) {\n const event = {\n type: ['business'],\n eventPayload: {\n key: name,\n client_timestamp: new Date().toISOString(),\n appType: 'Web Client',\n value: {\n ...this.getContext(),\n ...this.getBrowserDetails(),\n ...payload,\n },\n },\n };\n\n return this.submitEvent({kind: 'buisness-events:business_metrics -> ', name, event});\n }\n\n /**\n * Submit a buisness metric to our metrics endpoint, going to the default business_ucf table\n * all event payload keys are converted into a hex string value\n * https://confluence-eng-gpk2.cisco.com/conf/display/WAP/Business+metrics++-%3E+ROMA\n * @param {string} name of the metric\n * @param {EventPayload} user payload of the metric\n * @returns {Promise<any>}\n */\n private submitDefaultEvent({name, payload}: {name: string; payload: EventPayload}) {\n const event = {\n type: ['business'],\n eventPayload: {\n key: name,\n appType: 'Web Client',\n client_timestamp: new Date().toISOString(),\n context: this.getContext(),\n browserDetails: this.getBrowserDetails(),\n value: payload,\n },\n };\n\n return this.submitEvent({kind: 'buisness-events:default -> ', name, event});\n }\n\n /**\n * Submit a buisness metric to our metrics endpoint.\n * routes to the correct table with the correct schema payload by table\n * https://confluence-eng-gpk2.cisco.com/conf/display/WAP/Business+metrics++-%3E+ROMA\n * @param {string} name of the metric, ignored if going to wbxapp_callend_metrics\n * @param {EventPayload} payload user payload of the metric\n * @param {Table} table optional - to submit the metric to and adapt the sent schema\n * @returns {Promise<any>}\n */\n public submitBusinessEvent({\n name,\n payload,\n table,\n }: {\n name: string;\n payload: EventPayload;\n table?: Table;\n }): Promise<void> {\n if (!table) {\n table = 'default';\n }\n switch (table) {\n case 'wbxapp_callend_metrics':\n return this.submitCallEndEvent({payload});\n case 'business_metrics':\n return this.submitBusinessMetricsEvent({name, payload});\n case 'business_ucf':\n return this.submitDefaultEvent({name, payload});\n case 'default':\n default:\n return this.submitDefaultEvent({name, payload});\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["_genericMetrics","_interopRequireDefault","require","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","result","NewTarget","constructor","_Reflect$construct","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","BusinessMetrics","exports","_GenericMetrics","_inherits2","_super","_classCallCheck2","_createClass2","key","value","buildEvent","_ref","name","payload","metadata","type","eventPayload","client_timestamp","Date","toISOString","submitBusinessEvent","_ref2","table","appType","callEndEvent","submitEvent","kind","event","businessEvent","getContext","getBrowserDetails","defaultEvent","context","browserDetails","GenericMetrics"],"sources":["business-metrics.ts"],"sourcesContent":["import GenericMetrics from './generic-metrics';\nimport {EventPayload, Table} from './metrics.types';\n\n/**\n * @description Util class to handle Business Metrics\n * @export\n * @class BusinessMetrics\n */\nexport default class BusinessMetrics extends GenericMetrics {\n /**\n * Build the metric event to submit.\n * @param {string} name of the metric\n * @param {EventPayload} payload user payload of the metric\n * @param {EventPayload} metadata to include outside of eventPayload.value\n * @returns {MetricEvent} The constructed metric event\n */\n private buildEvent({name, payload, metadata}: {name: string; payload: object; metadata: object}) {\n return {\n type: ['business'],\n eventPayload: {\n key: name,\n client_timestamp: new Date().toISOString(),\n ...metadata,\n value: payload,\n },\n };\n }\n\n /**\n * Submit a business metric to our metrics endpoint.\n * routes to the correct table with the correct schema payload by table\n * https://confluence-eng-gpk2.cisco.com/conf/display/WAP/Business+metrics++-%3E+ROMA\n * @param {string} name of the metric, ignored if going to wbxapp_callend_metrics\n * @param {EventPayload} payload user payload of the metric\n * @param {Table} table optional - to submit the metric to and adapt the sent schema\n * @param {EventPayload} metadata optional - to include outside of eventPayload.value\n * @returns {Promise<any>}\n */\n public submitBusinessEvent({\n name,\n payload,\n table,\n metadata,\n }: {\n name: string;\n payload: EventPayload;\n table?: Table;\n metadata?: EventPayload;\n }): Promise<void> {\n if (!table) {\n table = 'default';\n }\n if (!metadata) {\n metadata = {};\n }\n if (!metadata.appType) {\n metadata.appType = 'Web Client';\n }\n switch (table) {\n case 'wbxapp_callend_metrics': {\n // https://confluence-eng-gpk2.cisco.com/conf/display/WAP/Table+wbxapp_callend_metrics\n const callEndEvent = this.buildEvent({name: 'callEnd', payload, metadata});\n\n return this.submitEvent({\n kind: 'business-events:wbxapp_callend_metrics -> ',\n name: 'wbxapp_callend_metrics',\n event: callEndEvent,\n });\n }\n\n case 'business_metrics': {\n // all event payload keys are converted into a hex string value\n // unfortunately, the pinot team does not allow changes to the schema of business_metrics\n // so we have to shim this layer specifically for this\n // https://confluence-eng-gpk2.cisco.com/conf/display/WAP/Table%3A+business_metrics\n const businessEvent = this.buildEvent({\n name,\n payload: {\n ...this.getContext(),\n ...this.getBrowserDetails(),\n ...payload,\n },\n metadata,\n });\n\n return this.submitEvent({\n kind: 'business-events:business_metrics -> ',\n name,\n event: businessEvent,\n });\n }\n\n case 'business_ucf':\n case 'default':\n default: {\n // all event payload keys are converted into a hex string value\n // https://confluence-eng-gpk2.cisco.com/conf/display/WAP/Business+metrics++-%3E+ROMA\n const defaultEvent = this.buildEvent({\n name,\n payload,\n metadata: {\n context: this.getContext(),\n browserDetails: this.getBrowserDetails(),\n ...metadata,\n },\n });\n\n return this.submitEvent({kind: 'business-events:default -> ', name, event: defaultEvent});\n }\n }\n }\n}\n"],"mappings":"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"}
@@ -103,10 +103,14 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
103
103
  }
104
104
  // for some events we're only interested in the first timestamp not last
105
105
  // as these events can happen multiple times
106
- if (key === 'client.media.rx.start' || key === 'client.media.tx.start' || key === 'internal.client.meetinginfo.request' || key === 'internal.client.meetinginfo.response') {
106
+ if (key === 'client.media.rx.start' || key === 'client.media.tx.start' || key === 'internal.client.meetinginfo.request' || key === 'internal.client.meetinginfo.response' || key === 'client.media-engine.remote-sdp-received') {
107
107
  this.saveFirstTimestampOnly(key, value);
108
108
  } else {
109
109
  this.latencyTimestamps.set(key, value);
110
+ // new offer/answer so reset the remote SDP timestamp
111
+ if (key === 'client.media-engine.local-sdp-generated') {
112
+ this.latencyTimestamps.delete('client.media-engine.remote-sdp-received');
113
+ }
110
114
  }
111
115
  }
112
116
 
@@ -172,7 +176,7 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
172
176
  value: function getDiffBetweenTimestamps(a, b) {
173
177
  var start = this.latencyTimestamps.get(a);
174
178
  var end = this.latencyTimestamps.get(b);
175
- if (start && end) {
179
+ if (typeof start === 'number' && typeof end === 'number') {
176
180
  return end - start;
177
181
  }
178
182
  return undefined;
@@ -212,7 +216,7 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
212
216
  key: "getU2CTime",
213
217
  value: function getU2CTime() {
214
218
  var u2cLatency = this.precomputedLatencies.get('internal.get.u2c.time');
215
- return u2cLatency ? Math.floor(u2cLatency) : undefined;
219
+ return typeof u2cLatency === 'number' ? Math.floor(u2cLatency) : undefined;
216
220
  }
217
221
 
218
222
  /**
@@ -322,7 +326,8 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
322
326
  }, {
323
327
  key: "getPageJMT",
324
328
  value: function getPageJMT() {
325
- return this.precomputedLatencies.get('internal.client.pageJMT') || undefined;
329
+ var latency = this.precomputedLatencies.get('internal.client.pageJMT');
330
+ return typeof latency === 'number' ? latency : undefined;
326
331
  }
327
332
 
328
333
  /**
@@ -332,7 +337,8 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
332
337
  }, {
333
338
  key: "getDownloadTimeJMT",
334
339
  value: function getDownloadTimeJMT() {
335
- return this.precomputedLatencies.get('internal.download.time') || undefined;
340
+ var latency = this.precomputedLatencies.get('internal.download.time');
341
+ return typeof latency === 'number' ? latency : undefined;
336
342
  }
337
343
 
338
344
  /**
@@ -346,9 +352,11 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
346
352
  if (this.latencyTimestamps.get('internal.client.meeting.click.joinbutton')) {
347
353
  return this.getDiffBetweenTimestamps('internal.client.meeting.click.joinbutton', 'internal.client.meeting.interstitial-window.showed');
348
354
  }
349
-
350
- // for cross launch and guest flows
351
- return this.precomputedLatencies.get('internal.click.to.interstitial') || undefined;
355
+ var clickToInterstitialLatency = this.precomputedLatencies.get('internal.click.to.interstitial');
356
+ if (typeof clickToInterstitialLatency === 'number') {
357
+ return clickToInterstitialLatency;
358
+ }
359
+ return undefined;
352
360
  }
353
361
 
354
362
  /**
@@ -382,7 +390,8 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
382
390
 
383
391
  // get the first timestamp
384
392
  var connectedMedia = this.latencyTimestamps.get('client.ice.end');
385
- var lobbyTime = this.getStayLobbyTime() || 0;
393
+ var lobbyTimeLatency = this.getStayLobbyTime();
394
+ var lobbyTime = typeof lobbyTimeLatency === 'number' ? lobbyTimeLatency : 0;
386
395
  if (interstitialJoinClickTimestamp && connectedMedia) {
387
396
  return connectedMedia - interstitialJoinClickTimestamp - lobbyTime;
388
397
  }
@@ -398,7 +407,7 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
398
407
  value: function getTotalJMT() {
399
408
  var clickToInterstitial = this.getClickToInterstitial();
400
409
  var interstitialToJoinOk = this.getInterstitialToJoinOK();
401
- if (clickToInterstitial && interstitialToJoinOk) {
410
+ if (typeof clickToInterstitial === 'number' && typeof interstitialToJoinOk === 'number') {
402
411
  return clickToInterstitial + interstitialToJoinOk;
403
412
  }
404
413
  return undefined;
@@ -450,7 +459,7 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
450
459
  value: function getClientJMT() {
451
460
  var interstitialToJoinOk = this.getInterstitialToJoinOK();
452
461
  var joinConfJMT = this.getJoinConfJMT();
453
- if (interstitialToJoinOk && joinConfJMT) {
462
+ if (typeof interstitialToJoinOk === 'number' && typeof joinConfJMT === 'number') {
454
463
  return interstitialToJoinOk - joinConfJMT;
455
464
  }
456
465
  return undefined;
@@ -481,7 +490,7 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
481
490
  key: "getReachabilityClustersReqResp",
482
491
  value: function getReachabilityClustersReqResp() {
483
492
  var reachablityClusterReqResp = this.precomputedLatencies.get('internal.get.cluster.time');
484
- return reachablityClusterReqResp ? Math.floor(reachablityClusterReqResp) : undefined;
493
+ return typeof reachablityClusterReqResp === 'number' ? Math.floor(reachablityClusterReqResp) : undefined;
485
494
  }
486
495
 
487
496
  /**
@@ -509,7 +518,7 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
509
518
  key: "getExchangeCITokenJMT",
510
519
  value: function getExchangeCITokenJMT() {
511
520
  var exchangeCITokenJMT = this.precomputedLatencies.get('internal.exchange.ci.token.time');
512
- return exchangeCITokenJMT ? Math.floor(exchangeCITokenJMT) : undefined;
521
+ return typeof exchangeCITokenJMT === 'number' ? Math.floor(exchangeCITokenJMT) : undefined;
513
522
  }
514
523
 
515
524
  /**
@@ -519,7 +528,7 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
519
528
  key: "getRefreshCaptchaReqResp",
520
529
  value: function getRefreshCaptchaReqResp() {
521
530
  var refreshCaptchaReqResp = this.precomputedLatencies.get('internal.refresh.captcha.time');
522
- return refreshCaptchaReqResp ? Math.floor(refreshCaptchaReqResp) : undefined;
531
+ return typeof refreshCaptchaReqResp === 'number' ? Math.floor(refreshCaptchaReqResp) : undefined;
523
532
  }
524
533
 
525
534
  /**
@@ -530,7 +539,7 @@ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlu
530
539
  key: "getDownloadIntelligenceModelsReqResp",
531
540
  value: function getDownloadIntelligenceModelsReqResp() {
532
541
  var downloadIntelligenceModelsReqResp = this.precomputedLatencies.get('internal.api.fetch.intelligence.models');
533
- return downloadIntelligenceModelsReqResp ? Math.floor(downloadIntelligenceModelsReqResp) : undefined;
542
+ return typeof downloadIntelligenceModelsReqResp === 'number' ? Math.floor(downloadIntelligenceModelsReqResp) : undefined;
534
543
  }
535
544
 
536
545
  /**
@@ -1 +1 @@
1
- {"version":3,"names":["_webexCore","require","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","CallDiagnosticLatencies","exports","_WebexPlugin","_inherits2","_super","_this","_classCallCheck2","_len","length","args","Array","_key","concat","_defineProperty2","_assertThisInitialized2","latencyTimestamps","_map","precomputedLatencies","_createClass2","key","value","clearTimestamps","clear","setMeetingId","meetingId","getMeeting","webex","meetings","getBasicMeetingInformation","undefined","saveTimestamp","_ref","_ref$value","Date","getTime","_ref$options","options","saveFirstTimestampOnly","set","saveLatency","accumulate","existingValue","get","measureLatency","callback","_this2","start","performance","now","finally","has","getDiffBetweenTimestamps","a","b","end","getMeetingInfoReqResp","getShowInterstitialTime","getU2CTime","u2cLatency","Math","floor","getRegisterWDMDeviceJMT","getCallInitJoinReq","getJoinReqResp","getTurnDiscoveryTime","getLocalSDPGenRemoteSDPRecv","getICESetupTime","getAudioICESetupTime","getVideoICESetupTime","getShareICESetupTime","getStayLobbyTime","getPageJMT","getDownloadTimeJMT","getClickToInterstitial","getInterstitialToJoinOK","getCallInitMediaEngineReady","getInterstitialToMediaOKJMT","interstitialJoinClickTimestamp","connectedMedia","lobbyTime","getTotalJMT","clickToInterstitial","interstitialToJoinOk","getJoinConfJMT","joinReqResp","ICESetupTime","getTotalMediaJMT","joinConfJMT","_this$getMeeting","totalMediaJMT","allowMediaInLobby","getClientJMT","getAudioJoinRespRxStart","getVideoJoinRespRxStart","getReachabilityClustersReqResp","reachablityClusterReqResp","getAudioJoinRespTxStart","getVideoJoinRespTxStart","getExchangeCITokenJMT","exchangeCITokenJMT","getRefreshCaptchaReqResp","refreshCaptchaReqResp","getDownloadIntelligenceModelsReqResp","downloadIntelligenceModelsReqResp","getOtherAppApiReqResp","otherAppApiJMT","WebexPlugin"],"sources":["call-diagnostic-metrics-latencies.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable valid-jsdoc */\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport {MetricEventNames, PreComputedLatencies} from '../metrics.types';\n\n// we only care about client event and feature event for now\n\n/**\n * @description Helper class to store latencies timestamp and to calculate various latencies for CA.\n * @exports\n * @class CallDiagnosticLatencies\n */\nexport default class CallDiagnosticLatencies extends WebexPlugin {\n latencyTimestamps: Map<MetricEventNames, number>;\n precomputedLatencies: Map<PreComputedLatencies, number>;\n // meetingId that the current latencies are for\n private meetingId?: string;\n\n /**\n * @constructor\n */\n constructor(...args) {\n super(...args);\n this.latencyTimestamps = new Map();\n this.precomputedLatencies = new Map();\n }\n\n /**\n * Clear timestamps\n */\n public clearTimestamps() {\n this.latencyTimestamps.clear();\n this.precomputedLatencies.clear();\n }\n\n /**\n * Associate current latencies with a meeting id\n * @param meetingId\n */\n private setMeetingId(meetingId: string) {\n this.meetingId = meetingId;\n }\n\n /**\n * Returns the meeting object associated with current latencies\n * @returns meeting object\n */\n private getMeeting() {\n if (this.meetingId) {\n // @ts-ignore\n return this.webex.meetings.getBasicMeetingInformation(this.meetingId);\n }\n\n return undefined;\n }\n\n /**\n * Store timestamp value\n * @param key - key\n * @param value - value\n * @param options - store options\n * @throws\n * @returns\n */\n public saveTimestamp({\n key,\n value = new Date().getTime(),\n options = {},\n }: {\n key: MetricEventNames;\n value?: number;\n options?: {meetingId?: string};\n }) {\n // save the meetingId so we can use the meeting object in latency calculations if needed\n const {meetingId} = options;\n if (meetingId) {\n this.setMeetingId(meetingId);\n }\n // for some events we're only interested in the first timestamp not last\n // as these events can happen multiple times\n if (\n key === 'client.media.rx.start' ||\n key === 'client.media.tx.start' ||\n key === 'internal.client.meetinginfo.request' ||\n key === 'internal.client.meetinginfo.response'\n ) {\n this.saveFirstTimestampOnly(key, value);\n } else {\n this.latencyTimestamps.set(key, value);\n }\n }\n\n /**\n * Store precomputed latency value\n * @param key - key\n * @param value - value\n * @param accumulate - when it is true, it overwrites existing value with sum of the current value and the new measurement otherwise just store the new measurement\n * @throws\n * @returns\n */\n public saveLatency(key: PreComputedLatencies, value: number, accumulate = false) {\n const existingValue = accumulate ? this.precomputedLatencies.get(key) || 0 : 0;\n this.precomputedLatencies.set(key, value + existingValue);\n }\n\n /**\n * Measure latency for a request\n * @param callback - callback for which you would like to measure latency\n * @param key - key\n * @param accumulate - when it is true, it overwrites existing value with sum of the current value and the new measurement otherwise just store the new measurement\n * @returns\n */\n public measureLatency(\n callback: () => Promise<unknown>,\n key: PreComputedLatencies,\n accumulate = false\n ) {\n const start = performance.now();\n\n return callback().finally(() => {\n this.saveLatency(key, performance.now() - start, accumulate);\n });\n }\n\n /**\n * Store only the first timestamp value for the given key\n * @param key - key\n * @param value -value\n * @throws\n * @returns\n */\n saveFirstTimestampOnly(key: MetricEventNames, value: number = new Date().getTime()) {\n if (this.latencyTimestamps.has(key)) {\n return;\n }\n this.latencyTimestamps.set(key, value);\n }\n\n /**\n * Helper to calculate end - start\n * @param a start\n * @param b end\n * @returns latency\n */\n public getDiffBetweenTimestamps(a: MetricEventNames, b: MetricEventNames) {\n const start = this.latencyTimestamps.get(a);\n const end = this.latencyTimestamps.get(b);\n if (start && end) {\n return end - start;\n }\n\n return undefined;\n }\n\n /**\n * Meeting Info Request\n * @note Meeting Info request happen not just in the join phase. CA requires\n * metrics around meeting info request that are only part of join phase.\n * This internal.* event is used to track the real timestamps\n * (when the actual request/response happen). This is because the actual CA event is\n * sent inside the join method on the meeting object based on some logic, but that's not exactly when\n * those events are actually fired. The logic only confirms that they have happened, and we send them over.\n * @returns - latency\n */\n public getMeetingInfoReqResp() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meetinginfo.request',\n 'internal.client.meetinginfo.response'\n );\n }\n\n /**\n * Interstitial Time\n * @returns - latency\n */\n public getShowInterstitialTime() {\n return this.getDiffBetweenTimestamps(\n 'client.interstitial-window.start-launch',\n 'internal.client.interstitial-window.click.joinbutton'\n );\n }\n\n /**\n * getU2CTime\n * @returns - latency\n */\n public getU2CTime() {\n const u2cLatency = this.precomputedLatencies.get('internal.get.u2c.time');\n\n return u2cLatency ? Math.floor(u2cLatency) : undefined;\n }\n\n /**\n * Device Register Time\n * @returns - latency\n */\n public getRegisterWDMDeviceJMT() {\n return this.getDiffBetweenTimestamps(\n 'internal.register.device.request',\n 'internal.register.device.response'\n );\n }\n\n /**\n * Call Init Join Request\n * @returns - latency\n */\n public getCallInitJoinReq() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.locus.join.request'\n );\n }\n\n /**\n * Locus Join Request\n * @returns - latency\n */\n public getJoinReqResp() {\n return this.getDiffBetweenTimestamps('client.locus.join.request', 'client.locus.join.response');\n }\n\n /**\n * Time taken to do turn discovery\n * @returns - latency\n */\n public getTurnDiscoveryTime() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.add-media.turn-discovery.start',\n 'internal.client.add-media.turn-discovery.end'\n );\n }\n\n /**\n * Local SDP Generated Remote SDP REceived\n * @returns - latency\n */\n public getLocalSDPGenRemoteSDPRecv() {\n return this.getDiffBetweenTimestamps(\n 'client.media-engine.local-sdp-generated',\n 'client.media-engine.remote-sdp-received'\n );\n }\n\n /**\n * ICE Setup Time\n * @returns - latency\n */\n public getICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Audio ICE time\n * @returns - latency\n */\n public getAudioICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Video ICE Time\n * @returns - latency\n */\n public getVideoICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Share ICE Time\n * @returns - latency\n */\n public getShareICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Stay Lobby Time\n * @returns - latency\n */\n public getStayLobbyTime() {\n return this.getDiffBetweenTimestamps(\n 'client.locus.join.response',\n 'internal.host.meeting.participant.admitted'\n );\n }\n\n /**\n * Page JMT\n * @returns - latency\n */\n public getPageJMT() {\n return this.precomputedLatencies.get('internal.client.pageJMT') || undefined;\n }\n\n /**\n * Download Time JMT\n * @returns - latency\n */\n public getDownloadTimeJMT() {\n return this.precomputedLatencies.get('internal.download.time') || 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 // for cross launch and guest flows\n return this.precomputedLatencies.get('internal.click.to.interstitial') || undefined;\n }\n\n /**\n * Interstitial To Join Ok\n * @returns - latency\n */\n public getInterstitialToJoinOK() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.locus.join.response'\n );\n }\n\n /**\n * Call Init To MediaEngineReady\n * @returns - latency\n */\n public getCallInitMediaEngineReady() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.media-engine.ready'\n );\n }\n\n /**\n * Interstitial To Media Ok\n * @returns - latency\n */\n public getInterstitialToMediaOKJMT() {\n const interstitialJoinClickTimestamp = this.latencyTimestamps.get(\n 'internal.client.interstitial-window.click.joinbutton'\n );\n\n // get the first timestamp\n const connectedMedia = this.latencyTimestamps.get('client.ice.end');\n\n const lobbyTime = this.getStayLobbyTime() || 0;\n\n if (interstitialJoinClickTimestamp && connectedMedia) {\n return connectedMedia - interstitialJoinClickTimestamp - lobbyTime;\n }\n\n return undefined;\n }\n\n /**\n * Total JMT\n * @returns - latency\n */\n public getTotalJMT() {\n const clickToInterstitial = this.getClickToInterstitial();\n const interstitialToJoinOk = this.getInterstitialToJoinOK();\n\n if (clickToInterstitial && interstitialToJoinOk) {\n return clickToInterstitial + interstitialToJoinOk;\n }\n\n return undefined;\n }\n\n /**\n * Join Conf JMT\n * @returns - latency\n */\n public getJoinConfJMT() {\n const joinReqResp = this.getJoinReqResp();\n const ICESetupTime = this.getICESetupTime();\n\n if (joinReqResp && ICESetupTime) {\n return joinReqResp + ICESetupTime;\n }\n\n return undefined;\n }\n\n /**\n * Total Media JMT\n * @returns - latency\n */\n public getTotalMediaJMT() {\n const clickToInterstitial = this.getClickToInterstitial();\n const interstitialToJoinOk = this.getInterstitialToJoinOK();\n const joinConfJMT = this.getJoinConfJMT();\n const lobbyTime = this.getStayLobbyTime();\n\n if (clickToInterstitial && interstitialToJoinOk && joinConfJMT) {\n const totalMediaJMT = clickToInterstitial + interstitialToJoinOk + joinConfJMT;\n if (this.getMeeting()?.allowMediaInLobby) {\n return totalMediaJMT;\n }\n\n return totalMediaJMT - lobbyTime;\n }\n\n return undefined;\n }\n\n /**\n * Client JMT\n * @returns - latency\n */\n public getClientJMT() {\n const interstitialToJoinOk = this.getInterstitialToJoinOK();\n const joinConfJMT = this.getJoinConfJMT();\n\n if (interstitialToJoinOk && joinConfJMT) {\n return interstitialToJoinOk - joinConfJMT;\n }\n\n return undefined;\n }\n\n /**\n * Audio setup delay receive\n */\n public getAudioJoinRespRxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.rx.start');\n }\n\n /**\n * Video setup delay receive\n */\n public getVideoJoinRespRxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.rx.start');\n }\n\n /**\n * Total latency for all get cluster request.\n */\n public getReachabilityClustersReqResp() {\n const reachablityClusterReqResp = this.precomputedLatencies.get('internal.get.cluster.time');\n\n return reachablityClusterReqResp ? Math.floor(reachablityClusterReqResp) : undefined;\n }\n\n /**\n * Audio setup delay transmit\n */\n public getAudioJoinRespTxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.tx.start');\n }\n\n /**\n * Video setup delay transmit\n */\n public getVideoJoinRespTxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.tx.start');\n }\n\n /**\n * Total latency for all exchange ci token.\n */\n public getExchangeCITokenJMT() {\n const exchangeCITokenJMT = this.precomputedLatencies.get('internal.exchange.ci.token.time');\n\n return exchangeCITokenJMT ? Math.floor(exchangeCITokenJMT) : undefined;\n }\n\n /**\n * Total latency for all refresh captcha requests.\n */\n public getRefreshCaptchaReqResp() {\n const refreshCaptchaReqResp = this.precomputedLatencies.get('internal.refresh.captcha.time');\n\n return refreshCaptchaReqResp ? Math.floor(refreshCaptchaReqResp) : 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 downloadIntelligenceModelsReqResp\n ? Math.floor(downloadIntelligenceModelsReqResp)\n : undefined;\n }\n\n /**\n * Get the total latency for all other app API requests.\n * Excludes meeting info, because it's measured separately.\n * @returns - latency\n */\n public getOtherAppApiReqResp() {\n const otherAppApiJMT = this.precomputedLatencies.get('internal.other.app.api.time');\n\n return otherAppApiJMT > 0 ? Math.floor(otherAppApiJMT) : undefined;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["_webexCore","require","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","CallDiagnosticLatencies","exports","_WebexPlugin","_inherits2","_super","_this","_classCallCheck2","_len","length","args","Array","_key","concat","_defineProperty2","_assertThisInitialized2","latencyTimestamps","_map","precomputedLatencies","_createClass2","key","value","clearTimestamps","clear","setMeetingId","meetingId","getMeeting","webex","meetings","getBasicMeetingInformation","undefined","saveTimestamp","_ref","_ref$value","Date","getTime","_ref$options","options","saveFirstTimestampOnly","set","delete","saveLatency","accumulate","existingValue","get","measureLatency","callback","_this2","start","performance","now","finally","has","getDiffBetweenTimestamps","a","b","end","getMeetingInfoReqResp","getShowInterstitialTime","getU2CTime","u2cLatency","Math","floor","getRegisterWDMDeviceJMT","getCallInitJoinReq","getJoinReqResp","getTurnDiscoveryTime","getLocalSDPGenRemoteSDPRecv","getICESetupTime","getAudioICESetupTime","getVideoICESetupTime","getShareICESetupTime","getStayLobbyTime","getPageJMT","latency","getDownloadTimeJMT","getClickToInterstitial","clickToInterstitialLatency","getInterstitialToJoinOK","getCallInitMediaEngineReady","getInterstitialToMediaOKJMT","interstitialJoinClickTimestamp","connectedMedia","lobbyTimeLatency","lobbyTime","getTotalJMT","clickToInterstitial","interstitialToJoinOk","getJoinConfJMT","joinReqResp","ICESetupTime","getTotalMediaJMT","joinConfJMT","_this$getMeeting","totalMediaJMT","allowMediaInLobby","getClientJMT","getAudioJoinRespRxStart","getVideoJoinRespRxStart","getReachabilityClustersReqResp","reachablityClusterReqResp","getAudioJoinRespTxStart","getVideoJoinRespTxStart","getExchangeCITokenJMT","exchangeCITokenJMT","getRefreshCaptchaReqResp","refreshCaptchaReqResp","getDownloadIntelligenceModelsReqResp","downloadIntelligenceModelsReqResp","getOtherAppApiReqResp","otherAppApiJMT","WebexPlugin"],"sources":["call-diagnostic-metrics-latencies.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable valid-jsdoc */\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport {MetricEventNames, PreComputedLatencies} from '../metrics.types';\n\n// we only care about client event and feature event for now\n\n/**\n * @description Helper class to store latencies timestamp and to calculate various latencies for CA.\n * @exports\n * @class CallDiagnosticLatencies\n */\nexport default class CallDiagnosticLatencies extends WebexPlugin {\n latencyTimestamps: Map<MetricEventNames, number>;\n precomputedLatencies: Map<PreComputedLatencies, number>;\n // meetingId that the current latencies are for\n private meetingId?: string;\n\n /**\n * @constructor\n */\n constructor(...args) {\n super(...args);\n this.latencyTimestamps = new Map();\n this.precomputedLatencies = new Map();\n }\n\n /**\n * Clear timestamps\n */\n public clearTimestamps() {\n this.latencyTimestamps.clear();\n this.precomputedLatencies.clear();\n }\n\n /**\n * Associate current latencies with a meeting id\n * @param meetingId\n */\n private setMeetingId(meetingId: string) {\n this.meetingId = meetingId;\n }\n\n /**\n * Returns the meeting object associated with current latencies\n * @returns meeting object\n */\n private getMeeting() {\n if (this.meetingId) {\n // @ts-ignore\n return this.webex.meetings.getBasicMeetingInformation(this.meetingId);\n }\n\n return undefined;\n }\n\n /**\n * Store timestamp value\n * @param key - key\n * @param value - value\n * @param options - store options\n * @throws\n * @returns\n */\n public saveTimestamp({\n key,\n value = new Date().getTime(),\n options = {},\n }: {\n key: MetricEventNames;\n value?: number;\n options?: {meetingId?: string};\n }) {\n // save the meetingId so we can use the meeting object in latency calculations if needed\n const {meetingId} = options;\n if (meetingId) {\n this.setMeetingId(meetingId);\n }\n // for some events we're only interested in the first timestamp not last\n // as these events can happen multiple times\n if (\n key === 'client.media.rx.start' ||\n key === 'client.media.tx.start' ||\n key === 'internal.client.meetinginfo.request' ||\n key === 'internal.client.meetinginfo.response' ||\n key === 'client.media-engine.remote-sdp-received'\n ) {\n this.saveFirstTimestampOnly(key, value);\n } else {\n this.latencyTimestamps.set(key, value);\n // new offer/answer so reset the remote SDP timestamp\n if (key === 'client.media-engine.local-sdp-generated') {\n this.latencyTimestamps.delete('client.media-engine.remote-sdp-received');\n }\n }\n }\n\n /**\n * Store precomputed latency value\n * @param key - key\n * @param value - value\n * @param accumulate - when it is true, it overwrites existing value with sum of the current value and the new measurement otherwise just store the new measurement\n * @throws\n * @returns\n */\n public saveLatency(key: PreComputedLatencies, value: number, accumulate = false) {\n const existingValue = accumulate ? this.precomputedLatencies.get(key) || 0 : 0;\n this.precomputedLatencies.set(key, value + existingValue);\n }\n\n /**\n * Measure latency for a request\n * @param callback - callback for which you would like to measure latency\n * @param key - key\n * @param accumulate - when it is true, it overwrites existing value with sum of the current value and the new measurement otherwise just store the new measurement\n * @returns\n */\n public measureLatency(\n callback: () => Promise<unknown>,\n key: PreComputedLatencies,\n accumulate = false\n ) {\n const start = performance.now();\n\n return callback().finally(() => {\n this.saveLatency(key, performance.now() - start, accumulate);\n });\n }\n\n /**\n * Store only the first timestamp value for the given key\n * @param key - key\n * @param value -value\n * @throws\n * @returns\n */\n saveFirstTimestampOnly(key: MetricEventNames, value: number = new Date().getTime()) {\n if (this.latencyTimestamps.has(key)) {\n return;\n }\n this.latencyTimestamps.set(key, value);\n }\n\n /**\n * Helper to calculate end - start\n * @param a start\n * @param b end\n * @returns latency\n */\n public getDiffBetweenTimestamps(a: MetricEventNames, b: MetricEventNames) {\n const start = this.latencyTimestamps.get(a);\n const end = this.latencyTimestamps.get(b);\n\n if (typeof start === 'number' && typeof end === 'number') {\n return end - start;\n }\n\n return undefined;\n }\n\n /**\n * Meeting Info Request\n * @note Meeting Info request happen not just in the join phase. CA requires\n * metrics around meeting info request that are only part of join phase.\n * This internal.* event is used to track the real timestamps\n * (when the actual request/response happen). This is because the actual CA event is\n * sent inside the join method on the meeting object based on some logic, but that's not exactly when\n * those events are actually fired. The logic only confirms that they have happened, and we send them over.\n * @returns - latency\n */\n public getMeetingInfoReqResp() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meetinginfo.request',\n 'internal.client.meetinginfo.response'\n );\n }\n\n /**\n * Interstitial Time\n * @returns - latency\n */\n public getShowInterstitialTime() {\n return this.getDiffBetweenTimestamps(\n 'client.interstitial-window.start-launch',\n 'internal.client.interstitial-window.click.joinbutton'\n );\n }\n\n /**\n * getU2CTime\n * @returns - latency\n */\n public getU2CTime() {\n const u2cLatency = this.precomputedLatencies.get('internal.get.u2c.time');\n\n return typeof u2cLatency === 'number' ? Math.floor(u2cLatency) : undefined;\n }\n\n /**\n * Device Register Time\n * @returns - latency\n */\n public getRegisterWDMDeviceJMT() {\n return this.getDiffBetweenTimestamps(\n 'internal.register.device.request',\n 'internal.register.device.response'\n );\n }\n\n /**\n * Call Init Join Request\n * @returns - latency\n */\n public getCallInitJoinReq() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.locus.join.request'\n );\n }\n\n /**\n * Locus Join Request\n * @returns - latency\n */\n public getJoinReqResp() {\n return this.getDiffBetweenTimestamps('client.locus.join.request', 'client.locus.join.response');\n }\n\n /**\n * Time taken to do turn discovery\n * @returns - latency\n */\n public getTurnDiscoveryTime() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.add-media.turn-discovery.start',\n 'internal.client.add-media.turn-discovery.end'\n );\n }\n\n /**\n * Local SDP Generated Remote SDP REceived\n * @returns - latency\n */\n public getLocalSDPGenRemoteSDPRecv() {\n return this.getDiffBetweenTimestamps(\n 'client.media-engine.local-sdp-generated',\n 'client.media-engine.remote-sdp-received'\n );\n }\n\n /**\n * ICE Setup Time\n * @returns - latency\n */\n public getICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Audio ICE time\n * @returns - latency\n */\n public getAudioICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Video ICE Time\n * @returns - latency\n */\n public getVideoICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Share ICE Time\n * @returns - latency\n */\n public getShareICESetupTime() {\n return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');\n }\n\n /**\n * Stay Lobby Time\n * @returns - latency\n */\n public getStayLobbyTime() {\n return this.getDiffBetweenTimestamps(\n 'client.locus.join.response',\n 'internal.host.meeting.participant.admitted'\n );\n }\n\n /**\n * Page JMT\n * @returns - latency\n */\n public getPageJMT() {\n const latency = this.precomputedLatencies.get('internal.client.pageJMT');\n\n return typeof latency === 'number' ? latency : undefined;\n }\n\n /**\n * Download Time JMT\n * @returns - latency\n */\n public getDownloadTimeJMT() {\n const latency = this.precomputedLatencies.get('internal.download.time');\n\n return typeof latency === 'number' ? latency : undefined;\n }\n\n /**\n * Click To Interstitial\n * @returns - latency\n */\n public getClickToInterstitial() {\n // for normal join (where green join button exists before interstitial, i.e reminder, space list etc)\n if (this.latencyTimestamps.get('internal.client.meeting.click.joinbutton')) {\n return this.getDiffBetweenTimestamps(\n 'internal.client.meeting.click.joinbutton',\n 'internal.client.meeting.interstitial-window.showed'\n );\n }\n\n const clickToInterstitialLatency = this.precomputedLatencies.get(\n 'internal.click.to.interstitial'\n );\n\n if (typeof clickToInterstitialLatency === 'number') {\n return clickToInterstitialLatency;\n }\n\n return undefined;\n }\n\n /**\n * Interstitial To Join Ok\n * @returns - latency\n */\n public getInterstitialToJoinOK() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.locus.join.response'\n );\n }\n\n /**\n * Call Init To MediaEngineReady\n * @returns - latency\n */\n public getCallInitMediaEngineReady() {\n return this.getDiffBetweenTimestamps(\n 'internal.client.interstitial-window.click.joinbutton',\n 'client.media-engine.ready'\n );\n }\n\n /**\n * Interstitial To Media Ok\n * @returns - latency\n */\n public getInterstitialToMediaOKJMT() {\n const interstitialJoinClickTimestamp = this.latencyTimestamps.get(\n 'internal.client.interstitial-window.click.joinbutton'\n );\n\n // get the first timestamp\n const connectedMedia = this.latencyTimestamps.get('client.ice.end');\n\n const lobbyTimeLatency = this.getStayLobbyTime();\n const lobbyTime = typeof lobbyTimeLatency === 'number' ? lobbyTimeLatency : 0;\n\n if (interstitialJoinClickTimestamp && connectedMedia) {\n return connectedMedia - interstitialJoinClickTimestamp - lobbyTime;\n }\n\n return undefined;\n }\n\n /**\n * Total JMT\n * @returns - latency\n */\n public getTotalJMT() {\n const clickToInterstitial = this.getClickToInterstitial();\n const interstitialToJoinOk = this.getInterstitialToJoinOK();\n\n if (typeof clickToInterstitial === 'number' && typeof interstitialToJoinOk === 'number') {\n return clickToInterstitial + interstitialToJoinOk;\n }\n\n return undefined;\n }\n\n /**\n * Join Conf JMT\n * @returns - latency\n */\n public getJoinConfJMT() {\n const joinReqResp = this.getJoinReqResp();\n const ICESetupTime = this.getICESetupTime();\n\n if (joinReqResp && ICESetupTime) {\n return joinReqResp + ICESetupTime;\n }\n\n return undefined;\n }\n\n /**\n * Total Media JMT\n * @returns - latency\n */\n public getTotalMediaJMT() {\n const clickToInterstitial = this.getClickToInterstitial();\n const interstitialToJoinOk = this.getInterstitialToJoinOK();\n const joinConfJMT = this.getJoinConfJMT();\n const lobbyTime = this.getStayLobbyTime();\n\n if (clickToInterstitial && interstitialToJoinOk && joinConfJMT) {\n const totalMediaJMT = clickToInterstitial + interstitialToJoinOk + joinConfJMT;\n if (this.getMeeting()?.allowMediaInLobby) {\n return totalMediaJMT;\n }\n\n return totalMediaJMT - lobbyTime;\n }\n\n return undefined;\n }\n\n /**\n * Client JMT\n * @returns - latency\n */\n public getClientJMT() {\n const interstitialToJoinOk = this.getInterstitialToJoinOK();\n const joinConfJMT = this.getJoinConfJMT();\n\n if (typeof interstitialToJoinOk === 'number' && typeof joinConfJMT === 'number') {\n return interstitialToJoinOk - joinConfJMT;\n }\n\n return undefined;\n }\n\n /**\n * Audio setup delay receive\n */\n public getAudioJoinRespRxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.rx.start');\n }\n\n /**\n * Video setup delay receive\n */\n public getVideoJoinRespRxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.rx.start');\n }\n\n /**\n * Total latency for all get cluster request.\n */\n public getReachabilityClustersReqResp() {\n const reachablityClusterReqResp = this.precomputedLatencies.get('internal.get.cluster.time');\n\n return typeof reachablityClusterReqResp === 'number'\n ? Math.floor(reachablityClusterReqResp)\n : undefined;\n }\n\n /**\n * Audio setup delay transmit\n */\n public getAudioJoinRespTxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.tx.start');\n }\n\n /**\n * Video setup delay transmit\n */\n public getVideoJoinRespTxStart() {\n return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.tx.start');\n }\n\n /**\n * Total latency for all exchange ci token.\n */\n public getExchangeCITokenJMT() {\n const exchangeCITokenJMT = this.precomputedLatencies.get('internal.exchange.ci.token.time');\n\n return typeof exchangeCITokenJMT === 'number' ? Math.floor(exchangeCITokenJMT) : undefined;\n }\n\n /**\n * Total latency for all refresh captcha requests.\n */\n public getRefreshCaptchaReqResp() {\n const refreshCaptchaReqResp = this.precomputedLatencies.get('internal.refresh.captcha.time');\n\n return typeof refreshCaptchaReqResp === 'number'\n ? Math.floor(refreshCaptchaReqResp)\n : undefined;\n }\n\n /**\n * Get the latency for downloading intelligence models.\n * @returns - latency\n */\n public getDownloadIntelligenceModelsReqResp() {\n const downloadIntelligenceModelsReqResp = this.precomputedLatencies.get(\n 'internal.api.fetch.intelligence.models'\n );\n\n return typeof downloadIntelligenceModelsReqResp === 'number'\n ? Math.floor(downloadIntelligenceModelsReqResp)\n : undefined;\n }\n\n /**\n * Get the total latency for all other app API requests.\n * Excludes meeting info, because it's measured separately.\n * @returns - latency\n */\n public getOtherAppApiReqResp() {\n const otherAppApiJMT = this.precomputedLatencies.get('internal.other.app.api.time');\n\n return otherAppApiJMT > 0 ? Math.floor(otherAppApiJMT) : undefined;\n }\n}\n"],"mappings":"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"}