@webex/plugin-meetings 2.20.1 → 2.20.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.
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/plugin-meetings",
|
|
3
|
-
"version": "2.20.
|
|
3
|
+
"version": "2.20.2",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"contributors": [
|
|
@@ -24,15 +24,15 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@babel/runtime-corejs2": "^7.14.8",
|
|
27
|
-
"@webex/webex-core": "2.20.
|
|
28
|
-
"@webex/internal-plugin-mercury": "2.20.
|
|
29
|
-
"@webex/internal-plugin-conversation": "2.20.
|
|
27
|
+
"@webex/webex-core": "2.20.2",
|
|
28
|
+
"@webex/internal-plugin-mercury": "2.20.2",
|
|
29
|
+
"@webex/internal-plugin-conversation": "2.20.2",
|
|
30
30
|
"webrtc-adapter": "^7.7.0",
|
|
31
31
|
"lodash": "^4.17.21",
|
|
32
32
|
"uuid": "^3.3.2",
|
|
33
33
|
"global": "^4.4.0",
|
|
34
34
|
"ip-anonymize": "^0.1.0",
|
|
35
|
-
"@webex/common": "2.20.
|
|
35
|
+
"@webex/common": "2.20.2",
|
|
36
36
|
"bowser": "^2.11.0",
|
|
37
37
|
"sdp-transform": "^2.12.0",
|
|
38
38
|
"btoa": "^1.2.1",
|
|
@@ -247,14 +247,14 @@ skipInNode(describe)('plugin-meetings', () => {
|
|
|
247
247
|
.then(() => assert(enumerateSpy.called)));
|
|
248
248
|
|
|
249
249
|
it('bob joins the meeting', () => {
|
|
250
|
-
bob.meeting.acknowledge('INCOMING');
|
|
251
|
-
|
|
252
250
|
const checkBobIsInMeeting = (event) => !!event.delta.updated.find((member) => bob.meeting.members.selfId === member.id && member.status === 'IN_MEETING');
|
|
253
251
|
|
|
254
|
-
return
|
|
255
|
-
.then(() =>
|
|
252
|
+
return Promise.all([
|
|
253
|
+
bob.meeting.acknowledge('INCOMING').then(() => bob.meeting.join()),
|
|
254
|
+
testUtils.waitForEvents([{
|
|
256
255
|
scope: alice.meeting.members, event: 'members:update', user: alice, match: checkBobIsInMeeting
|
|
257
|
-
}])
|
|
256
|
+
}])
|
|
257
|
+
]);
|
|
258
258
|
});
|
|
259
259
|
|
|
260
260
|
it('bob adds media to the meeting', () => Promise.all([
|
|
@@ -688,12 +688,7 @@ skipInNode(describe)('plugin-meetings', () => {
|
|
|
688
688
|
|
|
689
689
|
return Promise.all([
|
|
690
690
|
testUtils.delayedPromise(chris.meeting.join()),
|
|
691
|
-
testUtils.waitForEvents([{scope: alice.meeting.members, event: 'members:update'}])
|
|
692
|
-
.then((response) => {
|
|
693
|
-
const chrisParticipant = response[0].result.delta.updated.find((member) => member.participant.identity === chris.id);
|
|
694
|
-
|
|
695
|
-
assert.equal(chrisParticipant.status, 'IN_MEETING');
|
|
696
|
-
})
|
|
691
|
+
testUtils.waitForEvents([{scope: alice.meeting.members, event: 'members:update', match: testUtils.checkParticipantUpdatedStatus(chris, 'IN_MEETING')}])
|
|
697
692
|
])
|
|
698
693
|
.then(() => {
|
|
699
694
|
assert.equal(alice.meeting.members.membersCollection.get(chris.meeting.members.selfId).participant.state, 'JOINED');
|
|
@@ -704,12 +699,7 @@ skipInNode(describe)('plugin-meetings', () => {
|
|
|
704
699
|
})
|
|
705
700
|
.then(() => Promise.all([
|
|
706
701
|
testUtils.delayedPromise(chris.meeting.leave()),
|
|
707
|
-
testUtils.waitForEvents([{scope: alice.meeting.members, event: 'members:update'}])
|
|
708
|
-
.then((response) => {
|
|
709
|
-
const chrisParticipant = response[0].result.delta.updated.find((member) => member.participant.identity === chris.id);
|
|
710
|
-
|
|
711
|
-
assert.equal(chrisParticipant.status, 'NOT_IN_MEETING');
|
|
712
|
-
})
|
|
702
|
+
testUtils.waitForEvents([{scope: alice.meeting.members, event: 'members:update', match: testUtils.checkParticipantUpdatedStatus(chris, 'NOT_IN_MEETING')}])
|
|
713
703
|
]))
|
|
714
704
|
.catch((e) => {
|
|
715
705
|
console.error('Error chris joining the meeting ', e);
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import {assert} from '@webex/test-helper-chai';
|
|
3
3
|
import {skipInNode, jenkinsOnly} from '@webex/test-helper-mocha';
|
|
4
4
|
import {patterns} from '@webex/common';
|
|
5
|
+
|
|
5
6
|
import MeetingInfoUtil from '@webex/plugin-meetings/src/meeting-info/utilv2';
|
|
6
7
|
|
|
7
8
|
import CMR from '../../utils/cmr';
|
|
@@ -152,32 +153,18 @@ skipInNode(describe)('plugin-meetings', () => {
|
|
|
152
153
|
.then(() => testUtils.addMedia(guest))
|
|
153
154
|
.catch((e) => { console.error('Error chris joining the meeting ', e); throw e; }));
|
|
154
155
|
|
|
155
|
-
it('alice Leaves the meeting', () =>
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
.then((response) => {
|
|
160
|
-
const aliceParticipant = response[0].result.delta.updated.find((member) => alice.meeting.members.selfId === member.id);
|
|
161
|
-
|
|
162
|
-
assert.equal(aliceParticipant.status, 'NOT_IN_MEETING');
|
|
163
|
-
})
|
|
164
|
-
]).then(() => testUtils.waitForStateChange(alice.meeting, 'LEFT')));
|
|
165
|
-
|
|
166
|
-
it('bob and chris leave meeting', () => Promise.all([
|
|
167
|
-
testUtils.delayedPromise(bob.meeting.leave()),
|
|
168
|
-
testUtils.waitForEvents([{scope: chris.meeting.members, event: 'members:update'}])
|
|
169
|
-
.then((response) => {
|
|
170
|
-
const bobParticipant = response[0].result.delta.updated.find((member) => bob.meeting.members.selfId === member.id);
|
|
171
|
-
|
|
172
|
-
assert.equal(bobParticipant.status, 'NOT_IN_MEETING');
|
|
173
|
-
})
|
|
174
|
-
]).then(() => testUtils.waitForStateChange(bob.meeting, 'LEFT'))
|
|
175
|
-
.then(() => {
|
|
176
|
-
console.log('CHRIS MEETING', chris.meeting.locusInfo);
|
|
156
|
+
it('alice Leaves the meeting', () => Promise.all([
|
|
157
|
+
testUtils.delayedPromise(alice.meeting.leave()),
|
|
158
|
+
testUtils.waitForEvents([{scope: chris.meeting.members, event: 'members:update', match: testUtils.checkParticipantUpdatedStatus(alice, 'NOT_IN_MEETING')}])
|
|
159
|
+
]).then(() => testUtils.waitForStateChange(alice.meeting, 'LEFT')));
|
|
177
160
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
161
|
+
it('bob and chris leave meeting', () =>
|
|
162
|
+
Promise.all([
|
|
163
|
+
testUtils.delayedPromise(bob.meeting.leave()),
|
|
164
|
+
testUtils.waitForEvents([{scope: chris.meeting.members, event: 'members:update', match: testUtils.checkParticipantUpdatedStatus(bob, 'NOT_IN_MEETING')}])
|
|
165
|
+
]).then(() => testUtils.waitForStateChange(bob.meeting, 'LEFT'))
|
|
166
|
+
.then(() => chris.meeting.leave())
|
|
167
|
+
.then(() => testUtils.waitUntil(4000)));
|
|
181
168
|
|
|
182
169
|
|
|
183
170
|
it('check for meeting cleanup', () => {
|
|
@@ -323,13 +310,10 @@ skipInNode(describe)('plugin-meetings', () => {
|
|
|
323
310
|
return Promise.all([
|
|
324
311
|
testUtils.delayedPromise(guest.meeting.join()),
|
|
325
312
|
testUtils.waitForEvents([{scope: guest.meeting, event: 'meeting:self:lobbyWaiting'}]),
|
|
326
|
-
testUtils.waitForEvents([{scope: alice.meeting.members, event: 'members:update'}])
|
|
327
|
-
.then((
|
|
328
|
-
const guestParticipant = response[0].result.delta.updated.find((member) => guest.meeting.members.selfId === member.id);
|
|
329
|
-
|
|
330
|
-
assert.equal(guestParticipant.status, 'IN_LOBBY');
|
|
313
|
+
testUtils.waitForEvents([{scope: alice.meeting.members, event: 'members:update', match: testUtils.checkParticipantUpdatedStatus(guest, 'IN_LOBBY')}])
|
|
314
|
+
.then(() => {
|
|
331
315
|
Promise.all([
|
|
332
|
-
testUtils.delayedPromise(alice.meeting.admit(
|
|
316
|
+
testUtils.delayedPromise(alice.meeting.admit(guest.meeting.members.selfId)),
|
|
333
317
|
testUtils.waitForEvents([{scope: guest.meeting, event: 'meeting:self:guestAdmitted'}])
|
|
334
318
|
]);
|
|
335
319
|
})
|
|
@@ -337,17 +321,12 @@ skipInNode(describe)('plugin-meetings', () => {
|
|
|
337
321
|
.then(() => testUtils.waitForStateChange(guest.meeting, 'JOINED'))
|
|
338
322
|
.then(() => testUtils.addMedia(guest));
|
|
339
323
|
})
|
|
324
|
+
.catch((e) => { console.error('Error guest joining the meeting ', e); throw e; })
|
|
340
325
|
.then(() => Promise.all([
|
|
341
326
|
testUtils.delayedPromise(chris.meeting.leave()),
|
|
342
|
-
testUtils.waitForEvents([{scope: alice.meeting.members, event: 'members:update'}])
|
|
343
|
-
.then((response) => {
|
|
344
|
-
console.log('CHRIS RESPONSE ', response[0]);
|
|
345
|
-
const chrisParticipant = response[0].result.delta.updated.find((member) => chris.meeting.members.selfId === member.id);
|
|
346
|
-
|
|
347
|
-
assert.equal(chrisParticipant.status, 'NOT_IN_MEETING');
|
|
348
|
-
})
|
|
327
|
+
testUtils.waitForEvents([{scope: alice.meeting.members, event: 'members:update', match: testUtils.checkParticipantUpdatedStatus(chris, 'NOT_IN_MEETING')}])
|
|
349
328
|
]))
|
|
350
|
-
.catch((e) => { console.error('Error chris
|
|
329
|
+
.catch((e) => { console.error('Error chris leaving the meeting ', e); throw e; }));
|
|
351
330
|
|
|
352
331
|
it('leave claimed PMR', () => alice.meeting.leave()
|
|
353
332
|
.then(() => bob.meeting.leave())
|
package/test/utils/testUtils.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import {assert} from '@webex/test-helper-chai';
|
|
2
|
+
import {Defer} from '@webex/common';
|
|
2
3
|
|
|
3
4
|
const max = 30000;
|
|
4
5
|
const waitForSpy = (spy, event) => {
|
|
@@ -192,12 +193,18 @@ const delayedTest = (callback, timeout) => new Promise((resolve) => {
|
|
|
192
193
|
});
|
|
193
194
|
|
|
194
195
|
const addMedia = (user) => {
|
|
195
|
-
const
|
|
196
|
+
const mediaReadyPromises = {
|
|
197
|
+
local: new Defer(),
|
|
198
|
+
remoteAudio: new Defer(),
|
|
199
|
+
remoteVideo: new Defer(),
|
|
200
|
+
};
|
|
196
201
|
const mediaReady = (media) => {
|
|
197
202
|
if (!media) {
|
|
198
203
|
return;
|
|
199
204
|
}
|
|
200
|
-
|
|
205
|
+
if (mediaReadyPromises[media.type]) {
|
|
206
|
+
mediaReadyPromises[media.type].resolve();
|
|
207
|
+
}
|
|
201
208
|
};
|
|
202
209
|
|
|
203
210
|
user.meeting.on('media:ready', mediaReady);
|
|
@@ -219,13 +226,11 @@ const addMedia = (user) => {
|
|
|
219
226
|
localShare,
|
|
220
227
|
localStream
|
|
221
228
|
}))
|
|
222
|
-
.then(() =>
|
|
223
|
-
|
|
224
|
-
assert.exists(mediaReadyEvent.remoteAudio, 'remoteAudio event not triggered');
|
|
225
|
-
assert.exists(mediaReadyEvent.remoteVideo, 'remoteVideo event not triggered');
|
|
229
|
+
.then(() => Promise.all(Object.values(mediaReadyPromises).map((defer) => defer.promise)))
|
|
230
|
+
.then(() => {
|
|
226
231
|
assert.exists(user.meeting.mediaProperties.audioTrack, 'audioTrack not present');
|
|
227
232
|
assert.exists(user.meeting.mediaProperties.videoTrack, 'videoTrack not present');
|
|
228
|
-
}
|
|
233
|
+
});
|
|
229
234
|
};
|
|
230
235
|
|
|
231
236
|
const waitUntil = (waitTime) => new Promise((resolve) => {
|
|
@@ -252,12 +257,17 @@ const getCircularReplacer = () => {
|
|
|
252
257
|
};
|
|
253
258
|
};
|
|
254
259
|
|
|
260
|
+
// this function is meant to be used as the "match" callback with waitForEvents()
|
|
261
|
+
// when you want to wait for a particular users's status to reach a certain value
|
|
262
|
+
const checkParticipantUpdatedStatus = (user, expectedStatus) => (event) => !!event.delta.updated.find((member) => user.meeting.members.selfId === member.id && member.status === expectedStatus);
|
|
263
|
+
|
|
255
264
|
export default {
|
|
256
265
|
waitForSpy,
|
|
257
266
|
waitForStateChange,
|
|
258
267
|
waitForCallEnded,
|
|
259
268
|
syncAndEndMeeting,
|
|
260
269
|
waitForEvents,
|
|
270
|
+
checkParticipantUpdatedStatus,
|
|
261
271
|
delayedPromise,
|
|
262
272
|
addMedia,
|
|
263
273
|
waitUntil,
|