@webex/plugin-meetings 3.0.0-beta.31 → 3.0.0-beta.310
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/README.md +46 -8
- package/dist/annotation/annotation.types.js +7 -0
- package/dist/annotation/annotation.types.js.map +1 -0
- package/dist/annotation/constants.js +49 -0
- package/dist/annotation/constants.js.map +1 -0
- package/dist/annotation/index.js +342 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.js +94 -15
- package/dist/breakouts/breakout.js.map +1 -1
- package/dist/breakouts/edit-lock-error.js +52 -0
- package/dist/breakouts/edit-lock-error.js.map +1 -0
- package/dist/breakouts/events.js +45 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.js +709 -35
- package/dist/breakouts/index.js.map +1 -1
- package/dist/breakouts/utils.js +45 -1
- package/dist/breakouts/utils.js.map +1 -1
- package/dist/common/errors/no-meeting-info.js +51 -0
- package/dist/common/errors/no-meeting-info.js.map +1 -0
- package/dist/common/errors/reclaim-host-role-errors.js +158 -0
- package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
- package/dist/common/errors/webex-errors.js +48 -7
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -1
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js +5 -1
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +24 -9
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +5 -11
- package/dist/config.js.map +1 -1
- package/dist/constants.js +233 -29
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.js +14 -2
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.js +109 -15
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/types.js +7 -0
- package/dist/controls-options-manager/types.js.map +1 -0
- package/dist/controls-options-manager/util.js +309 -18
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/index.js +112 -1
- package/dist/index.js.map +1 -1
- package/dist/interpretation/collection.js +23 -0
- package/dist/interpretation/collection.js.map +1 -0
- package/dist/interpretation/index.js +366 -0
- package/dist/interpretation/index.js.map +1 -0
- package/dist/interpretation/siLanguage.js +25 -0
- package/dist/interpretation/siLanguage.js.map +1 -0
- package/dist/locus-info/controlsUtils.js +91 -2
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +383 -62
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +7 -1
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +57 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +249 -72
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +89 -14
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +61 -116
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +73 -124
- package/dist/media/properties.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +82 -2
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +3777 -2929
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +292 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.js +230 -124
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +260 -196
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +601 -417
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/index.js +73 -7
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +192 -51
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/util.js +1 -1
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +36 -36
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +39 -0
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +415 -115
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.js +7 -0
- package/dist/meetings/meetings.types.js.map +1 -0
- package/dist/meetings/request.js +2 -0
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +72 -6
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +58 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +25 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +132 -25
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +10 -0
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +102 -6
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +106 -38
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js +15 -0
- package/dist/members/types.js.map +1 -0
- package/dist/members/util.js +326 -232
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +13 -5
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +1 -468
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +238 -49
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +29 -16
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +39 -36
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +44 -18
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +60 -3
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +209 -59
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/multistream/sendSlotManager.js +233 -0
- package/dist/multistream/sendSlotManager.js.map +1 -0
- package/dist/reachability/index.js +225 -59
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +17 -8
- package/dist/reachability/request.js.map +1 -1
- package/dist/reconnection-manager/index.js +201 -156
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/index.js +21 -2
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.js +9 -8
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/index.js +62 -32
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +112 -97
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +95 -36
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/rtcMetrics/constants.js +12 -0
- package/dist/rtcMetrics/constants.js.map +1 -0
- package/dist/rtcMetrics/index.js +117 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/statsAnalyzer/index.js +86 -78
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +11 -10
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +42 -0
- package/dist/types/annotation/constants.d.ts +31 -0
- package/dist/types/annotation/index.d.ts +117 -0
- package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/types/breakouts/events.d.ts +8 -0
- package/dist/types/breakouts/utils.d.ts +14 -0
- package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
- package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
- package/dist/types/common/errors/webex-errors.d.ts +25 -1
- package/dist/types/common/logs/request.d.ts +2 -0
- package/dist/types/common/queue.d.ts +9 -7
- package/dist/types/config.d.ts +1 -7
- package/dist/types/constants.d.ts +194 -24
- package/dist/types/controls-options-manager/enums.d.ts +11 -1
- package/dist/types/controls-options-manager/index.d.ts +17 -1
- package/dist/types/controls-options-manager/types.d.ts +43 -0
- package/dist/types/controls-options-manager/util.d.ts +1 -7
- package/dist/types/index.d.ts +6 -4
- package/dist/types/interpretation/collection.d.ts +5 -0
- package/dist/types/interpretation/index.d.ts +5 -0
- package/dist/types/interpretation/siLanguage.d.ts +5 -0
- package/dist/types/locus-info/index.d.ts +57 -4
- package/dist/types/locus-info/parser.d.ts +67 -6
- package/dist/types/media/index.d.ts +2 -0
- package/dist/types/media/properties.d.ts +34 -48
- package/dist/types/meeting/in-meeting-actions.d.ts +82 -2
- package/dist/types/meeting/index.d.ts +463 -510
- package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/types/meeting/muteState.d.ts +99 -23
- package/dist/types/meeting/request.d.ts +72 -43
- package/dist/types/meeting/util.d.ts +101 -1
- package/dist/types/meeting-info/index.d.ts +13 -1
- package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
- package/dist/types/meetings/collection.d.ts +17 -0
- package/dist/types/meetings/index.d.ts +98 -20
- package/dist/types/meetings/meetings.types.d.ts +4 -0
- package/dist/types/member/index.d.ts +14 -0
- package/dist/types/member/types.d.ts +32 -0
- package/dist/types/members/collection.d.ts +5 -0
- package/dist/types/members/index.d.ts +35 -2
- package/dist/types/members/request.d.ts +73 -9
- package/dist/types/members/types.d.ts +25 -0
- package/dist/types/members/util.d.ts +214 -1
- package/dist/types/metrics/constants.d.ts +12 -4
- package/dist/types/metrics/index.d.ts +4 -119
- package/dist/types/multistream/mediaRequestManager.d.ts +73 -5
- package/dist/types/multistream/receiveSlot.d.ts +13 -11
- package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
- package/dist/types/multistream/remoteMedia.d.ts +8 -29
- package/dist/types/multistream/remoteMediaGroup.d.ts +0 -9
- package/dist/types/multistream/remoteMediaManager.d.ts +46 -2
- package/dist/types/multistream/sendSlotManager.d.ts +61 -0
- package/dist/types/reachability/index.d.ts +61 -7
- package/dist/types/reachability/request.d.ts +7 -3
- package/dist/types/reconnection-manager/index.d.ts +9 -0
- package/dist/types/recording-controller/index.d.ts +15 -1
- package/dist/types/recording-controller/util.d.ts +5 -4
- package/dist/types/roap/index.d.ts +2 -1
- package/dist/types/roap/request.d.ts +15 -11
- package/dist/types/roap/turnDiscovery.d.ts +21 -3
- package/dist/types/rtcMetrics/constants.d.ts +4 -0
- package/dist/types/rtcMetrics/index.d.ts +47 -0
- package/dist/types/statsAnalyzer/index.d.ts +7 -1
- package/dist/types/webinar/collection.d.ts +16 -0
- package/dist/types/webinar/index.d.ts +5 -0
- package/dist/webinar/collection.js +44 -0
- package/dist/webinar/collection.js.map +1 -0
- package/dist/webinar/index.js +69 -0
- package/dist/webinar/index.js.map +1 -0
- package/package.json +23 -20
- package/src/annotation/annotation.types.ts +50 -0
- package/src/annotation/constants.ts +36 -0
- package/src/annotation/index.ts +328 -0
- package/src/breakouts/README.md +42 -12
- package/src/breakouts/breakout.ts +67 -9
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +592 -20
- package/src/breakouts/utils.ts +42 -0
- package/src/common/errors/no-meeting-info.ts +24 -0
- package/src/common/errors/reclaim-host-role-errors.ts +134 -0
- package/src/common/errors/webex-errors.ts +44 -2
- package/src/common/logs/logger-proxy.ts +1 -1
- package/src/common/logs/request.ts +5 -1
- package/src/common/queue.ts +22 -8
- package/src/config.ts +4 -10
- package/src/constants.ts +221 -19
- package/src/controls-options-manager/enums.ts +12 -0
- package/src/controls-options-manager/index.ts +116 -21
- package/src/controls-options-manager/types.ts +59 -0
- package/src/controls-options-manager/util.ts +294 -14
- package/src/index.ts +40 -0
- package/src/interpretation/README.md +60 -0
- package/src/interpretation/collection.ts +19 -0
- package/src/interpretation/index.ts +332 -0
- package/src/interpretation/siLanguage.ts +18 -0
- package/src/locus-info/controlsUtils.ts +108 -0
- package/src/locus-info/index.ts +413 -59
- package/src/locus-info/infoUtils.ts +10 -2
- package/src/locus-info/mediaSharesUtils.ts +64 -0
- package/src/locus-info/parser.ts +258 -47
- package/src/locus-info/selfUtils.ts +81 -5
- package/src/media/index.ts +102 -122
- package/src/media/properties.ts +87 -110
- package/src/meeting/in-meeting-actions.ts +163 -3
- package/src/meeting/index.ts +3132 -2541
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +229 -131
- package/src/meeting/request.ts +177 -121
- package/src/meeting/util.ts +588 -394
- package/src/meeting-info/index.ts +81 -8
- package/src/meeting-info/meeting-info-v2.ts +170 -14
- package/src/meeting-info/util.ts +1 -1
- package/src/meeting-info/utilv2.ts +23 -23
- package/src/meetings/collection.ts +33 -0
- package/src/meetings/index.ts +445 -123
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +2 -0
- package/src/meetings/util.ts +80 -11
- package/src/member/index.ts +58 -0
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +141 -25
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +134 -8
- package/src/members/request.ts +97 -17
- package/src/members/types.ts +29 -0
- package/src/members/util.ts +333 -240
- package/src/metrics/constants.ts +12 -4
- package/src/metrics/index.ts +1 -490
- package/src/multistream/mediaRequestManager.ts +289 -79
- package/src/multistream/receiveSlot.ts +31 -17
- package/src/multistream/receiveSlotManager.ts +34 -24
- package/src/multistream/remoteMedia.ts +27 -2
- package/src/multistream/remoteMediaGroup.ts +59 -0
- package/src/multistream/remoteMediaManager.ts +148 -30
- package/src/multistream/sendSlotManager.ts +170 -0
- package/src/reachability/index.ts +228 -37
- package/src/reachability/request.ts +17 -8
- package/src/reconnection-manager/index.ts +83 -56
- package/src/recording-controller/index.ts +20 -3
- package/src/recording-controller/util.ts +26 -9
- package/src/roap/index.ts +63 -32
- package/src/roap/request.ts +100 -104
- package/src/roap/turnDiscovery.ts +48 -26
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +100 -0
- package/src/statsAnalyzer/index.ts +105 -91
- package/src/statsAnalyzer/mqaUtil.ts +13 -14
- package/src/webinar/collection.ts +31 -0
- package/src/webinar/index.ts +62 -0
- package/test/integration/spec/converged-space-meetings.js +60 -3
- package/test/integration/spec/journey.js +320 -261
- package/test/integration/spec/space-meeting.js +76 -3
- package/test/unit/spec/annotation/index.ts +418 -0
- package/test/unit/spec/breakouts/breakout.ts +118 -28
- package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
- package/test/unit/spec/breakouts/events.ts +89 -0
- package/test/unit/spec/breakouts/index.ts +1395 -69
- package/test/unit/spec/breakouts/utils.js +52 -1
- package/test/unit/spec/common/queue.js +31 -2
- package/test/unit/spec/controls-options-manager/index.js +163 -0
- package/test/unit/spec/controls-options-manager/util.js +576 -60
- package/test/unit/spec/fixture/locus.js +1 -0
- package/test/unit/spec/interpretation/collection.ts +15 -0
- package/test/unit/spec/interpretation/index.ts +589 -0
- package/test/unit/spec/interpretation/siLanguage.ts +28 -0
- package/test/unit/spec/locus-info/controlsUtils.js +316 -43
- package/test/unit/spec/locus-info/index.js +1304 -33
- package/test/unit/spec/locus-info/infoUtils.js +37 -15
- package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +32 -0
- package/test/unit/spec/locus-info/parser.js +116 -35
- package/test/unit/spec/locus-info/selfConstant.js +27 -4
- package/test/unit/spec/locus-info/selfUtils.js +208 -17
- package/test/unit/spec/media/index.ts +104 -37
- package/test/unit/spec/media/properties.ts +2 -2
- package/test/unit/spec/meeting/in-meeting-actions.ts +81 -3
- package/test/unit/spec/meeting/index.js +5216 -1956
- package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
- package/test/unit/spec/meeting/muteState.js +408 -208
- package/test/unit/spec/meeting/request.js +483 -49
- package/test/unit/spec/meeting/utils.js +679 -64
- package/test/unit/spec/meeting-info/index.js +300 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
- package/test/unit/spec/meeting-info/utilv2.js +21 -0
- package/test/unit/spec/meetings/collection.js +26 -0
- package/test/unit/spec/meetings/index.js +1011 -205
- package/test/unit/spec/meetings/utils.js +202 -2
- package/test/unit/spec/member/index.js +61 -6
- package/test/unit/spec/member/util.js +510 -34
- package/test/unit/spec/members/index.js +432 -1
- package/test/unit/spec/members/request.js +206 -27
- package/test/unit/spec/members/utils.js +210 -0
- package/test/unit/spec/metrics/index.js +1 -50
- package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
- package/test/unit/spec/multistream/receiveSlot.ts +28 -20
- package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
- package/test/unit/spec/multistream/remoteMedia.ts +30 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +326 -0
- package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
- package/test/unit/spec/reachability/index.ts +549 -9
- package/test/unit/spec/reachability/request.js +68 -0
- package/test/unit/spec/reconnection-manager/index.js +85 -9
- package/test/unit/spec/recording-controller/index.js +294 -218
- package/test/unit/spec/recording-controller/util.js +223 -96
- package/test/unit/spec/roap/index.ts +178 -64
- package/test/unit/spec/roap/request.ts +203 -85
- package/test/unit/spec/roap/turnDiscovery.ts +82 -36
- package/test/unit/spec/rtcMetrics/index.ts +73 -0
- package/test/unit/spec/stats-analyzer/index.js +136 -2
- package/test/unit/spec/webinar/collection.ts +13 -0
- package/test/unit/spec/webinar/index.ts +60 -0
- package/test/utils/integrationTestUtils.js +46 -0
- package/test/utils/testUtils.js +0 -52
- package/dist/meeting/effectsState.js +0 -262
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/metrics/config.js +0 -299
- package/dist/metrics/config.js.map +0 -1
- package/dist/types/meeting/effectsState.d.ts +0 -42
- package/dist/types/metrics/config.d.ts +0 -178
- package/src/index.js +0 -16
- package/src/meeting/effectsState.ts +0 -211
- package/src/metrics/config.ts +0 -495
- package/test/unit/spec/meeting/effectsState.js +0 -285
|
@@ -9,6 +9,8 @@ import {assert} from '@webex/test-helper-chai';
|
|
|
9
9
|
class FakeWcmeSlot extends EventEmitter {
|
|
10
10
|
public stream;
|
|
11
11
|
|
|
12
|
+
public id = 'fake id';
|
|
13
|
+
|
|
12
14
|
constructor(stream) {
|
|
13
15
|
super();
|
|
14
16
|
this.stream = stream;
|
|
@@ -28,6 +30,12 @@ describe('ReceiveSlot', () => {
|
|
|
28
30
|
receiveSlot = new ReceiveSlot(MediaType.VideoMain, fakeWcmeSlot, findMemberIdCallbackStub);
|
|
29
31
|
});
|
|
30
32
|
|
|
33
|
+
describe('logString', () => {
|
|
34
|
+
it('has a log string', () => {
|
|
35
|
+
assert.equal(receiveSlot.logString, `ReceiveSlot - ${receiveSlot.id}: "fake id"`);
|
|
36
|
+
});
|
|
37
|
+
})
|
|
38
|
+
|
|
31
39
|
describe('forwards events from underlying wcme receive slot', () => {
|
|
32
40
|
it('forwards SourceUpdate', () => {
|
|
33
41
|
let eventEmitted = false;
|
|
@@ -57,7 +65,7 @@ describe('ReceiveSlot', () => {
|
|
|
57
65
|
});
|
|
58
66
|
|
|
59
67
|
it('has public properties', () => {
|
|
60
|
-
assert.
|
|
68
|
+
assert.isTrue(receiveSlot.id.startsWith('r'));
|
|
61
69
|
assert.strictEqual(receiveSlot.mediaType, MediaType.VideoMain);
|
|
62
70
|
});
|
|
63
71
|
|
|
@@ -83,25 +91,6 @@ describe('ReceiveSlot', () => {
|
|
|
83
91
|
assert.strictEqual(receiveSlot.sourceState, 'live');
|
|
84
92
|
});
|
|
85
93
|
|
|
86
|
-
it('resets source related properties when resetSourceState() is called', () => {
|
|
87
|
-
const csi = 123456;
|
|
88
|
-
const fakeMemberId = '00000001-5555-6666-9012-345678901234';
|
|
89
|
-
|
|
90
|
-
findMemberIdCallbackStub.returns(fakeMemberId);
|
|
91
|
-
|
|
92
|
-
fakeWcmeSlot.emit(WcmeReceiveSlotEvents.SourceUpdate, 'live', csi);
|
|
93
|
-
|
|
94
|
-
assert.strictEqual(receiveSlot.memberId, fakeMemberId);
|
|
95
|
-
assert.strictEqual(receiveSlot.csi, csi);
|
|
96
|
-
assert.strictEqual(receiveSlot.sourceState, 'live');
|
|
97
|
-
|
|
98
|
-
receiveSlot.resetSourceState();
|
|
99
|
-
|
|
100
|
-
assert.strictEqual(receiveSlot.memberId, undefined);
|
|
101
|
-
assert.strictEqual(receiveSlot.csi, undefined);
|
|
102
|
-
assert.strictEqual(receiveSlot.sourceState, 'no source');
|
|
103
|
-
});
|
|
104
|
-
|
|
105
94
|
describe('findMemberId()', () => {
|
|
106
95
|
it('doesn\'t do anything if csi is not set', () => {
|
|
107
96
|
// by default the receiveSlot does not have any csi or member id
|
|
@@ -152,4 +141,23 @@ describe('ReceiveSlot', () => {
|
|
|
152
141
|
assert.notCalled(findMemberIdCallbackStub);
|
|
153
142
|
});
|
|
154
143
|
});
|
|
144
|
+
|
|
145
|
+
describe('setMaxFs()', () => {
|
|
146
|
+
it('emits the correct event', () => {
|
|
147
|
+
sinon.stub(receiveSlot, 'emit');
|
|
148
|
+
receiveSlot.setMaxFs(100);
|
|
149
|
+
|
|
150
|
+
assert.calledOnceWithExactly(
|
|
151
|
+
receiveSlot.emit,
|
|
152
|
+
{
|
|
153
|
+
file: 'meeting/receiveSlot',
|
|
154
|
+
function: 'findMemberId',
|
|
155
|
+
},
|
|
156
|
+
ReceiveSlotEvents.MaxFsUpdate,
|
|
157
|
+
{
|
|
158
|
+
maxFs: 100,
|
|
159
|
+
}
|
|
160
|
+
);
|
|
161
|
+
})
|
|
162
|
+
});
|
|
155
163
|
});
|
|
@@ -6,25 +6,16 @@ import {ReceiveSlotManager} from '@webex/plugin-meetings/src/multistream/receive
|
|
|
6
6
|
import * as ReceiveSlotModule from '@webex/plugin-meetings/src/multistream/receiveSlot';
|
|
7
7
|
|
|
8
8
|
describe('ReceiveSlotManager', () => {
|
|
9
|
-
let fakeMeeting;
|
|
10
9
|
let fakeWcmeSlot;
|
|
11
10
|
let fakeReceiveSlots;
|
|
12
11
|
let mockReceiveSlotCtor;
|
|
13
12
|
let receiveSlotManager;
|
|
13
|
+
let createSlotCallbackStub;
|
|
14
|
+
let findMemberIdCallbackStub;
|
|
14
15
|
|
|
15
16
|
beforeEach(() => {
|
|
16
17
|
fakeWcmeSlot = {
|
|
17
|
-
id:
|
|
18
|
-
};
|
|
19
|
-
fakeMeeting = {
|
|
20
|
-
mediaProperties: {
|
|
21
|
-
webrtcMediaConnection: {
|
|
22
|
-
createReceiveSlot: sinon.stub().resolves(fakeWcmeSlot),
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
members: {
|
|
26
|
-
findMemberByCsi: sinon.stub(),
|
|
27
|
-
},
|
|
18
|
+
id: {ssrc: 1},
|
|
28
19
|
};
|
|
29
20
|
fakeReceiveSlots = [];
|
|
30
21
|
mockReceiveSlotCtor = sinon.stub(ReceiveSlotModule, 'ReceiveSlot').callsFake((mediaType) => {
|
|
@@ -32,6 +23,7 @@ describe('ReceiveSlotManager', () => {
|
|
|
32
23
|
id: `fake sdk receive slot ${fakeReceiveSlots.length + 1}`,
|
|
33
24
|
mediaType,
|
|
34
25
|
findMemberId: sinon.stub(),
|
|
26
|
+
wcmeReceiveSlot: fakeWcmeSlot,
|
|
35
27
|
};
|
|
36
28
|
|
|
37
29
|
fakeReceiveSlots.push(fakeReceiveSlot);
|
|
@@ -39,7 +31,10 @@ describe('ReceiveSlotManager', () => {
|
|
|
39
31
|
return fakeReceiveSlot;
|
|
40
32
|
});
|
|
41
33
|
|
|
42
|
-
|
|
34
|
+
createSlotCallbackStub = sinon.stub().resolves(fakeWcmeSlot);
|
|
35
|
+
findMemberIdCallbackStub = sinon.stub();
|
|
36
|
+
|
|
37
|
+
receiveSlotManager = new ReceiveSlotManager(createSlotCallbackStub, findMemberIdCallbackStub);
|
|
43
38
|
});
|
|
44
39
|
|
|
45
40
|
afterEach(() => {
|
|
@@ -47,7 +42,7 @@ describe('ReceiveSlotManager', () => {
|
|
|
47
42
|
});
|
|
48
43
|
|
|
49
44
|
it('rejects if there is no media connection', async () => {
|
|
50
|
-
|
|
45
|
+
createSlotCallbackStub.rejects(new Error('Webrtc media connection is missing'));
|
|
51
46
|
|
|
52
47
|
assert.isRejected(
|
|
53
48
|
receiveSlotManager.allocateSlot(MediaType.VideoMain),
|
|
@@ -60,14 +55,14 @@ describe('ReceiveSlotManager', () => {
|
|
|
60
55
|
|
|
61
56
|
const slot = await receiveSlotManager.allocateSlot(MediaType.VideoMain);
|
|
62
57
|
|
|
63
|
-
assert.calledOnce(
|
|
58
|
+
assert.calledOnce(createSlotCallbackStub);
|
|
64
59
|
assert.calledWith(
|
|
65
|
-
|
|
60
|
+
createSlotCallbackStub,
|
|
66
61
|
MediaType.VideoMain
|
|
67
62
|
);
|
|
68
63
|
|
|
69
64
|
assert.calledOnce(mockReceiveSlotCtor);
|
|
70
|
-
assert.calledWith(mockReceiveSlotCtor, MediaType.VideoMain, fakeWcmeSlot,
|
|
65
|
+
assert.calledWith(mockReceiveSlotCtor, MediaType.VideoMain, fakeWcmeSlot, findMemberIdCallbackStub);
|
|
71
66
|
assert.strictEqual(slot, fakeReceiveSlots[0]);
|
|
72
67
|
|
|
73
68
|
assert.deepEqual(receiveSlotManager.getStats(), {
|
|
@@ -79,7 +74,7 @@ describe('ReceiveSlotManager', () => {
|
|
|
79
74
|
it('reuses previously freed slot when allocateSlot() is called and a free slot is available', async () => {
|
|
80
75
|
const slot1 = await receiveSlotManager.allocateSlot(MediaType.VideoMain);
|
|
81
76
|
|
|
82
|
-
assert.calledOnce(
|
|
77
|
+
assert.calledOnce(createSlotCallbackStub);
|
|
83
78
|
assert.calledOnce(mockReceiveSlotCtor);
|
|
84
79
|
assert.strictEqual(slot1, fakeReceiveSlots[0]);
|
|
85
80
|
|
|
@@ -91,13 +86,13 @@ describe('ReceiveSlotManager', () => {
|
|
|
91
86
|
numFreeSlots: {'VIDEO-MAIN': 1},
|
|
92
87
|
});
|
|
93
88
|
|
|
94
|
-
|
|
89
|
+
createSlotCallbackStub.resetHistory();
|
|
95
90
|
mockReceiveSlotCtor.resetHistory();
|
|
96
91
|
|
|
97
92
|
// allocate another slot, this time the previous one should be returned instead of allocating any new ones
|
|
98
93
|
const slot2 = await receiveSlotManager.allocateSlot(MediaType.VideoMain);
|
|
99
94
|
|
|
100
|
-
assert.notCalled(
|
|
95
|
+
assert.notCalled(createSlotCallbackStub);
|
|
101
96
|
assert.notCalled(mockReceiveSlotCtor);
|
|
102
97
|
|
|
103
98
|
// verify that in fact we got the same slot again
|
|
@@ -112,7 +107,7 @@ describe('ReceiveSlotManager', () => {
|
|
|
112
107
|
it('does not reuse any slots after reset() is called', async () => {
|
|
113
108
|
const slot1 = await receiveSlotManager.allocateSlot(MediaType.VideoMain);
|
|
114
109
|
|
|
115
|
-
assert.calledOnce(
|
|
110
|
+
assert.calledOnce(createSlotCallbackStub);
|
|
116
111
|
assert.calledOnce(mockReceiveSlotCtor);
|
|
117
112
|
assert.strictEqual(slot1, fakeReceiveSlots[0]);
|
|
118
113
|
|
|
@@ -121,7 +116,7 @@ describe('ReceiveSlotManager', () => {
|
|
|
121
116
|
receiveSlotManager.reset();
|
|
122
117
|
|
|
123
118
|
// reset the mocks and set the ReceiveSlot constructor to return a different slot
|
|
124
|
-
|
|
119
|
+
createSlotCallbackStub.resetHistory();
|
|
125
120
|
mockReceiveSlotCtor.resetHistory();
|
|
126
121
|
|
|
127
122
|
assert.deepEqual(receiveSlotManager.getStats(), {numAllocatedSlots: {}, numFreeSlots: {}});
|
|
@@ -129,7 +124,7 @@ describe('ReceiveSlotManager', () => {
|
|
|
129
124
|
// allocate another slot, because we called reset(), the old free slot should not be reused
|
|
130
125
|
const slot2 = await receiveSlotManager.allocateSlot(MediaType.VideoMain);
|
|
131
126
|
|
|
132
|
-
assert.calledOnce(
|
|
127
|
+
assert.calledOnce(createSlotCallbackStub);
|
|
133
128
|
assert.calledOnce(mockReceiveSlotCtor);
|
|
134
129
|
|
|
135
130
|
// verify that in fact we got a brand new slot
|
|
@@ -144,25 +139,25 @@ describe('ReceiveSlotManager', () => {
|
|
|
144
139
|
it('does not reuse slots if they have different media type', async () => {
|
|
145
140
|
const slot1 = await receiveSlotManager.allocateSlot(MediaType.VideoMain);
|
|
146
141
|
|
|
147
|
-
assert.calledOnce(
|
|
142
|
+
assert.calledOnce(createSlotCallbackStub);
|
|
148
143
|
assert.calledOnce(mockReceiveSlotCtor);
|
|
149
144
|
|
|
150
145
|
receiveSlotManager.releaseSlot(slot1);
|
|
151
146
|
|
|
152
|
-
|
|
147
|
+
createSlotCallbackStub.resetHistory();
|
|
153
148
|
mockReceiveSlotCtor.resetHistory();
|
|
154
149
|
|
|
155
150
|
// allocate another slot, this time for main audio, so it should be a completely new slot
|
|
156
151
|
const slot2 = await receiveSlotManager.allocateSlot(MediaType.AudioMain);
|
|
157
152
|
|
|
158
|
-
assert.calledOnce(
|
|
153
|
+
assert.calledOnce(createSlotCallbackStub);
|
|
159
154
|
assert.calledWith(
|
|
160
|
-
|
|
155
|
+
createSlotCallbackStub,
|
|
161
156
|
MediaType.AudioMain
|
|
162
157
|
);
|
|
163
158
|
|
|
164
159
|
assert.calledOnce(mockReceiveSlotCtor);
|
|
165
|
-
assert.calledWith(mockReceiveSlotCtor, MediaType.AudioMain, fakeWcmeSlot,
|
|
160
|
+
assert.calledWith(mockReceiveSlotCtor, MediaType.AudioMain, fakeWcmeSlot, findMemberIdCallbackStub);
|
|
166
161
|
|
|
167
162
|
// verify that in fact we got a brand new slot
|
|
168
163
|
assert.strictEqual(slot2, fakeReceiveSlots[1]);
|
|
@@ -174,7 +169,6 @@ describe('ReceiveSlotManager', () => {
|
|
|
174
169
|
});
|
|
175
170
|
|
|
176
171
|
describe('updateMemberIds', () => {
|
|
177
|
-
|
|
178
172
|
it('calls findMemberId() on all allocated receive slots', async () => {
|
|
179
173
|
const audioSlots: ReceiveSlot[] = [];
|
|
180
174
|
const videoSlots: ReceiveSlot[] = [];
|
|
@@ -193,9 +187,17 @@ describe('ReceiveSlotManager', () => {
|
|
|
193
187
|
|
|
194
188
|
assert.strictEqual(fakeReceiveSlots.length, audioSlots.length + videoSlots.length);
|
|
195
189
|
|
|
196
|
-
fakeReceiveSlots.forEach(slot => {
|
|
190
|
+
fakeReceiveSlots.forEach((slot) => {
|
|
197
191
|
assert.calledOnce(slot.findMemberId);
|
|
198
192
|
});
|
|
199
193
|
});
|
|
200
194
|
});
|
|
195
|
+
|
|
196
|
+
describe('findReceiveSlotBySsrc', () => {
|
|
197
|
+
it('finds a receive slot with a specific id', async () => {
|
|
198
|
+
await receiveSlotManager.allocateSlot(MediaType.VideoMain);
|
|
199
|
+
assert.exists(receiveSlotManager.findReceiveSlotBySsrc(1));
|
|
200
|
+
assert.strictEqual(receiveSlotManager.findReceiveSlotBySsrc(2), undefined);
|
|
201
|
+
});
|
|
202
|
+
});
|
|
201
203
|
});
|
|
@@ -6,6 +6,7 @@ import {RemoteMedia, RemoteMediaEvents} from '@webex/plugin-meetings/src/multist
|
|
|
6
6
|
import {ReceiveSlotEvents} from '@webex/plugin-meetings/src/multistream/receiveSlot';
|
|
7
7
|
import sinon from 'sinon';
|
|
8
8
|
import {assert} from '@webex/test-helper-chai';
|
|
9
|
+
import { forEach } from 'lodash';
|
|
9
10
|
|
|
10
11
|
describe('RemoteMedia', () => {
|
|
11
12
|
let remoteMedia;
|
|
@@ -21,6 +22,7 @@ describe('RemoteMedia', () => {
|
|
|
21
22
|
fakeReceiveSlot.csi = 999;
|
|
22
23
|
fakeReceiveSlot.sourceState = 'avatar';
|
|
23
24
|
fakeReceiveSlot.stream = fakeStream;
|
|
25
|
+
fakeReceiveSlot.setMaxFs = sinon.stub();
|
|
24
26
|
|
|
25
27
|
fakeMediaRequestManager = {
|
|
26
28
|
addRequest: sinon.stub(),
|
|
@@ -222,4 +224,32 @@ describe('RemoteMedia', () => {
|
|
|
222
224
|
});
|
|
223
225
|
});
|
|
224
226
|
});
|
|
227
|
+
|
|
228
|
+
describe('setSizeHint()', () => {
|
|
229
|
+
|
|
230
|
+
it('works if the receive slot is undefined', () => {
|
|
231
|
+
remoteMedia.receiveSlot = undefined;
|
|
232
|
+
remoteMedia.setSizeHint(100, 100);
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
forEach(
|
|
236
|
+
[
|
|
237
|
+
{height: 134, fs: 60},
|
|
238
|
+
{height: 135, fs: 240},
|
|
239
|
+
{height: 269, fs: 240},
|
|
240
|
+
{height: 270, fs: 920},
|
|
241
|
+
{height: 539, fs: 920},
|
|
242
|
+
{height: 540, fs: 3600},
|
|
243
|
+
{height: 720, fs: 3600},
|
|
244
|
+
{height: 721, fs: 8192},
|
|
245
|
+
],
|
|
246
|
+
({height, fs}) => {
|
|
247
|
+
it(`sets the max fs to ${fs} correctly when height is ${height}`, () => {
|
|
248
|
+
remoteMedia.setSizeHint(100, height);
|
|
249
|
+
|
|
250
|
+
assert.calledOnceWithExactly(fakeReceiveSlot.setMaxFs, fs);
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
);
|
|
254
|
+
});
|
|
225
255
|
});
|
|
@@ -97,6 +97,272 @@ describe('RemoteMediaGroup', () => {
|
|
|
97
97
|
});
|
|
98
98
|
});
|
|
99
99
|
|
|
100
|
+
describe('setPreferLiveVideo', () => {
|
|
101
|
+
it('updates prefer live video', () => {
|
|
102
|
+
|
|
103
|
+
const group = new RemoteMediaGroup(fakeMediaRequestManager, fakeReceiveSlots, 255, true, {
|
|
104
|
+
resolution: 'medium',
|
|
105
|
+
preferLiveVideo: false,
|
|
106
|
+
});
|
|
107
|
+
fakeMediaRequestManager.addRequest.resetHistory();
|
|
108
|
+
group.setPreferLiveVideo(true, false);
|
|
109
|
+
|
|
110
|
+
assert.calledOnce(fakeMediaRequestManager.cancelRequest);
|
|
111
|
+
|
|
112
|
+
assert.calledOnce(fakeMediaRequestManager.addRequest);
|
|
113
|
+
|
|
114
|
+
assert.calledWith(
|
|
115
|
+
fakeMediaRequestManager.addRequest,
|
|
116
|
+
sinon.match({
|
|
117
|
+
policyInfo: sinon.match({
|
|
118
|
+
policy: 'active-speaker',
|
|
119
|
+
priority: 255,
|
|
120
|
+
preferLiveVideo: true
|
|
121
|
+
}),
|
|
122
|
+
receiveSlots: fakeReceiveSlots,
|
|
123
|
+
codecInfo: sinon.match({
|
|
124
|
+
codec: 'h264',
|
|
125
|
+
maxFs: 3600,
|
|
126
|
+
}),
|
|
127
|
+
}),
|
|
128
|
+
false,
|
|
129
|
+
);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it('does not call add request when prefer live video has not changed', () => {
|
|
133
|
+
const group = new RemoteMediaGroup(fakeMediaRequestManager, fakeReceiveSlots, 255, true, {
|
|
134
|
+
resolution: 'medium',
|
|
135
|
+
preferLiveVideo: true,
|
|
136
|
+
});
|
|
137
|
+
fakeMediaRequestManager.addRequest.resetHistory();
|
|
138
|
+
group.setPreferLiveVideo(true, false);
|
|
139
|
+
|
|
140
|
+
assert.notCalled(fakeMediaRequestManager.cancelRequest);
|
|
141
|
+
|
|
142
|
+
assert.notCalled(fakeMediaRequestManager.addRequest);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
describe('setActiveSpeakerCsis', () => {
|
|
148
|
+
it('checks when there is a csi and remote media is not in pinned array', () => {
|
|
149
|
+
const PINNED_INDEX = 2;
|
|
150
|
+
const CSI = 11111;
|
|
151
|
+
|
|
152
|
+
const group = new RemoteMediaGroup(fakeMediaRequestManager, fakeReceiveSlots, 255, true, {
|
|
153
|
+
resolution: 'medium',
|
|
154
|
+
preferLiveVideo: true,
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
// initially nothing should be pinned
|
|
158
|
+
assert.strictEqual(group.getRemoteMedia().length, NUM_SLOTS); // by default should return 'all'
|
|
159
|
+
assert.strictEqual(group.getRemoteMedia('all').length, NUM_SLOTS);
|
|
160
|
+
assert.strictEqual(group.getRemoteMedia('unpinned').length, NUM_SLOTS);
|
|
161
|
+
assert.strictEqual(group.getRemoteMedia('pinned').length, 0);
|
|
162
|
+
|
|
163
|
+
const remoteMedia = group.getRemoteMedia('all')[PINNED_INDEX];
|
|
164
|
+
|
|
165
|
+
resetHistory();
|
|
166
|
+
|
|
167
|
+
group.setActiveSpeakerCsis([{remoteMedia, csi: CSI}], false);
|
|
168
|
+
|
|
169
|
+
assert.strictEqual(group.getRemoteMedia().length, NUM_SLOTS); // by default should return 'all'
|
|
170
|
+
assert.strictEqual(group.getRemoteMedia('all').length, NUM_SLOTS);
|
|
171
|
+
assert.strictEqual(group.getRemoteMedia('unpinned').length, NUM_SLOTS - 1);
|
|
172
|
+
assert.strictEqual(group.getRemoteMedia('pinned').length, 1);
|
|
173
|
+
|
|
174
|
+
assert.strictEqual(group.isPinned(remoteMedia), true);
|
|
175
|
+
// now check that correct media requests were sent...
|
|
176
|
+
|
|
177
|
+
const expectedReceiverSelectedSlots = [fakeReceiveSlots[PINNED_INDEX]];
|
|
178
|
+
const expectedActiveSpeakerReceiveSlots = fakeReceiveSlots.filter(
|
|
179
|
+
(_, idx) => idx !== PINNED_INDEX
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
// the previous active speaker media request for the group should have been cancelled
|
|
183
|
+
assert.calledOnce(fakeMediaRequestManager.cancelRequest);
|
|
184
|
+
assert.calledWith(fakeMediaRequestManager.cancelRequest, 'fake active speaker request 1');
|
|
185
|
+
// a new one should be sent for active speaker and for receiver selected
|
|
186
|
+
assert.calledTwice(fakeMediaRequestManager.addRequest);
|
|
187
|
+
assert.calledWith(
|
|
188
|
+
fakeMediaRequestManager.addRequest,
|
|
189
|
+
sinon.match({
|
|
190
|
+
policyInfo: sinon.match({
|
|
191
|
+
policy: 'active-speaker',
|
|
192
|
+
priority: 255,
|
|
193
|
+
}),
|
|
194
|
+
receiveSlots: expectedActiveSpeakerReceiveSlots,
|
|
195
|
+
codecInfo: sinon.match({
|
|
196
|
+
codec: 'h264',
|
|
197
|
+
maxFs: 3600,
|
|
198
|
+
}),
|
|
199
|
+
})
|
|
200
|
+
);
|
|
201
|
+
assert.calledWith(
|
|
202
|
+
fakeMediaRequestManager.addRequest,
|
|
203
|
+
sinon.match({
|
|
204
|
+
policyInfo: sinon.match({
|
|
205
|
+
policy: 'receiver-selected',
|
|
206
|
+
csi: CSI,
|
|
207
|
+
}),
|
|
208
|
+
receiveSlots: expectedReceiverSelectedSlots,
|
|
209
|
+
codecInfo: sinon.match({
|
|
210
|
+
codec: 'h264',
|
|
211
|
+
maxFs: 3600,
|
|
212
|
+
}),
|
|
213
|
+
})
|
|
214
|
+
);
|
|
215
|
+
assert.notCalled(fakeMediaRequestManager.commit);
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
it('checks when there is csi and remoteMedia is in pinned array', () => {
|
|
219
|
+
const PINNED_INDEX = 4;
|
|
220
|
+
|
|
221
|
+
const group = new RemoteMediaGroup(fakeMediaRequestManager, fakeReceiveSlots, 255, true, {
|
|
222
|
+
resolution: 'medium',
|
|
223
|
+
preferLiveVideo: true,
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
// take one instance of remote media from the group
|
|
227
|
+
const remoteMedia = group.getRemoteMedia('all')[PINNED_INDEX];
|
|
228
|
+
|
|
229
|
+
resetHistory();
|
|
230
|
+
|
|
231
|
+
// pin it so that it is in pinned array
|
|
232
|
+
group.setActiveSpeakerCsis([{remoteMedia, csi: 1234}], false);
|
|
233
|
+
|
|
234
|
+
assert.strictEqual(group.getRemoteMedia().length, NUM_SLOTS); // by default should return 'all'
|
|
235
|
+
assert.strictEqual(group.getRemoteMedia('all').length, NUM_SLOTS);
|
|
236
|
+
assert.strictEqual(group.getRemoteMedia('unpinned').length, NUM_SLOTS - 1);
|
|
237
|
+
assert.strictEqual(group.getRemoteMedia('pinned').length, 1);
|
|
238
|
+
|
|
239
|
+
resetHistory();
|
|
240
|
+
// normally this would result in the underlying receive slot csi to be updated, because we're using fake
|
|
241
|
+
// receive slots, we have to do that manually:
|
|
242
|
+
fakeReceiveSlots[PINNED_INDEX].csi = 1234;
|
|
243
|
+
const expectedReceiverSelectedSlots = [fakeReceiveSlots[PINNED_INDEX]];
|
|
244
|
+
|
|
245
|
+
// pin again to same CSI
|
|
246
|
+
group.setActiveSpeakerCsis([{remoteMedia, csi: 1234}], false);
|
|
247
|
+
|
|
248
|
+
assert.strictEqual(group.getRemoteMedia().length, NUM_SLOTS); // by default should return 'all'
|
|
249
|
+
assert.strictEqual(group.getRemoteMedia('all').length, NUM_SLOTS);
|
|
250
|
+
assert.strictEqual(group.getRemoteMedia('unpinned').length, NUM_SLOTS - 1);
|
|
251
|
+
assert.strictEqual(group.getRemoteMedia('pinned').length, 1);
|
|
252
|
+
|
|
253
|
+
assert.strictEqual(group.isPinned(remoteMedia), true);
|
|
254
|
+
|
|
255
|
+
assert.calledTwice(fakeMediaRequestManager.cancelRequest);
|
|
256
|
+
assert.calledWith(fakeMediaRequestManager.cancelRequest, 'fake receiver selected request 1');
|
|
257
|
+
|
|
258
|
+
assert.calledWith(
|
|
259
|
+
fakeMediaRequestManager.addRequest,
|
|
260
|
+
sinon.match({
|
|
261
|
+
policyInfo: sinon.match({
|
|
262
|
+
policy: 'receiver-selected',
|
|
263
|
+
csi: 1234,
|
|
264
|
+
}),
|
|
265
|
+
receiveSlots: expectedReceiverSelectedSlots,
|
|
266
|
+
codecInfo: sinon.match({
|
|
267
|
+
codec: 'h264',
|
|
268
|
+
maxFs: 3600,
|
|
269
|
+
}),
|
|
270
|
+
})
|
|
271
|
+
);
|
|
272
|
+
assert.notCalled(fakeMediaRequestManager.commit);
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
it('checks setActiveSpeakerCsis with array of remoteMedia to pin and unpin', () => {
|
|
276
|
+
const PINNED_INDEX = 2;
|
|
277
|
+
const PINNED_INDEX2 = 0;
|
|
278
|
+
const CSI = 11111;
|
|
279
|
+
const CSI2 = 12345;
|
|
280
|
+
|
|
281
|
+
const group = new RemoteMediaGroup(fakeMediaRequestManager, fakeReceiveSlots, 255, true, {
|
|
282
|
+
resolution: 'medium',
|
|
283
|
+
preferLiveVideo: true,
|
|
284
|
+
});
|
|
285
|
+
|
|
286
|
+
// initially nothing should be pinned
|
|
287
|
+
assert.strictEqual(group.getRemoteMedia().length, NUM_SLOTS); // by default should return 'all'
|
|
288
|
+
assert.strictEqual(group.getRemoteMedia('all').length, NUM_SLOTS);
|
|
289
|
+
assert.strictEqual(group.getRemoteMedia('unpinned').length, NUM_SLOTS);
|
|
290
|
+
assert.strictEqual(group.getRemoteMedia('pinned').length, 0);
|
|
291
|
+
|
|
292
|
+
const remoteMedia = group.getRemoteMedia('all')[PINNED_INDEX];
|
|
293
|
+
|
|
294
|
+
const remoteMedia2 = group.getRemoteMedia('all')[PINNED_INDEX2];
|
|
295
|
+
|
|
296
|
+
const remoteMedisCsis = [{remoteMedia, csi: CSI}, {remoteMedia: remoteMedia2, csi: CSI2}];
|
|
297
|
+
|
|
298
|
+
group.setActiveSpeakerCsis(remoteMedisCsis, false);
|
|
299
|
+
|
|
300
|
+
assert.strictEqual(group.getRemoteMedia().length, NUM_SLOTS);
|
|
301
|
+
assert.strictEqual(group.getRemoteMedia('all').length, NUM_SLOTS);
|
|
302
|
+
assert.strictEqual(group.getRemoteMedia('unpinned').length, NUM_SLOTS - 2);
|
|
303
|
+
assert.strictEqual(group.getRemoteMedia('pinned').length, 2);
|
|
304
|
+
|
|
305
|
+
assert.strictEqual(group.isPinned(remoteMedia), true);
|
|
306
|
+
assert.strictEqual(group.isPinned(remoteMedia2), true);
|
|
307
|
+
|
|
308
|
+
resetHistory();
|
|
309
|
+
|
|
310
|
+
group.setActiveSpeakerCsis([{remoteMedia}], false);
|
|
311
|
+
|
|
312
|
+
// one pane should still remain pinned
|
|
313
|
+
assert.strictEqual(group.getRemoteMedia().length, NUM_SLOTS);
|
|
314
|
+
assert.strictEqual(group.getRemoteMedia('all').length, NUM_SLOTS);
|
|
315
|
+
assert.strictEqual(group.getRemoteMedia('unpinned').length, NUM_SLOTS - 1);
|
|
316
|
+
assert.strictEqual(group.getRemoteMedia('pinned').length, 1);
|
|
317
|
+
assert.strictEqual(group.isPinned(remoteMedia), false);
|
|
318
|
+
assert.strictEqual(group.isPinned(remoteMedia2), true);
|
|
319
|
+
|
|
320
|
+
assert.calledTwice(fakeMediaRequestManager.cancelRequest);
|
|
321
|
+
assert.calledWith(fakeMediaRequestManager.cancelRequest, 'fake receiver selected request 1');
|
|
322
|
+
assert.notCalled(fakeMediaRequestManager.commit);
|
|
323
|
+
});
|
|
324
|
+
|
|
325
|
+
it('check commit is only called once', () => {
|
|
326
|
+
const PINNED_INDEX = 2;
|
|
327
|
+
const PINNED_INDEX2 = 0;
|
|
328
|
+
const CSI = 11111;
|
|
329
|
+
const CSI2 = 12345;
|
|
330
|
+
|
|
331
|
+
const group = new RemoteMediaGroup(fakeMediaRequestManager, fakeReceiveSlots, 255, true, {
|
|
332
|
+
resolution: 'medium',
|
|
333
|
+
preferLiveVideo: true,
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
const remoteMedia = group.getRemoteMedia('all')[PINNED_INDEX];
|
|
337
|
+
|
|
338
|
+
resetHistory();
|
|
339
|
+
|
|
340
|
+
const remoteMedia2 = group.getRemoteMedia('all')[PINNED_INDEX2];
|
|
341
|
+
|
|
342
|
+
const remoteMedisCsis = [{remoteMedia, csi: CSI}, {remoteMedia: remoteMedia2, csi: CSI2}, {remoteMedia}];
|
|
343
|
+
|
|
344
|
+
group.setActiveSpeakerCsis(remoteMedisCsis, true);
|
|
345
|
+
|
|
346
|
+
assert.calledOnce(fakeMediaRequestManager.commit);
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
it('throws when remoteMedia id is not in unpinned and pinned array - csi is there', () => {
|
|
350
|
+
const group = new RemoteMediaGroup(fakeMediaRequestManager, fakeReceiveSlots, 255, true, {
|
|
351
|
+
resolution: 'medium',
|
|
352
|
+
preferLiveVideo: true,
|
|
353
|
+
});
|
|
354
|
+
assert.throws(() => group.setActiveSpeakerCsis([{remoteMedia: {id: 'r1'} as any, csi: 123}], false), 'failed to pin a remote media object r1, because it is not found in this remote media group');
|
|
355
|
+
});
|
|
356
|
+
|
|
357
|
+
it('throws when remoteMedia id is not in unpinned and pinned array - csi is not there', () => {
|
|
358
|
+
const group = new RemoteMediaGroup(fakeMediaRequestManager, fakeReceiveSlots, 255, true, {
|
|
359
|
+
resolution: 'medium',
|
|
360
|
+
preferLiveVideo: true,
|
|
361
|
+
});
|
|
362
|
+
assert.throws(() => group.setActiveSpeakerCsis([{remoteMedia: {id: 'r1'} as any}], false), 'failed to unpin a remote media object r1, because it is not found in this remote media group');
|
|
363
|
+
});
|
|
364
|
+
});
|
|
365
|
+
|
|
100
366
|
describe('pinning', () => {
|
|
101
367
|
it('works as expected', () => {
|
|
102
368
|
const PINNED_INDEX = 2;
|