@webex/internal-plugin-metrics 3.0.0-beta.2 → 3.0.0-beta.200

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 (76) hide show
  1. package/README.md +1 -3
  2. package/dist/batcher.js +3 -22
  3. package/dist/batcher.js.map +1 -1
  4. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js +56 -0
  5. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js.map +1 -0
  6. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js +451 -0
  7. package/dist/call-diagnostic/call-diagnostic-metrics-latencies.js.map +1 -0
  8. package/dist/call-diagnostic/call-diagnostic-metrics.js +584 -0
  9. package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -0
  10. package/dist/call-diagnostic/call-diagnostic-metrics.util.js +225 -0
  11. package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -0
  12. package/dist/call-diagnostic/config.js +461 -0
  13. package/dist/call-diagnostic/config.js.map +1 -0
  14. package/dist/call-diagnostic/generated-types-temp/ClientEvent.js +7 -0
  15. package/dist/call-diagnostic/generated-types-temp/ClientEvent.js.map +1 -0
  16. package/dist/call-diagnostic/generated-types-temp/Event.js +7 -0
  17. package/dist/call-diagnostic/generated-types-temp/Event.js.map +1 -0
  18. package/dist/call-diagnostic/generated-types-temp/MediaQualityEvent.js +7 -0
  19. package/dist/call-diagnostic/generated-types-temp/MediaQualityEvent.js.map +1 -0
  20. package/dist/client-metrics-batcher.js +1 -7
  21. package/dist/client-metrics-batcher.js.map +1 -1
  22. package/dist/config.js +21 -5
  23. package/dist/config.js.map +1 -1
  24. package/dist/index.js +26 -10
  25. package/dist/index.js.map +1 -1
  26. package/dist/metrics.js +43 -80
  27. package/dist/metrics.js.map +1 -1
  28. package/dist/metrics.types.js +7 -0
  29. package/dist/metrics.types.js.map +1 -0
  30. package/dist/new-metrics.js +249 -0
  31. package/dist/new-metrics.js.map +1 -0
  32. package/dist/types/batcher.d.ts +2 -0
  33. package/dist/types/call-diagnostic/call-diagnostic-metrics-batcher.d.ts +2 -0
  34. package/dist/types/call-diagnostic/call-diagnostic-metrics-latencies.d.ts +189 -0
  35. package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +348 -0
  36. package/dist/types/call-diagnostic/call-diagnostic-metrics.util.d.ts +52 -0
  37. package/dist/types/call-diagnostic/config.d.ts +57 -0
  38. package/dist/types/call-diagnostic/generated-types-temp/ClientEvent.d.ts +1112 -0
  39. package/dist/types/call-diagnostic/generated-types-temp/Event.d.ts +4851 -0
  40. package/dist/types/call-diagnostic/generated-types-temp/MediaQualityEvent.d.ts +2121 -0
  41. package/dist/types/client-metrics-batcher.d.ts +2 -0
  42. package/dist/types/config.d.ts +35 -0
  43. package/dist/types/index.d.ts +11 -0
  44. package/dist/types/metrics.d.ts +3 -0
  45. package/dist/types/metrics.types.d.ts +92 -0
  46. package/dist/types/new-metrics.d.ts +119 -0
  47. package/package.json +12 -8
  48. package/src/batcher.js +33 -26
  49. package/src/call-diagnostic/call-diagnostic-metrics-batcher.ts +51 -0
  50. package/src/call-diagnostic/call-diagnostic-metrics-latencies.ts +408 -0
  51. package/src/call-diagnostic/call-diagnostic-metrics.ts +591 -0
  52. package/src/call-diagnostic/call-diagnostic-metrics.util.ts +233 -0
  53. package/src/call-diagnostic/config.ts +455 -0
  54. package/src/call-diagnostic/generated-types-temp/ClientEvent.ts +2395 -0
  55. package/src/call-diagnostic/generated-types-temp/Event.ts +7762 -0
  56. package/src/call-diagnostic/generated-types-temp/MediaQualityEvent.ts +2321 -0
  57. package/src/client-metrics-batcher.js +3 -4
  58. package/src/config.js +25 -5
  59. package/src/index.ts +39 -0
  60. package/src/metrics.js +44 -58
  61. package/src/metrics.types.ts +137 -0
  62. package/src/new-metrics.ts +223 -0
  63. package/test/unit/spec/batcher.js +26 -15
  64. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-batcher.ts +243 -0
  65. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics-latencies.ts +474 -0
  66. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +820 -0
  67. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +336 -0
  68. package/test/unit/spec/client-metrics-batcher.js +26 -15
  69. package/test/unit/spec/metrics.js +85 -116
  70. package/test/unit/spec/new-metrics.ts +153 -0
  71. package/tsconfig.json +6 -0
  72. package/dist/call-diagnostic-events-batcher.js +0 -70
  73. package/dist/call-diagnostic-events-batcher.js.map +0 -1
  74. package/src/call-diagnostic-events-batcher.js +0 -62
  75. package/src/index.js +0 -17
  76. package/test/unit/spec/call-diagnostic-events-batcher.js +0 -180
@@ -0,0 +1,336 @@
1
+ import {assert} from '@webex/test-helper-chai';
2
+ import sinon from 'sinon';
3
+ import {
4
+ clearEmptyKeysRecursively,
5
+ getBuildType,
6
+ isLocusServiceErrorCode,
7
+ prepareDiagnosticMetricItem,
8
+ setMetricTimings,
9
+ } from '../../../../src/call-diagnostic/call-diagnostic-metrics.util';
10
+ import CallDiagnosticLatencies from '../../../../src/call-diagnostic/call-diagnostic-metrics-latencies';
11
+
12
+ describe('internal-plugin-metrics', () => {
13
+ describe('clearEmptyKeysRecursively', () => {
14
+ it('should clear empty objects and empty nested objects recursively', () => {
15
+ const obj: any = {
16
+ foo: '',
17
+ bar: {},
18
+ baz: [],
19
+ nested: {
20
+ prop: {},
21
+ arr: ['test'],
22
+ },
23
+ };
24
+ clearEmptyKeysRecursively(obj);
25
+ console.log(obj);
26
+ assert.deepEqual(obj, {nested: {arr: ['test']}});
27
+ });
28
+
29
+ it('should not modify non-empty objects and arrays', () => {
30
+ const obj = {
31
+ foo: 'bar',
32
+ arr: [1, 2, 3],
33
+ };
34
+ clearEmptyKeysRecursively(obj);
35
+ assert.deepEqual(obj, {foo: 'bar', arr: [1, 2, 3]});
36
+ });
37
+
38
+ it('should not modify non-object and non-array values', () => {
39
+ const obj = {
40
+ prop1: 'value1',
41
+ prop2: 123,
42
+ };
43
+ clearEmptyKeysRecursively(obj);
44
+ assert.deepEqual(obj, {prop1: 'value1', prop2: 123});
45
+ });
46
+
47
+ it('should handle nested empty objects and arrays', () => {
48
+ const obj: any = {
49
+ foo: {
50
+ bar: {},
51
+ baz: [],
52
+ },
53
+ };
54
+ clearEmptyKeysRecursively(obj);
55
+ assert.deepEqual(obj, {foo: {}});
56
+ });
57
+
58
+ it('should handle an empty input object', () => {
59
+ const obj = {};
60
+ clearEmptyKeysRecursively(obj);
61
+ assert.deepEqual(obj, {});
62
+ });
63
+ });
64
+
65
+ describe('isLocusServiceErrorCode', () => {
66
+ [
67
+ [10000, false],
68
+ [2400000, true],
69
+ ['2400000', true],
70
+ [2400001, true],
71
+ ['2400001', true],
72
+ [240000, false],
73
+ [14000000, false],
74
+ ].forEach(([error, expected]) => {
75
+ it(`for code ${error} returns the correct result`, () => {
76
+ //@ts-ignore
77
+ assert.deepEqual(isLocusServiceErrorCode(error), expected);
78
+ });
79
+ });
80
+ });
81
+
82
+ describe('getBuildType', () => {
83
+ beforeEach(() => {
84
+ process.env.NODE_ENV = 'production';
85
+ });
86
+
87
+ [
88
+ ['https://localhost', 'test'],
89
+ ['https://127.0.0.1', 'test'],
90
+ ['https://web.webex.com', 'production'],
91
+ ].forEach(([webClientDomain, expected]) => {
92
+ it(`returns expected result for ${webClientDomain}`, () => {
93
+ assert.deepEqual(getBuildType(webClientDomain), expected);
94
+ });
95
+ });
96
+
97
+ it('returns "test" for NODE_ENV "foo"', () => {
98
+ process.env.NODE_ENV = 'foo';
99
+ assert.deepEqual(getBuildType('production'), 'test');
100
+ });
101
+ });
102
+
103
+ describe('prepareDiagnosticMetricItem', async () => {
104
+ let webex: any;
105
+
106
+ const check = (eventName: string, expectedEvent: any) => {
107
+ const eventPayload = {event: {name: eventName}};
108
+ const item = prepareDiagnosticMetricItem(webex, {
109
+ eventPayload,
110
+ type: ['diagnostic-event'],
111
+ });
112
+
113
+ assert.deepEqual(item, {
114
+ eventPayload: {
115
+ origin: {
116
+ buildType: 'production',
117
+ networkType: 'unknown',
118
+ },
119
+ event: {name: eventName, ...expectedEvent},
120
+ },
121
+ type: ['diagnostic-event'],
122
+ });
123
+ };
124
+
125
+ before(async () => {
126
+ webex = {internal: {newMetrics: {}}};
127
+ webex.internal.newMetrics.callDiagnosticLatencies = new CallDiagnosticLatencies(
128
+ {},
129
+ {parent: webex}
130
+ );
131
+ });
132
+
133
+ beforeEach(() => {
134
+ process.env.NODE_ENV = 'production';
135
+ });
136
+
137
+ afterEach(() => {
138
+ process.env.NODE_ENV = 'test';
139
+ });
140
+
141
+ [
142
+ ['client.exit.app', {}],
143
+ [
144
+ 'client.interstitial-window.launched',
145
+ {
146
+ joinTimes: {
147
+ clickToInterstitial: undefined,
148
+ meetingInfoReqResp: undefined,
149
+ },
150
+ },
151
+ ],
152
+ [
153
+ 'client.call.initiated',
154
+ {
155
+ joinTimes: {
156
+ showInterstitialTime: undefined,
157
+ meetingInfoReqResp: undefined,
158
+ },
159
+ },
160
+ ],
161
+ [
162
+ 'client.locus.join.response',
163
+ {
164
+ joinTimes: {
165
+ meetingInfoReqResp: undefined,
166
+ callInitJoinReq: undefined,
167
+ joinReqResp: undefined,
168
+ joinReqSentReceived: undefined,
169
+ pageJmt: undefined,
170
+ clickToInterstitial: undefined,
171
+ interstitialToJoinOK: undefined,
172
+ totalJmt: undefined,
173
+ clientJmt: undefined,
174
+ },
175
+ },
176
+ ],
177
+ [
178
+ 'client.ice.end',
179
+ {
180
+ joinTimes: {
181
+ ICESetupTime: undefined,
182
+ audioICESetupTime: undefined,
183
+ videoICESetupTime: undefined,
184
+ shareICESetupTime: undefined,
185
+ },
186
+ },
187
+ ],
188
+ [
189
+ 'client.media.rx.start',
190
+ {
191
+ joinTimes: {
192
+ localSDPGenRemoteSDPRecv: undefined,
193
+ },
194
+ },
195
+ ],
196
+ [
197
+ 'client.media-engine.ready',
198
+ {
199
+ joinTimes: {
200
+ totalMediaJMT: undefined,
201
+ interstitialToMediaOKJMT: undefined,
202
+ callInitMediaEngineReady: undefined,
203
+ stayLobbyTime: undefined,
204
+ },
205
+ },
206
+ ],
207
+ [
208
+ 'client.mediaquality.event',
209
+ {
210
+ audioSetupDelay: {
211
+ joinRespRxStart: undefined,
212
+ joinRespTxStart: undefined,
213
+ },
214
+ videoSetupDelay: {
215
+ joinRespRxStart: undefined,
216
+ joinRespTxStart: undefined,
217
+ },
218
+ },
219
+ ],
220
+ ].forEach(([eventName, expectedEvent]) => {
221
+ it(`returns expected result for ${eventName}`, () => {
222
+ check(eventName as string, expectedEvent);
223
+ });
224
+ });
225
+ });
226
+
227
+ describe('setMetricTimings', async () => {
228
+ let webex: any;
229
+
230
+ const check = (options: any, expectedOptions: any) => {
231
+ const newOptions = setMetricTimings(options);
232
+
233
+ assert.deepEqual(newOptions, expectedOptions);
234
+ };
235
+
236
+ it(`returns expected options`, () => {
237
+ const now = new Date();
238
+ sinon.useFakeTimers(now.getTime());
239
+
240
+ const options = {
241
+ body: {
242
+ metrics: [
243
+ {
244
+ eventPayload: {
245
+ originTime: {
246
+ triggered: 555,
247
+ sent: 666,
248
+ },
249
+ },
250
+ },
251
+ ],
252
+ },
253
+ };
254
+
255
+ const expectedOptions = {
256
+ body: {
257
+ metrics: [
258
+ {
259
+ eventPayload: {
260
+ originTime: {
261
+ triggered: now.toISOString(),
262
+ sent: now.toISOString(),
263
+ },
264
+ },
265
+ },
266
+ ],
267
+ },
268
+ };
269
+
270
+ check(options, expectedOptions);
271
+ sinon.restore();
272
+ });
273
+
274
+ it(`returns expected options for multiple metrics`, () => {
275
+ const now = new Date();
276
+ sinon.useFakeTimers(now.getTime());
277
+
278
+ const options = {
279
+ body: {
280
+ metrics: [
281
+ {
282
+ eventPayload: {
283
+ originTime: {
284
+ triggered: 555,
285
+ sent: 666,
286
+ },
287
+ },
288
+ },
289
+ {
290
+ eventPayload: {
291
+ originTime: {
292
+ triggered: 777,
293
+ sent: 888,
294
+ },
295
+ },
296
+ },
297
+ ],
298
+ },
299
+ };
300
+
301
+ const expectedOptions = {
302
+ body: {
303
+ metrics: [
304
+ {
305
+ eventPayload: {
306
+ originTime: {
307
+ triggered: now.toISOString(),
308
+ sent: now.toISOString(),
309
+ },
310
+ },
311
+ },
312
+ {
313
+ eventPayload: {
314
+ originTime: {
315
+ triggered: now.toISOString(),
316
+ sent: now.toISOString(),
317
+ },
318
+ },
319
+ },
320
+ ],
321
+ },
322
+ };
323
+
324
+ check(options, expectedOptions);
325
+ sinon.restore();
326
+ });
327
+
328
+ it(`does not throw when data missing`, () => {
329
+ const options = {};
330
+
331
+ const expectedOptions = {};
332
+
333
+ check(options, expectedOptions);
334
+ });
335
+ });
336
+ });
@@ -27,8 +27,8 @@ describe('plugin-metrics', () => {
27
27
  beforeEach(() => {
28
28
  webex = new MockWebex({
29
29
  children: {
30
- metrics: Metrics
31
- }
30
+ metrics: Metrics,
31
+ },
32
32
  });
33
33
 
34
34
  webex.config.metrics = config.metrics;
@@ -37,7 +37,7 @@ describe('plugin-metrics', () => {
37
37
  return Promise.resolve({
38
38
  statusCode: 204,
39
39
  body: undefined,
40
- options
40
+ options,
41
41
  });
42
42
  };
43
43
  sinon.spy(webex, 'request');
@@ -58,9 +58,10 @@ describe('plugin-metrics', () => {
58
58
  it('clears the queue', () => {
59
59
  clock.uninstall();
60
60
 
61
- return webex.internal.metrics.clientMetricsBatcher.request({
62
- key: 'testMetric'
63
- })
61
+ return webex.internal.metrics.clientMetricsBatcher
62
+ .request({
63
+ key: 'testMetric',
64
+ })
64
65
  .then(() => {
65
66
  assert.calledOnce(webex.request);
66
67
  assert.lengthOf(webex.internal.metrics.clientMetricsBatcher.queue, 0);
@@ -80,26 +81,28 @@ describe('plugin-metrics', () => {
80
81
 
81
82
  sinon.stub(webex, 'request').callsFake((options) => {
82
83
  options.headers = {
83
- trackingid: count
84
+ trackingid: count,
84
85
  };
85
86
 
86
87
  count += 1;
87
88
  if (count < 9) {
88
- return Promise.reject(new WebexHttpError.NetworkOrCORSError({
89
- statusCode: 0,
90
- options
91
- }));
89
+ return Promise.reject(
90
+ new WebexHttpError.NetworkOrCORSError({
91
+ statusCode: 0,
92
+ options,
93
+ })
94
+ );
92
95
  }
93
96
 
94
97
  return Promise.resolve({
95
98
  statusCode: 204,
96
99
  body: undefined,
97
- options
100
+ options,
98
101
  });
99
102
  });
100
103
 
101
104
  const promise = webex.internal.metrics.clientMetricsBatcher.request({
102
- key: 'testMetric'
105
+ key: 'testMetric',
103
106
  });
104
107
 
105
108
  return promiseTick(50)
@@ -159,8 +162,16 @@ describe('plugin-metrics', () => {
159
162
  .then(() => assert.lengthOf(webex.internal.metrics.clientMetricsBatcher.queue, 0))
160
163
  .then(() => promise)
161
164
  .then(() => {
162
- assert.lengthOf(webex.request.args[1][0].body.metrics, 1, 'Reenqueuing the metric once did not increase the number of metrics to be submitted');
163
- assert.lengthOf(webex.request.args[2][0].body.metrics, 1, 'Reenqueuing the metric twice did not increase the number of metrics to be submitted');
165
+ assert.lengthOf(
166
+ webex.request.args[1][0].body.metrics,
167
+ 1,
168
+ 'Reenqueuing the metric once did not increase the number of metrics to be submitted'
169
+ );
170
+ assert.lengthOf(
171
+ webex.request.args[2][0].body.metrics,
172
+ 1,
173
+ 'Reenqueuing the metric twice did not increase the number of metrics to be submitted'
174
+ );
164
175
  assert.lengthOf(webex.internal.metrics.clientMetricsBatcher.queue, 0);
165
176
  });
166
177
  });