@webex/plugin-meetings 3.0.0-next.2 → 3.0.0-next.21

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 (94) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/constants.d.ts +3 -9
  4. package/dist/constants.js +4 -9
  5. package/dist/constants.js.map +1 -1
  6. package/dist/index.d.ts +1 -1
  7. package/dist/index.js +6 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/interpretation/index.js +3 -3
  10. package/dist/interpretation/index.js.map +1 -1
  11. package/dist/interpretation/siLanguage.js +1 -1
  12. package/dist/locus-info/mediaSharesUtils.js +15 -1
  13. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  14. package/dist/media/index.js +4 -1
  15. package/dist/media/index.js.map +1 -1
  16. package/dist/mediaQualityMetrics/config.d.ts +9 -1
  17. package/dist/mediaQualityMetrics/config.js +10 -1
  18. package/dist/mediaQualityMetrics/config.js.map +1 -1
  19. package/dist/meeting/index.d.ts +18 -7
  20. package/dist/meeting/index.js +745 -567
  21. package/dist/meeting/index.js.map +1 -1
  22. package/dist/meeting/muteState.d.ts +2 -8
  23. package/dist/meeting/muteState.js +37 -25
  24. package/dist/meeting/muteState.js.map +1 -1
  25. package/dist/meeting/request.d.ts +3 -0
  26. package/dist/meeting/request.js +32 -23
  27. package/dist/meeting/request.js.map +1 -1
  28. package/dist/meeting/util.js +1 -0
  29. package/dist/meeting/util.js.map +1 -1
  30. package/dist/multistream/mediaRequestManager.d.ts +1 -2
  31. package/dist/multistream/mediaRequestManager.js.map +1 -1
  32. package/dist/multistream/remoteMediaGroup.d.ts +1 -1
  33. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  34. package/dist/multistream/remoteMediaManager.d.ts +1 -2
  35. package/dist/multistream/remoteMediaManager.js.map +1 -1
  36. package/dist/multistream/sendSlotManager.d.ts +1 -2
  37. package/dist/multistream/sendSlotManager.js.map +1 -1
  38. package/dist/reachability/request.js +12 -10
  39. package/dist/reachability/request.js.map +1 -1
  40. package/dist/reconnection-manager/index.js +2 -1
  41. package/dist/reconnection-manager/index.js.map +1 -1
  42. package/dist/roap/index.d.ts +10 -2
  43. package/dist/roap/index.js +15 -0
  44. package/dist/roap/index.js.map +1 -1
  45. package/dist/roap/request.js +3 -3
  46. package/dist/roap/request.js.map +1 -1
  47. package/dist/roap/turnDiscovery.d.ts +64 -17
  48. package/dist/roap/turnDiscovery.js +307 -126
  49. package/dist/roap/turnDiscovery.js.map +1 -1
  50. package/dist/statsAnalyzer/index.js +61 -41
  51. package/dist/statsAnalyzer/index.js.map +1 -1
  52. package/dist/webinar/index.js +1 -1
  53. package/package.json +22 -22
  54. package/src/constants.ts +3 -9
  55. package/src/index.ts +1 -0
  56. package/src/interpretation/index.ts +2 -2
  57. package/src/locus-info/mediaSharesUtils.ts +16 -0
  58. package/src/media/index.ts +3 -1
  59. package/src/mediaQualityMetrics/config.ts +11 -1
  60. package/src/meeting/index.ts +264 -90
  61. package/src/meeting/muteState.ts +34 -20
  62. package/src/meeting/request.ts +18 -2
  63. package/src/meeting/util.ts +1 -0
  64. package/src/multistream/mediaRequestManager.ts +1 -1
  65. package/src/multistream/remoteMediaGroup.ts +1 -1
  66. package/src/multistream/remoteMediaManager.ts +1 -2
  67. package/src/multistream/sendSlotManager.ts +1 -2
  68. package/src/reachability/request.ts +15 -11
  69. package/src/reconnection-manager/index.ts +1 -1
  70. package/src/roap/index.ts +25 -3
  71. package/src/roap/request.ts +3 -3
  72. package/src/roap/turnDiscovery.ts +244 -78
  73. package/src/statsAnalyzer/index.ts +72 -43
  74. package/test/integration/spec/journey.js +14 -14
  75. package/test/integration/spec/space-meeting.js +1 -1
  76. package/test/unit/spec/interpretation/index.ts +4 -1
  77. package/test/unit/spec/locus-info/mediaSharesUtils.ts +9 -0
  78. package/test/unit/spec/media/index.ts +89 -78
  79. package/test/unit/spec/meeting/index.js +611 -125
  80. package/test/unit/spec/meeting/muteState.js +219 -67
  81. package/test/unit/spec/meeting/request.js +21 -0
  82. package/test/unit/spec/meeting/utils.js +6 -1
  83. package/test/unit/spec/meetings/index.js +27 -20
  84. package/test/unit/spec/multistream/remoteMediaGroup.ts +0 -1
  85. package/test/unit/spec/multistream/remoteMediaManager.ts +0 -1
  86. package/test/unit/spec/reachability/request.js +15 -7
  87. package/test/unit/spec/reconnection-manager/index.js +28 -0
  88. package/test/unit/spec/roap/index.ts +61 -6
  89. package/test/unit/spec/roap/turnDiscovery.ts +298 -16
  90. package/test/unit/spec/stats-analyzer/index.js +183 -8
  91. package/dist/member/member.types.d.ts +0 -11
  92. package/dist/member/member.types.js +0 -17
  93. package/dist/member/member.types.js.map +0 -1
  94. package/src/member/member.types.ts +0 -13
@@ -432,11 +432,11 @@ skipInNode(describe)('plugin-meetings', () => {
432
432
  {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
433
433
  ]);
434
434
 
435
- localStreams.alice.microphone.setMuted(true);
435
+ localStreams.alice.microphone.setUserMuted(true);
436
436
 
437
437
  await membersUpdate;
438
438
 
439
- assert.equal(localStreams.alice.microphone.muted, true);
439
+ assert.equal(localStreams.alice.microphone.userMuted, true);
440
440
  });
441
441
 
442
442
  it('alice Audio unMute ', async () => {
@@ -451,11 +451,11 @@ skipInNode(describe)('plugin-meetings', () => {
451
451
  {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
452
452
  ]);
453
453
 
454
- localStreams.alice.microphone.setMuted(false);
454
+ localStreams.alice.microphone.setUserMuted(false);
455
455
 
456
456
  await membersUpdate;
457
457
 
458
- assert.equal(localStreams.alice.microphone.muted, false);
458
+ assert.equal(localStreams.alice.microphone.userMuted, false);
459
459
  });
460
460
 
461
461
  it('alice video mute', async () => {
@@ -470,11 +470,11 @@ skipInNode(describe)('plugin-meetings', () => {
470
470
  {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
471
471
  ]);
472
472
 
473
- localStreams.alice.camera.setMuted(true);
473
+ localStreams.alice.camera.setUserMuted(true);
474
474
 
475
475
  await membersUpdate;
476
476
 
477
- assert.equal(localStreams.alice.camera.muted, true);
477
+ assert.equal(localStreams.alice.camera.userMuted, true);
478
478
  });
479
479
 
480
480
  it('alice video unmute', async () => {
@@ -489,11 +489,11 @@ skipInNode(describe)('plugin-meetings', () => {
489
489
  {scope: bob.meeting.members, event: 'members:update', match: checkEvent},
490
490
  ]);
491
491
 
492
- localStreams.alice.camera.setMuted(false);
492
+ localStreams.alice.camera.setUserMuted(false);
493
493
 
494
494
  await membersUpdate;
495
495
 
496
- assert.equal(localStreams.alice.camera.muted, false);
496
+ assert.equal(localStreams.alice.camera.userMuted, false);
497
497
  });
498
498
 
499
499
  it('alice update Audio', async () => {
@@ -574,11 +574,11 @@ skipInNode(describe)('plugin-meetings', () => {
574
574
  ]);
575
575
 
576
576
  // first bob mutes himself
577
- localStreams.bob.microphone.setMuted(true);
577
+ localStreams.bob.microphone.setUserMuted(true);
578
578
 
579
579
  await membersUpdate;
580
580
 
581
- assert.equal(localStreams.bob.microphone.muted, true);
581
+ assert.equal(localStreams.bob.microphone.userMuted, true);
582
582
 
583
583
  // now alice tries to unmmute bob
584
584
  await testUtils.delayedPromise(alice.meeting.mute(bob.meeting.members.selfId, false))
@@ -593,7 +593,7 @@ skipInNode(describe)('plugin-meetings', () => {
593
593
  assert.fail('bob received unexpected meeting:self:unmutedByOthers event');
594
594
  })
595
595
  .catch(() => {
596
- assert.equal(localStreams.bob.microphone.muted, true);
596
+ assert.equal(localStreams.bob.microphone.userMuted, true);
597
597
  });
598
598
  });
599
599
 
@@ -607,11 +607,11 @@ skipInNode(describe)('plugin-meetings', () => {
607
607
  {scope: alice.meeting.members, event: 'members:update', match: checkEvent},
608
608
  ]);
609
609
 
610
- localStreams.bob.microphone.setMuted(false);
610
+ localStreams.bob.microphone.setUserMuted(false);
611
611
 
612
612
  await membersUpdate;
613
613
 
614
- assert.equal(localStreams.bob.microphone.muted, false);
614
+ assert.equal(localStreams.bob.microphone.userMuted, false);
615
615
  });
616
616
 
617
617
  it('alice shares the screen with highFrameRate', async () => {
@@ -871,7 +871,7 @@ skipInNode(describe)('plugin-meetings', () => {
871
871
  assert.equal(bob.meeting.shareStatus, 'whiteboard_share_active');
872
872
  }));
873
873
 
874
- it('alice adds chris as guest to 1:1 meeting', async() =>
874
+ it('alice adds chris as guest to 1:1 meeting', () =>
875
875
  Promise.all([
876
876
  testUtils.delayedPromise(alice.meeting.invite({emailAddress: chris.emailAddress})),
877
877
  testUtils.waitForEvents([
@@ -34,7 +34,7 @@ skipInNode(describe)('plugin-meetings', () => {
34
34
  describe('space-meeting', () => {
35
35
  let space = null;
36
36
 
37
- before(async () =>
37
+ before(() =>
38
38
  webexTestUsers
39
39
  .generateTestUsers({
40
40
  count: 4,
@@ -131,6 +131,7 @@ describe('plugin-meetings', () => {
131
131
  assert.equal(interpretation.receiveLanguage, 'en');
132
132
  assert.equal(interpretation.isActive, true);
133
133
  assert.equal(interpretation.order, 0);
134
+ assert.equal(interpretation.selfIsInterpreter, true);
134
135
 
135
136
  sampleData.interpretation = {
136
137
  originalLanguage: 'en',
@@ -141,13 +142,15 @@ describe('plugin-meetings', () => {
141
142
  assert.equal(interpretation.sourceLanguage, undefined);
142
143
  assert.equal(interpretation.targetLanguage, 'zh');
143
144
  assert.equal(interpretation.receiveLanguage, undefined);
145
+ assert.equal(interpretation.selfIsInterpreter, true);
144
146
 
145
147
  sampleData.interpretation = {
146
148
  order: 0,
147
149
  };
148
- assert.equal(interpretation.updateSelfInterpretation(sampleData), false);
150
+ assert.equal(interpretation.updateSelfInterpretation(sampleData), true);
149
151
  assert.equal(interpretation.originalLanguage, undefined);
150
152
  assert.equal(interpretation.targetLanguage, undefined);
153
+ assert.equal(interpretation.selfIsInterpreter, false);
151
154
  });
152
155
  });
153
156
 
@@ -20,6 +20,15 @@ describe('getContentUrl', () => {
20
20
  });
21
21
  });
22
22
 
23
+ describe('getContentResourceType', () => {
24
+ it('getContentResourceType return correct resourceType value', () => {
25
+ const stub = Sinon.stub(MediaSharesUtils, 'extractContent').returns({resourceType:'resourceType'});
26
+ const resourceType = MediaSharesUtils.getContentResourceType();
27
+ assert.equal(resourceType,'resourceType');
28
+ stub.restore();
29
+ });
30
+ });
31
+
23
32
  describe('getContentBeneficiaryDeviceUrl', () => {
24
33
  it('getContentBeneficiaryDeviceUrl return correct deviceUrl value', () => {
25
34
  const mockContentBeneficiaryDeviceUrl = "https://wdm-a.wbx2.com/wdm/api/v1/devices/e9ffd8a1-1fae-42d1-afbe-013e951f93ab"
@@ -170,37 +170,15 @@ describe('createMediaConnection', () => {
170
170
  );
171
171
  });
172
172
 
173
- it('passes empty ICE servers array to MultistreamRoapMediaConnection if turnServerInfo is undefined (multistream enabled)', () => {
174
- const multistreamRoapMediaConnectionConstructorStub = sinon
175
- .stub(internalMediaModule, 'MultistreamRoapMediaConnection')
176
- .returns(fakeRoapMediaConnection);
177
-
178
- Media.createMediaConnection(true, 'debug string', webex, 'meeting id', 'correlationId', {
179
- mediaProperties: {
180
- mediaDirection: {
181
- sendAudio: true,
182
- sendVideo: true,
183
- sendShare: false,
184
- receiveAudio: true,
185
- receiveVideo: true,
186
- receiveShare: true,
187
- },
188
- },
189
- });
190
- assert.calledOnce(multistreamRoapMediaConnectionConstructorStub);
191
- assert.calledWith(
192
- multistreamRoapMediaConnectionConstructorStub,
193
- {
194
- iceServers: [],
195
- },
196
- 'meeting id'
197
- );
198
-
199
- it('does not pass bundlePolicy to MultistreamRoapMediaConnection if bundlePolicy is undefined', () => {
173
+ [
174
+ {testCase: 'turnServerInfo is undefined', turnServerInfo: undefined},
175
+ {testCase: 'turnServerInfo.url is empty string', turnServerInfo: {url: '', username: 'turn username', password: 'turn password'}},
176
+ ].forEach(({testCase, turnServerInfo}) => {
177
+ it(`passes empty ICE servers array to MultistreamRoapMediaConnection if ${testCase} (multistream enabled)`, () => {
200
178
  const multistreamRoapMediaConnectionConstructorStub = sinon
201
179
  .stub(internalMediaModule, 'MultistreamRoapMediaConnection')
202
180
  .returns(fakeRoapMediaConnection);
203
-
181
+
204
182
  Media.createMediaConnection(true, 'debug string', webex, 'meeting id', 'correlationId', {
205
183
  mediaProperties: {
206
184
  mediaDirection: {
@@ -212,7 +190,7 @@ describe('createMediaConnection', () => {
212
190
  receiveShare: true,
213
191
  },
214
192
  },
215
- bundlePolicy: undefined,
193
+ turnServerInfo,
216
194
  });
217
195
  assert.calledOnce(multistreamRoapMediaConnectionConstructorStub);
218
196
  assert.calledWith(
@@ -221,75 +199,108 @@ describe('createMediaConnection', () => {
221
199
  iceServers: [],
222
200
  },
223
201
  'meeting id'
224
- );
202
+ );
225
203
  });
226
204
  });
227
-
228
- it('passes empty ICE servers array to RoapMediaConnection if turnServerInfo is undefined (multistream disabled)', () => {
229
- const roapMediaConnectionConstructorStub = sinon
230
- .stub(internalMediaModule, 'RoapMediaConnection')
205
+
206
+ it('does not pass bundlePolicy to MultistreamRoapMediaConnection if bundlePolicy is undefined', () => {
207
+ const multistreamRoapMediaConnectionConstructorStub = sinon
208
+ .stub(internalMediaModule, 'MultistreamRoapMediaConnection')
231
209
  .returns(fakeRoapMediaConnection);
232
210
 
233
- StaticConfig.set({bandwidth: {audio: 123, video: 456, startBitrate: 999}});
234
-
235
- const ENABLE_EXTMAP = false;
236
- const ENABLE_RTX = true;
237
-
238
- Media.createMediaConnection(false, 'some debug id', webex, 'meeting id', 'correlationId', {
211
+ Media.createMediaConnection(true, 'debug string', webex, 'meeting id', 'correlationId', {
239
212
  mediaProperties: {
240
213
  mediaDirection: {
241
214
  sendAudio: true,
242
215
  sendVideo: true,
243
- sendShare: true,
216
+ sendShare: false,
244
217
  receiveAudio: true,
245
218
  receiveVideo: true,
246
219
  receiveShare: true,
247
220
  },
248
- audioStream: fakeAudioStream,
249
- videoStream: null,
250
- shareVideoStream: fakeShareVideoStream,
251
- shareAudioStream: fakeShareAudioStream,
252
221
  },
253
- remoteQualityLevel: 'HIGH',
254
- enableRtx: ENABLE_RTX,
255
- enableExtmap: ENABLE_EXTMAP,
256
- turnServerInfo: undefined,
222
+ bundlePolicy: undefined,
257
223
  });
258
- assert.calledOnce(roapMediaConnectionConstructorStub);
224
+ assert.calledOnce(multistreamRoapMediaConnectionConstructorStub);
259
225
  assert.calledWith(
260
- roapMediaConnectionConstructorStub,
226
+ multistreamRoapMediaConnectionConstructorStub,
261
227
  {
262
228
  iceServers: [],
263
- skipInactiveTransceivers: false,
264
- requireH264: true,
265
- sdpMunging: {
266
- convertPort9to0: false,
267
- addContentSlides: true,
268
- bandwidthLimits: {
269
- audio: 123,
270
- video: 456,
229
+ },
230
+ 'meeting id'
231
+ );
232
+ });
233
+
234
+ [
235
+ {testCase: 'turnServerInfo is undefined', turnServerInfo: undefined},
236
+ {testCase: 'turnServerInfo.url is empty string', turnServerInfo: {url: '', username: 'turn username', password: 'turn password'}},
237
+ ].forEach(({testCase, turnServerInfo}) => {
238
+ it(`passes empty ICE servers array to RoapMediaConnection if ${testCase} (multistream disabled)`, () => {
239
+ const roapMediaConnectionConstructorStub = sinon
240
+ .stub(internalMediaModule, 'RoapMediaConnection')
241
+ .returns(fakeRoapMediaConnection);
242
+
243
+ StaticConfig.set({bandwidth: {audio: 123, video: 456, startBitrate: 999}});
244
+
245
+ const ENABLE_EXTMAP = false;
246
+ const ENABLE_RTX = true;
247
+
248
+ Media.createMediaConnection(false, 'some debug id', webex, 'meeting id', 'correlationId', {
249
+ mediaProperties: {
250
+ mediaDirection: {
251
+ sendAudio: true,
252
+ sendVideo: true,
253
+ sendShare: true,
254
+ receiveAudio: true,
255
+ receiveVideo: true,
256
+ receiveShare: true,
271
257
  },
272
- startBitrate: 999,
273
- periodicKeyframes: 20,
274
- disableExtmap: !ENABLE_EXTMAP,
275
- disableRtx: !ENABLE_RTX,
258
+ audioStream: fakeAudioStream,
259
+ videoStream: null,
260
+ shareVideoStream: fakeShareVideoStream,
261
+ shareAudioStream: fakeShareAudioStream,
276
262
  },
277
- },
278
- {
279
- localTracks: {
280
- audio: fakeTrack,
281
- video: undefined,
282
- screenShareVideo: fakeTrack,
283
- screenShareAudio: fakeTrack,
263
+ remoteQualityLevel: 'HIGH',
264
+ enableRtx: ENABLE_RTX,
265
+ enableExtmap: ENABLE_EXTMAP,
266
+ turnServerInfo,
267
+ });
268
+ assert.calledOnce(roapMediaConnectionConstructorStub);
269
+ assert.calledWith(
270
+ roapMediaConnectionConstructorStub,
271
+ {
272
+ iceServers: [],
273
+ skipInactiveTransceivers: false,
274
+ requireH264: true,
275
+ sdpMunging: {
276
+ convertPort9to0: false,
277
+ addContentSlides: true,
278
+ bandwidthLimits: {
279
+ audio: 123,
280
+ video: 456,
281
+ },
282
+ startBitrate: 999,
283
+ periodicKeyframes: 20,
284
+ disableExtmap: !ENABLE_EXTMAP,
285
+ disableRtx: !ENABLE_RTX,
286
+ },
284
287
  },
285
- direction: {
286
- audio: 'sendrecv',
287
- video: 'sendrecv',
288
- screenShareVideo: 'sendrecv',
288
+ {
289
+ localTracks: {
290
+ audio: fakeTrack,
291
+ video: undefined,
292
+ screenShareVideo: fakeTrack,
293
+ screenShareAudio: fakeTrack,
294
+ },
295
+ direction: {
296
+ audio: 'sendrecv',
297
+ video: 'sendrecv',
298
+ screenShareVideo: 'sendrecv',
299
+ },
300
+ remoteQualityLevel: 'HIGH',
289
301
  },
290
- remoteQualityLevel: 'HIGH',
291
- },
292
- 'some debug id'
293
- );
302
+ 'some debug id'
303
+ );
304
+ });
294
305
  });
295
306
  });