@webex/internal-plugin-metrics 3.0.0-beta.38 → 3.0.0-beta.381
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/batcher.js +40 -1
- package/dist/batcher.js.map +1 -1
- package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js +65 -0
- package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js.map +1 -0
- package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +476 -0
- package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -0
- package/dist/call-diagnostic/call-diagnostic-metrics.js +854 -0
- package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -0
- package/dist/call-diagnostic/call-diagnostic-metrics.util.js +364 -0
- package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -0
- package/dist/call-diagnostic/config.js +627 -0
- package/dist/call-diagnostic/config.js.map +1 -0
- package/dist/client-metrics-batcher.js +2 -1
- package/dist/client-metrics-batcher.js.map +1 -1
- package/dist/config.js +2 -1
- package/dist/config.js.map +1 -1
- package/dist/index.js +33 -0
- package/dist/index.js.map +1 -1
- package/dist/metrics.js +23 -28
- package/dist/metrics.js.map +1 -1
- package/dist/metrics.types.js +7 -0
- package/dist/metrics.types.js.map +1 -0
- package/dist/new-metrics.js +299 -0
- package/dist/new-metrics.js.map +1 -0
- package/dist/prelogin-metrics-batcher.js +82 -0
- package/dist/prelogin-metrics-batcher.js.map +1 -0
- package/dist/types/batcher.d.ts +7 -0
- package/dist/types/call-diagnostic/call-diagnostic-metrics-batcher.d.ts +2 -0
- package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +204 -0
- package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +427 -0
- package/dist/types/call-diagnostic/call-diagnostic-metrics.util.d.ts +103 -0
- package/dist/types/call-diagnostic/config.d.ts +178 -0
- package/dist/types/client-metrics-batcher.d.ts +2 -0
- package/dist/types/config.d.ts +36 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/metrics.d.ts +3 -0
- package/dist/types/metrics.types.d.ts +105 -0
- package/dist/types/new-metrics.d.ts +131 -0
- package/dist/types/prelogin-metrics-batcher.d.ts +2 -0
- package/dist/types/utils.d.ts +6 -0
- package/dist/utils.js +27 -0
- package/dist/utils.js.map +1 -0
- package/package.json +16 -8
- package/src/batcher.js +38 -0
- package/src/call-diagnostic/call-diagnostic-metrics-batcher.ts +72 -0
- package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +435 -0
- package/src/call-diagnostic/call-diagnostic-metrics.ts +912 -0
- package/src/call-diagnostic/call-diagnostic-metrics.util.ts +392 -0
- package/src/call-diagnostic/config.ts +685 -0
- package/src/client-metrics-batcher.js +1 -0
- package/src/config.js +1 -0
- package/src/index.ts +54 -0
- package/src/metrics.js +18 -24
- package/src/metrics.types.ts +168 -0
- package/src/new-metrics.ts +278 -0
- package/src/prelogin-metrics-batcher.ts +95 -0
- package/src/utils.ts +17 -0
- package/test/unit/spec/batcher.js +2 -0
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +457 -0
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +520 -0
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +2276 -0
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +629 -0
- package/test/unit/spec/client-metrics-batcher.js +2 -0
- package/test/unit/spec/metrics.js +66 -97
- package/test/unit/spec/new-metrics.ts +234 -0
- package/test/unit/spec/prelogin-metrics-batcher.ts +250 -0
- package/test/unit/spec/utils.ts +22 -0
- package/tsconfig.json +6 -0
- package/dist/call-diagnostic-events-batcher.js +0 -60
- package/dist/call-diagnostic-events-batcher.js.map +0 -1
- package/src/call-diagnostic-events-batcher.js +0 -62
- package/src/index.js +0 -17
- 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
|
}
|
package/dist/batcher.js.map
CHANGED
|
@@ -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
|
|
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
|