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