@webex/plugin-meetings 2.60.0-next.1 → 2.60.0-next.2

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 (55) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/constants.js +1 -1
  4. package/dist/constants.js.map +1 -1
  5. package/dist/controls-options-manager/enums.js +2 -1
  6. package/dist/controls-options-manager/enums.js.map +1 -1
  7. package/dist/interpretation/index.js +1 -1
  8. package/dist/interpretation/siLanguage.js +1 -1
  9. package/dist/meeting/in-meeting-actions.js +2 -0
  10. package/dist/meeting/in-meeting-actions.js.map +1 -1
  11. package/dist/meeting/index.js +155 -103
  12. package/dist/meeting/index.js.map +1 -1
  13. package/dist/meeting-info/meeting-info-v2.js +3 -0
  14. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  15. package/dist/meeting-info/utilv2.js +14 -29
  16. package/dist/meeting-info/utilv2.js.map +1 -1
  17. package/dist/meetings/collection.js +17 -0
  18. package/dist/meetings/collection.js.map +1 -1
  19. package/dist/meetings/index.js +13 -0
  20. package/dist/meetings/index.js.map +1 -1
  21. package/dist/metrics/constants.js +1 -0
  22. package/dist/metrics/constants.js.map +1 -1
  23. package/dist/reconnection-manager/index.js +26 -26
  24. package/dist/reconnection-manager/index.js.map +1 -1
  25. package/dist/rtcMetrics/index.js +25 -0
  26. package/dist/rtcMetrics/index.js.map +1 -1
  27. package/dist/statsAnalyzer/index.js +21 -1
  28. package/dist/statsAnalyzer/index.js.map +1 -1
  29. package/dist/statsAnalyzer/mqaUtil.js +16 -16
  30. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  31. package/dist/webinar/index.js +1 -1
  32. package/package.json +21 -22
  33. package/src/constants.ts +10 -4
  34. package/src/controls-options-manager/enums.ts +2 -0
  35. package/src/meeting/in-meeting-actions.ts +4 -0
  36. package/src/meeting/index.ts +140 -92
  37. package/src/meeting-info/meeting-info-v2.ts +4 -0
  38. package/src/meeting-info/utilv2.ts +6 -19
  39. package/src/meetings/collection.ts +13 -0
  40. package/src/meetings/index.ts +11 -0
  41. package/src/metrics/constants.ts +1 -0
  42. package/src/reconnection-manager/index.ts +62 -66
  43. package/src/rtcMetrics/index.ts +24 -0
  44. package/src/statsAnalyzer/index.ts +30 -1
  45. package/src/statsAnalyzer/mqaUtil.ts +17 -14
  46. package/test/unit/spec/meeting/in-meeting-actions.ts +2 -0
  47. package/test/unit/spec/meeting/index.js +1058 -158
  48. package/test/unit/spec/meeting/muteState.js +2 -1
  49. package/test/unit/spec/meeting-info/meetinginfov2.js +28 -0
  50. package/test/unit/spec/meetings/collection.js +12 -0
  51. package/test/unit/spec/meetings/index.js +306 -118
  52. package/test/unit/spec/member/util.js +0 -31
  53. package/test/unit/spec/reconnection-manager/index.js +25 -10
  54. package/test/unit/spec/rtcMetrics/index.ts +20 -0
  55. package/test/unit/spec/stats-analyzer/index.js +12 -2
@@ -548,34 +548,3 @@ describe('extractMediaStatus', () => {
548
548
  assert.deepEqual(mediaStatus, {audio: 'RECVONLY', video: 'SENDRECV'});
549
549
  });
550
550
  });
551
-
552
- describe('extractMediaStatus', () => {
553
- it('throws error when there is no participant', () => {
554
- assert.throws(() => {
555
- MemberUtil.extractMediaStatus()
556
- }, 'Media status could not be extracted, participant is undefined.');
557
- });
558
-
559
- it('returns undefined media status when participant audio/video status is not present', () => {
560
- const participant = {
561
- status: {}
562
- };
563
-
564
- const mediaStatus = MemberUtil.extractMediaStatus(participant)
565
-
566
- assert.deepEqual(mediaStatus, {audio: undefined, video: undefined});
567
- });
568
-
569
- it('returns correct media status when participant audio/video status is present', () => {
570
- const participant = {
571
- status: {
572
- audioStatus: 'RECVONLY',
573
- videoStatus: 'SENDRECV'
574
- }
575
- };
576
-
577
- const mediaStatus = MemberUtil.extractMediaStatus(participant)
578
-
579
- assert.deepEqual(mediaStatus, {audio: 'RECVONLY', video: 'SENDRECV'});
580
- });
581
- });
@@ -3,6 +3,7 @@ import chai from 'chai';
3
3
  import chaiAsPromised from 'chai-as-promised';
4
4
  import sinon from 'sinon';
5
5
  import ReconnectionManager from '@webex/plugin-meetings/src/reconnection-manager';
6
+ import { RECONNECTION } from '../../../../src/constants';
6
7
 
7
8
  const {assert} = chai;
8
9
 
@@ -114,16 +115,6 @@ describe('plugin-meetings', () => {
114
115
  meetingId: rm.meeting.id,
115
116
  },
116
117
  });
117
-
118
- assert.calledWith(fakeMeeting.webex.internal.newMetrics.submitClientEvent, {
119
- name: 'client.media.recovered',
120
- payload: {
121
- recoveredBy: 'new',
122
- },
123
- options: {
124
- meetingId: rm.meeting.id,
125
- },
126
- });
127
118
  });
128
119
 
129
120
  it('does not clear previous requests and re-request media for non-multistream meetings', async () => {
@@ -309,6 +300,30 @@ describe('plugin-meetings', () => {
309
300
  assert.isTrue(reconnectionManager.iceState.disconnected);
310
301
  });
311
302
  });
303
+
304
+ describe('setStatus()', () => {
305
+ beforeEach(() => {
306
+ reconnectionManager.status = RECONNECTION.STATE.DEFAULT_STATUS;
307
+ });
308
+
309
+ it('should correctly change status to in progress', () => {
310
+ reconnectionManager.setStatus(RECONNECTION.STATE.IN_PROGRESS);
311
+
312
+ assert.equal(reconnectionManager.status, RECONNECTION.STATE.IN_PROGRESS);
313
+ });
314
+
315
+ it('should correctly change status to complete', () => {
316
+ reconnectionManager.setStatus(RECONNECTION.STATE.COMPLETE);
317
+
318
+ assert.equal(reconnectionManager.status, RECONNECTION.STATE.COMPLETE);
319
+ });
320
+
321
+ it('should correctly change status to failure', () => {
322
+ reconnectionManager.setStatus(RECONNECTION.STATE.FAILURE);
323
+
324
+ assert.equal(reconnectionManager.status, RECONNECTION.STATE.FAILURE);
325
+ });
326
+ });
312
327
  });
313
328
  });
314
329
  });
@@ -6,15 +6,26 @@ import RTC_METRICS from '../../../../src/rtcMetrics/constants';
6
6
 
7
7
  const FAKE_METRICS_ITEM = {payload: ['fake-metrics']};
8
8
 
9
+ const STATS_WITH_IP = '{\"id\":\"RTCIceCandidate_/kQs0ZNU\",\"type\":\"remote-candidate\",\"transportId\":\"RTCTransport_0_1\",\"isRemote\":true,\"ip\":\"11.22.111.255\",\"address\":\"11.22.111.255\",\"port\":5004,\"protocol\":\"udp\",\"candidateType\":\"host\",\"priority\":2130706431}';
10
+ const STATS_WITH_IP_RESULT = '{\"id\":\"RTCIceCandidate_/kQs0ZNU\",\"type\":\"remote-candidate\",\"transportId\":\"RTCTransport_0_1\",\"isRemote\":true,\"ip\":\"11.22.111.240\",\"address\":\"11.22.111.240\",\"port\":5004,\"protocol\":\"udp\",\"candidateType\":\"host\",\"priority\":2130706431}';
11
+
9
12
  describe('RtcMetrics', () => {
10
13
  let metrics: RtcMetrics;
11
14
  let webex: MockWebex;
12
15
  let clock;
16
+ let anonymizeIpSpy;
17
+
18
+ const sandbox = sinon.createSandbox();
13
19
 
14
20
  beforeEach(() => {
15
21
  clock = sinon.useFakeTimers();
16
22
  webex = new MockWebex();
17
23
  metrics = new RtcMetrics(webex, 'mock-meeting-id', 'mock-correlation-id');
24
+ anonymizeIpSpy = sandbox.spy(metrics, 'anonymizeIp');
25
+ });
26
+
27
+ afterEach(() => {
28
+ sandbox.restore();
18
29
  });
19
30
 
20
31
  it('sendMetrics should send a webex request', () => {
@@ -70,4 +81,13 @@ describe('RtcMetrics', () => {
70
81
 
71
82
  assert.callCount(webex.request, 1);
72
83
  });
84
+
85
+ it('should anonymize IP addresses', () => {
86
+ assert.strictEqual(metrics.anonymizeIp(STATS_WITH_IP), STATS_WITH_IP_RESULT);
87
+ });
88
+
89
+ it('should call anonymizeIp', () => {
90
+ metrics.addMetrics({ name: 'stats-report', payload: [STATS_WITH_IP] });
91
+ assert.calledOnce(anonymizeIpSpy);
92
+ })
73
93
  });
@@ -179,7 +179,7 @@ describe('plugin-meetings', () => {
179
179
  report: [
180
180
  {
181
181
  type: 'outbound-rtp',
182
- framesSent: 0,
182
+ framesSent: 1500,
183
183
  bytesSent: 1,
184
184
  },
185
185
  {
@@ -209,7 +209,7 @@ describe('plugin-meetings', () => {
209
209
  bytesReceived: 1,
210
210
  frameHeight: 720,
211
211
  frameWidth: 1280,
212
- framesReceived: 1,
212
+ framesReceived: 1500,
213
213
  },
214
214
  {
215
215
  type: 'candidate-pair',
@@ -437,6 +437,16 @@ describe('plugin-meetings', () => {
437
437
  assert.strictEqual(mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.MICROPHONE).information, _UNKNOWN_);
438
438
  assert.strictEqual(mqeData.intervalMetadata.peripherals.find((val) => val.name === MEDIA_DEVICES.CAMERA).information, _UNKNOWN_);
439
439
  });
440
+
441
+ it('emits the correct frameRate', async () => {
442
+ await startStatsAnalyzer({expected: {receiveVideo: true}});
443
+
444
+ await progressTime();
445
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].common.receivedFrameRate, 25);
446
+ fakeStats.video.receivers[0].framesReceived = 3000;
447
+ await progressTime();
448
+ assert.strictEqual(mqeData.videoReceive[0].streams[0].common.receivedFrameRate, 25);
449
+ });
440
450
  });
441
451
  });
442
452
  });