@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
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
/* eslint-disable valid-jsdoc */
|
|
2
|
+
import {cloneDeep, forEach, remove} from 'lodash';
|
|
2
3
|
import {EventMap} from 'typed-emitter';
|
|
3
|
-
import {
|
|
4
|
+
import {MediaType} from '@webex/internal-media-core';
|
|
5
|
+
import {NamedMediaGroup} from '@webex/json-multistream';
|
|
4
6
|
|
|
5
7
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
6
8
|
import EventsScope from '../common/events/events-scope';
|
|
@@ -10,6 +12,7 @@ import {ReceiveSlot, CSI} from './receiveSlot';
|
|
|
10
12
|
import {ReceiveSlotManager} from './receiveSlotManager';
|
|
11
13
|
import {RemoteMediaGroup} from './remoteMediaGroup';
|
|
12
14
|
import {MediaRequestManager} from './mediaRequestManager';
|
|
15
|
+
import {NAMED_MEDIA_GROUP_TYPE_AUDIO} from '../constants';
|
|
13
16
|
|
|
14
17
|
export type PaneSize = RemoteVideoResolution;
|
|
15
18
|
export type LayoutId = string;
|
|
@@ -30,8 +33,8 @@ export interface MemberVideoPane {
|
|
|
30
33
|
}
|
|
31
34
|
|
|
32
35
|
export interface VideoLayout {
|
|
33
|
-
screenShareVideo
|
|
34
|
-
size: PaneSize
|
|
36
|
+
screenShareVideo?: {
|
|
37
|
+
size: PaneSize;
|
|
35
38
|
};
|
|
36
39
|
activeSpeakerVideoPaneGroups?: ActiveSpeakerVideoPaneGroup[]; // list of active speaker video pane groups
|
|
37
40
|
memberVideoPanes?: MemberVideoPane[]; // list of video panes for specific members, CSI values can be changed later via setVideoPaneCsi()
|
|
@@ -40,6 +43,7 @@ export interface VideoLayout {
|
|
|
40
43
|
export interface Configuration {
|
|
41
44
|
audio: {
|
|
42
45
|
numOfActiveSpeakerStreams: number; // number of audio streams we want to receive
|
|
46
|
+
numOfScreenShareStreams: number; // 1 should be enough, because in webex only 1 person at a time can be presenting screen share
|
|
43
47
|
};
|
|
44
48
|
video: {
|
|
45
49
|
preferLiveVideo: boolean; // applies to all pane groups with active speaker policy
|
|
@@ -47,17 +51,13 @@ export interface Configuration {
|
|
|
47
51
|
|
|
48
52
|
layouts: {[key: LayoutId]: VideoLayout}; // a map of all available layouts, a layout can be set via setLayout() method
|
|
49
53
|
};
|
|
50
|
-
|
|
51
|
-
audio: boolean; // whether we ever want to receive screen share audio at all
|
|
52
|
-
video: boolean; // whether we ever want to receive screen share video at all
|
|
53
|
-
};
|
|
54
|
+
namedMediaGroup?: NamedMediaGroup;
|
|
54
55
|
}
|
|
55
56
|
|
|
56
57
|
/* Predefined layouts: */
|
|
57
58
|
|
|
58
59
|
// An "all equal" grid, with size up to 3 x 3 = 9:
|
|
59
60
|
const AllEqualLayout: VideoLayout = {
|
|
60
|
-
screenShareVideo: {size: null},
|
|
61
61
|
activeSpeakerVideoPaneGroups: [
|
|
62
62
|
{
|
|
63
63
|
id: 'main',
|
|
@@ -70,7 +70,6 @@ const AllEqualLayout: VideoLayout = {
|
|
|
70
70
|
|
|
71
71
|
// A layout with just a single remote active speaker video pane:
|
|
72
72
|
const SingleLayout: VideoLayout = {
|
|
73
|
-
screenShareVideo: {size: null},
|
|
74
73
|
activeSpeakerVideoPaneGroups: [
|
|
75
74
|
{
|
|
76
75
|
id: 'main',
|
|
@@ -83,7 +82,6 @@ const SingleLayout: VideoLayout = {
|
|
|
83
82
|
|
|
84
83
|
// A layout with 1 big pane for the highest priority active speaker and 5 small panes for other active speakers:
|
|
85
84
|
const OnePlusFiveLayout: VideoLayout = {
|
|
86
|
-
screenShareVideo: {size: null},
|
|
87
85
|
activeSpeakerVideoPaneGroups: [
|
|
88
86
|
{
|
|
89
87
|
id: 'mainBigOne',
|
|
@@ -101,8 +99,8 @@ const OnePlusFiveLayout: VideoLayout = {
|
|
|
101
99
|
};
|
|
102
100
|
|
|
103
101
|
// A layout with 2 big panes for 2 main active speakers and a strip of 6 small panes for other active speakers:
|
|
102
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
104
103
|
const TwoMainPlusSixSmallLayout: VideoLayout = {
|
|
105
|
-
screenShareVideo: {size: null},
|
|
106
104
|
activeSpeakerVideoPaneGroups: [
|
|
107
105
|
{
|
|
108
106
|
id: 'mainGroupWith2BigPanes',
|
|
@@ -134,7 +132,6 @@ const RemoteScreenShareWithSmallThumbnailsLayout: VideoLayout = {
|
|
|
134
132
|
|
|
135
133
|
// A staged layout with 4 pre-selected meeting participants in the main 2x2 grid and 6 small panes for other active speakers at the top:
|
|
136
134
|
const Stage2x2With6ThumbnailsLayout: VideoLayout = {
|
|
137
|
-
screenShareVideo: {size: null},
|
|
138
135
|
activeSpeakerVideoPaneGroups: [
|
|
139
136
|
{
|
|
140
137
|
id: 'thumbnails',
|
|
@@ -160,6 +157,7 @@ const Stage2x2With6ThumbnailsLayout: VideoLayout = {
|
|
|
160
157
|
export const DefaultConfiguration: Configuration = {
|
|
161
158
|
audio: {
|
|
162
159
|
numOfActiveSpeakerStreams: 3,
|
|
160
|
+
numOfScreenShareStreams: 1,
|
|
163
161
|
},
|
|
164
162
|
video: {
|
|
165
163
|
preferLiveVideo: true,
|
|
@@ -173,16 +171,13 @@ export const DefaultConfiguration: Configuration = {
|
|
|
173
171
|
ScreenShareView: RemoteScreenShareWithSmallThumbnailsLayout,
|
|
174
172
|
},
|
|
175
173
|
},
|
|
176
|
-
screenShare: {
|
|
177
|
-
audio: true,
|
|
178
|
-
video: true,
|
|
179
|
-
},
|
|
180
174
|
};
|
|
181
175
|
|
|
182
176
|
export enum Event {
|
|
183
177
|
// events for audio streams
|
|
184
178
|
AudioCreated = 'AudioCreated',
|
|
185
|
-
|
|
179
|
+
InterpretationAudioCreated = 'InterpretationAudioCreated',
|
|
180
|
+
ScreenShareAudioCreated = 'ScreenShareAudioCreated',
|
|
186
181
|
|
|
187
182
|
// events for video streams
|
|
188
183
|
VideoLayoutChanged = 'VideoLayoutChanged',
|
|
@@ -199,7 +194,7 @@ export interface VideoLayoutChangedEventData {
|
|
|
199
194
|
export interface Events extends EventMap {
|
|
200
195
|
// audio
|
|
201
196
|
[Event.AudioCreated]: (audio: RemoteMediaGroup) => void;
|
|
202
|
-
[Event.ScreenShareAudioCreated]: (screenShareAudio:
|
|
197
|
+
[Event.ScreenShareAudioCreated]: (screenShareAudio: RemoteMediaGroup) => void;
|
|
203
198
|
|
|
204
199
|
// video
|
|
205
200
|
[Event.VideoLayoutChanged]: (data: VideoLayoutChangedEventData) => void;
|
|
@@ -223,14 +218,21 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
223
218
|
private mediaRequestManagers: {
|
|
224
219
|
audio: MediaRequestManager;
|
|
225
220
|
video: MediaRequestManager;
|
|
221
|
+
screenShareAudio: MediaRequestManager;
|
|
222
|
+
screenShareVideo: MediaRequestManager;
|
|
226
223
|
};
|
|
227
224
|
|
|
228
225
|
private currentLayout?: VideoLayout;
|
|
229
226
|
|
|
230
227
|
private slots: {
|
|
231
|
-
audio:
|
|
232
|
-
|
|
233
|
-
|
|
228
|
+
audio: {
|
|
229
|
+
main: ReceiveSlot[];
|
|
230
|
+
si: ReceiveSlot;
|
|
231
|
+
};
|
|
232
|
+
screenShare: {
|
|
233
|
+
audio: ReceiveSlot[];
|
|
234
|
+
video?: ReceiveSlot;
|
|
235
|
+
};
|
|
234
236
|
video: {
|
|
235
237
|
unused: ReceiveSlot[];
|
|
236
238
|
activeSpeaker: ReceiveSlot[];
|
|
@@ -239,13 +241,20 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
239
241
|
};
|
|
240
242
|
|
|
241
243
|
private media: {
|
|
242
|
-
audio
|
|
244
|
+
audio: {
|
|
245
|
+
main?: RemoteMediaGroup;
|
|
246
|
+
si?: RemoteMediaGroup;
|
|
247
|
+
};
|
|
243
248
|
video: {
|
|
244
249
|
activeSpeakerGroups: {
|
|
245
250
|
[key: PaneGroupId]: RemoteMediaGroup;
|
|
246
251
|
};
|
|
247
252
|
memberPanes: {[key: PaneId]: RemoteMedia};
|
|
248
253
|
};
|
|
254
|
+
screenShare: {
|
|
255
|
+
audio?: RemoteMediaGroup;
|
|
256
|
+
video?: RemoteMediaGroup;
|
|
257
|
+
};
|
|
249
258
|
};
|
|
250
259
|
|
|
251
260
|
private receiveSlotAllocations: {
|
|
@@ -267,6 +276,8 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
267
276
|
mediaRequestManagers: {
|
|
268
277
|
audio: MediaRequestManager;
|
|
269
278
|
video: MediaRequestManager;
|
|
279
|
+
screenShareAudio: MediaRequestManager;
|
|
280
|
+
screenShareVideo: MediaRequestManager;
|
|
270
281
|
},
|
|
271
282
|
config: Configuration = DefaultConfiguration
|
|
272
283
|
) {
|
|
@@ -276,19 +287,31 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
276
287
|
this.receiveSlotManager = receiveSlotManager;
|
|
277
288
|
this.mediaRequestManagers = mediaRequestManagers;
|
|
278
289
|
this.media = {
|
|
279
|
-
audio:
|
|
290
|
+
audio: {
|
|
291
|
+
main: undefined,
|
|
292
|
+
si: undefined,
|
|
293
|
+
},
|
|
280
294
|
video: {
|
|
281
295
|
activeSpeakerGroups: {},
|
|
282
296
|
memberPanes: {},
|
|
283
297
|
},
|
|
298
|
+
screenShare: {
|
|
299
|
+
audio: undefined,
|
|
300
|
+
video: undefined,
|
|
301
|
+
},
|
|
284
302
|
};
|
|
285
303
|
|
|
286
304
|
this.checkConfigValidity();
|
|
287
305
|
|
|
288
306
|
this.slots = {
|
|
289
|
-
audio:
|
|
290
|
-
|
|
291
|
-
|
|
307
|
+
audio: {
|
|
308
|
+
main: [],
|
|
309
|
+
si: undefined,
|
|
310
|
+
},
|
|
311
|
+
screenShare: {
|
|
312
|
+
audio: [],
|
|
313
|
+
video: undefined,
|
|
314
|
+
},
|
|
292
315
|
video: {
|
|
293
316
|
unused: [],
|
|
294
317
|
activeSpeaker: [],
|
|
@@ -359,8 +382,8 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
359
382
|
|
|
360
383
|
await this.createAudioMedia();
|
|
361
384
|
|
|
362
|
-
|
|
363
|
-
|
|
385
|
+
await this.createScreenShareReceiveSlots();
|
|
386
|
+
this.createScreenShareAudioMedia();
|
|
364
387
|
|
|
365
388
|
await this.preallocateVideoReceiveSlots();
|
|
366
389
|
|
|
@@ -373,14 +396,30 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
373
396
|
*/
|
|
374
397
|
public stop() {
|
|
375
398
|
// invalidate all remoteMedia objects
|
|
376
|
-
this.invalidateCurrentRemoteMedia({
|
|
399
|
+
this.invalidateCurrentRemoteMedia({
|
|
400
|
+
audio: true,
|
|
401
|
+
video: true,
|
|
402
|
+
screenShareAudio: true,
|
|
403
|
+
screenShareVideo: true,
|
|
404
|
+
commit: true,
|
|
405
|
+
});
|
|
377
406
|
|
|
378
407
|
// release all audio receive slots
|
|
379
|
-
this.slots.audio.forEach((slot) => this.receiveSlotManager.releaseSlot(slot));
|
|
380
|
-
this.slots.audio.length = 0;
|
|
408
|
+
this.slots.audio.main.forEach((slot) => this.receiveSlotManager.releaseSlot(slot));
|
|
409
|
+
this.slots.audio.main.length = 0;
|
|
410
|
+
if (this.slots.audio.si) {
|
|
411
|
+
this.receiveSlotManager.releaseSlot(this.slots.audio.si);
|
|
412
|
+
}
|
|
381
413
|
|
|
382
|
-
//
|
|
414
|
+
// release screen share slots
|
|
415
|
+
this.slots.screenShare.audio.forEach((slot) => this.receiveSlotManager.releaseSlot(slot));
|
|
416
|
+
this.slots.screenShare.audio.length = 0;
|
|
417
|
+
if (this.slots.screenShare.video) {
|
|
418
|
+
this.receiveSlotManager.releaseSlot(this.slots.screenShare.video);
|
|
419
|
+
this.slots.screenShare.video = undefined;
|
|
420
|
+
}
|
|
383
421
|
|
|
422
|
+
// release video slots
|
|
384
423
|
this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};
|
|
385
424
|
|
|
386
425
|
this.slots.video.unused.push(...this.slots.video.activeSpeaker);
|
|
@@ -432,7 +471,8 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
432
471
|
while (this.slots.video.unused.length < maxNumVideoPanesRequired) {
|
|
433
472
|
// eslint-disable-next-line no-await-in-loop
|
|
434
473
|
this.slots.video.unused.push(
|
|
435
|
-
await
|
|
474
|
+
// eslint-disable-next-line no-await-in-loop
|
|
475
|
+
await this.receiveSlotManager.allocateSlot(MediaType.VideoMain)
|
|
436
476
|
);
|
|
437
477
|
}
|
|
438
478
|
}
|
|
@@ -452,11 +492,14 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
452
492
|
if (!this.started) {
|
|
453
493
|
throw new Error('setLayout() called before start()');
|
|
454
494
|
}
|
|
495
|
+
LoggerProxy.logger.log(`RemoteMediaManager#setLayout --> new layout selected: ${layoutId}`);
|
|
496
|
+
|
|
455
497
|
this.currentLayoutId = layoutId;
|
|
456
498
|
this.currentLayout = cloneDeep(this.config.video.layouts[this.currentLayoutId]);
|
|
457
499
|
|
|
458
500
|
await this.updateVideoReceiveSlots();
|
|
459
501
|
this.updateVideoRemoteMediaObjects();
|
|
502
|
+
this.updateScreenShareVideoRemoteMediaObject();
|
|
460
503
|
this.emitVideoLayoutChangedEvent();
|
|
461
504
|
}
|
|
462
505
|
|
|
@@ -469,22 +512,86 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
469
512
|
return this.currentLayoutId;
|
|
470
513
|
}
|
|
471
514
|
|
|
515
|
+
/**
|
|
516
|
+
* sets the preferLiveVideo
|
|
517
|
+
*/
|
|
518
|
+
public setPreferLiveVideo(preferLiveVideo: boolean) {
|
|
519
|
+
LoggerProxy.logger.log(
|
|
520
|
+
`RemoteMediaManager#setPreferLiveVideo --> setPreferLiveVideo is called to set preferLiveVideo to ${preferLiveVideo}`
|
|
521
|
+
);
|
|
522
|
+
this.config.video.preferLiveVideo = preferLiveVideo;
|
|
523
|
+
Object.values(this.media.video.activeSpeakerGroups).forEach((activeSpeakerGroup) => {
|
|
524
|
+
activeSpeakerGroup.setPreferLiveVideo(preferLiveVideo, false);
|
|
525
|
+
});
|
|
526
|
+
this.mediaRequestManagers.video.commit();
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
/**
|
|
530
|
+
* Sets CSIs for multiple RemoteMedia instances belonging to RemoteMediaGroup.
|
|
531
|
+
* For each entry in the remoteMediaCsis array:
|
|
532
|
+
* - if csi is specified, the RemoteMedia instance is pinned to that CSI
|
|
533
|
+
* - if csi is undefined, the RemoteMedia instance is unpinned
|
|
534
|
+
*/
|
|
535
|
+
public setActiveSpeakerCsis(remoteMediaCsis: {remoteMedia: RemoteMedia; csi?: number}[]) {
|
|
536
|
+
Object.values(this.media.video.activeSpeakerGroups).forEach((remoteMediaGroup) => {
|
|
537
|
+
const groupRemoteMediaCsis = remoteMediaCsis.filter(({remoteMedia}) =>
|
|
538
|
+
remoteMediaGroup.includes(remoteMedia)
|
|
539
|
+
);
|
|
540
|
+
if (groupRemoteMediaCsis.length > 0) {
|
|
541
|
+
remoteMediaGroup.setActiveSpeakerCsis(groupRemoteMediaCsis, false);
|
|
542
|
+
}
|
|
543
|
+
});
|
|
544
|
+
this.mediaRequestManagers.video.commit();
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
/**
|
|
548
|
+
* Sets which named media group need receiving
|
|
549
|
+
* @param {MediaType} mediaType of the stream
|
|
550
|
+
* @param {number} languageCode of the stream. If the languageId is 0, the named media group request will be canceled,
|
|
551
|
+
* and only receive the main audio stream.
|
|
552
|
+
* @returns {void}
|
|
553
|
+
*/
|
|
554
|
+
public async setReceiveNamedMediaGroup(mediaType: MediaType, languageId: number) {
|
|
555
|
+
if (mediaType !== MediaType.AudioMain) {
|
|
556
|
+
throw new Error(`cannot set receive named media group which media type is ${mediaType}`);
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
const value = languageId;
|
|
560
|
+
if (value === this.config.namedMediaGroup?.value) {
|
|
561
|
+
return;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
this.config.namedMediaGroup = {
|
|
565
|
+
type: NAMED_MEDIA_GROUP_TYPE_AUDIO,
|
|
566
|
+
value,
|
|
567
|
+
};
|
|
568
|
+
|
|
569
|
+
if (!this.media.audio.si) {
|
|
570
|
+
await this.createInterpretationAudioMedia(true);
|
|
571
|
+
} else {
|
|
572
|
+
this.media.audio.si.setNamedMediaGroup(this.config.namedMediaGroup, true);
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
|
|
472
576
|
/**
|
|
473
577
|
* Creates the audio slots
|
|
474
578
|
*/
|
|
475
579
|
private async createAudioMedia() {
|
|
476
|
-
// create
|
|
580
|
+
// create si audio request
|
|
581
|
+
await this.createInterpretationAudioMedia(false);
|
|
582
|
+
|
|
583
|
+
// create main audio receive slots
|
|
477
584
|
for (let i = 0; i < this.config.audio.numOfActiveSpeakerStreams; i += 1) {
|
|
478
585
|
// eslint-disable-next-line no-await-in-loop
|
|
479
|
-
const slot = await this.receiveSlotManager.allocateSlot(
|
|
586
|
+
const slot = await this.receiveSlotManager.allocateSlot(MediaType.AudioMain);
|
|
480
587
|
|
|
481
|
-
this.slots.audio.push(slot);
|
|
588
|
+
this.slots.audio.main.push(slot);
|
|
482
589
|
}
|
|
483
590
|
|
|
484
|
-
// create a remote media group
|
|
485
|
-
this.media.audio = new RemoteMediaGroup(
|
|
591
|
+
// create a remote media group for main audio
|
|
592
|
+
this.media.audio.main = new RemoteMediaGroup(
|
|
486
593
|
this.mediaRequestManagers.audio,
|
|
487
|
-
this.slots.audio,
|
|
594
|
+
this.slots.audio.main,
|
|
488
595
|
255,
|
|
489
596
|
true
|
|
490
597
|
);
|
|
@@ -492,10 +599,84 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
492
599
|
this.emit(
|
|
493
600
|
{file: 'multistream/remoteMediaManager', function: 'createAudioMedia'},
|
|
494
601
|
Event.AudioCreated,
|
|
495
|
-
this.media.audio
|
|
602
|
+
this.media.audio.main
|
|
496
603
|
);
|
|
497
604
|
}
|
|
498
605
|
|
|
606
|
+
/**
|
|
607
|
+
* Creates the audio slots for named media
|
|
608
|
+
*/
|
|
609
|
+
private async createInterpretationAudioMedia(commitRequest: boolean) {
|
|
610
|
+
// create slot for interpretation language audio
|
|
611
|
+
if (
|
|
612
|
+
this.config.namedMediaGroup?.type === NAMED_MEDIA_GROUP_TYPE_AUDIO &&
|
|
613
|
+
this.config.namedMediaGroup?.value
|
|
614
|
+
) {
|
|
615
|
+
this.slots.audio.si = await this.receiveSlotManager.allocateSlot(MediaType.AudioMain);
|
|
616
|
+
|
|
617
|
+
// create a remote media group for si audio
|
|
618
|
+
this.media.audio.si = new RemoteMediaGroup(
|
|
619
|
+
this.mediaRequestManagers.audio,
|
|
620
|
+
[this.slots.audio.si],
|
|
621
|
+
255,
|
|
622
|
+
commitRequest,
|
|
623
|
+
{
|
|
624
|
+
namedMediaGroup: this.config.namedMediaGroup,
|
|
625
|
+
}
|
|
626
|
+
);
|
|
627
|
+
|
|
628
|
+
this.emit(
|
|
629
|
+
{file: 'multistream/remoteMediaManager', function: 'createInterpretationAudioMedia'},
|
|
630
|
+
Event.InterpretationAudioCreated,
|
|
631
|
+
this.media.audio.si
|
|
632
|
+
);
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
/**
|
|
637
|
+
* Creates receive slots required for receiving screen share audio and video
|
|
638
|
+
*/
|
|
639
|
+
private async createScreenShareReceiveSlots() {
|
|
640
|
+
// audio
|
|
641
|
+
for (let i = 0; i < this.config.audio.numOfScreenShareStreams; i += 1) {
|
|
642
|
+
// eslint-disable-next-line no-await-in-loop
|
|
643
|
+
const slot = await this.receiveSlotManager.allocateSlot(MediaType.AudioSlides);
|
|
644
|
+
|
|
645
|
+
this.slots.screenShare.audio.push(slot);
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
// video
|
|
649
|
+
const isAnyLayoutContainingScreenShareVideo = Object.values(this.config.video.layouts).some(
|
|
650
|
+
(layout) => !!layout.screenShareVideo
|
|
651
|
+
);
|
|
652
|
+
|
|
653
|
+
if (isAnyLayoutContainingScreenShareVideo) {
|
|
654
|
+
this.slots.screenShare.video = await this.receiveSlotManager.allocateSlot(
|
|
655
|
+
MediaType.VideoSlides
|
|
656
|
+
);
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
/**
|
|
661
|
+
* Creates RemoteMedia objects for screen share
|
|
662
|
+
*/
|
|
663
|
+
private createScreenShareAudioMedia() {
|
|
664
|
+
if (this.slots.screenShare.audio.length > 0) {
|
|
665
|
+
this.media.screenShare.audio = new RemoteMediaGroup(
|
|
666
|
+
this.mediaRequestManagers.screenShareAudio,
|
|
667
|
+
this.slots.screenShare.audio,
|
|
668
|
+
255,
|
|
669
|
+
true
|
|
670
|
+
);
|
|
671
|
+
|
|
672
|
+
this.emit(
|
|
673
|
+
{file: 'multistream/remoteMediaManager', function: 'createScreenShareAudioMedia'},
|
|
674
|
+
Event.ScreenShareAudioCreated,
|
|
675
|
+
this.media.screenShare.audio
|
|
676
|
+
);
|
|
677
|
+
}
|
|
678
|
+
}
|
|
679
|
+
|
|
499
680
|
/**
|
|
500
681
|
* Goes over all receiver-selected slots and keeps only the ones that are required by a given layout,
|
|
501
682
|
* the rest are all moved to the "unused" list
|
|
@@ -536,25 +717,37 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
536
717
|
}
|
|
537
718
|
|
|
538
719
|
/**
|
|
539
|
-
* Allocates receive slots to all video panes
|
|
720
|
+
* Allocates receive slots to all active speaker video panes
|
|
721
|
+
* in the current selected layout.
|
|
722
|
+
*
|
|
723
|
+
* Allocation tries to keep the same order of the slots between the previous
|
|
724
|
+
* layout and the new one. Sorting helps making sure that highest priority slots
|
|
725
|
+
* go in the same order in the new layout.
|
|
540
726
|
*/
|
|
541
|
-
private
|
|
542
|
-
this.
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
727
|
+
private allocateSlotsToActiveSpeakerPaneGroups() {
|
|
728
|
+
this.currentLayout?.activeSpeakerVideoPaneGroups
|
|
729
|
+
// sorting in descending order based on group priority
|
|
730
|
+
?.sort((a, b) => (a.priority < b.priority ? 1 : -1))
|
|
731
|
+
?.forEach((group) => {
|
|
732
|
+
this.receiveSlotAllocations.activeSpeaker[group.id] = {slots: []};
|
|
733
|
+
|
|
734
|
+
for (let paneIndex = 0; paneIndex < group.numPanes; paneIndex += 1) {
|
|
735
|
+
// allocate a slot from the "unused" list, by grabbing in same order (shift) as previous layout
|
|
736
|
+
const freeSlot = this.slots.video.unused.shift();
|
|
737
|
+
|
|
738
|
+
if (freeSlot) {
|
|
739
|
+
this.slots.video.activeSpeaker.push(freeSlot);
|
|
740
|
+
this.receiveSlotAllocations.activeSpeaker[group.id].slots.push(freeSlot);
|
|
741
|
+
}
|
|
554
742
|
}
|
|
555
|
-
}
|
|
556
|
-
|
|
743
|
+
});
|
|
744
|
+
}
|
|
557
745
|
|
|
746
|
+
/**
|
|
747
|
+
* Allocates receive slots to all receiver selected video panes
|
|
748
|
+
* in the current selected layout
|
|
749
|
+
*/
|
|
750
|
+
private allocateSlotsToReceiverSelectedVideoPaneGroups() {
|
|
558
751
|
this.currentLayout?.memberVideoPanes?.forEach((memberPane) => {
|
|
559
752
|
// check if there is existing slot for this csi
|
|
560
753
|
const existingSlot = this.slots.video.receiverSelected.find(
|
|
@@ -581,44 +774,116 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
581
774
|
}
|
|
582
775
|
|
|
583
776
|
/**
|
|
584
|
-
*
|
|
585
|
-
* and allocates them to the right video panes / pane groups
|
|
586
|
-
*
|
|
587
|
-
* @returns {Promise}
|
|
777
|
+
* Ensures that we have enough slots for the current layout.
|
|
588
778
|
*/
|
|
589
|
-
private async
|
|
779
|
+
private async refillRequiredSlotsIfNeeded() {
|
|
590
780
|
const requiredNumSlots = this.getRequiredNumVideoSlotsForLayout(this.currentLayout);
|
|
591
781
|
const totalNumSlots =
|
|
592
782
|
this.slots.video.unused.length +
|
|
593
783
|
this.slots.video.activeSpeaker.length +
|
|
594
784
|
this.slots.video.receiverSelected.length;
|
|
595
785
|
|
|
596
|
-
// ensure we have enough total slots for current layout
|
|
597
786
|
if (totalNumSlots < requiredNumSlots) {
|
|
598
787
|
let numSlotsToCreate = requiredNumSlots - totalNumSlots;
|
|
599
788
|
|
|
600
789
|
while (numSlotsToCreate > 0) {
|
|
601
790
|
// eslint-disable-next-line no-await-in-loop
|
|
602
791
|
this.slots.video.unused.push(
|
|
603
|
-
await
|
|
792
|
+
// eslint-disable-next-line no-await-in-loop
|
|
793
|
+
await this.receiveSlotManager.allocateSlot(MediaType.VideoMain)
|
|
604
794
|
);
|
|
605
795
|
numSlotsToCreate -= 1;
|
|
606
796
|
}
|
|
607
797
|
}
|
|
798
|
+
}
|
|
608
799
|
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
800
|
+
/**
|
|
801
|
+
* Move all active speaker slots to "unused"
|
|
802
|
+
*/
|
|
803
|
+
private trimActiveSpeakerSlots() {
|
|
613
804
|
this.slots.video.unused.push(...this.slots.video.activeSpeaker);
|
|
614
805
|
this.slots.video.activeSpeaker.length = 0;
|
|
806
|
+
}
|
|
615
807
|
|
|
616
|
-
|
|
617
|
-
|
|
808
|
+
/**
|
|
809
|
+
* Logs the state of the receive slots
|
|
810
|
+
*/
|
|
811
|
+
private logMainVideoReceiveSlots() {
|
|
812
|
+
let logMessage = '';
|
|
813
|
+
forEach(this.receiveSlotAllocations.activeSpeaker, (group, groupName) => {
|
|
814
|
+
logMessage += `\ngroup: ${groupName}\n${group.slots
|
|
815
|
+
.map((slot) => slot.logString)
|
|
816
|
+
.join(', ')}`;
|
|
817
|
+
});
|
|
818
|
+
|
|
819
|
+
logMessage += '\nreceiverSelected:\n';
|
|
820
|
+
forEach(this.receiveSlotAllocations.receiverSelected, (slot, key) => {
|
|
821
|
+
logMessage += ` ${key}: ${slot.logString}\n`;
|
|
822
|
+
});
|
|
823
|
+
|
|
824
|
+
LoggerProxy.logger.log(
|
|
825
|
+
`RemoteMediaManager#logMainVideoReceiveSlots --> MAIN VIDEO receive slots: unused=${this.slots.video.unused.length}, activeSpeaker=${this.slots.video.activeSpeaker.length}, receiverSelected=${this.slots.video.receiverSelected.length}${logMessage}`
|
|
826
|
+
);
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
/** logs main audio slots */
|
|
830
|
+
private logMainAudioReceiveSlots() {
|
|
831
|
+
LoggerProxy.logger.log(
|
|
832
|
+
`RemoteMediaManager#logMainAudioReceiveSlots --> MAIN AUDIO receive slots: ${this.slots.audio.main
|
|
833
|
+
.map((slot) => slot.logString)
|
|
834
|
+
.join(', ')}`
|
|
835
|
+
);
|
|
836
|
+
}
|
|
618
837
|
|
|
838
|
+
/** logs slides video slots */
|
|
839
|
+
private logSlidesVideoReceiveSlots() {
|
|
619
840
|
LoggerProxy.logger.log(
|
|
620
|
-
`RemoteMediaManager#
|
|
841
|
+
`RemoteMediaManager#logSlidesVideoReceiveSlots --> SLIDES VIDEO receive slot: ${this.slots.screenShare.video?.logString}`
|
|
621
842
|
);
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
/** logs slides audio slots */
|
|
846
|
+
private logSlidesAudioReceiveSlots() {
|
|
847
|
+
LoggerProxy.logger.log(
|
|
848
|
+
`RemoteMediaManager#logSlidesAudioReceiveSlots --> SLIDES AUDIO receive slots: ${this.slots.screenShare.audio
|
|
849
|
+
.map((slot) => slot.logString)
|
|
850
|
+
.join(', ')}`
|
|
851
|
+
);
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
/** Logs all current receive slots */
|
|
855
|
+
public logAllReceiveSlots() {
|
|
856
|
+
this.logMainVideoReceiveSlots();
|
|
857
|
+
this.logMainAudioReceiveSlots();
|
|
858
|
+
this.logSlidesVideoReceiveSlots();
|
|
859
|
+
this.logSlidesAudioReceiveSlots();
|
|
860
|
+
}
|
|
861
|
+
|
|
862
|
+
/**
|
|
863
|
+
* Makes sure we have the right number of receive slots created for the current layout
|
|
864
|
+
* and allocates them to the right video panes / pane groups
|
|
865
|
+
*
|
|
866
|
+
* @returns {Promise}
|
|
867
|
+
*/
|
|
868
|
+
private async updateVideoReceiveSlots() {
|
|
869
|
+
// move all active speaker slots to "unused"
|
|
870
|
+
this.trimActiveSpeakerSlots();
|
|
871
|
+
|
|
872
|
+
// move all no longer needed receiver-selected slots to "unused"
|
|
873
|
+
this.trimReceiverSelectedSlots();
|
|
874
|
+
|
|
875
|
+
// ensure we have enough total slots for current layout
|
|
876
|
+
await this.refillRequiredSlotsIfNeeded();
|
|
877
|
+
|
|
878
|
+
// allocate the slots to the right panes / pane groups
|
|
879
|
+
// reset allocations
|
|
880
|
+
this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};
|
|
881
|
+
// allocate active speaker
|
|
882
|
+
this.allocateSlotsToActiveSpeakerPaneGroups();
|
|
883
|
+
// allocate receiver selected
|
|
884
|
+
this.allocateSlotsToReceiverSelectedVideoPaneGroups();
|
|
885
|
+
|
|
886
|
+
this.logMainVideoReceiveSlots();
|
|
622
887
|
|
|
623
888
|
// If this is the initial layout, there may be some "unused" slots left because of the preallocation
|
|
624
889
|
// done in this.preallocateVideoReceiveSlots(), so release them now
|
|
@@ -631,7 +896,13 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
631
896
|
*/
|
|
632
897
|
private updateVideoRemoteMediaObjects() {
|
|
633
898
|
// invalidate all the previous remote media objects and cancel their media requests
|
|
634
|
-
this.invalidateCurrentRemoteMedia({
|
|
899
|
+
this.invalidateCurrentRemoteMedia({
|
|
900
|
+
audio: false,
|
|
901
|
+
video: true,
|
|
902
|
+
screenShareAudio: false,
|
|
903
|
+
screenShareVideo: false,
|
|
904
|
+
commit: false,
|
|
905
|
+
});
|
|
635
906
|
|
|
636
907
|
// create new remoteMediaGroup objects
|
|
637
908
|
this.media.video.activeSpeakerGroups = {};
|
|
@@ -686,19 +957,61 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
686
957
|
);
|
|
687
958
|
}
|
|
688
959
|
}
|
|
689
|
-
// todo: screenshare (SPARK-377812)
|
|
690
960
|
|
|
691
961
|
this.mediaRequestManagers.video.commit();
|
|
692
962
|
}
|
|
693
963
|
|
|
694
964
|
/**
|
|
695
|
-
*
|
|
965
|
+
* Checks if current layout requires a screen share.
|
|
966
|
+
* If it does, it creates new RemoteMediaGroup object for screen share
|
|
967
|
+
* and sends the media requests for it.
|
|
968
|
+
* If it doesn't, it makes sure we clean up any RemoteMediaGroup objects
|
|
969
|
+
* created earlier for screen share (for previous layout).
|
|
696
970
|
*/
|
|
697
|
-
private
|
|
698
|
-
|
|
971
|
+
private updateScreenShareVideoRemoteMediaObject() {
|
|
972
|
+
this.invalidateCurrentRemoteMedia({
|
|
973
|
+
audio: false,
|
|
974
|
+
video: false,
|
|
975
|
+
screenShareAudio: false,
|
|
976
|
+
screenShareVideo: true,
|
|
977
|
+
commit: false,
|
|
978
|
+
});
|
|
699
979
|
|
|
700
|
-
|
|
701
|
-
|
|
980
|
+
this.media.screenShare.video = undefined;
|
|
981
|
+
|
|
982
|
+
if (this.currentLayout?.screenShareVideo) {
|
|
983
|
+
// we create a group of 1, because for screen share we need to use the "active speaker" policy
|
|
984
|
+
this.media.screenShare.video = new RemoteMediaGroup(
|
|
985
|
+
this.mediaRequestManagers.screenShareVideo,
|
|
986
|
+
[this.slots.screenShare.video],
|
|
987
|
+
255,
|
|
988
|
+
false,
|
|
989
|
+
{resolution: this.currentLayout.screenShareVideo.size}
|
|
990
|
+
);
|
|
991
|
+
}
|
|
992
|
+
|
|
993
|
+
this.mediaRequestManagers.screenShareVideo.commit();
|
|
994
|
+
}
|
|
995
|
+
|
|
996
|
+
/**
|
|
997
|
+
* Invalidates all remote media objects belonging to currently selected layout
|
|
998
|
+
*/
|
|
999
|
+
private invalidateCurrentRemoteMedia(options: {
|
|
1000
|
+
audio: boolean;
|
|
1001
|
+
video: boolean;
|
|
1002
|
+
screenShareAudio: boolean;
|
|
1003
|
+
screenShareVideo: boolean;
|
|
1004
|
+
commit: boolean;
|
|
1005
|
+
}) {
|
|
1006
|
+
const {audio, video, screenShareAudio, screenShareVideo, commit} = options;
|
|
1007
|
+
|
|
1008
|
+
if (audio) {
|
|
1009
|
+
if (this.media.audio.main) {
|
|
1010
|
+
this.media.audio.main.stop(commit);
|
|
1011
|
+
}
|
|
1012
|
+
if (this.media.audio.si) {
|
|
1013
|
+
this.media.audio.si.stop(commit);
|
|
1014
|
+
}
|
|
702
1015
|
}
|
|
703
1016
|
if (video) {
|
|
704
1017
|
Object.values(this.media.video.activeSpeakerGroups).forEach((remoteMediaGroup) => {
|
|
@@ -711,12 +1024,19 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
711
1024
|
this.mediaRequestManagers.video.commit();
|
|
712
1025
|
}
|
|
713
1026
|
}
|
|
1027
|
+
|
|
1028
|
+
if (screenShareAudio && this.media.screenShare.audio) {
|
|
1029
|
+
this.media.screenShare.audio.stop(commit);
|
|
1030
|
+
}
|
|
1031
|
+
if (screenShareVideo && this.media.screenShare.video) {
|
|
1032
|
+
this.media.screenShare.video.stop(commit);
|
|
1033
|
+
}
|
|
714
1034
|
}
|
|
715
1035
|
|
|
716
1036
|
/** emits Event.VideoLayoutChanged */
|
|
717
1037
|
private emitVideoLayoutChangedEvent() {
|
|
718
1038
|
// todo: at this point the receive slots might still be showing a participant from previous layout, we should
|
|
719
|
-
// wait for our media requests to be
|
|
1039
|
+
// wait for our media requests to be fulfilled, but there is no API for that right now (we could wait for source updates
|
|
720
1040
|
// but in some cases they might never come, or would need to always make sure to use a new set of receiver slots)
|
|
721
1041
|
// for now it's fine to have it like this, we will re-evaluate if it needs improving after more testing
|
|
722
1042
|
|
|
@@ -730,7 +1050,7 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
730
1050
|
layoutId: this.currentLayoutId,
|
|
731
1051
|
activeSpeakerVideoPanes: this.media.video.activeSpeakerGroups,
|
|
732
1052
|
memberVideoPanes: this.media.video.memberPanes,
|
|
733
|
-
screenShareVideo:
|
|
1053
|
+
screenShareVideo: this.media.screenShare.video?.getRemoteMedia()[0],
|
|
734
1054
|
}
|
|
735
1055
|
);
|
|
736
1056
|
}
|
|
@@ -778,7 +1098,7 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
778
1098
|
|
|
779
1099
|
this.currentLayout.memberVideoPanes.push(newPane);
|
|
780
1100
|
|
|
781
|
-
const receiveSlot = await this.receiveSlotManager.allocateSlot(
|
|
1101
|
+
const receiveSlot = await this.receiveSlotManager.allocateSlot(MediaType.VideoMain);
|
|
782
1102
|
|
|
783
1103
|
this.slots.video.receiverSelected.push(receiveSlot);
|
|
784
1104
|
|