@webex/plugin-meetings 3.0.0-beta.21 → 3.0.0-beta.211
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 +45 -7
- 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 +114 -14
- 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 +841 -19
- package/dist/breakouts/index.js.map +1 -1
- package/dist/breakouts/request.js +78 -0
- package/dist/breakouts/request.js.map +1 -0
- package/dist/breakouts/utils.js +67 -0
- package/dist/breakouts/utils.js.map +1 -0
- package/dist/common/errors/webex-errors.js +3 -2
- 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/queue.js +24 -9
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +3 -8
- package/dist/config.js.map +1 -1
- package/dist/constants.js +179 -30
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.js +14 -0
- package/dist/controls-options-manager/constants.js.map +1 -0
- package/dist/controls-options-manager/enums.js +27 -0
- package/dist/controls-options-manager/enums.js.map +1 -0
- package/dist/controls-options-manager/index.js +297 -0
- package/dist/controls-options-manager/index.js.map +1 -0
- 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 +319 -0
- package/dist/controls-options-manager/util.js.map +1 -0
- package/dist/index.js +106 -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 +359 -64
- 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 +43 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +219 -63
- 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 +48 -135
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +29 -90
- package/dist/media/properties.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +505 -493
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +90 -2
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +2770 -2547
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +291 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.js +229 -124
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +199 -193
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +532 -414
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/index.js +48 -7
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +171 -51
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/utilv2.js +20 -5
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +22 -0
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +357 -66
- 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 +88 -1
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +49 -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 +121 -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 +86 -5
- 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 +316 -233
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +3 -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 +49 -16
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +52 -34
- 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 +173 -59
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +4 -2
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/reachability/index.js +72 -27
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +12 -5
- package/dist/reachability/request.js.map +1 -1
- package/dist/reconnection-manager/index.js +196 -155
- 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 +21 -29
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +110 -89
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +93 -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/global.js +1 -93
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +326 -311
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +90 -53
- 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/breakout.d.ts +8 -0
- package/dist/types/breakouts/collection.d.ts +5 -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/index.d.ts +5 -0
- package/dist/types/breakouts/request.d.ts +22 -0
- package/dist/types/breakouts/utils.d.ts +15 -0
- package/dist/types/common/browser-detection.d.ts +9 -0
- package/dist/types/common/collection.d.ts +48 -0
- package/dist/types/common/config.d.ts +2 -0
- package/dist/types/common/errors/captcha-error.d.ts +15 -0
- package/dist/types/common/errors/intent-to-join.d.ts +16 -0
- package/dist/types/common/errors/join-meeting.d.ts +17 -0
- package/dist/types/common/errors/media.d.ts +15 -0
- package/dist/types/common/errors/parameter.d.ts +15 -0
- package/dist/types/common/errors/password-error.d.ts +15 -0
- package/dist/types/common/errors/permission.d.ts +14 -0
- package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
- package/dist/types/common/errors/reconnection.d.ts +15 -0
- package/dist/types/common/errors/stats.d.ts +15 -0
- package/dist/types/common/errors/webex-errors.d.ts +69 -0
- package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
- package/dist/types/common/events/events-scope.d.ts +17 -0
- package/dist/types/common/events/events.d.ts +12 -0
- package/dist/types/common/events/trigger-proxy.d.ts +2 -0
- package/dist/types/common/events/util.d.ts +2 -0
- package/dist/types/common/logs/logger-config.d.ts +2 -0
- package/dist/types/common/logs/logger-proxy.d.ts +2 -0
- package/dist/types/common/logs/request.d.ts +34 -0
- package/dist/types/common/queue.d.ts +34 -0
- package/dist/types/config.d.ts +72 -0
- package/dist/types/constants.d.ts +1020 -0
- package/dist/types/controls-options-manager/constants.d.ts +4 -0
- package/dist/types/controls-options-manager/enums.d.ts +15 -0
- package/dist/types/controls-options-manager/index.d.ts +136 -0
- package/dist/types/controls-options-manager/types.d.ts +43 -0
- package/dist/types/controls-options-manager/util.d.ts +1 -0
- package/dist/types/index.d.ts +7 -0
- 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/controlsUtils.d.ts +2 -0
- package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
- package/dist/types/locus-info/fullState.d.ts +2 -0
- package/dist/types/locus-info/hostUtils.d.ts +2 -0
- package/dist/types/locus-info/index.d.ts +322 -0
- package/dist/types/locus-info/infoUtils.d.ts +2 -0
- package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
- package/dist/types/locus-info/parser.d.ts +271 -0
- package/dist/types/locus-info/selfUtils.d.ts +2 -0
- package/dist/types/media/index.d.ts +34 -0
- package/dist/types/media/properties.d.ts +93 -0
- package/dist/types/media/util.d.ts +2 -0
- package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +163 -0
- package/dist/types/meeting/index.d.ts +1482 -0
- package/dist/types/meeting/locusMediaRequest.d.ts +72 -0
- package/dist/types/meeting/muteState.d.ts +184 -0
- package/dist/types/meeting/request.d.ts +257 -0
- package/dist/types/meeting/request.type.d.ts +11 -0
- package/dist/types/meeting/state.d.ts +9 -0
- package/dist/types/meeting/util.d.ts +79 -0
- package/dist/types/meeting-info/collection.d.ts +20 -0
- package/dist/types/meeting-info/index.d.ts +62 -0
- package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
- package/dist/types/meeting-info/request.d.ts +22 -0
- package/dist/types/meeting-info/util.d.ts +2 -0
- package/dist/types/meeting-info/utilv2.d.ts +2 -0
- package/dist/types/meetings/collection.d.ts +31 -0
- package/dist/types/meetings/index.d.ts +367 -0
- package/dist/types/meetings/meetings.types.d.ts +4 -0
- package/dist/types/meetings/request.d.ts +27 -0
- package/dist/types/meetings/util.d.ts +18 -0
- package/dist/types/member/index.d.ts +159 -0
- package/dist/types/member/types.d.ts +32 -0
- package/dist/types/member/util.d.ts +2 -0
- package/dist/types/members/collection.d.ts +29 -0
- package/dist/types/members/index.d.ts +353 -0
- package/dist/types/members/request.d.ts +114 -0
- package/dist/types/members/types.d.ts +24 -0
- package/dist/types/members/util.d.ts +210 -0
- package/dist/types/metrics/constants.d.ts +55 -0
- package/dist/types/metrics/index.d.ts +45 -0
- package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
- package/dist/types/multistream/receiveSlot.d.ts +68 -0
- package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
- package/dist/types/multistream/remoteMedia.d.ts +72 -0
- package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
- package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
- package/dist/types/networkQualityMonitor/index.d.ts +70 -0
- package/dist/types/personal-meeting-room/index.d.ts +47 -0
- package/dist/types/personal-meeting-room/request.d.ts +14 -0
- package/dist/types/personal-meeting-room/util.d.ts +2 -0
- package/dist/types/reachability/index.d.ts +152 -0
- package/dist/types/reachability/request.d.ts +37 -0
- package/dist/types/reactions/constants.d.ts +3 -0
- package/dist/types/reactions/reactions.d.ts +4 -0
- package/dist/types/reactions/reactions.type.d.ts +52 -0
- package/dist/types/reconnection-manager/index.d.ts +126 -0
- package/dist/types/recording-controller/enums.d.ts +7 -0
- package/dist/types/recording-controller/index.d.ts +207 -0
- package/dist/types/recording-controller/util.d.ts +14 -0
- package/dist/types/roap/index.d.ts +77 -0
- package/dist/types/roap/request.d.ts +36 -0
- package/dist/types/roap/turnDiscovery.d.ts +91 -0
- package/dist/types/rtcMetrics/constants.d.ts +4 -0
- package/dist/types/rtcMetrics/index.d.ts +46 -0
- package/dist/types/statsAnalyzer/global.d.ts +36 -0
- package/dist/types/statsAnalyzer/index.d.ts +200 -0
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
- package/dist/types/transcription/index.d.ts +64 -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 +44 -14
- package/src/breakouts/breakout.ts +87 -9
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +710 -10
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +57 -0
- package/src/common/errors/webex-errors.ts +6 -2
- package/src/common/logs/logger-proxy.ts +1 -1
- package/src/common/queue.ts +22 -8
- package/src/config.ts +2 -7
- package/src/constants.ts +165 -21
- package/src/controls-options-manager/constants.ts +5 -0
- package/src/controls-options-manager/enums.ts +18 -0
- package/src/controls-options-manager/index.ts +278 -0
- package/src/controls-options-manager/types.ts +59 -0
- package/src/controls-options-manager/util.ts +300 -0
- package/src/index.ts +39 -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 +383 -61
- package/src/locus-info/infoUtils.ts +10 -2
- package/src/locus-info/mediaSharesUtils.ts +48 -0
- package/src/locus-info/parser.ts +224 -39
- package/src/locus-info/selfUtils.ts +81 -5
- package/src/media/index.ts +87 -140
- package/src/media/properties.ts +49 -90
- package/src/mediaQualityMetrics/config.ts +379 -377
- package/src/meeting/in-meeting-actions.ts +179 -3
- package/src/meeting/index.ts +2099 -2083
- package/src/meeting/locusMediaRequest.ts +311 -0
- package/src/meeting/muteState.ts +228 -132
- package/src/meeting/request.ts +105 -115
- package/src/meeting/util.ts +511 -397
- package/src/meeting-info/index.ts +54 -8
- package/src/meeting-info/meeting-info-v2.ts +148 -14
- package/src/meeting-info/utilv2.ts +13 -3
- package/src/meetings/collection.ts +20 -0
- package/src/meetings/index.ts +392 -84
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +2 -0
- package/src/meetings/util.ts +103 -4
- package/src/member/index.ts +49 -0
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +127 -25
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +107 -6
- package/src/members/request.ts +97 -17
- package/src/members/types.ts +28 -0
- package/src/members/util.ts +319 -240
- package/src/metrics/constants.ts +2 -4
- package/src/metrics/index.ts +1 -490
- package/src/multistream/mediaRequestManager.ts +289 -79
- package/src/multistream/receiveSlot.ts +55 -18
- package/src/multistream/receiveSlotManager.ts +46 -24
- package/src/multistream/remoteMedia.ts +27 -2
- package/src/multistream/remoteMediaGroup.ts +59 -0
- package/src/multistream/remoteMediaManager.ts +113 -32
- package/src/networkQualityMonitor/index.ts +6 -6
- package/src/reachability/index.ts +62 -15
- package/src/reachability/request.ts +10 -5
- package/src/reconnection-manager/index.ts +68 -43
- package/src/recording-controller/index.ts +20 -3
- package/src/recording-controller/util.ts +26 -9
- package/src/roap/index.ts +21 -30
- package/src/roap/request.ts +101 -95
- package/src/roap/turnDiscovery.ts +47 -25
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +100 -0
- package/src/statsAnalyzer/global.ts +1 -94
- package/src/statsAnalyzer/index.ts +376 -386
- package/src/statsAnalyzer/mqaUtil.ts +100 -99
- package/test/integration/spec/converged-space-meetings.js +233 -0
- package/test/integration/spec/journey.js +336 -259
- package/test/integration/spec/space-meeting.js +77 -4
- package/test/unit/spec/annotation/index.ts +418 -0
- package/test/unit/spec/breakouts/breakout.ts +142 -24
- 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 +1545 -48
- package/test/unit/spec/breakouts/request.ts +104 -0
- package/test/unit/spec/breakouts/utils.js +72 -0
- package/test/unit/spec/common/queue.js +31 -2
- package/test/unit/spec/controls-options-manager/index.js +287 -0
- package/test/unit/spec/controls-options-manager/util.js +582 -0
- 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 +1169 -36
- package/test/unit/spec/locus-info/infoUtils.js +37 -15
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
- package/test/unit/spec/locus-info/parser.js +62 -22
- 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 +138 -28
- package/test/unit/spec/meeting/in-meeting-actions.ts +89 -3
- package/test/unit/spec/meeting/index.js +3573 -1663
- package/test/unit/spec/meeting/locusMediaRequest.ts +438 -0
- package/test/unit/spec/meeting/muteState.js +370 -208
- package/test/unit/spec/meeting/request.js +339 -44
- package/test/unit/spec/meeting/utils.js +456 -53
- package/test/unit/spec/meeting-info/index.js +181 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
- package/test/unit/spec/meeting-info/utilv2.js +21 -0
- package/test/unit/spec/meetings/collection.js +14 -0
- package/test/unit/spec/meetings/index.js +867 -125
- package/test/unit/spec/meetings/utils.js +206 -2
- package/test/unit/spec/member/index.js +58 -4
- package/test/unit/spec/member/util.js +479 -35
- package/test/unit/spec/members/index.js +319 -1
- package/test/unit/spec/members/request.js +206 -27
- package/test/unit/spec/members/utils.js +184 -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 +72 -13
- package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
- 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 +318 -0
- package/test/unit/spec/networkQualityMonitor/index.js +4 -4
- package/test/unit/spec/reachability/index.ts +125 -8
- package/test/unit/spec/reachability/request.js +66 -0
- package/test/unit/spec/reconnection-manager/index.js +59 -6
- 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 +26 -51
- package/test/unit/spec/roap/request.ts +196 -85
- package/test/unit/spec/roap/turnDiscovery.ts +30 -7
- package/test/unit/spec/rtcMetrics/index.ts +60 -0
- package/test/unit/spec/stats-analyzer/index.js +92 -41
- package/test/utils/constants.js +9 -0
- package/test/utils/integrationTestUtils.js +46 -0
- package/test/utils/testUtils.js +0 -45
- package/test/utils/webex-config.js +4 -0
- package/test/utils/webex-test-users.js +6 -3
- 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/multistream/multistreamMedia.js +0 -110
- package/dist/multistream/multistreamMedia.js.map +0 -1
- package/src/index.js +0 -16
- package/src/meeting/effectsState.ts +0 -211
- package/src/metrics/config.ts +0 -495
- package/src/multistream/multistreamMedia.ts +0 -97
- 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,22 +91,73 @@ describe('ReceiveSlot', () => {
|
|
|
83
91
|
assert.strictEqual(receiveSlot.sourceState, 'live');
|
|
84
92
|
});
|
|
85
93
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
94
|
+
describe('findMemberId()', () => {
|
|
95
|
+
it('doesn\'t do anything if csi is not set', () => {
|
|
96
|
+
// by default the receiveSlot does not have any csi or member id
|
|
97
|
+
receiveSlot.findMemberId();
|
|
89
98
|
|
|
90
|
-
|
|
99
|
+
assert.notCalled(findMemberIdCallbackStub);
|
|
100
|
+
});
|
|
91
101
|
|
|
92
|
-
|
|
102
|
+
it('finds a member id if member id is undefined and CSI is known', () => {
|
|
103
|
+
let emittedSourceUpdateEvent = null;
|
|
93
104
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
105
|
+
// setup receiveSlot to have a csi without a member id
|
|
106
|
+
const csi = 12345;
|
|
107
|
+
const fakeMemberId = 'aaa-bbb-ccc-ddd';
|
|
108
|
+
fakeWcmeSlot.emit(WcmeReceiveSlotEvents.SourceUpdate, 'live', csi);
|
|
109
|
+
findMemberIdCallbackStub.reset();
|
|
110
|
+
findMemberIdCallbackStub.returns(fakeMemberId);
|
|
97
111
|
|
|
98
|
-
|
|
112
|
+
receiveSlot.on(ReceiveSlotEvents.SourceUpdate, (data) => {
|
|
113
|
+
emittedSourceUpdateEvent = data;
|
|
114
|
+
});
|
|
99
115
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
116
|
+
receiveSlot.findMemberId();
|
|
117
|
+
|
|
118
|
+
assert.calledOnce(findMemberIdCallbackStub);
|
|
119
|
+
assert.calledWith(findMemberIdCallbackStub, csi);
|
|
120
|
+
|
|
121
|
+
assert.deepEqual(emittedSourceUpdateEvent, {
|
|
122
|
+
state: 'live',
|
|
123
|
+
csi,
|
|
124
|
+
memberId: fakeMemberId,
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it('doesn\'t do anything if member id already set', () => {
|
|
130
|
+
// setup receiveSlot to have a csi and a member id
|
|
131
|
+
const csi = 12345;
|
|
132
|
+
const memberId = '12345678-1234-5678-9012-345678901234';
|
|
133
|
+
|
|
134
|
+
findMemberIdCallbackStub.returns(memberId);
|
|
135
|
+
|
|
136
|
+
fakeWcmeSlot.emit(WcmeReceiveSlotEvents.SourceUpdate, 'live', csi);
|
|
137
|
+
findMemberIdCallbackStub.reset();
|
|
138
|
+
|
|
139
|
+
receiveSlot.findMemberId();
|
|
140
|
+
|
|
141
|
+
assert.notCalled(findMemberIdCallbackStub);
|
|
142
|
+
});
|
|
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
|
+
})
|
|
103
162
|
});
|
|
104
163
|
});
|
|
@@ -1,35 +1,29 @@
|
|
|
1
1
|
import sinon from 'sinon';
|
|
2
2
|
import {assert} from '@webex/test-helper-chai';
|
|
3
3
|
import {MediaType} from '@webex/internal-media-core';
|
|
4
|
+
import {ReceiveSlot} from '@webex/plugin-meetings/src/multistream/receiveSlot';
|
|
4
5
|
import {ReceiveSlotManager} from '@webex/plugin-meetings/src/multistream/receiveSlotManager';
|
|
5
6
|
import * as ReceiveSlotModule from '@webex/plugin-meetings/src/multistream/receiveSlot';
|
|
6
7
|
|
|
7
8
|
describe('ReceiveSlotManager', () => {
|
|
8
|
-
let fakeMeeting;
|
|
9
9
|
let fakeWcmeSlot;
|
|
10
10
|
let fakeReceiveSlots;
|
|
11
11
|
let mockReceiveSlotCtor;
|
|
12
12
|
let receiveSlotManager;
|
|
13
|
+
let createSlotCallbackStub;
|
|
14
|
+
let findMemberIdCallbackStub;
|
|
13
15
|
|
|
14
16
|
beforeEach(() => {
|
|
15
17
|
fakeWcmeSlot = {
|
|
16
|
-
id:
|
|
17
|
-
};
|
|
18
|
-
fakeMeeting = {
|
|
19
|
-
mediaProperties: {
|
|
20
|
-
webrtcMediaConnection: {
|
|
21
|
-
createReceiveSlot: sinon.stub().resolves(fakeWcmeSlot),
|
|
22
|
-
},
|
|
23
|
-
},
|
|
24
|
-
members: {
|
|
25
|
-
findMemberByCsi: sinon.stub(),
|
|
26
|
-
},
|
|
18
|
+
id: {ssrc: 1},
|
|
27
19
|
};
|
|
28
20
|
fakeReceiveSlots = [];
|
|
29
21
|
mockReceiveSlotCtor = sinon.stub(ReceiveSlotModule, 'ReceiveSlot').callsFake((mediaType) => {
|
|
30
22
|
const fakeReceiveSlot = {
|
|
31
23
|
id: `fake sdk receive slot ${fakeReceiveSlots.length + 1}`,
|
|
32
24
|
mediaType,
|
|
25
|
+
findMemberId: sinon.stub(),
|
|
26
|
+
wcmeReceiveSlot: fakeWcmeSlot,
|
|
33
27
|
};
|
|
34
28
|
|
|
35
29
|
fakeReceiveSlots.push(fakeReceiveSlot);
|
|
@@ -37,7 +31,10 @@ describe('ReceiveSlotManager', () => {
|
|
|
37
31
|
return fakeReceiveSlot;
|
|
38
32
|
});
|
|
39
33
|
|
|
40
|
-
|
|
34
|
+
createSlotCallbackStub = sinon.stub().resolves(fakeWcmeSlot);
|
|
35
|
+
findMemberIdCallbackStub = sinon.stub();
|
|
36
|
+
|
|
37
|
+
receiveSlotManager = new ReceiveSlotManager(createSlotCallbackStub, findMemberIdCallbackStub);
|
|
41
38
|
});
|
|
42
39
|
|
|
43
40
|
afterEach(() => {
|
|
@@ -45,7 +42,7 @@ describe('ReceiveSlotManager', () => {
|
|
|
45
42
|
});
|
|
46
43
|
|
|
47
44
|
it('rejects if there is no media connection', async () => {
|
|
48
|
-
|
|
45
|
+
createSlotCallbackStub.rejects(new Error('Webrtc media connection is missing'));
|
|
49
46
|
|
|
50
47
|
assert.isRejected(
|
|
51
48
|
receiveSlotManager.allocateSlot(MediaType.VideoMain),
|
|
@@ -58,14 +55,14 @@ describe('ReceiveSlotManager', () => {
|
|
|
58
55
|
|
|
59
56
|
const slot = await receiveSlotManager.allocateSlot(MediaType.VideoMain);
|
|
60
57
|
|
|
61
|
-
assert.calledOnce(
|
|
58
|
+
assert.calledOnce(createSlotCallbackStub);
|
|
62
59
|
assert.calledWith(
|
|
63
|
-
|
|
60
|
+
createSlotCallbackStub,
|
|
64
61
|
MediaType.VideoMain
|
|
65
62
|
);
|
|
66
63
|
|
|
67
64
|
assert.calledOnce(mockReceiveSlotCtor);
|
|
68
|
-
assert.calledWith(mockReceiveSlotCtor, MediaType.VideoMain, fakeWcmeSlot,
|
|
65
|
+
assert.calledWith(mockReceiveSlotCtor, MediaType.VideoMain, fakeWcmeSlot, findMemberIdCallbackStub);
|
|
69
66
|
assert.strictEqual(slot, fakeReceiveSlots[0]);
|
|
70
67
|
|
|
71
68
|
assert.deepEqual(receiveSlotManager.getStats(), {
|
|
@@ -77,7 +74,7 @@ describe('ReceiveSlotManager', () => {
|
|
|
77
74
|
it('reuses previously freed slot when allocateSlot() is called and a free slot is available', async () => {
|
|
78
75
|
const slot1 = await receiveSlotManager.allocateSlot(MediaType.VideoMain);
|
|
79
76
|
|
|
80
|
-
assert.calledOnce(
|
|
77
|
+
assert.calledOnce(createSlotCallbackStub);
|
|
81
78
|
assert.calledOnce(mockReceiveSlotCtor);
|
|
82
79
|
assert.strictEqual(slot1, fakeReceiveSlots[0]);
|
|
83
80
|
|
|
@@ -89,13 +86,13 @@ describe('ReceiveSlotManager', () => {
|
|
|
89
86
|
numFreeSlots: {'VIDEO-MAIN': 1},
|
|
90
87
|
});
|
|
91
88
|
|
|
92
|
-
|
|
89
|
+
createSlotCallbackStub.resetHistory();
|
|
93
90
|
mockReceiveSlotCtor.resetHistory();
|
|
94
91
|
|
|
95
92
|
// allocate another slot, this time the previous one should be returned instead of allocating any new ones
|
|
96
93
|
const slot2 = await receiveSlotManager.allocateSlot(MediaType.VideoMain);
|
|
97
94
|
|
|
98
|
-
assert.notCalled(
|
|
95
|
+
assert.notCalled(createSlotCallbackStub);
|
|
99
96
|
assert.notCalled(mockReceiveSlotCtor);
|
|
100
97
|
|
|
101
98
|
// verify that in fact we got the same slot again
|
|
@@ -110,7 +107,7 @@ describe('ReceiveSlotManager', () => {
|
|
|
110
107
|
it('does not reuse any slots after reset() is called', async () => {
|
|
111
108
|
const slot1 = await receiveSlotManager.allocateSlot(MediaType.VideoMain);
|
|
112
109
|
|
|
113
|
-
assert.calledOnce(
|
|
110
|
+
assert.calledOnce(createSlotCallbackStub);
|
|
114
111
|
assert.calledOnce(mockReceiveSlotCtor);
|
|
115
112
|
assert.strictEqual(slot1, fakeReceiveSlots[0]);
|
|
116
113
|
|
|
@@ -119,7 +116,7 @@ describe('ReceiveSlotManager', () => {
|
|
|
119
116
|
receiveSlotManager.reset();
|
|
120
117
|
|
|
121
118
|
// reset the mocks and set the ReceiveSlot constructor to return a different slot
|
|
122
|
-
|
|
119
|
+
createSlotCallbackStub.resetHistory();
|
|
123
120
|
mockReceiveSlotCtor.resetHistory();
|
|
124
121
|
|
|
125
122
|
assert.deepEqual(receiveSlotManager.getStats(), {numAllocatedSlots: {}, numFreeSlots: {}});
|
|
@@ -127,7 +124,7 @@ describe('ReceiveSlotManager', () => {
|
|
|
127
124
|
// allocate another slot, because we called reset(), the old free slot should not be reused
|
|
128
125
|
const slot2 = await receiveSlotManager.allocateSlot(MediaType.VideoMain);
|
|
129
126
|
|
|
130
|
-
assert.calledOnce(
|
|
127
|
+
assert.calledOnce(createSlotCallbackStub);
|
|
131
128
|
assert.calledOnce(mockReceiveSlotCtor);
|
|
132
129
|
|
|
133
130
|
// verify that in fact we got a brand new slot
|
|
@@ -142,25 +139,25 @@ describe('ReceiveSlotManager', () => {
|
|
|
142
139
|
it('does not reuse slots if they have different media type', async () => {
|
|
143
140
|
const slot1 = await receiveSlotManager.allocateSlot(MediaType.VideoMain);
|
|
144
141
|
|
|
145
|
-
assert.calledOnce(
|
|
142
|
+
assert.calledOnce(createSlotCallbackStub);
|
|
146
143
|
assert.calledOnce(mockReceiveSlotCtor);
|
|
147
144
|
|
|
148
145
|
receiveSlotManager.releaseSlot(slot1);
|
|
149
146
|
|
|
150
|
-
|
|
147
|
+
createSlotCallbackStub.resetHistory();
|
|
151
148
|
mockReceiveSlotCtor.resetHistory();
|
|
152
149
|
|
|
153
150
|
// allocate another slot, this time for main audio, so it should be a completely new slot
|
|
154
151
|
const slot2 = await receiveSlotManager.allocateSlot(MediaType.AudioMain);
|
|
155
152
|
|
|
156
|
-
assert.calledOnce(
|
|
153
|
+
assert.calledOnce(createSlotCallbackStub);
|
|
157
154
|
assert.calledWith(
|
|
158
|
-
|
|
155
|
+
createSlotCallbackStub,
|
|
159
156
|
MediaType.AudioMain
|
|
160
157
|
);
|
|
161
158
|
|
|
162
159
|
assert.calledOnce(mockReceiveSlotCtor);
|
|
163
|
-
assert.calledWith(mockReceiveSlotCtor, MediaType.AudioMain, fakeWcmeSlot,
|
|
160
|
+
assert.calledWith(mockReceiveSlotCtor, MediaType.AudioMain, fakeWcmeSlot, findMemberIdCallbackStub);
|
|
164
161
|
|
|
165
162
|
// verify that in fact we got a brand new slot
|
|
166
163
|
assert.strictEqual(slot2, fakeReceiveSlots[1]);
|
|
@@ -170,4 +167,37 @@ describe('ReceiveSlotManager', () => {
|
|
|
170
167
|
numFreeSlots: {'VIDEO-MAIN': 1},
|
|
171
168
|
});
|
|
172
169
|
});
|
|
170
|
+
|
|
171
|
+
describe('updateMemberIds', () => {
|
|
172
|
+
it('calls findMemberId() on all allocated receive slots', async () => {
|
|
173
|
+
const audioSlots: ReceiveSlot[] = [];
|
|
174
|
+
const videoSlots: ReceiveSlot[] = [];
|
|
175
|
+
|
|
176
|
+
// allocate a bunch of receive slots
|
|
177
|
+
audioSlots.push(await receiveSlotManager.allocateSlot(MediaType.AudioMain));
|
|
178
|
+
audioSlots.push(await receiveSlotManager.allocateSlot(MediaType.AudioMain));
|
|
179
|
+
videoSlots.push(await receiveSlotManager.allocateSlot(MediaType.VideoMain));
|
|
180
|
+
videoSlots.push(await receiveSlotManager.allocateSlot(MediaType.VideoMain));
|
|
181
|
+
videoSlots.push(await receiveSlotManager.allocateSlot(MediaType.VideoMain));
|
|
182
|
+
|
|
183
|
+
receiveSlotManager.updateMemberIds();
|
|
184
|
+
|
|
185
|
+
assert.strictEqual(audioSlots.length, 2);
|
|
186
|
+
assert.strictEqual(videoSlots.length, 3);
|
|
187
|
+
|
|
188
|
+
assert.strictEqual(fakeReceiveSlots.length, audioSlots.length + videoSlots.length);
|
|
189
|
+
|
|
190
|
+
fakeReceiveSlots.forEach((slot) => {
|
|
191
|
+
assert.calledOnce(slot.findMemberId);
|
|
192
|
+
});
|
|
193
|
+
});
|
|
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
|
+
});
|
|
173
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;
|