@webex/internal-plugin-metrics 3.0.0-bnr.5 → 3.0.0-next.10
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/.eslintrc.js +6 -0
- package/babel.config.js +3 -0
- package/dist/batcher.js +41 -3
- package/dist/batcher.js.map +1 -1
- package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js +64 -0
- package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js.map +1 -0
- package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +550 -0
- package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -0
- package/dist/call-diagnostic/call-diagnostic-metrics.js +858 -0
- package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -0
- package/dist/call-diagnostic/call-diagnostic-metrics.util.js +356 -0
- package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -0
- package/dist/call-diagnostic/config.js +609 -0
- package/dist/call-diagnostic/config.js.map +1 -0
- package/dist/client-metrics-batcher.js +3 -3
- package/dist/client-metrics-batcher.js.map +1 -1
- package/dist/config.js +6 -9
- package/dist/config.js.map +1 -1
- package/dist/index.js +35 -2
- package/dist/index.js.map +1 -1
- package/dist/metrics.js +28 -22
- 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 +303 -0
- package/dist/new-metrics.js.map +1 -0
- package/dist/prelogin-metrics-batcher.js +81 -0
- package/dist/prelogin-metrics-batcher.js.map +1 -0
- package/dist/types/batcher.d.ts +5 -0
- package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +237 -0
- package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +425 -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/config.d.ts +18 -0
- package/dist/types/index.d.ts +15 -3
- package/dist/types/metrics.d.ts +1 -0
- package/dist/types/metrics.types.d.ts +107 -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 +26 -0
- package/dist/utils.js.map +1 -0
- package/jest.config.js +3 -0
- package/package.json +34 -10
- package/process +1 -0
- 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 +511 -0
- package/src/call-diagnostic/call-diagnostic-metrics.ts +925 -0
- package/src/call-diagnostic/call-diagnostic-metrics.util.ts +399 -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 +56 -0
- package/src/metrics.js +20 -16
- package/src/metrics.types.ts +179 -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 +469 -0
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +718 -0
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +2371 -0
- package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +637 -0
- package/test/unit/spec/client-metrics-batcher.js +2 -0
- package/test/unit/spec/metrics.js +76 -95
- package/test/unit/spec/new-metrics.ts +231 -0
- package/test/unit/spec/prelogin-metrics-batcher.ts +253 -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/dist/internal-plugin-metrics.d.ts +0 -21
- package/dist/tsdoc-metadata.json +0 -11
- 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/types/{call-diagnostic-events-batcher.d.ts → call-diagnostic/call-diagnostic-metrics-batcher.d.ts} +1 -1
|
@@ -0,0 +1,303 @@
|
|
|
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 _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
|
|
11
|
+
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
|
|
12
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
|
|
13
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
|
|
14
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
|
|
15
|
+
var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized"));
|
|
16
|
+
var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inherits"));
|
|
17
|
+
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
|
|
18
|
+
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
|
|
19
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
20
|
+
var _webexCore = require("@webex/webex-core");
|
|
21
|
+
var _callDiagnosticMetrics = _interopRequireDefault(require("./call-diagnostic/call-diagnostic-metrics"));
|
|
22
|
+
var _callDiagnosticMetricsLatencies = _interopRequireDefault(require("./call-diagnostic/call-diagnostic-metrics-latencies"));
|
|
23
|
+
var _callDiagnosticMetrics2 = require("./call-diagnostic/call-diagnostic-metrics.util");
|
|
24
|
+
var _utils = require("./utils");
|
|
25
|
+
var _class;
|
|
26
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
27
|
+
/* eslint-disable class-methods-use-this */
|
|
28
|
+
/* eslint-disable valid-jsdoc */
|
|
29
|
+
// @ts-ignore
|
|
30
|
+
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); }; }
|
|
31
|
+
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; } }
|
|
32
|
+
/**
|
|
33
|
+
* Metrics plugin to centralize all types of metrics.
|
|
34
|
+
* @class
|
|
35
|
+
*/
|
|
36
|
+
var Metrics = /*#__PURE__*/function (_WebexPlugin) {
|
|
37
|
+
(0, _inherits2.default)(Metrics, _WebexPlugin);
|
|
38
|
+
var _super = _createSuper(Metrics);
|
|
39
|
+
/**
|
|
40
|
+
* Constructor
|
|
41
|
+
* @param args
|
|
42
|
+
* @constructor
|
|
43
|
+
* @private
|
|
44
|
+
* @returns
|
|
45
|
+
*/
|
|
46
|
+
function Metrics() {
|
|
47
|
+
var _this;
|
|
48
|
+
(0, _classCallCheck2.default)(this, Metrics);
|
|
49
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
50
|
+
args[_key] = arguments[_key];
|
|
51
|
+
}
|
|
52
|
+
_this = _super.call.apply(_super, [this].concat(args));
|
|
53
|
+
|
|
54
|
+
// @ts-ignore
|
|
55
|
+
// Call Diagnostic latencies
|
|
56
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "callDiagnosticLatencies", void 0);
|
|
57
|
+
// Helper classes to handle the different types of metrics
|
|
58
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "callDiagnosticMetrics", void 0);
|
|
59
|
+
_this.callDiagnosticLatencies = new _callDiagnosticMetricsLatencies.default({}, {
|
|
60
|
+
parent: _this.webex
|
|
61
|
+
});
|
|
62
|
+
_this.onReady();
|
|
63
|
+
return _this;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* On Ready
|
|
68
|
+
*/
|
|
69
|
+
(0, _createClass2.default)(Metrics, [{
|
|
70
|
+
key: "onReady",
|
|
71
|
+
value: function onReady() {
|
|
72
|
+
var _this2 = this;
|
|
73
|
+
// @ts-ignore
|
|
74
|
+
this.webex.once('ready', function () {
|
|
75
|
+
// @ts-ignore
|
|
76
|
+
_this2.callDiagnosticMetrics = new _callDiagnosticMetrics.default({}, {
|
|
77
|
+
parent: _this2.webex
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Used for internal purposes only
|
|
84
|
+
* @param args
|
|
85
|
+
*/
|
|
86
|
+
}, {
|
|
87
|
+
key: "submitInternalEvent",
|
|
88
|
+
value: function submitInternalEvent(_ref) {
|
|
89
|
+
var name = _ref.name,
|
|
90
|
+
payload = _ref.payload,
|
|
91
|
+
options = _ref.options;
|
|
92
|
+
if (name === 'internal.reset.join.latencies') {
|
|
93
|
+
this.callDiagnosticLatencies.clearTimestamps();
|
|
94
|
+
} else {
|
|
95
|
+
this.callDiagnosticLatencies.saveTimestamp({
|
|
96
|
+
key: name
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Behavioral event
|
|
103
|
+
* @param args
|
|
104
|
+
*/
|
|
105
|
+
}, {
|
|
106
|
+
key: "submitBehavioralEvent",
|
|
107
|
+
value: function submitBehavioralEvent(_ref2) {
|
|
108
|
+
var name = _ref2.name,
|
|
109
|
+
payload = _ref2.payload,
|
|
110
|
+
options = _ref2.options;
|
|
111
|
+
this.callDiagnosticLatencies.saveTimestamp({
|
|
112
|
+
key: name
|
|
113
|
+
});
|
|
114
|
+
throw new Error('Not implemented.');
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Operational event
|
|
119
|
+
* @param args
|
|
120
|
+
*/
|
|
121
|
+
}, {
|
|
122
|
+
key: "submitOperationalEvent",
|
|
123
|
+
value: function submitOperationalEvent(_ref3) {
|
|
124
|
+
var name = _ref3.name,
|
|
125
|
+
payload = _ref3.payload,
|
|
126
|
+
options = _ref3.options;
|
|
127
|
+
throw new Error('Not implemented.');
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Call Analyzer: Media Quality Event
|
|
132
|
+
* @param args
|
|
133
|
+
*/
|
|
134
|
+
}, {
|
|
135
|
+
key: "submitMQE",
|
|
136
|
+
value: function submitMQE(_ref4) {
|
|
137
|
+
var name = _ref4.name,
|
|
138
|
+
payload = _ref4.payload,
|
|
139
|
+
options = _ref4.options;
|
|
140
|
+
this.callDiagnosticLatencies.saveTimestamp({
|
|
141
|
+
key: name
|
|
142
|
+
});
|
|
143
|
+
this.callDiagnosticMetrics.submitMQE({
|
|
144
|
+
name: name,
|
|
145
|
+
payload: payload,
|
|
146
|
+
options: options
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Call Analyzer: Feature Usage Event
|
|
152
|
+
* @param args
|
|
153
|
+
*/
|
|
154
|
+
}, {
|
|
155
|
+
key: "submitFeatureEvent",
|
|
156
|
+
value: function submitFeatureEvent(_ref5) {
|
|
157
|
+
var name = _ref5.name,
|
|
158
|
+
payload = _ref5.payload,
|
|
159
|
+
options = _ref5.options;
|
|
160
|
+
throw new Error('Not implemented.');
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Call Analyzer: Client Event
|
|
165
|
+
* @public
|
|
166
|
+
* @param args
|
|
167
|
+
*/
|
|
168
|
+
}, {
|
|
169
|
+
key: "submitClientEvent",
|
|
170
|
+
value: function submitClientEvent(_ref6) {
|
|
171
|
+
var name = _ref6.name,
|
|
172
|
+
payload = _ref6.payload,
|
|
173
|
+
options = _ref6.options;
|
|
174
|
+
if (!this.callDiagnosticLatencies || !this.callDiagnosticMetrics) {
|
|
175
|
+
// @ts-ignore
|
|
176
|
+
this.webex.logger.log("NewMetrics: @submitClientEvent. Attempted to submit before webex.ready. Event name: ".concat(name));
|
|
177
|
+
return _promise.default.resolve();
|
|
178
|
+
}
|
|
179
|
+
this.callDiagnosticLatencies.saveTimestamp({
|
|
180
|
+
key: name,
|
|
181
|
+
options: {
|
|
182
|
+
meetingId: options === null || options === void 0 ? void 0 : options.meetingId
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
return this.callDiagnosticMetrics.submitClientEvent({
|
|
186
|
+
name: name,
|
|
187
|
+
payload: payload,
|
|
188
|
+
options: options
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Issue request to alias a user's pre-login ID with their CI UUID
|
|
194
|
+
* @param {string} preLoginId
|
|
195
|
+
* @returns {Object} HttpResponse object
|
|
196
|
+
*/
|
|
197
|
+
}, {
|
|
198
|
+
key: "clientMetricsAliasUser",
|
|
199
|
+
value: function clientMetricsAliasUser(preLoginId) {
|
|
200
|
+
var _this3 = this;
|
|
201
|
+
// @ts-ignore
|
|
202
|
+
return this.webex.request({
|
|
203
|
+
method: 'POST',
|
|
204
|
+
api: 'metrics',
|
|
205
|
+
resource: 'clientmetrics',
|
|
206
|
+
headers: {
|
|
207
|
+
'x-prelogin-userid': preLoginId
|
|
208
|
+
},
|
|
209
|
+
body: {},
|
|
210
|
+
qs: {
|
|
211
|
+
alias: true
|
|
212
|
+
}
|
|
213
|
+
}).then(function (res) {
|
|
214
|
+
// @ts-ignore
|
|
215
|
+
_this3.webex.logger.log("NewMetrics: @clientMetricsAliasUser. Request successful.");
|
|
216
|
+
return res;
|
|
217
|
+
}).catch(function (err) {
|
|
218
|
+
// @ts-ignore
|
|
219
|
+
_this3.logger.error("NewMetrics: @clientMetricsAliasUser. Request failed:", "err: ".concat((0, _utils.generateCommonErrorMetadata)(err)));
|
|
220
|
+
return _promise.default.reject(err);
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Returns a promise that will resolve to fetch options for submitting a metric.
|
|
226
|
+
*
|
|
227
|
+
* This is to support quickly submitting metrics when the browser/tab is closing.
|
|
228
|
+
* Calling submitClientEvent will not work because there some async steps that will
|
|
229
|
+
* not complete before the browser is closed. Instead, we pre-gather all the
|
|
230
|
+
* information/options needed for the request(s), and then simply and quickly
|
|
231
|
+
* fire the fetch(es) when beforeUnload is triggered.
|
|
232
|
+
*
|
|
233
|
+
* We must use fetch instead of request because fetch has a keepalive option that
|
|
234
|
+
* allows the request it to outlive the page.
|
|
235
|
+
*
|
|
236
|
+
* Note: the timings values will be wrong, but setMetricTimingsAndFetch() will
|
|
237
|
+
* properly adjust them before submitting.
|
|
238
|
+
*
|
|
239
|
+
* @public
|
|
240
|
+
* @param {Object} arg
|
|
241
|
+
* @param {String} arg.name - event name
|
|
242
|
+
* @param {Object} arg.payload - event payload
|
|
243
|
+
* @param {Object} arg.options - other options
|
|
244
|
+
* @returns {Promise} promise that resolves to options to be used with fetch
|
|
245
|
+
*/
|
|
246
|
+
}, {
|
|
247
|
+
key: "buildClientEventFetchRequestOptions",
|
|
248
|
+
value: (function () {
|
|
249
|
+
var _buildClientEventFetchRequestOptions = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(_ref7) {
|
|
250
|
+
var name, payload, options;
|
|
251
|
+
return _regenerator.default.wrap(function _callee$(_context) {
|
|
252
|
+
while (1) switch (_context.prev = _context.next) {
|
|
253
|
+
case 0:
|
|
254
|
+
name = _ref7.name, payload = _ref7.payload, options = _ref7.options;
|
|
255
|
+
return _context.abrupt("return", this.callDiagnosticMetrics.buildClientEventFetchRequestOptions({
|
|
256
|
+
name: name,
|
|
257
|
+
payload: payload,
|
|
258
|
+
options: options
|
|
259
|
+
}));
|
|
260
|
+
case 2:
|
|
261
|
+
case "end":
|
|
262
|
+
return _context.stop();
|
|
263
|
+
}
|
|
264
|
+
}, _callee, this);
|
|
265
|
+
}));
|
|
266
|
+
function buildClientEventFetchRequestOptions(_x) {
|
|
267
|
+
return _buildClientEventFetchRequestOptions.apply(this, arguments);
|
|
268
|
+
}
|
|
269
|
+
return buildClientEventFetchRequestOptions;
|
|
270
|
+
}()
|
|
271
|
+
/**
|
|
272
|
+
* Submits a metric from pre-built request options via the fetch API. Updates
|
|
273
|
+
* the "$timings" and "originTime" values to Date.now() since the existing times
|
|
274
|
+
* were set when the options were built (not submitted).
|
|
275
|
+
* @param {any} options - the pre-built request options for submitting a metric
|
|
276
|
+
* @returns {Promise} promise that resolves to the response object
|
|
277
|
+
*/
|
|
278
|
+
)
|
|
279
|
+
}, {
|
|
280
|
+
key: "setMetricTimingsAndFetch",
|
|
281
|
+
value: function setMetricTimingsAndFetch(options) {
|
|
282
|
+
// @ts-ignore
|
|
283
|
+
return this.webex.setTimingsAndFetch((0, _callDiagnosticMetrics2.setMetricTimings)(options));
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
/**
|
|
287
|
+
* Returns true if the specified serviceErrorCode maps to an expected error.
|
|
288
|
+
* @param {number} serviceErrorCode the service error code
|
|
289
|
+
* @returns {boolean}
|
|
290
|
+
*/
|
|
291
|
+
}, {
|
|
292
|
+
key: "isServiceErrorExpected",
|
|
293
|
+
value: function isServiceErrorExpected(serviceErrorCode) {
|
|
294
|
+
return this.callDiagnosticMetrics.isServiceErrorExpected(serviceErrorCode);
|
|
295
|
+
}
|
|
296
|
+
}]);
|
|
297
|
+
return Metrics;
|
|
298
|
+
}(_webexCore.WebexPlugin);
|
|
299
|
+
_class = Metrics;
|
|
300
|
+
// eslint-disable-next-line no-use-before-define
|
|
301
|
+
(0, _defineProperty2.default)(Metrics, "instance", void 0);
|
|
302
|
+
var _default = exports.default = Metrics;
|
|
303
|
+
//# sourceMappingURL=new-metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_webexCore","require","_callDiagnosticMetrics","_interopRequireDefault","_callDiagnosticMetricsLatencies","_callDiagnosticMetrics2","_utils","_class","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","default","result","NewTarget","constructor","_Reflect$construct","arguments","apply","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","e","Metrics","_WebexPlugin","_inherits2","_super","_this","_classCallCheck2","_len","length","args","Array","_key","concat","_defineProperty2","_assertThisInitialized2","callDiagnosticLatencies","CallDiagnosticLatencies","parent","webex","onReady","_createClass2","key","value","_this2","once","callDiagnosticMetrics","CallDiagnosticMetrics","submitInternalEvent","_ref","name","payload","options","clearTimestamps","saveTimestamp","submitBehavioralEvent","_ref2","Error","submitOperationalEvent","_ref3","submitMQE","_ref4","submitFeatureEvent","_ref5","submitClientEvent","_ref6","logger","log","_promise","resolve","meetingId","clientMetricsAliasUser","preLoginId","_this3","request","method","api","resource","headers","body","qs","alias","then","res","catch","err","error","generateCommonErrorMetadata","reject","_buildClientEventFetchRequestOptions","_asyncToGenerator2","_regenerator","mark","_callee","_ref7","wrap","_callee$","_context","prev","next","abrupt","buildClientEventFetchRequestOptions","stop","_x","setMetricTimingsAndFetch","setTimingsAndFetch","setMetricTimings","isServiceErrorExpected","serviceErrorCode","WebexPlugin","_default","exports"],"sources":["new-metrics.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable class-methods-use-this */\n/* eslint-disable valid-jsdoc */\n\n// @ts-ignore\nimport {WebexPlugin} from '@webex/webex-core';\n\nimport CallDiagnosticMetrics from './call-diagnostic/call-diagnostic-metrics';\nimport {\n RecursivePartial,\n ClientEvent,\n FeatureEvent,\n BehavioralEvent,\n OperationalEvent,\n MediaQualityEvent,\n InternalEvent,\n SubmitClientEventOptions,\n} from './metrics.types';\nimport CallDiagnosticLatencies from './call-diagnostic/call-diagnostic-metrics-latencies';\nimport {setMetricTimings} from './call-diagnostic/call-diagnostic-metrics.util';\nimport {generateCommonErrorMetadata} from './utils';\n\n/**\n * Metrics plugin to centralize all types of metrics.\n * @class\n */\nclass Metrics extends WebexPlugin {\n // eslint-disable-next-line no-use-before-define\n static instance: Metrics;\n\n // Call Diagnostic latencies\n callDiagnosticLatencies: CallDiagnosticLatencies;\n // Helper classes to handle the different types of metrics\n callDiagnosticMetrics: CallDiagnosticMetrics;\n\n /**\n * Constructor\n * @param args\n * @constructor\n * @private\n * @returns\n */\n constructor(...args) {\n super(...args);\n\n // @ts-ignore\n this.callDiagnosticLatencies = new CallDiagnosticLatencies({}, {parent: this.webex});\n this.onReady();\n }\n\n /**\n * On Ready\n */\n private onReady() {\n // @ts-ignore\n this.webex.once('ready', () => {\n // @ts-ignore\n this.callDiagnosticMetrics = new CallDiagnosticMetrics({}, {parent: this.webex});\n });\n }\n\n /**\n * Used for internal purposes only\n * @param args\n */\n submitInternalEvent({\n name,\n payload,\n options,\n }: {\n name: InternalEvent['name'];\n payload?: RecursivePartial<InternalEvent['payload']>;\n options?: any;\n }) {\n if (name === 'internal.reset.join.latencies') {\n this.callDiagnosticLatencies.clearTimestamps();\n } else {\n this.callDiagnosticLatencies.saveTimestamp({key: name});\n }\n }\n\n /**\n * Behavioral event\n * @param args\n */\n submitBehavioralEvent({\n name,\n payload,\n options,\n }: {\n name: BehavioralEvent['name'];\n payload?: RecursivePartial<BehavioralEvent['payload']>;\n options?: any;\n }) {\n this.callDiagnosticLatencies.saveTimestamp({key: name});\n throw new Error('Not implemented.');\n }\n\n /**\n * Operational event\n * @param args\n */\n submitOperationalEvent({\n name,\n payload,\n options,\n }: {\n name: OperationalEvent['name'];\n payload?: RecursivePartial<OperationalEvent['payload']>;\n options?: any;\n }) {\n throw new Error('Not implemented.');\n }\n\n /**\n * Call Analyzer: Media Quality Event\n * @param args\n */\n submitMQE({\n name,\n payload,\n options,\n }: {\n name: MediaQualityEvent['name'];\n payload: RecursivePartial<MediaQualityEvent['payload']> & {\n intervals: MediaQualityEvent['payload']['intervals'];\n };\n options: any;\n }) {\n this.callDiagnosticLatencies.saveTimestamp({key: name});\n this.callDiagnosticMetrics.submitMQE({name, payload, options});\n }\n\n /**\n * Call Analyzer: Feature Usage Event\n * @param args\n */\n submitFeatureEvent({\n name,\n payload,\n options,\n }: {\n name: FeatureEvent['name'];\n payload?: RecursivePartial<FeatureEvent['payload']>;\n options: any;\n }) {\n throw new Error('Not implemented.');\n }\n\n /**\n * Call Analyzer: Client Event\n * @public\n * @param args\n */\n public submitClientEvent({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n }): Promise<any> {\n if (!this.callDiagnosticLatencies || !this.callDiagnosticMetrics) {\n // @ts-ignore\n this.webex.logger.log(\n `NewMetrics: @submitClientEvent. Attempted to submit before webex.ready. Event name: ${name}`\n );\n\n return Promise.resolve();\n }\n this.callDiagnosticLatencies.saveTimestamp({\n key: name,\n options: {meetingId: options?.meetingId},\n });\n\n return this.callDiagnosticMetrics.submitClientEvent({name, payload, options});\n }\n\n /**\n * Issue request to alias a user's pre-login ID with their CI UUID\n * @param {string} preLoginId\n * @returns {Object} HttpResponse object\n */\n public clientMetricsAliasUser(preLoginId: string) {\n // @ts-ignore\n return this.webex\n .request({\n method: 'POST',\n api: 'metrics',\n resource: 'clientmetrics',\n headers: {\n 'x-prelogin-userid': preLoginId,\n },\n body: {},\n qs: {\n alias: true,\n },\n })\n .then((res) => {\n // @ts-ignore\n this.webex.logger.log(`NewMetrics: @clientMetricsAliasUser. Request successful.`);\n\n return res;\n })\n .catch((err) => {\n // @ts-ignore\n this.logger.error(\n `NewMetrics: @clientMetricsAliasUser. Request failed:`,\n `err: ${generateCommonErrorMetadata(err)}`\n );\n\n return Promise.reject(err);\n });\n }\n\n /**\n * Returns a promise that will resolve to fetch options for submitting a metric.\n *\n * This is to support quickly submitting metrics when the browser/tab is closing.\n * Calling submitClientEvent will not work because there some async steps that will\n * not complete before the browser is closed. Instead, we pre-gather all the\n * information/options needed for the request(s), and then simply and quickly\n * fire the fetch(es) when beforeUnload is triggered.\n *\n * We must use fetch instead of request because fetch has a keepalive option that\n * allows the request it to outlive the page.\n *\n * Note: the timings values will be wrong, but setMetricTimingsAndFetch() will\n * properly adjust them before submitting.\n *\n * @public\n * @param {Object} arg\n * @param {String} arg.name - event name\n * @param {Object} arg.payload - event payload\n * @param {Object} arg.options - other options\n * @returns {Promise} promise that resolves to options to be used with fetch\n */\n public async buildClientEventFetchRequestOptions({\n name,\n payload,\n options,\n }: {\n name: ClientEvent['name'];\n payload?: RecursivePartial<ClientEvent['payload']>;\n options?: SubmitClientEventOptions;\n }): Promise<any> {\n return this.callDiagnosticMetrics.buildClientEventFetchRequestOptions({\n name,\n payload,\n options,\n });\n }\n\n /**\n * Submits a metric from pre-built request options via the fetch API. Updates\n * the \"$timings\" and \"originTime\" values to Date.now() since the existing times\n * were set when the options were built (not submitted).\n\n * @param {any} options - the pre-built request options for submitting a metric\n * @returns {Promise} promise that resolves to the response object\n */\n public setMetricTimingsAndFetch(options: any): Promise<any> {\n // @ts-ignore\n return this.webex.setTimingsAndFetch(setMetricTimings(options));\n }\n\n /**\n * Returns true if the specified serviceErrorCode maps to an expected error.\n * @param {number} serviceErrorCode the service error code\n * @returns {boolean}\n */\n public isServiceErrorExpected(serviceErrorCode: number): boolean {\n return this.callDiagnosticMetrics.isServiceErrorExpected(serviceErrorCode);\n }\n}\n\nexport default Metrics;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,81 @@
|
|
|
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/call-diagnostic-metrics.util");
|
|
13
|
+
var _utils = require("./utils");
|
|
14
|
+
var PRE_LOGIN_METRICS_IDENTIFIER = 'Pre Login Metrics -->';
|
|
15
|
+
var PreLoginMetricsBatcher = _batcher.default.extend({
|
|
16
|
+
namespace: 'Metrics',
|
|
17
|
+
preLoginId: undefined,
|
|
18
|
+
/**
|
|
19
|
+
* Save the pre-login ID.
|
|
20
|
+
* @param {string} preLoginId The pre-login ID to be saved.
|
|
21
|
+
* @returns {void}
|
|
22
|
+
*/
|
|
23
|
+
savePreLoginId: function savePreLoginId(preLoginId) {
|
|
24
|
+
this.preLoginId = preLoginId;
|
|
25
|
+
},
|
|
26
|
+
/**
|
|
27
|
+
* Prepare item
|
|
28
|
+
* @param {any} item
|
|
29
|
+
* @returns {Promise<any>}
|
|
30
|
+
*/
|
|
31
|
+
prepareItem: function prepareItem(item) {
|
|
32
|
+
return _promise.default.resolve((0, _callDiagnosticMetrics.prepareDiagnosticMetricItem)(this.webex, item));
|
|
33
|
+
},
|
|
34
|
+
/**
|
|
35
|
+
* Prepare request, add time sensitive date etc.
|
|
36
|
+
* @param {any[]} queue
|
|
37
|
+
* @returns {Promise<any[]>}
|
|
38
|
+
*/
|
|
39
|
+
prepareRequest: function prepareRequest(queue) {
|
|
40
|
+
// Add sent timestamp
|
|
41
|
+
queue.forEach(function (item) {
|
|
42
|
+
item.eventPayload.originTime = item.eventPayload.originTime || {};
|
|
43
|
+
item.eventPayload.originTime.sent = new Date().toISOString();
|
|
44
|
+
});
|
|
45
|
+
return _promise.default.resolve(queue);
|
|
46
|
+
},
|
|
47
|
+
/**
|
|
48
|
+
*
|
|
49
|
+
* @param {any} payload
|
|
50
|
+
* @returns {Promise<any>}
|
|
51
|
+
*/
|
|
52
|
+
submitHttpRequest: function submitHttpRequest(payload) {
|
|
53
|
+
var _this = this;
|
|
54
|
+
var batchId = (0, _lodash.uniqueId)('prelogin-ca-batch-');
|
|
55
|
+
if (this.preLoginId === undefined) {
|
|
56
|
+
this.webex.logger.error(PRE_LOGIN_METRICS_IDENTIFIER, "PreLoginMetricsBatcher: @submitHttpRequest#".concat(batchId, ". PreLoginId is not set."));
|
|
57
|
+
return _promise.default.reject(new Error('PreLoginId is not set.'));
|
|
58
|
+
}
|
|
59
|
+
return this.webex.request({
|
|
60
|
+
method: 'POST',
|
|
61
|
+
service: 'metrics',
|
|
62
|
+
resource: 'clientmetrics-prelogin',
|
|
63
|
+
headers: {
|
|
64
|
+
authorization: false,
|
|
65
|
+
'x-prelogin-userid': this.preLoginId
|
|
66
|
+
},
|
|
67
|
+
body: {
|
|
68
|
+
metrics: payload
|
|
69
|
+
},
|
|
70
|
+
waitForServiceTimeout: this.webex.config.metrics.waitForServiceTimeout
|
|
71
|
+
}).then(function (res) {
|
|
72
|
+
_this.webex.logger.log(PRE_LOGIN_METRICS_IDENTIFIER, "PreLoginMetricsBatcher: @submitHttpRequest#".concat(batchId, ". Request successful."));
|
|
73
|
+
return res;
|
|
74
|
+
}).catch(function (err) {
|
|
75
|
+
_this.webex.logger.error(PRE_LOGIN_METRICS_IDENTIFIER, "PreLoginMetricsBatcher: @submitHttpRequest#".concat(batchId, ". Request failed:"), "error: ".concat((0, _utils.generateCommonErrorMetadata)(err)));
|
|
76
|
+
return _promise.default.reject(err);
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
var _default = exports.default = PreLoginMetricsBatcher;
|
|
81
|
+
//# sourceMappingURL=prelogin-metrics-batcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_lodash","require","_batcher","_interopRequireDefault","_callDiagnosticMetrics","_utils","PRE_LOGIN_METRICS_IDENTIFIER","PreLoginMetricsBatcher","Batcher","extend","namespace","preLoginId","undefined","savePreLoginId","prepareItem","item","_promise","default","resolve","prepareDiagnosticMetricItem","webex","prepareRequest","queue","forEach","eventPayload","originTime","sent","Date","toISOString","submitHttpRequest","payload","_this","batchId","uniqueId","logger","error","concat","reject","Error","request","method","service","resource","headers","authorization","body","metrics","waitForServiceTimeout","config","then","res","log","catch","err","generateCommonErrorMetadata","_default","exports"],"sources":["prelogin-metrics-batcher.ts"],"sourcesContent":["import {uniqueId} from 'lodash';\nimport Batcher from './batcher';\nimport {prepareDiagnosticMetricItem} from './call-diagnostic/call-diagnostic-metrics.util';\nimport {generateCommonErrorMetadata} from './utils';\n\nconst PRE_LOGIN_METRICS_IDENTIFIER = 'Pre Login Metrics -->';\n\nconst PreLoginMetricsBatcher = Batcher.extend({\n namespace: 'Metrics',\n preLoginId: undefined,\n\n /**\n * Save the pre-login ID.\n * @param {string} preLoginId The pre-login ID to be saved.\n * @returns {void}\n */\n savePreLoginId(preLoginId) {\n this.preLoginId = preLoginId;\n },\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: any) {\n const batchId = uniqueId('prelogin-ca-batch-');\n if (this.preLoginId === undefined) {\n this.webex.logger.error(\n PRE_LOGIN_METRICS_IDENTIFIER,\n `PreLoginMetricsBatcher: @submitHttpRequest#${batchId}. PreLoginId is not set.`\n );\n\n return Promise.reject(new Error('PreLoginId is not set.'));\n }\n\n return this.webex\n .request({\n method: 'POST',\n service: 'metrics',\n resource: 'clientmetrics-prelogin',\n headers: {\n authorization: false,\n 'x-prelogin-userid': this.preLoginId,\n },\n body: {\n metrics: payload,\n },\n waitForServiceTimeout: this.webex.config.metrics.waitForServiceTimeout,\n })\n .then((res) => {\n this.webex.logger.log(\n PRE_LOGIN_METRICS_IDENTIFIER,\n `PreLoginMetricsBatcher: @submitHttpRequest#${batchId}. Request successful.`\n );\n\n return res;\n })\n .catch((err) => {\n this.webex.logger.error(\n PRE_LOGIN_METRICS_IDENTIFIER,\n `PreLoginMetricsBatcher: @submitHttpRequest#${batchId}. Request failed:`,\n `error: ${generateCommonErrorMetadata(err)}`\n );\n\n return Promise.reject(err);\n });\n },\n});\n\nexport default PreLoginMetricsBatcher;\n"],"mappings":"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"}
|
package/dist/types/batcher.d.ts
CHANGED
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { WebexPlugin } from '@webex/webex-core';
|
|
2
|
+
import { MetricEventNames, PreComputedLatencies } from '../metrics.types';
|
|
3
|
+
/**
|
|
4
|
+
* @description Helper class to store latencies timestamp and to calculate various latencies for CA.
|
|
5
|
+
* @exports
|
|
6
|
+
* @class CallDiagnosticLatencies
|
|
7
|
+
*/
|
|
8
|
+
export default class CallDiagnosticLatencies extends WebexPlugin {
|
|
9
|
+
latencyTimestamps: Map<MetricEventNames, number>;
|
|
10
|
+
precomputedLatencies: Map<PreComputedLatencies, number>;
|
|
11
|
+
private meetingId?;
|
|
12
|
+
/**
|
|
13
|
+
* @constructor
|
|
14
|
+
*/
|
|
15
|
+
constructor(...args: any[]);
|
|
16
|
+
/**
|
|
17
|
+
* Clear timestamps
|
|
18
|
+
*/
|
|
19
|
+
clearTimestamps(): void;
|
|
20
|
+
/**
|
|
21
|
+
* Associate current latencies with a meeting id
|
|
22
|
+
* @param meetingId
|
|
23
|
+
*/
|
|
24
|
+
private setMeetingId;
|
|
25
|
+
/**
|
|
26
|
+
* Returns the meeting object associated with current latencies
|
|
27
|
+
* @returns meeting object
|
|
28
|
+
*/
|
|
29
|
+
private getMeeting;
|
|
30
|
+
/**
|
|
31
|
+
* Store timestamp value
|
|
32
|
+
* @param key - key
|
|
33
|
+
* @param value - value
|
|
34
|
+
* @param options - store options
|
|
35
|
+
* @throws
|
|
36
|
+
* @returns
|
|
37
|
+
*/
|
|
38
|
+
saveTimestamp({ key, value, options, }: {
|
|
39
|
+
key: MetricEventNames;
|
|
40
|
+
value?: number;
|
|
41
|
+
options?: {
|
|
42
|
+
meetingId?: string;
|
|
43
|
+
};
|
|
44
|
+
}): void;
|
|
45
|
+
/**
|
|
46
|
+
* Store precomputed latency value
|
|
47
|
+
* @param key - key
|
|
48
|
+
* @param value - value
|
|
49
|
+
* @param accumulate - when it is true, it overwrites existing value with sum of the current value and the new measurement otherwise just store the new measurement
|
|
50
|
+
* @throws
|
|
51
|
+
* @returns
|
|
52
|
+
*/
|
|
53
|
+
saveLatency(key: PreComputedLatencies, value: number, accumulate?: boolean): void;
|
|
54
|
+
/**
|
|
55
|
+
* Measure latency for a request
|
|
56
|
+
* @param callback - callback for which you would like to measure latency
|
|
57
|
+
* @param key - key
|
|
58
|
+
* @param accumulate - when it is true, it overwrites existing value with sum of the current value and the new measurement otherwise just store the new measurement
|
|
59
|
+
* @returns
|
|
60
|
+
*/
|
|
61
|
+
measureLatency(callback: () => Promise<unknown>, key: PreComputedLatencies, accumulate?: boolean): Promise<unknown>;
|
|
62
|
+
/**
|
|
63
|
+
* Store only the first timestamp value for the given key
|
|
64
|
+
* @param key - key
|
|
65
|
+
* @param value -value
|
|
66
|
+
* @throws
|
|
67
|
+
* @returns
|
|
68
|
+
*/
|
|
69
|
+
saveFirstTimestampOnly(key: MetricEventNames, value?: number): void;
|
|
70
|
+
/**
|
|
71
|
+
* Helper to calculate end - start
|
|
72
|
+
* @param a start
|
|
73
|
+
* @param b end
|
|
74
|
+
* @returns latency
|
|
75
|
+
*/
|
|
76
|
+
getDiffBetweenTimestamps(a: MetricEventNames, b: MetricEventNames): number;
|
|
77
|
+
/**
|
|
78
|
+
* Meeting Info Request
|
|
79
|
+
* @note Meeting Info request happen not just in the join phase. CA requires
|
|
80
|
+
* metrics around meeting info request that are only part of join phase.
|
|
81
|
+
* This internal.* event is used to track the real timestamps
|
|
82
|
+
* (when the actual request/response happen). This is because the actual CA event is
|
|
83
|
+
* sent inside the join method on the meeting object based on some logic, but that's not exactly when
|
|
84
|
+
* those events are actually fired. The logic only confirms that they have happened, and we send them over.
|
|
85
|
+
* @returns - latency
|
|
86
|
+
*/
|
|
87
|
+
getMeetingInfoReqResp(): number;
|
|
88
|
+
/**
|
|
89
|
+
* Interstitial Time
|
|
90
|
+
* @returns - latency
|
|
91
|
+
*/
|
|
92
|
+
getShowInterstitialTime(): number;
|
|
93
|
+
/**
|
|
94
|
+
* getU2CTime
|
|
95
|
+
* @returns - latency
|
|
96
|
+
*/
|
|
97
|
+
getU2CTime(): number;
|
|
98
|
+
/**
|
|
99
|
+
* Device Register Time
|
|
100
|
+
* @returns - latency
|
|
101
|
+
*/
|
|
102
|
+
getRegisterWDMDeviceJMT(): number;
|
|
103
|
+
/**
|
|
104
|
+
* Call Init Join Request
|
|
105
|
+
* @returns - latency
|
|
106
|
+
*/
|
|
107
|
+
getCallInitJoinReq(): number;
|
|
108
|
+
/**
|
|
109
|
+
* Locus Join Request
|
|
110
|
+
* @returns - latency
|
|
111
|
+
*/
|
|
112
|
+
getJoinReqResp(): number;
|
|
113
|
+
/**
|
|
114
|
+
* Time taken to do turn discovery
|
|
115
|
+
* @returns - latency
|
|
116
|
+
*/
|
|
117
|
+
getTurnDiscoveryTime(): number;
|
|
118
|
+
/**
|
|
119
|
+
* Local SDP Generated Remote SDP REceived
|
|
120
|
+
* @returns - latency
|
|
121
|
+
*/
|
|
122
|
+
getLocalSDPGenRemoteSDPRecv(): number;
|
|
123
|
+
/**
|
|
124
|
+
* ICE Setup Time
|
|
125
|
+
* @returns - latency
|
|
126
|
+
*/
|
|
127
|
+
getICESetupTime(): number;
|
|
128
|
+
/**
|
|
129
|
+
* Audio ICE time
|
|
130
|
+
* @returns - latency
|
|
131
|
+
*/
|
|
132
|
+
getAudioICESetupTime(): number;
|
|
133
|
+
/**
|
|
134
|
+
* Video ICE Time
|
|
135
|
+
* @returns - latency
|
|
136
|
+
*/
|
|
137
|
+
getVideoICESetupTime(): number;
|
|
138
|
+
/**
|
|
139
|
+
* Share ICE Time
|
|
140
|
+
* @returns - latency
|
|
141
|
+
*/
|
|
142
|
+
getShareICESetupTime(): number;
|
|
143
|
+
/**
|
|
144
|
+
* Stay Lobby Time
|
|
145
|
+
* @returns - latency
|
|
146
|
+
*/
|
|
147
|
+
getStayLobbyTime(): number;
|
|
148
|
+
/**
|
|
149
|
+
* Page JMT
|
|
150
|
+
* @returns - latency
|
|
151
|
+
*/
|
|
152
|
+
getPageJMT(): number;
|
|
153
|
+
/**
|
|
154
|
+
* Download Time JMT
|
|
155
|
+
* @returns - latency
|
|
156
|
+
*/
|
|
157
|
+
getDownloadTimeJMT(): number;
|
|
158
|
+
/**
|
|
159
|
+
* Click To Interstitial
|
|
160
|
+
* @returns - latency
|
|
161
|
+
*/
|
|
162
|
+
getClickToInterstitial(): number;
|
|
163
|
+
/**
|
|
164
|
+
* Interstitial To Join Ok
|
|
165
|
+
* @returns - latency
|
|
166
|
+
*/
|
|
167
|
+
getInterstitialToJoinOK(): number;
|
|
168
|
+
/**
|
|
169
|
+
* Call Init To MediaEngineReady
|
|
170
|
+
* @returns - latency
|
|
171
|
+
*/
|
|
172
|
+
getCallInitMediaEngineReady(): number;
|
|
173
|
+
/**
|
|
174
|
+
* Interstitial To Media Ok
|
|
175
|
+
* @returns - latency
|
|
176
|
+
*/
|
|
177
|
+
getInterstitialToMediaOKJMT(): number;
|
|
178
|
+
/**
|
|
179
|
+
* Total JMT
|
|
180
|
+
* @returns - latency
|
|
181
|
+
*/
|
|
182
|
+
getTotalJMT(): number;
|
|
183
|
+
/**
|
|
184
|
+
* Join Conf JMT
|
|
185
|
+
* @returns - latency
|
|
186
|
+
*/
|
|
187
|
+
getJoinConfJMT(): number;
|
|
188
|
+
/**
|
|
189
|
+
* Total Media JMT
|
|
190
|
+
* @returns - latency
|
|
191
|
+
*/
|
|
192
|
+
getTotalMediaJMT(): number;
|
|
193
|
+
/**
|
|
194
|
+
* Client JMT
|
|
195
|
+
* @returns - latency
|
|
196
|
+
*/
|
|
197
|
+
getClientJMT(): number;
|
|
198
|
+
/**
|
|
199
|
+
* Audio setup delay receive
|
|
200
|
+
*/
|
|
201
|
+
getAudioJoinRespRxStart(): number;
|
|
202
|
+
/**
|
|
203
|
+
* Video setup delay receive
|
|
204
|
+
*/
|
|
205
|
+
getVideoJoinRespRxStart(): number;
|
|
206
|
+
/**
|
|
207
|
+
* Total latency for all get cluster request.
|
|
208
|
+
*/
|
|
209
|
+
getReachabilityClustersReqResp(): number;
|
|
210
|
+
/**
|
|
211
|
+
* Audio setup delay transmit
|
|
212
|
+
*/
|
|
213
|
+
getAudioJoinRespTxStart(): number;
|
|
214
|
+
/**
|
|
215
|
+
* Video setup delay transmit
|
|
216
|
+
*/
|
|
217
|
+
getVideoJoinRespTxStart(): number;
|
|
218
|
+
/**
|
|
219
|
+
* Total latency for all exchange ci token.
|
|
220
|
+
*/
|
|
221
|
+
getExchangeCITokenJMT(): number;
|
|
222
|
+
/**
|
|
223
|
+
* Total latency for all refresh captcha requests.
|
|
224
|
+
*/
|
|
225
|
+
getRefreshCaptchaReqResp(): number;
|
|
226
|
+
/**
|
|
227
|
+
* Get the latency for downloading intelligence models.
|
|
228
|
+
* @returns - latency
|
|
229
|
+
*/
|
|
230
|
+
getDownloadIntelligenceModelsReqResp(): number;
|
|
231
|
+
/**
|
|
232
|
+
* Get the total latency for all other app API requests.
|
|
233
|
+
* Excludes meeting info, because it's measured separately.
|
|
234
|
+
* @returns - latency
|
|
235
|
+
*/
|
|
236
|
+
getOtherAppApiReqResp(): number;
|
|
237
|
+
}
|