@webex/plugin-meetings 2.59.8 → 2.60.0-next.10
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.d.ts +42 -0
- package/dist/annotation/annotation.types.js +7 -0
- package/dist/annotation/annotation.types.js.map +1 -0
- package/dist/annotation/constants.d.ts +31 -0
- package/dist/annotation/constants.js +41 -0
- package/dist/annotation/constants.js.map +1 -0
- package/dist/annotation/index.d.ts +117 -0
- package/dist/annotation/index.js +357 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.d.ts +8 -0
- package/dist/breakouts/breakout.js +215 -0
- package/dist/breakouts/breakout.js.map +1 -0
- package/dist/breakouts/collection.d.ts +5 -0
- package/dist/breakouts/collection.js +22 -0
- package/dist/breakouts/collection.js.map +1 -0
- package/dist/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/breakouts/edit-lock-error.js +51 -0
- package/dist/breakouts/edit-lock-error.js.map +1 -0
- package/dist/breakouts/events.d.ts +8 -0
- package/dist/breakouts/events.js +44 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.d.ts +5 -0
- package/dist/breakouts/index.js +1047 -0
- package/dist/breakouts/index.js.map +1 -0
- package/dist/breakouts/request.d.ts +22 -0
- package/dist/breakouts/request.js +77 -0
- package/dist/breakouts/request.js.map +1 -0
- package/dist/breakouts/utils.d.ts +15 -0
- package/dist/breakouts/utils.js +64 -0
- package/dist/breakouts/utils.js.map +1 -0
- package/dist/common/browser-detection.js +2 -3
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +3 -4
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.js +1 -2
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.js +1 -2
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +1 -2
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +1 -2
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +1 -2
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/no-meeting-info.d.ts +14 -0
- package/dist/common/errors/no-meeting-info.js +50 -0
- package/dist/common/errors/no-meeting-info.js.map +1 -0
- package/dist/common/errors/parameter.js +3 -4
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +1 -2
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +1 -2
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reclaim-host-role-errors.d.ts +60 -0
- package/dist/common/errors/reclaim-host-role-errors.js +154 -0
- package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
- package/dist/common/errors/reconnection-in-progress.js +1 -2
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.js +1 -2
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +1 -2
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.d.ts +20 -8
- package/dist/common/errors/webex-errors.js +48 -28
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +1 -2
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js +1 -2
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js +1 -2
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js +1 -2
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js +1 -2
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.js +1 -2
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +2 -3
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.d.ts +3 -1
- package/dist/common/logs/request.js +8 -5
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.d.ts +9 -7
- package/dist/common/queue.js +22 -9
- package/dist/common/queue.js.map +1 -1
- package/dist/config.d.ts +5 -7
- package/dist/config.js +8 -11
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +243 -97
- package/dist/constants.js +437 -435
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.js +3 -6
- package/dist/controls-options-manager/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.d.ts +11 -1
- package/dist/controls-options-manager/enums.js +15 -6
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.d.ts +17 -1
- package/dist/controls-options-manager/index.js +127 -38
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/types.d.ts +43 -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.d.ts +1 -7
- package/dist/controls-options-manager/util.js +309 -19
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.js +116 -4
- package/dist/index.js.map +1 -1
- package/dist/interpretation/collection.d.ts +5 -0
- package/dist/interpretation/collection.js +22 -0
- package/dist/interpretation/collection.js.map +1 -0
- package/dist/interpretation/index.d.ts +5 -0
- package/dist/interpretation/index.js +365 -0
- package/dist/interpretation/index.js.map +1 -0
- package/dist/interpretation/siLanguage.d.ts +5 -0
- package/dist/interpretation/siLanguage.js +24 -0
- package/dist/interpretation/siLanguage.js.map +1 -0
- package/dist/locus-info/controlsUtils.js +100 -11
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.js +3 -4
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js +1 -2
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js +1 -2
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.d.ts +57 -4
- package/dist/locus-info/index.js +425 -84
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +13 -5
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +58 -3
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.d.ts +66 -6
- package/dist/locus-info/parser.js +253 -80
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +97 -13
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.d.ts +2 -0
- package/dist/media/index.js +107 -319
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.d.ts +38 -53
- package/dist/media/properties.js +96 -153
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +1 -22
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.d.ts +234 -230
- package/dist/mediaQualityMetrics/config.js +302 -498
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.d.ts +88 -0
- package/dist/meeting/in-meeting-actions.js +94 -3
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.d.ts +591 -494
- package/dist/meeting/index.js +4728 -2990
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/meeting/locusMediaRequest.js +291 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.d.ts +93 -25
- package/dist/meeting/muteState.js +224 -133
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.d.ts +82 -47
- package/dist/meeting/request.js +297 -199
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.d.ts +11 -0
- package/dist/meeting/request.type.js +7 -0
- package/dist/meeting/request.type.js.map +1 -0
- package/dist/meeting/state.js +1 -2
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.d.ts +102 -1
- package/dist/meeting/util.js +605 -435
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +3 -4
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.d.ts +13 -1
- package/dist/meeting-info/index.js +74 -7
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.d.ts +31 -1
- package/dist/meeting-info/meeting-info-v2.js +200 -63
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +1 -2
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js +2 -3
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +39 -41
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.d.ts +17 -0
- package/dist/meetings/collection.js +42 -4
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.d.ts +103 -21
- package/dist/meetings/index.js +486 -124
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.d.ts +4 -0
- package/dist/meetings/meetings.types.js +7 -0
- package/dist/meetings/meetings.types.js.map +1 -0
- package/dist/meetings/request.js +4 -3
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +107 -6
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.d.ts +14 -1
- package/dist/member/index.js +54 -2
- package/dist/member/index.js.map +1 -1
- package/dist/member/member.types.js +3 -4
- package/dist/member/member.types.js.map +1 -1
- package/dist/member/types.d.ts +32 -0
- package/dist/member/types.js +23 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +131 -29
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.d.ts +5 -0
- package/dist/members/collection.js +11 -2
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.d.ts +57 -2
- package/dist/members/index.js +174 -10
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.d.ts +73 -9
- package/dist/members/request.js +108 -41
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.d.ts +25 -0
- package/dist/members/types.js +14 -0
- package/dist/members/types.js.map +1 -0
- package/dist/members/util.d.ts +214 -1
- package/dist/members/util.js +327 -234
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.d.ts +15 -6
- package/dist/metrics/constants.js +17 -9
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.d.ts +4 -111
- package/dist/metrics/index.js +4 -452
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.d.ts +118 -0
- package/dist/multistream/mediaRequestManager.js +344 -0
- package/dist/multistream/mediaRequestManager.js.map +1 -0
- package/dist/multistream/receiveSlot.d.ts +68 -0
- package/dist/multistream/receiveSlot.js +200 -0
- package/dist/multistream/receiveSlot.js.map +1 -0
- package/dist/multistream/receiveSlotManager.d.ts +56 -0
- package/dist/multistream/receiveSlotManager.js +174 -0
- package/dist/multistream/receiveSlotManager.js.map +1 -0
- package/dist/multistream/remoteMedia.d.ts +72 -0
- package/dist/multistream/remoteMedia.js +268 -0
- package/dist/multistream/remoteMedia.js.map +1 -0
- package/dist/multistream/remoteMediaGroup.d.ts +47 -0
- package/dist/multistream/remoteMediaGroup.js +267 -0
- package/dist/multistream/remoteMediaGroup.js.map +1 -0
- package/dist/multistream/remoteMediaManager.d.ts +285 -0
- package/dist/multistream/remoteMediaManager.js +1211 -0
- package/dist/multistream/remoteMediaManager.js.map +1 -0
- package/dist/multistream/sendSlotManager.d.ts +61 -0
- package/dist/multistream/sendSlotManager.js +236 -0
- package/dist/multistream/sendSlotManager.js.map +1 -0
- package/dist/networkQualityMonitor/index.js +5 -4
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +2 -3
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +2 -3
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js +1 -2
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.d.ts +62 -7
- package/dist/reachability/index.js +265 -72
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.d.ts +7 -3
- package/dist/reachability/request.js +18 -10
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/constants.d.ts +3 -0
- package/dist/reactions/constants.js +12 -0
- package/dist/reactions/constants.js.map +1 -0
- package/dist/reactions/reactions.d.ts +2 -2
- package/dist/reactions/reactions.js +4 -6
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.d.ts +23 -3
- package/dist/reactions/reactions.type.js +21 -23
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.d.ts +32 -8
- package/dist/reconnection-manager/index.js +282 -231
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/enums.js +4 -5
- package/dist/recording-controller/enums.js.map +1 -1
- package/dist/recording-controller/index.d.ts +15 -1
- package/dist/recording-controller/index.js +57 -46
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.d.ts +5 -4
- package/dist/recording-controller/util.js +10 -10
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/index.d.ts +9 -47
- package/dist/roap/index.js +101 -235
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.d.ts +18 -12
- package/dist/roap/request.js +126 -180
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.d.ts +27 -16
- package/dist/roap/turnDiscovery.js +115 -105
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/rtcMetrics/constants.d.ts +4 -0
- package/dist/rtcMetrics/constants.js +11 -0
- package/dist/rtcMetrics/constants.js.map +1 -0
- package/dist/rtcMetrics/index.d.ts +54 -0
- package/dist/rtcMetrics/index.js +140 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/statsAnalyzer/global.d.ts +1 -83
- package/dist/statsAnalyzer/global.js +2 -85
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.d.ts +28 -30
- package/dist/statsAnalyzer/index.js +374 -509
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.d.ts +8 -6
- package/dist/statsAnalyzer/mqaUtil.js +116 -83
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +1 -2
- package/dist/transcription/index.js.map +1 -1
- package/dist/webinar/collection.d.ts +16 -0
- package/dist/webinar/collection.js +43 -0
- package/dist/webinar/collection.js.map +1 -0
- package/dist/webinar/index.d.ts +5 -0
- package/dist/webinar/index.js +68 -0
- package/dist/webinar/index.js.map +1 -0
- package/package.json +35 -26
- 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 +220 -0
- package/src/breakouts/breakout.ts +188 -0
- package/src/breakouts/collection.ts +19 -0
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +925 -0
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +57 -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 +36 -12
- 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 +5 -7
- package/src/constants.ts +271 -93
- 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 +110 -0
- package/src/locus-info/index.ts +449 -61
- package/src/locus-info/infoUtils.ts +14 -2
- package/src/locus-info/mediaSharesUtils.ts +64 -0
- package/src/locus-info/parser.ts +258 -47
- package/src/locus-info/selfUtils.ts +85 -2
- package/src/media/index.ts +153 -370
- package/src/media/properties.ts +106 -136
- package/src/media/util.ts +0 -21
- package/src/mediaQualityMetrics/config.ts +244 -377
- package/src/meeting/in-meeting-actions.ts +176 -0
- package/src/meeting/index.ts +3895 -2448
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +224 -138
- package/src/meeting/request.ts +207 -127
- package/src/meeting/request.type.ts +13 -0
- package/src/meeting/util.ts +590 -423
- package/src/meeting-info/index.ts +81 -8
- package/src/meeting-info/meeting-info-v2.ts +163 -13
- package/src/meeting-info/util.ts +1 -1
- package/src/meeting-info/utilv2.ts +28 -28
- package/src/meetings/collection.ts +33 -0
- package/src/meetings/index.ts +486 -126
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +2 -0
- package/src/meetings/util.ts +116 -5
- package/src/member/index.ts +52 -1
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +139 -28
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +196 -7
- 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 +15 -6
- package/src/metrics/index.ts +1 -471
- package/src/multistream/mediaRequestManager.ts +440 -0
- package/src/multistream/receiveSlot.ts +184 -0
- package/src/multistream/receiveSlotManager.ts +166 -0
- package/src/multistream/remoteMedia.ts +254 -0
- package/src/multistream/remoteMediaGroup.ts +284 -0
- package/src/multistream/remoteMediaManager.ts +1145 -0
- package/src/multistream/sendSlotManager.ts +170 -0
- package/src/networkQualityMonitor/index.ts +6 -6
- package/src/reachability/index.ts +238 -45
- package/src/reachability/request.ts +17 -8
- package/src/reactions/constants.ts +4 -0
- package/src/reactions/reactions.ts +4 -4
- package/src/reactions/reactions.type.ts +30 -4
- package/src/reconnection-manager/index.ts +168 -156
- package/src/recording-controller/index.ts +20 -3
- package/src/recording-controller/util.ts +26 -9
- package/src/roap/index.ts +98 -241
- package/src/roap/request.ts +74 -148
- package/src/roap/turnDiscovery.ts +62 -56
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +124 -0
- package/src/statsAnalyzer/global.ts +1 -84
- package/src/statsAnalyzer/index.ts +413 -642
- package/src/statsAnalyzer/mqaUtil.ts +111 -114
- package/src/webinar/collection.ts +31 -0
- package/src/webinar/index.ts +62 -0
- package/test/integration/spec/converged-space-meetings.js +233 -0
- package/test/integration/spec/journey.js +320 -264
- 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 +237 -0
- package/test/unit/spec/breakouts/collection.ts +15 -0
- 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 +1790 -0
- 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 +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 +323 -30
- package/test/unit/spec/locus-info/index.js +1390 -16
- package/test/unit/spec/locus-info/infoUtils.js +54 -16
- package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
- package/test/unit/spec/locus-info/lib/selfConstant.js +48 -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/selfUtils.js +275 -0
- package/test/unit/spec/media/index.ts +290 -0
- package/test/unit/spec/media/properties.ts +75 -84
- package/test/unit/spec/meeting/in-meeting-actions.ts +86 -0
- package/test/unit/spec/meeting/index.js +8181 -2770
- package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
- package/test/unit/spec/meeting/muteState.js +409 -213
- package/test/unit/spec/meeting/request.js +512 -42
- package/test/unit/spec/meeting/utils.js +741 -24
- package/test/unit/spec/meeting-info/index.js +300 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +527 -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 +1284 -217
- package/test/unit/spec/meetings/utils.js +202 -2
- package/test/unit/spec/member/index.js +38 -8
- package/test/unit/spec/member/util.js +499 -29
- package/test/unit/spec/members/index.js +597 -3
- 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 +1418 -0
- package/test/unit/spec/multistream/receiveSlot.ts +163 -0
- package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
- package/test/unit/spec/multistream/remoteMedia.ts +255 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +662 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +1924 -0
- package/test/unit/spec/multistream/sendSlotManager.ts +242 -0
- package/test/unit/spec/networkQualityMonitor/index.js +4 -4
- package/test/unit/spec/reachability/index.ts +598 -24
- package/test/unit/spec/reachability/request.js +68 -0
- package/test/unit/spec/reconnection-manager/index.js +162 -24
- package/test/unit/spec/recording-controller/index.js +293 -218
- package/test/unit/spec/recording-controller/util.js +223 -96
- package/test/unit/spec/roap/index.ts +200 -76
- package/test/unit/spec/roap/request.ts +232 -0
- package/test/unit/spec/roap/turnDiscovery.ts +86 -48
- package/test/unit/spec/rtcMetrics/index.ts +93 -0
- package/test/unit/spec/stats-analyzer/index.js +188 -174
- package/test/unit/spec/webinar/collection.ts +13 -0
- package/test/unit/spec/webinar/index.ts +60 -0
- 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 +7 -3
- package/dist/meeting/effectsState.d.ts +0 -42
- package/dist/meeting/effectsState.js +0 -260
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/metrics/config.d.ts +0 -169
- package/dist/metrics/config.js +0 -289
- package/dist/metrics/config.js.map +0 -1
- package/dist/peer-connection-manager/index.d.ts +0 -6
- package/dist/peer-connection-manager/index.js +0 -671
- package/dist/peer-connection-manager/index.js.map +0 -1
- package/dist/peer-connection-manager/util.d.ts +0 -6
- package/dist/peer-connection-manager/util.js +0 -110
- package/dist/peer-connection-manager/util.js.map +0 -1
- package/dist/roap/collection.d.ts +0 -10
- package/dist/roap/collection.js +0 -63
- package/dist/roap/collection.js.map +0 -1
- package/dist/roap/handler.d.ts +0 -47
- package/dist/roap/handler.js +0 -279
- package/dist/roap/handler.js.map +0 -1
- package/dist/roap/state.d.ts +0 -9
- package/dist/roap/state.js +0 -127
- package/dist/roap/state.js.map +0 -1
- package/dist/roap/util.d.ts +0 -2
- package/dist/roap/util.js +0 -76
- package/dist/roap/util.js.map +0 -1
- package/src/index.js +0 -15
- package/src/meeting/effectsState.ts +0 -209
- package/src/metrics/config.ts +0 -485
- package/src/peer-connection-manager/index.ts +0 -847
- package/src/peer-connection-manager/util.ts +0 -119
- package/src/roap/collection.ts +0 -62
- package/src/roap/handler.ts +0 -294
- package/src/roap/state.ts +0 -156
- package/src/roap/util.ts +0 -100
- package/test/unit/spec/meeting/effectsState.js +0 -281
- package/test/unit/spec/peerconnection-manager/index.js +0 -218
- package/test/unit/spec/peerconnection-manager/utils.js +0 -49
- package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -388
- package/test/unit/spec/roap/util.js +0 -30
|
@@ -0,0 +1,1418 @@
|
|
|
1
|
+
import {MediaRequestManager} from '@webex/plugin-meetings/src/multistream/mediaRequestManager';
|
|
2
|
+
import {ReceiveSlot} from '@webex/plugin-meetings/src/multistream/receiveSlot';
|
|
3
|
+
import sinon from 'sinon';
|
|
4
|
+
import {assert} from '@webex/test-helper-chai';
|
|
5
|
+
import {getMaxFs} from '@webex/plugin-meetings/src/multistream/remoteMedia';
|
|
6
|
+
import FakeTimers from '@sinonjs/fake-timers';
|
|
7
|
+
import * as mediaCore from '@webex/internal-media-core';
|
|
8
|
+
import { expect } from 'chai';
|
|
9
|
+
|
|
10
|
+
type ExpectedActiveSpeaker = {
|
|
11
|
+
policy: 'active-speaker';
|
|
12
|
+
maxPayloadBitsPerSecond?: number;
|
|
13
|
+
priority: number;
|
|
14
|
+
receiveSlots: Array<ReceiveSlot>;
|
|
15
|
+
maxFs?: number;
|
|
16
|
+
maxMbps?: number;
|
|
17
|
+
};
|
|
18
|
+
type ExpectedReceiverSelected = {
|
|
19
|
+
policy: 'receiver-selected';
|
|
20
|
+
maxPayloadBitsPerSecond?: number;
|
|
21
|
+
csi: number;
|
|
22
|
+
receiveSlot: ReceiveSlot;
|
|
23
|
+
maxFs?: number;
|
|
24
|
+
maxMbps?: number;
|
|
25
|
+
};
|
|
26
|
+
type ExpectedRequest = ExpectedActiveSpeaker | ExpectedReceiverSelected;
|
|
27
|
+
|
|
28
|
+
const degradationPreferences = {
|
|
29
|
+
maxMacroblocksLimit: Infinity, // no limit
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
describe('MediaRequestManager', () => {
|
|
33
|
+
const CROSS_PRIORITY_DUPLICATION = true;
|
|
34
|
+
const CROSS_POLICY_DUPLICATION = true;
|
|
35
|
+
const MAX_FPS = 3000;
|
|
36
|
+
const MAX_FS_360p = 920;
|
|
37
|
+
const MAX_FS_720p = 3600;
|
|
38
|
+
const MAX_FS_1080p = 8192;
|
|
39
|
+
const MAX_MBPS_360p = 27600;
|
|
40
|
+
const MAX_MBPS_720p = 108000;
|
|
41
|
+
const MAX_MBPS_1080p = 245760;
|
|
42
|
+
const MAX_PAYLOADBITSPS_360p = 640000;
|
|
43
|
+
const MAX_PAYLOADBITSPS_720p = 2500000;
|
|
44
|
+
const MAX_PAYLOADBITSPS_1080p = 4000000;
|
|
45
|
+
|
|
46
|
+
const NUM_SLOTS = 15;
|
|
47
|
+
|
|
48
|
+
let mediaRequestManager: MediaRequestManager;
|
|
49
|
+
let sendMediaRequestsCallback;
|
|
50
|
+
let fakeWcmeSlots;
|
|
51
|
+
let fakeReceiveSlots;
|
|
52
|
+
|
|
53
|
+
beforeEach(() => {
|
|
54
|
+
sendMediaRequestsCallback = sinon.stub();
|
|
55
|
+
mediaRequestManager = new MediaRequestManager(sendMediaRequestsCallback, {
|
|
56
|
+
degradationPreferences,
|
|
57
|
+
kind: 'video',
|
|
58
|
+
trimRequestsToNumOfSources: false,
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// create some fake receive slots used by the tests
|
|
62
|
+
fakeWcmeSlots = Array(NUM_SLOTS)
|
|
63
|
+
.fill(null)
|
|
64
|
+
.map((_, index) => ({
|
|
65
|
+
id: `fake WCME slot ${index}`,
|
|
66
|
+
}));
|
|
67
|
+
|
|
68
|
+
fakeReceiveSlots = Array(NUM_SLOTS)
|
|
69
|
+
.fill(null)
|
|
70
|
+
.map(
|
|
71
|
+
(_, index) =>
|
|
72
|
+
({
|
|
73
|
+
id: `fake receive slot ${index}`,
|
|
74
|
+
on: sinon.stub(),
|
|
75
|
+
off: sinon.stub(),
|
|
76
|
+
sourceState: 'live',
|
|
77
|
+
wcmeReceiveSlot: fakeWcmeSlots[index],
|
|
78
|
+
} as unknown as ReceiveSlot)
|
|
79
|
+
);
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
// helper function for adding an active speaker request
|
|
83
|
+
const addActiveSpeakerRequest = (priority, receiveSlots, maxFs, commit = false, preferLiveVideo = true) =>
|
|
84
|
+
mediaRequestManager.addRequest(
|
|
85
|
+
{
|
|
86
|
+
policyInfo: {
|
|
87
|
+
policy: 'active-speaker',
|
|
88
|
+
priority,
|
|
89
|
+
crossPriorityDuplication: CROSS_PRIORITY_DUPLICATION,
|
|
90
|
+
crossPolicyDuplication: CROSS_POLICY_DUPLICATION,
|
|
91
|
+
preferLiveVideo,
|
|
92
|
+
},
|
|
93
|
+
receiveSlots,
|
|
94
|
+
codecInfo: {
|
|
95
|
+
codec: 'h264',
|
|
96
|
+
maxFs: maxFs,
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
commit
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
// helper function for adding a receiver selected request
|
|
103
|
+
const addReceiverSelectedRequest = (csi, receiveSlot, maxFs, commit = false) =>
|
|
104
|
+
mediaRequestManager.addRequest(
|
|
105
|
+
{
|
|
106
|
+
policyInfo: {
|
|
107
|
+
policy: 'receiver-selected',
|
|
108
|
+
csi,
|
|
109
|
+
},
|
|
110
|
+
receiveSlots: [receiveSlot],
|
|
111
|
+
codecInfo: {
|
|
112
|
+
codec: 'h264',
|
|
113
|
+
maxFs: maxFs,
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
commit
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
// helper function for verifying that the right active speaker and receiver selected
|
|
120
|
+
// requests have been sent out
|
|
121
|
+
// It should be used only for verifying requests created with
|
|
122
|
+
// addActiveSpeakerRequest() or addReceiverSelectedRequest(), because of some
|
|
123
|
+
// hardcoded values used in them
|
|
124
|
+
const checkMediaRequestsSent = (
|
|
125
|
+
expectedRequests: ExpectedRequest[], {
|
|
126
|
+
isCodecInfoDefined = true,
|
|
127
|
+
preferLiveVideo = true,
|
|
128
|
+
} = {}
|
|
129
|
+
) => {
|
|
130
|
+
assert.calledOnce(sendMediaRequestsCallback);
|
|
131
|
+
assert.calledWith(
|
|
132
|
+
sendMediaRequestsCallback,
|
|
133
|
+
expectedRequests.map((expectedRequest) => {
|
|
134
|
+
if (expectedRequest.policy === 'active-speaker') {
|
|
135
|
+
return sinon.match({
|
|
136
|
+
policy: 'active-speaker',
|
|
137
|
+
policySpecificInfo: sinon.match({
|
|
138
|
+
priority: expectedRequest.priority,
|
|
139
|
+
crossPriorityDuplication: CROSS_PRIORITY_DUPLICATION,
|
|
140
|
+
crossPolicyDuplication: CROSS_POLICY_DUPLICATION,
|
|
141
|
+
preferLiveVideo,
|
|
142
|
+
}),
|
|
143
|
+
receiveSlots: expectedRequest.receiveSlots,
|
|
144
|
+
maxPayloadBitsPerSecond: expectedRequest.maxPayloadBitsPerSecond,
|
|
145
|
+
codecInfos: isCodecInfoDefined
|
|
146
|
+
? [
|
|
147
|
+
sinon.match({
|
|
148
|
+
payloadType: 0x80,
|
|
149
|
+
h264: sinon.match({
|
|
150
|
+
maxMbps: expectedRequest.maxMbps,
|
|
151
|
+
maxFs: expectedRequest.maxFs,
|
|
152
|
+
}),
|
|
153
|
+
}),
|
|
154
|
+
]
|
|
155
|
+
: [],
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
if (expectedRequest.policy === 'receiver-selected') {
|
|
159
|
+
return sinon.match({
|
|
160
|
+
policy: 'receiver-selected',
|
|
161
|
+
policySpecificInfo: sinon.match({
|
|
162
|
+
csi: expectedRequest.csi,
|
|
163
|
+
}),
|
|
164
|
+
receiveSlots: [expectedRequest.receiveSlot],
|
|
165
|
+
maxPayloadBitsPerSecond: expectedRequest.maxPayloadBitsPerSecond,
|
|
166
|
+
codecInfos: isCodecInfoDefined
|
|
167
|
+
? [
|
|
168
|
+
sinon.match({
|
|
169
|
+
payloadType: 0x80,
|
|
170
|
+
h264: sinon.match({
|
|
171
|
+
maxMbps: expectedRequest.maxMbps,
|
|
172
|
+
maxFs: expectedRequest.maxFs,
|
|
173
|
+
}),
|
|
174
|
+
}),
|
|
175
|
+
]
|
|
176
|
+
: [],
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
return undefined;
|
|
181
|
+
})
|
|
182
|
+
);
|
|
183
|
+
sendMediaRequestsCallback.resetHistory();
|
|
184
|
+
};
|
|
185
|
+
|
|
186
|
+
it('starts with no requests', () => {
|
|
187
|
+
mediaRequestManager.commit();
|
|
188
|
+
|
|
189
|
+
assert.calledOnce(sendMediaRequestsCallback);
|
|
190
|
+
assert.calledWith(sendMediaRequestsCallback, []);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
it('sends correct wcme media requests when addRequest() is called with commit=true', () => {
|
|
194
|
+
// this is the only test that doesn't use the helper addActiveSpeakerRequest(), addReceiverSelectedRequest() methods
|
|
195
|
+
// because it tests other values for some of the parameters that are otherwise always fixed by those helpers
|
|
196
|
+
|
|
197
|
+
// first call addRequest a couple of times with commit=false
|
|
198
|
+
mediaRequestManager.addRequest(
|
|
199
|
+
{
|
|
200
|
+
policyInfo: {
|
|
201
|
+
policy: 'active-speaker',
|
|
202
|
+
priority: 255,
|
|
203
|
+
crossPriorityDuplication: true,
|
|
204
|
+
crossPolicyDuplication: false,
|
|
205
|
+
preferLiveVideo: false,
|
|
206
|
+
},
|
|
207
|
+
receiveSlots: [fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
|
|
208
|
+
codecInfo: {
|
|
209
|
+
codec: 'h264',
|
|
210
|
+
maxFs: MAX_FS_360p,
|
|
211
|
+
maxFps: MAX_FPS,
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
false
|
|
215
|
+
);
|
|
216
|
+
mediaRequestManager.addRequest(
|
|
217
|
+
{
|
|
218
|
+
policyInfo: {
|
|
219
|
+
policy: 'receiver-selected',
|
|
220
|
+
csi: 123,
|
|
221
|
+
},
|
|
222
|
+
receiveSlots: [fakeReceiveSlots[3]],
|
|
223
|
+
codecInfo: {
|
|
224
|
+
codec: 'h264',
|
|
225
|
+
maxFs: MAX_FS_720p,
|
|
226
|
+
maxFps: MAX_FPS,
|
|
227
|
+
maxMbps: MAX_MBPS_720p,
|
|
228
|
+
},
|
|
229
|
+
},
|
|
230
|
+
false
|
|
231
|
+
);
|
|
232
|
+
|
|
233
|
+
// finally call it with commit=true
|
|
234
|
+
mediaRequestManager.addRequest(
|
|
235
|
+
{
|
|
236
|
+
policyInfo: {
|
|
237
|
+
policy: 'receiver-selected',
|
|
238
|
+
csi: 123,
|
|
239
|
+
},
|
|
240
|
+
receiveSlots: [fakeReceiveSlots[4]],
|
|
241
|
+
codecInfo: {
|
|
242
|
+
codec: 'h264',
|
|
243
|
+
maxFs: MAX_FS_1080p,
|
|
244
|
+
maxFps: MAX_FPS,
|
|
245
|
+
maxMbps: MAX_MBPS_1080p,
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
true
|
|
249
|
+
);
|
|
250
|
+
|
|
251
|
+
// all 3 requests should be sent out together
|
|
252
|
+
assert.calledOnce(sendMediaRequestsCallback);
|
|
253
|
+
assert.calledWith(sendMediaRequestsCallback, [
|
|
254
|
+
sinon.match({
|
|
255
|
+
policy: 'active-speaker',
|
|
256
|
+
policySpecificInfo: sinon.match({
|
|
257
|
+
priority: 255,
|
|
258
|
+
crossPriorityDuplication: true,
|
|
259
|
+
crossPolicyDuplication: false,
|
|
260
|
+
preferLiveVideo: false,
|
|
261
|
+
}),
|
|
262
|
+
receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
|
|
263
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
264
|
+
codecInfos: [
|
|
265
|
+
sinon.match({
|
|
266
|
+
payloadType: 0x80,
|
|
267
|
+
h264: sinon.match({
|
|
268
|
+
maxFs: MAX_FS_360p,
|
|
269
|
+
maxFps: MAX_FPS,
|
|
270
|
+
maxMbps: MAX_MBPS_360p,
|
|
271
|
+
}),
|
|
272
|
+
}),
|
|
273
|
+
],
|
|
274
|
+
}),
|
|
275
|
+
sinon.match({
|
|
276
|
+
policy: 'receiver-selected',
|
|
277
|
+
policySpecificInfo: sinon.match({
|
|
278
|
+
csi: 123,
|
|
279
|
+
}),
|
|
280
|
+
receiveSlots: [fakeWcmeSlots[3]],
|
|
281
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
282
|
+
codecInfos: [
|
|
283
|
+
sinon.match({
|
|
284
|
+
payloadType: 0x80,
|
|
285
|
+
h264: sinon.match({
|
|
286
|
+
maxFs: MAX_FS_720p,
|
|
287
|
+
maxFps: MAX_FPS,
|
|
288
|
+
maxMbps: MAX_MBPS_720p,
|
|
289
|
+
}),
|
|
290
|
+
}),
|
|
291
|
+
],
|
|
292
|
+
}),
|
|
293
|
+
sinon.match({
|
|
294
|
+
policy: 'receiver-selected',
|
|
295
|
+
policySpecificInfo: sinon.match({
|
|
296
|
+
csi: 123,
|
|
297
|
+
}),
|
|
298
|
+
receiveSlots: [fakeWcmeSlots[4]],
|
|
299
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
300
|
+
codecInfos: [
|
|
301
|
+
sinon.match({
|
|
302
|
+
payloadType: 0x80,
|
|
303
|
+
h264: sinon.match({
|
|
304
|
+
maxFs: MAX_FS_1080p,
|
|
305
|
+
maxFps: MAX_FPS,
|
|
306
|
+
maxMbps: MAX_MBPS_1080p,
|
|
307
|
+
}),
|
|
308
|
+
}),
|
|
309
|
+
],
|
|
310
|
+
}),
|
|
311
|
+
]);
|
|
312
|
+
});
|
|
313
|
+
|
|
314
|
+
it('keeps adding requests with every call to addRequest()', () => {
|
|
315
|
+
// start with 1 request
|
|
316
|
+
addReceiverSelectedRequest(100, fakeReceiveSlots[0], MAX_FS_1080p, true);
|
|
317
|
+
|
|
318
|
+
checkMediaRequestsSent([
|
|
319
|
+
{
|
|
320
|
+
policy: 'receiver-selected',
|
|
321
|
+
csi: 100,
|
|
322
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
323
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
324
|
+
maxFs: MAX_FS_1080p,
|
|
325
|
+
maxMbps: MAX_MBPS_1080p,
|
|
326
|
+
},
|
|
327
|
+
]);
|
|
328
|
+
|
|
329
|
+
// now add another one
|
|
330
|
+
addReceiverSelectedRequest(101, fakeReceiveSlots[1], MAX_FS_1080p, true);
|
|
331
|
+
|
|
332
|
+
checkMediaRequestsSent([
|
|
333
|
+
{
|
|
334
|
+
policy: 'receiver-selected',
|
|
335
|
+
csi: 100,
|
|
336
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
337
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
338
|
+
maxFs: MAX_FS_1080p,
|
|
339
|
+
maxMbps: MAX_MBPS_1080p,
|
|
340
|
+
},
|
|
341
|
+
{
|
|
342
|
+
policy: 'receiver-selected',
|
|
343
|
+
csi: 101,
|
|
344
|
+
receiveSlot: fakeWcmeSlots[1],
|
|
345
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
346
|
+
maxFs: MAX_FS_1080p,
|
|
347
|
+
maxMbps: MAX_MBPS_1080p,
|
|
348
|
+
},
|
|
349
|
+
]);
|
|
350
|
+
|
|
351
|
+
// and one more
|
|
352
|
+
addActiveSpeakerRequest(
|
|
353
|
+
1,
|
|
354
|
+
[fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
|
|
355
|
+
MAX_FS_720p,
|
|
356
|
+
true
|
|
357
|
+
);
|
|
358
|
+
|
|
359
|
+
checkMediaRequestsSent([
|
|
360
|
+
{
|
|
361
|
+
policy: 'receiver-selected',
|
|
362
|
+
csi: 100,
|
|
363
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
364
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
365
|
+
maxFs: MAX_FS_1080p,
|
|
366
|
+
maxMbps: MAX_MBPS_1080p,
|
|
367
|
+
},
|
|
368
|
+
{
|
|
369
|
+
policy: 'receiver-selected',
|
|
370
|
+
csi: 101,
|
|
371
|
+
receiveSlot: fakeWcmeSlots[1],
|
|
372
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
373
|
+
maxFs: MAX_FS_1080p,
|
|
374
|
+
maxMbps: MAX_MBPS_1080p,
|
|
375
|
+
},
|
|
376
|
+
{
|
|
377
|
+
policy: 'active-speaker',
|
|
378
|
+
priority: 1,
|
|
379
|
+
receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
|
|
380
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
381
|
+
maxFs: MAX_FS_720p,
|
|
382
|
+
maxMbps: MAX_MBPS_720p,
|
|
383
|
+
},
|
|
384
|
+
]);
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
it('removes the events maxFsUpdate and sourceUpdate when cancelRequest() is called', async () => {
|
|
388
|
+
|
|
389
|
+
const requestId = addActiveSpeakerRequest(255, [fakeReceiveSlots[2], fakeReceiveSlots[3]], MAX_FS_720p);
|
|
390
|
+
|
|
391
|
+
mediaRequestManager.cancelRequest(requestId, true);
|
|
392
|
+
|
|
393
|
+
const sourceUpdateHandler = fakeReceiveSlots[2].off.getCall(0);
|
|
394
|
+
|
|
395
|
+
const maxFsHandlerCall = fakeReceiveSlots[2].off.getCall(1);
|
|
396
|
+
|
|
397
|
+
const maxFsEventName = maxFsHandlerCall.args[0];
|
|
398
|
+
const sourceUpdateEventName = sourceUpdateHandler.args[0];
|
|
399
|
+
|
|
400
|
+
expect(sourceUpdateHandler.args[1]).to.be.a('function');
|
|
401
|
+
expect(maxFsHandlerCall.args[1]).to.be.a('function');
|
|
402
|
+
|
|
403
|
+
assert.equal(maxFsEventName, 'maxFsUpdate')
|
|
404
|
+
assert.equal(sourceUpdateEventName, 'sourceUpdate')
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
it('cancels the requests correctly when cancelRequest() is called with commit=true', () => {
|
|
408
|
+
const requestIds = [
|
|
409
|
+
addActiveSpeakerRequest(255, [fakeReceiveSlots[0], fakeReceiveSlots[1]], MAX_FS_720p),
|
|
410
|
+
addActiveSpeakerRequest(255, [fakeReceiveSlots[2], fakeReceiveSlots[3]], MAX_FS_720p),
|
|
411
|
+
addReceiverSelectedRequest(100, fakeReceiveSlots[4], MAX_FS_1080p),
|
|
412
|
+
addReceiverSelectedRequest(200, fakeReceiveSlots[5], MAX_FS_1080p),
|
|
413
|
+
];
|
|
414
|
+
|
|
415
|
+
// cancel one of the active speaker requests
|
|
416
|
+
mediaRequestManager.cancelRequest(requestIds[1], true);
|
|
417
|
+
|
|
418
|
+
// expect only the 3 remaining requests to be sent out
|
|
419
|
+
checkMediaRequestsSent([
|
|
420
|
+
{
|
|
421
|
+
policy: 'active-speaker',
|
|
422
|
+
priority: 255,
|
|
423
|
+
receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]],
|
|
424
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
425
|
+
maxFs: MAX_FS_720p,
|
|
426
|
+
maxMbps: MAX_MBPS_720p,
|
|
427
|
+
},
|
|
428
|
+
{
|
|
429
|
+
policy: 'receiver-selected',
|
|
430
|
+
csi: 100,
|
|
431
|
+
receiveSlot: fakeWcmeSlots[4],
|
|
432
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
433
|
+
maxFs: MAX_FS_1080p,
|
|
434
|
+
maxMbps: MAX_MBPS_1080p,
|
|
435
|
+
},
|
|
436
|
+
{
|
|
437
|
+
policy: 'receiver-selected',
|
|
438
|
+
csi: 200,
|
|
439
|
+
receiveSlot: fakeWcmeSlots[5],
|
|
440
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
441
|
+
maxFs: MAX_FS_1080p,
|
|
442
|
+
maxMbps: MAX_MBPS_1080p,
|
|
443
|
+
},
|
|
444
|
+
]);
|
|
445
|
+
|
|
446
|
+
// cancel one of the receiver selected requests
|
|
447
|
+
mediaRequestManager.cancelRequest(requestIds[3], true);
|
|
448
|
+
|
|
449
|
+
// expect only the 2 remaining requests to be sent out
|
|
450
|
+
checkMediaRequestsSent([
|
|
451
|
+
{
|
|
452
|
+
policy: 'active-speaker',
|
|
453
|
+
priority: 255,
|
|
454
|
+
receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1]],
|
|
455
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
456
|
+
maxFs: MAX_FS_720p,
|
|
457
|
+
maxMbps: MAX_MBPS_720p,
|
|
458
|
+
},
|
|
459
|
+
{
|
|
460
|
+
policy: 'receiver-selected',
|
|
461
|
+
csi: 100,
|
|
462
|
+
receiveSlot: fakeWcmeSlots[4],
|
|
463
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
464
|
+
maxFs: MAX_FS_1080p,
|
|
465
|
+
maxMbps: MAX_MBPS_1080p,
|
|
466
|
+
},
|
|
467
|
+
]);
|
|
468
|
+
});
|
|
469
|
+
|
|
470
|
+
it('does not send out anything if addRequest() is called with commit=false', () => {
|
|
471
|
+
addActiveSpeakerRequest(
|
|
472
|
+
10,
|
|
473
|
+
[fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
|
|
474
|
+
MAX_FS_720p,
|
|
475
|
+
false
|
|
476
|
+
);
|
|
477
|
+
addReceiverSelectedRequest(123, fakeReceiveSlots[3], MAX_FS_1080p, false);
|
|
478
|
+
|
|
479
|
+
// nothing should be sent out as we didn't commit the requests
|
|
480
|
+
assert.notCalled(sendMediaRequestsCallback);
|
|
481
|
+
|
|
482
|
+
// now do the commit
|
|
483
|
+
mediaRequestManager.commit();
|
|
484
|
+
|
|
485
|
+
// check that the 2 requests have been sent out
|
|
486
|
+
checkMediaRequestsSent([
|
|
487
|
+
{
|
|
488
|
+
policy: 'active-speaker',
|
|
489
|
+
priority: 10,
|
|
490
|
+
receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
|
|
491
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
492
|
+
maxFs: MAX_FS_720p,
|
|
493
|
+
maxMbps: MAX_MBPS_720p,
|
|
494
|
+
},
|
|
495
|
+
{
|
|
496
|
+
policy: 'receiver-selected',
|
|
497
|
+
csi: 123,
|
|
498
|
+
receiveSlot: fakeWcmeSlots[3],
|
|
499
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
500
|
+
maxFs: MAX_FS_1080p,
|
|
501
|
+
maxMbps: MAX_MBPS_1080p,
|
|
502
|
+
},
|
|
503
|
+
]);
|
|
504
|
+
});
|
|
505
|
+
|
|
506
|
+
it('does not send out anything if cancelRequest() is called with commit=false', () => {
|
|
507
|
+
// send 4 requests
|
|
508
|
+
const requestIds = [
|
|
509
|
+
addActiveSpeakerRequest(
|
|
510
|
+
250,
|
|
511
|
+
[fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
|
|
512
|
+
MAX_FS_720p,
|
|
513
|
+
false
|
|
514
|
+
),
|
|
515
|
+
addReceiverSelectedRequest(98765, fakeReceiveSlots[3], MAX_FS_1080p, false),
|
|
516
|
+
addReceiverSelectedRequest(99999, fakeReceiveSlots[4], MAX_FS_1080p, false),
|
|
517
|
+
addReceiverSelectedRequest(88888, fakeReceiveSlots[5], MAX_FS_1080p, true),
|
|
518
|
+
];
|
|
519
|
+
|
|
520
|
+
checkMediaRequestsSent([
|
|
521
|
+
{
|
|
522
|
+
policy: 'active-speaker',
|
|
523
|
+
priority: 250,
|
|
524
|
+
receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
|
|
525
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
526
|
+
maxFs: MAX_FS_720p,
|
|
527
|
+
maxMbps: MAX_MBPS_720p,
|
|
528
|
+
},
|
|
529
|
+
{
|
|
530
|
+
policy: 'receiver-selected',
|
|
531
|
+
csi: 98765,
|
|
532
|
+
receiveSlot: fakeWcmeSlots[3],
|
|
533
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
534
|
+
maxFs: MAX_FS_1080p,
|
|
535
|
+
maxMbps: MAX_MBPS_1080p,
|
|
536
|
+
},
|
|
537
|
+
{
|
|
538
|
+
policy: 'receiver-selected',
|
|
539
|
+
csi: 99999,
|
|
540
|
+
receiveSlot: fakeWcmeSlots[4],
|
|
541
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
542
|
+
maxFs: MAX_FS_1080p,
|
|
543
|
+
maxMbps: MAX_MBPS_1080p,
|
|
544
|
+
},
|
|
545
|
+
{
|
|
546
|
+
policy: 'receiver-selected',
|
|
547
|
+
csi: 88888,
|
|
548
|
+
receiveSlot: fakeWcmeSlots[5],
|
|
549
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
550
|
+
maxFs: MAX_FS_1080p,
|
|
551
|
+
maxMbps: MAX_MBPS_1080p,
|
|
552
|
+
},
|
|
553
|
+
]);
|
|
554
|
+
|
|
555
|
+
// now cancel 3 of them, but with commit=false => nothing should happen
|
|
556
|
+
mediaRequestManager.cancelRequest(requestIds[0], false);
|
|
557
|
+
mediaRequestManager.cancelRequest(requestIds[2], false);
|
|
558
|
+
mediaRequestManager.cancelRequest(requestIds[3], false);
|
|
559
|
+
|
|
560
|
+
assert.notCalled(sendMediaRequestsCallback);
|
|
561
|
+
|
|
562
|
+
// now do the commit
|
|
563
|
+
mediaRequestManager.commit();
|
|
564
|
+
|
|
565
|
+
checkMediaRequestsSent([
|
|
566
|
+
{
|
|
567
|
+
policy: 'receiver-selected',
|
|
568
|
+
csi: 98765,
|
|
569
|
+
receiveSlot: fakeWcmeSlots[3],
|
|
570
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
571
|
+
maxFs: MAX_FS_1080p,
|
|
572
|
+
maxMbps: MAX_MBPS_1080p,
|
|
573
|
+
},
|
|
574
|
+
]);
|
|
575
|
+
});
|
|
576
|
+
|
|
577
|
+
it('sends the wcme media requests when commit() is called', () => {
|
|
578
|
+
// send some requests, all of them with commit=false
|
|
579
|
+
addReceiverSelectedRequest(123000, fakeReceiveSlots[0], MAX_FS_1080p, false);
|
|
580
|
+
addReceiverSelectedRequest(456000, fakeReceiveSlots[1], MAX_FS_1080p, false);
|
|
581
|
+
addActiveSpeakerRequest(
|
|
582
|
+
255,
|
|
583
|
+
[fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
|
|
584
|
+
MAX_FS_720p,
|
|
585
|
+
false
|
|
586
|
+
);
|
|
587
|
+
addActiveSpeakerRequest(
|
|
588
|
+
254,
|
|
589
|
+
[fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
|
|
590
|
+
MAX_FS_720p,
|
|
591
|
+
false
|
|
592
|
+
);
|
|
593
|
+
|
|
594
|
+
// nothing should be sent out as we didn't commit the requests
|
|
595
|
+
assert.notCalled(sendMediaRequestsCallback);
|
|
596
|
+
|
|
597
|
+
// now do the commit
|
|
598
|
+
mediaRequestManager.commit();
|
|
599
|
+
|
|
600
|
+
// check that all requests have been sent out
|
|
601
|
+
checkMediaRequestsSent([
|
|
602
|
+
{
|
|
603
|
+
policy: 'receiver-selected',
|
|
604
|
+
csi: 123000,
|
|
605
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
606
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
607
|
+
maxFs: MAX_FS_1080p,
|
|
608
|
+
maxMbps: MAX_MBPS_1080p,
|
|
609
|
+
},
|
|
610
|
+
{
|
|
611
|
+
policy: 'receiver-selected',
|
|
612
|
+
csi: 456000,
|
|
613
|
+
receiveSlot: fakeWcmeSlots[1],
|
|
614
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
615
|
+
maxFs: MAX_FS_1080p,
|
|
616
|
+
maxMbps: MAX_MBPS_1080p,
|
|
617
|
+
},
|
|
618
|
+
{
|
|
619
|
+
policy: 'active-speaker',
|
|
620
|
+
priority: 255,
|
|
621
|
+
receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
|
|
622
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
623
|
+
maxFs: MAX_FS_720p,
|
|
624
|
+
maxMbps: MAX_MBPS_720p,
|
|
625
|
+
},
|
|
626
|
+
{
|
|
627
|
+
policy: 'active-speaker',
|
|
628
|
+
priority: 254,
|
|
629
|
+
receiveSlots: [fakeWcmeSlots[5], fakeWcmeSlots[6], fakeWcmeSlots[7]],
|
|
630
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
631
|
+
maxFs: MAX_FS_720p,
|
|
632
|
+
maxMbps: MAX_MBPS_720p,
|
|
633
|
+
},
|
|
634
|
+
]);
|
|
635
|
+
});
|
|
636
|
+
|
|
637
|
+
it('avoids sending duplicate requests and clears all the requests on reset()', () => {
|
|
638
|
+
// send some requests and commit them one by one
|
|
639
|
+
addReceiverSelectedRequest(1500, fakeReceiveSlots[0], MAX_FS_1080p, false);
|
|
640
|
+
addReceiverSelectedRequest(1501, fakeReceiveSlots[1], MAX_FS_1080p, false);
|
|
641
|
+
addActiveSpeakerRequest(
|
|
642
|
+
255,
|
|
643
|
+
[fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
|
|
644
|
+
MAX_FS_720p,
|
|
645
|
+
false
|
|
646
|
+
);
|
|
647
|
+
addActiveSpeakerRequest(
|
|
648
|
+
254,
|
|
649
|
+
[fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
|
|
650
|
+
MAX_FS_720p,
|
|
651
|
+
false
|
|
652
|
+
);
|
|
653
|
+
|
|
654
|
+
// nothing should be sent out as we didn't commit the requests
|
|
655
|
+
assert.notCalled(sendMediaRequestsCallback);
|
|
656
|
+
|
|
657
|
+
mediaRequestManager.commit();
|
|
658
|
+
checkMediaRequestsSent([
|
|
659
|
+
{
|
|
660
|
+
policy: 'receiver-selected',
|
|
661
|
+
csi: 1500,
|
|
662
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
663
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
664
|
+
maxFs: MAX_FS_1080p,
|
|
665
|
+
maxMbps: MAX_MBPS_1080p,
|
|
666
|
+
},
|
|
667
|
+
{
|
|
668
|
+
policy: 'receiver-selected',
|
|
669
|
+
csi: 1501,
|
|
670
|
+
receiveSlot: fakeWcmeSlots[1],
|
|
671
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
672
|
+
maxFs: MAX_FS_1080p,
|
|
673
|
+
maxMbps: MAX_MBPS_1080p,
|
|
674
|
+
},
|
|
675
|
+
{
|
|
676
|
+
policy: 'active-speaker',
|
|
677
|
+
priority: 255,
|
|
678
|
+
receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
|
|
679
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
680
|
+
maxFs: MAX_FS_720p,
|
|
681
|
+
maxMbps: MAX_MBPS_720p,
|
|
682
|
+
},
|
|
683
|
+
{
|
|
684
|
+
policy: 'active-speaker',
|
|
685
|
+
priority: 254,
|
|
686
|
+
receiveSlots: [fakeWcmeSlots[5], fakeWcmeSlots[6], fakeWcmeSlots[7]],
|
|
687
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
688
|
+
maxFs: MAX_FS_720p,
|
|
689
|
+
maxMbps: MAX_MBPS_720p,
|
|
690
|
+
},
|
|
691
|
+
]);
|
|
692
|
+
|
|
693
|
+
// check that when calling commit()
|
|
694
|
+
// all requests are not re-sent again (avoid duplicate requests)
|
|
695
|
+
mediaRequestManager.commit();
|
|
696
|
+
|
|
697
|
+
assert.notCalled(sendMediaRequestsCallback);
|
|
698
|
+
|
|
699
|
+
// now reset everything
|
|
700
|
+
mediaRequestManager.reset();
|
|
701
|
+
|
|
702
|
+
// calling commit now should not cause any requests to be sent out
|
|
703
|
+
mediaRequestManager.commit();
|
|
704
|
+
checkMediaRequestsSent([]);
|
|
705
|
+
});
|
|
706
|
+
|
|
707
|
+
it('makes sure to call requests correctly after reset was called and another request was added', () => {
|
|
708
|
+
addReceiverSelectedRequest(1500, fakeReceiveSlots[0], MAX_FS_1080p, false);
|
|
709
|
+
|
|
710
|
+
assert.notCalled(sendMediaRequestsCallback);
|
|
711
|
+
|
|
712
|
+
mediaRequestManager.commit();
|
|
713
|
+
checkMediaRequestsSent([
|
|
714
|
+
{
|
|
715
|
+
policy: 'receiver-selected',
|
|
716
|
+
csi: 1500,
|
|
717
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
718
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
719
|
+
maxFs: MAX_FS_1080p,
|
|
720
|
+
maxMbps: MAX_MBPS_1080p,
|
|
721
|
+
},
|
|
722
|
+
]);
|
|
723
|
+
|
|
724
|
+
// now reset everything
|
|
725
|
+
mediaRequestManager.reset();
|
|
726
|
+
|
|
727
|
+
// calling commit now should not cause any requests to be sent out
|
|
728
|
+
mediaRequestManager.commit();
|
|
729
|
+
checkMediaRequestsSent([]);
|
|
730
|
+
|
|
731
|
+
//add new request
|
|
732
|
+
addReceiverSelectedRequest(1501, fakeReceiveSlots[1], MAX_FS_1080p, false);
|
|
733
|
+
|
|
734
|
+
// commit
|
|
735
|
+
mediaRequestManager.commit();
|
|
736
|
+
|
|
737
|
+
// check the new request was sent
|
|
738
|
+
checkMediaRequestsSent([
|
|
739
|
+
{
|
|
740
|
+
policy: 'receiver-selected',
|
|
741
|
+
csi: 1501,
|
|
742
|
+
receiveSlot: fakeWcmeSlots[1],
|
|
743
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
744
|
+
maxFs: MAX_FS_1080p,
|
|
745
|
+
maxMbps: MAX_MBPS_1080p,
|
|
746
|
+
},
|
|
747
|
+
]);
|
|
748
|
+
});
|
|
749
|
+
|
|
750
|
+
it('can send same media request after previous requests have been cleared', () => {
|
|
751
|
+
// add a request and commit
|
|
752
|
+
addReceiverSelectedRequest(1500, fakeReceiveSlots[0], MAX_FS_1080p, false);
|
|
753
|
+
mediaRequestManager.commit();
|
|
754
|
+
checkMediaRequestsSent([
|
|
755
|
+
{
|
|
756
|
+
policy: 'receiver-selected',
|
|
757
|
+
csi: 1500,
|
|
758
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
759
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
760
|
+
maxFs: MAX_FS_1080p,
|
|
761
|
+
maxMbps: MAX_MBPS_1080p,
|
|
762
|
+
},
|
|
763
|
+
]);
|
|
764
|
+
|
|
765
|
+
// clear previous requests
|
|
766
|
+
mediaRequestManager.clearPreviousRequests();
|
|
767
|
+
|
|
768
|
+
// commit same request
|
|
769
|
+
mediaRequestManager.commit();
|
|
770
|
+
|
|
771
|
+
// check the request was sent
|
|
772
|
+
checkMediaRequestsSent([
|
|
773
|
+
{
|
|
774
|
+
policy: 'receiver-selected',
|
|
775
|
+
csi: 1500,
|
|
776
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
777
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
778
|
+
maxFs: MAX_FS_1080p,
|
|
779
|
+
maxMbps: MAX_MBPS_1080p,
|
|
780
|
+
},
|
|
781
|
+
]);
|
|
782
|
+
});
|
|
783
|
+
|
|
784
|
+
it('re-sends media requests after degradation preferences are set', () => {
|
|
785
|
+
// set max macroblocks limit
|
|
786
|
+
mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
|
|
787
|
+
assert.calledOnce(sendMediaRequestsCallback);
|
|
788
|
+
});
|
|
789
|
+
|
|
790
|
+
it('should not degrade max-fs if receive slot sources are not live', () => {
|
|
791
|
+
// set receive slot source states to "no source"
|
|
792
|
+
fakeReceiveSlots.forEach((slot) => {
|
|
793
|
+
slot.sourceState = 'no source';
|
|
794
|
+
});
|
|
795
|
+
|
|
796
|
+
// set max macroblocks limit
|
|
797
|
+
mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
|
|
798
|
+
sendMediaRequestsCallback.resetHistory();
|
|
799
|
+
|
|
800
|
+
// request 4 "large" 1080p streams, which should degrade to 720p if live
|
|
801
|
+
addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 4), getMaxFs('large'), true);
|
|
802
|
+
|
|
803
|
+
// check that resulting requests are 4 "large" 1080p streams
|
|
804
|
+
checkMediaRequestsSent([
|
|
805
|
+
{
|
|
806
|
+
policy: 'active-speaker',
|
|
807
|
+
priority: 255,
|
|
808
|
+
receiveSlots: fakeWcmeSlots.slice(0, 4),
|
|
809
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
810
|
+
maxFs: getMaxFs('large'),
|
|
811
|
+
maxMbps: MAX_MBPS_1080p,
|
|
812
|
+
},
|
|
813
|
+
]);
|
|
814
|
+
});
|
|
815
|
+
|
|
816
|
+
it('can degrade max-fs once when request exceeds max macroblocks limit', () => {
|
|
817
|
+
// set max macroblocks limit
|
|
818
|
+
mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
|
|
819
|
+
sendMediaRequestsCallback.resetHistory();
|
|
820
|
+
|
|
821
|
+
// request 3 "large" 1080p streams
|
|
822
|
+
addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 3), getMaxFs('large'), false);
|
|
823
|
+
|
|
824
|
+
// request additional "large" 1080p stream to exceed max macroblocks limit
|
|
825
|
+
const additionalRequestId = addReceiverSelectedRequest(
|
|
826
|
+
123,
|
|
827
|
+
fakeReceiveSlots[3],
|
|
828
|
+
getMaxFs('large'),
|
|
829
|
+
true
|
|
830
|
+
);
|
|
831
|
+
|
|
832
|
+
// check that resulting requests are 4 "medium" 720p streams
|
|
833
|
+
checkMediaRequestsSent([
|
|
834
|
+
{
|
|
835
|
+
policy: 'active-speaker',
|
|
836
|
+
priority: 255,
|
|
837
|
+
receiveSlots: fakeWcmeSlots.slice(0, 3),
|
|
838
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
839
|
+
maxFs: getMaxFs('medium'),
|
|
840
|
+
maxMbps: MAX_MBPS_720p,
|
|
841
|
+
},
|
|
842
|
+
{
|
|
843
|
+
policy: 'receiver-selected',
|
|
844
|
+
csi: 123,
|
|
845
|
+
receiveSlot: fakeWcmeSlots[3],
|
|
846
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
847
|
+
maxFs: getMaxFs('medium'),
|
|
848
|
+
maxMbps: MAX_MBPS_720p,
|
|
849
|
+
},
|
|
850
|
+
]);
|
|
851
|
+
|
|
852
|
+
// cancel additional request
|
|
853
|
+
mediaRequestManager.cancelRequest(additionalRequestId);
|
|
854
|
+
|
|
855
|
+
// check that resulting requests are 3 "large" 1080p streams
|
|
856
|
+
checkMediaRequestsSent([
|
|
857
|
+
{
|
|
858
|
+
policy: 'active-speaker',
|
|
859
|
+
priority: 255,
|
|
860
|
+
receiveSlots: fakeWcmeSlots.slice(0, 3),
|
|
861
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
862
|
+
maxFs: getMaxFs('large'),
|
|
863
|
+
maxMbps: MAX_MBPS_1080p,
|
|
864
|
+
},
|
|
865
|
+
]);
|
|
866
|
+
});
|
|
867
|
+
|
|
868
|
+
it('can degrade max-fs multiple times when request exceeds max macroblocks limit', () => {
|
|
869
|
+
// set max macroblocks limit
|
|
870
|
+
mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
|
|
871
|
+
sendMediaRequestsCallback.resetHistory();
|
|
872
|
+
|
|
873
|
+
// request 10 "large" 1080p streams
|
|
874
|
+
addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 10), getMaxFs('large'), true);
|
|
875
|
+
|
|
876
|
+
// check that resulting requests are 10 "small" 360p streams
|
|
877
|
+
checkMediaRequestsSent([
|
|
878
|
+
{
|
|
879
|
+
policy: 'active-speaker',
|
|
880
|
+
priority: 255,
|
|
881
|
+
receiveSlots: fakeWcmeSlots.slice(0, 10),
|
|
882
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
883
|
+
maxFs: getMaxFs('small'),
|
|
884
|
+
maxMbps: MAX_MBPS_360p,
|
|
885
|
+
},
|
|
886
|
+
]);
|
|
887
|
+
});
|
|
888
|
+
|
|
889
|
+
it('can degrade only the largest max-fs when request exceeds max macroblocks limit', () => {
|
|
890
|
+
// set max macroblocks limit
|
|
891
|
+
mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: 32400});
|
|
892
|
+
sendMediaRequestsCallback.resetHistory();
|
|
893
|
+
|
|
894
|
+
// request 5 "large" 1080p streams and 5 "small" 360p streams
|
|
895
|
+
addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 5), getMaxFs('large'), false);
|
|
896
|
+
addActiveSpeakerRequest(254, fakeReceiveSlots.slice(5, 10), getMaxFs('small'), true);
|
|
897
|
+
|
|
898
|
+
// check that resulting requests are 5 "medium" 720p streams and 5 "small" 360p streams
|
|
899
|
+
checkMediaRequestsSent([
|
|
900
|
+
{
|
|
901
|
+
policy: 'active-speaker',
|
|
902
|
+
priority: 255,
|
|
903
|
+
receiveSlots: fakeWcmeSlots.slice(0, 5),
|
|
904
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
905
|
+
maxFs: getMaxFs('medium'),
|
|
906
|
+
maxMbps: MAX_MBPS_720p,
|
|
907
|
+
},
|
|
908
|
+
{
|
|
909
|
+
policy: 'active-speaker',
|
|
910
|
+
priority: 254,
|
|
911
|
+
receiveSlots: fakeWcmeSlots.slice(5, 10),
|
|
912
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
913
|
+
maxFs: getMaxFs('small'),
|
|
914
|
+
maxMbps: MAX_MBPS_360p,
|
|
915
|
+
},
|
|
916
|
+
]);
|
|
917
|
+
});
|
|
918
|
+
|
|
919
|
+
it('respects the preferredMaxFs if set', () => {
|
|
920
|
+
sendMediaRequestsCallback.resetHistory();
|
|
921
|
+
const clock = FakeTimers.install({now: Date.now()});
|
|
922
|
+
|
|
923
|
+
addActiveSpeakerRequest(255, fakeReceiveSlots.slice(0, 10), getMaxFs('large'), true);
|
|
924
|
+
|
|
925
|
+
sendMediaRequestsCallback.resetHistory();
|
|
926
|
+
|
|
927
|
+
const maxFsHandlerCall = fakeReceiveSlots[0].on.getCall(1);
|
|
928
|
+
|
|
929
|
+
const maxFsHandler = maxFsHandlerCall.args[1];
|
|
930
|
+
const eventName = maxFsHandlerCall.args[0];
|
|
931
|
+
|
|
932
|
+
assert.equal(eventName, 'maxFsUpdate');
|
|
933
|
+
|
|
934
|
+
const preferredFrameSize = 100;
|
|
935
|
+
|
|
936
|
+
maxFsHandler({maxFs: preferredFrameSize});
|
|
937
|
+
|
|
938
|
+
clock.tick(999);
|
|
939
|
+
|
|
940
|
+
assert.notCalled(sendMediaRequestsCallback);
|
|
941
|
+
|
|
942
|
+
clock.tick(1);
|
|
943
|
+
|
|
944
|
+
checkMediaRequestsSent([
|
|
945
|
+
{
|
|
946
|
+
policy: 'active-speaker',
|
|
947
|
+
priority: 255,
|
|
948
|
+
receiveSlots: fakeWcmeSlots.slice(0, 10),
|
|
949
|
+
maxFs: preferredFrameSize,
|
|
950
|
+
maxPayloadBitsPerSecond: 99000,
|
|
951
|
+
maxMbps: 3000,
|
|
952
|
+
},
|
|
953
|
+
]);
|
|
954
|
+
});
|
|
955
|
+
|
|
956
|
+
describe('maxPayloadBitsPerSecond', () => {
|
|
957
|
+
let getRecommendedMaxBitrateForFrameSizeSpy;
|
|
958
|
+
|
|
959
|
+
beforeEach(() => {
|
|
960
|
+
sendMediaRequestsCallback.resetHistory();
|
|
961
|
+
getRecommendedMaxBitrateForFrameSizeSpy = sinon.spy(
|
|
962
|
+
mediaCore,
|
|
963
|
+
'getRecommendedMaxBitrateForFrameSize'
|
|
964
|
+
);
|
|
965
|
+
});
|
|
966
|
+
|
|
967
|
+
afterEach(() => {
|
|
968
|
+
getRecommendedMaxBitrateForFrameSizeSpy.restore();
|
|
969
|
+
});
|
|
970
|
+
|
|
971
|
+
it('returns the default maxPayloadBitsPerSecond if kind is "audio"', () => {
|
|
972
|
+
const mediaRequestManagerAudio = new MediaRequestManager(sendMediaRequestsCallback, {
|
|
973
|
+
degradationPreferences,
|
|
974
|
+
kind: 'audio',
|
|
975
|
+
trimRequestsToNumOfSources: false,
|
|
976
|
+
});
|
|
977
|
+
mediaRequestManagerAudio.setNumCurrentSources(100, 100);
|
|
978
|
+
sendMediaRequestsCallback.resetHistory();
|
|
979
|
+
|
|
980
|
+
mediaRequestManagerAudio.addRequest(
|
|
981
|
+
{
|
|
982
|
+
policyInfo: {
|
|
983
|
+
policy: 'receiver-selected',
|
|
984
|
+
csi: 123,
|
|
985
|
+
},
|
|
986
|
+
receiveSlots: [fakeReceiveSlots[0]],
|
|
987
|
+
codecInfo: undefined,
|
|
988
|
+
},
|
|
989
|
+
false
|
|
990
|
+
);
|
|
991
|
+
|
|
992
|
+
mediaRequestManagerAudio.commit();
|
|
993
|
+
|
|
994
|
+
checkMediaRequestsSent(
|
|
995
|
+
[
|
|
996
|
+
{
|
|
997
|
+
policy: 'receiver-selected',
|
|
998
|
+
csi: 123,
|
|
999
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
1000
|
+
// returns RecommendedOpusBitrates.FB_MONO_MUSIC as expected:
|
|
1001
|
+
maxPayloadBitsPerSecond: 64000,
|
|
1002
|
+
},
|
|
1003
|
+
// set isCodecInfoDefined to false, since we don't pass in a codec info when audio:
|
|
1004
|
+
],
|
|
1005
|
+
{isCodecInfoDefined: false}
|
|
1006
|
+
);
|
|
1007
|
+
|
|
1008
|
+
assert.notCalled(getRecommendedMaxBitrateForFrameSizeSpy);
|
|
1009
|
+
});
|
|
1010
|
+
|
|
1011
|
+
it('returns the recommended maxPayloadBitsPerSecond if kind is "video"', () => {
|
|
1012
|
+
mediaRequestManager.addRequest(
|
|
1013
|
+
{
|
|
1014
|
+
policyInfo: {
|
|
1015
|
+
policy: 'receiver-selected',
|
|
1016
|
+
csi: 123,
|
|
1017
|
+
},
|
|
1018
|
+
receiveSlots: [fakeReceiveSlots[0]],
|
|
1019
|
+
codecInfo: {
|
|
1020
|
+
codec: 'h264',
|
|
1021
|
+
maxFs: MAX_FS_1080p,
|
|
1022
|
+
maxFps: MAX_FPS,
|
|
1023
|
+
maxMbps: MAX_MBPS_1080p,
|
|
1024
|
+
},
|
|
1025
|
+
},
|
|
1026
|
+
false
|
|
1027
|
+
);
|
|
1028
|
+
|
|
1029
|
+
mediaRequestManager.commit();
|
|
1030
|
+
|
|
1031
|
+
checkMediaRequestsSent([
|
|
1032
|
+
{
|
|
1033
|
+
policy: 'receiver-selected',
|
|
1034
|
+
csi: 123,
|
|
1035
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
1036
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
1037
|
+
maxFs: MAX_FS_1080p,
|
|
1038
|
+
maxMbps: MAX_MBPS_1080p,
|
|
1039
|
+
},
|
|
1040
|
+
]);
|
|
1041
|
+
|
|
1042
|
+
// calls the utility function as expected with maxFs passed in (no need to do
|
|
1043
|
+
// further tests here, since the util function itself should be tested for different inputs)
|
|
1044
|
+
assert.calledWith(getRecommendedMaxBitrateForFrameSizeSpy, MAX_FS_1080p);
|
|
1045
|
+
});
|
|
1046
|
+
});
|
|
1047
|
+
|
|
1048
|
+
describe('maxMbps', () => {
|
|
1049
|
+
beforeEach(() => {
|
|
1050
|
+
sendMediaRequestsCallback.resetHistory();
|
|
1051
|
+
});
|
|
1052
|
+
|
|
1053
|
+
it('returns the correct maxMbps value', () => {
|
|
1054
|
+
mediaRequestManager.addRequest(
|
|
1055
|
+
{
|
|
1056
|
+
policyInfo: {
|
|
1057
|
+
policy: 'receiver-selected',
|
|
1058
|
+
csi: 123,
|
|
1059
|
+
},
|
|
1060
|
+
receiveSlots: [fakeReceiveSlots[0]],
|
|
1061
|
+
codecInfo: {
|
|
1062
|
+
codec: 'h264',
|
|
1063
|
+
maxFs: MAX_FS_1080p,
|
|
1064
|
+
maxFps: MAX_FPS,
|
|
1065
|
+
// random value to pass in, to show that the output (below) is calculated
|
|
1066
|
+
// from the maxFs and maxFps values only:
|
|
1067
|
+
maxMbps: 123,
|
|
1068
|
+
},
|
|
1069
|
+
},
|
|
1070
|
+
false
|
|
1071
|
+
);
|
|
1072
|
+
|
|
1073
|
+
mediaRequestManager.commit();
|
|
1074
|
+
|
|
1075
|
+
checkMediaRequestsSent([
|
|
1076
|
+
{
|
|
1077
|
+
policy: 'receiver-selected',
|
|
1078
|
+
csi: 123,
|
|
1079
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
1080
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
1081
|
+
maxFs: MAX_FS_1080p,
|
|
1082
|
+
maxMbps: MAX_MBPS_1080p,
|
|
1083
|
+
},
|
|
1084
|
+
]);
|
|
1085
|
+
});
|
|
1086
|
+
});
|
|
1087
|
+
|
|
1088
|
+
describe('trimming of requested receive slots', () => {
|
|
1089
|
+
beforeEach(() => {
|
|
1090
|
+
mediaRequestManager = new MediaRequestManager(sendMediaRequestsCallback, {
|
|
1091
|
+
degradationPreferences,
|
|
1092
|
+
kind: 'video',
|
|
1093
|
+
trimRequestsToNumOfSources: true,
|
|
1094
|
+
});
|
|
1095
|
+
});
|
|
1096
|
+
|
|
1097
|
+
const limitNumAvailableStreams = (preferLiveVideo, limit) => {
|
|
1098
|
+
if (preferLiveVideo) {
|
|
1099
|
+
mediaRequestManager.setNumCurrentSources(100, limit);
|
|
1100
|
+
} else {
|
|
1101
|
+
mediaRequestManager.setNumCurrentSources(limit, 1);
|
|
1102
|
+
}
|
|
1103
|
+
};
|
|
1104
|
+
|
|
1105
|
+
[true, false].forEach((preferLiveVideo) =>
|
|
1106
|
+
describe(`preferLiveVideo=${preferLiveVideo}`, () => {
|
|
1107
|
+
it(`trims the active speaker request with lowest priority first and maintains slot order`, () => {
|
|
1108
|
+
// add some receiver-selected and active-speaker requests, in a mixed up order
|
|
1109
|
+
addReceiverSelectedRequest(100, fakeReceiveSlots[0], MAX_FS_360p, false);
|
|
1110
|
+
addActiveSpeakerRequest( // AS request 1 - it will get 1 slot trimmed
|
|
1111
|
+
254,
|
|
1112
|
+
[fakeReceiveSlots[1], fakeReceiveSlots[2], fakeReceiveSlots[3]],
|
|
1113
|
+
MAX_FS_360p,
|
|
1114
|
+
false,
|
|
1115
|
+
preferLiveVideo
|
|
1116
|
+
);
|
|
1117
|
+
addActiveSpeakerRequest( // AS request 2 - lowest priority, it will have all slots trimmed
|
|
1118
|
+
253,
|
|
1119
|
+
[fakeReceiveSlots[7], fakeReceiveSlots[8], fakeReceiveSlots[9]],
|
|
1120
|
+
MAX_FS_360p,
|
|
1121
|
+
false,
|
|
1122
|
+
preferLiveVideo
|
|
1123
|
+
);
|
|
1124
|
+
addActiveSpeakerRequest( // AS request 3 - highest priority, nothing will be trimmed
|
|
1125
|
+
255,
|
|
1126
|
+
[fakeReceiveSlots[4], fakeReceiveSlots[5], fakeReceiveSlots[6]],
|
|
1127
|
+
MAX_FS_360p,
|
|
1128
|
+
false,
|
|
1129
|
+
preferLiveVideo
|
|
1130
|
+
);
|
|
1131
|
+
addReceiverSelectedRequest(101, fakeReceiveSlots[10], MAX_FS_360p, false);
|
|
1132
|
+
|
|
1133
|
+
/* Set number of available streams to 7 so that there will be enough sources only for
|
|
1134
|
+
the 2 RS requests and 2 of the 3 AS requests. The lowest priority AS request will
|
|
1135
|
+
have all the slots trimmed, the second lowest priority AS request will have 1 slot trimmed */
|
|
1136
|
+
limitNumAvailableStreams(preferLiveVideo, 7);
|
|
1137
|
+
|
|
1138
|
+
// check what got trimmed
|
|
1139
|
+
checkMediaRequestsSent([
|
|
1140
|
+
{
|
|
1141
|
+
policy: 'receiver-selected',
|
|
1142
|
+
csi: 100,
|
|
1143
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
1144
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1145
|
+
maxFs: MAX_FS_360p,
|
|
1146
|
+
maxMbps: MAX_MBPS_360p,
|
|
1147
|
+
},
|
|
1148
|
+
{
|
|
1149
|
+
policy: 'active-speaker',
|
|
1150
|
+
priority: 254,
|
|
1151
|
+
receiveSlots: [fakeWcmeSlots[1], fakeWcmeSlots[2]], // fakeWcmeSlots[3] got trimmed
|
|
1152
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1153
|
+
maxFs: MAX_FS_360p,
|
|
1154
|
+
maxMbps: MAX_MBPS_360p,
|
|
1155
|
+
},
|
|
1156
|
+
// AS request with priority 253 is missing, because all of its slots got trimmed
|
|
1157
|
+
{
|
|
1158
|
+
policy: 'active-speaker',
|
|
1159
|
+
priority: 255,
|
|
1160
|
+
receiveSlots: [fakeWcmeSlots[4], fakeWcmeSlots[5], fakeWcmeSlots[6]],
|
|
1161
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1162
|
+
maxFs: MAX_FS_360p,
|
|
1163
|
+
maxMbps: MAX_MBPS_360p,
|
|
1164
|
+
},
|
|
1165
|
+
{
|
|
1166
|
+
policy: 'receiver-selected',
|
|
1167
|
+
csi: 101,
|
|
1168
|
+
receiveSlot: fakeWcmeSlots[10],
|
|
1169
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1170
|
+
maxFs: MAX_FS_360p,
|
|
1171
|
+
maxMbps: MAX_MBPS_360p,
|
|
1172
|
+
},
|
|
1173
|
+
], {preferLiveVideo});
|
|
1174
|
+
|
|
1175
|
+
// now increase the number of available streams so only the last AS request is trimmed by 1
|
|
1176
|
+
limitNumAvailableStreams(preferLiveVideo, 10);
|
|
1177
|
+
|
|
1178
|
+
checkMediaRequestsSent([
|
|
1179
|
+
{
|
|
1180
|
+
policy: 'receiver-selected',
|
|
1181
|
+
csi: 100,
|
|
1182
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
1183
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1184
|
+
maxFs: MAX_FS_360p,
|
|
1185
|
+
maxMbps: MAX_MBPS_360p,
|
|
1186
|
+
},
|
|
1187
|
+
{
|
|
1188
|
+
policy: 'active-speaker',
|
|
1189
|
+
priority: 254,
|
|
1190
|
+
receiveSlots: [fakeWcmeSlots[1], fakeWcmeSlots[2], fakeWcmeSlots[3]], // all slots are used, nothing trimmed
|
|
1191
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1192
|
+
maxFs: MAX_FS_360p,
|
|
1193
|
+
maxMbps: MAX_MBPS_360p,
|
|
1194
|
+
},
|
|
1195
|
+
{
|
|
1196
|
+
policy: 'active-speaker',
|
|
1197
|
+
priority: 253,
|
|
1198
|
+
receiveSlots: [fakeWcmeSlots[7], fakeWcmeSlots[8]], // only 1 slot is trimmed
|
|
1199
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1200
|
+
maxFs: MAX_FS_360p,
|
|
1201
|
+
maxMbps: MAX_MBPS_360p,
|
|
1202
|
+
},
|
|
1203
|
+
{
|
|
1204
|
+
policy: 'active-speaker',
|
|
1205
|
+
priority: 255,
|
|
1206
|
+
receiveSlots: [fakeWcmeSlots[4], fakeWcmeSlots[5], fakeWcmeSlots[6]], // all slots are used, nothing trimmed
|
|
1207
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1208
|
+
maxFs: MAX_FS_360p,
|
|
1209
|
+
maxMbps: MAX_MBPS_360p,
|
|
1210
|
+
},
|
|
1211
|
+
{
|
|
1212
|
+
policy: 'receiver-selected',
|
|
1213
|
+
csi: 101,
|
|
1214
|
+
receiveSlot: fakeWcmeSlots[10],
|
|
1215
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1216
|
+
maxFs: MAX_FS_360p,
|
|
1217
|
+
maxMbps: MAX_MBPS_360p,
|
|
1218
|
+
},
|
|
1219
|
+
], {preferLiveVideo});
|
|
1220
|
+
})
|
|
1221
|
+
|
|
1222
|
+
it('does not trim the receiver selected requests', async () => {
|
|
1223
|
+
// add some receiver-selected and active-speaker requests, in a mixed up order
|
|
1224
|
+
addReceiverSelectedRequest(200, fakeReceiveSlots[0], MAX_FS_360p, false);
|
|
1225
|
+
addActiveSpeakerRequest(
|
|
1226
|
+
255,
|
|
1227
|
+
[fakeReceiveSlots[1], fakeReceiveSlots[2], fakeReceiveSlots[3]],
|
|
1228
|
+
MAX_FS_360p,
|
|
1229
|
+
false,
|
|
1230
|
+
preferLiveVideo
|
|
1231
|
+
);
|
|
1232
|
+
addReceiverSelectedRequest(201, fakeReceiveSlots[4], MAX_FS_720p, false);
|
|
1233
|
+
addActiveSpeakerRequest(
|
|
1234
|
+
254,
|
|
1235
|
+
[fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
|
|
1236
|
+
MAX_FS_720p,
|
|
1237
|
+
false,
|
|
1238
|
+
preferLiveVideo
|
|
1239
|
+
);
|
|
1240
|
+
|
|
1241
|
+
/* Set number of available streams to 1, which is lower than the number of RS requests,
|
|
1242
|
+
so all AS requests will be trimmed to 0 but RS requests should be unaltered */
|
|
1243
|
+
limitNumAvailableStreams(preferLiveVideo, 1);
|
|
1244
|
+
|
|
1245
|
+
// check what got trimmed - only RS requests should remain
|
|
1246
|
+
checkMediaRequestsSent([
|
|
1247
|
+
{
|
|
1248
|
+
policy: 'receiver-selected',
|
|
1249
|
+
csi: 200,
|
|
1250
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
1251
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1252
|
+
maxFs: MAX_FS_360p,
|
|
1253
|
+
maxMbps: MAX_MBPS_360p,
|
|
1254
|
+
},
|
|
1255
|
+
{
|
|
1256
|
+
policy: 'receiver-selected',
|
|
1257
|
+
csi: 201,
|
|
1258
|
+
receiveSlot: fakeWcmeSlots[4],
|
|
1259
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
1260
|
+
maxFs: MAX_FS_720p,
|
|
1261
|
+
maxMbps: MAX_MBPS_720p,
|
|
1262
|
+
},
|
|
1263
|
+
], {preferLiveVideo});
|
|
1264
|
+
});
|
|
1265
|
+
|
|
1266
|
+
it('does trimming first and applies degradationPreferences after that', async () => {
|
|
1267
|
+
// add some receiver-selected and active-speaker requests
|
|
1268
|
+
addReceiverSelectedRequest(200, fakeReceiveSlots[0], MAX_FS_360p, false);
|
|
1269
|
+
addActiveSpeakerRequest(
|
|
1270
|
+
255,
|
|
1271
|
+
[fakeReceiveSlots[1], fakeReceiveSlots[2], fakeReceiveSlots[3]],
|
|
1272
|
+
MAX_FS_360p,
|
|
1273
|
+
false,
|
|
1274
|
+
preferLiveVideo
|
|
1275
|
+
);
|
|
1276
|
+
addReceiverSelectedRequest(201, fakeReceiveSlots[4], MAX_FS_720p, false);
|
|
1277
|
+
addActiveSpeakerRequest(
|
|
1278
|
+
254,
|
|
1279
|
+
[fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
|
|
1280
|
+
MAX_FS_720p,
|
|
1281
|
+
false,
|
|
1282
|
+
preferLiveVideo
|
|
1283
|
+
);
|
|
1284
|
+
|
|
1285
|
+
// Set maxMacroblocksLimit to a value that's big enough just for the 2 RS requests and 1 AS with 1 slot of 360p.
|
|
1286
|
+
// but not big enough for all of the RS and AS requests. If maxMacroblocksLimit
|
|
1287
|
+
// was applied first, the resolution of all requests (including RS ones) would be degraded
|
|
1288
|
+
// This test verifies that it's not happening and the resolutions are not affected.
|
|
1289
|
+
mediaRequestManager.setDegradationPreferences({maxMacroblocksLimit: MAX_FS_360p + MAX_FS_720p + MAX_FS_360p});
|
|
1290
|
+
sendMediaRequestsCallback.resetHistory();
|
|
1291
|
+
|
|
1292
|
+
/* Limit the num of streams so that only 2 RS requests and 1 AS with 1 slot can be sent out */
|
|
1293
|
+
limitNumAvailableStreams(preferLiveVideo, 3);
|
|
1294
|
+
|
|
1295
|
+
// check what got trimmed - the remaining requests should have unchanged resolutions
|
|
1296
|
+
checkMediaRequestsSent([
|
|
1297
|
+
{
|
|
1298
|
+
policy: 'receiver-selected',
|
|
1299
|
+
csi: 200,
|
|
1300
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
1301
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1302
|
+
maxFs: MAX_FS_360p,
|
|
1303
|
+
maxMbps: MAX_MBPS_360p,
|
|
1304
|
+
},
|
|
1305
|
+
{
|
|
1306
|
+
policy: 'active-speaker',
|
|
1307
|
+
priority: 255,
|
|
1308
|
+
receiveSlots: [fakeWcmeSlots[1]],
|
|
1309
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1310
|
+
maxFs: MAX_FS_360p,
|
|
1311
|
+
maxMbps: MAX_MBPS_360p,
|
|
1312
|
+
},
|
|
1313
|
+
{
|
|
1314
|
+
policy: 'receiver-selected',
|
|
1315
|
+
csi: 201,
|
|
1316
|
+
receiveSlot: fakeWcmeSlots[4],
|
|
1317
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
1318
|
+
maxFs: MAX_FS_720p,
|
|
1319
|
+
maxMbps: MAX_MBPS_720p,
|
|
1320
|
+
},
|
|
1321
|
+
], {preferLiveVideo});
|
|
1322
|
+
});
|
|
1323
|
+
|
|
1324
|
+
it('trims all AS requests completely until setNumCurrentSources() is called with non-zero values', async () => {
|
|
1325
|
+
// add some receiver-selected and active-speaker requests
|
|
1326
|
+
addReceiverSelectedRequest(200, fakeReceiveSlots[0], MAX_FS_360p, false);
|
|
1327
|
+
addActiveSpeakerRequest(
|
|
1328
|
+
255,
|
|
1329
|
+
[fakeReceiveSlots[1], fakeReceiveSlots[2], fakeReceiveSlots[3]],
|
|
1330
|
+
MAX_FS_360p,
|
|
1331
|
+
false,
|
|
1332
|
+
preferLiveVideo
|
|
1333
|
+
);
|
|
1334
|
+
addActiveSpeakerRequest(
|
|
1335
|
+
254,
|
|
1336
|
+
[fakeReceiveSlots[5]],
|
|
1337
|
+
MAX_FS_360p,
|
|
1338
|
+
false,
|
|
1339
|
+
preferLiveVideo
|
|
1340
|
+
);
|
|
1341
|
+
|
|
1342
|
+
mediaRequestManager.commit();
|
|
1343
|
+
|
|
1344
|
+
// we're not calling setNumCurrentSources(), so it should use the initial values of 0 for sources count
|
|
1345
|
+
// and completely trim all AS requests to 0
|
|
1346
|
+
checkMediaRequestsSent([
|
|
1347
|
+
{
|
|
1348
|
+
policy: 'receiver-selected',
|
|
1349
|
+
csi: 200,
|
|
1350
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
1351
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1352
|
+
maxFs: MAX_FS_360p,
|
|
1353
|
+
maxMbps: MAX_MBPS_360p,
|
|
1354
|
+
},
|
|
1355
|
+
], {preferLiveVideo});
|
|
1356
|
+
});
|
|
1357
|
+
|
|
1358
|
+
it('resets num of sources to 0 when reset() is called', async () => {
|
|
1359
|
+
// set available streams to non-zero value
|
|
1360
|
+
limitNumAvailableStreams(preferLiveVideo, 4);
|
|
1361
|
+
sendMediaRequestsCallback.resetHistory();
|
|
1362
|
+
|
|
1363
|
+
// do the reset
|
|
1364
|
+
mediaRequestManager.reset();
|
|
1365
|
+
|
|
1366
|
+
// add some receiver-selected and active-speaker requests
|
|
1367
|
+
addReceiverSelectedRequest(200, fakeReceiveSlots[0], MAX_FS_360p, false);
|
|
1368
|
+
addActiveSpeakerRequest(
|
|
1369
|
+
255,
|
|
1370
|
+
[fakeReceiveSlots[1], fakeReceiveSlots[2], fakeReceiveSlots[3]],
|
|
1371
|
+
MAX_FS_360p,
|
|
1372
|
+
false,
|
|
1373
|
+
preferLiveVideo
|
|
1374
|
+
);
|
|
1375
|
+
|
|
1376
|
+
mediaRequestManager.commit();
|
|
1377
|
+
|
|
1378
|
+
// verify that AS request was trimmed to 0, because we've reset mediaRequestManager so available streams count is 0 now
|
|
1379
|
+
checkMediaRequestsSent([
|
|
1380
|
+
{
|
|
1381
|
+
policy: 'receiver-selected',
|
|
1382
|
+
csi: 200,
|
|
1383
|
+
receiveSlot: fakeWcmeSlots[0],
|
|
1384
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
1385
|
+
maxFs: MAX_FS_360p,
|
|
1386
|
+
maxMbps: MAX_MBPS_360p,
|
|
1387
|
+
},
|
|
1388
|
+
], {preferLiveVideo});
|
|
1389
|
+
});
|
|
1390
|
+
})
|
|
1391
|
+
);
|
|
1392
|
+
|
|
1393
|
+
|
|
1394
|
+
it('throws if there are 2 active-speaker requests with different preferLiveVideo values', () => {
|
|
1395
|
+
addActiveSpeakerRequest(
|
|
1396
|
+
255,
|
|
1397
|
+
[fakeReceiveSlots[0]],
|
|
1398
|
+
MAX_FS_360p,
|
|
1399
|
+
false,
|
|
1400
|
+
true
|
|
1401
|
+
);
|
|
1402
|
+
addReceiverSelectedRequest(201, fakeReceiveSlots[4], MAX_FS_720p, false);
|
|
1403
|
+
addActiveSpeakerRequest(
|
|
1404
|
+
254,
|
|
1405
|
+
[fakeReceiveSlots[2]],
|
|
1406
|
+
MAX_FS_360p,
|
|
1407
|
+
false,
|
|
1408
|
+
false
|
|
1409
|
+
);
|
|
1410
|
+
|
|
1411
|
+
assert.throws(() => mediaRequestManager.commit(), 'a mix of active-speaker groups with different values for preferLiveVideo is not supported');
|
|
1412
|
+
})
|
|
1413
|
+
})
|
|
1414
|
+
});
|
|
1415
|
+
function assertEqual(arg0: any, arg1: string) {
|
|
1416
|
+
throw new Error('Function not implemented.');
|
|
1417
|
+
}
|
|
1418
|
+
|