@webex/plugin-meetings 3.0.0-beta.2 → 3.0.0-beta.200
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/UPGRADING.md +9 -9
- package/browsers.js +19 -24
- 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 +216 -0
- package/dist/breakouts/breakout.js.map +1 -0
- package/dist/breakouts/collection.js +23 -0
- package/dist/breakouts/collection.js.map +1 -0
- 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 +1048 -0
- package/dist/breakouts/index.js.map +1 -0
- 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/browser-detection.js +1 -20
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +5 -20
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.js +0 -7
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.js +10 -24
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +11 -24
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +12 -25
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +10 -24
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.js +5 -33
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +10 -24
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +9 -23
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reconnection-in-progress.js +0 -17
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.js +10 -24
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +10 -24
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.js +9 -43
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +5 -25
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js +0 -22
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js +0 -23
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js +0 -12
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js +0 -15
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.js +0 -4
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -8
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js +37 -60
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +28 -23
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +8 -13
- package/dist/config.js.map +1 -1
- package/dist/constants.js +250 -66
- 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 +108 -17
- 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 +101 -29
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.js +3 -26
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js +0 -15
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js +4 -12
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.js +532 -240
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +3 -37
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +54 -38
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +284 -154
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +110 -92
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +95 -226
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +99 -194
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +2 -9
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +505 -495
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +83 -14
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +3478 -3563
- 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 +247 -183
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +344 -344
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js +7 -0
- package/dist/meeting/request.type.js.map +1 -0
- package/dist/meeting/state.js +21 -31
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.js +529 -588
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +6 -25
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +62 -39
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +328 -283
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +3 -15
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js +98 -183
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +156 -232
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +26 -19
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +795 -574
- 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 +26 -41
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +186 -155
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +126 -85
- 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 +147 -88
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +13 -12
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +178 -204
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +113 -68
- 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 +314 -260
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +4 -7
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +11 -558
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +264 -50
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +58 -65
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +76 -95
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +62 -76
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +66 -43
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +502 -442
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +40 -59
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +21 -45
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +1 -31
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js +0 -13
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.js +192 -191
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +15 -23
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/constants.js +13 -0
- package/dist/reactions/constants.js.map +1 -0
- package/dist/reactions/reactions.js +109 -0
- package/dist/reactions/reactions.js.map +1 -0
- package/dist/reactions/reactions.type.js +36 -0
- package/dist/reactions/reactions.type.js.map +1 -0
- package/dist/reconnection-manager/index.js +384 -476
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/enums.js +17 -0
- package/dist/recording-controller/enums.js.map +1 -0
- package/dist/recording-controller/index.js +363 -0
- package/dist/recording-controller/index.js.map +1 -0
- package/dist/recording-controller/util.js +64 -0
- package/dist/recording-controller/util.js.map +1 -0
- package/dist/roap/index.js +58 -91
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +137 -135
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +148 -100
- 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 +115 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/statsAnalyzer/global.js +1 -95
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +385 -460
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +143 -87
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +22 -47
- package/dist/transcription/index.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 +1016 -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 +153 -0
- package/dist/types/meeting/index.d.ts +1471 -0
- package/dist/types/meeting/locusMediaRequest.d.ts +70 -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 +78 -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 +208 -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/internal-README.md +7 -6
- package/package.json +29 -21
- 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/{browser-detection.js → browser-detection.ts} +9 -6
- package/src/common/collection.ts +9 -7
- package/src/common/{config.js → config.ts} +1 -1
- package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
- package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
- package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
- package/src/common/errors/{media.js → media.ts} +11 -7
- package/src/common/errors/parameter.ts +11 -7
- package/src/common/errors/{password-error.js → password-error.ts} +11 -7
- package/src/common/errors/{permission.js → permission.ts} +10 -6
- package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
- package/src/common/errors/{stats.js → stats.ts} +11 -7
- package/src/common/errors/{webex-errors.js → webex-errors.ts} +14 -9
- package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
- package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
- package/src/common/events/{events.js → events.ts} +5 -1
- package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
- package/src/common/events/{util.js → util.ts} +2 -3
- package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
- package/src/common/logs/logger-proxy.ts +44 -0
- package/src/common/logs/{request.js → request.ts} +22 -9
- package/src/common/queue.ts +22 -9
- package/src/{config.js → config.ts} +17 -17
- package/src/constants.ts +197 -22
- 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 +222 -0
- package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
- package/src/locus-info/{fullState.js → fullState.ts} +16 -12
- package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
- package/src/locus-info/{index.js → index.ts} +518 -111
- package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
- package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +65 -17
- package/src/locus-info/{parser.js → parser.ts} +271 -98
- package/src/locus-info/{selfUtils.js → selfUtils.ts} +199 -68
- package/src/media/index.ts +456 -0
- package/src/media/{properties.js → properties.ts} +80 -102
- package/src/media/{util.js → util.ts} +2 -2
- package/src/mediaQualityMetrics/config.ts +384 -0
- package/src/meeting/in-meeting-actions.ts +171 -3
- package/src/meeting/index.ts +7070 -0
- package/src/meeting/locusMediaRequest.ts +309 -0
- package/src/meeting/muteState.ts +450 -0
- package/src/meeting/{request.js → request.ts} +354 -214
- package/src/meeting/request.type.ts +13 -0
- package/src/meeting/{state.js → state.ts} +50 -35
- package/src/meeting/util.ts +615 -0
- package/src/meeting-info/{collection.js → collection.ts} +6 -2
- package/src/meeting-info/index.ts +183 -0
- package/src/meeting-info/meeting-info-v2.ts +407 -0
- package/src/meeting-info/{request.js → request.ts} +14 -4
- package/src/meeting-info/{util.js → util.ts} +60 -51
- package/src/meeting-info/{utilv2.js → utilv2.ts} +77 -60
- package/src/meetings/{collection.js → collection.ts} +26 -3
- package/src/meetings/index.ts +1467 -0
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/{request.js → request.ts} +34 -25
- package/src/meetings/{util.js → util.ts} +137 -36
- package/src/member/{index.js → index.ts} +151 -56
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +383 -0
- package/src/members/{collection.js → collection.ts} +10 -2
- package/src/members/{index.js → index.ts} +323 -145
- package/src/members/request.ts +255 -0
- package/src/members/types.ts +28 -0
- package/src/members/util.ts +339 -0
- package/src/metrics/{constants.js → constants.ts} +2 -6
- package/src/metrics/index.ts +73 -0
- package/src/multistream/mediaRequestManager.ts +337 -61
- package/src/multistream/receiveSlot.ts +69 -26
- package/src/multistream/receiveSlotManager.ts +66 -42
- package/src/multistream/remoteMedia.ts +40 -5
- package/src/multistream/remoteMediaGroup.ts +63 -3
- package/src/multistream/remoteMediaManager.ts +263 -66
- package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
- package/src/personal-meeting-room/{index.js → index.ts} +28 -19
- package/src/personal-meeting-room/{request.js → request.ts} +13 -4
- package/src/personal-meeting-room/{util.js → util.ts} +4 -4
- package/src/reachability/{index.js → index.ts} +157 -94
- package/src/reachability/request.ts +46 -35
- package/src/reactions/constants.ts +4 -0
- package/src/reactions/reactions.ts +104 -0
- package/src/reactions/reactions.type.ts +62 -0
- package/src/reconnection-manager/{index.js → index.ts} +254 -136
- package/src/recording-controller/enums.ts +8 -0
- package/src/recording-controller/index.ts +333 -0
- package/src/recording-controller/util.ts +75 -0
- package/src/roap/{index.js → index.ts} +86 -78
- package/src/roap/request.ts +163 -0
- package/src/roap/turnDiscovery.ts +111 -49
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +96 -0
- package/src/statsAnalyzer/global.ts +37 -0
- package/src/statsAnalyzer/index.ts +1272 -0
- package/src/statsAnalyzer/mqaUtil.ts +291 -0
- package/src/transcription/{index.js → index.ts} +46 -39
- package/test/integration/spec/converged-space-meetings.js +233 -0
- package/test/integration/spec/journey.js +804 -526
- package/test/integration/spec/space-meeting.js +391 -204
- package/test/integration/spec/transcription.js +7 -8
- 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/browser-detection.js +9 -28
- 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 +93 -90
- 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 +325 -32
- package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
- package/test/unit/spec/locus-info/index.js +1176 -18
- package/test/unit/spec/locus-info/infoUtils.js +41 -32
- package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
- package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
- package/test/unit/spec/locus-info/parser.js +65 -31
- package/test/unit/spec/locus-info/selfConstant.js +120 -103
- package/test/unit/spec/locus-info/selfUtils.js +296 -12
- package/test/unit/spec/media/index.ts +162 -68
- package/test/unit/spec/media/properties.ts +9 -9
- package/test/unit/spec/meeting/in-meeting-actions.ts +82 -3
- package/test/unit/spec/meeting/index.js +4569 -1773
- package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
- package/test/unit/spec/meeting/muteState.js +382 -211
- package/test/unit/spec/meeting/request.js +444 -78
- package/test/unit/spec/meeting/utils.js +517 -192
- package/test/unit/spec/meeting-info/index.js +181 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +481 -76
- package/test/unit/spec/meeting-info/request.js +7 -9
- package/test/unit/spec/meeting-info/util.js +11 -12
- package/test/unit/spec/meeting-info/utilv2.js +131 -74
- package/test/unit/spec/meetings/collection.js +15 -1
- package/test/unit/spec/meetings/index.js +1254 -330
- package/test/unit/spec/meetings/utils.js +220 -14
- package/test/unit/spec/member/index.js +58 -5
- package/test/unit/spec/member/util.js +494 -26
- package/test/unit/spec/members/index.js +423 -55
- package/test/unit/spec/members/request.js +228 -40
- package/test/unit/spec/members/utils.js +191 -4
- package/test/unit/spec/metrics/index.js +12 -66
- package/test/unit/spec/multistream/mediaRequestManager.ts +1013 -106
- package/test/unit/spec/multistream/receiveSlot.ts +77 -18
- package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
- package/test/unit/spec/multistream/remoteMedia.ts +40 -2
- package/test/unit/spec/multistream/remoteMediaGroup.ts +271 -5
- package/test/unit/spec/multistream/remoteMediaManager.ts +730 -65
- package/test/unit/spec/networkQualityMonitor/index.js +24 -18
- package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
- package/test/unit/spec/reachability/index.ts +176 -27
- package/test/unit/spec/reachability/request.js +66 -0
- package/test/unit/spec/reconnection-manager/index.js +155 -9
- package/test/unit/spec/recording-controller/index.js +307 -0
- package/test/unit/spec/recording-controller/util.js +229 -0
- package/test/unit/spec/roap/index.ts +28 -52
- package/test/unit/spec/roap/request.ts +225 -0
- package/test/unit/spec/roap/turnDiscovery.ts +92 -50
- package/test/unit/spec/rtcMetrics/index.ts +60 -0
- package/test/unit/spec/stats-analyzer/index.js +116 -60
- package/test/utils/cmr.js +44 -42
- package/test/utils/constants.js +9 -0
- package/test/utils/integrationTestUtils.js +46 -0
- package/test/utils/testUtils.js +63 -99
- package/test/utils/webex-config.js +22 -18
- package/test/utils/webex-test-users.js +57 -50
- package/tsconfig.json +6 -0
- package/dist/media/internal-media-core-wrapper.js +0 -22
- package/dist/media/internal-media-core-wrapper.js.map +0 -1
- package/dist/meeting/effectsState.js +0 -327
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/metrics/config.js +0 -301
- package/dist/metrics/config.js.map +0 -1
- package/dist/multistream/multistreamMedia.js +0 -116
- package/dist/multistream/multistreamMedia.js.map +0 -1
- package/dist/peer-connection-manager/util.js +0 -124
- package/dist/peer-connection-manager/util.js.map +0 -1
- package/src/common/logs/logger-proxy.js +0 -33
- package/src/index.js +0 -15
- package/src/locus-info/controlsUtils.js +0 -102
- package/src/media/index.js +0 -459
- package/src/media/internal-media-core-wrapper.ts +0 -9
- package/src/mediaQualityMetrics/config.js +0 -382
- package/src/meeting/effectsState.js +0 -205
- package/src/meeting/index.js +0 -6284
- package/src/meeting/muteState.js +0 -318
- package/src/meeting/util.js +0 -506
- package/src/meeting-info/index.js +0 -131
- package/src/meeting-info/meeting-info-v2.js +0 -255
- package/src/meetings/index.js +0 -1015
- package/src/member/util.js +0 -254
- package/src/members/request.js +0 -131
- package/src/members/util.js +0 -258
- package/src/metrics/config.js +0 -324
- package/src/metrics/index.js +0 -530
- package/src/multistream/multistreamMedia.ts +0 -92
- package/src/peer-connection-manager/util.ts +0 -117
- package/src/roap/request.js +0 -127
- package/src/statsAnalyzer/global.js +0 -133
- package/src/statsAnalyzer/index.js +0 -1006
- package/src/statsAnalyzer/mqaUtil.js +0 -173
- package/test/unit/spec/meeting/effectsState.js +0 -291
- package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
- /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
|
@@ -2,27 +2,48 @@ import {MediaRequestManager} from '@webex/plugin-meetings/src/multistream/mediaR
|
|
|
2
2
|
import {ReceiveSlot} from '@webex/plugin-meetings/src/multistream/receiveSlot';
|
|
3
3
|
import sinon from 'sinon';
|
|
4
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';
|
|
5
9
|
|
|
6
10
|
type ExpectedActiveSpeaker = {
|
|
7
11
|
policy: 'active-speaker';
|
|
12
|
+
maxPayloadBitsPerSecond?: number;
|
|
8
13
|
priority: number;
|
|
9
14
|
receiveSlots: Array<ReceiveSlot>;
|
|
15
|
+
maxFs?: number;
|
|
16
|
+
maxMbps?: number;
|
|
10
17
|
};
|
|
11
18
|
type ExpectedReceiverSelected = {
|
|
12
19
|
policy: 'receiver-selected';
|
|
20
|
+
maxPayloadBitsPerSecond?: number;
|
|
13
21
|
csi: number;
|
|
14
22
|
receiveSlot: ReceiveSlot;
|
|
23
|
+
maxFs?: number;
|
|
24
|
+
maxMbps?: number;
|
|
15
25
|
};
|
|
16
26
|
type ExpectedRequest = ExpectedActiveSpeaker | ExpectedReceiverSelected;
|
|
17
27
|
|
|
28
|
+
const degradationPreferences = {
|
|
29
|
+
maxMacroblocksLimit: Infinity, // no limit
|
|
30
|
+
};
|
|
31
|
+
|
|
18
32
|
describe('MediaRequestManager', () => {
|
|
19
33
|
const CROSS_PRIORITY_DUPLICATION = true;
|
|
20
34
|
const CROSS_POLICY_DUPLICATION = true;
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
const
|
|
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;
|
|
24
45
|
|
|
25
|
-
const NUM_SLOTS =
|
|
46
|
+
const NUM_SLOTS = 15;
|
|
26
47
|
|
|
27
48
|
let mediaRequestManager: MediaRequestManager;
|
|
28
49
|
let sendMediaRequestsCallback;
|
|
@@ -31,7 +52,11 @@ describe('MediaRequestManager', () => {
|
|
|
31
52
|
|
|
32
53
|
beforeEach(() => {
|
|
33
54
|
sendMediaRequestsCallback = sinon.stub();
|
|
34
|
-
mediaRequestManager = new MediaRequestManager(sendMediaRequestsCallback
|
|
55
|
+
mediaRequestManager = new MediaRequestManager(sendMediaRequestsCallback, {
|
|
56
|
+
degradationPreferences,
|
|
57
|
+
kind: 'video',
|
|
58
|
+
trimRequestsToNumOfSources: false,
|
|
59
|
+
});
|
|
35
60
|
|
|
36
61
|
// create some fake receive slots used by the tests
|
|
37
62
|
fakeWcmeSlots = Array(NUM_SLOTS)
|
|
@@ -46,14 +71,16 @@ describe('MediaRequestManager', () => {
|
|
|
46
71
|
(_, index) =>
|
|
47
72
|
({
|
|
48
73
|
id: `fake receive slot ${index}`,
|
|
74
|
+
on: sinon.stub(),
|
|
75
|
+
off: sinon.stub(),
|
|
76
|
+
sourceState: 'live',
|
|
49
77
|
wcmeReceiveSlot: fakeWcmeSlots[index],
|
|
50
|
-
resetSourceState: sinon.stub(),
|
|
51
78
|
} as unknown as ReceiveSlot)
|
|
52
79
|
);
|
|
53
80
|
});
|
|
54
81
|
|
|
55
82
|
// helper function for adding an active speaker request
|
|
56
|
-
const addActiveSpeakerRequest = (priority, receiveSlots, commit = false) =>
|
|
83
|
+
const addActiveSpeakerRequest = (priority, receiveSlots, maxFs, commit = false, preferLiveVideo = true) =>
|
|
57
84
|
mediaRequestManager.addRequest(
|
|
58
85
|
{
|
|
59
86
|
policyInfo: {
|
|
@@ -61,19 +88,19 @@ describe('MediaRequestManager', () => {
|
|
|
61
88
|
priority,
|
|
62
89
|
crossPriorityDuplication: CROSS_PRIORITY_DUPLICATION,
|
|
63
90
|
crossPolicyDuplication: CROSS_POLICY_DUPLICATION,
|
|
64
|
-
preferLiveVideo
|
|
91
|
+
preferLiveVideo,
|
|
65
92
|
},
|
|
66
93
|
receiveSlots,
|
|
67
94
|
codecInfo: {
|
|
68
95
|
codec: 'h264',
|
|
69
|
-
maxFs:
|
|
96
|
+
maxFs: maxFs,
|
|
70
97
|
},
|
|
71
98
|
},
|
|
72
99
|
commit
|
|
73
100
|
);
|
|
74
101
|
|
|
75
102
|
// helper function for adding a receiver selected request
|
|
76
|
-
const addReceiverSelectedRequest = (csi, receiveSlot, commit = false) =>
|
|
103
|
+
const addReceiverSelectedRequest = (csi, receiveSlot, maxFs, commit = false) =>
|
|
77
104
|
mediaRequestManager.addRequest(
|
|
78
105
|
{
|
|
79
106
|
policyInfo: {
|
|
@@ -83,7 +110,7 @@ describe('MediaRequestManager', () => {
|
|
|
83
110
|
receiveSlots: [receiveSlot],
|
|
84
111
|
codecInfo: {
|
|
85
112
|
codec: 'h264',
|
|
86
|
-
maxFs:
|
|
113
|
+
maxFs: maxFs,
|
|
87
114
|
},
|
|
88
115
|
},
|
|
89
116
|
commit
|
|
@@ -94,7 +121,12 @@ describe('MediaRequestManager', () => {
|
|
|
94
121
|
// It should be used only for verifying requests created with
|
|
95
122
|
// addActiveSpeakerRequest() or addReceiverSelectedRequest(), because of some
|
|
96
123
|
// hardcoded values used in them
|
|
97
|
-
const checkMediaRequestsSent = (
|
|
124
|
+
const checkMediaRequestsSent = (
|
|
125
|
+
expectedRequests: ExpectedRequest[], {
|
|
126
|
+
isCodecInfoDefined = true,
|
|
127
|
+
preferLiveVideo = true,
|
|
128
|
+
} = {}
|
|
129
|
+
) => {
|
|
98
130
|
assert.calledOnce(sendMediaRequestsCallback);
|
|
99
131
|
assert.calledWith(
|
|
100
132
|
sendMediaRequestsCallback,
|
|
@@ -106,17 +138,21 @@ describe('MediaRequestManager', () => {
|
|
|
106
138
|
priority: expectedRequest.priority,
|
|
107
139
|
crossPriorityDuplication: CROSS_PRIORITY_DUPLICATION,
|
|
108
140
|
crossPolicyDuplication: CROSS_POLICY_DUPLICATION,
|
|
109
|
-
preferLiveVideo
|
|
141
|
+
preferLiveVideo,
|
|
110
142
|
}),
|
|
111
143
|
receiveSlots: expectedRequest.receiveSlots,
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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
|
+
: [],
|
|
120
156
|
});
|
|
121
157
|
}
|
|
122
158
|
if (expectedRequest.policy === 'receiver-selected') {
|
|
@@ -126,14 +162,18 @@ describe('MediaRequestManager', () => {
|
|
|
126
162
|
csi: expectedRequest.csi,
|
|
127
163
|
}),
|
|
128
164
|
receiveSlots: [expectedRequest.receiveSlot],
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
+
: [],
|
|
137
177
|
});
|
|
138
178
|
}
|
|
139
179
|
|
|
@@ -167,8 +207,8 @@ describe('MediaRequestManager', () => {
|
|
|
167
207
|
receiveSlots: [fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
|
|
168
208
|
codecInfo: {
|
|
169
209
|
codec: 'h264',
|
|
170
|
-
maxFs:
|
|
171
|
-
maxFps:
|
|
210
|
+
maxFs: MAX_FS_360p,
|
|
211
|
+
maxFps: MAX_FPS,
|
|
172
212
|
},
|
|
173
213
|
},
|
|
174
214
|
false
|
|
@@ -182,9 +222,9 @@ describe('MediaRequestManager', () => {
|
|
|
182
222
|
receiveSlots: [fakeReceiveSlots[3]],
|
|
183
223
|
codecInfo: {
|
|
184
224
|
codec: 'h264',
|
|
185
|
-
maxFs:
|
|
186
|
-
maxFps:
|
|
187
|
-
maxMbps:
|
|
225
|
+
maxFs: MAX_FS_720p,
|
|
226
|
+
maxFps: MAX_FPS,
|
|
227
|
+
maxMbps: MAX_MBPS_720p,
|
|
188
228
|
},
|
|
189
229
|
},
|
|
190
230
|
false
|
|
@@ -200,9 +240,9 @@ describe('MediaRequestManager', () => {
|
|
|
200
240
|
receiveSlots: [fakeReceiveSlots[4]],
|
|
201
241
|
codecInfo: {
|
|
202
242
|
codec: 'h264',
|
|
203
|
-
maxFs:
|
|
204
|
-
maxFps:
|
|
205
|
-
maxMbps:
|
|
243
|
+
maxFs: MAX_FS_1080p,
|
|
244
|
+
maxFps: MAX_FPS,
|
|
245
|
+
maxMbps: MAX_MBPS_1080p,
|
|
206
246
|
},
|
|
207
247
|
},
|
|
208
248
|
true
|
|
@@ -220,13 +260,14 @@ describe('MediaRequestManager', () => {
|
|
|
220
260
|
preferLiveVideo: false,
|
|
221
261
|
}),
|
|
222
262
|
receiveSlots: [fakeWcmeSlots[0], fakeWcmeSlots[1], fakeWcmeSlots[2]],
|
|
263
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_360p,
|
|
223
264
|
codecInfos: [
|
|
224
265
|
sinon.match({
|
|
225
266
|
payloadType: 0x80,
|
|
226
267
|
h264: sinon.match({
|
|
227
|
-
maxFs:
|
|
228
|
-
maxFps:
|
|
229
|
-
maxMbps:
|
|
268
|
+
maxFs: MAX_FS_360p,
|
|
269
|
+
maxFps: MAX_FPS,
|
|
270
|
+
maxMbps: MAX_MBPS_360p,
|
|
230
271
|
}),
|
|
231
272
|
}),
|
|
232
273
|
],
|
|
@@ -237,13 +278,14 @@ describe('MediaRequestManager', () => {
|
|
|
237
278
|
csi: 123,
|
|
238
279
|
}),
|
|
239
280
|
receiveSlots: [fakeWcmeSlots[3]],
|
|
281
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
240
282
|
codecInfos: [
|
|
241
283
|
sinon.match({
|
|
242
284
|
payloadType: 0x80,
|
|
243
285
|
h264: sinon.match({
|
|
244
|
-
maxFs:
|
|
245
|
-
maxFps:
|
|
246
|
-
maxMbps:
|
|
286
|
+
maxFs: MAX_FS_720p,
|
|
287
|
+
maxFps: MAX_FPS,
|
|
288
|
+
maxMbps: MAX_MBPS_720p,
|
|
247
289
|
}),
|
|
248
290
|
}),
|
|
249
291
|
],
|
|
@@ -254,13 +296,14 @@ describe('MediaRequestManager', () => {
|
|
|
254
296
|
csi: 123,
|
|
255
297
|
}),
|
|
256
298
|
receiveSlots: [fakeWcmeSlots[4]],
|
|
299
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_1080p,
|
|
257
300
|
codecInfos: [
|
|
258
301
|
sinon.match({
|
|
259
302
|
payloadType: 0x80,
|
|
260
303
|
h264: sinon.match({
|
|
261
|
-
maxFs:
|
|
262
|
-
maxFps:
|
|
263
|
-
maxMbps:
|
|
304
|
+
maxFs: MAX_FS_1080p,
|
|
305
|
+
maxFps: MAX_FPS,
|
|
306
|
+
maxMbps: MAX_MBPS_1080p,
|
|
264
307
|
}),
|
|
265
308
|
}),
|
|
266
309
|
],
|
|
@@ -270,44 +313,103 @@ describe('MediaRequestManager', () => {
|
|
|
270
313
|
|
|
271
314
|
it('keeps adding requests with every call to addRequest()', () => {
|
|
272
315
|
// start with 1 request
|
|
273
|
-
addReceiverSelectedRequest(100, fakeReceiveSlots[0], true);
|
|
316
|
+
addReceiverSelectedRequest(100, fakeReceiveSlots[0], MAX_FS_1080p, true);
|
|
274
317
|
|
|
275
318
|
checkMediaRequestsSent([
|
|
276
|
-
{
|
|
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
|
+
},
|
|
277
327
|
]);
|
|
278
328
|
|
|
279
329
|
// now add another one
|
|
280
|
-
addReceiverSelectedRequest(101, fakeReceiveSlots[1], true);
|
|
330
|
+
addReceiverSelectedRequest(101, fakeReceiveSlots[1], MAX_FS_1080p, true);
|
|
281
331
|
|
|
282
332
|
checkMediaRequestsSent([
|
|
283
|
-
{
|
|
284
|
-
|
|
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
|
+
},
|
|
285
349
|
]);
|
|
286
350
|
|
|
287
351
|
// and one more
|
|
288
352
|
addActiveSpeakerRequest(
|
|
289
353
|
1,
|
|
290
354
|
[fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
|
|
355
|
+
MAX_FS_720p,
|
|
291
356
|
true
|
|
292
357
|
);
|
|
293
358
|
|
|
294
359
|
checkMediaRequestsSent([
|
|
295
|
-
{
|
|
296
|
-
|
|
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
|
+
},
|
|
297
376
|
{
|
|
298
377
|
policy: 'active-speaker',
|
|
299
378
|
priority: 1,
|
|
300
379
|
receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
|
|
380
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
381
|
+
maxFs: MAX_FS_720p,
|
|
382
|
+
maxMbps: MAX_MBPS_720p,
|
|
301
383
|
},
|
|
302
384
|
]);
|
|
303
385
|
});
|
|
304
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
|
+
|
|
305
407
|
it('cancels the requests correctly when cancelRequest() is called with commit=true', () => {
|
|
306
408
|
const requestIds = [
|
|
307
|
-
addActiveSpeakerRequest(255, [fakeReceiveSlots[0], fakeReceiveSlots[1]]),
|
|
308
|
-
addActiveSpeakerRequest(255, [fakeReceiveSlots[2], fakeReceiveSlots[3]]),
|
|
309
|
-
addReceiverSelectedRequest(100, fakeReceiveSlots[4]),
|
|
310
|
-
addReceiverSelectedRequest(200, fakeReceiveSlots[5]),
|
|
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),
|
|
311
413
|
];
|
|
312
414
|
|
|
313
415
|
// cancel one of the active speaker requests
|
|
@@ -315,9 +417,30 @@ describe('MediaRequestManager', () => {
|
|
|
315
417
|
|
|
316
418
|
// expect only the 3 remaining requests to be sent out
|
|
317
419
|
checkMediaRequestsSent([
|
|
318
|
-
{
|
|
319
|
-
|
|
320
|
-
|
|
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
|
+
},
|
|
321
444
|
]);
|
|
322
445
|
|
|
323
446
|
// cancel one of the receiver selected requests
|
|
@@ -325,8 +448,22 @@ describe('MediaRequestManager', () => {
|
|
|
325
448
|
|
|
326
449
|
// expect only the 2 remaining requests to be sent out
|
|
327
450
|
checkMediaRequestsSent([
|
|
328
|
-
{
|
|
329
|
-
|
|
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
|
+
},
|
|
330
467
|
]);
|
|
331
468
|
});
|
|
332
469
|
|
|
@@ -334,9 +471,10 @@ describe('MediaRequestManager', () => {
|
|
|
334
471
|
addActiveSpeakerRequest(
|
|
335
472
|
10,
|
|
336
473
|
[fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
|
|
474
|
+
MAX_FS_720p,
|
|
337
475
|
false
|
|
338
476
|
);
|
|
339
|
-
addReceiverSelectedRequest(123, fakeReceiveSlots[3], false);
|
|
477
|
+
addReceiverSelectedRequest(123, fakeReceiveSlots[3], MAX_FS_1080p, false);
|
|
340
478
|
|
|
341
479
|
// nothing should be sent out as we didn't commit the requests
|
|
342
480
|
assert.notCalled(sendMediaRequestsCallback);
|
|
@@ -350,8 +488,18 @@ describe('MediaRequestManager', () => {
|
|
|
350
488
|
policy: 'active-speaker',
|
|
351
489
|
priority: 10,
|
|
352
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,
|
|
353
502
|
},
|
|
354
|
-
{policy: 'receiver-selected', csi: 123, receiveSlot: fakeWcmeSlots[3]},
|
|
355
503
|
]);
|
|
356
504
|
});
|
|
357
505
|
|
|
@@ -361,11 +509,12 @@ describe('MediaRequestManager', () => {
|
|
|
361
509
|
addActiveSpeakerRequest(
|
|
362
510
|
250,
|
|
363
511
|
[fakeReceiveSlots[0], fakeReceiveSlots[1], fakeReceiveSlots[2]],
|
|
512
|
+
MAX_FS_720p,
|
|
364
513
|
false
|
|
365
514
|
),
|
|
366
|
-
addReceiverSelectedRequest(98765, fakeReceiveSlots[3], false),
|
|
367
|
-
addReceiverSelectedRequest(99999, fakeReceiveSlots[4], false),
|
|
368
|
-
addReceiverSelectedRequest(88888, fakeReceiveSlots[5], true),
|
|
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),
|
|
369
518
|
];
|
|
370
519
|
|
|
371
520
|
checkMediaRequestsSent([
|
|
@@ -373,10 +522,34 @@ describe('MediaRequestManager', () => {
|
|
|
373
522
|
policy: 'active-speaker',
|
|
374
523
|
priority: 250,
|
|
375
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,
|
|
376
552
|
},
|
|
377
|
-
{policy: 'receiver-selected', csi: 98765, receiveSlot: fakeWcmeSlots[3]},
|
|
378
|
-
{policy: 'receiver-selected', csi: 99999, receiveSlot: fakeWcmeSlots[4]},
|
|
379
|
-
{policy: 'receiver-selected', csi: 88888, receiveSlot: fakeWcmeSlots[5]},
|
|
380
553
|
]);
|
|
381
554
|
|
|
382
555
|
// now cancel 3 of them, but with commit=false => nothing should happen
|
|
@@ -390,22 +563,31 @@ describe('MediaRequestManager', () => {
|
|
|
390
563
|
mediaRequestManager.commit();
|
|
391
564
|
|
|
392
565
|
checkMediaRequestsSent([
|
|
393
|
-
{
|
|
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
|
+
},
|
|
394
574
|
]);
|
|
395
575
|
});
|
|
396
576
|
|
|
397
577
|
it('sends the wcme media requests when commit() is called', () => {
|
|
398
578
|
// send some requests, all of them with commit=false
|
|
399
|
-
addReceiverSelectedRequest(123000, fakeReceiveSlots[0], false);
|
|
400
|
-
addReceiverSelectedRequest(456000, fakeReceiveSlots[1], false);
|
|
579
|
+
addReceiverSelectedRequest(123000, fakeReceiveSlots[0], MAX_FS_1080p, false);
|
|
580
|
+
addReceiverSelectedRequest(456000, fakeReceiveSlots[1], MAX_FS_1080p, false);
|
|
401
581
|
addActiveSpeakerRequest(
|
|
402
582
|
255,
|
|
403
583
|
[fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
|
|
584
|
+
MAX_FS_720p,
|
|
404
585
|
false
|
|
405
586
|
);
|
|
406
587
|
addActiveSpeakerRequest(
|
|
407
588
|
254,
|
|
408
589
|
[fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
|
|
590
|
+
MAX_FS_720p,
|
|
409
591
|
false
|
|
410
592
|
);
|
|
411
593
|
|
|
@@ -417,56 +599,103 @@ describe('MediaRequestManager', () => {
|
|
|
417
599
|
|
|
418
600
|
// check that all requests have been sent out
|
|
419
601
|
checkMediaRequestsSent([
|
|
420
|
-
{
|
|
421
|
-
|
|
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
|
+
},
|
|
422
618
|
{
|
|
423
619
|
policy: 'active-speaker',
|
|
424
620
|
priority: 255,
|
|
425
621
|
receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
|
|
622
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
623
|
+
maxFs: MAX_FS_720p,
|
|
624
|
+
maxMbps: MAX_MBPS_720p,
|
|
426
625
|
},
|
|
427
626
|
{
|
|
428
627
|
policy: 'active-speaker',
|
|
429
628
|
priority: 254,
|
|
430
629
|
receiveSlots: [fakeWcmeSlots[5], fakeWcmeSlots[6], fakeWcmeSlots[7]],
|
|
630
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
631
|
+
maxFs: MAX_FS_720p,
|
|
632
|
+
maxMbps: MAX_MBPS_720p,
|
|
431
633
|
},
|
|
432
634
|
]);
|
|
433
635
|
});
|
|
434
636
|
|
|
435
|
-
it('clears all the requests on reset()', () => {
|
|
637
|
+
it('avoids sending duplicate requests and clears all the requests on reset()', () => {
|
|
436
638
|
// send some requests and commit them one by one
|
|
437
|
-
addReceiverSelectedRequest(1500, fakeReceiveSlots[0],
|
|
438
|
-
addReceiverSelectedRequest(1501, fakeReceiveSlots[1],
|
|
639
|
+
addReceiverSelectedRequest(1500, fakeReceiveSlots[0], MAX_FS_1080p, false);
|
|
640
|
+
addReceiverSelectedRequest(1501, fakeReceiveSlots[1], MAX_FS_1080p, false);
|
|
439
641
|
addActiveSpeakerRequest(
|
|
440
642
|
255,
|
|
441
643
|
[fakeReceiveSlots[2], fakeReceiveSlots[3], fakeReceiveSlots[4]],
|
|
442
|
-
|
|
644
|
+
MAX_FS_720p,
|
|
645
|
+
false
|
|
443
646
|
);
|
|
444
647
|
addActiveSpeakerRequest(
|
|
445
648
|
254,
|
|
446
649
|
[fakeReceiveSlots[5], fakeReceiveSlots[6], fakeReceiveSlots[7]],
|
|
447
|
-
|
|
650
|
+
MAX_FS_720p,
|
|
651
|
+
false
|
|
448
652
|
);
|
|
449
653
|
|
|
450
|
-
|
|
654
|
+
// nothing should be sent out as we didn't commit the requests
|
|
655
|
+
assert.notCalled(sendMediaRequestsCallback);
|
|
451
656
|
|
|
452
|
-
// check that when calling commit() all requests are re-sent again
|
|
453
657
|
mediaRequestManager.commit();
|
|
454
|
-
|
|
455
658
|
checkMediaRequestsSent([
|
|
456
|
-
{
|
|
457
|
-
|
|
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
|
+
},
|
|
458
675
|
{
|
|
459
676
|
policy: 'active-speaker',
|
|
460
677
|
priority: 255,
|
|
461
678
|
receiveSlots: [fakeWcmeSlots[2], fakeWcmeSlots[3], fakeWcmeSlots[4]],
|
|
679
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
680
|
+
maxFs: MAX_FS_720p,
|
|
681
|
+
maxMbps: MAX_MBPS_720p,
|
|
462
682
|
},
|
|
463
683
|
{
|
|
464
684
|
policy: 'active-speaker',
|
|
465
685
|
priority: 254,
|
|
466
686
|
receiveSlots: [fakeWcmeSlots[5], fakeWcmeSlots[6], fakeWcmeSlots[7]],
|
|
687
|
+
maxPayloadBitsPerSecond: MAX_PAYLOADBITSPS_720p,
|
|
688
|
+
maxFs: MAX_FS_720p,
|
|
689
|
+
maxMbps: MAX_MBPS_720p,
|
|
467
690
|
},
|
|
468
691
|
]);
|
|
469
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
|
+
|
|
470
699
|
// now reset everything
|
|
471
700
|
mediaRequestManager.reset();
|
|
472
701
|
|
|
@@ -475,37 +704,715 @@ describe('MediaRequestManager', () => {
|
|
|
475
704
|
checkMediaRequestsSent([]);
|
|
476
705
|
});
|
|
477
706
|
|
|
478
|
-
it('
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
addReceiverSelectedRequest(100, fakeReceiveSlots[4]),
|
|
483
|
-
addReceiverSelectedRequest(200, fakeReceiveSlots[5]),
|
|
484
|
-
];
|
|
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);
|
|
485
711
|
|
|
486
712
|
mediaRequestManager.commit();
|
|
487
713
|
checkMediaRequestsSent([
|
|
488
|
-
{
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
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
|
+
},
|
|
492
722
|
]);
|
|
493
723
|
|
|
494
|
-
//
|
|
495
|
-
mediaRequestManager.
|
|
496
|
-
mediaRequestManager.cancelRequest(requestIds[3], false);
|
|
724
|
+
// now reset everything
|
|
725
|
+
mediaRequestManager.reset();
|
|
497
726
|
|
|
727
|
+
// calling commit now should not cause any requests to be sent out
|
|
498
728
|
mediaRequestManager.commit();
|
|
729
|
+
checkMediaRequestsSent([]);
|
|
499
730
|
|
|
500
|
-
//
|
|
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
|
|
501
899
|
checkMediaRequestsSent([
|
|
502
|
-
{
|
|
503
|
-
|
|
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
|
+
},
|
|
504
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];
|
|
505
931
|
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
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
|
+
]);
|
|
510
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
|
+
})
|
|
511
1414
|
});
|
|
1415
|
+
function assertEqual(arg0: any, arg1: string) {
|
|
1416
|
+
throw new Error('Function not implemented.');
|
|
1417
|
+
}
|
|
1418
|
+
|