@webex/plugin-meetings 3.0.0-beta.16 → 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 (156) 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 +43 -6
  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/in-meeting-actions.js +5 -1
  24. package/dist/meeting/in-meeting-actions.js.map +1 -1
  25. package/dist/meeting/index.js +652 -459
  26. package/dist/meeting/index.js.map +1 -1
  27. package/dist/meeting/request.js +25 -44
  28. package/dist/meeting/request.js.map +1 -1
  29. package/dist/meeting/request.type.js.map +1 -1
  30. package/dist/meeting/util.js +22 -57
  31. package/dist/meeting/util.js.map +1 -1
  32. package/dist/meeting-info/meeting-info-v2.js +2 -0
  33. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  34. package/dist/meetings/index.js +28 -18
  35. package/dist/meetings/index.js.map +1 -1
  36. package/dist/meetings/request.js +14 -12
  37. package/dist/meetings/request.js.map +1 -1
  38. package/dist/member/index.js +9 -0
  39. package/dist/member/index.js.map +1 -1
  40. package/dist/member/util.js +14 -1
  41. package/dist/member/util.js.map +1 -1
  42. package/dist/members/index.js +8 -6
  43. package/dist/members/index.js.map +1 -1
  44. package/dist/members/request.js +3 -1
  45. package/dist/members/request.js.map +1 -1
  46. package/dist/multistream/mediaRequestManager.js +46 -6
  47. package/dist/multistream/mediaRequestManager.js.map +1 -1
  48. package/dist/multistream/multistreamMedia.js +4 -0
  49. package/dist/multistream/multistreamMedia.js.map +1 -1
  50. package/dist/multistream/receiveSlot.js +3 -3
  51. package/dist/multistream/receiveSlot.js.map +1 -1
  52. package/dist/multistream/receiveSlotManager.js +8 -6
  53. package/dist/multistream/receiveSlotManager.js.map +1 -1
  54. package/dist/multistream/remoteMedia.js.map +1 -1
  55. package/dist/multistream/remoteMediaGroup.js.map +1 -1
  56. package/dist/multistream/remoteMediaManager.js +168 -63
  57. package/dist/multistream/remoteMediaManager.js.map +1 -1
  58. package/dist/reachability/index.js +63 -51
  59. package/dist/reachability/index.js.map +1 -1
  60. package/dist/reactions/constants.js +13 -0
  61. package/dist/reactions/constants.js.map +1 -0
  62. package/dist/reactions/reactions.type.js.map +1 -1
  63. package/dist/reconnection-manager/index.js +25 -12
  64. package/dist/reconnection-manager/index.js.map +1 -1
  65. package/dist/recording-controller/enums.js +17 -0
  66. package/dist/recording-controller/enums.js.map +1 -0
  67. package/dist/recording-controller/index.js +343 -0
  68. package/dist/recording-controller/index.js.map +1 -0
  69. package/dist/recording-controller/util.js +63 -0
  70. package/dist/recording-controller/util.js.map +1 -0
  71. package/dist/roap/request.js +88 -68
  72. package/dist/roap/request.js.map +1 -1
  73. package/dist/roap/turnDiscovery.js +72 -47
  74. package/dist/roap/turnDiscovery.js.map +1 -1
  75. package/dist/statsAnalyzer/index.js +3 -3
  76. package/dist/statsAnalyzer/index.js.map +1 -1
  77. package/dist/statsAnalyzer/mqaUtil.js +18 -6
  78. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  79. package/package.json +24 -19
  80. package/src/breakouts/README.md +190 -0
  81. package/src/breakouts/breakout.ts +110 -0
  82. package/src/breakouts/collection.ts +19 -0
  83. package/src/breakouts/index.ts +225 -0
  84. package/src/config.ts +4 -1
  85. package/src/constants.ts +39 -1
  86. package/src/locus-info/controlsUtils.ts +2 -0
  87. package/src/locus-info/index.ts +59 -1
  88. package/src/locus-info/parser.ts +1 -0
  89. package/src/locus-info/selfUtils.ts +8 -0
  90. package/src/media/index.ts +1 -2
  91. package/src/media/properties.ts +6 -9
  92. package/src/meeting/in-meeting-actions.ts +8 -0
  93. package/src/meeting/index.ts +360 -111
  94. package/src/meeting/request.ts +9 -31
  95. package/src/meeting/request.type.ts +2 -0
  96. package/src/meeting/util.ts +25 -60
  97. package/src/meeting-info/meeting-info-v2.ts +2 -0
  98. package/src/meetings/index.ts +10 -5
  99. package/src/meetings/request.ts +1 -1
  100. package/src/member/index.ts +9 -0
  101. package/src/member/util.ts +14 -1
  102. package/src/members/index.ts +1 -0
  103. package/src/members/request.ts +1 -0
  104. package/src/multistream/mediaRequestManager.ts +79 -15
  105. package/src/multistream/multistreamMedia.ts +4 -0
  106. package/src/multistream/receiveSlot.ts +17 -12
  107. package/src/multistream/receiveSlotManager.ts +22 -21
  108. package/src/multistream/remoteMedia.ts +1 -1
  109. package/src/multistream/remoteMediaGroup.ts +2 -2
  110. package/src/multistream/remoteMediaManager.ts +150 -37
  111. package/src/reachability/index.ts +16 -13
  112. package/src/reactions/constants.ts +4 -0
  113. package/src/reactions/reactions.type.ts +25 -0
  114. package/src/reconnection-manager/index.ts +18 -9
  115. package/src/recording-controller/enums.ts +8 -0
  116. package/src/recording-controller/index.ts +315 -0
  117. package/src/recording-controller/util.ts +58 -0
  118. package/src/roap/request.ts +78 -73
  119. package/src/roap/turnDiscovery.ts +8 -6
  120. package/src/statsAnalyzer/index.ts +4 -4
  121. package/src/statsAnalyzer/mqaUtil.ts +6 -0
  122. package/test/unit/spec/breakouts/breakout.ts +119 -0
  123. package/test/unit/spec/breakouts/collection.ts +15 -0
  124. package/test/unit/spec/breakouts/index.ts +293 -0
  125. package/test/unit/spec/locus-info/controlsUtils.js +20 -0
  126. package/test/unit/spec/locus-info/index.js +103 -0
  127. package/test/unit/spec/locus-info/selfConstant.js +25 -0
  128. package/test/unit/spec/locus-info/selfUtils.js +84 -0
  129. package/test/unit/spec/media/index.ts +1 -1
  130. package/test/unit/spec/media/properties.ts +9 -9
  131. package/test/unit/spec/meeting/effectsState.js +5 -1
  132. package/test/unit/spec/meeting/in-meeting-actions.ts +5 -1
  133. package/test/unit/spec/meeting/index.js +241 -50
  134. package/test/unit/spec/meeting/request.js +17 -0
  135. package/test/unit/spec/meeting/utils.js +28 -122
  136. package/test/unit/spec/meetings/index.js +1 -0
  137. package/test/unit/spec/member/util.js +26 -1
  138. package/test/unit/spec/multistream/mediaRequestManager.ts +312 -50
  139. package/test/unit/spec/multistream/receiveSlot.ts +6 -6
  140. package/test/unit/spec/multistream/receiveSlotManager.ts +13 -13
  141. package/test/unit/spec/multistream/remoteMedia.ts +2 -2
  142. package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
  143. package/test/unit/spec/multistream/remoteMediaManager.ts +354 -65
  144. package/test/unit/spec/reachability/index.ts +58 -24
  145. package/test/unit/spec/reconnection-manager/index.js +42 -13
  146. package/test/unit/spec/recording-controller/index.js +231 -0
  147. package/test/unit/spec/recording-controller/util.js +102 -0
  148. package/test/unit/spec/roap/index.ts +2 -1
  149. package/test/unit/spec/roap/request.ts +114 -0
  150. package/test/unit/spec/roap/turnDiscovery.ts +45 -29
  151. package/test/unit/spec/stats-analyzer/index.js +2 -2
  152. package/test/utils/webex-test-users.js +1 -0
  153. package/tsconfig.json +6 -0
  154. package/dist/media/internal-media-core-wrapper.js +0 -18
  155. package/dist/media/internal-media-core-wrapper.js.map +0 -1
  156. package/src/media/internal-media-core-wrapper.ts +0 -9
@@ -4,6 +4,7 @@ import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
4
4
  import LoggerProxy from '@webex/plugin-meetings/src/common/logs/logger-proxy';
5
5
  import LoggerConfig from '@webex/plugin-meetings/src/common/logs/logger-config';
6
6
  import Metrics from '@webex/plugin-meetings/src/metrics/index';
7
+ import {DISPLAY_HINTS} from '@webex/plugin-meetings/dist/constants';
7
8
 
8
9
  describe('plugin-meetings', () => {
9
10
  describe('Meeting utils function', () => {
@@ -37,6 +38,7 @@ describe('plugin-meetings', () => {
37
38
  meeting.reconnectionManager = {cleanUp: sinon.stub()};
38
39
  meeting.stopKeepAlive = sinon.stub();
39
40
  meeting.updateLLMConnection = sinon.stub();
41
+ meeting.breakouts = {cleanUp: sinon.stub()};
40
42
  });
41
43
 
42
44
  afterEach(() => {
@@ -59,6 +61,7 @@ describe('plugin-meetings', () => {
59
61
  assert.calledOnce(meeting.reconnectionManager.cleanUp);
60
62
  assert.calledOnce(meeting.stopKeepAlive);
61
63
  assert.calledOnce(meeting.updateLLMConnection);
64
+ assert.calledOnce(meeting.breakouts.cleanUp);
62
65
  });
63
66
  });
64
67
 
@@ -195,6 +198,23 @@ describe('plugin-meetings', () => {
195
198
  assert.equal(parameter.preferTranscoding, true);
196
199
  });
197
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
+
198
218
  it('#Should call meetingRequest.joinMeeting with preferTranscoding=false when multistream is enabled', async () => {
199
219
  const meeting = {
200
220
  isMultistream: true,
@@ -366,34 +386,6 @@ describe('plugin-meetings', () => {
366
386
  });
367
387
  });
368
388
 
369
- describe('canUserRecord', () => {
370
- it('works as expected', () => {
371
- assert.deepEqual(MeetingUtil.canUserRecord(['RECORDING_CONTROL_START']), true);
372
- assert.deepEqual(MeetingUtil.canUserRecord([]), false);
373
- });
374
- });
375
-
376
- describe('canUserPause', () => {
377
- it('works as expected', () => {
378
- assert.deepEqual(MeetingUtil.canUserPause(['RECORDING_CONTROL_PAUSE']), true);
379
- assert.deepEqual(MeetingUtil.canUserPause([]), false);
380
- });
381
- });
382
-
383
- describe('canUserResume', () => {
384
- it('works as expected', () => {
385
- assert.deepEqual(MeetingUtil.canUserResume(['RECORDING_CONTROL_RESUME']), true);
386
- assert.deepEqual(MeetingUtil.canUserResume([]), false);
387
- });
388
- });
389
-
390
- describe('canUserStop', () => {
391
- it('works as expected', () => {
392
- assert.deepEqual(MeetingUtil.canUserStop(['RECORDING_CONTROL_STOP']), true);
393
- assert.deepEqual(MeetingUtil.canUserStop([]), false);
394
- });
395
- });
396
-
397
389
  [
398
390
  {functionName: 'canEnableClosedCaption', displayHint: 'CAPTION_START'},
399
391
  {functionName: 'canStartTranscribing', displayHint: 'TRANSCRIPTION_CONTROL_START'},
@@ -413,103 +405,17 @@ describe('plugin-meetings', () => {
413
405
  });
414
406
  });
415
407
 
416
- describe('recording tests', () => {
417
- let request;
418
- let locusInfo;
419
- const locusUrl = 'locusUrl';
420
-
421
- beforeEach(() => {
422
- locusInfo = {
423
- parsedLocus: {
424
- info: {
425
- userDisplayHints: ['RECORDING_CONTROL_START'],
426
- },
427
- },
428
- };
429
- request = {
430
- recordMeeting: sinon.stub().returns(Promise.resolve()),
431
- };
432
- });
433
-
434
- describe('startRecording', () => {
435
- it('can start recording when the correct display hint is present', () => {
436
- locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_START');
437
-
438
- const result = MeetingUtil.startRecording(request, locusUrl, locusInfo);
439
-
440
- assert.calledWith(request.recordMeeting, {locusUrl, recording: true, paused: false});
441
-
442
- assert.deepEqual(result, request.recordMeeting.firstCall.returnValue);
443
- });
444
-
445
- it('rejects when correct display hint is not present', () => {
446
- const result = MeetingUtil.startRecording(request, locusUrl, {});
447
-
448
- assert.notCalled(request.recordMeeting);
449
-
450
- assert.isRejected(result);
451
- });
452
- });
453
-
454
- describe('pauseRecording', () => {
455
- it('can pause recording when the correct display hint is present', () => {
456
- locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_PAUSE');
457
-
458
- const result = MeetingUtil.pauseRecording(request, locusUrl, locusInfo);
459
-
460
- assert.calledWith(request.recordMeeting, {locusUrl, recording: true, paused: true});
461
-
462
- assert.deepEqual(result, request.recordMeeting.firstCall.returnValue);
463
- });
464
-
465
- it('rejects when correct display hint is not present', () => {
466
- const result = MeetingUtil.pauseRecording(request, locusUrl, {});
467
-
468
- assert.notCalled(request.recordMeeting);
469
-
470
- assert.isRejected(result);
408
+ describe('reactions', () => {
409
+ describe('canEnableReactions', () => {
410
+ [[null, DISPLAY_HINTS.ENABLE_REACTIONS, true], [null, DISPLAY_HINTS.DISABLE_REACTIONS, false], [null, undefined, null]].forEach(() => ([originalValue, displayHint, expected]) => {
411
+ assert.deepEqual(MeetingUtil.canEnableReactions(originalValue, [displayHint]), expected);
471
412
  });
472
413
  });
473
-
474
- describe('resumeRecording', () => {
475
- it('can resume recording when the correct display hint is present', () => {
476
- locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_RESUME');
477
-
478
- const result = MeetingUtil.resumeRecording(request, locusUrl, locusInfo);
479
-
480
- assert.calledWith(request.recordMeeting, {locusUrl, recording: true, paused: false});
481
-
482
- assert.deepEqual(result, request.recordMeeting.firstCall.returnValue);
483
- });
484
-
485
- it('rejects when correct display hint is not present', () => {
486
- const result = MeetingUtil.resumeRecording(request, locusUrl, {});
487
-
488
- assert.notCalled(request.recordMeeting);
489
-
490
- assert.isRejected(result);
491
- });
492
- });
493
-
494
- describe('stopRecording', () => {
495
- it('can stop recording when the correct display hint is present', () => {
496
- locusInfo.parsedLocus.info.userDisplayHints.push('RECORDING_CONTROL_STOP');
497
-
498
- const result = MeetingUtil.stopRecording(request, locusUrl, locusInfo);
499
-
500
- assert.calledWith(request.recordMeeting, {locusUrl, recording: false, paused: false});
501
-
502
- assert.deepEqual(result, request.recordMeeting.firstCall.returnValue);
503
- });
504
-
505
- it('rejects when correct display hint is not present', () => {
506
- const result = MeetingUtil.stopRecording(request, locusUrl, {});
507
-
508
- assert.notCalled(request.recordMeeting);
509
-
510
- assert.isRejected(result);
414
+ describe('canEnableReactions', () => {
415
+ [[null, DISPLAY_HINTS.REACTIONS_ACTIVE, true], [null, DISPLAY_HINTS.REACTIONS_INACTIVE, false], [null, undefined, null]].forEach(([originalValue, displayHint, expected]) => {
416
+ assert.deepEqual(MeetingUtil.canSendReactions(originalValue, [displayHint]), expected);
511
417
  });
512
418
  });
513
419
  });
514
- });
420
+ })
515
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
+ });