@webex/internal-plugin-metrics 3.0.0-beta.37 → 3.0.0-beta.371

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 (68) hide show
  1. package/dist/batcher.js +2 -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 +456 -0
  6. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -0
  7. package/dist/call-diagnostic/call-diagnostic-metrics.js +838 -0
  8. package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -0
  9. package/dist/call-diagnostic/call-diagnostic-metrics.util.js +359 -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 +18 -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 +333 -0
  24. package/dist/new-metrics.js.map +1 -0
  25. package/dist/types/batcher.d.ts +2 -0
  26. package/dist/types/call-diagnostic/call-diagnostic-metrics-batcher.d.ts +2 -0
  27. package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +194 -0
  28. package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +418 -0
  29. package/dist/types/call-diagnostic/call-diagnostic-metrics.util.d.ts +103 -0
  30. package/dist/types/call-diagnostic/config.d.ts +178 -0
  31. package/dist/types/client-metrics-batcher.d.ts +2 -0
  32. package/dist/types/config.d.ts +36 -0
  33. package/dist/types/index.d.ts +13 -0
  34. package/dist/types/metrics.d.ts +3 -0
  35. package/dist/types/metrics.types.d.ts +104 -0
  36. package/dist/types/new-metrics.d.ts +139 -0
  37. package/dist/types/utils.d.ts +6 -0
  38. package/dist/utils.js +27 -0
  39. package/dist/utils.js.map +1 -0
  40. package/package.json +16 -8
  41. package/src/batcher.js +1 -0
  42. package/src/call-diagnostic/call-diagnostic-metrics-batcher.ts +75 -0
  43. package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +416 -0
  44. package/src/call-diagnostic/call-diagnostic-metrics.ts +898 -0
  45. package/src/call-diagnostic/call-diagnostic-metrics.util.ts +387 -0
  46. package/src/call-diagnostic/config.ts +685 -0
  47. package/src/client-metrics-batcher.js +1 -0
  48. package/src/config.js +1 -0
  49. package/src/index.ts +43 -0
  50. package/src/metrics.js +18 -24
  51. package/src/metrics.types.ts +160 -0
  52. package/src/new-metrics.ts +317 -0
  53. package/src/utils.ts +17 -0
  54. package/test/unit/spec/batcher.js +2 -0
  55. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +452 -0
  56. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +509 -0
  57. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +2174 -0
  58. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +622 -0
  59. package/test/unit/spec/client-metrics-batcher.js +2 -0
  60. package/test/unit/spec/metrics.js +66 -97
  61. package/test/unit/spec/new-metrics.ts +267 -0
  62. package/test/unit/spec/utils.ts +22 -0
  63. package/tsconfig.json +6 -0
  64. package/dist/call-diagnostic-events-batcher.js +0 -60
  65. package/dist/call-diagnostic-events-batcher.js.map +0 -1
  66. package/src/call-diagnostic-events-batcher.js +0 -62
  67. package/src/index.js +0 -17
  68. package/test/unit/spec/call-diagnostic-events-batcher.js +0 -195
@@ -0,0 +1,333 @@
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
+ 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); }; }
26
+ 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; } }
27
+ /**
28
+ * Metrics plugin to centralize all types of metrics.
29
+ * @class
30
+ */
31
+ var Metrics = /*#__PURE__*/function (_WebexPlugin) {
32
+ (0, _inherits2.default)(Metrics, _WebexPlugin);
33
+ var _super = _createSuper(Metrics);
34
+ // eslint-disable-next-line no-use-before-define
35
+
36
+ // Call Diagnostic latencies
37
+
38
+ // Helper classes to handle the different types of metrics
39
+
40
+ /**
41
+ * Constructor
42
+ * @param args
43
+ * @constructor
44
+ * @private
45
+ * @returns
46
+ */
47
+ function Metrics() {
48
+ var _this;
49
+ (0, _classCallCheck2.default)(this, Metrics);
50
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
51
+ args[_key] = arguments[_key];
52
+ }
53
+ _this = _super.call.apply(_super, [this].concat(args));
54
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "callDiagnosticLatencies", void 0);
55
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "callDiagnosticMetrics", void 0);
56
+ _this.onReady();
57
+ return _this;
58
+ }
59
+
60
+ /**
61
+ * On Ready
62
+ */
63
+ (0, _createClass2.default)(Metrics, [{
64
+ key: "onReady",
65
+ value: function onReady() {
66
+ var _this2 = this;
67
+ // @ts-ignore
68
+ this.webex.once('ready', function () {
69
+ // @ts-ignore
70
+ _this2.callDiagnosticMetrics = new _callDiagnosticMetrics.default({}, {
71
+ parent: _this2.webex
72
+ });
73
+ // @ts-ignore
74
+ _this2.callDiagnosticLatencies = new _callDiagnosticMetricsLatencies.default({}, {
75
+ parent: _this2.webex
76
+ });
77
+ });
78
+ }
79
+
80
+ /**
81
+ * Used for internal purposes only
82
+ * @param args
83
+ */
84
+ }, {
85
+ key: "submitInternalEvent",
86
+ value: function submitInternalEvent(_ref) {
87
+ var name = _ref.name,
88
+ payload = _ref.payload,
89
+ options = _ref.options;
90
+ if (name === 'internal.reset.join.latencies') {
91
+ this.callDiagnosticLatencies.clearTimestamps();
92
+ } else {
93
+ this.callDiagnosticLatencies.saveTimestamp({
94
+ key: name
95
+ });
96
+ }
97
+ }
98
+
99
+ /**
100
+ * Behavioral event
101
+ * @param args
102
+ */
103
+ }, {
104
+ key: "submitBehavioralEvent",
105
+ value: function submitBehavioralEvent(_ref2) {
106
+ var name = _ref2.name,
107
+ payload = _ref2.payload,
108
+ options = _ref2.options;
109
+ this.callDiagnosticLatencies.saveTimestamp({
110
+ key: name
111
+ });
112
+ throw new Error('Not implemented.');
113
+ }
114
+
115
+ /**
116
+ * Operational event
117
+ * @param args
118
+ */
119
+ }, {
120
+ key: "submitOperationalEvent",
121
+ value: function submitOperationalEvent(_ref3) {
122
+ var name = _ref3.name,
123
+ payload = _ref3.payload,
124
+ options = _ref3.options;
125
+ throw new Error('Not implemented.');
126
+ }
127
+
128
+ /**
129
+ * Call Analyzer: Media Quality Event
130
+ * @param args
131
+ */
132
+ }, {
133
+ key: "submitMQE",
134
+ value: function submitMQE(_ref4) {
135
+ var name = _ref4.name,
136
+ payload = _ref4.payload,
137
+ options = _ref4.options;
138
+ this.callDiagnosticLatencies.saveTimestamp({
139
+ key: name
140
+ });
141
+ this.callDiagnosticMetrics.submitMQE({
142
+ name: name,
143
+ payload: payload,
144
+ options: options
145
+ });
146
+ }
147
+
148
+ /**
149
+ * Call Analyzer: Feature Usage Event
150
+ * @param args
151
+ */
152
+ }, {
153
+ key: "submitFeatureEvent",
154
+ value: function submitFeatureEvent(_ref5) {
155
+ var name = _ref5.name,
156
+ payload = _ref5.payload,
157
+ options = _ref5.options;
158
+ throw new Error('Not implemented.');
159
+ }
160
+
161
+ /**
162
+ * Call Analyzer: Client Event
163
+ * @public
164
+ * @param args
165
+ */
166
+ }, {
167
+ key: "submitClientEvent",
168
+ value: function submitClientEvent(_ref6) {
169
+ var name = _ref6.name,
170
+ payload = _ref6.payload,
171
+ options = _ref6.options;
172
+ if (!this.callDiagnosticLatencies || !this.callDiagnosticMetrics) {
173
+ // @ts-ignore
174
+ this.webex.logger.log("NewMetrics: @submitClientEvent. Attempted to submit before webex.ready. Event name: ".concat(name));
175
+ return _promise.default.resolve();
176
+ }
177
+ this.callDiagnosticLatencies.saveTimestamp({
178
+ key: name,
179
+ options: {
180
+ meetingId: options === null || options === void 0 ? void 0 : options.meetingId
181
+ }
182
+ });
183
+ return this.callDiagnosticMetrics.submitClientEvent({
184
+ name: name,
185
+ payload: payload,
186
+ options: options
187
+ });
188
+ }
189
+
190
+ /**
191
+ * Submit a pre-login metric to clientmetrics
192
+ * @public
193
+ * @param payload
194
+ * @param preLoginId - pre-login ID of user
195
+ * @returns
196
+ */
197
+ }, {
198
+ key: "postPreLoginMetric",
199
+ value: function postPreLoginMetric(payload, preLoginId) {
200
+ var _this3 = this;
201
+ // @ts-ignore
202
+ return this.webex.request({
203
+ method: 'POST',
204
+ api: 'metrics',
205
+ resource: 'clientmetrics-prelogin',
206
+ headers: {
207
+ authorization: false,
208
+ 'x-prelogin-userid': preLoginId
209
+ },
210
+ body: {
211
+ metrics: [payload]
212
+ }
213
+ }).then(function (res) {
214
+ // @ts-ignore
215
+ _this3.webex.logger.log("NewMetrics: @postPreLoginMetric. Request successful.");
216
+ return res;
217
+ }).catch(function (err) {
218
+ // @ts-ignore
219
+ _this3.logger.error("NewMetrics: @postPreLoginMetric. Request failed:", "err: ".concat((0, _utils.generateCommonErrorMetadata)(err)));
220
+ return _promise.default.reject(err);
221
+ });
222
+ }
223
+
224
+ /**
225
+ * Issue request to alias a user's pre-login ID with their CI UUID
226
+ * @param {string} preLoginId
227
+ * @returns {Object} HttpResponse object
228
+ */
229
+ }, {
230
+ key: "clientMetricsAliasUser",
231
+ value: function clientMetricsAliasUser(preLoginId) {
232
+ var _this4 = this;
233
+ // @ts-ignore
234
+ return this.webex.request({
235
+ method: 'POST',
236
+ api: 'metrics',
237
+ resource: 'clientmetrics',
238
+ headers: {
239
+ 'x-prelogin-userid': preLoginId
240
+ },
241
+ body: {},
242
+ qs: {
243
+ alias: true
244
+ }
245
+ }).then(function (res) {
246
+ // @ts-ignore
247
+ _this4.webex.logger.log("NewMetrics: @clientMetricsAliasUser. Request successful.");
248
+ return res;
249
+ }).catch(function (err) {
250
+ // @ts-ignore
251
+ _this4.logger.error("NewMetrics: @clientMetricsAliasUser. Request failed:", "err: ".concat((0, _utils.generateCommonErrorMetadata)(err)));
252
+ return _promise.default.reject(err);
253
+ });
254
+ }
255
+
256
+ /**
257
+ * Returns a promise that will resolve to fetch options for submitting a metric.
258
+ *
259
+ * This is to support quickly submitting metrics when the browser/tab is closing.
260
+ * Calling submitClientEvent will not work because there some async steps that will
261
+ * not complete before the browser is closed. Instead, we pre-gather all the
262
+ * information/options needed for the request(s), and then simply and quickly
263
+ * fire the fetch(es) when beforeUnload is triggered.
264
+ *
265
+ * We must use fetch instead of request because fetch has a keepalive option that
266
+ * allows the request it to outlive the page.
267
+ *
268
+ * Note: the timings values will be wrong, but setMetricTimingsAndFetch() will
269
+ * properly adjust them before submitting.
270
+ *
271
+ * @public
272
+ * @param {Object} arg
273
+ * @param {String} arg.name - event name
274
+ * @param {Object} arg.payload - event payload
275
+ * @param {Object} arg.options - other options
276
+ * @returns {Promise} promise that resolves to options to be used with fetch
277
+ */
278
+ }, {
279
+ key: "buildClientEventFetchRequestOptions",
280
+ value: function () {
281
+ var _buildClientEventFetchRequestOptions = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(_ref7) {
282
+ var name, payload, options;
283
+ return _regenerator.default.wrap(function _callee$(_context) {
284
+ while (1) switch (_context.prev = _context.next) {
285
+ case 0:
286
+ name = _ref7.name, payload = _ref7.payload, options = _ref7.options;
287
+ return _context.abrupt("return", this.callDiagnosticMetrics.buildClientEventFetchRequestOptions({
288
+ name: name,
289
+ payload: payload,
290
+ options: options
291
+ }));
292
+ case 2:
293
+ case "end":
294
+ return _context.stop();
295
+ }
296
+ }, _callee, this);
297
+ }));
298
+ function buildClientEventFetchRequestOptions(_x) {
299
+ return _buildClientEventFetchRequestOptions.apply(this, arguments);
300
+ }
301
+ return buildClientEventFetchRequestOptions;
302
+ }()
303
+ /**
304
+ * Submits a metric from pre-built request options via the fetch API. Updates
305
+ * the "$timings" and "originTime" values to Date.now() since the existing times
306
+ * were set when the options were built (not submitted).
307
+ * @param {any} options - the pre-built request options for submitting a metric
308
+ * @returns {Promise} promise that resolves to the response object
309
+ */
310
+ }, {
311
+ key: "setMetricTimingsAndFetch",
312
+ value: function setMetricTimingsAndFetch(options) {
313
+ // @ts-ignore
314
+ return this.webex.setTimingsAndFetch((0, _callDiagnosticMetrics2.setMetricTimings)(options));
315
+ }
316
+
317
+ /**
318
+ * Returns true if the specified serviceErrorCode maps to an expected error.
319
+ * @param {number} serviceErrorCode the service error code
320
+ * @returns {boolean}
321
+ */
322
+ }, {
323
+ key: "isServiceErrorExpected",
324
+ value: function isServiceErrorExpected(serviceErrorCode) {
325
+ return this.callDiagnosticMetrics.isServiceErrorExpected(serviceErrorCode);
326
+ }
327
+ }]);
328
+ return Metrics;
329
+ }(_webexCore.WebexPlugin);
330
+ (0, _defineProperty2.default)(Metrics, "instance", void 0);
331
+ var _default = Metrics;
332
+ exports.default = _default;
333
+ //# sourceMappingURL=new-metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Metrics","args","onReady","webex","once","callDiagnosticMetrics","CallDiagnosticMetrics","parent","callDiagnosticLatencies","CallDiagnosticLatencies","name","payload","options","clearTimestamps","saveTimestamp","key","Error","submitMQE","logger","log","resolve","meetingId","submitClientEvent","preLoginId","request","method","api","resource","headers","authorization","body","metrics","then","res","catch","err","error","generateCommonErrorMetadata","reject","qs","alias","buildClientEventFetchRequestOptions","setTimingsAndFetch","setMetricTimings","serviceErrorCode","isServiceErrorExpected","WebexPlugin"],"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 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 // @ts-ignore\n this.callDiagnosticLatencies = new CallDiagnosticLatencies({}, {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 * Submit a pre-login metric to clientmetrics\n * @public\n * @param payload\n * @param preLoginId - pre-login ID of user\n * @returns\n */\n public postPreLoginMetric(payload: any, preLoginId: string): Promise<any> {\n // @ts-ignore\n return this.webex\n .request({\n method: 'POST',\n api: 'metrics',\n resource: 'clientmetrics-prelogin',\n headers: {\n authorization: false,\n 'x-prelogin-userid': preLoginId,\n },\n body: {\n metrics: [payload],\n },\n })\n .then((res) => {\n // @ts-ignore\n this.webex.logger.log(`NewMetrics: @postPreLoginMetric. Request successful.`);\n\n return res;\n })\n .catch((err) => {\n // @ts-ignore\n this.logger.error(\n `NewMetrics: @postPreLoginMetric. Request failed:`,\n `err: ${generateCommonErrorMetadata(err)}`\n );\n\n return Promise.reject(err);\n });\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,2 @@
1
+ export default MetricsBatcher;
2
+ declare const MetricsBatcher: any;
@@ -0,0 +1,2 @@
1
+ declare const CallDiagnosticEventsBatcher: any;
2
+ export default CallDiagnosticEventsBatcher;
@@ -0,0 +1,194 @@
1
+ import { WebexPlugin } from '@webex/webex-core';
2
+ import { MetricEventNames } 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<string, 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
+ * @throws
35
+ * @returns
36
+ */
37
+ saveTimestamp({ key, value, options, }: {
38
+ key: MetricEventNames;
39
+ value?: number;
40
+ options?: {
41
+ meetingId?: string;
42
+ };
43
+ }): void;
44
+ /**
45
+ * Store precomputed latency value
46
+ * @param key - key
47
+ * @param value -value
48
+ * @throws
49
+ * @returns
50
+ */
51
+ saveLatency(key: string, value: number): void;
52
+ /**
53
+ * Store only the first timestamp value for the given key
54
+ * @param key - key
55
+ * @param value -value
56
+ * @throws
57
+ * @returns
58
+ */
59
+ saveFirstTimestampOnly(key: MetricEventNames, value?: number): void;
60
+ /**
61
+ * Helper to calculate end - start
62
+ * @param a start
63
+ * @param b end
64
+ * @returns latency
65
+ */
66
+ getDiffBetweenTimestamps(a: MetricEventNames, b: MetricEventNames): number;
67
+ /**
68
+ * Meeting Info Request
69
+ * @note Meeting Info request happen not just in the join phase. CA requires
70
+ * metrics around meeting info request that are only part of join phase.
71
+ * This internal.* event is used to track the real timestamps
72
+ * (when the actual request/response happen). This is because the actual CA event is
73
+ * sent inside the join method on the meeting object based on some logic, but that's not exactly when
74
+ * those events are actually fired. The logic only confirms that they have happened, and we send them over.
75
+ * @returns - latency
76
+ */
77
+ getMeetingInfoReqResp(): number;
78
+ /**
79
+ * Interstitial Time
80
+ * @returns - latency
81
+ */
82
+ getShowInterstitialTime(): number;
83
+ /**
84
+ * Call Init Join Request
85
+ * @returns - latency
86
+ */
87
+ getCallInitJoinReq(): number;
88
+ /**
89
+ * Locus Join Request
90
+ * @returns - latency
91
+ */
92
+ getJoinReqResp(): number;
93
+ /**
94
+ * Locus Join Response Sent Received
95
+ * @returns - latency
96
+ */
97
+ getJoinRespSentReceived(): any;
98
+ /**
99
+ * Time taken to do turn discovery
100
+ * @returns - latency
101
+ */
102
+ getTurnDiscoveryTime(): number;
103
+ /**
104
+ * Local SDP Generated Remote SDP REceived
105
+ * @returns - latency
106
+ */
107
+ getLocalSDPGenRemoteSDPRecv(): number;
108
+ /**
109
+ * ICE Setup Time
110
+ * @returns - latency
111
+ */
112
+ getICESetupTime(): number;
113
+ /**
114
+ * Audio ICE time
115
+ * @returns - latency
116
+ */
117
+ getAudioICESetupTime(): number;
118
+ /**
119
+ * Video ICE Time
120
+ * @returns - latency
121
+ */
122
+ getVideoICESetupTime(): number;
123
+ /**
124
+ * Share ICE Time
125
+ * @returns - latency
126
+ */
127
+ getShareICESetupTime(): number;
128
+ /**
129
+ * Stay Lobby Time
130
+ * @returns - latency
131
+ */
132
+ getStayLobbyTime(): number;
133
+ /**
134
+ * Page JMT
135
+ * @returns - latency
136
+ */
137
+ getPageJMT(): number;
138
+ /**
139
+ * Click To Interstitial
140
+ * @returns - latency
141
+ */
142
+ getClickToInterstitial(): number;
143
+ /**
144
+ * Interstitial To Join Ok
145
+ * @returns - latency
146
+ */
147
+ getInterstitialToJoinOK(): number;
148
+ /**
149
+ * Call Init To MediaEngineReady
150
+ * @returns - latency
151
+ */
152
+ getCallInitMediaEngineReady(): number;
153
+ /**
154
+ * Interstitial To Media Ok
155
+ * @returns - latency
156
+ */
157
+ getInterstitialToMediaOKJMT(): number;
158
+ /**
159
+ * Total JMT
160
+ * @returns - latency
161
+ */
162
+ getTotalJMT(): number;
163
+ /**
164
+ * Join Conf JMT
165
+ * @returns - latency
166
+ */
167
+ getJoinConfJMT(): number;
168
+ /**
169
+ * Total Media JMT
170
+ * @returns - latency
171
+ */
172
+ getTotalMediaJMT(): number;
173
+ /**
174
+ * Client JMT
175
+ * @returns - latency
176
+ */
177
+ getClientJMT(): number;
178
+ /**
179
+ * Audio setup delay receive
180
+ */
181
+ getAudioJoinRespRxStart(): number;
182
+ /**
183
+ * Video setup delay receive
184
+ */
185
+ getVideoJoinRespRxStart(): number;
186
+ /**
187
+ * Audio setup delay transmit
188
+ */
189
+ getAudioJoinRespTxStart(): number;
190
+ /**
191
+ * Video setup delay transmit
192
+ */
193
+ getVideoJoinRespTxStart(): number;
194
+ }