@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.
Files changed (78) hide show
  1. package/.eslintrc.js +6 -0
  2. package/babel.config.js +3 -0
  3. package/dist/batcher.js +41 -3
  4. package/dist/batcher.js.map +1 -1
  5. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js +64 -0
  6. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js.map +1 -0
  7. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +550 -0
  8. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -0
  9. package/dist/call-diagnostic/call-diagnostic-metrics.js +858 -0
  10. package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -0
  11. package/dist/call-diagnostic/call-diagnostic-metrics.util.js +356 -0
  12. package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -0
  13. package/dist/call-diagnostic/config.js +609 -0
  14. package/dist/call-diagnostic/config.js.map +1 -0
  15. package/dist/client-metrics-batcher.js +3 -3
  16. package/dist/client-metrics-batcher.js.map +1 -1
  17. package/dist/config.js +6 -9
  18. package/dist/config.js.map +1 -1
  19. package/dist/index.js +35 -2
  20. package/dist/index.js.map +1 -1
  21. package/dist/metrics.js +28 -22
  22. package/dist/metrics.js.map +1 -1
  23. package/dist/metrics.types.js +7 -0
  24. package/dist/metrics.types.js.map +1 -0
  25. package/dist/new-metrics.js +303 -0
  26. package/dist/new-metrics.js.map +1 -0
  27. package/dist/prelogin-metrics-batcher.js +81 -0
  28. package/dist/prelogin-metrics-batcher.js.map +1 -0
  29. package/dist/types/batcher.d.ts +5 -0
  30. package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +237 -0
  31. package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +425 -0
  32. package/dist/types/call-diagnostic/call-diagnostic-metrics.util.d.ts +103 -0
  33. package/dist/types/call-diagnostic/config.d.ts +178 -0
  34. package/dist/types/config.d.ts +18 -0
  35. package/dist/types/index.d.ts +15 -3
  36. package/dist/types/metrics.d.ts +1 -0
  37. package/dist/types/metrics.types.d.ts +107 -0
  38. package/dist/types/new-metrics.d.ts +131 -0
  39. package/dist/types/prelogin-metrics-batcher.d.ts +2 -0
  40. package/dist/types/utils.d.ts +6 -0
  41. package/dist/utils.js +26 -0
  42. package/dist/utils.js.map +1 -0
  43. package/jest.config.js +3 -0
  44. package/package.json +34 -10
  45. package/process +1 -0
  46. package/src/batcher.js +38 -0
  47. package/src/call-diagnostic/call-diagnostic-metrics-batcher.ts +72 -0
  48. package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +511 -0
  49. package/src/call-diagnostic/call-diagnostic-metrics.ts +925 -0
  50. package/src/call-diagnostic/call-diagnostic-metrics.util.ts +399 -0
  51. package/src/call-diagnostic/config.ts +685 -0
  52. package/src/client-metrics-batcher.js +1 -0
  53. package/src/config.js +1 -0
  54. package/src/index.ts +56 -0
  55. package/src/metrics.js +20 -16
  56. package/src/metrics.types.ts +179 -0
  57. package/src/new-metrics.ts +278 -0
  58. package/src/prelogin-metrics-batcher.ts +95 -0
  59. package/src/utils.ts +17 -0
  60. package/test/unit/spec/batcher.js +2 -0
  61. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +469 -0
  62. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +718 -0
  63. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +2371 -0
  64. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +637 -0
  65. package/test/unit/spec/client-metrics-batcher.js +2 -0
  66. package/test/unit/spec/metrics.js +76 -95
  67. package/test/unit/spec/new-metrics.ts +231 -0
  68. package/test/unit/spec/prelogin-metrics-batcher.ts +253 -0
  69. package/test/unit/spec/utils.ts +22 -0
  70. package/tsconfig.json +6 -0
  71. package/dist/call-diagnostic-events-batcher.js +0 -60
  72. package/dist/call-diagnostic-events-batcher.js.map +0 -1
  73. package/dist/internal-plugin-metrics.d.ts +0 -21
  74. package/dist/tsdoc-metadata.json +0 -11
  75. package/src/call-diagnostic-events-batcher.js +0 -62
  76. package/src/index.js +0 -17
  77. package/test/unit/spec/call-diagnostic-events-batcher.js +0 -195
  78. 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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"}
@@ -1,2 +1,7 @@
1
1
  export default MetricsBatcher;
2
+ /**
3
+ * @class
4
+ * @extends Batcher
5
+ * @memberof Metrics
6
+ */
2
7
  declare const MetricsBatcher: any;
@@ -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
+ }