@webex/internal-plugin-metrics 2.59.8 → 2.60.0-next.2

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 (55) hide show
  1. package/dist/batcher.js +3 -3
  2. package/dist/batcher.js.map +1 -1
  3. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js +67 -0
  4. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js.map +1 -0
  5. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +454 -0
  6. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -0
  7. package/dist/call-diagnostic/call-diagnostic-metrics.js +816 -0
  8. package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -0
  9. package/dist/call-diagnostic/call-diagnostic-metrics.util.js +323 -0
  10. package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -0
  11. package/dist/call-diagnostic/config.js +593 -0
  12. package/dist/call-diagnostic/config.js.map +1 -0
  13. package/dist/client-metrics-batcher.js +3 -3
  14. package/dist/client-metrics-batcher.js.map +1 -1
  15. package/dist/config.js +6 -9
  16. package/dist/config.js.map +1 -1
  17. package/dist/index.js +21 -2
  18. package/dist/index.js.map +1 -1
  19. package/dist/metrics.js +24 -22
  20. package/dist/metrics.js.map +1 -1
  21. package/dist/metrics.types.js +7 -0
  22. package/dist/metrics.types.js.map +1 -0
  23. package/dist/new-metrics.js +336 -0
  24. package/dist/new-metrics.js.map +1 -0
  25. package/dist/utils.js +26 -0
  26. package/dist/utils.js.map +1 -0
  27. package/package.json +23 -18
  28. package/src/batcher.js +1 -0
  29. package/src/call-diagnostic/call-diagnostic-metrics-batcher.ts +75 -0
  30. package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +419 -0
  31. package/src/call-diagnostic/call-diagnostic-metrics.ts +861 -0
  32. package/src/call-diagnostic/call-diagnostic-metrics.util.ts +362 -0
  33. package/src/call-diagnostic/config.ts +666 -0
  34. package/src/client-metrics-batcher.js +1 -0
  35. package/src/config.js +1 -0
  36. package/src/index.ts +43 -0
  37. package/src/metrics.js +17 -16
  38. package/src/metrics.types.ts +160 -0
  39. package/src/new-metrics.ts +317 -0
  40. package/src/utils.ts +17 -0
  41. package/test/unit/spec/batcher.js +2 -0
  42. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +453 -0
  43. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +506 -0
  44. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +1972 -0
  45. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +565 -0
  46. package/test/unit/spec/client-metrics-batcher.js +2 -0
  47. package/test/unit/spec/metrics.js +65 -94
  48. package/test/unit/spec/new-metrics.ts +266 -0
  49. package/test/unit/spec/utils.ts +22 -0
  50. package/tsconfig.json +6 -0
  51. package/dist/call-diagnostic-events-batcher.js +0 -60
  52. package/dist/call-diagnostic-events-batcher.js.map +0 -1
  53. package/src/call-diagnostic-events-batcher.js +0 -62
  54. package/src/index.js +0 -15
  55. package/test/unit/spec/call-diagnostic-events-batcher.js +0 -195
package/dist/batcher.js CHANGED
@@ -42,7 +42,8 @@ var MetricsBatcher = _webexCore.Batcher.extend({
42
42
  resource: 'metrics',
43
43
  body: {
44
44
  metrics: payload
45
- }
45
+ },
46
+ waitForServiceTimeout: this.webex.config.metrics.waitForServiceTimeout
46
47
  });
47
48
  },
48
49
  handleHttpSuccess: function handleHttpSuccess(res) {
@@ -92,6 +93,5 @@ var MetricsBatcher = _webexCore.Batcher.extend({
92
93
  return _promise.default.resolve(item[sym]);
93
94
  }
94
95
  });
95
- var _default = MetricsBatcher;
96
- exports.default = _default;
96
+ var _default = exports.default = MetricsBatcher;
97
97
  //# sourceMappingURL=batcher.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_webexCore","require","_commonTimers","sym","_symbol","default","MetricsBatcher","Batcher","extend","namespace","prepareItem","item","env","process","NODE_ENV","appType","config","time","_now","version","webex","_promise","resolve","prepareRequest","queue","map","postTime","submitHttpRequest","payload","request","method","service","resource","body","metrics","handleHttpSuccess","res","_this","all","options","acceptItem","handleHttpError","reason","_this2","WebexHttpError","NetworkOrCORSError","logger","warn","delay","nextDelay","batcherRetryPlateau","safeSetTimeout","rerequest","_apply","prototype","_this3","getDeferredForRequest","then","_ref","_ref2","_slicedToArray2","defer","req","enqueue","bounce","catch","reject","fingerprintRequest","fingerprintResponse","_default","exports"],"sources":["batcher.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {Batcher, WebexHttpError} from '@webex/webex-core';\nimport {safeSetTimeout} from '@webex/common-timers';\n\nconst sym = Symbol('metric id');\n\nconst MetricsBatcher = Batcher.extend({\n namespace: 'Metrics',\n\n prepareItem(item) {\n // Keep non-prod data out of metrics\n const env = process.env.NODE_ENV === 'production' ? null : 'TEST';\n\n item.appType = item.appType || this.config.appType;\n item.env = item.env || env;\n item.time = item.time || Date.now();\n item.version = item.version || this.webex.version;\n\n return Promise.resolve(item);\n },\n\n prepareRequest(queue) {\n return Promise.resolve(\n queue.map((item) => {\n item.postTime = item.postTime || Date.now();\n\n return item;\n })\n );\n },\n\n submitHttpRequest(payload) {\n return this.webex.request({\n method: 'POST',\n service: 'metrics',\n resource: 'metrics',\n body: {\n metrics: payload,\n },\n });\n },\n\n handleHttpSuccess(res) {\n return Promise.all(res.options.body.metrics.map((item) => this.acceptItem(item)));\n },\n\n handleHttpError(reason) {\n if (reason instanceof WebexHttpError.NetworkOrCORSError) {\n this.logger.warn(\n 'metrics-batcher: received network error submitting metrics, reenqueuing payload'\n );\n\n return Promise.all(\n reason.options.body.metrics.map(\n (item) =>\n new Promise((resolve) => {\n const delay = item[sym].nextDelay;\n\n if (delay < this.config.batcherRetryPlateau) {\n item[sym].nextDelay *= 2;\n }\n safeSetTimeout(() => {\n resolve(this.rerequest(item));\n }, delay);\n })\n )\n );\n }\n\n return Reflect.apply(Batcher.prototype.handleHttpError, this, [reason]);\n },\n\n rerequest(item) {\n return Promise.all([this.getDeferredForRequest(item), this.prepareItem(item)]).then(\n ([defer, req]) => {\n this.enqueue(req)\n .then(() => this.bounce())\n .catch((reason) => defer.reject(reason));\n }\n );\n },\n\n fingerprintRequest(item) {\n item[sym] = item[sym] || {\n nextDelay: 1000,\n };\n\n return Promise.resolve(item[sym]);\n },\n\n fingerprintResponse(item) {\n return Promise.resolve(item[sym]);\n },\n});\n\nexport default MetricsBatcher;\n"],"mappings":";;;;;;;;;;;;;AAIA,IAAAA,UAAA,GAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AALA;AACA;AACA;;AAKA,IAAME,GAAG,GAAG,IAAAC,OAAA,CAAAC,OAAA,EAAO,WAAW,CAAC;AAE/B,IAAMC,cAAc,GAAGC,kBAAO,CAACC,MAAM,CAAC;EACpCC,SAAS,EAAE,SAAS;EAEpBC,WAAW,WAAAA,YAACC,IAAI,EAAE;IAChB;IACA,IAAMC,GAAG,GAAGC,OAAO,CAACD,GAAG,CAACE,QAAQ,KAAK,YAAY,GAAG,IAAI,GAAG,MAAM;IAEjEH,IAAI,CAACI,OAAO,GAAGJ,IAAI,CAACI,OAAO,IAAI,IAAI,CAACC,MAAM,CAACD,OAAO;IAClDJ,IAAI,CAACC,GAAG,GAAGD,IAAI,CAACC,GAAG,IAAIA,GAAG;IAC1BD,IAAI,CAACM,IAAI,GAAGN,IAAI,CAACM,IAAI,IAAI,IAAAC,IAAA,CAAAb,OAAA,GAAU;IACnCM,IAAI,CAACQ,OAAO,GAAGR,IAAI,CAACQ,OAAO,IAAI,IAAI,CAACC,KAAK,CAACD,OAAO;IAEjD,OAAOE,QAAA,CAAAhB,OAAA,CAAQiB,OAAO,CAACX,IAAI,CAAC;EAC9B,CAAC;EAEDY,cAAc,WAAAA,eAACC,KAAK,EAAE;IACpB,OAAOH,QAAA,CAAAhB,OAAA,CAAQiB,OAAO,CACpBE,KAAK,CAACC,GAAG,CAAC,UAACd,IAAI,EAAK;MAClBA,IAAI,CAACe,QAAQ,GAAGf,IAAI,CAACe,QAAQ,IAAI,IAAAR,IAAA,CAAAb,OAAA,GAAU;MAE3C,OAAOM,IAAI;IACb,CAAC,CAAC,CACH;EACH,CAAC;EAEDgB,iBAAiB,WAAAA,kBAACC,OAAO,EAAE;IACzB,OAAO,IAAI,CAACR,KAAK,CAACS,OAAO,CAAC;MACxBC,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE,SAAS;MAClBC,QAAQ,EAAE,SAAS;MACnBC,IAAI,EAAE;QACJC,OAAO,EAAEN;MACX;IACF,CAAC,CAAC;EACJ,CAAC;EAEDO,iBAAiB,WAAAA,kBAACC,GAAG,EAAE;IAAA,IAAAC,KAAA;IACrB,OAAOhB,QAAA,CAAAhB,OAAA,CAAQiC,GAAG,CAACF,GAAG,CAACG,OAAO,CAACN,IAAI,CAACC,OAAO,CAACT,GAAG,CAAC,UAACd,IAAI;MAAA,OAAK0B,KAAI,CAACG,UAAU,CAAC7B,IAAI,CAAC;IAAA,EAAC,CAAC;EACnF,CAAC;EAED8B,eAAe,WAAAA,gBAACC,MAAM,EAAE;IAAA,IAAAC,MAAA;IACtB,IAAID,MAAM,YAAYE,yBAAc,CAACC,kBAAkB,EAAE;MACvD,IAAI,CAACC,MAAM,CAACC,IAAI,CACd,iFAAiF,CAClF;MAED,OAAO1B,QAAA,CAAAhB,OAAA,CAAQiC,GAAG,CAChBI,MAAM,CAACH,OAAO,CAACN,IAAI,CAACC,OAAO,CAACT,GAAG,CAC7B,UAACd,IAAI;QAAA,OACH,IAAAU,QAAA,CAAAhB,OAAA,CAAY,UAACiB,OAAO,EAAK;UACvB,IAAM0B,KAAK,GAAGrC,IAAI,CAACR,GAAG,CAAC,CAAC8C,SAAS;UAEjC,IAAID,KAAK,GAAGL,MAAI,CAAC3B,MAAM,CAACkC,mBAAmB,EAAE;YAC3CvC,IAAI,CAACR,GAAG,CAAC,CAAC8C,SAAS,IAAI,CAAC;UAC1B;UACA,IAAAE,4BAAc,EAAC,YAAM;YACnB7B,OAAO,CAACqB,MAAI,CAACS,SAAS,CAACzC,IAAI,CAAC,CAAC;UAC/B,CAAC,EAAEqC,KAAK,CAAC;QACX,CAAC,CAAC;MAAA,EACL,CACF;IACH;IAEA,OAAO,IAAAK,MAAA,CAAAhD,OAAA,EAAcE,kBAAO,CAAC+C,SAAS,CAACb,eAAe,EAAE,IAAI,EAAE,CAACC,MAAM,CAAC,CAAC;EACzE,CAAC;EAEDU,SAAS,WAAAA,UAACzC,IAAI,EAAE;IAAA,IAAA4C,MAAA;IACd,OAAOlC,QAAA,CAAAhB,OAAA,CAAQiC,GAAG,CAAC,CAAC,IAAI,CAACkB,qBAAqB,CAAC7C,IAAI,CAAC,EAAE,IAAI,CAACD,WAAW,CAACC,IAAI,CAAC,CAAC,CAAC,CAAC8C,IAAI,CACjF,UAAAC,IAAA,EAAkB;MAAA,IAAAC,KAAA,OAAAC,eAAA,CAAAvD,OAAA,EAAAqD,IAAA;QAAhBG,KAAK,GAAAF,KAAA;QAAEG,GAAG,GAAAH,KAAA;MACVJ,MAAI,CAACQ,OAAO,CAACD,GAAG,CAAC,CACdL,IAAI,CAAC;QAAA,OAAMF,MAAI,CAACS,MAAM,EAAE;MAAA,EAAC,CACzBC,KAAK,CAAC,UAACvB,MAAM;QAAA,OAAKmB,KAAK,CAACK,MAAM,CAACxB,MAAM,CAAC;MAAA,EAAC;IAC5C,CAAC,CACF;EACH,CAAC;EAEDyB,kBAAkB,WAAAA,mBAACxD,IAAI,EAAE;IACvBA,IAAI,CAACR,GAAG,CAAC,GAAGQ,IAAI,CAACR,GAAG,CAAC,IAAI;MACvB8C,SAAS,EAAE;IACb,CAAC;IAED,OAAO5B,QAAA,CAAAhB,OAAA,CAAQiB,OAAO,CAACX,IAAI,CAACR,GAAG,CAAC,CAAC;EACnC,CAAC;EAEDiE,mBAAmB,WAAAA,oBAACzD,IAAI,EAAE;IACxB,OAAOU,QAAA,CAAAhB,OAAA,CAAQiB,OAAO,CAACX,IAAI,CAACR,GAAG,CAAC,CAAC;EACnC;AACF,CAAC,CAAC;AAAC,IAAAkE,QAAA,GAEY/D,cAAc;AAAAgE,OAAA,CAAAjE,OAAA,GAAAgE,QAAA"}
1
+ {"version":3,"names":["_webexCore","require","_commonTimers","sym","_symbol","default","MetricsBatcher","Batcher","extend","namespace","prepareItem","item","env","process","NODE_ENV","appType","config","time","_now","version","webex","_promise","resolve","prepareRequest","queue","map","postTime","submitHttpRequest","payload","request","method","service","resource","body","metrics","waitForServiceTimeout","handleHttpSuccess","res","_this","all","options","acceptItem","handleHttpError","reason","_this2","WebexHttpError","NetworkOrCORSError","logger","warn","delay","nextDelay","batcherRetryPlateau","safeSetTimeout","rerequest","_apply","prototype","_this3","getDeferredForRequest","then","_ref","_ref2","_slicedToArray2","defer","req","enqueue","bounce","catch","reject","fingerprintRequest","fingerprintResponse","_default","exports"],"sources":["batcher.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {Batcher, WebexHttpError} from '@webex/webex-core';\nimport {safeSetTimeout} from '@webex/common-timers';\n\nconst sym = Symbol('metric id');\n\nconst MetricsBatcher = Batcher.extend({\n namespace: 'Metrics',\n\n prepareItem(item) {\n // Keep non-prod data out of metrics\n const env = process.env.NODE_ENV === 'production' ? null : 'TEST';\n\n item.appType = item.appType || this.config.appType;\n item.env = item.env || env;\n item.time = item.time || Date.now();\n item.version = item.version || this.webex.version;\n\n return Promise.resolve(item);\n },\n\n prepareRequest(queue) {\n return Promise.resolve(\n queue.map((item) => {\n item.postTime = item.postTime || Date.now();\n\n return item;\n })\n );\n },\n\n submitHttpRequest(payload) {\n return this.webex.request({\n method: 'POST',\n service: 'metrics',\n resource: 'metrics',\n body: {\n metrics: payload,\n },\n waitForServiceTimeout: this.webex.config.metrics.waitForServiceTimeout,\n });\n },\n\n handleHttpSuccess(res) {\n return Promise.all(res.options.body.metrics.map((item) => this.acceptItem(item)));\n },\n\n handleHttpError(reason) {\n if (reason instanceof WebexHttpError.NetworkOrCORSError) {\n this.logger.warn(\n 'metrics-batcher: received network error submitting metrics, reenqueuing payload'\n );\n\n return Promise.all(\n reason.options.body.metrics.map(\n (item) =>\n new Promise((resolve) => {\n const delay = item[sym].nextDelay;\n\n if (delay < this.config.batcherRetryPlateau) {\n item[sym].nextDelay *= 2;\n }\n safeSetTimeout(() => {\n resolve(this.rerequest(item));\n }, delay);\n })\n )\n );\n }\n\n return Reflect.apply(Batcher.prototype.handleHttpError, this, [reason]);\n },\n\n rerequest(item) {\n return Promise.all([this.getDeferredForRequest(item), this.prepareItem(item)]).then(\n ([defer, req]) => {\n this.enqueue(req)\n .then(() => this.bounce())\n .catch((reason) => defer.reject(reason));\n }\n );\n },\n\n fingerprintRequest(item) {\n item[sym] = item[sym] || {\n nextDelay: 1000,\n };\n\n return Promise.resolve(item[sym]);\n },\n\n fingerprintResponse(item) {\n return Promise.resolve(item[sym]);\n },\n});\n\nexport default MetricsBatcher;\n"],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
5
+ _Object$defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+ var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
10
+ var _lodash = require("lodash");
11
+ var _batcher = _interopRequireDefault(require("../batcher"));
12
+ var _callDiagnosticMetrics = require("./call-diagnostic-metrics.util");
13
+ var _config = require("./config");
14
+ var _utils = require("../utils");
15
+ /* eslint-disable class-methods-use-this */
16
+ /* eslint-disable valid-jsdoc */
17
+
18
+ var CallDiagnosticEventsBatcher = _batcher.default.extend({
19
+ namespace: 'Metrics',
20
+ /**
21
+ * Prepare item
22
+ * @param item
23
+ * @returns
24
+ */
25
+ prepareItem: function prepareItem(item) {
26
+ return _promise.default.resolve((0, _callDiagnosticMetrics.prepareDiagnosticMetricItem)(this.webex, item));
27
+ },
28
+ /**
29
+ * Prepare request, add time sensitive date etc.
30
+ * @param queue
31
+ * @returns
32
+ */
33
+ prepareRequest: function prepareRequest(queue) {
34
+ // Add sent timestamp
35
+ queue.forEach(function (item) {
36
+ item.eventPayload.originTime = item.eventPayload.originTime || {};
37
+ item.eventPayload.originTime.sent = new Date().toISOString();
38
+ });
39
+ return _promise.default.resolve(queue);
40
+ },
41
+ /**
42
+ *
43
+ * @param payload
44
+ * @returns
45
+ */
46
+ submitHttpRequest: function submitHttpRequest(payload) {
47
+ var _this = this;
48
+ var batchId = (0, _lodash.uniqueId)('ca-batch-');
49
+ return this.webex.request({
50
+ method: 'POST',
51
+ service: 'metrics',
52
+ resource: 'clientmetrics',
53
+ body: {
54
+ metrics: payload
55
+ },
56
+ waitForServiceTimeout: this.webex.config.metrics.waitForServiceTimeout
57
+ }).then(function (res) {
58
+ _this.webex.logger.log(_config.CALL_DIAGNOSTIC_LOG_IDENTIFIER, "CallDiagnosticEventsBatcher: @submitHttpRequest#".concat(batchId, ". Request successful."));
59
+ return res;
60
+ }).catch(function (err) {
61
+ _this.webex.logger.error(_config.CALL_DIAGNOSTIC_LOG_IDENTIFIER, "CallDiagnosticEventsBatcher: @submitHttpRequest#".concat(batchId, ". Request failed:"), "error: ".concat((0, _utils.generateCommonErrorMetadata)(err)));
62
+ return _promise.default.reject(err);
63
+ });
64
+ }
65
+ });
66
+ var _default = exports.default = CallDiagnosticEventsBatcher;
67
+ //# sourceMappingURL=call-diagnostic-metrics-batcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_lodash","require","_batcher","_interopRequireDefault","_callDiagnosticMetrics","_config","_utils","CallDiagnosticEventsBatcher","Batcher","extend","namespace","prepareItem","item","_promise","default","resolve","prepareDiagnosticMetricItem","webex","prepareRequest","queue","forEach","eventPayload","originTime","sent","Date","toISOString","submitHttpRequest","payload","_this","batchId","uniqueId","request","method","service","resource","body","metrics","waitForServiceTimeout","config","then","res","logger","log","CALL_DIAGNOSTIC_LOG_IDENTIFIER","concat","catch","err","error","generateCommonErrorMetadata","reject","_default","exports"],"sources":["call-diagnostic-metrics-batcher.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\n/* eslint-disable valid-jsdoc */\n\nimport {uniqueId} from 'lodash';\nimport Batcher from '../batcher';\nimport {prepareDiagnosticMetricItem} from './call-diagnostic-metrics.util';\nimport {CALL_DIAGNOSTIC_LOG_IDENTIFIER} from './config';\nimport {generateCommonErrorMetadata} from '../utils';\n\nconst CallDiagnosticEventsBatcher = Batcher.extend({\n namespace: 'Metrics',\n\n /**\n * Prepare item\n * @param item\n * @returns\n */\n prepareItem(item) {\n return Promise.resolve(prepareDiagnosticMetricItem(this.webex, item));\n },\n\n /**\n * Prepare request, add time sensitive date etc.\n * @param queue\n * @returns\n */\n prepareRequest(queue) {\n // Add sent timestamp\n queue.forEach((item) => {\n item.eventPayload.originTime = item.eventPayload.originTime || {};\n item.eventPayload.originTime.sent = new Date().toISOString();\n });\n\n return Promise.resolve(queue);\n },\n\n /**\n *\n * @param payload\n * @returns\n */\n submitHttpRequest(payload) {\n const batchId = uniqueId('ca-batch-');\n\n return this.webex\n .request({\n method: 'POST',\n service: 'metrics',\n resource: 'clientmetrics',\n body: {\n metrics: payload,\n },\n waitForServiceTimeout: this.webex.config.metrics.waitForServiceTimeout,\n })\n .then((res) => {\n this.webex.logger.log(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n `CallDiagnosticEventsBatcher: @submitHttpRequest#${batchId}. Request successful.`\n );\n\n return res;\n })\n .catch((err) => {\n this.webex.logger.error(\n CALL_DIAGNOSTIC_LOG_IDENTIFIER,\n `CallDiagnosticEventsBatcher: @submitHttpRequest#${batchId}. Request failed:`,\n `error: ${generateCommonErrorMetadata(err)}`\n );\n\n return Promise.reject(err);\n });\n },\n});\n\nexport default CallDiagnosticEventsBatcher;\n"],"mappings":";;;;;;;;;AAGA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,QAAA,GAAAC,sBAAA,CAAAF,OAAA;AACA,IAAAG,sBAAA,GAAAH,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,MAAA,GAAAL,OAAA;AAPA;AACA;;AAQA,IAAMM,2BAA2B,GAAGC,gBAAO,CAACC,MAAM,CAAC;EACjDC,SAAS,EAAE,SAAS;EAEpB;AACF;AACA;AACA;AACA;EACEC,WAAW,WAAAA,YAACC,IAAI,EAAE;IAChB,OAAOC,QAAA,CAAAC,OAAA,CAAQC,OAAO,CAAC,IAAAC,kDAA2B,EAAC,IAAI,CAACC,KAAK,EAAEL,IAAI,CAAC,CAAC;EACvE,CAAC;EAED;AACF;AACA;AACA;AACA;EACEM,cAAc,WAAAA,eAACC,KAAK,EAAE;IACpB;IACAA,KAAK,CAACC,OAAO,CAAC,UAACR,IAAI,EAAK;MACtBA,IAAI,CAACS,YAAY,CAACC,UAAU,GAAGV,IAAI,CAACS,YAAY,CAACC,UAAU,IAAI,CAAC,CAAC;MACjEV,IAAI,CAACS,YAAY,CAACC,UAAU,CAACC,IAAI,GAAG,IAAIC,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;IAC9D,CAAC,CAAC;IAEF,OAAOZ,QAAA,CAAAC,OAAA,CAAQC,OAAO,CAACI,KAAK,CAAC;EAC/B,CAAC;EAED;AACF;AACA;AACA;AACA;EACEO,iBAAiB,WAAAA,kBAACC,OAAO,EAAE;IAAA,IAAAC,KAAA;IACzB,IAAMC,OAAO,GAAG,IAAAC,gBAAQ,EAAC,WAAW,CAAC;IAErC,OAAO,IAAI,CAACb,KAAK,CACdc,OAAO,CAAC;MACPC,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE,SAAS;MAClBC,QAAQ,EAAE,eAAe;MACzBC,IAAI,EAAE;QACJC,OAAO,EAAET;MACX,CAAC;MACDU,qBAAqB,EAAE,IAAI,CAACpB,KAAK,CAACqB,MAAM,CAACF,OAAO,CAACC;IACnD,CAAC,CAAC,CACDE,IAAI,CAAC,UAACC,GAAG,EAAK;MACbZ,KAAI,CAACX,KAAK,CAACwB,MAAM,CAACC,GAAG,CACnBC,sCAA8B,qDAAAC,MAAA,CACqBf,OAAO,0BAC5D,CAAC;MAED,OAAOW,GAAG;IACZ,CAAC,CAAC,CACDK,KAAK,CAAC,UAACC,GAAG,EAAK;MACdlB,KAAI,CAACX,KAAK,CAACwB,MAAM,CAACM,KAAK,CACrBJ,sCAA8B,qDAAAC,MAAA,CACqBf,OAAO,kCAAAe,MAAA,CAChD,IAAAI,kCAA2B,EAACF,GAAG,CAAC,CAC5C,CAAC;MAED,OAAOjC,QAAA,CAAAC,OAAA,CAAQmC,MAAM,CAACH,GAAG,CAAC;IAC5B,CAAC,CAAC;EACN;AACF,CAAC,CAAC;AAAC,IAAAI,QAAA,GAAAC,OAAA,CAAArC,OAAA,GAEYP,2BAA2B"}
@@ -0,0 +1,454 @@
1
+ "use strict";
2
+
3
+ var _Reflect$construct = require("@babel/runtime-corejs2/core-js/reflect/construct");
4
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
5
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
6
+ _Object$defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ exports.default = void 0;
10
+ var _map = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/map"));
11
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
12
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
13
+ var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized"));
14
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
15
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
16
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
17
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
18
+ var _webexCore = require("@webex/webex-core");
19
+ 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); }; }
20
+ 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; } } /* eslint-disable class-methods-use-this */ /* eslint-disable valid-jsdoc */
21
+ // we only care about client event and feature event for now
22
+ /**
23
+ * @description Helper class to store latencies timestamp and to calculate various latencies for CA.
24
+ * @exports
25
+ * @class CallDiagnosticLatencies
26
+ */
27
+ var CallDiagnosticLatencies = exports.default = /*#__PURE__*/function (_WebexPlugin) {
28
+ (0, _inherits2.default)(CallDiagnosticLatencies, _WebexPlugin);
29
+ var _super = _createSuper(CallDiagnosticLatencies);
30
+ /**
31
+ * @constructor
32
+ */
33
+ function CallDiagnosticLatencies() {
34
+ var _this;
35
+ (0, _classCallCheck2.default)(this, CallDiagnosticLatencies);
36
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
37
+ args[_key] = arguments[_key];
38
+ }
39
+ _this = _super.call.apply(_super, [this].concat(args));
40
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "latencyTimestamps", void 0);
41
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "precomputedLatencies", void 0);
42
+ // meetingId that the current latencies are for
43
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "meetingId", void 0);
44
+ _this.latencyTimestamps = new _map.default();
45
+ _this.precomputedLatencies = new _map.default();
46
+ return _this;
47
+ }
48
+
49
+ /**
50
+ * Clear timestamps
51
+ */
52
+ (0, _createClass2.default)(CallDiagnosticLatencies, [{
53
+ key: "clearTimestamps",
54
+ value: function clearTimestamps() {
55
+ this.latencyTimestamps.clear();
56
+ }
57
+
58
+ /**
59
+ * Associate current latencies with a meeting id
60
+ * @param meetingId
61
+ */
62
+ }, {
63
+ key: "setMeetingId",
64
+ value: function setMeetingId(meetingId) {
65
+ this.meetingId = meetingId;
66
+ }
67
+
68
+ /**
69
+ * Returns the meeting object associated with current latencies
70
+ * @returns meeting object
71
+ */
72
+ }, {
73
+ key: "getMeeting",
74
+ value: function getMeeting() {
75
+ if (this.meetingId) {
76
+ // @ts-ignore
77
+ return this.webex.meetings.meetingCollection.get(this.meetingId);
78
+ }
79
+ return undefined;
80
+ }
81
+
82
+ /**
83
+ * Store timestamp value
84
+ * @param key - key
85
+ * @param value -value
86
+ * @throws
87
+ * @returns
88
+ */
89
+ }, {
90
+ key: "saveTimestamp",
91
+ value: function saveTimestamp(_ref) {
92
+ var key = _ref.key,
93
+ _ref$value = _ref.value,
94
+ value = _ref$value === void 0 ? new Date().getTime() : _ref$value,
95
+ _ref$options = _ref.options,
96
+ options = _ref$options === void 0 ? {} : _ref$options;
97
+ // save the meetingId so we can use the meeting object in latency calculations if needed
98
+ var meetingId = options.meetingId;
99
+ if (meetingId) {
100
+ this.setMeetingId(meetingId);
101
+ }
102
+ // for some events we're only interested in the first timestamp not last
103
+ // as these events can happen multiple times
104
+ if (key === 'client.media.rx.start' || key === 'client.media.tx.start' || key === 'internal.client.meetinginfo.request' || key === 'internal.client.meetinginfo.response') {
105
+ this.saveFirstTimestampOnly(key, value);
106
+ } else {
107
+ this.latencyTimestamps.set(key, value);
108
+ }
109
+ }
110
+
111
+ /**
112
+ * Store precomputed latency value
113
+ * @param key - key
114
+ * @param value -value
115
+ * @throws
116
+ * @returns
117
+ */
118
+ }, {
119
+ key: "saveLatency",
120
+ value: function saveLatency(key, value) {
121
+ this.precomputedLatencies.set(key, value);
122
+ }
123
+
124
+ /**
125
+ * Store only the first timestamp value for the given key
126
+ * @param key - key
127
+ * @param value -value
128
+ * @throws
129
+ * @returns
130
+ */
131
+ }, {
132
+ key: "saveFirstTimestampOnly",
133
+ value: function saveFirstTimestampOnly(key) {
134
+ var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Date().getTime();
135
+ if (this.latencyTimestamps.has(key)) {
136
+ return;
137
+ }
138
+ this.latencyTimestamps.set(key, value);
139
+ }
140
+
141
+ /**
142
+ * Helper to calculate end - start
143
+ * @param a start
144
+ * @param b end
145
+ * @returns latency
146
+ */
147
+ }, {
148
+ key: "getDiffBetweenTimestamps",
149
+ value: function getDiffBetweenTimestamps(a, b) {
150
+ var start = this.latencyTimestamps.get(a);
151
+ var end = this.latencyTimestamps.get(b);
152
+ if (start && end) {
153
+ return end - start;
154
+ }
155
+ return undefined;
156
+ }
157
+
158
+ /**
159
+ * Meeting Info Request
160
+ * @note Meeting Info request happen not just in the join phase. CA requires
161
+ * metrics around meeting info request that are only part of join phase.
162
+ * This internal.* event is used to track the real timestamps
163
+ * (when the actual request/response happen). This is because the actual CA event is
164
+ * sent inside the join method on the meeting object based on some logic, but that's not exactly when
165
+ * those events are actually fired. The logic only confirms that they have happened, and we send them over.
166
+ * @returns - latency
167
+ */
168
+ }, {
169
+ key: "getMeetingInfoReqResp",
170
+ value: function getMeetingInfoReqResp() {
171
+ return this.getDiffBetweenTimestamps('internal.client.meetinginfo.request', 'internal.client.meetinginfo.response');
172
+ }
173
+
174
+ /**
175
+ * Interstitial Time
176
+ * @returns - latency
177
+ */
178
+ }, {
179
+ key: "getShowInterstitialTime",
180
+ value: function getShowInterstitialTime() {
181
+ return this.getDiffBetweenTimestamps('client.interstitial-window.start-launch', 'internal.client.interstitial-window.click.joinbutton');
182
+ }
183
+
184
+ /**
185
+ * Call Init Join Request
186
+ * @returns - latency
187
+ */
188
+ }, {
189
+ key: "getCallInitJoinReq",
190
+ value: function getCallInitJoinReq() {
191
+ return this.getDiffBetweenTimestamps('internal.client.interstitial-window.click.joinbutton', 'client.locus.join.request');
192
+ }
193
+
194
+ /**
195
+ * Locus Join Request
196
+ * @returns - latency
197
+ */
198
+ }, {
199
+ key: "getJoinReqResp",
200
+ value: function getJoinReqResp() {
201
+ return this.getDiffBetweenTimestamps('client.locus.join.request', 'client.locus.join.response');
202
+ }
203
+
204
+ /**
205
+ * Locus Join Response Sent Received
206
+ * @returns - latency
207
+ */
208
+ }, {
209
+ key: "getJoinRespSentReceived",
210
+ value: function getJoinRespSentReceived() {
211
+ // TODO: not clear SPARK-440554
212
+ return undefined;
213
+ }
214
+
215
+ /**
216
+ * Time taken to do turn discovery
217
+ * @returns - latency
218
+ */
219
+ }, {
220
+ key: "getTurnDiscoveryTime",
221
+ value: function getTurnDiscoveryTime() {
222
+ return this.getDiffBetweenTimestamps('internal.client.add-media.turn-discovery.start', 'internal.client.add-media.turn-discovery.end');
223
+ }
224
+
225
+ /**
226
+ * Local SDP Generated Remote SDP REceived
227
+ * @returns - latency
228
+ */
229
+ }, {
230
+ key: "getLocalSDPGenRemoteSDPRecv",
231
+ value: function getLocalSDPGenRemoteSDPRecv() {
232
+ return this.getDiffBetweenTimestamps('client.media-engine.local-sdp-generated', 'client.media-engine.remote-sdp-received');
233
+ }
234
+
235
+ /**
236
+ * ICE Setup Time
237
+ * @returns - latency
238
+ */
239
+ }, {
240
+ key: "getICESetupTime",
241
+ value: function getICESetupTime() {
242
+ return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');
243
+ }
244
+
245
+ /**
246
+ * Audio ICE time
247
+ * @returns - latency
248
+ */
249
+ }, {
250
+ key: "getAudioICESetupTime",
251
+ value: function getAudioICESetupTime() {
252
+ return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');
253
+ }
254
+
255
+ /**
256
+ * Video ICE Time
257
+ * @returns - latency
258
+ */
259
+ }, {
260
+ key: "getVideoICESetupTime",
261
+ value: function getVideoICESetupTime() {
262
+ return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');
263
+ }
264
+
265
+ /**
266
+ * Share ICE Time
267
+ * @returns - latency
268
+ */
269
+ }, {
270
+ key: "getShareICESetupTime",
271
+ value: function getShareICESetupTime() {
272
+ return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');
273
+ }
274
+
275
+ /**
276
+ * Stay Lobby Time
277
+ * @returns - latency
278
+ */
279
+ }, {
280
+ key: "getStayLobbyTime",
281
+ value: function getStayLobbyTime() {
282
+ return this.getDiffBetweenTimestamps('client.locus.join.response', 'internal.host.meeting.participant.admitted');
283
+ }
284
+
285
+ /**
286
+ * Page JMT
287
+ * @returns - latency
288
+ */
289
+ }, {
290
+ key: "getPageJMT",
291
+ value: function getPageJMT() {
292
+ return this.precomputedLatencies.get('internal.client.pageJMT') || undefined;
293
+ }
294
+
295
+ /**
296
+ * Click To Interstitial
297
+ * @returns - latency
298
+ */
299
+ }, {
300
+ key: "getClickToInterstitial",
301
+ value: function getClickToInterstitial() {
302
+ // for normal join (where green join button exists before interstitial, i.e reminder, space list etc)
303
+ if (this.latencyTimestamps.get('internal.client.meeting.click.joinbutton')) {
304
+ return this.getDiffBetweenTimestamps('internal.client.meeting.click.joinbutton', 'internal.client.meeting.interstitial-window.showed');
305
+ }
306
+
307
+ // for cross launch and guest flows
308
+ return this.precomputedLatencies.get('internal.click.to.interstitial') || undefined;
309
+ }
310
+
311
+ /**
312
+ * Interstitial To Join Ok
313
+ * @returns - latency
314
+ */
315
+ }, {
316
+ key: "getInterstitialToJoinOK",
317
+ value: function getInterstitialToJoinOK() {
318
+ return this.getDiffBetweenTimestamps('internal.client.interstitial-window.click.joinbutton', 'client.locus.join.response');
319
+ }
320
+
321
+ /**
322
+ * Call Init To MediaEngineReady
323
+ * @returns - latency
324
+ */
325
+ }, {
326
+ key: "getCallInitMediaEngineReady",
327
+ value: function getCallInitMediaEngineReady() {
328
+ return this.getDiffBetweenTimestamps('internal.client.interstitial-window.click.joinbutton', 'client.media-engine.ready');
329
+ }
330
+
331
+ /**
332
+ * Interstitial To Media Ok
333
+ * @returns - latency
334
+ */
335
+ }, {
336
+ key: "getInterstitialToMediaOKJMT",
337
+ value: function getInterstitialToMediaOKJMT() {
338
+ var interstitialJoinClickTimestamp = this.latencyTimestamps.get('internal.client.interstitial-window.click.joinbutton');
339
+
340
+ // get the first timestamp
341
+ var mediaFlowStartedTimestamp = Math.min(this.latencyTimestamps.get('client.media.rx.start'), this.latencyTimestamps.get('client.media.tx.start'));
342
+ var lobbyTime = this.getStayLobbyTime() || 0;
343
+ if (interstitialJoinClickTimestamp && mediaFlowStartedTimestamp) {
344
+ return mediaFlowStartedTimestamp - interstitialJoinClickTimestamp - lobbyTime;
345
+ }
346
+ return undefined;
347
+ }
348
+
349
+ /**
350
+ * Total JMT
351
+ * @returns - latency
352
+ */
353
+ }, {
354
+ key: "getTotalJMT",
355
+ value: function getTotalJMT() {
356
+ var clickToInterstitial = this.getClickToInterstitial();
357
+ var interstitialToJoinOk = this.getInterstitialToJoinOK();
358
+ if (clickToInterstitial && interstitialToJoinOk) {
359
+ return clickToInterstitial + interstitialToJoinOk;
360
+ }
361
+ return undefined;
362
+ }
363
+
364
+ /**
365
+ * Join Conf JMT
366
+ * @returns - latency
367
+ */
368
+ }, {
369
+ key: "getJoinConfJMT",
370
+ value: function getJoinConfJMT() {
371
+ var joinReqResp = this.getJoinReqResp();
372
+ var ICESetupTime = this.getICESetupTime();
373
+ if (joinReqResp && ICESetupTime) {
374
+ return joinReqResp + ICESetupTime;
375
+ }
376
+ return undefined;
377
+ }
378
+
379
+ /**
380
+ * Total Media JMT
381
+ * @returns - latency
382
+ */
383
+ }, {
384
+ key: "getTotalMediaJMT",
385
+ value: function getTotalMediaJMT() {
386
+ var clickToInterstitial = this.getClickToInterstitial();
387
+ var interstitialToJoinOk = this.getInterstitialToJoinOK();
388
+ var joinConfJMT = this.getJoinConfJMT();
389
+ var lobbyTime = this.getStayLobbyTime();
390
+ if (clickToInterstitial && interstitialToJoinOk && joinConfJMT) {
391
+ var _this$getMeeting;
392
+ var totalMediaJMT = clickToInterstitial + interstitialToJoinOk + joinConfJMT;
393
+ if ((_this$getMeeting = this.getMeeting()) !== null && _this$getMeeting !== void 0 && _this$getMeeting.allowMediaInLobby) {
394
+ return totalMediaJMT;
395
+ }
396
+ return totalMediaJMT - lobbyTime;
397
+ }
398
+ return undefined;
399
+ }
400
+
401
+ /**
402
+ * Client JMT
403
+ * @returns - latency
404
+ */
405
+ }, {
406
+ key: "getClientJMT",
407
+ value: function getClientJMT() {
408
+ var interstitialToJoinOk = this.getInterstitialToJoinOK();
409
+ var joinConfJMT = this.getJoinConfJMT();
410
+ if (interstitialToJoinOk && joinConfJMT) {
411
+ return interstitialToJoinOk - joinConfJMT;
412
+ }
413
+ return undefined;
414
+ }
415
+
416
+ /**
417
+ * Audio setup delay receive
418
+ */
419
+ }, {
420
+ key: "getAudioJoinRespRxStart",
421
+ value: function getAudioJoinRespRxStart() {
422
+ return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.rx.start');
423
+ }
424
+
425
+ /**
426
+ * Video setup delay receive
427
+ */
428
+ }, {
429
+ key: "getVideoJoinRespRxStart",
430
+ value: function getVideoJoinRespRxStart() {
431
+ return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.rx.start');
432
+ }
433
+
434
+ /**
435
+ * Audio setup delay transmit
436
+ */
437
+ }, {
438
+ key: "getAudioJoinRespTxStart",
439
+ value: function getAudioJoinRespTxStart() {
440
+ return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.tx.start');
441
+ }
442
+
443
+ /**
444
+ * Video setup delay transmit
445
+ */
446
+ }, {
447
+ key: "getVideoJoinRespTxStart",
448
+ value: function getVideoJoinRespTxStart() {
449
+ return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.tx.start');
450
+ }
451
+ }]);
452
+ return CallDiagnosticLatencies;
453
+ }(_webexCore.WebexPlugin);
454
+ //# sourceMappingURL=call-diagnostic-metrics-latencies.js.map
@@ -0,0 +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","meetingCollection","get","undefined","saveTimestamp","_ref","_ref$value","Date","getTime","_ref$options","options","saveFirstTimestampOnly","set","saveLatency","has","getDiffBetweenTimestamps","a","b","start","end","getMeetingInfoReqResp","getShowInterstitialTime","getCallInitJoinReq","getJoinReqResp","getJoinRespSentReceived","getTurnDiscoveryTime","getLocalSDPGenRemoteSDPRecv","getICESetupTime","getAudioICESetupTime","getVideoICESetupTime","getShareICESetupTime","getStayLobbyTime","getPageJMT","getClickToInterstitial","getInterstitialToJoinOK","getCallInitMediaEngineReady","getInterstitialToMediaOKJMT","interstitialJoinClickTimestamp","mediaFlowStartedTimestamp","Math","min","lobbyTime","getTotalJMT","clickToInterstitial","interstitialToJoinOk","getJoinConfJMT","joinReqResp","ICESetupTime","getTotalMediaJMT","joinConfJMT","_this$getMeeting","totalMediaJMT","allowMediaInLobby","getClientJMT","getAudioJoinRespRxStart","getVideoJoinRespRxStart","getAudioJoinRespTxStart","getVideoJoinRespTxStart","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} 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<string, 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 }\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.meetingCollection.get(this.meetingId);\n }\n\n return undefined;\n }\n\n /**\n * Store timestamp value\n * @param key - key\n * @param value -value\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 * @throws\n * @returns\n */\n public saveLatency(key: string, value: number) {\n this.precomputedLatencies.set(key, value);\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 * 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 * Locus Join Response Sent Received\n * @returns - latency\n */\n public getJoinRespSentReceived() {\n // TODO: not clear SPARK-440554\n return undefined;\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 * 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 mediaFlowStartedTimestamp = Math.min(\n this.latencyTimestamps.get('client.media.rx.start'),\n this.latencyTimestamps.get('client.media.tx.start')\n );\n\n const lobbyTime = this.getStayLobbyTime() || 0;\n\n if (interstitialJoinClickTimestamp && mediaFlowStartedTimestamp) {\n return mediaFlowStartedTimestamp - 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 * 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"],"mappings":"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"}