@webex/plugin-meetings 3.0.0-next.3 → 3.0.0-next.30

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 (130) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/config.d.ts +1 -0
  4. package/dist/config.js +2 -1
  5. package/dist/config.js.map +1 -1
  6. package/dist/constants.d.ts +3 -4
  7. package/dist/constants.js +2 -2
  8. package/dist/constants.js.map +1 -1
  9. package/dist/index.d.ts +1 -1
  10. package/dist/index.js +6 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/interpretation/index.js +3 -3
  13. package/dist/interpretation/index.js.map +1 -1
  14. package/dist/interpretation/siLanguage.js +1 -1
  15. package/dist/locus-info/mediaSharesUtils.js +15 -1
  16. package/dist/locus-info/mediaSharesUtils.js.map +1 -1
  17. package/dist/locus-info/selfUtils.js +5 -0
  18. package/dist/locus-info/selfUtils.js.map +1 -1
  19. package/dist/media/MediaConnectionAwaiter.d.ts +61 -0
  20. package/dist/media/MediaConnectionAwaiter.js +163 -0
  21. package/dist/media/MediaConnectionAwaiter.js.map +1 -0
  22. package/dist/media/index.js +4 -1
  23. package/dist/media/index.js.map +1 -1
  24. package/dist/media/properties.js +4 -24
  25. package/dist/media/properties.js.map +1 -1
  26. package/dist/meeting/index.d.ts +18 -7
  27. package/dist/meeting/index.js +859 -674
  28. package/dist/meeting/index.js.map +1 -1
  29. package/dist/meeting/muteState.d.ts +2 -8
  30. package/dist/meeting/muteState.js +37 -25
  31. package/dist/meeting/muteState.js.map +1 -1
  32. package/dist/meeting/request.d.ts +3 -0
  33. package/dist/meeting/request.js +32 -23
  34. package/dist/meeting/request.js.map +1 -1
  35. package/dist/meeting/util.js +1 -0
  36. package/dist/meeting/util.js.map +1 -1
  37. package/dist/meeting-info/utilv2.js +4 -1
  38. package/dist/meeting-info/utilv2.js.map +1 -1
  39. package/dist/meetings/index.d.ts +8 -0
  40. package/dist/meetings/index.js +20 -0
  41. package/dist/meetings/index.js.map +1 -1
  42. package/dist/multistream/mediaRequestManager.d.ts +1 -2
  43. package/dist/multistream/mediaRequestManager.js.map +1 -1
  44. package/dist/multistream/remoteMediaGroup.d.ts +1 -1
  45. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  46. package/dist/multistream/remoteMediaManager.d.ts +1 -2
  47. package/dist/multistream/remoteMediaManager.js.map +1 -1
  48. package/dist/multistream/sendSlotManager.d.ts +1 -2
  49. package/dist/multistream/sendSlotManager.js.map +1 -1
  50. package/dist/reachability/clusterReachability.d.ts +1 -0
  51. package/dist/reachability/clusterReachability.js +29 -15
  52. package/dist/reachability/clusterReachability.js.map +1 -1
  53. package/dist/reachability/index.d.ts +4 -0
  54. package/dist/reachability/index.js +18 -2
  55. package/dist/reachability/index.js.map +1 -1
  56. package/dist/reachability/request.js +12 -10
  57. package/dist/reachability/request.js.map +1 -1
  58. package/dist/reachability/util.d.ts +7 -0
  59. package/dist/reachability/util.js +19 -0
  60. package/dist/reachability/util.js.map +1 -1
  61. package/dist/reconnection-manager/index.js +2 -1
  62. package/dist/reconnection-manager/index.js.map +1 -1
  63. package/dist/roap/index.d.ts +10 -2
  64. package/dist/roap/index.js +15 -0
  65. package/dist/roap/index.js.map +1 -1
  66. package/dist/roap/request.js +2 -2
  67. package/dist/roap/request.js.map +1 -1
  68. package/dist/roap/turnDiscovery.d.ts +64 -17
  69. package/dist/roap/turnDiscovery.js +307 -126
  70. package/dist/roap/turnDiscovery.js.map +1 -1
  71. package/dist/statsAnalyzer/index.js +53 -30
  72. package/dist/statsAnalyzer/index.js.map +1 -1
  73. package/dist/webinar/index.js +1 -1
  74. package/package.json +22 -22
  75. package/src/config.ts +1 -0
  76. package/src/constants.ts +3 -3
  77. package/src/index.ts +1 -0
  78. package/src/interpretation/index.ts +2 -2
  79. package/src/locus-info/mediaSharesUtils.ts +16 -0
  80. package/src/locus-info/selfUtils.ts +5 -0
  81. package/src/media/MediaConnectionAwaiter.ts +174 -0
  82. package/src/media/index.ts +3 -1
  83. package/src/media/properties.ts +6 -31
  84. package/src/meeting/index.ts +283 -105
  85. package/src/meeting/muteState.ts +34 -20
  86. package/src/meeting/request.ts +18 -2
  87. package/src/meeting/util.ts +1 -0
  88. package/src/meeting-info/utilv2.ts +2 -1
  89. package/src/meetings/index.ts +18 -0
  90. package/src/multistream/mediaRequestManager.ts +1 -1
  91. package/src/multistream/remoteMediaGroup.ts +1 -1
  92. package/src/multistream/remoteMediaManager.ts +1 -2
  93. package/src/multistream/sendSlotManager.ts +1 -2
  94. package/src/reachability/clusterReachability.ts +20 -5
  95. package/src/reachability/index.ts +24 -1
  96. package/src/reachability/request.ts +15 -11
  97. package/src/reachability/util.ts +21 -0
  98. package/src/reconnection-manager/index.ts +1 -1
  99. package/src/roap/index.ts +25 -3
  100. package/src/roap/request.ts +2 -2
  101. package/src/roap/turnDiscovery.ts +244 -78
  102. package/src/statsAnalyzer/index.ts +63 -27
  103. package/test/integration/spec/journey.js +14 -14
  104. package/test/integration/spec/space-meeting.js +1 -1
  105. package/test/unit/spec/interpretation/index.ts +4 -1
  106. package/test/unit/spec/locus-info/mediaSharesUtils.ts +9 -0
  107. package/test/unit/spec/locus-info/selfUtils.js +35 -0
  108. package/test/unit/spec/media/MediaConnectionAwaiter.ts +344 -0
  109. package/test/unit/spec/media/index.ts +89 -78
  110. package/test/unit/spec/media/properties.ts +16 -70
  111. package/test/unit/spec/meeting/index.js +618 -143
  112. package/test/unit/spec/meeting/muteState.js +219 -67
  113. package/test/unit/spec/meeting/request.js +21 -0
  114. package/test/unit/spec/meeting/utils.js +6 -1
  115. package/test/unit/spec/meeting-info/utilv2.js +6 -0
  116. package/test/unit/spec/meetings/index.js +40 -20
  117. package/test/unit/spec/multistream/remoteMediaGroup.ts +0 -1
  118. package/test/unit/spec/multistream/remoteMediaManager.ts +0 -1
  119. package/test/unit/spec/reachability/clusterReachability.ts +86 -22
  120. package/test/unit/spec/reachability/index.ts +197 -60
  121. package/test/unit/spec/reachability/request.js +15 -7
  122. package/test/unit/spec/reachability/util.ts +32 -2
  123. package/test/unit/spec/reconnection-manager/index.js +28 -0
  124. package/test/unit/spec/roap/index.ts +61 -6
  125. package/test/unit/spec/roap/turnDiscovery.ts +298 -16
  126. package/test/unit/spec/stats-analyzer/index.js +179 -0
  127. package/dist/member/member.types.d.ts +0 -11
  128. package/dist/member/member.types.js +0 -17
  129. package/dist/member/member.types.js.map +0 -1
  130. package/src/member/member.types.ts +0 -13
@@ -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
  });
@@ -1,11 +1,10 @@
1
1
  import {assert} from '@webex/test-helper-chai';
2
2
  import sinon from 'sinon';
3
- import {ConnectionState, Event} from '@webex/internal-media-core';
3
+ import {ConnectionState} from '@webex/internal-media-core';
4
4
  import MediaProperties from '@webex/plugin-meetings/src/media/properties';
5
- import MediaUtil from '@webex/plugin-meetings/src/media/util';
6
5
  import testUtils from '../../../utils/testUtils';
7
- import {ICE_AND_DTLS_CONNECTION_TIMEOUT} from '@webex/plugin-meetings/src/constants';
8
6
  import {Defer} from '@webex/common';
7
+ import MediaConnectionAwaiter from '../../../../src/media/MediaConnectionAwaiter';
9
8
 
10
9
  describe('MediaProperties', () => {
11
10
  let mediaProperties;
@@ -31,80 +30,27 @@ describe('MediaProperties', () => {
31
30
  sinon.restore();
32
31
  });
33
32
  describe('waitForMediaConnectionConnected', () => {
34
- it('resolves immediately if ice state is connected', async () => {
35
- await mediaProperties.waitForMediaConnectionConnected();
36
- });
37
- it('rejects after timeout if ice state does not reach connected/completed', async () => {
38
- mockMC.getConnectionState.returns(ConnectionState.Connecting);
39
-
40
- let promiseResolved = false;
41
- let promiseRejected = false;
42
-
43
- mediaProperties
44
- .waitForMediaConnectionConnected()
45
- .then(() => {
46
- promiseResolved = true;
47
- })
48
- .catch(() => {
49
- promiseRejected = true;
50
- });
51
-
52
- assert.equal(promiseResolved, false);
53
- assert.equal(promiseRejected, false);
54
-
55
- await clock.tickAsync(ICE_AND_DTLS_CONNECTION_TIMEOUT);
56
- await testUtils.flushPromises();
33
+ it('resolves if media connection is connected', async () => {
34
+ const waitForMediaConnectionConnectedResult = new Defer();
57
35
 
58
- assert.equal(promiseResolved, false);
59
- assert.equal(promiseRejected, true);
36
+ sinon
37
+ .stub(MediaConnectionAwaiter.prototype, 'waitForMediaConnectionConnected')
38
+ .returns(waitForMediaConnectionConnectedResult.promise);
60
39
 
61
- // check that listener was registered and removed
62
- assert.calledOnce(mockMC.on);
63
- assert.equal(mockMC.on.getCall(0).args[0], Event.CONNECTION_STATE_CHANGED);
64
- const listener = mockMC.on.getCall(0).args[1];
40
+ waitForMediaConnectionConnectedResult.resolve();
65
41
 
66
- assert.calledOnce(mockMC.off);
67
- assert.calledWith(mockMC.off, Event.CONNECTION_STATE_CHANGED, listener);
42
+ await mediaProperties.waitForMediaConnectionConnected();
68
43
  });
44
+ it('rejects if media connection is not connected', async () => {
45
+ const waitForMediaConnectionConnectedResult = new Defer();
69
46
 
70
- it(`resolves when media connection reaches "connected" state`, async () => {
71
- mockMC.getConnectionState.returns(ConnectionState.Connecting);
72
-
73
- const clearTimeoutSpy = sinon.spy(clock, 'clearTimeout');
74
-
75
- let promiseResolved = false;
76
- let promiseRejected = false;
77
-
78
- mediaProperties
79
- .waitForMediaConnectionConnected()
80
- .then(() => {
81
- promiseResolved = true;
82
- })
83
- .catch(() => {
84
- promiseRejected = true;
85
- });
86
-
87
- assert.equal(promiseResolved, false);
88
- assert.equal(promiseRejected, false);
89
-
90
- // check the right listener was registered
91
- assert.calledOnce(mockMC.on);
92
- assert.equal(mockMC.on.getCall(0).args[0], Event.CONNECTION_STATE_CHANGED);
93
- const listener = mockMC.on.getCall(0).args[1];
94
-
95
- // call the listener and pretend we are now connected
96
- mockMC.getConnectionState.returns(ConnectionState.Connected);
97
- listener();
98
- await testUtils.flushPromises();
99
-
100
- assert.equal(promiseResolved, true);
101
- assert.equal(promiseRejected, false);
47
+ sinon
48
+ .stub(MediaConnectionAwaiter.prototype, 'waitForMediaConnectionConnected')
49
+ .returns(waitForMediaConnectionConnectedResult.promise);
102
50
 
103
- // check that listener was removed
104
- assert.calledOnce(mockMC.off);
105
- assert.calledWith(mockMC.off, Event.CONNECTION_STATE_CHANGED, listener);
51
+ waitForMediaConnectionConnectedResult.reject();
106
52
 
107
- assert.calledOnce(clearTimeoutSpy);
53
+ await assert.isRejected(mediaProperties.waitForMediaConnectionConnected());
108
54
  });
109
55
  });
110
56