@webex/plugin-meetings 3.0.0-beta.17 → 3.0.0-beta.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (152) hide show
  1. package/dist/breakouts/breakout.js +116 -0
  2. package/dist/breakouts/breakout.js.map +1 -0
  3. package/dist/breakouts/collection.js +23 -0
  4. package/dist/breakouts/collection.js.map +1 -0
  5. package/dist/breakouts/index.js +226 -0
  6. package/dist/breakouts/index.js.map +1 -0
  7. package/dist/config.js +4 -1
  8. package/dist/config.js.map +1 -1
  9. package/dist/constants.js +38 -5
  10. package/dist/constants.js.map +1 -1
  11. package/dist/locus-info/controlsUtils.js +2 -1
  12. package/dist/locus-info/controlsUtils.js.map +1 -1
  13. package/dist/locus-info/index.js +48 -0
  14. package/dist/locus-info/index.js.map +1 -1
  15. package/dist/locus-info/parser.js +1 -0
  16. package/dist/locus-info/parser.js.map +1 -1
  17. package/dist/locus-info/selfUtils.js +19 -11
  18. package/dist/locus-info/selfUtils.js.map +1 -1
  19. package/dist/media/index.js +3 -3
  20. package/dist/media/index.js.map +1 -1
  21. package/dist/media/properties.js +4 -4
  22. package/dist/media/properties.js.map +1 -1
  23. package/dist/meeting/index.js +651 -460
  24. package/dist/meeting/index.js.map +1 -1
  25. package/dist/meeting/request.js +25 -44
  26. package/dist/meeting/request.js.map +1 -1
  27. package/dist/meeting/request.type.js.map +1 -1
  28. package/dist/meeting/util.js +4 -57
  29. package/dist/meeting/util.js.map +1 -1
  30. package/dist/meeting-info/meeting-info-v2.js +2 -0
  31. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  32. package/dist/meetings/index.js +28 -18
  33. package/dist/meetings/index.js.map +1 -1
  34. package/dist/meetings/request.js +14 -12
  35. package/dist/meetings/request.js.map +1 -1
  36. package/dist/member/index.js +9 -0
  37. package/dist/member/index.js.map +1 -1
  38. package/dist/member/util.js +14 -1
  39. package/dist/member/util.js.map +1 -1
  40. package/dist/members/index.js +8 -6
  41. package/dist/members/index.js.map +1 -1
  42. package/dist/members/request.js +3 -1
  43. package/dist/members/request.js.map +1 -1
  44. package/dist/multistream/mediaRequestManager.js +46 -6
  45. package/dist/multistream/mediaRequestManager.js.map +1 -1
  46. package/dist/multistream/multistreamMedia.js +4 -0
  47. package/dist/multistream/multistreamMedia.js.map +1 -1
  48. package/dist/multistream/receiveSlot.js +3 -3
  49. package/dist/multistream/receiveSlot.js.map +1 -1
  50. package/dist/multistream/receiveSlotManager.js +8 -6
  51. package/dist/multistream/receiveSlotManager.js.map +1 -1
  52. package/dist/multistream/remoteMedia.js.map +1 -1
  53. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  54. package/dist/multistream/remoteMediaManager.js +168 -63
  55. package/dist/multistream/remoteMediaManager.js.map +1 -1
  56. package/dist/reachability/index.js +63 -51
  57. package/dist/reachability/index.js.map +1 -1
  58. package/dist/reactions/constants.js +13 -0
  59. package/dist/reactions/constants.js.map +1 -0
  60. package/dist/reactions/reactions.type.js.map +1 -1
  61. package/dist/reconnection-manager/index.js +25 -12
  62. package/dist/reconnection-manager/index.js.map +1 -1
  63. package/dist/recording-controller/enums.js +17 -0
  64. package/dist/recording-controller/enums.js.map +1 -0
  65. package/dist/recording-controller/index.js +343 -0
  66. package/dist/recording-controller/index.js.map +1 -0
  67. package/dist/recording-controller/util.js +63 -0
  68. package/dist/recording-controller/util.js.map +1 -0
  69. package/dist/roap/request.js +88 -68
  70. package/dist/roap/request.js.map +1 -1
  71. package/dist/roap/turnDiscovery.js +72 -47
  72. package/dist/roap/turnDiscovery.js.map +1 -1
  73. package/dist/statsAnalyzer/index.js +3 -3
  74. package/dist/statsAnalyzer/index.js.map +1 -1
  75. package/dist/statsAnalyzer/mqaUtil.js +18 -6
  76. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  77. package/package.json +24 -19
  78. package/src/breakouts/README.md +190 -0
  79. package/src/breakouts/breakout.ts +110 -0
  80. package/src/breakouts/collection.ts +19 -0
  81. package/src/breakouts/index.ts +225 -0
  82. package/src/config.ts +4 -1
  83. package/src/constants.ts +35 -1
  84. package/src/locus-info/controlsUtils.ts +2 -0
  85. package/src/locus-info/index.ts +59 -1
  86. package/src/locus-info/parser.ts +1 -0
  87. package/src/locus-info/selfUtils.ts +8 -0
  88. package/src/media/index.ts +1 -2
  89. package/src/media/properties.ts +6 -9
  90. package/src/meeting/index.ts +352 -111
  91. package/src/meeting/request.ts +9 -31
  92. package/src/meeting/request.type.ts +2 -0
  93. package/src/meeting/util.ts +3 -60
  94. package/src/meeting-info/meeting-info-v2.ts +2 -0
  95. package/src/meetings/index.ts +10 -5
  96. package/src/meetings/request.ts +1 -1
  97. package/src/member/index.ts +9 -0
  98. package/src/member/util.ts +14 -1
  99. package/src/members/index.ts +1 -0
  100. package/src/members/request.ts +1 -0
  101. package/src/multistream/mediaRequestManager.ts +79 -15
  102. package/src/multistream/multistreamMedia.ts +4 -0
  103. package/src/multistream/receiveSlot.ts +17 -12
  104. package/src/multistream/receiveSlotManager.ts +22 -21
  105. package/src/multistream/remoteMedia.ts +1 -1
  106. package/src/multistream/remoteMediaGroup.ts +2 -2
  107. package/src/multistream/remoteMediaManager.ts +150 -37
  108. package/src/reachability/index.ts +16 -13
  109. package/src/reactions/constants.ts +4 -0
  110. package/src/reactions/reactions.type.ts +25 -0
  111. package/src/reconnection-manager/index.ts +18 -9
  112. package/src/recording-controller/enums.ts +8 -0
  113. package/src/recording-controller/index.ts +315 -0
  114. package/src/recording-controller/util.ts +58 -0
  115. package/src/roap/request.ts +78 -73
  116. package/src/roap/turnDiscovery.ts +8 -6
  117. package/src/statsAnalyzer/index.ts +4 -4
  118. package/src/statsAnalyzer/mqaUtil.ts +6 -0
  119. package/test/unit/spec/breakouts/breakout.ts +119 -0
  120. package/test/unit/spec/breakouts/collection.ts +15 -0
  121. package/test/unit/spec/breakouts/index.ts +293 -0
  122. package/test/unit/spec/locus-info/controlsUtils.js +20 -0
  123. package/test/unit/spec/locus-info/index.js +103 -0
  124. package/test/unit/spec/locus-info/selfConstant.js +25 -0
  125. package/test/unit/spec/locus-info/selfUtils.js +84 -0
  126. package/test/unit/spec/media/index.ts +1 -1
  127. package/test/unit/spec/media/properties.ts +9 -9
  128. package/test/unit/spec/meeting/effectsState.js +5 -1
  129. package/test/unit/spec/meeting/index.js +235 -50
  130. package/test/unit/spec/meeting/request.js +17 -0
  131. package/test/unit/spec/meeting/utils.js +20 -129
  132. package/test/unit/spec/meetings/index.js +1 -0
  133. package/test/unit/spec/member/util.js +26 -1
  134. package/test/unit/spec/multistream/mediaRequestManager.ts +312 -50
  135. package/test/unit/spec/multistream/receiveSlot.ts +6 -6
  136. package/test/unit/spec/multistream/receiveSlotManager.ts +13 -13
  137. package/test/unit/spec/multistream/remoteMedia.ts +2 -2
  138. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  139. package/test/unit/spec/multistream/remoteMediaManager.ts +354 -65
  140. package/test/unit/spec/reachability/index.ts +58 -24
  141. package/test/unit/spec/reconnection-manager/index.js +42 -13
  142. package/test/unit/spec/recording-controller/index.js +231 -0
  143. package/test/unit/spec/recording-controller/util.js +102 -0
  144. package/test/unit/spec/roap/index.ts +2 -1
  145. package/test/unit/spec/roap/request.ts +114 -0
  146. package/test/unit/spec/roap/turnDiscovery.ts +45 -29
  147. package/test/unit/spec/stats-analyzer/index.js +2 -2
  148. package/test/utils/webex-test-users.js +1 -0
  149. package/tsconfig.json +6 -0
  150. package/dist/media/internal-media-core-wrapper.js +0 -18
  151. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  152. package/src/media/internal-media-core-wrapper.ts +0 -9
@@ -38,6 +38,7 @@ describe('plugin-meetings', () => {
38
38
  meeting.reconnectionManager = {cleanUp: sinon.stub()};
39
39
  meeting.stopKeepAlive = sinon.stub();
40
40
  meeting.updateLLMConnection = sinon.stub();
41
+ meeting.breakouts = {cleanUp: sinon.stub()};
41
42
  });
42
43
 
43
44
  afterEach(() => {
@@ -60,6 +61,7 @@ describe('plugin-meetings', () => {
60
61
  assert.calledOnce(meeting.reconnectionManager.cleanUp);
61
62
  assert.calledOnce(meeting.stopKeepAlive);
62
63
  assert.calledOnce(meeting.updateLLMConnection);
64
+ assert.calledOnce(meeting.breakouts.cleanUp);
63
65
  });
64
66
  });
65
67
 
@@ -196,6 +198,23 @@ describe('plugin-meetings', () => {
196
198
  assert.equal(parameter.preferTranscoding, true);
197
199
  });
198
200
 
201
+ it('#Should call meetingRequest.joinMeeting with breakoutsSupported=true when passed in as true', async () => {
202
+ const meeting = {
203
+ meetingRequest: {joinMeeting: sinon.stub().returns(Promise.resolve({body: {}, headers: {}}))}
204
+ };
205
+
206
+ MeetingUtil.parseLocusJoin = sinon.stub();
207
+ await MeetingUtil.joinMeeting(meeting, {
208
+ breakoutsSupported: true
209
+ });
210
+
211
+ assert.calledOnce(meeting.meetingRequest.joinMeeting);
212
+ const parameter = meeting.meetingRequest.joinMeeting.getCall(0).args[0];
213
+
214
+ assert.equal(parameter.breakoutsSupported, true);
215
+ });
216
+
217
+
199
218
  it('#Should call meetingRequest.joinMeeting with preferTranscoding=false when multistream is enabled', async () => {
200
219
  const meeting = {
201
220
  isMultistream: true,
@@ -367,34 +386,6 @@ describe('plugin-meetings', () => {
367
386
  });
368
387
  });
369
388
 
370
- describe('canUserRecord', () => {
371
- it('works as expected', () => {
372
- assert.deepEqual(MeetingUtil.canUserRecord(['RECORDING_CONTROL_START']), true);
373
- assert.deepEqual(MeetingUtil.canUserRecord([]), false);
374
- });
375
- });
376
-
377
- describe('canUserPause', () => {
378
- it('works as expected', () => {
379
- assert.deepEqual(MeetingUtil.canUserPause(['RECORDING_CONTROL_PAUSE']), true);
380
- assert.deepEqual(MeetingUtil.canUserPause([]), false);
381
- });
382
- });
383
-
384
- describe('canUserResume', () => {
385
- it('works as expected', () => {
386
- assert.deepEqual(MeetingUtil.canUserResume(['RECORDING_CONTROL_RESUME']), true);
387
- assert.deepEqual(MeetingUtil.canUserResume([]), false);
388
- });
389
- });
390
-
391
- describe('canUserStop', () => {
392
- it('works as expected', () => {
393
- assert.deepEqual(MeetingUtil.canUserStop(['RECORDING_CONTROL_STOP']), true);
394
- assert.deepEqual(MeetingUtil.canUserStop([]), false);
395
- });
396
- });
397
-
398
389
  [
399
390
  {functionName: 'canEnableClosedCaption', displayHint: 'CAPTION_START'},
400
391
  {functionName: 'canStartTranscribing', displayHint: 'TRANSCRIPTION_CONTROL_START'},
@@ -414,7 +405,6 @@ describe('plugin-meetings', () => {
414
405
  });
415
406
  });
416
407
 
417
-
418
408
  describe('reactions', () => {
419
409
  describe('canEnableReactions', () => {
420
410
  [[null, DISPLAY_HINTS.ENABLE_REACTIONS, true], [null, DISPLAY_HINTS.DISABLE_REACTIONS, false], [null, undefined, null]].forEach(() => ([originalValue, displayHint, expected]) => {
@@ -427,104 +417,5 @@ describe('plugin-meetings', () => {
427
417
  });
428
418
  });
429
419
  });
430
-
431
- describe('recording tests', () => {
432
- let request;
433
- let locusInfo;
434
- const locusUrl = 'locusUrl';
435
-
436
- beforeEach(() => {
437
- locusInfo = {
438
- parsedLocus: {
439
- info: {
440
- userDisplayHints: ['RECORDING_CONTROL_START'],
441
- },
442
- },
443
- };
444
- request = {
445
- recordMeeting: sinon.stub().returns(Promise.resolve()),
446
- };
447
- });
448
-
449
- describe('startRecording', () => {
450
- it('can start recording when the correct display hint is present', () => {
451
- locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_START');
452
-
453
- const result = MeetingUtil.startRecording(request, locusUrl, locusInfo);
454
-
455
- assert.calledWith(request.recordMeeting, {locusUrl, recording: true, paused: false});
456
-
457
- assert.deepEqual(result, request.recordMeeting.firstCall.returnValue);
458
- });
459
-
460
- it('rejects when correct display hint is not present', () => {
461
- const result = MeetingUtil.startRecording(request, locusUrl, {});
462
-
463
- assert.notCalled(request.recordMeeting);
464
-
465
- assert.isRejected(result);
466
- });
467
- });
468
-
469
- describe('pauseRecording', () => {
470
- it('can pause recording when the correct display hint is present', () => {
471
- locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_PAUSE');
472
-
473
- const result = MeetingUtil.pauseRecording(request, locusUrl, locusInfo);
474
-
475
- assert.calledWith(request.recordMeeting, {locusUrl, recording: true, paused: true});
476
-
477
- assert.deepEqual(result, request.recordMeeting.firstCall.returnValue);
478
- });
479
-
480
- it('rejects when correct display hint is not present', () => {
481
- const result = MeetingUtil.pauseRecording(request, locusUrl, {});
482
-
483
- assert.notCalled(request.recordMeeting);
484
-
485
- assert.isRejected(result);
486
- });
487
- });
488
-
489
- describe('resumeRecording', () => {
490
- it('can resume recording when the correct display hint is present', () => {
491
- locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_RESUME');
492
-
493
- const result = MeetingUtil.resumeRecording(request, locusUrl, locusInfo);
494
-
495
- assert.calledWith(request.recordMeeting, {locusUrl, recording: true, paused: false});
496
-
497
- assert.deepEqual(result, request.recordMeeting.firstCall.returnValue);
498
- });
499
-
500
- it('rejects when correct display hint is not present', () => {
501
- const result = MeetingUtil.resumeRecording(request, locusUrl, {});
502
-
503
- assert.notCalled(request.recordMeeting);
504
-
505
- assert.isRejected(result);
506
- });
507
- });
508
-
509
- describe('stopRecording', () => {
510
- it('can stop recording when the correct display hint is present', () => {
511
- locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_STOP');
512
-
513
- const result = MeetingUtil.stopRecording(request, locusUrl, locusInfo);
514
-
515
- assert.calledWith(request.recordMeeting, {locusUrl, recording: false, paused: false});
516
-
517
- assert.deepEqual(result, request.recordMeeting.firstCall.returnValue);
518
- });
519
-
520
- it('rejects when correct display hint is not present', () => {
521
- const result = MeetingUtil.stopRecording(request, locusUrl, {});
522
-
523
- assert.notCalled(request.recordMeeting);
524
-
525
- assert.isRejected(result);
526
- });
527
- });
528
- });
529
- });
420
+ })
530
421
  });
@@ -107,6 +107,7 @@ describe('plugin-meetings', () => {
107
107
  });
108
108
 
109
109
  Object.assign(webex.internal, {
110
+ llm: {on: sinon.stub()},
110
111
  device: {
111
112
  deviceType: 'FAKE_DEVICE',
112
113
  register: sinon.stub().returns(Promise.resolve()),
@@ -1,5 +1,4 @@
1
1
  import {assert} from '@webex/test-helper-chai';
2
-
3
2
  import MemberUtil from '@webex/plugin-meetings/src/member/util';
4
3
 
5
4
  describe('isHandRaised', () => {
@@ -47,3 +46,29 @@ describe('isHandRaised', () => {
47
46
  assert.isFalse(MemberUtil.isHandRaised(participant));
48
47
  });
49
48
  });
49
+
50
+ describe('plugin-meetings', () => {
51
+ describe('MemberUtil.isBreakoutsSupported', () => {
52
+ it('throws error when there is no participant', () => {
53
+ assert.throws(() => {
54
+ MemberUtil.isBreakoutsSupported();
55
+ }, 'Breakout support could not be processed, participant is undefined.');
56
+ });
57
+
58
+ it('returns true when hand breakouts are supported', () => {
59
+ const participant = {
60
+ doesNotSupportBreakouts: false
61
+ };
62
+
63
+ assert.isTrue(MemberUtil.isBreakoutsSupported(participant));
64
+ });
65
+
66
+ it('returns false when hand breakouts are not supported', () => {
67
+ const participant = {
68
+ doesNotSupportBreakouts: true
69
+ };
70
+
71
+ assert.isFalse(MemberUtil.isBreakoutsSupported(participant));
72
+ });
73
+ });
74
+ });