@webex/plugin-meetings 2.59.8-next.2 → 2.60.0
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/common/browser-detection.d.ts +9 -0
- package/dist/common/browser-detection.js +2 -2
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.d.ts +48 -0
- package/dist/common/collection.js +2 -2
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.d.ts +2 -0
- package/dist/common/errors/captcha-error.d.ts +15 -0
- package/dist/common/errors/intent-to-join.d.ts +16 -0
- package/dist/common/errors/join-meeting.d.ts +17 -0
- package/dist/common/errors/media.d.ts +15 -0
- package/dist/common/errors/parameter.d.ts +15 -0
- package/dist/common/errors/password-error.d.ts +15 -0
- package/dist/common/errors/permission.d.ts +14 -0
- package/dist/common/errors/reclaim-host-role-error.d.ts +60 -0
- package/dist/common/errors/reclaim-host-role-error.js +158 -0
- package/dist/common/errors/reclaim-host-role-error.js.map +1 -0
- package/dist/common/errors/reconnection-in-progress.d.ts +9 -0
- package/dist/common/errors/reconnection.d.ts +15 -0
- package/dist/common/errors/stats.d.ts +15 -0
- package/dist/common/errors/webex-errors.d.ts +81 -0
- package/dist/common/errors/webex-meetings-error.d.ts +20 -0
- package/dist/common/events/events-scope.d.ts +17 -0
- package/dist/common/events/events.d.ts +12 -0
- package/dist/common/events/trigger-proxy.d.ts +2 -0
- package/dist/common/events/util.d.ts +2 -0
- package/dist/common/logs/logger-config.d.ts +2 -0
- package/dist/common/logs/logger-proxy.d.ts +2 -0
- package/dist/common/logs/request.d.ts +34 -0
- package/dist/common/queue.d.ts +32 -0
- package/dist/config.d.ts +73 -0
- package/dist/config.js +2 -2
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +952 -0
- package/dist/constants.js +31 -2
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.d.ts +4 -0
- package/dist/controls-options-manager/enums.d.ts +5 -0
- package/dist/controls-options-manager/index.d.ts +120 -0
- package/dist/controls-options-manager/index.js +2 -2
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/util.d.ts +7 -0
- package/dist/index.d.ts +4 -0
- package/dist/locus-info/controlsUtils.d.ts +2 -0
- package/dist/locus-info/controlsUtils.js +6 -6
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.d.ts +2 -0
- package/dist/locus-info/fullState.d.ts +2 -0
- package/dist/locus-info/hostUtils.d.ts +2 -0
- package/dist/locus-info/index.d.ts +269 -0
- package/dist/locus-info/index.js +18 -18
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.d.ts +2 -0
- package/dist/locus-info/mediaSharesUtils.d.ts +2 -0
- package/dist/locus-info/parser.d.ts +212 -0
- package/dist/locus-info/parser.js +2 -2
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.d.ts +2 -0
- package/dist/media/index.d.ts +32 -0
- package/dist/media/properties.d.ts +108 -0
- package/dist/media/util.d.ts +2 -0
- package/dist/mediaQualityMetrics/config.d.ts +233 -0
- package/dist/meeting/effectsState.d.ts +42 -0
- package/dist/meeting/in-meeting-actions.d.ts +79 -0
- package/dist/meeting/index.d.ts +1622 -0
- package/dist/meeting/index.js +51 -28
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.d.ts +116 -0
- package/dist/meeting/request.d.ts +255 -0
- package/dist/meeting/request.js +2 -2
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/state.d.ts +9 -0
- package/dist/meeting/util.d.ts +2 -0
- package/dist/meeting/util.js +4 -4
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.d.ts +20 -0
- package/dist/meeting-info/collection.js +2 -2
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.d.ts +57 -0
- package/dist/meeting-info/meeting-info-v2.d.ts +93 -0
- package/dist/meeting-info/request.d.ts +22 -0
- package/dist/meeting-info/util.d.ts +2 -0
- package/dist/meeting-info/utilv2.d.ts +2 -0
- package/dist/meetings/collection.d.ts +23 -0
- package/dist/meetings/collection.js +2 -2
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.d.ts +296 -0
- package/dist/meetings/request.d.ts +27 -0
- package/dist/meetings/util.d.ts +18 -0
- package/dist/member/index.d.ts +148 -0
- package/dist/member/index.js +9 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/member.types.d.ts +11 -0
- package/dist/member/util.d.ts +2 -0
- package/dist/member/util.js +11 -0
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.d.ts +24 -0
- package/dist/members/index.d.ts +308 -0
- package/dist/members/index.js +39 -2
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.d.ts +58 -0
- package/dist/members/request.js +19 -0
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.d.ts +25 -0
- package/dist/members/types.js +15 -0
- package/dist/members/types.js.map +1 -0
- package/dist/members/util.d.ts +2 -0
- package/dist/members/util.js +50 -0
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.d.ts +169 -0
- package/dist/metrics/constants.d.ts +59 -0
- package/dist/metrics/constants.js +2 -0
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.d.ts +152 -0
- package/dist/metrics/index.js +2 -2
- package/dist/metrics/index.js.map +1 -1
- package/dist/networkQualityMonitor/index.d.ts +70 -0
- package/dist/peer-connection-manager/index.d.ts +6 -0
- package/dist/peer-connection-manager/util.d.ts +6 -0
- package/dist/personal-meeting-room/index.d.ts +47 -0
- package/dist/personal-meeting-room/request.d.ts +14 -0
- package/dist/personal-meeting-room/util.d.ts +2 -0
- package/dist/reachability/index.d.ts +139 -0
- package/dist/reachability/index.js +2 -9
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.d.ts +35 -0
- package/dist/reactions/reactions.d.ts +4 -0
- package/dist/reactions/reactions.type.d.ts +32 -0
- package/dist/reconnection-manager/index.d.ts +112 -0
- package/dist/recording-controller/enums.d.ts +7 -0
- package/dist/recording-controller/index.d.ts +193 -0
- package/dist/recording-controller/util.d.ts +13 -0
- package/dist/roap/collection.d.ts +10 -0
- package/dist/roap/handler.d.ts +47 -0
- package/dist/roap/index.d.ts +116 -0
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.d.ts +35 -0
- package/dist/roap/state.d.ts +9 -0
- package/dist/roap/turnDiscovery.d.ts +81 -0
- package/dist/roap/util.d.ts +2 -0
- package/dist/statsAnalyzer/global.d.ts +118 -0
- package/dist/statsAnalyzer/global.js +4 -12
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.d.ts +193 -0
- package/dist/statsAnalyzer/index.js +56 -14
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.d.ts +22 -0
- package/dist/statsAnalyzer/mqaUtil.js +15 -15
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.d.ts +64 -0
- package/package.json +21 -22
- package/src/common/errors/reclaim-host-role-error.ts +134 -0
- package/src/config.ts +2 -2
- package/src/constants.ts +33 -0
- package/src/meeting/index.ts +35 -0
- package/src/member/index.ts +9 -0
- package/src/member/util.ts +14 -0
- package/src/members/index.ts +55 -1
- package/src/members/request.ts +20 -0
- package/src/members/types.ts +29 -0
- package/src/members/util.ts +52 -0
- package/src/metrics/constants.ts +2 -0
- package/src/roap/index.ts +1 -0
- package/src/statsAnalyzer/global.ts +2 -10
- package/src/statsAnalyzer/index.ts +80 -17
- package/test/unit/spec/meeting/index.js +77 -6
- package/test/unit/spec/member/index.js +7 -0
- package/test/unit/spec/member/util.js +32 -0
- package/test/unit/spec/members/index.js +205 -0
- package/test/unit/spec/members/utils.js +75 -0
- package/test/unit/spec/roap/index.ts +0 -1
- package/test/unit/spec/stats-analyzer/index.js +151 -0
|
@@ -16,6 +16,13 @@ import ParameterError from '@webex/plugin-meetings/src/common/errors/parameter';
|
|
|
16
16
|
import Members from '@webex/plugin-meetings/src/members';
|
|
17
17
|
import MembersUtil from '@webex/plugin-meetings/src/members/util';
|
|
18
18
|
|
|
19
|
+
import {
|
|
20
|
+
ReclaimHostEmptyWrongKeyError,
|
|
21
|
+
ReclaimHostIsHostAlreadyError,
|
|
22
|
+
ReclaimHostNotAllowedError,
|
|
23
|
+
ReclaimHostNotSupportedError,
|
|
24
|
+
} from '../../../../src/common/errors/reclaim-host-role-error';
|
|
25
|
+
|
|
19
26
|
const {assert} = chai;
|
|
20
27
|
|
|
21
28
|
chai.use(chaiAsPromised);
|
|
@@ -192,6 +199,204 @@ describe('plugin-meetings', () => {
|
|
|
192
199
|
});
|
|
193
200
|
});
|
|
194
201
|
|
|
202
|
+
describe('#assignRoles', () => {
|
|
203
|
+
const fakeRoles = [
|
|
204
|
+
{type: 'PRESENTER', hasRole: true},
|
|
205
|
+
{type: 'MODERATOR', hasRole: false},
|
|
206
|
+
{type: 'COHOST', hasRole: true},
|
|
207
|
+
];
|
|
208
|
+
|
|
209
|
+
const resolvedValue = "it worked";
|
|
210
|
+
|
|
211
|
+
const genericMessage = 'Generic error from the API';
|
|
212
|
+
|
|
213
|
+
const setup = (locusUrl, errorCode) => {
|
|
214
|
+
const members = createMembers({url: locusUrl});
|
|
215
|
+
|
|
216
|
+
const spies = {
|
|
217
|
+
generateRoleAssignmentMemberOptions: sandbox.spy(
|
|
218
|
+
MembersUtil,
|
|
219
|
+
'generateRoleAssignmentMemberOptions'
|
|
220
|
+
),
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
if (errorCode) {
|
|
224
|
+
spies.assignRolesMember = sandbox.stub(members.membersRequest, 'assignRolesMember').rejects({body: {errorCode}, message: genericMessage});
|
|
225
|
+
} else {
|
|
226
|
+
spies.assignRolesMember = sandbox.stub(members.membersRequest, 'assignRolesMember').resolves(resolvedValue);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return {members, spies};
|
|
230
|
+
};
|
|
231
|
+
|
|
232
|
+
const checkInvalid = async (resultPromise, expectedMessage, spies) => {
|
|
233
|
+
await assert.isRejected(resultPromise, ParameterError, expectedMessage);
|
|
234
|
+
assert.notCalled(spies.generateRoleAssignmentMemberOptions);
|
|
235
|
+
assert.notCalled(spies.assignRolesMember);
|
|
236
|
+
};
|
|
237
|
+
|
|
238
|
+
const checkError = async (error, expectedMemberId, expectedRoles, expectedLocusUrl, resultPromise, expectedMessage, spies) => {
|
|
239
|
+
await assert.isRejected(resultPromise, error, expectedMessage);
|
|
240
|
+
assert.calledOnceWithExactly(
|
|
241
|
+
spies.generateRoleAssignmentMemberOptions,
|
|
242
|
+
expectedMemberId,
|
|
243
|
+
expectedRoles,
|
|
244
|
+
expectedLocusUrl
|
|
245
|
+
);
|
|
246
|
+
assert.calledOnceWithExactly(spies.assignRolesMember, {
|
|
247
|
+
memberId: expectedMemberId,
|
|
248
|
+
roles: expectedRoles,
|
|
249
|
+
locusUrl: expectedLocusUrl,
|
|
250
|
+
});
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
const checkValid = async (
|
|
254
|
+
resultPromise,
|
|
255
|
+
spies,
|
|
256
|
+
expectedMemberId,
|
|
257
|
+
expectedRoles,
|
|
258
|
+
expectedLocusUrl
|
|
259
|
+
) => {
|
|
260
|
+
const resolvedValue = await assert.isFulfilled(resultPromise);
|
|
261
|
+
assert.calledOnceWithExactly(
|
|
262
|
+
spies.generateRoleAssignmentMemberOptions,
|
|
263
|
+
expectedMemberId,
|
|
264
|
+
expectedRoles,
|
|
265
|
+
expectedLocusUrl
|
|
266
|
+
);
|
|
267
|
+
assert.calledOnceWithExactly(spies.assignRolesMember, {
|
|
268
|
+
memberId: expectedMemberId,
|
|
269
|
+
roles: expectedRoles,
|
|
270
|
+
locusUrl: expectedLocusUrl,
|
|
271
|
+
});
|
|
272
|
+
assert.strictEqual(resolvedValue, resolvedValue);
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
it('should not make a request if there is no member id', async () => {
|
|
276
|
+
const {members, spies} = setup(url1);
|
|
277
|
+
|
|
278
|
+
const resultPromise = members.assignRoles();
|
|
279
|
+
|
|
280
|
+
await checkInvalid(
|
|
281
|
+
resultPromise,
|
|
282
|
+
'The member id must be defined to assign the roles to a member.',
|
|
283
|
+
spies,
|
|
284
|
+
);
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
it('should not make a request if there is no locus url', async () => {
|
|
288
|
+
const {members, spies} = setup();
|
|
289
|
+
|
|
290
|
+
const resultPromise = members.assignRoles(uuid.v4());
|
|
291
|
+
|
|
292
|
+
await checkInvalid(
|
|
293
|
+
resultPromise,
|
|
294
|
+
'The associated locus url for this meetings members object must be defined.',
|
|
295
|
+
spies,
|
|
296
|
+
);
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
it('should not make a request if locus throws ReclaimHostNotSupportedError', async () => {
|
|
300
|
+
const memberId = uuid.v4();
|
|
301
|
+
const {members, spies} = setup(url1, 2400127);
|
|
302
|
+
|
|
303
|
+
const resultPromise = members.assignRoles(memberId, fakeRoles);
|
|
304
|
+
|
|
305
|
+
await checkError(
|
|
306
|
+
ReclaimHostNotSupportedError,
|
|
307
|
+
memberId,
|
|
308
|
+
fakeRoles,
|
|
309
|
+
url1,
|
|
310
|
+
resultPromise,
|
|
311
|
+
'Non converged meetings, PSTN or SIP users in converged meetings are not supported currently.',
|
|
312
|
+
spies,
|
|
313
|
+
);
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
it('should not make a request if locus throws ReclaimHostNotAllowedError', async () => {
|
|
317
|
+
const memberId = uuid.v4();
|
|
318
|
+
const {members, spies} = setup(url1, 2403135);
|
|
319
|
+
|
|
320
|
+
const resultPromise = members.assignRoles(memberId, fakeRoles);
|
|
321
|
+
|
|
322
|
+
await checkError(
|
|
323
|
+
ReclaimHostNotAllowedError,
|
|
324
|
+
memberId,
|
|
325
|
+
fakeRoles,
|
|
326
|
+
url1,
|
|
327
|
+
resultPromise,
|
|
328
|
+
'Reclaim Host Role Not Allowed For Other Participants. Participants cannot claim host role in PMR meeting, space instant meeting or escalated instant meeting. However, the original host still can reclaim host role when it manually makes another participant to be the host.',
|
|
329
|
+
spies,
|
|
330
|
+
);
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
it('should not make a request if locus throws ReclaimHostEmptyWrongKeyError', async () => {
|
|
334
|
+
const memberId = uuid.v4();
|
|
335
|
+
const {members, spies} = setup(url1, 2403136);
|
|
336
|
+
|
|
337
|
+
const resultPromise = members.assignRoles(memberId, fakeRoles);
|
|
338
|
+
|
|
339
|
+
await checkError(
|
|
340
|
+
ReclaimHostEmptyWrongKeyError,
|
|
341
|
+
memberId,
|
|
342
|
+
fakeRoles,
|
|
343
|
+
url1,
|
|
344
|
+
resultPromise,
|
|
345
|
+
'Host Key Not Specified Or Matched. The original host can reclaim the host role without entering the host key. However, any other person who claims the host role must enter the host key to get it.',
|
|
346
|
+
spies,
|
|
347
|
+
);
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
it('should not make a request if locus throws ReclaimHostIsHostAlreadyError', async () => {
|
|
351
|
+
const memberId = uuid.v4();
|
|
352
|
+
const {members, spies} = setup(url1, 2409150);
|
|
353
|
+
|
|
354
|
+
const resultPromise = members.assignRoles(memberId, fakeRoles);
|
|
355
|
+
|
|
356
|
+
await checkError(
|
|
357
|
+
ReclaimHostIsHostAlreadyError,
|
|
358
|
+
memberId,
|
|
359
|
+
fakeRoles,
|
|
360
|
+
url1,
|
|
361
|
+
resultPromise,
|
|
362
|
+
'Participant Having Host Role Already. Participant who sends request to reclaim host role has already a host role.',
|
|
363
|
+
spies,
|
|
364
|
+
);
|
|
365
|
+
});
|
|
366
|
+
|
|
367
|
+
it('should not make a request if locus throws a different error', async () => {
|
|
368
|
+
const memberId = uuid.v4();
|
|
369
|
+
const {members, spies} = setup(url1, 1234);
|
|
370
|
+
|
|
371
|
+
const resultPromise = members.assignRoles(memberId, fakeRoles);
|
|
372
|
+
|
|
373
|
+
await checkError(
|
|
374
|
+
{body: {errorCode: 1234}, message: genericMessage},
|
|
375
|
+
memberId,
|
|
376
|
+
fakeRoles,
|
|
377
|
+
url1,
|
|
378
|
+
resultPromise,
|
|
379
|
+
genericMessage,
|
|
380
|
+
spies,
|
|
381
|
+
);
|
|
382
|
+
});
|
|
383
|
+
|
|
384
|
+
it('should make the correct request when called with roles', async () => {
|
|
385
|
+
const memberId = uuid.v4();
|
|
386
|
+
const {members, spies} = setup(url1);
|
|
387
|
+
|
|
388
|
+
const resultPromise = members.assignRoles(memberId, fakeRoles);
|
|
389
|
+
|
|
390
|
+
await checkValid(
|
|
391
|
+
resultPromise,
|
|
392
|
+
spies,
|
|
393
|
+
memberId,
|
|
394
|
+
fakeRoles,
|
|
395
|
+
url1,
|
|
396
|
+
);
|
|
397
|
+
});
|
|
398
|
+
});
|
|
399
|
+
|
|
195
400
|
describe('#raiseOrLowerHand', () => {
|
|
196
401
|
const setup = (locusUrl) => {
|
|
197
402
|
const members = createMembers({url: locusUrl});
|
|
@@ -4,6 +4,8 @@ import chaiAsPromised from 'chai-as-promised';
|
|
|
4
4
|
|
|
5
5
|
import MembersUtil from '@webex/plugin-meetings/src/members/util';
|
|
6
6
|
|
|
7
|
+
import {CONTROLS, PARTICIPANT} from '@webex/plugin-meetings/src/constants';
|
|
8
|
+
|
|
7
9
|
const {assert} = chai;
|
|
8
10
|
|
|
9
11
|
chai.use(chaiAsPromised);
|
|
@@ -38,5 +40,78 @@ describe('plugin-meetings', () => {
|
|
|
38
40
|
);
|
|
39
41
|
});
|
|
40
42
|
});
|
|
43
|
+
|
|
44
|
+
describe('#getAddedRoleShape', () => {
|
|
45
|
+
it('returns the correct shape with hostkey', () => {
|
|
46
|
+
const format = {type: 'PRESENTER', hasRole: true, hostKey: '123456'};
|
|
47
|
+
assert.deepEqual(MembersUtil.getAddedRoleShape(format), {
|
|
48
|
+
type: 'PRESENTER',
|
|
49
|
+
hasRole: true,
|
|
50
|
+
hostKey: '123456',
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('returns the correct shape without hostkey', () => {
|
|
55
|
+
const format = {type: 'PRESENTER', hasRole: true};
|
|
56
|
+
assert.deepEqual(MembersUtil.getAddedRoleShape(format), {
|
|
57
|
+
type: 'PRESENTER',
|
|
58
|
+
hasRole: true,
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
describe('#getRoleAssignmentMemberRequestParams', () => {
|
|
65
|
+
it('returns the correct request params', () => {
|
|
66
|
+
const format = {
|
|
67
|
+
locusUrl: 'locusUrl',
|
|
68
|
+
memberId: 'test',
|
|
69
|
+
roles: [
|
|
70
|
+
{type: 'PRESENTER', hasRole: true},
|
|
71
|
+
{type: 'MODERATOR', hasRole: false},
|
|
72
|
+
{type: 'COHOST', hasRole: true},
|
|
73
|
+
],
|
|
74
|
+
};
|
|
75
|
+
assert.deepEqual(MembersUtil.getRoleAssignmentMemberRequestParams(format), {
|
|
76
|
+
method: 'PATCH',
|
|
77
|
+
uri: `locusUrl/${PARTICIPANT}/test/${CONTROLS}`,
|
|
78
|
+
body: {
|
|
79
|
+
role: {
|
|
80
|
+
roles: [
|
|
81
|
+
{type: 'PRESENTER', hasRole: true},
|
|
82
|
+
{type: 'MODERATOR', hasRole: false},
|
|
83
|
+
{type: 'COHOST', hasRole: true},
|
|
84
|
+
],
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('returns the correct request params with a hostKey', () => {
|
|
91
|
+
const format = {
|
|
92
|
+
locusUrl: 'locusUrl',
|
|
93
|
+
memberId: 'test',
|
|
94
|
+
roles: [
|
|
95
|
+
{type: 'PRESENTER', hasRole: true, hostKey: '123456'},
|
|
96
|
+
{type: 'MODERATOR', hasRole: false, hostKey: '123456'},
|
|
97
|
+
{type: 'COHOST', hasRole: true, hostKey: '123456'},
|
|
98
|
+
],
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
assert.deepEqual(MembersUtil.getRoleAssignmentMemberRequestParams(format), {
|
|
102
|
+
method: 'PATCH',
|
|
103
|
+
uri: `locusUrl/${PARTICIPANT}/test/${CONTROLS}`,
|
|
104
|
+
body: {
|
|
105
|
+
role: {
|
|
106
|
+
roles: [
|
|
107
|
+
{type: 'PRESENTER', hasRole: true, hostKey: '123456'},
|
|
108
|
+
{type: 'MODERATOR', hasRole: false, hostKey: '123456'},
|
|
109
|
+
{type: 'COHOST', hasRole: true, hostKey: '123456'},
|
|
110
|
+
],
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
});
|
|
41
116
|
});
|
|
42
117
|
});
|
|
@@ -82,6 +82,22 @@ describe('plugin-meetings', () => {
|
|
|
82
82
|
let pc;
|
|
83
83
|
let networkQualityMonitor;
|
|
84
84
|
let statsAnalyzer;
|
|
85
|
+
const statusResultOutboundRTP = {
|
|
86
|
+
type: 'outbound-rtp',
|
|
87
|
+
frameHeight: 720,
|
|
88
|
+
frameWidth: 1280,
|
|
89
|
+
packetsLost: 11,
|
|
90
|
+
framesSent: 105,
|
|
91
|
+
hugeFramesSent: 1,
|
|
92
|
+
framesEncoded: 102,
|
|
93
|
+
rttThreshold: 501,
|
|
94
|
+
jitterThreshold: 501,
|
|
95
|
+
jitterBufferDelay: 288.131459,
|
|
96
|
+
jitterBufferEmittedCount: 4013,
|
|
97
|
+
trackIdentifier: '6bbf5506-6a7e-4397-951c-c05b72ab0ace',
|
|
98
|
+
bytesSent: 1233,
|
|
99
|
+
totalPacketsSent: 100,
|
|
100
|
+
};
|
|
85
101
|
|
|
86
102
|
let receivedEventsData = {
|
|
87
103
|
local: {},
|
|
@@ -177,6 +193,12 @@ describe('plugin-meetings', () => {
|
|
|
177
193
|
statsAnalyzer.on(EVENTS.REMOTE_MEDIA_STOPPED, (data) => {
|
|
178
194
|
receivedEventsData.remote.stopped = data;
|
|
179
195
|
});
|
|
196
|
+
statsAnalyzer.on(EVENTS.NO_FRAMES_SENT, (data) => {
|
|
197
|
+
receivedEventsData.noFramesSent = data;
|
|
198
|
+
});
|
|
199
|
+
statsAnalyzer.on(EVENTS.NO_VIDEO_ENCODED, (data) => {
|
|
200
|
+
receivedEventsData.noVideoEncoded = data;
|
|
201
|
+
});
|
|
180
202
|
});
|
|
181
203
|
|
|
182
204
|
afterEach(() => {
|
|
@@ -282,6 +304,135 @@ describe('plugin-meetings', () => {
|
|
|
282
304
|
|
|
283
305
|
checkReceivedEvent({expected: {remote: {stopped: {type: 'video'}}}});
|
|
284
306
|
});
|
|
307
|
+
|
|
308
|
+
const checkStats = (type) => {
|
|
309
|
+
const statsResult = {
|
|
310
|
+
height: 720,
|
|
311
|
+
width: 1280,
|
|
312
|
+
jitterBufferDelay: 288.131459,
|
|
313
|
+
jitterBufferEmittedCount: 4013,
|
|
314
|
+
trackIdentifier: '6bbf5506-6a7e-4397-951c-c05b72ab0ace',
|
|
315
|
+
avgJitterDelay: 0.07179951632195365,
|
|
316
|
+
};
|
|
317
|
+
if (type === 'inbound-rtp') {
|
|
318
|
+
statsResult.framesDecoded = 4013;
|
|
319
|
+
statsResult.framesDropped = 0;
|
|
320
|
+
statsResult.framesReceived = 4016;
|
|
321
|
+
assert.deepEqual(statsAnalyzer.statsResults.resolutions.video.recv, statsResult);
|
|
322
|
+
} else if (type === 'outbound-rtp') {
|
|
323
|
+
statsResult.framesSent = 105;
|
|
324
|
+
statsResult.hugeFramesSent = 1;
|
|
325
|
+
assert.deepEqual(statsAnalyzer.statsResults.resolutions.video.send, statsResult);
|
|
326
|
+
}
|
|
327
|
+
};
|
|
328
|
+
|
|
329
|
+
it('processes track results and populate statsResults.resolutions object when type is inbound-rtp with video', async () => {
|
|
330
|
+
await startStatsAnalyzer({expected: {receiveVideo: true}});
|
|
331
|
+
const statusResultInboundRTP = {
|
|
332
|
+
type: 'inbound-rtp',
|
|
333
|
+
frameHeight: 720,
|
|
334
|
+
frameWidth: 1280,
|
|
335
|
+
packetsLost: 11,
|
|
336
|
+
rttThreshold: 501,
|
|
337
|
+
jitterThreshold: 501,
|
|
338
|
+
framesDecoded: 4013,
|
|
339
|
+
framesDropped: 0,
|
|
340
|
+
framesReceived: 4016,
|
|
341
|
+
jitterBufferDelay: 288.131459,
|
|
342
|
+
jitterBufferEmittedCount: 4013,
|
|
343
|
+
trackIdentifier: '6bbf5506-6a7e-4397-951c-c05b72ab0ace',
|
|
344
|
+
};
|
|
345
|
+
await statsAnalyzer.parseGetStatsResult(statusResultInboundRTP, 'video');
|
|
346
|
+
checkStats('inbound-rtp');
|
|
347
|
+
});
|
|
348
|
+
it('processes track results and populate statsResults.resolutions object when type is outbound-rtp with video', async () => {
|
|
349
|
+
await startStatsAnalyzer({expected: {receiveVideo: true}});
|
|
350
|
+
|
|
351
|
+
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
|
|
352
|
+
checkStats('outbound-rtp');
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
it('doesnot processes track results with audio', async () => {
|
|
356
|
+
await startStatsAnalyzer({expected: {receiveAudio: true}});
|
|
357
|
+
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'audio');
|
|
358
|
+
assert.deepEqual(statsAnalyzer.statsResults.resolutions.audio, undefined);
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
it('emits NO_FRAMES_ENCODED when frames are not being encoded', async () => {
|
|
362
|
+
const expected = {mediaType: 'video'};
|
|
363
|
+
await startStatsAnalyzer({expected: {sendVideo: true}});
|
|
364
|
+
|
|
365
|
+
statsAnalyzer.lastStatsResults.video.send = {framesEncoded: 102, totalPacketsSent: 106};
|
|
366
|
+
|
|
367
|
+
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
|
|
368
|
+
|
|
369
|
+
statsAnalyzer.compareLastStatsResult();
|
|
370
|
+
assert.deepEqual(receivedEventsData.noVideoEncoded, expected);
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
it('emits NO_FRAMES_SENT when frames are not being sent but frames are being encoded', async () => {
|
|
374
|
+
await startStatsAnalyzer({expected: {sendVideo: true}});
|
|
375
|
+
|
|
376
|
+
const expected = {mediaType: 'video'};
|
|
377
|
+
|
|
378
|
+
statsAnalyzer.lastStatsResults.video.send = {
|
|
379
|
+
framesEncoded: 10,
|
|
380
|
+
framesSent: 105,
|
|
381
|
+
totalPacketsSent: 106,
|
|
382
|
+
};
|
|
383
|
+
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
|
|
384
|
+
|
|
385
|
+
statsAnalyzer.compareLastStatsResult();
|
|
386
|
+
assert.deepEqual(receivedEventsData.noFramesSent, expected);
|
|
387
|
+
});
|
|
388
|
+
|
|
389
|
+
it('doesnot emits NO_FRAMES_SENT when last emitted event is LOCAL_MEDIA_STOPPED', async () => {
|
|
390
|
+
statsAnalyzer.lastEmittedStartStopEvent.video.local = EVENTS.LOCAL_MEDIA_STOPPED;
|
|
391
|
+
|
|
392
|
+
await startStatsAnalyzer({expected: {sendVideo: true}});
|
|
393
|
+
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'video');
|
|
394
|
+
|
|
395
|
+
statsAnalyzer.compareLastStatsResult();
|
|
396
|
+
assert.deepEqual(receivedEventsData.noFramesSent, undefined);
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
it('emits NO_FRAMES_ENCODED when frames are not being encoded for share', async () => {
|
|
400
|
+
const expected = {mediaType: 'share'};
|
|
401
|
+
await startStatsAnalyzer({expected: {sendShare: true}});
|
|
402
|
+
|
|
403
|
+
statsAnalyzer.lastStatsResults.share.send = {framesEncoded: 102, totalPacketsSent: 106};
|
|
404
|
+
|
|
405
|
+
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'share');
|
|
406
|
+
|
|
407
|
+
statsAnalyzer.compareLastStatsResult();
|
|
408
|
+
assert.deepEqual(receivedEventsData.noVideoEncoded, expected);
|
|
409
|
+
});
|
|
410
|
+
|
|
411
|
+
it('emits NO_FRAMES_SENT when frames are not being sent but frames are being encoded for share', async () => {
|
|
412
|
+
const expected = {mediaType: 'share'};
|
|
413
|
+
await startStatsAnalyzer({expected: {sendShare: true}});
|
|
414
|
+
|
|
415
|
+
statsAnalyzer.lastStatsResults.share.send = {
|
|
416
|
+
framesEncoded: 10,
|
|
417
|
+
framesSent: 105,
|
|
418
|
+
totalPacketsSent: 106,
|
|
419
|
+
};
|
|
420
|
+
|
|
421
|
+
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'share');
|
|
422
|
+
|
|
423
|
+
statsAnalyzer.compareLastStatsResult();
|
|
424
|
+
assert.deepEqual(receivedEventsData.noFramesSent, expected);
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
it('doesnot emits NO_FRAMES_SENT when last emitted event is LOCAL_MEDIA_STOPPED for share', async () => {
|
|
428
|
+
statsAnalyzer.lastEmittedStartStopEvent.video.local = EVENTS.LOCAL_MEDIA_STOPPED;
|
|
429
|
+
|
|
430
|
+
await startStatsAnalyzer({expected: {sendShare: true}});
|
|
431
|
+
await statsAnalyzer.parseGetStatsResult(statusResultOutboundRTP, 'share');
|
|
432
|
+
|
|
433
|
+
statsAnalyzer.compareLastStatsResult();
|
|
434
|
+
assert.deepEqual(receivedEventsData.noFramesSent, undefined);
|
|
435
|
+
});
|
|
285
436
|
});
|
|
286
437
|
});
|
|
287
438
|
});
|