@webex/plugin-meetings 3.0.0-beta.13 → 3.0.0-beta.15
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/UPGRADING.md +9 -9
- package/browsers.js +19 -24
- package/dist/common/browser-detection.js +1 -0
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js.map +1 -1
- package/dist/common/errors/captcha-error.js +5 -5
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +5 -5
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +6 -6
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +5 -5
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.js +5 -5
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +5 -5
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +4 -4
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reconnection.js +5 -5
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +5 -5
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js.map +1 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.js +11 -8
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +2 -1
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +2 -1
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js.map +1 -1
- package/dist/media/internal-media-core-wrapper.js.map +1 -1
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +1 -1
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/effectsState.js +1 -1
- package/dist/meeting/effectsState.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +118 -89
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.js +1 -1
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +25 -0
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js +8 -0
- package/dist/meeting/request.type.js.map +1 -0
- package/dist/meeting/state.js +5 -5
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +2 -2
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +48 -48
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +1 -1
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +251 -250
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +2 -2
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +14 -14
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +31 -31
- package/dist/member/index.js.map +1 -1
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +43 -43
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js.map +1 -1
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.js.map +1 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +23 -20
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/multistreamMedia.js +2 -1
- package/dist/multistream/multistreamMedia.js.map +1 -1
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +2 -0
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +8 -8
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +7 -7
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.js +3 -1
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.js +4 -4
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/roap/index.js +5 -5
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +4 -1
- package/dist/transcription/index.js.map +1 -1
- package/internal-README.md +7 -6
- package/package.json +18 -18
- package/src/common/browser-detection.ts +9 -6
- package/src/common/collection.ts +3 -1
- package/src/common/errors/captcha-error.ts +6 -6
- package/src/common/errors/intent-to-join.ts +6 -6
- package/src/common/errors/join-meeting.ts +12 -8
- package/src/common/errors/media.ts +6 -6
- package/src/common/errors/parameter.ts +9 -6
- package/src/common/errors/password-error.ts +6 -6
- package/src/common/errors/permission.ts +5 -5
- package/src/common/errors/reconnection.ts +6 -6
- package/src/common/errors/stats.ts +6 -6
- package/src/common/errors/webex-errors.ts +7 -5
- package/src/common/errors/webex-meetings-error.ts +1 -1
- package/src/common/events/events-scope.ts +5 -1
- package/src/common/events/events.ts +5 -1
- package/src/common/events/trigger-proxy.ts +8 -3
- package/src/common/events/util.ts +1 -2
- package/src/common/logs/logger-proxy.ts +21 -10
- package/src/common/logs/request.ts +11 -8
- package/src/config.ts +11 -11
- package/src/constants.ts +1 -1
- package/src/index.js +1 -1
- package/src/locus-info/controlsUtils.ts +34 -24
- package/src/locus-info/fullState.ts +15 -11
- package/src/locus-info/hostUtils.ts +4 -3
- package/src/locus-info/index.ts +25 -34
- package/src/locus-info/infoUtils.ts +12 -4
- package/src/locus-info/mediaSharesUtils.ts +4 -4
- package/src/locus-info/parser.ts +45 -68
- package/src/locus-info/selfUtils.ts +106 -57
- package/src/media/index.ts +123 -135
- package/src/media/internal-media-core-wrapper.ts +2 -2
- package/src/media/properties.ts +30 -20
- package/src/media/util.ts +1 -1
- package/src/mediaQualityMetrics/config.ts +46 -46
- package/src/meeting/effectsState.ts +35 -35
- package/src/meeting/in-meeting-actions.ts +7 -3
- package/src/meeting/index.ts +1576 -1291
- package/src/meeting/muteState.ts +62 -31
- package/src/meeting/request.ts +174 -113
- package/src/meeting/request.type.ts +11 -0
- package/src/meeting/state.ts +45 -30
- package/src/meeting/util.ts +101 -70
- package/src/meeting-info/collection.ts +2 -1
- package/src/meeting-info/index.ts +32 -30
- package/src/meeting-info/meeting-info-v2.ts +106 -108
- package/src/meeting-info/request.ts +9 -3
- package/src/meeting-info/util.ts +54 -46
- package/src/meeting-info/utilv2.ts +59 -53
- package/src/meetings/collection.ts +1 -1
- package/src/meetings/index.ts +512 -440
- package/src/meetings/request.ts +26 -24
- package/src/meetings/util.ts +29 -29
- package/src/member/index.ts +55 -49
- package/src/member/util.ts +26 -13
- package/src/members/collection.ts +0 -1
- package/src/members/index.ts +182 -126
- package/src/members/request.ts +46 -14
- package/src/members/util.ts +44 -42
- package/src/metrics/config.ts +254 -81
- package/src/metrics/constants.ts +0 -2
- package/src/metrics/index.ts +84 -71
- package/src/multistream/multistreamMedia.ts +1 -0
- package/src/multistream/receiveSlot.ts +1 -0
- package/src/multistream/receiveSlotManager.ts +1 -0
- package/src/multistream/remoteMedia.ts +1 -1
- package/src/multistream/remoteMediaGroup.ts +2 -1
- package/src/multistream/remoteMediaManager.ts +3 -0
- package/src/networkQualityMonitor/index.ts +20 -23
- package/src/personal-meeting-room/index.ts +12 -16
- package/src/personal-meeting-room/request.ts +10 -3
- package/src/personal-meeting-room/util.ts +3 -3
- package/src/reachability/index.ts +61 -59
- package/src/reachability/request.ts +36 -32
- package/src/reactions/reactions.ts +4 -4
- package/src/reactions/reactions.type.ts +4 -3
- package/src/reconnection-manager/index.ts +139 -84
- package/src/roap/index.ts +46 -38
- package/src/roap/request.ts +44 -31
- package/src/roap/turnDiscovery.ts +59 -30
- package/src/statsAnalyzer/global.ts +30 -33
- package/src/statsAnalyzer/index.ts +432 -175
- package/src/statsAnalyzer/mqaUtil.ts +178 -72
- package/src/transcription/index.ts +34 -32
- package/test/integration/spec/journey.js +663 -462
- package/test/integration/spec/space-meeting.js +318 -203
- package/test/integration/spec/transcription.js +6 -7
- package/test/unit/spec/common/browser-detection.js +9 -28
- package/test/unit/spec/fixture/locus.js +92 -90
- package/test/unit/spec/locus-info/controlsUtils.js +5 -5
- package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
- package/test/unit/spec/locus-info/index.js +1 -2
- package/test/unit/spec/locus-info/infoUtils.js +26 -33
- package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
- package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
- package/test/unit/spec/locus-info/parser.js +3 -9
- package/test/unit/spec/locus-info/selfConstant.js +72 -103
- package/test/unit/spec/locus-info/selfUtils.js +21 -12
- package/test/unit/spec/meeting/effectsState.js +36 -46
- package/test/unit/spec/meeting/in-meeting-actions.ts +2 -3
- package/test/unit/spec/meeting/index.js +1342 -684
- package/test/unit/spec/meeting/muteState.js +42 -33
- package/test/unit/spec/meeting/request.js +75 -45
- package/test/unit/spec/meeting/utils.js +78 -53
- package/test/unit/spec/meeting-info/meetinginfov2.js +100 -73
- package/test/unit/spec/meeting-info/request.js +7 -9
- package/test/unit/spec/meeting-info/util.js +11 -12
- package/test/unit/spec/meeting-info/utilv2.js +110 -74
- package/test/unit/spec/meetings/collection.js +1 -1
- package/test/unit/spec/meetings/index.js +438 -257
- package/test/unit/spec/meetings/utils.js +14 -12
- package/test/unit/spec/member/index.js +0 -1
- package/test/unit/spec/member/util.js +5 -6
- package/test/unit/spec/members/index.js +104 -54
- package/test/unit/spec/members/request.js +29 -20
- package/test/unit/spec/members/utils.js +8 -5
- package/test/unit/spec/metrics/index.js +16 -21
- package/test/unit/spec/networkQualityMonitor/index.js +21 -15
- package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
- package/test/unit/spec/reachability/index.ts +9 -11
- package/test/unit/spec/reconnection-manager/index.js +16 -18
- package/test/unit/spec/roap/turnDiscovery.ts +22 -19
- package/test/unit/spec/stats-analyzer/index.js +25 -20
- package/test/utils/cmr.js +44 -42
- package/test/utils/testUtils.js +83 -74
- package/test/utils/webex-config.js +18 -18
- package/test/utils/webex-test-users.js +53 -50
|
@@ -20,17 +20,17 @@ describe('plugin-meetings', () => {
|
|
|
20
20
|
meeting = {
|
|
21
21
|
mediaProperties: {
|
|
22
22
|
audioTrack: 'fake audio track',
|
|
23
|
-
videoTrack: 'fake video track'
|
|
23
|
+
videoTrack: 'fake video track',
|
|
24
24
|
},
|
|
25
25
|
remoteMuted: false,
|
|
26
26
|
unmuteAllowed: true,
|
|
27
27
|
locusInfo: {
|
|
28
|
-
onFullLocus: sinon.stub()
|
|
28
|
+
onFullLocus: sinon.stub(),
|
|
29
29
|
},
|
|
30
30
|
members: {
|
|
31
31
|
selfId: 'fake self id',
|
|
32
|
-
muteMember: sinon.stub().resolves()
|
|
33
|
-
}
|
|
32
|
+
muteMember: sinon.stub().resolves(),
|
|
33
|
+
},
|
|
34
34
|
};
|
|
35
35
|
audio = createMuteState(AUDIO, meeting, {sendAudio: true});
|
|
36
36
|
video = createMuteState(VIDEO, meeting, {sendVideo: true});
|
|
@@ -128,11 +128,14 @@ describe('plugin-meetings', () => {
|
|
|
128
128
|
// first we need to mute and make that request last forever
|
|
129
129
|
let serverResponseResolve;
|
|
130
130
|
|
|
131
|
-
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
132
|
-
|
|
133
|
-
|
|
131
|
+
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
132
|
+
new Promise((resolve) => {
|
|
133
|
+
serverResponseResolve = resolve;
|
|
134
|
+
})
|
|
135
|
+
);
|
|
134
136
|
|
|
135
|
-
audio
|
|
137
|
+
audio
|
|
138
|
+
.handleClientRequest(meeting, true)
|
|
136
139
|
.then(() => {
|
|
137
140
|
clientPromiseResolved = true;
|
|
138
141
|
})
|
|
@@ -236,14 +239,15 @@ describe('plugin-meetings', () => {
|
|
|
236
239
|
|
|
237
240
|
let serverResponseResolve;
|
|
238
241
|
|
|
239
|
-
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
240
|
-
|
|
241
|
-
|
|
242
|
+
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
243
|
+
new Promise((resolve) => {
|
|
244
|
+
serverResponseResolve = resolve;
|
|
245
|
+
})
|
|
246
|
+
);
|
|
242
247
|
|
|
243
|
-
audio.handleClientRequest(meeting, true)
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
});
|
|
248
|
+
audio.handleClientRequest(meeting, true).then(() => {
|
|
249
|
+
clientPromiseResolved = true;
|
|
250
|
+
});
|
|
247
251
|
|
|
248
252
|
// do a small delay to make sure that the client promise doesn't resolve in that time
|
|
249
253
|
await testUtils.waitUntil(200);
|
|
@@ -257,9 +261,11 @@ describe('plugin-meetings', () => {
|
|
|
257
261
|
});
|
|
258
262
|
|
|
259
263
|
it('rejects client request promise if server request for local mute fails', async () => {
|
|
260
|
-
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
261
|
-
reject
|
|
262
|
-
|
|
264
|
+
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
265
|
+
new Promise((resolve, reject) => {
|
|
266
|
+
reject();
|
|
267
|
+
})
|
|
268
|
+
);
|
|
263
269
|
|
|
264
270
|
assert.isRejected(audio.handleClientRequest(meeting, true));
|
|
265
271
|
});
|
|
@@ -282,9 +288,11 @@ describe('plugin-meetings', () => {
|
|
|
282
288
|
it('does not send a server request if client state matches the server', async () => {
|
|
283
289
|
let serverResponseResolve;
|
|
284
290
|
|
|
285
|
-
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
286
|
-
|
|
287
|
-
|
|
291
|
+
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
292
|
+
new Promise((resolve) => {
|
|
293
|
+
serverResponseResolve = resolve;
|
|
294
|
+
})
|
|
295
|
+
);
|
|
288
296
|
|
|
289
297
|
// simulate many client requests, with the last one matching the initial one
|
|
290
298
|
audio.handleClientRequest(meeting, true);
|
|
@@ -309,22 +317,22 @@ describe('plugin-meetings', () => {
|
|
|
309
317
|
it('queues up server requests when multiple client requests are received', async () => {
|
|
310
318
|
let serverResponseResolve;
|
|
311
319
|
|
|
312
|
-
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
313
|
-
|
|
314
|
-
|
|
320
|
+
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
321
|
+
new Promise((resolve) => {
|
|
322
|
+
serverResponseResolve = resolve;
|
|
323
|
+
})
|
|
324
|
+
);
|
|
315
325
|
|
|
316
326
|
let firstClientPromiseResolved = false;
|
|
317
327
|
let secondClientPromiseResolved = false;
|
|
318
328
|
|
|
319
329
|
// 2 client requests, one after another without waiting for first one to resolve
|
|
320
|
-
audio.handleClientRequest(meeting, true)
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
secondClientPromiseResolved = true;
|
|
327
|
-
});
|
|
330
|
+
audio.handleClientRequest(meeting, true).then(() => {
|
|
331
|
+
firstClientPromiseResolved = true;
|
|
332
|
+
});
|
|
333
|
+
audio.handleClientRequest(meeting, false).then(() => {
|
|
334
|
+
secondClientPromiseResolved = true;
|
|
335
|
+
});
|
|
328
336
|
|
|
329
337
|
await testUtils.flushPromises();
|
|
330
338
|
|
|
@@ -351,7 +359,8 @@ describe('plugin-meetings', () => {
|
|
|
351
359
|
it('rejects client request to unmute if hard mute is used', (done) => {
|
|
352
360
|
audio.handleServerRemoteMuteUpdate(true, false);
|
|
353
361
|
|
|
354
|
-
audio
|
|
362
|
+
audio
|
|
363
|
+
.handleClientRequest(meeting, false)
|
|
355
364
|
.then(() => {
|
|
356
365
|
done(new Error('expected handleClientRequest to fail, but it did not!'));
|
|
357
366
|
})
|
|
@@ -10,26 +10,28 @@ describe('plugin-meetings', () => {
|
|
|
10
10
|
beforeEach(() => {
|
|
11
11
|
const webex = new MockWebex({
|
|
12
12
|
children: {
|
|
13
|
-
meetings: Meetings
|
|
14
|
-
}
|
|
13
|
+
meetings: Meetings,
|
|
14
|
+
},
|
|
15
15
|
});
|
|
16
16
|
|
|
17
17
|
webex.meetings.clientRegion = {
|
|
18
18
|
countryCode: 'US',
|
|
19
|
-
regionCode: 'WEST-COAST'
|
|
19
|
+
regionCode: 'WEST-COAST',
|
|
20
20
|
};
|
|
21
21
|
|
|
22
22
|
webex.internal = {
|
|
23
23
|
services: {
|
|
24
24
|
get: sinon.mock().returns('locusUrl'),
|
|
25
|
-
waitForCatalog: sinon.mock().returns(Promise.resolve({}))
|
|
26
|
-
}
|
|
25
|
+
waitForCatalog: sinon.mock().returns(Promise.resolve({})),
|
|
26
|
+
},
|
|
27
27
|
};
|
|
28
28
|
|
|
29
|
-
meetingsRequest = new MeetingRequest(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
meetingsRequest = new MeetingRequest(
|
|
30
|
+
{},
|
|
31
|
+
{
|
|
32
|
+
parent: webex,
|
|
33
|
+
}
|
|
34
|
+
);
|
|
33
35
|
|
|
34
36
|
meetingsRequest.request = sinon.mock().returns(Promise.resolve({}));
|
|
35
37
|
});
|
|
@@ -44,7 +46,7 @@ describe('plugin-meetings', () => {
|
|
|
44
46
|
await meetingsRequest.sendDTMF({
|
|
45
47
|
locusUrl,
|
|
46
48
|
deviceUrl,
|
|
47
|
-
tones
|
|
49
|
+
tones,
|
|
48
50
|
});
|
|
49
51
|
const requestParams = meetingsRequest.request.getCall(0).args[0];
|
|
50
52
|
|
|
@@ -66,7 +68,7 @@ describe('plugin-meetings', () => {
|
|
|
66
68
|
deviceUrl,
|
|
67
69
|
layoutType,
|
|
68
70
|
main: {width: 640, height: 480},
|
|
69
|
-
content: {width: 1280, height: 720}
|
|
71
|
+
content: {width: 1280, height: 720},
|
|
70
72
|
});
|
|
71
73
|
const requestParams = meetingsRequest.request.getCall(0).args[0];
|
|
72
74
|
|
|
@@ -74,43 +76,53 @@ describe('plugin-meetings', () => {
|
|
|
74
76
|
assert.equal(requestParams.uri, `${locusUrl}/controls`);
|
|
75
77
|
assert.equal(requestParams.body.layout.type, layoutType);
|
|
76
78
|
assert.equal(requestParams.body.layout.deviceUrl, deviceUrl);
|
|
77
|
-
assert.deepEqual(requestParams.body.layout.layoutParams, {
|
|
79
|
+
assert.deepEqual(requestParams.body.layout.layoutParams, {
|
|
80
|
+
renderInfo: {main: {width: 640, height: 480}, content: {width: 1280, height: 720}},
|
|
81
|
+
});
|
|
78
82
|
});
|
|
79
83
|
|
|
80
84
|
it('throws if width is missing for main', async () => {
|
|
81
|
-
await assert.isRejected(
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
85
|
+
await assert.isRejected(
|
|
86
|
+
meetingsRequest.changeVideoLayout({
|
|
87
|
+
locusUrl,
|
|
88
|
+
deviceUrl,
|
|
89
|
+
layoutType,
|
|
90
|
+
main: {height: 100},
|
|
91
|
+
})
|
|
92
|
+
);
|
|
87
93
|
});
|
|
88
94
|
|
|
89
95
|
it('throws if height is missing for main', async () => {
|
|
90
|
-
await assert.isRejected(
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
+
await assert.isRejected(
|
|
97
|
+
meetingsRequest.changeVideoLayout({
|
|
98
|
+
locusUrl,
|
|
99
|
+
deviceUrl,
|
|
100
|
+
layoutType,
|
|
101
|
+
main: {width: 100},
|
|
102
|
+
})
|
|
103
|
+
);
|
|
96
104
|
});
|
|
97
105
|
|
|
98
106
|
it('throws if width is missing for content', async () => {
|
|
99
|
-
await assert.isRejected(
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
107
|
+
await assert.isRejected(
|
|
108
|
+
meetingsRequest.changeVideoLayout({
|
|
109
|
+
locusUrl,
|
|
110
|
+
deviceUrl,
|
|
111
|
+
layoutType,
|
|
112
|
+
content: {height: 100},
|
|
113
|
+
})
|
|
114
|
+
);
|
|
105
115
|
});
|
|
106
116
|
|
|
107
117
|
it('throws if height is missing for content', async () => {
|
|
108
|
-
await assert.isRejected(
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
118
|
+
await assert.isRejected(
|
|
119
|
+
meetingsRequest.changeVideoLayout({
|
|
120
|
+
locusUrl,
|
|
121
|
+
deviceUrl,
|
|
122
|
+
layoutType,
|
|
123
|
+
content: {width: 100},
|
|
124
|
+
})
|
|
125
|
+
);
|
|
114
126
|
});
|
|
115
127
|
});
|
|
116
128
|
|
|
@@ -127,8 +139,7 @@ describe('plugin-meetings', () => {
|
|
|
127
139
|
deviceUrl,
|
|
128
140
|
correlationId,
|
|
129
141
|
roapMessage,
|
|
130
|
-
permissionToken
|
|
131
|
-
|
|
142
|
+
permissionToken,
|
|
132
143
|
});
|
|
133
144
|
const requestParams = meetingsRequest.request.getCall(0).args[0];
|
|
134
145
|
|
|
@@ -150,7 +161,7 @@ describe('plugin-meetings', () => {
|
|
|
150
161
|
deviceUrl,
|
|
151
162
|
correlationId,
|
|
152
163
|
roapMessage,
|
|
153
|
-
meetingNumber
|
|
164
|
+
meetingNumber,
|
|
154
165
|
});
|
|
155
166
|
const requestParams = meetingsRequest.request.getCall(0).args[0];
|
|
156
167
|
|
|
@@ -171,7 +182,7 @@ describe('plugin-meetings', () => {
|
|
|
171
182
|
correlationId,
|
|
172
183
|
roapMessage,
|
|
173
184
|
meetingNumber,
|
|
174
|
-
inviteeAddress
|
|
185
|
+
inviteeAddress,
|
|
175
186
|
});
|
|
176
187
|
const requestParams = meetingsRequest.request.getCall(0).args[0];
|
|
177
188
|
|
|
@@ -192,7 +203,7 @@ describe('plugin-meetings', () => {
|
|
|
192
203
|
locusUrl,
|
|
193
204
|
clientUrl,
|
|
194
205
|
correlationId,
|
|
195
|
-
dialInUrl
|
|
206
|
+
dialInUrl,
|
|
196
207
|
});
|
|
197
208
|
const requestParams = meetingsRequest.request.getCall(0).args[0];
|
|
198
209
|
|
|
@@ -216,7 +227,7 @@ describe('plugin-meetings', () => {
|
|
|
216
227
|
clientUrl,
|
|
217
228
|
correlationId,
|
|
218
229
|
dialOutUrl,
|
|
219
|
-
phoneNumber
|
|
230
|
+
phoneNumber,
|
|
220
231
|
});
|
|
221
232
|
const requestParams = meetingsRequest.request.getCall(0).args[0];
|
|
222
233
|
|
|
@@ -239,7 +250,7 @@ describe('plugin-meetings', () => {
|
|
|
239
250
|
locusUrl,
|
|
240
251
|
selfId,
|
|
241
252
|
correlationId,
|
|
242
|
-
phoneUrl
|
|
253
|
+
phoneUrl,
|
|
243
254
|
});
|
|
244
255
|
const requestParams = meetingsRequest.request.getCall(0).args[0];
|
|
245
256
|
|
|
@@ -286,13 +297,13 @@ describe('plugin-meetings', () => {
|
|
|
286
297
|
type: 'thumb_down',
|
|
287
298
|
codepoints: '1F44E',
|
|
288
299
|
shortcodes: ':thumbsdown:',
|
|
289
|
-
tone: {type: 'normal_skin_tone', codepoints: '', shortcodes: ''}
|
|
300
|
+
tone: {type: 'normal_skin_tone', codepoints: '', shortcodes: ''},
|
|
290
301
|
};
|
|
291
302
|
|
|
292
303
|
await meetingsRequest.sendReaction({
|
|
293
304
|
reactionChannelUrl,
|
|
294
305
|
reaction,
|
|
295
|
-
participantId
|
|
306
|
+
participantId,
|
|
296
307
|
});
|
|
297
308
|
const requestParams = meetingsRequest.request.getCall(0).args[0];
|
|
298
309
|
|
|
@@ -302,5 +313,24 @@ describe('plugin-meetings', () => {
|
|
|
302
313
|
assert.equal(requestParams.body.reaction, reaction);
|
|
303
314
|
});
|
|
304
315
|
});
|
|
316
|
+
|
|
317
|
+
describe('#toggleReactions', () => {
|
|
318
|
+
it('sends request to toggleReactions', async () => {
|
|
319
|
+
const locusUrl = 'locusUrl';
|
|
320
|
+
const requestingParticipantId = 'requestingParticipantId';
|
|
321
|
+
|
|
322
|
+
await meetingsRequest.toggleReactions({
|
|
323
|
+
enable: true,
|
|
324
|
+
locusUrl,
|
|
325
|
+
requestingParticipantId,
|
|
326
|
+
});
|
|
327
|
+
const requestParams = meetingsRequest.request.getCall(0).args[0];
|
|
328
|
+
|
|
329
|
+
assert.equal(requestParams.method, 'PUT');
|
|
330
|
+
assert.equal(requestParams.uri, `${locusUrl}/controls`);
|
|
331
|
+
assert.equal(requestParams.body.reactions.enabled, true);
|
|
332
|
+
assert.equal(requestParams.body.requestingParticipantId, requestingParticipantId);
|
|
333
|
+
});
|
|
334
|
+
});
|
|
305
335
|
});
|
|
306
336
|
});
|
|
@@ -2,11 +2,9 @@ import sinon from 'sinon';
|
|
|
2
2
|
import {assert} from '@webex/test-helper-chai';
|
|
3
3
|
import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
|
|
4
4
|
import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
|
|
5
|
-
import LoggerConfig
|
|
6
|
-
from '@webex/plugin-meetings/src/common/logs/logger-config';
|
|
5
|
+
import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
|
|
7
6
|
import Metrics from '@webex/plugin-meetings/src/metrics/index';
|
|
8
7
|
|
|
9
|
-
|
|
10
8
|
describe('plugin-meetings', () => {
|
|
11
9
|
describe('Meeting utils function', () => {
|
|
12
10
|
const sandbox = sinon.createSandbox();
|
|
@@ -18,23 +16,19 @@ describe('plugin-meetings', () => {
|
|
|
18
16
|
info: sandbox.stub(),
|
|
19
17
|
log: sandbox.stub(),
|
|
20
18
|
error: sandbox.stub(),
|
|
21
|
-
warn: sandbox.stub()
|
|
19
|
+
warn: sandbox.stub(),
|
|
22
20
|
};
|
|
23
21
|
|
|
24
22
|
LoggerConfig.set({
|
|
25
23
|
verboseEvents: true,
|
|
26
|
-
enable: true
|
|
24
|
+
enable: true,
|
|
27
25
|
});
|
|
28
26
|
LoggerProxy.set(logger);
|
|
29
27
|
|
|
30
|
-
meeting.closeLocalStream = sinon.stub()
|
|
31
|
-
|
|
32
|
-
meeting.
|
|
33
|
-
|
|
34
|
-
meeting.closeRemoteTracks = sinon.stub()
|
|
35
|
-
.returns(Promise.resolve());
|
|
36
|
-
meeting.closePeerConnections = sinon.stub()
|
|
37
|
-
.returns(Promise.resolve());
|
|
28
|
+
meeting.closeLocalStream = sinon.stub().returns(Promise.resolve());
|
|
29
|
+
meeting.closeLocalShare = sinon.stub().returns(Promise.resolve());
|
|
30
|
+
meeting.closeRemoteTracks = sinon.stub().returns(Promise.resolve());
|
|
31
|
+
meeting.closePeerConnections = sinon.stub().returns(Promise.resolve());
|
|
38
32
|
|
|
39
33
|
meeting.unsetLocalVideoTrack = sinon.stub();
|
|
40
34
|
meeting.unsetLocalShareTrack = sinon.stub();
|
|
@@ -70,11 +64,11 @@ describe('plugin-meetings', () => {
|
|
|
70
64
|
|
|
71
65
|
describe('logging', () => {
|
|
72
66
|
const fakeDevice = sinon.fake.returns({
|
|
73
|
-
deviceId: 'device-1'
|
|
67
|
+
deviceId: 'device-1',
|
|
74
68
|
});
|
|
75
69
|
|
|
76
70
|
const mockTrack = {
|
|
77
|
-
getSettings: fakeDevice
|
|
71
|
+
getSettings: fakeDevice,
|
|
78
72
|
};
|
|
79
73
|
|
|
80
74
|
it('#log - should log [info, warn, error, log] to console', () => {
|
|
@@ -124,10 +118,7 @@ describe('plugin-meetings', () => {
|
|
|
124
118
|
});
|
|
125
119
|
|
|
126
120
|
it('should log device settings', () => {
|
|
127
|
-
const mockDevices = [
|
|
128
|
-
{deviceId: 'device-1'},
|
|
129
|
-
{deviceId: 'device-2'}
|
|
130
|
-
];
|
|
121
|
+
const mockDevices = [{deviceId: 'device-1'}, {deviceId: 'device-2'}];
|
|
131
122
|
|
|
132
123
|
assert(MeetingUtil.handleDeviceLogging, 'is defined');
|
|
133
124
|
MeetingUtil.handleDeviceLogging(mockDevices);
|
|
@@ -146,7 +137,9 @@ describe('plugin-meetings', () => {
|
|
|
146
137
|
locusUrl: 'locusUrl',
|
|
147
138
|
deviceUrl: 'some device url',
|
|
148
139
|
selfId: 'self id',
|
|
149
|
-
meetingRequest: {
|
|
140
|
+
meetingRequest: {
|
|
141
|
+
remoteAudioVideoToggle: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
|
|
142
|
+
},
|
|
150
143
|
};
|
|
151
144
|
|
|
152
145
|
await MeetingUtil.remoteUpdateAudioVideo(true, false, meeting);
|
|
@@ -158,7 +151,9 @@ describe('plugin-meetings', () => {
|
|
|
158
151
|
assert.equal(parameter.selfId, 'self id');
|
|
159
152
|
assert.equal(parameter.correlationId, 'correlation id');
|
|
160
153
|
assert.equal(parameter.deviceUrl, 'some device url');
|
|
161
|
-
assert.deepEqual(parameter.localMedias, [
|
|
154
|
+
assert.deepEqual(parameter.localMedias, [
|
|
155
|
+
{localSdp: '{"audioMuted":true,"videoMuted":false}', mediaId: '12345'},
|
|
156
|
+
]);
|
|
162
157
|
assert.equal(parameter.preferTranscoding, false);
|
|
163
158
|
});
|
|
164
159
|
|
|
@@ -166,7 +161,9 @@ describe('plugin-meetings', () => {
|
|
|
166
161
|
const meeting = {
|
|
167
162
|
isMultistream: false,
|
|
168
163
|
mediaId: '12345',
|
|
169
|
-
meetingRequest: {
|
|
164
|
+
meetingRequest: {
|
|
165
|
+
remoteAudioVideoToggle: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
|
|
166
|
+
},
|
|
170
167
|
};
|
|
171
168
|
|
|
172
169
|
await MeetingUtil.remoteUpdateAudioVideo(true, false, meeting);
|
|
@@ -180,7 +177,13 @@ describe('plugin-meetings', () => {
|
|
|
180
177
|
|
|
181
178
|
describe('joinMeeting', () => {
|
|
182
179
|
it('#Should call `meetingRequest.joinMeeting', async () => {
|
|
183
|
-
const meeting = {
|
|
180
|
+
const meeting = {
|
|
181
|
+
meetingJoinUrl: 'meetingJoinUrl',
|
|
182
|
+
locusUrl: 'locusUrl',
|
|
183
|
+
meetingRequest: {
|
|
184
|
+
joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
|
|
185
|
+
},
|
|
186
|
+
};
|
|
184
187
|
|
|
185
188
|
MeetingUtil.parseLocusJoin = sinon.stub();
|
|
186
189
|
await MeetingUtil.joinMeeting(meeting, {});
|
|
@@ -197,7 +200,9 @@ describe('plugin-meetings', () => {
|
|
|
197
200
|
isMultistream: true,
|
|
198
201
|
meetingJoinUrl: 'meetingJoinUrl',
|
|
199
202
|
locusUrl: 'locusUrl',
|
|
200
|
-
meetingRequest: {
|
|
203
|
+
meetingRequest: {
|
|
204
|
+
joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
|
|
205
|
+
},
|
|
201
206
|
};
|
|
202
207
|
|
|
203
208
|
MeetingUtil.parseLocusJoin = sinon.stub();
|
|
@@ -211,7 +216,13 @@ describe('plugin-meetings', () => {
|
|
|
211
216
|
});
|
|
212
217
|
|
|
213
218
|
it('#Should fallback sipUrl if meetingJoinUrl does not exists', async () => {
|
|
214
|
-
const meeting = {
|
|
219
|
+
const meeting = {
|
|
220
|
+
sipUri: 'sipUri',
|
|
221
|
+
locusUrl: 'locusUrl',
|
|
222
|
+
meetingRequest: {
|
|
223
|
+
joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
|
|
224
|
+
},
|
|
225
|
+
};
|
|
215
226
|
|
|
216
227
|
MeetingUtil.parseLocusJoin = sinon.stub();
|
|
217
228
|
await MeetingUtil.joinMeeting(meeting, {});
|
|
@@ -223,7 +234,13 @@ describe('plugin-meetings', () => {
|
|
|
223
234
|
});
|
|
224
235
|
|
|
225
236
|
it('#Should fallback to meetingNumber if meetingJoinUrl/sipUrl does not exists', async () => {
|
|
226
|
-
const meeting = {
|
|
237
|
+
const meeting = {
|
|
238
|
+
meetingNumber: 'meetingNumber',
|
|
239
|
+
locusUrl: 'locusUrl',
|
|
240
|
+
meetingRequest: {
|
|
241
|
+
joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}})),
|
|
242
|
+
},
|
|
243
|
+
};
|
|
227
244
|
|
|
228
245
|
MeetingUtil.parseLocusJoin = sinon.stub();
|
|
229
246
|
await MeetingUtil.joinMeeting(meeting, {});
|
|
@@ -240,15 +257,9 @@ describe('plugin-meetings', () => {
|
|
|
240
257
|
it('returns display hints', () => {
|
|
241
258
|
assert.deepEqual(MeetingUtil.getUserDisplayHintsFromLocusInfo(), []);
|
|
242
259
|
|
|
243
|
-
assert.deepEqual(
|
|
244
|
-
MeetingUtil.getUserDisplayHintsFromLocusInfo({}),
|
|
245
|
-
[]
|
|
246
|
-
);
|
|
260
|
+
assert.deepEqual(MeetingUtil.getUserDisplayHintsFromLocusInfo({}), []);
|
|
247
261
|
|
|
248
|
-
assert.deepEqual(
|
|
249
|
-
MeetingUtil.getUserDisplayHintsFromLocusInfo({parsedLocus: {}}),
|
|
250
|
-
[]
|
|
251
|
-
);
|
|
262
|
+
assert.deepEqual(MeetingUtil.getUserDisplayHintsFromLocusInfo({parsedLocus: {}}), []);
|
|
252
263
|
|
|
253
264
|
assert.deepEqual(
|
|
254
265
|
MeetingUtil.getUserDisplayHintsFromLocusInfo({parsedLocus: {info: {}}}),
|
|
@@ -256,7 +267,9 @@ describe('plugin-meetings', () => {
|
|
|
256
267
|
);
|
|
257
268
|
|
|
258
269
|
assert.deepEqual(
|
|
259
|
-
MeetingUtil.getUserDisplayHintsFromLocusInfo({
|
|
270
|
+
MeetingUtil.getUserDisplayHintsFromLocusInfo({
|
|
271
|
+
parsedLocus: {info: {userDisplayHints: []}},
|
|
272
|
+
}),
|
|
260
273
|
[]
|
|
261
274
|
);
|
|
262
275
|
|
|
@@ -264,11 +277,9 @@ describe('plugin-meetings', () => {
|
|
|
264
277
|
MeetingUtil.getUserDisplayHintsFromLocusInfo({
|
|
265
278
|
parsedLocus: {
|
|
266
279
|
info: {
|
|
267
|
-
userDisplayHints: [
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
}
|
|
271
|
-
}
|
|
280
|
+
userDisplayHints: ['HINT_1'],
|
|
281
|
+
},
|
|
282
|
+
},
|
|
272
283
|
}),
|
|
273
284
|
['HINT_1']
|
|
274
285
|
);
|
|
@@ -305,23 +316,38 @@ describe('plugin-meetings', () => {
|
|
|
305
316
|
|
|
306
317
|
describe('canUserLowerSomeoneElsesHand', () => {
|
|
307
318
|
it('works as expected', () => {
|
|
308
|
-
assert.deepEqual(
|
|
319
|
+
assert.deepEqual(
|
|
320
|
+
MeetingUtil.canUserLowerSomeoneElsesHand(['LOWER_SOMEONE_ELSES_HAND']),
|
|
321
|
+
true
|
|
322
|
+
);
|
|
309
323
|
assert.deepEqual(MeetingUtil.canUserLowerSomeoneElsesHand([]), false);
|
|
310
324
|
});
|
|
311
325
|
});
|
|
312
326
|
|
|
313
327
|
describe('bothLeaveAndEndMeetingAvailable', () => {
|
|
314
328
|
it('works as expected', () => {
|
|
315
|
-
assert.deepEqual(
|
|
329
|
+
assert.deepEqual(
|
|
330
|
+
MeetingUtil.bothLeaveAndEndMeetingAvailable(['LEAVE_TRANSFER_HOST_END_MEETING']),
|
|
331
|
+
true
|
|
332
|
+
);
|
|
316
333
|
assert.deepEqual(MeetingUtil.bothLeaveAndEndMeetingAvailable(['LEAVE_END_MEETING']), true);
|
|
317
|
-
assert.deepEqual(
|
|
334
|
+
assert.deepEqual(
|
|
335
|
+
MeetingUtil.bothLeaveAndEndMeetingAvailable([
|
|
336
|
+
'LEAVE_TRANSFER_HOST_END_MEETING',
|
|
337
|
+
'LEAVE_END_MEETING',
|
|
338
|
+
]),
|
|
339
|
+
true
|
|
340
|
+
);
|
|
318
341
|
assert.deepEqual(MeetingUtil.bothLeaveAndEndMeetingAvailable([]), false);
|
|
319
342
|
});
|
|
320
343
|
});
|
|
321
344
|
|
|
322
345
|
describe('canUserLock', () => {
|
|
323
346
|
it('works as expected', () => {
|
|
324
|
-
assert.deepEqual(
|
|
347
|
+
assert.deepEqual(
|
|
348
|
+
MeetingUtil.canUserLock(['LOCK_CONTROL_LOCK', 'LOCK_STATUS_UNLOCKED']),
|
|
349
|
+
true
|
|
350
|
+
);
|
|
325
351
|
assert.deepEqual(MeetingUtil.canUserLock(['LOCK_CONTROL_LOCK']), false);
|
|
326
352
|
assert.deepEqual(MeetingUtil.canUserLock(['LOCK_STATUS_UNLOCKED']), false);
|
|
327
353
|
assert.deepEqual(MeetingUtil.canUserLock([]), false);
|
|
@@ -330,7 +356,10 @@ describe('plugin-meetings', () => {
|
|
|
330
356
|
|
|
331
357
|
describe('canUserUnlock', () => {
|
|
332
358
|
it('works as expected', () => {
|
|
333
|
-
assert.deepEqual(
|
|
359
|
+
assert.deepEqual(
|
|
360
|
+
MeetingUtil.canUserUnlock(['LOCK_CONTROL_UNLOCK', 'LOCK_STATUS_LOCKED']),
|
|
361
|
+
true
|
|
362
|
+
);
|
|
334
363
|
assert.deepEqual(MeetingUtil.canUserUnlock(['LOCK_CONTROL_UNLOCK']), false);
|
|
335
364
|
assert.deepEqual(MeetingUtil.canUserUnlock(['LOCK_STATUS_LOCKED']), false);
|
|
336
365
|
assert.deepEqual(MeetingUtil.canUserUnlock([]), false);
|
|
@@ -358,7 +387,6 @@ describe('plugin-meetings', () => {
|
|
|
358
387
|
});
|
|
359
388
|
});
|
|
360
389
|
|
|
361
|
-
|
|
362
390
|
describe('canUserStop', () => {
|
|
363
391
|
it('works as expected', () => {
|
|
364
392
|
assert.deepEqual(MeetingUtil.canUserStop(['RECORDING_CONTROL_STOP']), true);
|
|
@@ -385,7 +413,6 @@ describe('plugin-meetings', () => {
|
|
|
385
413
|
});
|
|
386
414
|
});
|
|
387
415
|
|
|
388
|
-
|
|
389
416
|
describe('recording tests', () => {
|
|
390
417
|
let request;
|
|
391
418
|
let locusInfo;
|
|
@@ -395,14 +422,12 @@ describe('plugin-meetings', () => {
|
|
|
395
422
|
locusInfo = {
|
|
396
423
|
parsedLocus: {
|
|
397
424
|
info: {
|
|
398
|
-
userDisplayHints: [
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
}
|
|
402
|
-
}
|
|
425
|
+
userDisplayHints: ['RECORDING_CONTROL_START'],
|
|
426
|
+
},
|
|
427
|
+
},
|
|
403
428
|
};
|
|
404
429
|
request = {
|
|
405
|
-
recordMeeting: sinon.stub().returns(Promise.resolve())
|
|
430
|
+
recordMeeting: sinon.stub().returns(Promise.resolve()),
|
|
406
431
|
};
|
|
407
432
|
});
|
|
408
433
|
|