@webex/plugin-meetings 3.0.0-beta.16 → 3.0.0-beta.161
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -1
- 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 +359 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.js +212 -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 +43 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.js +1046 -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/errors/webex-errors.js +3 -2
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -1
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/config.js +6 -8
- package/dist/config.js.map +1 -1
- package/dist/constants.js +175 -26
- 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 +300 -0
- package/dist/controls-options-manager/util.js.map +1 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -1
- package/dist/interpretation/collection.js +23 -0
- package/dist/interpretation/collection.js.map +1 -0
- package/dist/interpretation/index.js +214 -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 +92 -2
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +317 -24
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +43 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +2 -1
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +97 -14
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +39 -134
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +19 -97
- package/dist/media/properties.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +505 -493
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +79 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +2349 -2178
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +291 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.js +229 -124
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +191 -167
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js.map +1 -1
- package/dist/meeting/util.js +444 -443
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +157 -49
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/utilv2.js +20 -5
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +22 -0
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +365 -73
- 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 +16 -12
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +88 -1
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +43 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +15 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +97 -3
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +10 -0
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +94 -11
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +109 -39
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js +15 -0
- package/dist/members/types.js.map +1 -0
- package/dist/members/util.js +316 -233
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.js +50 -14
- package/dist/metrics/config.js.map +1 -1
- package/dist/metrics/constants.js +3 -5
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +48 -29
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +265 -36
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +52 -19
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +53 -33
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +44 -18
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +60 -3
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +322 -103
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +4 -2
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/reachability/index.js +117 -60
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +12 -5
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/constants.js +13 -0
- package/dist/reactions/constants.js.map +1 -0
- package/dist/reactions/reactions.js +2 -2
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.js +18 -18
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.js +190 -145
- 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 +343 -0
- package/dist/recording-controller/index.js.map +1 -0
- package/dist/recording-controller/util.js +63 -0
- package/dist/recording-controller/util.js.map +1 -0
- package/dist/roap/index.js +21 -29
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +127 -92
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +135 -53
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js +1 -93
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +329 -314
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +103 -54
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +43 -0
- package/dist/types/annotation/constants.d.ts +31 -0
- package/dist/types/annotation/index.d.ts +124 -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 +2 -0
- package/dist/types/breakouts/index.d.ts +5 -0
- package/dist/types/breakouts/request.d.ts +22 -0
- package/dist/types/breakouts/utils.d.ts +15 -0
- package/dist/types/common/browser-detection.d.ts +9 -0
- package/dist/types/common/collection.d.ts +48 -0
- package/dist/types/common/config.d.ts +2 -0
- package/dist/types/common/errors/captcha-error.d.ts +15 -0
- package/dist/types/common/errors/intent-to-join.d.ts +16 -0
- package/dist/types/common/errors/join-meeting.d.ts +17 -0
- package/dist/types/common/errors/media.d.ts +15 -0
- package/dist/types/common/errors/parameter.d.ts +15 -0
- package/dist/types/common/errors/password-error.d.ts +15 -0
- package/dist/types/common/errors/permission.d.ts +14 -0
- package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
- package/dist/types/common/errors/reconnection.d.ts +15 -0
- package/dist/types/common/errors/stats.d.ts +15 -0
- package/dist/types/common/errors/webex-errors.d.ts +69 -0
- package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
- package/dist/types/common/events/events-scope.d.ts +17 -0
- package/dist/types/common/events/events.d.ts +12 -0
- package/dist/types/common/events/trigger-proxy.d.ts +2 -0
- package/dist/types/common/events/util.d.ts +2 -0
- package/dist/types/common/logs/logger-config.d.ts +2 -0
- package/dist/types/common/logs/logger-proxy.d.ts +2 -0
- package/dist/types/common/logs/request.d.ts +34 -0
- package/dist/types/common/queue.d.ts +32 -0
- package/dist/types/config.d.ts +72 -0
- package/dist/types/constants.d.ts +987 -0
- package/dist/types/controls-options-manager/constants.d.ts +4 -0
- package/dist/types/controls-options-manager/enums.d.ts +15 -0
- package/dist/types/controls-options-manager/index.d.ts +136 -0
- package/dist/types/controls-options-manager/types.d.ts +43 -0
- package/dist/types/controls-options-manager/util.d.ts +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/interpretation/collection.d.ts +5 -0
- package/dist/types/interpretation/index.d.ts +5 -0
- package/dist/types/interpretation/siLanguage.d.ts +5 -0
- package/dist/types/locus-info/controlsUtils.d.ts +2 -0
- package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
- package/dist/types/locus-info/fullState.d.ts +2 -0
- package/dist/types/locus-info/hostUtils.d.ts +2 -0
- package/dist/types/locus-info/index.d.ts +315 -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 +212 -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 +86 -0
- package/dist/types/media/util.d.ts +2 -0
- package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +149 -0
- package/dist/types/meeting/index.d.ts +1524 -0
- package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
- package/dist/types/meeting/muteState.d.ts +184 -0
- package/dist/types/meeting/request.d.ts +270 -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 +75 -0
- package/dist/types/meeting-info/collection.d.ts +20 -0
- package/dist/types/meeting-info/index.d.ts +57 -0
- package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
- package/dist/types/meeting-info/request.d.ts +22 -0
- package/dist/types/meeting-info/util.d.ts +2 -0
- package/dist/types/meeting-info/utilv2.d.ts +2 -0
- package/dist/types/meetings/collection.d.ts +31 -0
- package/dist/types/meetings/index.d.ts +364 -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 +158 -0
- package/dist/types/member/types.d.ts +21 -0
- package/dist/types/member/util.d.ts +2 -0
- package/dist/types/members/collection.d.ts +29 -0
- package/dist/types/members/index.d.ts +353 -0
- package/dist/types/members/request.d.ts +114 -0
- package/dist/types/members/types.d.ts +24 -0
- package/dist/types/members/util.d.ts +210 -0
- package/dist/types/metrics/config.d.ts +195 -0
- package/dist/types/metrics/constants.d.ts +55 -0
- package/dist/types/metrics/index.d.ts +169 -0
- package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
- package/dist/types/multistream/receiveSlot.d.ts +68 -0
- package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
- package/dist/types/multistream/remoteMedia.d.ts +72 -0
- package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
- package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
- package/dist/types/networkQualityMonitor/index.d.ts +70 -0
- package/dist/types/personal-meeting-room/index.d.ts +47 -0
- package/dist/types/personal-meeting-room/request.d.ts +14 -0
- package/dist/types/personal-meeting-room/util.d.ts +2 -0
- package/dist/types/reachability/index.d.ts +152 -0
- package/dist/types/reachability/request.d.ts +37 -0
- package/dist/types/reactions/constants.d.ts +3 -0
- package/dist/types/reactions/reactions.d.ts +4 -0
- package/dist/types/reactions/reactions.type.d.ts +52 -0
- package/dist/types/reconnection-manager/index.d.ts +126 -0
- package/dist/types/recording-controller/enums.d.ts +7 -0
- package/dist/types/recording-controller/index.d.ts +193 -0
- package/dist/types/recording-controller/util.d.ts +13 -0
- package/dist/types/roap/index.d.ts +77 -0
- package/dist/types/roap/request.d.ts +36 -0
- package/dist/types/roap/turnDiscovery.d.ts +91 -0
- package/dist/types/statsAnalyzer/global.d.ts +36 -0
- package/dist/types/statsAnalyzer/index.d.ts +200 -0
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
- package/dist/types/transcription/index.d.ts +64 -0
- package/package.json +28 -21
- package/src/annotation/annotation.types.ts +52 -0
- package/src/annotation/constants.ts +36 -0
- package/src/annotation/index.ts +343 -0
- package/src/breakouts/README.md +220 -0
- package/src/breakouts/breakout.ts +180 -0
- package/src/breakouts/collection.ts +19 -0
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +37 -0
- package/src/breakouts/index.ts +921 -0
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +57 -0
- package/src/common/errors/webex-errors.ts +6 -2
- package/src/common/logs/logger-proxy.ts +1 -1
- package/src/config.ts +5 -7
- package/src/constants.ts +165 -20
- 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 +286 -0
- package/src/index.ts +34 -0
- package/src/interpretation/README.md +51 -0
- package/src/interpretation/collection.ts +19 -0
- package/src/interpretation/index.ts +182 -0
- package/src/interpretation/siLanguage.ts +18 -0
- package/src/locus-info/controlsUtils.ts +110 -0
- package/src/locus-info/index.ts +339 -21
- package/src/locus-info/mediaSharesUtils.ts +48 -0
- package/src/locus-info/parser.ts +2 -1
- package/src/locus-info/selfUtils.ts +86 -2
- package/src/media/index.ts +70 -142
- package/src/media/properties.ts +41 -104
- package/src/mediaQualityMetrics/config.ts +379 -377
- package/src/meeting/in-meeting-actions.ts +156 -0
- package/src/meeting/index.ts +1779 -1741
- package/src/meeting/locusMediaRequest.ts +309 -0
- package/src/meeting/muteState.ts +228 -132
- package/src/meeting/request.ts +100 -91
- package/src/meeting/request.type.ts +2 -0
- package/src/meeting/util.ts +422 -421
- package/src/meeting-info/meeting-info-v2.ts +134 -13
- package/src/meeting-info/utilv2.ts +13 -3
- package/src/meetings/collection.ts +20 -0
- package/src/meetings/index.ts +385 -83
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +3 -1
- package/src/meetings/util.ts +103 -4
- package/src/member/index.ts +42 -0
- package/src/member/types.ts +24 -0
- package/src/member/util.ts +95 -1
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +108 -6
- package/src/members/request.ts +98 -17
- package/src/members/types.ts +28 -0
- package/src/members/util.ts +319 -240
- package/src/metrics/config.ts +49 -10
- package/src/metrics/constants.ts +2 -4
- package/src/metrics/index.ts +43 -27
- package/src/multistream/mediaRequestManager.ts +337 -63
- package/src/multistream/receiveSlot.ts +68 -26
- package/src/multistream/receiveSlotManager.ts +61 -38
- package/src/multistream/remoteMedia.ts +29 -3
- package/src/multistream/remoteMediaGroup.ts +61 -2
- package/src/multistream/remoteMediaManager.ts +260 -66
- package/src/networkQualityMonitor/index.ts +6 -6
- package/src/reachability/index.ts +75 -25
- package/src/reachability/request.ts +10 -5
- package/src/reactions/constants.ts +4 -0
- package/src/reactions/reactions.ts +4 -4
- package/src/reactions/reactions.type.ts +28 -3
- package/src/reconnection-manager/index.ts +53 -32
- package/src/recording-controller/enums.ts +8 -0
- package/src/recording-controller/index.ts +315 -0
- package/src/recording-controller/util.ts +58 -0
- package/src/roap/index.ts +21 -30
- package/src/roap/request.ts +51 -52
- package/src/roap/turnDiscovery.ts +51 -27
- package/src/statsAnalyzer/global.ts +1 -94
- package/src/statsAnalyzer/index.ts +380 -390
- package/src/statsAnalyzer/mqaUtil.ts +106 -99
- package/test/integration/spec/converged-space-meetings.js +233 -0
- package/test/integration/spec/journey.js +331 -254
- package/test/integration/spec/space-meeting.js +77 -4
- package/test/unit/spec/annotation/index.ts +436 -0
- package/test/unit/spec/breakouts/breakout.ts +233 -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 +77 -0
- package/test/unit/spec/breakouts/index.ts +1790 -0
- package/test/unit/spec/breakouts/request.ts +104 -0
- package/test/unit/spec/breakouts/utils.js +72 -0
- package/test/unit/spec/controls-options-manager/index.js +287 -0
- package/test/unit/spec/controls-options-manager/util.js +518 -0
- package/test/unit/spec/fixture/locus.js +1 -0
- package/test/unit/spec/interpretation/collection.ts +15 -0
- package/test/unit/spec/interpretation/index.ts +329 -0
- package/test/unit/spec/interpretation/siLanguage.ts +26 -0
- package/test/unit/spec/locus-info/controlsUtils.js +323 -30
- package/test/unit/spec/locus-info/index.js +680 -4
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
- package/test/unit/spec/locus-info/selfConstant.js +48 -0
- package/test/unit/spec/locus-info/selfUtils.js +275 -0
- package/test/unit/spec/media/index.ts +118 -22
- package/test/unit/spec/media/properties.ts +9 -9
- package/test/unit/spec/meeting/in-meeting-actions.ts +76 -0
- package/test/unit/spec/meeting/index.js +2695 -1513
- package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
- package/test/unit/spec/meeting/muteState.js +370 -208
- package/test/unit/spec/meeting/request.js +354 -42
- package/test/unit/spec/meeting/utils.js +270 -156
- package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
- package/test/unit/spec/meeting-info/utilv2.js +21 -0
- package/test/unit/spec/meetings/collection.js +14 -0
- package/test/unit/spec/meetings/index.js +866 -120
- package/test/unit/spec/meetings/utils.js +206 -2
- package/test/unit/spec/member/index.js +31 -0
- package/test/unit/spec/member/util.js +408 -32
- package/test/unit/spec/members/index.js +320 -1
- package/test/unit/spec/members/request.js +206 -27
- package/test/unit/spec/members/utils.js +184 -0
- package/test/unit/spec/metrics/index.js +98 -0
- package/test/unit/spec/multistream/mediaRequestManager.ts +1012 -109
- 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 +32 -2
- package/test/unit/spec/multistream/remoteMediaGroup.ts +271 -5
- package/test/unit/spec/multistream/remoteMediaManager.ts +672 -65
- package/test/unit/spec/networkQualityMonitor/index.js +4 -4
- package/test/unit/spec/reachability/index.ts +176 -25
- package/test/unit/spec/reachability/request.js +66 -0
- package/test/unit/spec/reconnection-manager/index.js +46 -13
- package/test/unit/spec/recording-controller/index.js +231 -0
- package/test/unit/spec/recording-controller/util.js +102 -0
- package/test/unit/spec/roap/index.ts +21 -51
- package/test/unit/spec/roap/request.ts +187 -0
- package/test/unit/spec/roap/turnDiscovery.ts +73 -34
- package/test/unit/spec/stats-analyzer/index.js +94 -43
- package/test/utils/constants.js +9 -0
- package/test/utils/integrationTestUtils.js +46 -0
- package/test/utils/testUtils.js +0 -45
- package/test/utils/webex-config.js +4 -0
- package/test/utils/webex-test-users.js +7 -3
- package/tsconfig.json +6 -0
- package/dist/media/internal-media-core-wrapper.js +0 -18
- package/dist/media/internal-media-core-wrapper.js.map +0 -1
- package/dist/meeting/effectsState.js +0 -262
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/multistream/multistreamMedia.js +0 -106
- package/dist/multistream/multistreamMedia.js.map +0 -1
- package/src/index.js +0 -15
- package/src/media/internal-media-core-wrapper.ts +0 -9
- package/src/meeting/effectsState.ts +0 -211
- package/src/multistream/multistreamMedia.ts +0 -93
- package/test/unit/spec/meeting/effectsState.js +0 -281
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* eslint-disable valid-jsdoc */
|
|
2
|
-
import {cloneDeep, remove} from 'lodash';
|
|
2
|
+
import {cloneDeep, forEach, remove} from 'lodash';
|
|
3
3
|
import {EventMap} from 'typed-emitter';
|
|
4
|
-
import {
|
|
4
|
+
import {MediaType} from '@webex/internal-media-core';
|
|
5
5
|
|
|
6
6
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
7
7
|
import EventsScope from '../common/events/events-scope';
|
|
@@ -31,8 +31,8 @@ export interface MemberVideoPane {
|
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
export interface VideoLayout {
|
|
34
|
-
screenShareVideo
|
|
35
|
-
size: PaneSize
|
|
34
|
+
screenShareVideo?: {
|
|
35
|
+
size: PaneSize;
|
|
36
36
|
};
|
|
37
37
|
activeSpeakerVideoPaneGroups?: ActiveSpeakerVideoPaneGroup[]; // list of active speaker video pane groups
|
|
38
38
|
memberVideoPanes?: MemberVideoPane[]; // list of video panes for specific members, CSI values can be changed later via setVideoPaneCsi()
|
|
@@ -41,6 +41,7 @@ export interface VideoLayout {
|
|
|
41
41
|
export interface Configuration {
|
|
42
42
|
audio: {
|
|
43
43
|
numOfActiveSpeakerStreams: number; // number of audio streams we want to receive
|
|
44
|
+
numOfScreenShareStreams: number; // 1 should be enough, because in webex only 1 person at a time can be presenting screen share
|
|
44
45
|
};
|
|
45
46
|
video: {
|
|
46
47
|
preferLiveVideo: boolean; // applies to all pane groups with active speaker policy
|
|
@@ -48,17 +49,12 @@ export interface Configuration {
|
|
|
48
49
|
|
|
49
50
|
layouts: {[key: LayoutId]: VideoLayout}; // a map of all available layouts, a layout can be set via setLayout() method
|
|
50
51
|
};
|
|
51
|
-
screenShare: {
|
|
52
|
-
audio: boolean; // whether we ever want to receive screen share audio at all
|
|
53
|
-
video: boolean; // whether we ever want to receive screen share video at all
|
|
54
|
-
};
|
|
55
52
|
}
|
|
56
53
|
|
|
57
54
|
/* Predefined layouts: */
|
|
58
55
|
|
|
59
56
|
// An "all equal" grid, with size up to 3 x 3 = 9:
|
|
60
57
|
const AllEqualLayout: VideoLayout = {
|
|
61
|
-
screenShareVideo: {size: null},
|
|
62
58
|
activeSpeakerVideoPaneGroups: [
|
|
63
59
|
{
|
|
64
60
|
id: 'main',
|
|
@@ -71,7 +67,6 @@ const AllEqualLayout: VideoLayout = {
|
|
|
71
67
|
|
|
72
68
|
// A layout with just a single remote active speaker video pane:
|
|
73
69
|
const SingleLayout: VideoLayout = {
|
|
74
|
-
screenShareVideo: {size: null},
|
|
75
70
|
activeSpeakerVideoPaneGroups: [
|
|
76
71
|
{
|
|
77
72
|
id: 'main',
|
|
@@ -84,7 +79,6 @@ const SingleLayout: VideoLayout = {
|
|
|
84
79
|
|
|
85
80
|
// A layout with 1 big pane for the highest priority active speaker and 5 small panes for other active speakers:
|
|
86
81
|
const OnePlusFiveLayout: VideoLayout = {
|
|
87
|
-
screenShareVideo: {size: null},
|
|
88
82
|
activeSpeakerVideoPaneGroups: [
|
|
89
83
|
{
|
|
90
84
|
id: 'mainBigOne',
|
|
@@ -102,8 +96,8 @@ const OnePlusFiveLayout: VideoLayout = {
|
|
|
102
96
|
};
|
|
103
97
|
|
|
104
98
|
// A layout with 2 big panes for 2 main active speakers and a strip of 6 small panes for other active speakers:
|
|
99
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
105
100
|
const TwoMainPlusSixSmallLayout: VideoLayout = {
|
|
106
|
-
screenShareVideo: {size: null},
|
|
107
101
|
activeSpeakerVideoPaneGroups: [
|
|
108
102
|
{
|
|
109
103
|
id: 'mainGroupWith2BigPanes',
|
|
@@ -135,7 +129,6 @@ const RemoteScreenShareWithSmallThumbnailsLayout: VideoLayout = {
|
|
|
135
129
|
|
|
136
130
|
// 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:
|
|
137
131
|
const Stage2x2With6ThumbnailsLayout: VideoLayout = {
|
|
138
|
-
screenShareVideo: {size: null},
|
|
139
132
|
activeSpeakerVideoPaneGroups: [
|
|
140
133
|
{
|
|
141
134
|
id: 'thumbnails',
|
|
@@ -161,6 +154,7 @@ const Stage2x2With6ThumbnailsLayout: VideoLayout = {
|
|
|
161
154
|
export const DefaultConfiguration: Configuration = {
|
|
162
155
|
audio: {
|
|
163
156
|
numOfActiveSpeakerStreams: 3,
|
|
157
|
+
numOfScreenShareStreams: 1,
|
|
164
158
|
},
|
|
165
159
|
video: {
|
|
166
160
|
preferLiveVideo: true,
|
|
@@ -174,16 +168,12 @@ export const DefaultConfiguration: Configuration = {
|
|
|
174
168
|
ScreenShareView: RemoteScreenShareWithSmallThumbnailsLayout,
|
|
175
169
|
},
|
|
176
170
|
},
|
|
177
|
-
screenShare: {
|
|
178
|
-
audio: true,
|
|
179
|
-
video: true,
|
|
180
|
-
},
|
|
181
171
|
};
|
|
182
172
|
|
|
183
173
|
export enum Event {
|
|
184
174
|
// events for audio streams
|
|
185
175
|
AudioCreated = 'AudioCreated',
|
|
186
|
-
ScreenShareAudioCreated = '
|
|
176
|
+
ScreenShareAudioCreated = 'ScreenShareAudioCreated',
|
|
187
177
|
|
|
188
178
|
// events for video streams
|
|
189
179
|
VideoLayoutChanged = 'VideoLayoutChanged',
|
|
@@ -200,7 +190,7 @@ export interface VideoLayoutChangedEventData {
|
|
|
200
190
|
export interface Events extends EventMap {
|
|
201
191
|
// audio
|
|
202
192
|
[Event.AudioCreated]: (audio: RemoteMediaGroup) => void;
|
|
203
|
-
[Event.ScreenShareAudioCreated]: (screenShareAudio:
|
|
193
|
+
[Event.ScreenShareAudioCreated]: (screenShareAudio: RemoteMediaGroup) => void;
|
|
204
194
|
|
|
205
195
|
// video
|
|
206
196
|
[Event.VideoLayoutChanged]: (data: VideoLayoutChangedEventData) => void;
|
|
@@ -224,14 +214,18 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
224
214
|
private mediaRequestManagers: {
|
|
225
215
|
audio: MediaRequestManager;
|
|
226
216
|
video: MediaRequestManager;
|
|
217
|
+
screenShareAudio: MediaRequestManager;
|
|
218
|
+
screenShareVideo: MediaRequestManager;
|
|
227
219
|
};
|
|
228
220
|
|
|
229
221
|
private currentLayout?: VideoLayout;
|
|
230
222
|
|
|
231
223
|
private slots: {
|
|
232
224
|
audio: ReceiveSlot[];
|
|
233
|
-
|
|
234
|
-
|
|
225
|
+
screenShare: {
|
|
226
|
+
audio: ReceiveSlot[];
|
|
227
|
+
video?: ReceiveSlot;
|
|
228
|
+
};
|
|
235
229
|
video: {
|
|
236
230
|
unused: ReceiveSlot[];
|
|
237
231
|
activeSpeaker: ReceiveSlot[];
|
|
@@ -247,6 +241,10 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
247
241
|
};
|
|
248
242
|
memberPanes: {[key: PaneId]: RemoteMedia};
|
|
249
243
|
};
|
|
244
|
+
screenShare: {
|
|
245
|
+
audio?: RemoteMediaGroup;
|
|
246
|
+
video?: RemoteMediaGroup;
|
|
247
|
+
};
|
|
250
248
|
};
|
|
251
249
|
|
|
252
250
|
private receiveSlotAllocations: {
|
|
@@ -268,6 +266,8 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
268
266
|
mediaRequestManagers: {
|
|
269
267
|
audio: MediaRequestManager;
|
|
270
268
|
video: MediaRequestManager;
|
|
269
|
+
screenShareAudio: MediaRequestManager;
|
|
270
|
+
screenShareVideo: MediaRequestManager;
|
|
271
271
|
},
|
|
272
272
|
config: Configuration = DefaultConfiguration
|
|
273
273
|
) {
|
|
@@ -282,14 +282,20 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
282
282
|
activeSpeakerGroups: {},
|
|
283
283
|
memberPanes: {},
|
|
284
284
|
},
|
|
285
|
+
screenShare: {
|
|
286
|
+
audio: undefined,
|
|
287
|
+
video: undefined,
|
|
288
|
+
},
|
|
285
289
|
};
|
|
286
290
|
|
|
287
291
|
this.checkConfigValidity();
|
|
288
292
|
|
|
289
293
|
this.slots = {
|
|
290
294
|
audio: [],
|
|
291
|
-
|
|
292
|
-
|
|
295
|
+
screenShare: {
|
|
296
|
+
audio: [],
|
|
297
|
+
video: undefined,
|
|
298
|
+
},
|
|
293
299
|
video: {
|
|
294
300
|
unused: [],
|
|
295
301
|
activeSpeaker: [],
|
|
@@ -360,8 +366,8 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
360
366
|
|
|
361
367
|
await this.createAudioMedia();
|
|
362
368
|
|
|
363
|
-
|
|
364
|
-
|
|
369
|
+
await this.createScreenShareReceiveSlots();
|
|
370
|
+
this.createScreenShareAudioMedia();
|
|
365
371
|
|
|
366
372
|
await this.preallocateVideoReceiveSlots();
|
|
367
373
|
|
|
@@ -374,14 +380,27 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
374
380
|
*/
|
|
375
381
|
public stop() {
|
|
376
382
|
// invalidate all remoteMedia objects
|
|
377
|
-
this.invalidateCurrentRemoteMedia({
|
|
383
|
+
this.invalidateCurrentRemoteMedia({
|
|
384
|
+
audio: true,
|
|
385
|
+
video: true,
|
|
386
|
+
screenShareAudio: true,
|
|
387
|
+
screenShareVideo: true,
|
|
388
|
+
commit: true,
|
|
389
|
+
});
|
|
378
390
|
|
|
379
391
|
// release all audio receive slots
|
|
380
392
|
this.slots.audio.forEach((slot) => this.receiveSlotManager.releaseSlot(slot));
|
|
381
393
|
this.slots.audio.length = 0;
|
|
382
394
|
|
|
383
|
-
//
|
|
395
|
+
// release screen share slots
|
|
396
|
+
this.slots.screenShare.audio.forEach((slot) => this.receiveSlotManager.releaseSlot(slot));
|
|
397
|
+
this.slots.screenShare.audio.length = 0;
|
|
398
|
+
if (this.slots.screenShare.video) {
|
|
399
|
+
this.receiveSlotManager.releaseSlot(this.slots.screenShare.video);
|
|
400
|
+
this.slots.screenShare.video = undefined;
|
|
401
|
+
}
|
|
384
402
|
|
|
403
|
+
// release video slots
|
|
385
404
|
this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};
|
|
386
405
|
|
|
387
406
|
this.slots.video.unused.push(...this.slots.video.activeSpeaker);
|
|
@@ -434,7 +453,7 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
434
453
|
// eslint-disable-next-line no-await-in-loop
|
|
435
454
|
this.slots.video.unused.push(
|
|
436
455
|
// eslint-disable-next-line no-await-in-loop
|
|
437
|
-
await this.receiveSlotManager.allocateSlot(
|
|
456
|
+
await this.receiveSlotManager.allocateSlot(MediaType.VideoMain)
|
|
438
457
|
);
|
|
439
458
|
}
|
|
440
459
|
}
|
|
@@ -459,6 +478,7 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
459
478
|
|
|
460
479
|
await this.updateVideoReceiveSlots();
|
|
461
480
|
this.updateVideoRemoteMediaObjects();
|
|
481
|
+
this.updateScreenShareVideoRemoteMediaObject();
|
|
462
482
|
this.emitVideoLayoutChangedEvent();
|
|
463
483
|
}
|
|
464
484
|
|
|
@@ -471,6 +491,38 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
471
491
|
return this.currentLayoutId;
|
|
472
492
|
}
|
|
473
493
|
|
|
494
|
+
/**
|
|
495
|
+
* sets the preferLiveVideo
|
|
496
|
+
*/
|
|
497
|
+
public setPreferLiveVideo(preferLiveVideo: boolean) {
|
|
498
|
+
LoggerProxy.logger.log(
|
|
499
|
+
`RemoteMediaManager#setPreferLiveVideo --> setPreferLiveVideo is called to set preferLiveVideo to ${preferLiveVideo}`
|
|
500
|
+
);
|
|
501
|
+
this.config.video.preferLiveVideo = preferLiveVideo;
|
|
502
|
+
Object.values(this.media.video.activeSpeakerGroups).forEach((activeSpeakerGroup) => {
|
|
503
|
+
activeSpeakerGroup.setPreferLiveVideo(preferLiveVideo, false);
|
|
504
|
+
});
|
|
505
|
+
this.mediaRequestManagers.video.commit();
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* Sets CSIs for multiple RemoteMedia instances belonging to RemoteMediaGroup.
|
|
510
|
+
* For each entry in the remoteMediaCsis array:
|
|
511
|
+
* - if csi is specified, the RemoteMedia instance is pinned to that CSI
|
|
512
|
+
* - if csi is undefined, the RemoteMedia instance is unpinned
|
|
513
|
+
*/
|
|
514
|
+
public setActiveSpeakerCsis(remoteMediaCsis: {remoteMedia: RemoteMedia; csi?: number}[]) {
|
|
515
|
+
Object.values(this.media.video.activeSpeakerGroups).forEach((remoteMediaGroup) => {
|
|
516
|
+
const groupRemoteMediaCsis = remoteMediaCsis.filter(({remoteMedia}) =>
|
|
517
|
+
remoteMediaGroup.includes(remoteMedia)
|
|
518
|
+
);
|
|
519
|
+
if (groupRemoteMediaCsis.length > 0) {
|
|
520
|
+
remoteMediaGroup.setActiveSpeakerCsis(groupRemoteMediaCsis, false);
|
|
521
|
+
}
|
|
522
|
+
});
|
|
523
|
+
this.mediaRequestManagers.video.commit();
|
|
524
|
+
}
|
|
525
|
+
|
|
474
526
|
/**
|
|
475
527
|
* Creates the audio slots
|
|
476
528
|
*/
|
|
@@ -478,7 +530,7 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
478
530
|
// create the audio receive slots
|
|
479
531
|
for (let i = 0; i < this.config.audio.numOfActiveSpeakerStreams; i += 1) {
|
|
480
532
|
// eslint-disable-next-line no-await-in-loop
|
|
481
|
-
const slot = await this.receiveSlotManager.allocateSlot(
|
|
533
|
+
const slot = await this.receiveSlotManager.allocateSlot(MediaType.AudioMain);
|
|
482
534
|
|
|
483
535
|
this.slots.audio.push(slot);
|
|
484
536
|
}
|
|
@@ -498,6 +550,50 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
498
550
|
);
|
|
499
551
|
}
|
|
500
552
|
|
|
553
|
+
/**
|
|
554
|
+
* Creates receive slots required for receiving screen share audio and video
|
|
555
|
+
*/
|
|
556
|
+
private async createScreenShareReceiveSlots() {
|
|
557
|
+
// audio
|
|
558
|
+
for (let i = 0; i < this.config.audio.numOfScreenShareStreams; i += 1) {
|
|
559
|
+
// eslint-disable-next-line no-await-in-loop
|
|
560
|
+
const slot = await this.receiveSlotManager.allocateSlot(MediaType.AudioSlides);
|
|
561
|
+
|
|
562
|
+
this.slots.screenShare.audio.push(slot);
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
// video
|
|
566
|
+
const isAnyLayoutContainingScreenShareVideo = Object.values(this.config.video.layouts).some(
|
|
567
|
+
(layout) => !!layout.screenShareVideo
|
|
568
|
+
);
|
|
569
|
+
|
|
570
|
+
if (isAnyLayoutContainingScreenShareVideo) {
|
|
571
|
+
this.slots.screenShare.video = await this.receiveSlotManager.allocateSlot(
|
|
572
|
+
MediaType.VideoSlides
|
|
573
|
+
);
|
|
574
|
+
}
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
/**
|
|
578
|
+
* Creates RemoteMedia objects for screen share
|
|
579
|
+
*/
|
|
580
|
+
private createScreenShareAudioMedia() {
|
|
581
|
+
if (this.slots.screenShare.audio.length > 0) {
|
|
582
|
+
this.media.screenShare.audio = new RemoteMediaGroup(
|
|
583
|
+
this.mediaRequestManagers.screenShareAudio,
|
|
584
|
+
this.slots.screenShare.audio,
|
|
585
|
+
255,
|
|
586
|
+
true
|
|
587
|
+
);
|
|
588
|
+
|
|
589
|
+
this.emit(
|
|
590
|
+
{file: 'multistream/remoteMediaManager', function: 'createScreenShareAudioMedia'},
|
|
591
|
+
Event.ScreenShareAudioCreated,
|
|
592
|
+
this.media.screenShare.audio
|
|
593
|
+
);
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
|
|
501
597
|
/**
|
|
502
598
|
* Goes over all receiver-selected slots and keeps only the ones that are required by a given layout,
|
|
503
599
|
* the rest are all moved to the "unused" list
|
|
@@ -538,25 +634,37 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
538
634
|
}
|
|
539
635
|
|
|
540
636
|
/**
|
|
541
|
-
* Allocates receive slots to all video panes
|
|
637
|
+
* Allocates receive slots to all active speaker video panes
|
|
638
|
+
* in the current selected layout.
|
|
639
|
+
*
|
|
640
|
+
* Allocation tries to keep the same order of the slots between the previous
|
|
641
|
+
* layout and the new one. Sorting helps making sure that highest priority slots
|
|
642
|
+
* go in the same order in the new layout.
|
|
542
643
|
*/
|
|
543
|
-
private
|
|
544
|
-
this.
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
644
|
+
private allocateSlotsToActiveSpeakerPaneGroups() {
|
|
645
|
+
this.currentLayout?.activeSpeakerVideoPaneGroups
|
|
646
|
+
// sorting in descending order based on group priority
|
|
647
|
+
?.sort((a, b) => (a.priority < b.priority ? 1 : -1))
|
|
648
|
+
?.forEach((group) => {
|
|
649
|
+
this.receiveSlotAllocations.activeSpeaker[group.id] = {slots: []};
|
|
650
|
+
|
|
651
|
+
for (let paneIndex = 0; paneIndex < group.numPanes; paneIndex += 1) {
|
|
652
|
+
// allocate a slot from the "unused" list, by grabbing in same order (shift) as previous layout
|
|
653
|
+
const freeSlot = this.slots.video.unused.shift();
|
|
654
|
+
|
|
655
|
+
if (freeSlot) {
|
|
656
|
+
this.slots.video.activeSpeaker.push(freeSlot);
|
|
657
|
+
this.receiveSlotAllocations.activeSpeaker[group.id].slots.push(freeSlot);
|
|
658
|
+
}
|
|
556
659
|
}
|
|
557
|
-
}
|
|
558
|
-
|
|
660
|
+
});
|
|
661
|
+
}
|
|
559
662
|
|
|
663
|
+
/**
|
|
664
|
+
* Allocates receive slots to all receiver selected video panes
|
|
665
|
+
* in the current selected layout
|
|
666
|
+
*/
|
|
667
|
+
private allocateSlotsToReceiverSelectedVideoPaneGroups() {
|
|
560
668
|
this.currentLayout?.memberVideoPanes?.forEach((memberPane) => {
|
|
561
669
|
// check if there is existing slot for this csi
|
|
562
670
|
const existingSlot = this.slots.video.receiverSelected.find(
|
|
@@ -583,19 +691,15 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
583
691
|
}
|
|
584
692
|
|
|
585
693
|
/**
|
|
586
|
-
*
|
|
587
|
-
* and allocates them to the right video panes / pane groups
|
|
588
|
-
*
|
|
589
|
-
* @returns {Promise}
|
|
694
|
+
* Ensures that we have enough slots for the current layout.
|
|
590
695
|
*/
|
|
591
|
-
private async
|
|
696
|
+
private async refillRequiredSlotsIfNeeded() {
|
|
592
697
|
const requiredNumSlots = this.getRequiredNumVideoSlotsForLayout(this.currentLayout);
|
|
593
698
|
const totalNumSlots =
|
|
594
699
|
this.slots.video.unused.length +
|
|
595
700
|
this.slots.video.activeSpeaker.length +
|
|
596
701
|
this.slots.video.receiverSelected.length;
|
|
597
702
|
|
|
598
|
-
// ensure we have enough total slots for current layout
|
|
599
703
|
if (totalNumSlots < requiredNumSlots) {
|
|
600
704
|
let numSlotsToCreate = requiredNumSlots - totalNumSlots;
|
|
601
705
|
|
|
@@ -603,25 +707,65 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
603
707
|
// eslint-disable-next-line no-await-in-loop
|
|
604
708
|
this.slots.video.unused.push(
|
|
605
709
|
// eslint-disable-next-line no-await-in-loop
|
|
606
|
-
await this.receiveSlotManager.allocateSlot(
|
|
710
|
+
await this.receiveSlotManager.allocateSlot(MediaType.VideoMain)
|
|
607
711
|
);
|
|
608
712
|
numSlotsToCreate -= 1;
|
|
609
713
|
}
|
|
610
714
|
}
|
|
715
|
+
}
|
|
611
716
|
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
717
|
+
/**
|
|
718
|
+
* Move all active speaker slots to "unused"
|
|
719
|
+
*/
|
|
720
|
+
private trimActiveSpeakerSlots() {
|
|
616
721
|
this.slots.video.unused.push(...this.slots.video.activeSpeaker);
|
|
617
722
|
this.slots.video.activeSpeaker.length = 0;
|
|
723
|
+
}
|
|
618
724
|
|
|
619
|
-
|
|
620
|
-
|
|
725
|
+
/**
|
|
726
|
+
* Logs the state of the receive slots
|
|
727
|
+
*/
|
|
728
|
+
private logReceieveSlots() {
|
|
729
|
+
let logMessage = '';
|
|
730
|
+
forEach(this.receiveSlotAllocations.activeSpeaker, (group, groupName) => {
|
|
731
|
+
logMessage += `group: ${groupName}\n${group.slots.map((slot) => slot.logString).join(' ')}`;
|
|
732
|
+
});
|
|
733
|
+
|
|
734
|
+
logMessage += '\nreceiverSelected:\n';
|
|
735
|
+
forEach(this.receiveSlotAllocations.receiverSelected, (slot, key) => {
|
|
736
|
+
logMessage += ` ${key}: ${slot.logString}\n`;
|
|
737
|
+
});
|
|
621
738
|
|
|
622
739
|
LoggerProxy.logger.log(
|
|
623
|
-
`RemoteMediaManager#updateVideoReceiveSlots --> receive slots updated: unused=${this.slots.video.unused.length}, activeSpeaker=${this.slots.video.activeSpeaker.length}, receiverSelected=${this.slots.video.receiverSelected.length}`
|
|
740
|
+
`RemoteMediaManager#updateVideoReceiveSlots --> receive slots updated: unused=${this.slots.video.unused.length}, activeSpeaker=${this.slots.video.activeSpeaker.length}, receiverSelected=${this.slots.video.receiverSelected.length}\n${logMessage}`
|
|
624
741
|
);
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
/**
|
|
745
|
+
* Makes sure we have the right number of receive slots created for the current layout
|
|
746
|
+
* and allocates them to the right video panes / pane groups
|
|
747
|
+
*
|
|
748
|
+
* @returns {Promise}
|
|
749
|
+
*/
|
|
750
|
+
private async updateVideoReceiveSlots() {
|
|
751
|
+
// move all active speaker slots to "unused"
|
|
752
|
+
this.trimActiveSpeakerSlots();
|
|
753
|
+
|
|
754
|
+
// move all no longer needed receiver-selected slots to "unused"
|
|
755
|
+
this.trimReceiverSelectedSlots();
|
|
756
|
+
|
|
757
|
+
// ensure we have enough total slots for current layout
|
|
758
|
+
await this.refillRequiredSlotsIfNeeded();
|
|
759
|
+
|
|
760
|
+
// allocate the slots to the right panes / pane groups
|
|
761
|
+
// reset allocations
|
|
762
|
+
this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};
|
|
763
|
+
// allocate active speaker
|
|
764
|
+
this.allocateSlotsToActiveSpeakerPaneGroups();
|
|
765
|
+
// allocate receiver selected
|
|
766
|
+
this.allocateSlotsToReceiverSelectedVideoPaneGroups();
|
|
767
|
+
|
|
768
|
+
this.logReceieveSlots();
|
|
625
769
|
|
|
626
770
|
// If this is the initial layout, there may be some "unused" slots left because of the preallocation
|
|
627
771
|
// done in this.preallocateVideoReceiveSlots(), so release them now
|
|
@@ -634,7 +778,13 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
634
778
|
*/
|
|
635
779
|
private updateVideoRemoteMediaObjects() {
|
|
636
780
|
// invalidate all the previous remote media objects and cancel their media requests
|
|
637
|
-
this.invalidateCurrentRemoteMedia({
|
|
781
|
+
this.invalidateCurrentRemoteMedia({
|
|
782
|
+
audio: false,
|
|
783
|
+
video: true,
|
|
784
|
+
screenShareAudio: false,
|
|
785
|
+
screenShareVideo: false,
|
|
786
|
+
commit: false,
|
|
787
|
+
});
|
|
638
788
|
|
|
639
789
|
// create new remoteMediaGroup objects
|
|
640
790
|
this.media.video.activeSpeakerGroups = {};
|
|
@@ -689,16 +839,53 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
689
839
|
);
|
|
690
840
|
}
|
|
691
841
|
}
|
|
692
|
-
// todo: screenshare (SPARK-377812)
|
|
693
842
|
|
|
694
843
|
this.mediaRequestManagers.video.commit();
|
|
695
844
|
}
|
|
696
845
|
|
|
846
|
+
/**
|
|
847
|
+
* Checks if current layout requires a screen share.
|
|
848
|
+
* If it does, it creates new RemoteMediaGroup object for screen share
|
|
849
|
+
* and sends the media requests for it.
|
|
850
|
+
* If it doesn't, it makes sure we clean up any RemoteMediaGroup objects
|
|
851
|
+
* created earlier for screen share (for previous layout).
|
|
852
|
+
*/
|
|
853
|
+
private updateScreenShareVideoRemoteMediaObject() {
|
|
854
|
+
this.invalidateCurrentRemoteMedia({
|
|
855
|
+
audio: false,
|
|
856
|
+
video: false,
|
|
857
|
+
screenShareAudio: false,
|
|
858
|
+
screenShareVideo: true,
|
|
859
|
+
commit: false,
|
|
860
|
+
});
|
|
861
|
+
|
|
862
|
+
this.media.screenShare.video = undefined;
|
|
863
|
+
|
|
864
|
+
if (this.currentLayout?.screenShareVideo) {
|
|
865
|
+
// we create a group of 1, because for screen share we need to use the "active speaker" policy
|
|
866
|
+
this.media.screenShare.video = new RemoteMediaGroup(
|
|
867
|
+
this.mediaRequestManagers.screenShareVideo,
|
|
868
|
+
[this.slots.screenShare.video],
|
|
869
|
+
255,
|
|
870
|
+
false,
|
|
871
|
+
{resolution: this.currentLayout.screenShareVideo.size}
|
|
872
|
+
);
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
this.mediaRequestManagers.screenShareVideo.commit();
|
|
876
|
+
}
|
|
877
|
+
|
|
697
878
|
/**
|
|
698
879
|
* Invalidates all remote media objects belonging to currently selected layout
|
|
699
880
|
*/
|
|
700
|
-
private invalidateCurrentRemoteMedia(options: {
|
|
701
|
-
|
|
881
|
+
private invalidateCurrentRemoteMedia(options: {
|
|
882
|
+
audio: boolean;
|
|
883
|
+
video: boolean;
|
|
884
|
+
screenShareAudio: boolean;
|
|
885
|
+
screenShareVideo: boolean;
|
|
886
|
+
commit: boolean;
|
|
887
|
+
}) {
|
|
888
|
+
const {audio, video, screenShareAudio, screenShareVideo, commit} = options;
|
|
702
889
|
|
|
703
890
|
if (audio && this.media.audio) {
|
|
704
891
|
this.media.audio.stop(commit);
|
|
@@ -714,12 +901,19 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
714
901
|
this.mediaRequestManagers.video.commit();
|
|
715
902
|
}
|
|
716
903
|
}
|
|
904
|
+
|
|
905
|
+
if (screenShareAudio && this.media.screenShare.audio) {
|
|
906
|
+
this.media.screenShare.audio.stop(commit);
|
|
907
|
+
}
|
|
908
|
+
if (screenShareVideo && this.media.screenShare.video) {
|
|
909
|
+
this.media.screenShare.video.stop(commit);
|
|
910
|
+
}
|
|
717
911
|
}
|
|
718
912
|
|
|
719
913
|
/** emits Event.VideoLayoutChanged */
|
|
720
914
|
private emitVideoLayoutChangedEvent() {
|
|
721
915
|
// todo: at this point the receive slots might still be showing a participant from previous layout, we should
|
|
722
|
-
// wait for our media requests to be
|
|
916
|
+
// wait for our media requests to be fulfilled, but there is no API for that right now (we could wait for source updates
|
|
723
917
|
// but in some cases they might never come, or would need to always make sure to use a new set of receiver slots)
|
|
724
918
|
// for now it's fine to have it like this, we will re-evaluate if it needs improving after more testing
|
|
725
919
|
|
|
@@ -733,7 +927,7 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
733
927
|
layoutId: this.currentLayoutId,
|
|
734
928
|
activeSpeakerVideoPanes: this.media.video.activeSpeakerGroups,
|
|
735
929
|
memberVideoPanes: this.media.video.memberPanes,
|
|
736
|
-
screenShareVideo:
|
|
930
|
+
screenShareVideo: this.media.screenShare.video?.getRemoteMedia()[0],
|
|
737
931
|
}
|
|
738
932
|
);
|
|
739
933
|
}
|
|
@@ -781,7 +975,7 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
781
975
|
|
|
782
976
|
this.currentLayout.memberVideoPanes.push(newPane);
|
|
783
977
|
|
|
784
|
-
const receiveSlot = await this.receiveSlotManager.allocateSlot(
|
|
978
|
+
const receiveSlot = await this.receiveSlotManager.allocateSlot(MediaType.VideoMain);
|
|
785
979
|
|
|
786
980
|
this.slots.video.receiverSelected.push(receiveSlot);
|
|
787
981
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import EventsScope from '../common/events/events-scope';
|
|
2
|
-
import {EVENT_TRIGGERS
|
|
2
|
+
import {EVENT_TRIGGERS} from '../constants';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
5
|
* Meeting - network quality event
|
|
@@ -49,11 +49,7 @@ export default class NetworkQualityMonitor extends EventsScope {
|
|
|
49
49
|
});
|
|
50
50
|
this.networkQualityScore = 1;
|
|
51
51
|
this.networkQualityStatus = {
|
|
52
|
-
[this.frequencyTypes.UPLINK]: {
|
|
53
|
-
[STATS.VIDEO_CORRELATE]: {},
|
|
54
|
-
[STATS.AUDIO_CORRELATE]: {},
|
|
55
|
-
[STATS.SHARE_CORRELATE]: {},
|
|
56
|
-
},
|
|
52
|
+
[this.frequencyTypes.UPLINK]: {},
|
|
57
53
|
};
|
|
58
54
|
this.mediaType = null;
|
|
59
55
|
}
|
|
@@ -172,6 +168,10 @@ export default class NetworkQualityMonitor extends EventsScope {
|
|
|
172
168
|
const determineIfUndefined = (value: number | undefined) =>
|
|
173
169
|
typeof value === 'undefined' ? null : value;
|
|
174
170
|
|
|
171
|
+
if (!this.networkQualityStatus[UPLINK][mediaType]) {
|
|
172
|
+
this.networkQualityStatus[UPLINK][mediaType] = {};
|
|
173
|
+
}
|
|
174
|
+
|
|
175
175
|
/**
|
|
176
176
|
* Values for some browsers specifically Safari will be undefined we explicitly set to null
|
|
177
177
|
* https://bugs.webkit.org/show_bug.cgi?id=206645
|