@webex/internal-plugin-metrics 3.0.0-beta.196 → 3.0.0-beta.198

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 (29) hide show
  1. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js +5 -83
  2. package/dist/call-diagnostic/call-diagnostic-metrics-batcher.js.map +1 -1
  3. package/dist/call-diagnostic/call-diagnostic-metrics.js +76 -3
  4. package/dist/call-diagnostic/call-diagnostic-metrics.js.map +1 -1
  5. package/dist/call-diagnostic/call-diagnostic-metrics.util.js +120 -1
  6. package/dist/call-diagnostic/call-diagnostic-metrics.util.js.map +1 -1
  7. package/dist/call-diagnostic/generated-types-temp/ClientEvent.js.map +1 -1
  8. package/dist/call-diagnostic/generated-types-temp/Event.js.map +1 -1
  9. package/dist/metrics.js +1 -1
  10. package/dist/metrics.types.js.map +1 -1
  11. package/dist/new-metrics.js +64 -0
  12. package/dist/new-metrics.js.map +1 -1
  13. package/dist/types/call-diagnostic/call-diagnostic-metrics.d.ts +24 -0
  14. package/dist/types/call-diagnostic/call-diagnostic-metrics.util.d.ts +21 -0
  15. package/dist/types/call-diagnostic/generated-types-temp/ClientEvent.d.ts +135 -135
  16. package/dist/types/call-diagnostic/generated-types-temp/Event.d.ts +379 -379
  17. package/dist/types/metrics.types.d.ts +5 -0
  18. package/dist/types/new-metrics.d.ts +36 -0
  19. package/package.json +8 -8
  20. package/src/call-diagnostic/call-diagnostic-metrics-batcher.ts +2 -99
  21. package/src/call-diagnostic/call-diagnostic-metrics.ts +64 -2
  22. package/src/call-diagnostic/call-diagnostic-metrics.util.ts +132 -1
  23. package/src/call-diagnostic/generated-types-temp/ClientEvent.ts +1360 -1322
  24. package/src/call-diagnostic/generated-types-temp/Event.ts +3142 -3049
  25. package/src/metrics.types.ts +6 -0
  26. package/src/new-metrics.ts +52 -0
  27. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.ts +145 -46
  28. package/test/unit/spec/call-diagnostic/call-diagnostic-metrics.util.ts +262 -2
  29. package/test/unit/spec/new-metrics.ts +84 -22
@@ -1,13 +1,18 @@
1
1
  import {assert} from '@webex/test-helper-chai';
2
+ import sinon from 'sinon';
2
3
  import {
3
4
  clearEmptyKeysRecursively,
5
+ getBuildType,
4
6
  isLocusServiceErrorCode,
7
+ prepareDiagnosticMetricItem,
8
+ setMetricTimings,
5
9
  } from '../../../../src/call-diagnostic/call-diagnostic-metrics.util';
10
+ import CallDiagnosticLatencies from '../../../../src/call-diagnostic/call-diagnostic-metrics-latencies';
6
11
 
7
12
  describe('internal-plugin-metrics', () => {
8
13
  describe('clearEmptyKeysRecursively', () => {
9
14
  it('should clear empty objects and empty nested objects recursively', () => {
10
- const obj = {
15
+ const obj: any = {
11
16
  foo: '',
12
17
  bar: {},
13
18
  baz: [],
@@ -40,7 +45,7 @@ describe('internal-plugin-metrics', () => {
40
45
  });
41
46
 
42
47
  it('should handle nested empty objects and arrays', () => {
43
- const obj = {
48
+ const obj: any = {
44
49
  foo: {
45
50
  bar: {},
46
51
  baz: [],
@@ -73,4 +78,259 @@ describe('internal-plugin-metrics', () => {
73
78
  });
74
79
  });
75
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
+ });
76
336
  });
@@ -3,21 +3,21 @@ import {NewMetrics} from '@webex/internal-plugin-metrics';
3
3
  import MockWebex from '@webex/test-helper-mock-webex';
4
4
  import sinon from 'sinon';
5
5
 
6
- describe("internal-plugin-metrics", () => {
7
- describe("new-metrics", () => {
6
+ describe('internal-plugin-metrics', () => {
7
+ describe('new-metrics', () => {
8
8
  let webex;
9
9
 
10
10
  beforeEach(() => {
11
11
  //@ts-ignore
12
12
  webex = new MockWebex({
13
13
  children: {
14
- newMetrics: NewMetrics
14
+ newMetrics: NewMetrics,
15
15
  },
16
16
  meetings: {
17
17
  meetingCollection: {
18
- get: sinon.stub()
19
- }
20
- }
18
+ get: sinon.stub(),
19
+ },
20
+ },
21
21
  });
22
22
 
23
23
  webex.emit('ready');
@@ -26,6 +26,9 @@ describe("internal-plugin-metrics", () => {
26
26
  webex.internal.newMetrics.callDiagnosticLatencies.clearTimestamps = sinon.stub();
27
27
  webex.internal.newMetrics.callDiagnosticMetrics.submitClientEvent = sinon.stub();
28
28
  webex.internal.newMetrics.callDiagnosticMetrics.submitMQE = sinon.stub();
29
+ webex.internal.newMetrics.callDiagnosticMetrics.buildClientEventFetchRequestOptions =
30
+ sinon.stub();
31
+ webex.setTimingsAndFetch = sinon.stub();
29
32
  });
30
33
 
31
34
  it('submits Client Event successfully', () => {
@@ -36,10 +39,10 @@ describe("internal-plugin-metrics", () => {
36
39
  },
37
40
  });
38
41
 
39
- assert.calledWith(
40
- webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp,
41
- {key: 'client.alert.displayed', options: {meetingId: '123'}}
42
- );
42
+ assert.calledWith(webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp, {
43
+ key: 'client.alert.displayed',
44
+ options: {meetingId: '123'},
45
+ });
43
46
  assert.calledWith(webex.internal.newMetrics.callDiagnosticMetrics.submitClientEvent, {
44
47
  name: 'client.alert.displayed',
45
48
  payload: undefined,
@@ -54,20 +57,22 @@ describe("internal-plugin-metrics", () => {
54
57
  payload: {intervals: [{}]},
55
58
  options: {
56
59
  meetingId: '123',
57
- networkType: 'wifi'
58
- }
60
+ networkType: 'wifi',
61
+ },
59
62
  });
60
63
 
61
- assert.calledWith(webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp, {key: 'client.mediaquality.event'})
64
+ assert.calledWith(webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp, {
65
+ key: 'client.mediaquality.event',
66
+ });
62
67
  assert.calledWith(webex.internal.newMetrics.callDiagnosticMetrics.submitMQE, {
63
68
  name: 'client.mediaquality.event',
64
69
  //@ts-ignore
65
70
  payload: {intervals: [{}]},
66
71
  options: {
67
72
  meetingId: '123',
68
- networkType: 'wifi'
69
- }
70
- })
73
+ networkType: 'wifi',
74
+ },
75
+ });
71
76
  });
72
77
 
73
78
  it('submits Internal Event successfully', () => {
@@ -75,8 +80,10 @@ describe("internal-plugin-metrics", () => {
75
80
  name: 'client.mediaquality.event',
76
81
  });
77
82
 
78
- assert.calledWith(webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp, {key: 'client.mediaquality.event'})
79
- assert.notCalled(webex.internal.newMetrics.callDiagnosticLatencies.clearTimestamps)
83
+ assert.calledWith(webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp, {
84
+ key: 'client.mediaquality.event',
85
+ });
86
+ assert.notCalled(webex.internal.newMetrics.callDiagnosticLatencies.clearTimestamps);
80
87
  });
81
88
 
82
89
  it('submits Internal Event successfully for clearing the join latencies', () => {
@@ -84,8 +91,63 @@ describe("internal-plugin-metrics", () => {
84
91
  name: 'internal.reset.join.latencies',
85
92
  });
86
93
 
87
- assert.notCalled(webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp)
88
- assert.calledOnce(webex.internal.newMetrics.callDiagnosticLatencies.clearTimestamps)
94
+ assert.notCalled(webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp);
95
+ assert.calledOnce(webex.internal.newMetrics.callDiagnosticLatencies.clearTimestamps);
96
+ });
97
+
98
+ describe('#buildClientEventFetchRequestOptions', () => {
99
+ it('builds client event fetch options successfully', () => {
100
+ webex.internal.newMetrics.buildClientEventFetchRequestOptions({
101
+ name: 'client.alert.displayed',
102
+ options: {
103
+ meetingId: '123',
104
+ },
105
+ });
106
+
107
+ assert.calledWith(
108
+ webex.internal.newMetrics.callDiagnosticMetrics.buildClientEventFetchRequestOptions,
109
+ {
110
+ name: 'client.alert.displayed',
111
+ payload: undefined,
112
+ options: {meetingId: '123'},
113
+ }
114
+ );
115
+ });
116
+ });
117
+
118
+ describe('#setMetricTimingsAndFetch', () => {
119
+ beforeEach(() => {
120
+ global.fetch = sinon.stub();
121
+ });
122
+
123
+ it('calls fetch with the expected options', () => {
124
+ const now = new Date();
125
+ sinon.useFakeTimers(now.getTime());
126
+
127
+ webex.internal.newMetrics.setMetricTimingsAndFetch({
128
+ body: {metrics: [{eventPayload: {}}]},
129
+ });
130
+
131
+ const expected = {
132
+ body: {
133
+ metrics: [
134
+ {
135
+ eventPayload: {
136
+ originTime: {
137
+ triggered: now.toISOString(),
138
+ sent: now.toISOString(),
139
+ },
140
+ },
141
+ },
142
+ ],
143
+ },
144
+ };
145
+
146
+ sinon.assert.calledOnce(webex.setTimingsAndFetch);
147
+ sinon.assert.calledWith(webex.setTimingsAndFetch, expected);
148
+
149
+ sinon.restore();
150
+ });
89
151
  });
90
- })
91
- })
152
+ });
153
+ });