@webex/internal-plugin-metrics 3.0.0-beta.38 → 3.0.0-beta.380

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 (73) hide show
  1. package/dist/batcher.js +40 -1
  2. package/dist/batcher.js.map +1 -1
  3. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js +65 -0
  4. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js.map +1 -0
  5. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +476 -0
  6. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -0
  7. package/dist/call-diagnostic/call-diagnostic-metrics.js +841 -0
  8. package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -0
  9. package/dist/call-diagnostic/call-diagnostic-metrics.util.js +364 -0
  10. package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -0
  11. package/dist/call-diagnostic/config.js +627 -0
  12. package/dist/call-diagnostic/config.js.map +1 -0
  13. package/dist/client-metrics-batcher.js +2 -1
  14. package/dist/client-metrics-batcher.js.map +1 -1
  15. package/dist/config.js +2 -1
  16. package/dist/config.js.map +1 -1
  17. package/dist/index.js +33 -0
  18. package/dist/index.js.map +1 -1
  19. package/dist/metrics.js +23 -28
  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 +299 -0
  24. package/dist/new-metrics.js.map +1 -0
  25. package/dist/prelogin-metrics-batcher.js +82 -0
  26. package/dist/prelogin-metrics-batcher.js.map +1 -0
  27. package/dist/types/batcher.d.ts +7 -0
  28. package/dist/types/call-diagnostic/call-diagnostic-metrics-batcher.d.ts +2 -0
  29. package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +204 -0
  30. package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +425 -0
  31. package/dist/types/call-diagnostic/call-diagnostic-metrics.util.d.ts +103 -0
  32. package/dist/types/call-diagnostic/config.d.ts +178 -0
  33. package/dist/types/client-metrics-batcher.d.ts +2 -0
  34. package/dist/types/config.d.ts +36 -0
  35. package/dist/types/index.d.ts +15 -0
  36. package/dist/types/metrics.d.ts +3 -0
  37. package/dist/types/metrics.types.d.ts +105 -0
  38. package/dist/types/new-metrics.d.ts +131 -0
  39. package/dist/types/prelogin-metrics-batcher.d.ts +2 -0
  40. package/dist/types/utils.d.ts +6 -0
  41. package/dist/utils.js +27 -0
  42. package/dist/utils.js.map +1 -0
  43. package/package.json +16 -8
  44. package/src/batcher.js +38 -0
  45. package/src/call-diagnostic/call-diagnostic-metrics-batcher.ts +72 -0
  46. package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +435 -0
  47. package/src/call-diagnostic/call-diagnostic-metrics.ts +899 -0
  48. package/src/call-diagnostic/call-diagnostic-metrics.util.ts +392 -0
  49. package/src/call-diagnostic/config.ts +685 -0
  50. package/src/client-metrics-batcher.js +1 -0
  51. package/src/config.js +1 -0
  52. package/src/index.ts +54 -0
  53. package/src/metrics.js +18 -24
  54. package/src/metrics.types.ts +168 -0
  55. package/src/new-metrics.ts +278 -0
  56. package/src/prelogin-metrics-batcher.ts +95 -0
  57. package/src/utils.ts +17 -0
  58. package/test/unit/spec/batcher.js +2 -0
  59. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +457 -0
  60. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +520 -0
  61. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +2137 -0
  62. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +629 -0
  63. package/test/unit/spec/client-metrics-batcher.js +2 -0
  64. package/test/unit/spec/metrics.js +66 -97
  65. package/test/unit/spec/new-metrics.ts +234 -0
  66. package/test/unit/spec/prelogin-metrics-batcher.ts +250 -0
  67. package/test/unit/spec/utils.ts +22 -0
  68. package/tsconfig.json +6 -0
  69. package/dist/call-diagnostic-events-batcher.js +0 -60
  70. package/dist/call-diagnostic-events-batcher.js.map +0 -1
  71. package/src/call-diagnostic-events-batcher.js +0 -62
  72. package/src/index.js +0 -17
  73. package/test/unit/spec/call-diagnostic-events-batcher.js +0 -195
package/dist/batcher.js CHANGED
@@ -18,8 +18,18 @@ var _commonTimers = require("@webex/common-timers");
18
18
  */
19
19
 
20
20
  var sym = (0, _symbol.default)('metric id');
21
+
22
+ /**
23
+ * @class
24
+ * @extends Batcher
25
+ * @memberof Metrics
26
+ */
21
27
  var MetricsBatcher = _webexCore.Batcher.extend({
22
28
  namespace: 'Metrics',
29
+ /**
30
+ * @param {any} item
31
+ * @returns {Promise<any>}
32
+ */
23
33
  prepareItem: function prepareItem(item) {
24
34
  // Keep non-prod data out of metrics
25
35
  var env = process.env.NODE_ENV === 'production' ? null : 'TEST';
@@ -29,12 +39,20 @@ var MetricsBatcher = _webexCore.Batcher.extend({
29
39
  item.version = item.version || this.webex.version;
30
40
  return _promise.default.resolve(item);
31
41
  },
42
+ /**
43
+ * @param {any[]} queue
44
+ * @returns {Promise<any[]>}
45
+ */
32
46
  prepareRequest: function prepareRequest(queue) {
33
47
  return _promise.default.resolve(queue.map(function (item) {
34
48
  item.postTime = item.postTime || (0, _now.default)();
35
49
  return item;
36
50
  }));
37
51
  },
52
+ /**
53
+ * @param {any} payload
54
+ * @returns {Promise<any>}
55
+ */
38
56
  submitHttpRequest: function submitHttpRequest(payload) {
39
57
  return this.webex.request({
40
58
  method: 'POST',
@@ -42,15 +60,24 @@ var MetricsBatcher = _webexCore.Batcher.extend({
42
60
  resource: 'metrics',
43
61
  body: {
44
62
  metrics: payload
45
- }
63
+ },
64
+ waitForServiceTimeout: this.webex.config.metrics.waitForServiceTimeout
46
65
  });
47
66
  },
67
+ /**
68
+ * @param {any} res
69
+ * @returns {Promise<any>}
70
+ */
48
71
  handleHttpSuccess: function handleHttpSuccess(res) {
49
72
  var _this = this;
50
73
  return _promise.default.all(res.options.body.metrics.map(function (item) {
51
74
  return _this.acceptItem(item);
52
75
  }));
53
76
  },
77
+ /**
78
+ * @param {any} reason
79
+ * @returns {Promise<any>}
80
+ */
54
81
  handleHttpError: function handleHttpError(reason) {
55
82
  var _this2 = this;
56
83
  if (reason instanceof _webexCore.WebexHttpError.NetworkOrCORSError) {
@@ -69,6 +96,10 @@ var MetricsBatcher = _webexCore.Batcher.extend({
69
96
  }
70
97
  return (0, _apply.default)(_webexCore.Batcher.prototype.handleHttpError, this, [reason]);
71
98
  },
99
+ /**
100
+ * @param {any} item
101
+ * @returns {Promise<any>}
102
+ */
72
103
  rerequest: function rerequest(item) {
73
104
  var _this3 = this;
74
105
  return _promise.default.all([this.getDeferredForRequest(item), this.prepareItem(item)]).then(function (_ref) {
@@ -82,12 +113,20 @@ var MetricsBatcher = _webexCore.Batcher.extend({
82
113
  });
83
114
  });
84
115
  },
116
+ /**
117
+ * @param {any} item
118
+ * @returns {Promise<any>}
119
+ */
85
120
  fingerprintRequest: function fingerprintRequest(item) {
86
121
  item[sym] = item[sym] || {
87
122
  nextDelay: 1000
88
123
  };
89
124
  return _promise.default.resolve(item[sym]);
90
125
  },
126
+ /**
127
+ * @param {any} item
128
+ * @returns {Promise<any>}
129
+ */
91
130
  fingerprintResponse: function fingerprintResponse(item) {
92
131
  return _promise.default.resolve(item[sym]);
93
132
  }
@@ -1 +1 @@
1
- {"version":3,"names":["sym","MetricsBatcher","Batcher","extend","namespace","prepareItem","item","env","process","NODE_ENV","appType","config","time","version","webex","resolve","prepareRequest","queue","map","postTime","submitHttpRequest","payload","request","method","service","resource","body","metrics","handleHttpSuccess","res","all","options","acceptItem","handleHttpError","reason","WebexHttpError","NetworkOrCORSError","logger","warn","delay","nextDelay","batcherRetryPlateau","safeSetTimeout","rerequest","prototype","getDeferredForRequest","then","defer","req","enqueue","bounce","catch","reject","fingerprintRequest","fingerprintResponse"],"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;AACA;AALA;AACA;AACA;;AAKA,IAAMA,GAAG,GAAG,qBAAO,WAAW,CAAC;AAE/B,IAAMC,cAAc,GAAGC,kBAAO,CAACC,MAAM,CAAC;EACpCC,SAAS,EAAE,SAAS;EAEpBC,WAAW,uBAACC,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,mBAAU;IACnCN,IAAI,CAACO,OAAO,GAAGP,IAAI,CAACO,OAAO,IAAI,IAAI,CAACC,KAAK,CAACD,OAAO;IAEjD,OAAO,iBAAQE,OAAO,CAACT,IAAI,CAAC;EAC9B,CAAC;EAEDU,cAAc,0BAACC,KAAK,EAAE;IACpB,OAAO,iBAAQF,OAAO,CACpBE,KAAK,CAACC,GAAG,CAAC,UAACZ,IAAI,EAAK;MAClBA,IAAI,CAACa,QAAQ,GAAGb,IAAI,CAACa,QAAQ,IAAI,mBAAU;MAE3C,OAAOb,IAAI;IACb,CAAC,CAAC,CACH;EACH,CAAC;EAEDc,iBAAiB,6BAACC,OAAO,EAAE;IACzB,OAAO,IAAI,CAACP,KAAK,CAACQ,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,6BAACC,GAAG,EAAE;IAAA;IACrB,OAAO,iBAAQC,GAAG,CAACD,GAAG,CAACE,OAAO,CAACL,IAAI,CAACC,OAAO,CAACT,GAAG,CAAC,UAACZ,IAAI;MAAA,OAAK,KAAI,CAAC0B,UAAU,CAAC1B,IAAI,CAAC;IAAA,EAAC,CAAC;EACnF,CAAC;EAED2B,eAAe,2BAACC,MAAM,EAAE;IAAA;IACtB,IAAIA,MAAM,YAAYC,yBAAc,CAACC,kBAAkB,EAAE;MACvD,IAAI,CAACC,MAAM,CAACC,IAAI,CACd,iFAAiF,CAClF;MAED,OAAO,iBAAQR,GAAG,CAChBI,MAAM,CAACH,OAAO,CAACL,IAAI,CAACC,OAAO,CAACT,GAAG,CAC7B,UAACZ,IAAI;QAAA,OACH,qBAAY,UAACS,OAAO,EAAK;UACvB,IAAMwB,KAAK,GAAGjC,IAAI,CAACN,GAAG,CAAC,CAACwC,SAAS;UAEjC,IAAID,KAAK,GAAG,MAAI,CAAC5B,MAAM,CAAC8B,mBAAmB,EAAE;YAC3CnC,IAAI,CAACN,GAAG,CAAC,CAACwC,SAAS,IAAI,CAAC;UAC1B;UACA,IAAAE,4BAAc,EAAC,YAAM;YACnB3B,OAAO,CAAC,MAAI,CAAC4B,SAAS,CAACrC,IAAI,CAAC,CAAC;UAC/B,CAAC,EAAEiC,KAAK,CAAC;QACX,CAAC,CAAC;MAAA,EACL,CACF;IACH;IAEA,OAAO,oBAAcrC,kBAAO,CAAC0C,SAAS,CAACX,eAAe,EAAE,IAAI,EAAE,CAACC,MAAM,CAAC,CAAC;EACzE,CAAC;EAEDS,SAAS,qBAACrC,IAAI,EAAE;IAAA;IACd,OAAO,iBAAQwB,GAAG,CAAC,CAAC,IAAI,CAACe,qBAAqB,CAACvC,IAAI,CAAC,EAAE,IAAI,CAACD,WAAW,CAACC,IAAI,CAAC,CAAC,CAAC,CAACwC,IAAI,CACjF,gBAAkB;MAAA;QAAhBC,KAAK;QAAEC,GAAG;MACV,MAAI,CAACC,OAAO,CAACD,GAAG,CAAC,CACdF,IAAI,CAAC;QAAA,OAAM,MAAI,CAACI,MAAM,EAAE;MAAA,EAAC,CACzBC,KAAK,CAAC,UAACjB,MAAM;QAAA,OAAKa,KAAK,CAACK,MAAM,CAAClB,MAAM,CAAC;MAAA,EAAC;IAC5C,CAAC,CACF;EACH,CAAC;EAEDmB,kBAAkB,8BAAC/C,IAAI,EAAE;IACvBA,IAAI,CAACN,GAAG,CAAC,GAAGM,IAAI,CAACN,GAAG,CAAC,IAAI;MACvBwC,SAAS,EAAE;IACb,CAAC;IAED,OAAO,iBAAQzB,OAAO,CAACT,IAAI,CAACN,GAAG,CAAC,CAAC;EACnC,CAAC;EAEDsD,mBAAmB,+BAAChD,IAAI,EAAE;IACxB,OAAO,iBAAQS,OAAO,CAACT,IAAI,CAACN,GAAG,CAAC,CAAC;EACnC;AACF,CAAC,CAAC;AAAC,eAEYC,cAAc;AAAA"}
1
+ {"version":3,"names":["sym","MetricsBatcher","Batcher","extend","namespace","prepareItem","item","env","process","NODE_ENV","appType","config","time","version","webex","resolve","prepareRequest","queue","map","postTime","submitHttpRequest","payload","request","method","service","resource","body","metrics","waitForServiceTimeout","handleHttpSuccess","res","all","options","acceptItem","handleHttpError","reason","WebexHttpError","NetworkOrCORSError","logger","warn","delay","nextDelay","batcherRetryPlateau","safeSetTimeout","rerequest","prototype","getDeferredForRequest","then","defer","req","enqueue","bounce","catch","reject","fingerprintRequest","fingerprintResponse"],"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\n/**\n * @class\n * @extends Batcher\n * @memberof Metrics\n */\nconst MetricsBatcher = Batcher.extend({\n namespace: 'Metrics',\n\n /**\n * @param {any} item\n * @returns {Promise<any>}\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 /**\n * @param {any[]} queue\n * @returns {Promise<any[]>}\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 /**\n * @param {any} payload\n * @returns {Promise<any>}\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 /**\n * @param {any} res\n * @returns {Promise<any>}\n */\n handleHttpSuccess(res) {\n return Promise.all(res.options.body.metrics.map((item) => this.acceptItem(item)));\n },\n\n /**\n * @param {any} reason\n * @returns {Promise<any>}\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 /**\n * @param {any} item\n * @returns {Promise<any>}\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 /**\n * @param {any} item\n * @returns {Promise<any>}\n */\n fingerprintRequest(item) {\n item[sym] = item[sym] || {\n nextDelay: 1000,\n };\n\n return Promise.resolve(item[sym]);\n },\n\n /**\n * @param {any} item\n * @returns {Promise<any>}\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,65 @@
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 _uniqueId2 = _interopRequireDefault(require("lodash/uniqueId"));
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
+ var CallDiagnosticEventsBatcher = _batcher.default.extend({
16
+ namespace: 'Metrics',
17
+ /**
18
+ * Prepare item
19
+ * @param {any} item
20
+ * @returns {Promise<any>}
21
+ */
22
+ prepareItem: function prepareItem(item) {
23
+ return _promise.default.resolve((0, _callDiagnosticMetrics.prepareDiagnosticMetricItem)(this.webex, item));
24
+ },
25
+ /**
26
+ * Prepare request, add time sensitive date etc.
27
+ * @param {any[]} queue
28
+ * @returns {Promise<any[]>}
29
+ */
30
+ prepareRequest: function prepareRequest(queue) {
31
+ // Add sent timestamp
32
+ queue.forEach(function (item) {
33
+ item.eventPayload.originTime = item.eventPayload.originTime || {};
34
+ item.eventPayload.originTime.sent = new Date().toISOString();
35
+ });
36
+ return _promise.default.resolve(queue);
37
+ },
38
+ /**
39
+ *
40
+ * @param {any} payload
41
+ * @returns {Promise<any>}
42
+ */
43
+ submitHttpRequest: function submitHttpRequest(payload) {
44
+ var _this = this;
45
+ var batchId = (0, _uniqueId2.default)('ca-batch-');
46
+ return this.webex.request({
47
+ method: 'POST',
48
+ service: 'metrics',
49
+ resource: 'clientmetrics',
50
+ body: {
51
+ metrics: payload
52
+ },
53
+ waitForServiceTimeout: this.webex.config.metrics.waitForServiceTimeout
54
+ }).then(function (res) {
55
+ _this.webex.logger.log(_config.CALL_DIAGNOSTIC_LOG_IDENTIFIER, "CallDiagnosticEventsBatcher: @submitHttpRequest#".concat(batchId, ". Request successful."));
56
+ return res;
57
+ }).catch(function (err) {
58
+ _this.webex.logger.error(_config.CALL_DIAGNOSTIC_LOG_IDENTIFIER, "CallDiagnosticEventsBatcher: @submitHttpRequest#".concat(batchId, ". Request failed:"), "error: ".concat((0, _utils.generateCommonErrorMetadata)(err)));
59
+ return _promise.default.reject(err);
60
+ });
61
+ }
62
+ });
63
+ var _default = CallDiagnosticEventsBatcher;
64
+ exports.default = _default;
65
+ //# sourceMappingURL=call-diagnostic-metrics-batcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["CallDiagnosticEventsBatcher","Batcher","extend","namespace","prepareItem","item","resolve","prepareDiagnosticMetricItem","webex","prepareRequest","queue","forEach","eventPayload","originTime","sent","Date","toISOString","submitHttpRequest","payload","batchId","request","method","service","resource","body","metrics","waitForServiceTimeout","config","then","res","logger","log","CALL_DIAGNOSTIC_LOG_IDENTIFIER","catch","err","error","generateCommonErrorMetadata","reject"],"sources":["call-diagnostic-metrics-batcher.ts"],"sourcesContent":["import {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 {any} item\n * @returns {Promise<any>}\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 {any[]} queue\n * @returns {Promise<any[]>}\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 {any} payload\n * @returns {Promise<any>}\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":";;;;;;;;;;AACA;AACA;AACA;AACA;AAEA,IAAMA,2BAA2B,GAAGC,gBAAO,CAACC,MAAM,CAAC;EACjDC,SAAS,EAAE,SAAS;EAEpB;AACF;AACA;AACA;AACA;EACEC,WAAW,uBAACC,IAAI,EAAE;IAChB,OAAO,iBAAQC,OAAO,CAAC,IAAAC,kDAA2B,EAAC,IAAI,CAACC,KAAK,EAAEH,IAAI,CAAC,CAAC;EACvE,CAAC;EAED;AACF;AACA;AACA;AACA;EACEI,cAAc,0BAACC,KAAK,EAAE;IACpB;IACAA,KAAK,CAACC,OAAO,CAAC,UAACN,IAAI,EAAK;MACtBA,IAAI,CAACO,YAAY,CAACC,UAAU,GAAGR,IAAI,CAACO,YAAY,CAACC,UAAU,IAAI,CAAC,CAAC;MACjER,IAAI,CAACO,YAAY,CAACC,UAAU,CAACC,IAAI,GAAG,IAAIC,IAAI,EAAE,CAACC,WAAW,EAAE;IAC9D,CAAC,CAAC;IAEF,OAAO,iBAAQV,OAAO,CAACI,KAAK,CAAC;EAC/B,CAAC;EAED;AACF;AACA;AACA;AACA;EACEO,iBAAiB,6BAACC,OAAO,EAAE;IAAA;IACzB,IAAMC,OAAO,GAAG,wBAAS,WAAW,CAAC;IAErC,OAAO,IAAI,CAACX,KAAK,CACdY,OAAO,CAAC;MACPC,MAAM,EAAE,MAAM;MACdC,OAAO,EAAE,SAAS;MAClBC,QAAQ,EAAE,eAAe;MACzBC,IAAI,EAAE;QACJC,OAAO,EAAEP;MACX,CAAC;MACDQ,qBAAqB,EAAE,IAAI,CAAClB,KAAK,CAACmB,MAAM,CAACF,OAAO,CAACC;IACnD,CAAC,CAAC,CACDE,IAAI,CAAC,UAACC,GAAG,EAAK;MACb,KAAI,CAACrB,KAAK,CAACsB,MAAM,CAACC,GAAG,CACnBC,sCAA8B,4DACqBb,OAAO,2BAC3D;MAED,OAAOU,GAAG;IACZ,CAAC,CAAC,CACDI,KAAK,CAAC,UAACC,GAAG,EAAK;MACd,KAAI,CAAC1B,KAAK,CAACsB,MAAM,CAACK,KAAK,CACrBH,sCAA8B,4DACqBb,OAAO,yCAChD,IAAAiB,kCAA2B,EAACF,GAAG,CAAC,EAC3C;MAED,OAAO,iBAAQG,MAAM,CAACH,GAAG,CAAC;IAC5B,CAAC,CAAC;EACN;AACF,CAAC,CAAC;AAAC,eAEYlC,2BAA2B;AAAA"}
@@ -0,0 +1,476 @@
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; } }
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 = /*#__PURE__*/function (_WebexPlugin) {
28
+ (0, _inherits2.default)(CallDiagnosticLatencies, _WebexPlugin);
29
+ var _super = _createSuper(CallDiagnosticLatencies);
30
+ // meetingId that the current latencies are for
31
+
32
+ /**
33
+ * @constructor
34
+ */
35
+ function CallDiagnosticLatencies() {
36
+ var _this;
37
+ (0, _classCallCheck2.default)(this, CallDiagnosticLatencies);
38
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
39
+ args[_key] = arguments[_key];
40
+ }
41
+ _this = _super.call.apply(_super, [this].concat(args));
42
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "latencyTimestamps", void 0);
43
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "precomputedLatencies", void 0);
44
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "meetingId", void 0);
45
+ _this.latencyTimestamps = new _map.default();
46
+ _this.precomputedLatencies = new _map.default();
47
+ return _this;
48
+ }
49
+
50
+ /**
51
+ * Clear timestamps
52
+ */
53
+ (0, _createClass2.default)(CallDiagnosticLatencies, [{
54
+ key: "clearTimestamps",
55
+ value: function clearTimestamps() {
56
+ this.latencyTimestamps.clear();
57
+ }
58
+
59
+ /**
60
+ * Associate current latencies with a meeting id
61
+ * @param meetingId
62
+ */
63
+ }, {
64
+ key: "setMeetingId",
65
+ value: function setMeetingId(meetingId) {
66
+ this.meetingId = meetingId;
67
+ }
68
+
69
+ /**
70
+ * Returns the meeting object associated with current latencies
71
+ * @returns meeting object
72
+ */
73
+ }, {
74
+ key: "getMeeting",
75
+ value: function getMeeting() {
76
+ if (this.meetingId) {
77
+ // @ts-ignore
78
+ return this.webex.meetings.meetingCollection.get(this.meetingId);
79
+ }
80
+ return undefined;
81
+ }
82
+
83
+ /**
84
+ * Store timestamp value
85
+ * @param key - key
86
+ * @param value -value
87
+ * @throws
88
+ * @returns
89
+ */
90
+ }, {
91
+ key: "saveTimestamp",
92
+ value: function saveTimestamp(_ref) {
93
+ var key = _ref.key,
94
+ _ref$value = _ref.value,
95
+ value = _ref$value === void 0 ? new Date().getTime() : _ref$value,
96
+ _ref$options = _ref.options,
97
+ options = _ref$options === void 0 ? {} : _ref$options;
98
+ // save the meetingId so we can use the meeting object in latency calculations if needed
99
+ var meetingId = options.meetingId;
100
+ if (meetingId) {
101
+ this.setMeetingId(meetingId);
102
+ }
103
+ // for some events we're only interested in the first timestamp not last
104
+ // as these events can happen multiple times
105
+ if (key === 'client.media.rx.start' || key === 'client.media.tx.start' || key === 'internal.client.meetinginfo.request' || key === 'internal.client.meetinginfo.response') {
106
+ this.saveFirstTimestampOnly(key, value);
107
+ } else {
108
+ this.latencyTimestamps.set(key, value);
109
+ }
110
+ }
111
+
112
+ /**
113
+ * Store precomputed latency value
114
+ * @param key - key
115
+ * @param value -value
116
+ * @throws
117
+ * @returns
118
+ */
119
+ }, {
120
+ key: "saveLatency",
121
+ value: function saveLatency(key, value) {
122
+ this.precomputedLatencies.set(key, value);
123
+ }
124
+
125
+ /**
126
+ * Store only the first timestamp value for the given key
127
+ * @param key - key
128
+ * @param value -value
129
+ * @throws
130
+ * @returns
131
+ */
132
+ }, {
133
+ key: "saveFirstTimestampOnly",
134
+ value: function saveFirstTimestampOnly(key) {
135
+ var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : new Date().getTime();
136
+ if (this.latencyTimestamps.has(key)) {
137
+ return;
138
+ }
139
+ this.latencyTimestamps.set(key, value);
140
+ }
141
+
142
+ /**
143
+ * Helper to calculate end - start
144
+ * @param a start
145
+ * @param b end
146
+ * @returns latency
147
+ */
148
+ }, {
149
+ key: "getDiffBetweenTimestamps",
150
+ value: function getDiffBetweenTimestamps(a, b) {
151
+ var start = this.latencyTimestamps.get(a);
152
+ var end = this.latencyTimestamps.get(b);
153
+ if (start && end) {
154
+ return end - start;
155
+ }
156
+ return undefined;
157
+ }
158
+
159
+ /**
160
+ * Meeting Info Request
161
+ * @note Meeting Info request happen not just in the join phase. CA requires
162
+ * metrics around meeting info request that are only part of join phase.
163
+ * This internal.* event is used to track the real timestamps
164
+ * (when the actual request/response happen). This is because the actual CA event is
165
+ * sent inside the join method on the meeting object based on some logic, but that's not exactly when
166
+ * those events are actually fired. The logic only confirms that they have happened, and we send them over.
167
+ * @returns - latency
168
+ */
169
+ }, {
170
+ key: "getMeetingInfoReqResp",
171
+ value: function getMeetingInfoReqResp() {
172
+ return this.getDiffBetweenTimestamps('internal.client.meetinginfo.request', 'internal.client.meetinginfo.response');
173
+ }
174
+
175
+ /**
176
+ * Interstitial Time
177
+ * @returns - latency
178
+ */
179
+ }, {
180
+ key: "getShowInterstitialTime",
181
+ value: function getShowInterstitialTime() {
182
+ return this.getDiffBetweenTimestamps('client.interstitial-window.start-launch', 'internal.client.interstitial-window.click.joinbutton');
183
+ }
184
+
185
+ /**
186
+ * Device Register Time
187
+ * @returns - latency
188
+ */
189
+ }, {
190
+ key: "getRegisterWDMDeviceJMT",
191
+ value: function getRegisterWDMDeviceJMT() {
192
+ return this.getDiffBetweenTimestamps('internal.register.device.request', 'internal.register.device.response');
193
+ }
194
+
195
+ /**
196
+ * Call Init Join Request
197
+ * @returns - latency
198
+ */
199
+ }, {
200
+ key: "getCallInitJoinReq",
201
+ value: function getCallInitJoinReq() {
202
+ return this.getDiffBetweenTimestamps('internal.client.interstitial-window.click.joinbutton', 'client.locus.join.request');
203
+ }
204
+
205
+ /**
206
+ * Locus Join Request
207
+ * @returns - latency
208
+ */
209
+ }, {
210
+ key: "getJoinReqResp",
211
+ value: function getJoinReqResp() {
212
+ return this.getDiffBetweenTimestamps('client.locus.join.request', 'client.locus.join.response');
213
+ }
214
+
215
+ /**
216
+ * Locus Join Response Sent Received
217
+ * @returns - latency
218
+ */
219
+ }, {
220
+ key: "getJoinRespSentReceived",
221
+ value: function getJoinRespSentReceived() {
222
+ // TODO: not clear SPARK-440554
223
+ return undefined;
224
+ }
225
+
226
+ /**
227
+ * Time taken to do turn discovery
228
+ * @returns - latency
229
+ */
230
+ }, {
231
+ key: "getTurnDiscoveryTime",
232
+ value: function getTurnDiscoveryTime() {
233
+ return this.getDiffBetweenTimestamps('internal.client.add-media.turn-discovery.start', 'internal.client.add-media.turn-discovery.end');
234
+ }
235
+
236
+ /**
237
+ * Local SDP Generated Remote SDP REceived
238
+ * @returns - latency
239
+ */
240
+ }, {
241
+ key: "getLocalSDPGenRemoteSDPRecv",
242
+ value: function getLocalSDPGenRemoteSDPRecv() {
243
+ return this.getDiffBetweenTimestamps('client.media-engine.local-sdp-generated', 'client.media-engine.remote-sdp-received');
244
+ }
245
+
246
+ /**
247
+ * ICE Setup Time
248
+ * @returns - latency
249
+ */
250
+ }, {
251
+ key: "getICESetupTime",
252
+ value: function getICESetupTime() {
253
+ return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');
254
+ }
255
+
256
+ /**
257
+ * Audio ICE time
258
+ * @returns - latency
259
+ */
260
+ }, {
261
+ key: "getAudioICESetupTime",
262
+ value: function getAudioICESetupTime() {
263
+ return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');
264
+ }
265
+
266
+ /**
267
+ * Video ICE Time
268
+ * @returns - latency
269
+ */
270
+ }, {
271
+ key: "getVideoICESetupTime",
272
+ value: function getVideoICESetupTime() {
273
+ return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');
274
+ }
275
+
276
+ /**
277
+ * Share ICE Time
278
+ * @returns - latency
279
+ */
280
+ }, {
281
+ key: "getShareICESetupTime",
282
+ value: function getShareICESetupTime() {
283
+ return this.getDiffBetweenTimestamps('client.ice.start', 'client.ice.end');
284
+ }
285
+
286
+ /**
287
+ * Stay Lobby Time
288
+ * @returns - latency
289
+ */
290
+ }, {
291
+ key: "getStayLobbyTime",
292
+ value: function getStayLobbyTime() {
293
+ return this.getDiffBetweenTimestamps('client.locus.join.response', 'internal.host.meeting.participant.admitted');
294
+ }
295
+
296
+ /**
297
+ * Page JMT
298
+ * @returns - latency
299
+ */
300
+ }, {
301
+ key: "getPageJMT",
302
+ value: function getPageJMT() {
303
+ return this.precomputedLatencies.get('internal.client.pageJMT') || undefined;
304
+ }
305
+
306
+ /**
307
+ * Download Time JMT
308
+ * @returns - latency
309
+ */
310
+ }, {
311
+ key: "getDownloadTimeJMT",
312
+ value: function getDownloadTimeJMT() {
313
+ return this.precomputedLatencies.get('internal.download.time') || undefined;
314
+ }
315
+
316
+ /**
317
+ * Click To Interstitial
318
+ * @returns - latency
319
+ */
320
+ }, {
321
+ key: "getClickToInterstitial",
322
+ value: function getClickToInterstitial() {
323
+ // for normal join (where green join button exists before interstitial, i.e reminder, space list etc)
324
+ if (this.latencyTimestamps.get('internal.client.meeting.click.joinbutton')) {
325
+ return this.getDiffBetweenTimestamps('internal.client.meeting.click.joinbutton', 'internal.client.meeting.interstitial-window.showed');
326
+ }
327
+
328
+ // for cross launch and guest flows
329
+ return this.precomputedLatencies.get('internal.click.to.interstitial') || undefined;
330
+ }
331
+
332
+ /**
333
+ * Interstitial To Join Ok
334
+ * @returns - latency
335
+ */
336
+ }, {
337
+ key: "getInterstitialToJoinOK",
338
+ value: function getInterstitialToJoinOK() {
339
+ return this.getDiffBetweenTimestamps('internal.client.interstitial-window.click.joinbutton', 'client.locus.join.response');
340
+ }
341
+
342
+ /**
343
+ * Call Init To MediaEngineReady
344
+ * @returns - latency
345
+ */
346
+ }, {
347
+ key: "getCallInitMediaEngineReady",
348
+ value: function getCallInitMediaEngineReady() {
349
+ return this.getDiffBetweenTimestamps('internal.client.interstitial-window.click.joinbutton', 'client.media-engine.ready');
350
+ }
351
+
352
+ /**
353
+ * Interstitial To Media Ok
354
+ * @returns - latency
355
+ */
356
+ }, {
357
+ key: "getInterstitialToMediaOKJMT",
358
+ value: function getInterstitialToMediaOKJMT() {
359
+ var interstitialJoinClickTimestamp = this.latencyTimestamps.get('internal.client.interstitial-window.click.joinbutton');
360
+
361
+ // get the first timestamp
362
+ var connectedMedia = this.latencyTimestamps.get('client.ice.end');
363
+ var lobbyTime = this.getStayLobbyTime() || 0;
364
+ if (interstitialJoinClickTimestamp && connectedMedia) {
365
+ return connectedMedia - interstitialJoinClickTimestamp - lobbyTime;
366
+ }
367
+ return undefined;
368
+ }
369
+
370
+ /**
371
+ * Total JMT
372
+ * @returns - latency
373
+ */
374
+ }, {
375
+ key: "getTotalJMT",
376
+ value: function getTotalJMT() {
377
+ var clickToInterstitial = this.getClickToInterstitial();
378
+ var interstitialToJoinOk = this.getInterstitialToJoinOK();
379
+ if (clickToInterstitial && interstitialToJoinOk) {
380
+ return clickToInterstitial + interstitialToJoinOk;
381
+ }
382
+ return undefined;
383
+ }
384
+
385
+ /**
386
+ * Join Conf JMT
387
+ * @returns - latency
388
+ */
389
+ }, {
390
+ key: "getJoinConfJMT",
391
+ value: function getJoinConfJMT() {
392
+ var joinReqResp = this.getJoinReqResp();
393
+ var ICESetupTime = this.getICESetupTime();
394
+ if (joinReqResp && ICESetupTime) {
395
+ return joinReqResp + ICESetupTime;
396
+ }
397
+ return undefined;
398
+ }
399
+
400
+ /**
401
+ * Total Media JMT
402
+ * @returns - latency
403
+ */
404
+ }, {
405
+ key: "getTotalMediaJMT",
406
+ value: function getTotalMediaJMT() {
407
+ var clickToInterstitial = this.getClickToInterstitial();
408
+ var interstitialToJoinOk = this.getInterstitialToJoinOK();
409
+ var joinConfJMT = this.getJoinConfJMT();
410
+ var lobbyTime = this.getStayLobbyTime();
411
+ if (clickToInterstitial && interstitialToJoinOk && joinConfJMT) {
412
+ var _this$getMeeting;
413
+ var totalMediaJMT = clickToInterstitial + interstitialToJoinOk + joinConfJMT;
414
+ if ((_this$getMeeting = this.getMeeting()) !== null && _this$getMeeting !== void 0 && _this$getMeeting.allowMediaInLobby) {
415
+ return totalMediaJMT;
416
+ }
417
+ return totalMediaJMT - lobbyTime;
418
+ }
419
+ return undefined;
420
+ }
421
+
422
+ /**
423
+ * Client JMT
424
+ * @returns - latency
425
+ */
426
+ }, {
427
+ key: "getClientJMT",
428
+ value: function getClientJMT() {
429
+ var interstitialToJoinOk = this.getInterstitialToJoinOK();
430
+ var joinConfJMT = this.getJoinConfJMT();
431
+ if (interstitialToJoinOk && joinConfJMT) {
432
+ return interstitialToJoinOk - joinConfJMT;
433
+ }
434
+ return undefined;
435
+ }
436
+
437
+ /**
438
+ * Audio setup delay receive
439
+ */
440
+ }, {
441
+ key: "getAudioJoinRespRxStart",
442
+ value: function getAudioJoinRespRxStart() {
443
+ return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.rx.start');
444
+ }
445
+
446
+ /**
447
+ * Video setup delay receive
448
+ */
449
+ }, {
450
+ key: "getVideoJoinRespRxStart",
451
+ value: function getVideoJoinRespRxStart() {
452
+ return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.rx.start');
453
+ }
454
+
455
+ /**
456
+ * Audio setup delay transmit
457
+ */
458
+ }, {
459
+ key: "getAudioJoinRespTxStart",
460
+ value: function getAudioJoinRespTxStart() {
461
+ return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.tx.start');
462
+ }
463
+
464
+ /**
465
+ * Video setup delay transmit
466
+ */
467
+ }, {
468
+ key: "getVideoJoinRespTxStart",
469
+ value: function getVideoJoinRespTxStart() {
470
+ return this.getDiffBetweenTimestamps('client.locus.join.response', 'client.media.tx.start');
471
+ }
472
+ }]);
473
+ return CallDiagnosticLatencies;
474
+ }(_webexCore.WebexPlugin);
475
+ exports.default = CallDiagnosticLatencies;
476
+ //# sourceMappingURL=call-diagnostic-metrics-latencies.js.map