@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.
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/constants.d.ts +3 -9
- package/dist/constants.js +4 -9
- package/dist/constants.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/interpretation/index.js +3 -3
- package/dist/interpretation/index.js.map +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/mediaSharesUtils.js +15 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/media/index.js +4 -1
- package/dist/media/index.js.map +1 -1
- package/dist/mediaQualityMetrics/config.d.ts +9 -1
- package/dist/mediaQualityMetrics/config.js +10 -1
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/index.d.ts +18 -7
- package/dist/meeting/index.js +745 -567
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.d.ts +2 -8
- package/dist/meeting/muteState.js +37 -25
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.d.ts +3 -0
- package/dist/meeting/request.js +32 -23
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +1 -0
- package/dist/meeting/util.js.map +1 -1
- package/dist/multistream/mediaRequestManager.d.ts +1 -2
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.d.ts +1 -1
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.d.ts +1 -2
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/multistream/sendSlotManager.d.ts +1 -2
- package/dist/multistream/sendSlotManager.js.map +1 -1
- package/dist/reachability/request.js +12 -10
- package/dist/reachability/request.js.map +1 -1
- package/dist/reconnection-manager/index.js +2 -1
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/roap/index.d.ts +10 -2
- package/dist/roap/index.js +15 -0
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +3 -3
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.d.ts +64 -17
- package/dist/roap/turnDiscovery.js +307 -126
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/index.js +61 -41
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/webinar/index.js +1 -1
- package/package.json +22 -22
- package/src/constants.ts +3 -9
- package/src/index.ts +1 -0
- package/src/interpretation/index.ts +2 -2
- package/src/locus-info/mediaSharesUtils.ts +16 -0
- package/src/media/index.ts +3 -1
- package/src/mediaQualityMetrics/config.ts +11 -1
- package/src/meeting/index.ts +264 -90
- package/src/meeting/muteState.ts +34 -20
- package/src/meeting/request.ts +18 -2
- package/src/meeting/util.ts +1 -0
- package/src/multistream/mediaRequestManager.ts +1 -1
- package/src/multistream/remoteMediaGroup.ts +1 -1
- package/src/multistream/remoteMediaManager.ts +1 -2
- package/src/multistream/sendSlotManager.ts +1 -2
- package/src/reachability/request.ts +15 -11
- package/src/reconnection-manager/index.ts +1 -1
- package/src/roap/index.ts +25 -3
- package/src/roap/request.ts +3 -3
- package/src/roap/turnDiscovery.ts +244 -78
- package/src/statsAnalyzer/index.ts +72 -43
- package/test/integration/spec/journey.js +14 -14
- package/test/integration/spec/space-meeting.js +1 -1
- package/test/unit/spec/interpretation/index.ts +4 -1
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +9 -0
- package/test/unit/spec/media/index.ts +89 -78
- package/test/unit/spec/meeting/index.js +611 -125
- package/test/unit/spec/meeting/muteState.js +219 -67
- package/test/unit/spec/meeting/request.js +21 -0
- package/test/unit/spec/meeting/utils.js +6 -1
- package/test/unit/spec/meetings/index.js +27 -20
- package/test/unit/spec/multistream/remoteMediaGroup.ts +0 -1
- package/test/unit/spec/multistream/remoteMediaManager.ts +0 -1
- package/test/unit/spec/reachability/request.js +15 -7
- package/test/unit/spec/reconnection-manager/index.js +28 -0
- package/test/unit/spec/roap/index.ts +61 -6
- package/test/unit/spec/roap/turnDiscovery.ts +298 -16
- package/test/unit/spec/stats-analyzer/index.js +183 -8
- package/dist/member/member.types.d.ts +0 -11
- package/dist/member/member.types.js +0 -17
- package/dist/member/member.types.js.map +0 -1
- 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.
|
|
435
|
+
localStreams.alice.microphone.setUserMuted(true);
|
|
436
436
|
|
|
437
437
|
await membersUpdate;
|
|
438
438
|
|
|
439
|
-
assert.equal(localStreams.alice.microphone.
|
|
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.
|
|
454
|
+
localStreams.alice.microphone.setUserMuted(false);
|
|
455
455
|
|
|
456
456
|
await membersUpdate;
|
|
457
457
|
|
|
458
|
-
assert.equal(localStreams.alice.microphone.
|
|
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.
|
|
473
|
+
localStreams.alice.camera.setUserMuted(true);
|
|
474
474
|
|
|
475
475
|
await membersUpdate;
|
|
476
476
|
|
|
477
|
-
assert.equal(localStreams.alice.camera.
|
|
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.
|
|
492
|
+
localStreams.alice.camera.setUserMuted(false);
|
|
493
493
|
|
|
494
494
|
await membersUpdate;
|
|
495
495
|
|
|
496
|
-
assert.equal(localStreams.alice.camera.
|
|
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.
|
|
577
|
+
localStreams.bob.microphone.setUserMuted(true);
|
|
578
578
|
|
|
579
579
|
await membersUpdate;
|
|
580
580
|
|
|
581
|
-
assert.equal(localStreams.bob.microphone.
|
|
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.
|
|
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.
|
|
610
|
+
localStreams.bob.microphone.setUserMuted(false);
|
|
611
611
|
|
|
612
612
|
await membersUpdate;
|
|
613
613
|
|
|
614
|
-
assert.equal(localStreams.bob.microphone.
|
|
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',
|
|
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([
|
|
@@ -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),
|
|
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
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
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
|
-
|
|
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('
|
|
229
|
-
const
|
|
230
|
-
.stub(internalMediaModule, '
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
254
|
-
enableRtx: ENABLE_RTX,
|
|
255
|
-
enableExtmap: ENABLE_EXTMAP,
|
|
256
|
-
turnServerInfo: undefined,
|
|
222
|
+
bundlePolicy: undefined,
|
|
257
223
|
});
|
|
258
|
-
assert.calledOnce(
|
|
224
|
+
assert.calledOnce(multistreamRoapMediaConnectionConstructorStub);
|
|
259
225
|
assert.calledWith(
|
|
260
|
-
|
|
226
|
+
multistreamRoapMediaConnectionConstructorStub,
|
|
261
227
|
{
|
|
262
228
|
iceServers: [],
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
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
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
258
|
+
audioStream: fakeAudioStream,
|
|
259
|
+
videoStream: null,
|
|
260
|
+
shareVideoStream: fakeShareVideoStream,
|
|
261
|
+
shareAudioStream: fakeShareAudioStream,
|
|
276
262
|
},
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
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
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
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
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
);
|
|
302
|
+
'some debug id'
|
|
303
|
+
);
|
|
304
|
+
});
|
|
294
305
|
});
|
|
295
306
|
});
|