@webex/plugin-meetings 3.0.0-beta.13 → 3.0.0-beta.131
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/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 +48 -0
- package/dist/annotation/constants.js.map +1 -0
- package/dist/annotation/index.js +355 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.js +193 -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 +994 -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 +5 -26
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +5 -26
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +6 -27
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +5 -26
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.js +5 -33
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +5 -26
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +4 -25
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reconnection-in-progress.js +0 -17
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.js +5 -26
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +5 -26
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.js +6 -41
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +1 -24
- 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 +35 -61
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +4 -14
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +6 -6
- package/dist/config.js.map +1 -1
- package/dist/constants.js +203 -53
- 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 +294 -0
- package/dist/controls-options-manager/util.js.map +1 -0
- package/dist/index.js +72 -17
- package/dist/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.js +100 -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 +406 -216
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +0 -38
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +54 -38
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +88 -123
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +105 -91
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +55 -165
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +71 -117
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +2 -9
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +505 -495
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +77 -14
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +2603 -2462
- 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 +292 -138
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +315 -336
- 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 +463 -583
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +3 -25
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +10 -33
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +305 -286
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +1 -16
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js +98 -183
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +156 -232
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +24 -20
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +692 -593
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +23 -42
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +186 -155
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +89 -88
- 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 +101 -69
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +12 -12
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +166 -205
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +120 -85
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js +15 -0
- package/dist/members/types.js.map +1 -0
- package/dist/members/util.js +314 -260
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.js +50 -16
- package/dist/metrics/config.js.map +1 -1
- package/dist/metrics/constants.js +4 -7
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +93 -162
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +167 -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 +74 -93
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +55 -74
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +6 -40
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +466 -442
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +32 -59
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +10 -45
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +2 -33
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js +0 -13
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.js +190 -199
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +14 -23
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/constants.js +13 -0
- package/dist/reactions/constants.js.map +1 -0
- package/dist/reactions/reactions.js +2 -4
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.js +19 -23
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.js +326 -465
- 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 +31 -75
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +129 -136
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +143 -103
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js +1 -95
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +369 -461
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +144 -94
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +13 -45
- package/dist/transcription/index.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +35 -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 +78 -0
- package/dist/types/constants.d.ts +993 -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/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 +108 -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 +147 -0
- package/dist/types/meeting/index.d.ts +1762 -0
- package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
- package/dist/types/meeting/muteState.d.ts +186 -0
- package/dist/types/meeting/request.d.ts +269 -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 +76 -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 +345 -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 +157 -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 +101 -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 +263 -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/internal-README.md +7 -6
- package/package.json +28 -21
- package/src/annotation/annotation.types.ts +42 -0
- package/src/annotation/constants.ts +36 -0
- package/src/annotation/index.ts +339 -0
- package/src/breakouts/README.md +220 -0
- package/src/breakouts/breakout.ts +163 -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 +860 -0
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +57 -0
- package/src/common/browser-detection.ts +9 -6
- package/src/common/collection.ts +3 -1
- package/src/common/errors/captcha-error.ts +6 -6
- package/src/common/errors/intent-to-join.ts +6 -6
- package/src/common/errors/join-meeting.ts +12 -8
- package/src/common/errors/media.ts +6 -6
- package/src/common/errors/parameter.ts +9 -6
- package/src/common/errors/password-error.ts +6 -6
- package/src/common/errors/permission.ts +5 -5
- package/src/common/errors/reconnection.ts +6 -6
- package/src/common/errors/stats.ts +6 -6
- package/src/common/errors/webex-errors.ts +7 -5
- package/src/common/errors/webex-meetings-error.ts +1 -1
- package/src/common/events/events-scope.ts +5 -1
- package/src/common/events/events.ts +5 -1
- package/src/common/events/trigger-proxy.ts +8 -3
- package/src/common/events/util.ts +1 -2
- package/src/common/logs/logger-proxy.ts +21 -10
- package/src/common/logs/request.ts +11 -8
- package/src/config.ts +16 -12
- package/src/constants.ts +153 -7
- 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 +281 -0
- package/src/index.ts +33 -0
- package/src/locus-info/controlsUtils.ts +142 -24
- package/src/locus-info/fullState.ts +15 -11
- package/src/locus-info/hostUtils.ts +4 -3
- package/src/locus-info/index.ts +346 -55
- package/src/locus-info/infoUtils.ts +12 -4
- package/src/locus-info/mediaSharesUtils.ts +52 -4
- package/src/locus-info/parser.ts +46 -68
- package/src/locus-info/selfUtils.ts +195 -56
- package/src/media/index.ts +139 -196
- package/src/media/properties.ts +43 -36
- package/src/media/util.ts +1 -1
- package/src/mediaQualityMetrics/config.ts +380 -378
- package/src/meeting/in-meeting-actions.ts +159 -3
- package/src/meeting/index.ts +2803 -1584
- package/src/meeting/locusMediaRequest.ts +309 -0
- package/src/meeting/muteState.ts +290 -72
- package/src/meeting/request.ts +247 -178
- package/src/meeting/request.type.ts +13 -0
- package/src/meeting/state.ts +45 -30
- package/src/meeting/util.ts +445 -395
- package/src/meeting-info/collection.ts +2 -1
- package/src/meeting-info/index.ts +32 -30
- package/src/meeting-info/meeting-info-v2.ts +235 -116
- package/src/meeting-info/request.ts +9 -3
- package/src/meeting-info/util.ts +54 -46
- package/src/meeting-info/utilv2.ts +71 -55
- package/src/meetings/collection.ts +21 -1
- package/src/meetings/index.ts +772 -437
- package/src/meetings/request.ts +29 -25
- package/src/meetings/util.ts +132 -33
- package/src/member/index.ts +95 -49
- package/src/member/types.ts +24 -0
- package/src/member/util.ts +106 -13
- package/src/members/collection.ts +8 -1
- package/src/members/index.ts +288 -130
- package/src/members/request.ts +144 -31
- package/src/members/types.ts +28 -0
- package/src/members/util.ts +316 -235
- package/src/metrics/config.ts +302 -90
- package/src/metrics/constants.ts +2 -6
- package/src/metrics/index.ts +124 -95
- package/src/multistream/mediaRequestManager.ts +203 -45
- package/src/multistream/receiveSlot.ts +69 -26
- package/src/multistream/receiveSlotManager.ts +62 -38
- package/src/multistream/remoteMedia.ts +30 -4
- package/src/multistream/remoteMediaGroup.ts +4 -3
- package/src/multistream/remoteMediaManager.ts +230 -66
- package/src/networkQualityMonitor/index.ts +24 -27
- package/src/personal-meeting-room/index.ts +12 -16
- package/src/personal-meeting-room/request.ts +10 -3
- package/src/personal-meeting-room/util.ts +3 -3
- package/src/reachability/index.ts +131 -79
- package/src/reachability/request.ts +43 -34
- package/src/reactions/constants.ts +4 -0
- package/src/reactions/reactions.ts +8 -8
- package/src/reactions/reactions.type.ts +31 -5
- package/src/reconnection-manager/index.ts +193 -111
- 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 +53 -53
- package/src/roap/request.ts +77 -64
- package/src/roap/turnDiscovery.ts +101 -48
- package/src/statsAnalyzer/global.ts +8 -104
- package/src/statsAnalyzer/index.ts +624 -376
- package/src/statsAnalyzer/mqaUtil.ts +203 -90
- package/src/transcription/index.ts +34 -32
- package/test/integration/spec/converged-space-meetings.js +177 -0
- package/test/integration/spec/journey.js +670 -466
- package/test/integration/spec/space-meeting.js +320 -204
- package/test/integration/spec/transcription.js +7 -8
- package/test/unit/spec/annotation/index.ts +433 -0
- package/test/unit/spec/breakouts/breakout.ts +203 -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 +1609 -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/controls-options-manager/index.js +287 -0
- package/test/unit/spec/controls-options-manager/util.js +504 -0
- package/test/unit/spec/fixture/locus.js +93 -90
- package/test/unit/spec/locus-info/controlsUtils.js +305 -32
- package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
- package/test/unit/spec/locus-info/index.js +636 -5
- package/test/unit/spec/locus-info/infoUtils.js +26 -33
- package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
- package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
- package/test/unit/spec/locus-info/parser.js +3 -9
- package/test/unit/spec/locus-info/selfConstant.js +110 -103
- package/test/unit/spec/locus-info/selfUtils.js +252 -12
- package/test/unit/spec/media/index.ts +104 -8
- package/test/unit/spec/media/properties.ts +9 -9
- package/test/unit/spec/meeting/in-meeting-actions.ts +76 -3
- package/test/unit/spec/meeting/index.js +3112 -921
- package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
- package/test/unit/spec/meeting/muteState.js +421 -94
- package/test/unit/spec/meeting/request.js +421 -79
- package/test/unit/spec/meeting/utils.js +326 -189
- package/test/unit/spec/meeting-info/meetinginfov2.js +481 -76
- package/test/unit/spec/meeting-info/request.js +7 -9
- package/test/unit/spec/meeting-info/util.js +11 -12
- package/test/unit/spec/meeting-info/utilv2.js +131 -74
- package/test/unit/spec/meetings/collection.js +15 -1
- package/test/unit/spec/meetings/index.js +1126 -328
- package/test/unit/spec/meetings/utils.js +220 -14
- package/test/unit/spec/member/index.js +24 -1
- package/test/unit/spec/member/util.js +383 -32
- package/test/unit/spec/members/index.js +424 -55
- package/test/unit/spec/members/request.js +228 -40
- package/test/unit/spec/members/utils.js +191 -4
- package/test/unit/spec/metrics/index.js +113 -20
- package/test/unit/spec/multistream/mediaRequestManager.ts +650 -105
- package/test/unit/spec/multistream/receiveSlot.ts +76 -17
- 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 +5 -5
- package/test/unit/spec/multistream/remoteMediaManager.ts +549 -65
- package/test/unit/spec/networkQualityMonitor/index.js +24 -18
- package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
- package/test/unit/spec/reachability/index.ts +176 -27
- package/test/unit/spec/reachability/request.js +66 -0
- package/test/unit/spec/reconnection-manager/index.js +62 -31
- 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 +19 -49
- package/test/unit/spec/roap/request.ts +187 -0
- package/test/unit/spec/roap/turnDiscovery.ts +92 -50
- package/test/unit/spec/stats-analyzer/index.js +116 -60
- package/test/utils/cmr.js +44 -42
- package/test/utils/constants.js +9 -0
- package/test/utils/integrationTestUtils.js +64 -0
- package/test/utils/testUtils.js +63 -99
- package/test/utils/webex-config.js +22 -18
- package/test/utils/webex-test-users.js +57 -50
- package/tsconfig.json +6 -0
- package/dist/media/internal-media-core-wrapper.js +0 -22
- package/dist/media/internal-media-core-wrapper.js.map +0 -1
- package/dist/meeting/effectsState.js +0 -334
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/multistream/multistreamMedia.js +0 -116
- 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 -92
- package/test/unit/spec/meeting/effectsState.js +0 -291
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
/* eslint-disable valid-jsdoc */
|
|
2
|
+
import {MediaType, StreamState} from '@webex/internal-media-core';
|
|
2
3
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
3
4
|
import EventsScope from '../common/events/events-scope';
|
|
4
5
|
|
|
@@ -56,7 +57,7 @@ export function getMaxFs(paneSize: RemoteVideoResolution): number {
|
|
|
56
57
|
}
|
|
57
58
|
|
|
58
59
|
type Options = {
|
|
59
|
-
resolution?: RemoteVideoResolution; // applies only to groups of type
|
|
60
|
+
resolution?: RemoteVideoResolution; // applies only to groups of type MediaType.VideoMain and MediaType.VideoSlides
|
|
60
61
|
};
|
|
61
62
|
|
|
62
63
|
export type RemoteMediaId = string;
|
|
@@ -101,6 +102,31 @@ export class RemoteMedia extends EventsScope {
|
|
|
101
102
|
this.id = `RM${remoteMediaCounter}-${this.receiveSlot.id}`;
|
|
102
103
|
}
|
|
103
104
|
|
|
105
|
+
/**
|
|
106
|
+
* Supply the width and height of the video element
|
|
107
|
+
* to restrict the requested resolution to this size
|
|
108
|
+
* @param width width of the video element
|
|
109
|
+
* @param height height of the video element
|
|
110
|
+
*/
|
|
111
|
+
public setSizeHint(width, height) {
|
|
112
|
+
// only base on height for now
|
|
113
|
+
let fs: number;
|
|
114
|
+
|
|
115
|
+
if (height < 135) {
|
|
116
|
+
fs = 60;
|
|
117
|
+
} else if (height < 270) {
|
|
118
|
+
fs = 240;
|
|
119
|
+
} else if (height < 540) {
|
|
120
|
+
fs = 920;
|
|
121
|
+
} else if (height <= 720) {
|
|
122
|
+
fs = 3600;
|
|
123
|
+
} else {
|
|
124
|
+
fs = 8192;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
this.receiveSlot?.setMaxFs(fs);
|
|
128
|
+
}
|
|
129
|
+
|
|
104
130
|
/**
|
|
105
131
|
* Invalidates the remote media by clearing the reference to a receive slot and
|
|
106
132
|
* cancelling the media request.
|
|
@@ -109,7 +135,7 @@ export class RemoteMedia extends EventsScope {
|
|
|
109
135
|
* @param {boolean} commit - whether to commit the cancellation of the media request
|
|
110
136
|
* @internal
|
|
111
137
|
*/
|
|
112
|
-
public stop(commit
|
|
138
|
+
public stop(commit = true) {
|
|
113
139
|
this.cancelMediaRequest(commit);
|
|
114
140
|
this.receiveSlot?.removeAllListeners();
|
|
115
141
|
this.receiveSlot = undefined;
|
|
@@ -186,7 +212,7 @@ export class RemoteMedia extends EventsScope {
|
|
|
186
212
|
/**
|
|
187
213
|
* Getter for mediaType
|
|
188
214
|
*/
|
|
189
|
-
public get mediaType() {
|
|
215
|
+
public get mediaType(): MediaType {
|
|
190
216
|
return this.receiveSlot?.mediaType;
|
|
191
217
|
}
|
|
192
218
|
|
|
@@ -207,7 +233,7 @@ export class RemoteMedia extends EventsScope {
|
|
|
207
233
|
/**
|
|
208
234
|
* Getter for source state
|
|
209
235
|
*/
|
|
210
|
-
public get sourceState() {
|
|
236
|
+
public get sourceState(): StreamState {
|
|
211
237
|
return this.receiveSlot?.sourceState;
|
|
212
238
|
}
|
|
213
239
|
|
|
@@ -8,8 +8,8 @@ import {MediaRequestId, MediaRequestManager} from './mediaRequestManager';
|
|
|
8
8
|
import {CSI, ReceiveSlot} from './receiveSlot';
|
|
9
9
|
|
|
10
10
|
type Options = {
|
|
11
|
-
resolution?: RemoteVideoResolution; // applies only to groups of type
|
|
12
|
-
preferLiveVideo?: boolean; // applies only to groups of type
|
|
11
|
+
resolution?: RemoteVideoResolution; // applies only to groups of type MediaType.VideoMain and MediaType.VideoSlides
|
|
12
|
+
preferLiveVideo?: boolean; // applies only to groups of type MediaType.VideoMain and MediaType.VideoSlides
|
|
13
13
|
};
|
|
14
14
|
|
|
15
15
|
export class RemoteMediaGroup {
|
|
@@ -62,6 +62,7 @@ export class RemoteMediaGroup {
|
|
|
62
62
|
// return a shallow copy so that the client cannot modify this.pinnedRemoteMedia array
|
|
63
63
|
return [...this.pinnedRemoteMedia];
|
|
64
64
|
}
|
|
65
|
+
|
|
65
66
|
return [...this.unpinnedRemoteMedia, ...this.pinnedRemoteMedia];
|
|
66
67
|
}
|
|
67
68
|
|
|
@@ -189,7 +190,7 @@ export class RemoteMediaGroup {
|
|
|
189
190
|
* @param{boolean} commit whether to commit the cancellation of media requests
|
|
190
191
|
* @internal
|
|
191
192
|
*/
|
|
192
|
-
public stop(commit
|
|
193
|
+
public stop(commit = true) {
|
|
193
194
|
this.unpinnedRemoteMedia.forEach((remoteMedia) => remoteMedia.stop(false));
|
|
194
195
|
this.pinnedRemoteMedia.forEach((remoteMedia) => remoteMedia.stop(false));
|
|
195
196
|
this.cancelActiveSpeakerMediaRequest(false);
|
|
@@ -1,6 +1,7 @@
|
|
|
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';
|
|
4
5
|
|
|
5
6
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
6
7
|
import EventsScope from '../common/events/events-scope';
|
|
@@ -30,8 +31,8 @@ export interface MemberVideoPane {
|
|
|
30
31
|
}
|
|
31
32
|
|
|
32
33
|
export interface VideoLayout {
|
|
33
|
-
screenShareVideo
|
|
34
|
-
size: PaneSize
|
|
34
|
+
screenShareVideo?: {
|
|
35
|
+
size: PaneSize;
|
|
35
36
|
};
|
|
36
37
|
activeSpeakerVideoPaneGroups?: ActiveSpeakerVideoPaneGroup[]; // list of active speaker video pane groups
|
|
37
38
|
memberVideoPanes?: MemberVideoPane[]; // list of video panes for specific members, CSI values can be changed later via setVideoPaneCsi()
|
|
@@ -40,6 +41,7 @@ export interface VideoLayout {
|
|
|
40
41
|
export interface Configuration {
|
|
41
42
|
audio: {
|
|
42
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
|
|
43
45
|
};
|
|
44
46
|
video: {
|
|
45
47
|
preferLiveVideo: boolean; // applies to all pane groups with active speaker policy
|
|
@@ -47,17 +49,12 @@ export interface Configuration {
|
|
|
47
49
|
|
|
48
50
|
layouts: {[key: LayoutId]: VideoLayout}; // a map of all available layouts, a layout can be set via setLayout() method
|
|
49
51
|
};
|
|
50
|
-
screenShare: {
|
|
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
52
|
}
|
|
55
53
|
|
|
56
54
|
/* Predefined layouts: */
|
|
57
55
|
|
|
58
56
|
// An "all equal" grid, with size up to 3 x 3 = 9:
|
|
59
57
|
const AllEqualLayout: VideoLayout = {
|
|
60
|
-
screenShareVideo: {size: null},
|
|
61
58
|
activeSpeakerVideoPaneGroups: [
|
|
62
59
|
{
|
|
63
60
|
id: 'main',
|
|
@@ -70,7 +67,6 @@ const AllEqualLayout: VideoLayout = {
|
|
|
70
67
|
|
|
71
68
|
// A layout with just a single remote active speaker video pane:
|
|
72
69
|
const SingleLayout: VideoLayout = {
|
|
73
|
-
screenShareVideo: {size: null},
|
|
74
70
|
activeSpeakerVideoPaneGroups: [
|
|
75
71
|
{
|
|
76
72
|
id: 'main',
|
|
@@ -83,7 +79,6 @@ const SingleLayout: VideoLayout = {
|
|
|
83
79
|
|
|
84
80
|
// A layout with 1 big pane for the highest priority active speaker and 5 small panes for other active speakers:
|
|
85
81
|
const OnePlusFiveLayout: VideoLayout = {
|
|
86
|
-
screenShareVideo: {size: null},
|
|
87
82
|
activeSpeakerVideoPaneGroups: [
|
|
88
83
|
{
|
|
89
84
|
id: 'mainBigOne',
|
|
@@ -102,7 +97,6 @@ const OnePlusFiveLayout: VideoLayout = {
|
|
|
102
97
|
|
|
103
98
|
// A layout with 2 big panes for 2 main active speakers and a strip of 6 small panes for other active speakers:
|
|
104
99
|
const TwoMainPlusSixSmallLayout: VideoLayout = {
|
|
105
|
-
screenShareVideo: {size: null},
|
|
106
100
|
activeSpeakerVideoPaneGroups: [
|
|
107
101
|
{
|
|
108
102
|
id: 'mainGroupWith2BigPanes',
|
|
@@ -134,7 +128,6 @@ const RemoteScreenShareWithSmallThumbnailsLayout: VideoLayout = {
|
|
|
134
128
|
|
|
135
129
|
// 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
130
|
const Stage2x2With6ThumbnailsLayout: VideoLayout = {
|
|
137
|
-
screenShareVideo: {size: null},
|
|
138
131
|
activeSpeakerVideoPaneGroups: [
|
|
139
132
|
{
|
|
140
133
|
id: 'thumbnails',
|
|
@@ -160,6 +153,7 @@ const Stage2x2With6ThumbnailsLayout: VideoLayout = {
|
|
|
160
153
|
export const DefaultConfiguration: Configuration = {
|
|
161
154
|
audio: {
|
|
162
155
|
numOfActiveSpeakerStreams: 3,
|
|
156
|
+
numOfScreenShareStreams: 1,
|
|
163
157
|
},
|
|
164
158
|
video: {
|
|
165
159
|
preferLiveVideo: true,
|
|
@@ -173,16 +167,12 @@ export const DefaultConfiguration: Configuration = {
|
|
|
173
167
|
ScreenShareView: RemoteScreenShareWithSmallThumbnailsLayout,
|
|
174
168
|
},
|
|
175
169
|
},
|
|
176
|
-
screenShare: {
|
|
177
|
-
audio: true,
|
|
178
|
-
video: true,
|
|
179
|
-
},
|
|
180
170
|
};
|
|
181
171
|
|
|
182
172
|
export enum Event {
|
|
183
173
|
// events for audio streams
|
|
184
174
|
AudioCreated = 'AudioCreated',
|
|
185
|
-
ScreenShareAudioCreated = '
|
|
175
|
+
ScreenShareAudioCreated = 'ScreenShareAudioCreated',
|
|
186
176
|
|
|
187
177
|
// events for video streams
|
|
188
178
|
VideoLayoutChanged = 'VideoLayoutChanged',
|
|
@@ -199,7 +189,7 @@ export interface VideoLayoutChangedEventData {
|
|
|
199
189
|
export interface Events extends EventMap {
|
|
200
190
|
// audio
|
|
201
191
|
[Event.AudioCreated]: (audio: RemoteMediaGroup) => void;
|
|
202
|
-
[Event.ScreenShareAudioCreated]: (screenShareAudio:
|
|
192
|
+
[Event.ScreenShareAudioCreated]: (screenShareAudio: RemoteMediaGroup) => void;
|
|
203
193
|
|
|
204
194
|
// video
|
|
205
195
|
[Event.VideoLayoutChanged]: (data: VideoLayoutChangedEventData) => void;
|
|
@@ -223,14 +213,18 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
223
213
|
private mediaRequestManagers: {
|
|
224
214
|
audio: MediaRequestManager;
|
|
225
215
|
video: MediaRequestManager;
|
|
216
|
+
screenShareAudio: MediaRequestManager;
|
|
217
|
+
screenShareVideo: MediaRequestManager;
|
|
226
218
|
};
|
|
227
219
|
|
|
228
220
|
private currentLayout?: VideoLayout;
|
|
229
221
|
|
|
230
222
|
private slots: {
|
|
231
223
|
audio: ReceiveSlot[];
|
|
232
|
-
|
|
233
|
-
|
|
224
|
+
screenShare: {
|
|
225
|
+
audio: ReceiveSlot[];
|
|
226
|
+
video?: ReceiveSlot;
|
|
227
|
+
};
|
|
234
228
|
video: {
|
|
235
229
|
unused: ReceiveSlot[];
|
|
236
230
|
activeSpeaker: ReceiveSlot[];
|
|
@@ -246,6 +240,10 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
246
240
|
};
|
|
247
241
|
memberPanes: {[key: PaneId]: RemoteMedia};
|
|
248
242
|
};
|
|
243
|
+
screenShare: {
|
|
244
|
+
audio?: RemoteMediaGroup;
|
|
245
|
+
video?: RemoteMediaGroup;
|
|
246
|
+
};
|
|
249
247
|
};
|
|
250
248
|
|
|
251
249
|
private receiveSlotAllocations: {
|
|
@@ -267,6 +265,8 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
267
265
|
mediaRequestManagers: {
|
|
268
266
|
audio: MediaRequestManager;
|
|
269
267
|
video: MediaRequestManager;
|
|
268
|
+
screenShareAudio: MediaRequestManager;
|
|
269
|
+
screenShareVideo: MediaRequestManager;
|
|
270
270
|
},
|
|
271
271
|
config: Configuration = DefaultConfiguration
|
|
272
272
|
) {
|
|
@@ -281,14 +281,20 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
281
281
|
activeSpeakerGroups: {},
|
|
282
282
|
memberPanes: {},
|
|
283
283
|
},
|
|
284
|
+
screenShare: {
|
|
285
|
+
audio: undefined,
|
|
286
|
+
video: undefined,
|
|
287
|
+
},
|
|
284
288
|
};
|
|
285
289
|
|
|
286
290
|
this.checkConfigValidity();
|
|
287
291
|
|
|
288
292
|
this.slots = {
|
|
289
293
|
audio: [],
|
|
290
|
-
|
|
291
|
-
|
|
294
|
+
screenShare: {
|
|
295
|
+
audio: [],
|
|
296
|
+
video: undefined,
|
|
297
|
+
},
|
|
292
298
|
video: {
|
|
293
299
|
unused: [],
|
|
294
300
|
activeSpeaker: [],
|
|
@@ -359,8 +365,8 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
359
365
|
|
|
360
366
|
await this.createAudioMedia();
|
|
361
367
|
|
|
362
|
-
|
|
363
|
-
|
|
368
|
+
await this.createScreenShareReceiveSlots();
|
|
369
|
+
this.createScreenShareAudioMedia();
|
|
364
370
|
|
|
365
371
|
await this.preallocateVideoReceiveSlots();
|
|
366
372
|
|
|
@@ -373,14 +379,27 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
373
379
|
*/
|
|
374
380
|
public stop() {
|
|
375
381
|
// invalidate all remoteMedia objects
|
|
376
|
-
this.invalidateCurrentRemoteMedia({
|
|
382
|
+
this.invalidateCurrentRemoteMedia({
|
|
383
|
+
audio: true,
|
|
384
|
+
video: true,
|
|
385
|
+
screenShareAudio: true,
|
|
386
|
+
screenShareVideo: true,
|
|
387
|
+
commit: true,
|
|
388
|
+
});
|
|
377
389
|
|
|
378
390
|
// release all audio receive slots
|
|
379
391
|
this.slots.audio.forEach((slot) => this.receiveSlotManager.releaseSlot(slot));
|
|
380
392
|
this.slots.audio.length = 0;
|
|
381
393
|
|
|
382
|
-
//
|
|
394
|
+
// release screen share slots
|
|
395
|
+
this.slots.screenShare.audio.forEach((slot) => this.receiveSlotManager.releaseSlot(slot));
|
|
396
|
+
this.slots.screenShare.audio.length = 0;
|
|
397
|
+
if (this.slots.screenShare.video) {
|
|
398
|
+
this.receiveSlotManager.releaseSlot(this.slots.screenShare.video);
|
|
399
|
+
this.slots.screenShare.video = undefined;
|
|
400
|
+
}
|
|
383
401
|
|
|
402
|
+
// release video slots
|
|
384
403
|
this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};
|
|
385
404
|
|
|
386
405
|
this.slots.video.unused.push(...this.slots.video.activeSpeaker);
|
|
@@ -432,7 +451,8 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
432
451
|
while (this.slots.video.unused.length < maxNumVideoPanesRequired) {
|
|
433
452
|
// eslint-disable-next-line no-await-in-loop
|
|
434
453
|
this.slots.video.unused.push(
|
|
435
|
-
await
|
|
454
|
+
// eslint-disable-next-line no-await-in-loop
|
|
455
|
+
await this.receiveSlotManager.allocateSlot(MediaType.VideoMain)
|
|
436
456
|
);
|
|
437
457
|
}
|
|
438
458
|
}
|
|
@@ -457,6 +477,7 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
457
477
|
|
|
458
478
|
await this.updateVideoReceiveSlots();
|
|
459
479
|
this.updateVideoRemoteMediaObjects();
|
|
480
|
+
this.updateScreenShareVideoRemoteMediaObject();
|
|
460
481
|
this.emitVideoLayoutChangedEvent();
|
|
461
482
|
}
|
|
462
483
|
|
|
@@ -476,7 +497,7 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
476
497
|
// create the audio receive slots
|
|
477
498
|
for (let i = 0; i < this.config.audio.numOfActiveSpeakerStreams; i += 1) {
|
|
478
499
|
// eslint-disable-next-line no-await-in-loop
|
|
479
|
-
const slot = await this.receiveSlotManager.allocateSlot(
|
|
500
|
+
const slot = await this.receiveSlotManager.allocateSlot(MediaType.AudioMain);
|
|
480
501
|
|
|
481
502
|
this.slots.audio.push(slot);
|
|
482
503
|
}
|
|
@@ -496,6 +517,50 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
496
517
|
);
|
|
497
518
|
}
|
|
498
519
|
|
|
520
|
+
/**
|
|
521
|
+
* Creates receive slots required for receiving screen share audio and video
|
|
522
|
+
*/
|
|
523
|
+
private async createScreenShareReceiveSlots() {
|
|
524
|
+
// audio
|
|
525
|
+
for (let i = 0; i < this.config.audio.numOfScreenShareStreams; i += 1) {
|
|
526
|
+
// eslint-disable-next-line no-await-in-loop
|
|
527
|
+
const slot = await this.receiveSlotManager.allocateSlot(MediaType.AudioSlides);
|
|
528
|
+
|
|
529
|
+
this.slots.screenShare.audio.push(slot);
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
// video
|
|
533
|
+
const isAnyLayoutContainingScreenShareVideo = Object.values(this.config.video.layouts).some(
|
|
534
|
+
(layout) => !!layout.screenShareVideo
|
|
535
|
+
);
|
|
536
|
+
|
|
537
|
+
if (isAnyLayoutContainingScreenShareVideo) {
|
|
538
|
+
this.slots.screenShare.video = await this.receiveSlotManager.allocateSlot(
|
|
539
|
+
MediaType.VideoSlides
|
|
540
|
+
);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
/**
|
|
545
|
+
* Creates RemoteMedia objects for screen share
|
|
546
|
+
*/
|
|
547
|
+
private createScreenShareAudioMedia() {
|
|
548
|
+
if (this.slots.screenShare.audio.length > 0) {
|
|
549
|
+
this.media.screenShare.audio = new RemoteMediaGroup(
|
|
550
|
+
this.mediaRequestManagers.screenShareAudio,
|
|
551
|
+
this.slots.screenShare.audio,
|
|
552
|
+
255,
|
|
553
|
+
true
|
|
554
|
+
);
|
|
555
|
+
|
|
556
|
+
this.emit(
|
|
557
|
+
{file: 'multistream/remoteMediaManager', function: 'createScreenShareAudioMedia'},
|
|
558
|
+
Event.ScreenShareAudioCreated,
|
|
559
|
+
this.media.screenShare.audio
|
|
560
|
+
);
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
|
|
499
564
|
/**
|
|
500
565
|
* Goes over all receiver-selected slots and keeps only the ones that are required by a given layout,
|
|
501
566
|
* the rest are all moved to the "unused" list
|
|
@@ -536,25 +601,37 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
536
601
|
}
|
|
537
602
|
|
|
538
603
|
/**
|
|
539
|
-
* Allocates receive slots to all video panes
|
|
604
|
+
* Allocates receive slots to all active speaker video panes
|
|
605
|
+
* in the current selected layout.
|
|
606
|
+
*
|
|
607
|
+
* Allocation tries to keep the same order of the slots between the previous
|
|
608
|
+
* layout and the new one. Sorting helps making sure that highest priority slots
|
|
609
|
+
* go in the same order in the new layout.
|
|
540
610
|
*/
|
|
541
|
-
private
|
|
542
|
-
this.
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
611
|
+
private allocateSlotsToActiveSpeakerPaneGroups() {
|
|
612
|
+
this.currentLayout?.activeSpeakerVideoPaneGroups
|
|
613
|
+
// sorting in descending order based on group priority
|
|
614
|
+
?.sort((a, b) => (a.priority < b.priority ? 1 : -1))
|
|
615
|
+
?.forEach((group) => {
|
|
616
|
+
this.receiveSlotAllocations.activeSpeaker[group.id] = {slots: []};
|
|
617
|
+
|
|
618
|
+
for (let paneIndex = 0; paneIndex < group.numPanes; paneIndex += 1) {
|
|
619
|
+
// allocate a slot from the "unused" list, by grabbing in same order (shift) as previous layout
|
|
620
|
+
const freeSlot = this.slots.video.unused.shift();
|
|
621
|
+
|
|
622
|
+
if (freeSlot) {
|
|
623
|
+
this.slots.video.activeSpeaker.push(freeSlot);
|
|
624
|
+
this.receiveSlotAllocations.activeSpeaker[group.id].slots.push(freeSlot);
|
|
625
|
+
}
|
|
554
626
|
}
|
|
555
|
-
}
|
|
556
|
-
|
|
627
|
+
});
|
|
628
|
+
}
|
|
557
629
|
|
|
630
|
+
/**
|
|
631
|
+
* Allocates receive slots to all receiver selected video panes
|
|
632
|
+
* in the current selected layout
|
|
633
|
+
*/
|
|
634
|
+
private allocateSlotsToReceiverSelectedVideoPaneGroups() {
|
|
558
635
|
this.currentLayout?.memberVideoPanes?.forEach((memberPane) => {
|
|
559
636
|
// check if there is existing slot for this csi
|
|
560
637
|
const existingSlot = this.slots.video.receiverSelected.find(
|
|
@@ -581,44 +658,81 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
581
658
|
}
|
|
582
659
|
|
|
583
660
|
/**
|
|
584
|
-
*
|
|
585
|
-
* and allocates them to the right video panes / pane groups
|
|
586
|
-
*
|
|
587
|
-
* @returns {Promise}
|
|
661
|
+
* Ensures that we have enough slots for the current layout.
|
|
588
662
|
*/
|
|
589
|
-
private async
|
|
663
|
+
private async refillRequiredSlotsIfNeeded() {
|
|
590
664
|
const requiredNumSlots = this.getRequiredNumVideoSlotsForLayout(this.currentLayout);
|
|
591
665
|
const totalNumSlots =
|
|
592
666
|
this.slots.video.unused.length +
|
|
593
667
|
this.slots.video.activeSpeaker.length +
|
|
594
668
|
this.slots.video.receiverSelected.length;
|
|
595
669
|
|
|
596
|
-
// ensure we have enough total slots for current layout
|
|
597
670
|
if (totalNumSlots < requiredNumSlots) {
|
|
598
671
|
let numSlotsToCreate = requiredNumSlots - totalNumSlots;
|
|
599
672
|
|
|
600
673
|
while (numSlotsToCreate > 0) {
|
|
601
674
|
// eslint-disable-next-line no-await-in-loop
|
|
602
675
|
this.slots.video.unused.push(
|
|
603
|
-
await
|
|
676
|
+
// eslint-disable-next-line no-await-in-loop
|
|
677
|
+
await this.receiveSlotManager.allocateSlot(MediaType.VideoMain)
|
|
604
678
|
);
|
|
605
679
|
numSlotsToCreate -= 1;
|
|
606
680
|
}
|
|
607
681
|
}
|
|
682
|
+
}
|
|
608
683
|
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
684
|
+
/**
|
|
685
|
+
* Move all active speaker slots to "unused"
|
|
686
|
+
*/
|
|
687
|
+
private trimActiveSpeakerSlots() {
|
|
613
688
|
this.slots.video.unused.push(...this.slots.video.activeSpeaker);
|
|
614
689
|
this.slots.video.activeSpeaker.length = 0;
|
|
690
|
+
}
|
|
615
691
|
|
|
616
|
-
|
|
617
|
-
|
|
692
|
+
/**
|
|
693
|
+
* Logs the state of the receive slots
|
|
694
|
+
*/
|
|
695
|
+
private logReceieveSlots() {
|
|
696
|
+
let logMessage = '';
|
|
697
|
+
forEach(this.receiveSlotAllocations.activeSpeaker, (group, groupName) => {
|
|
698
|
+
logMessage += `group: ${groupName}\n${group.slots.map((slot) => slot.logString).join(' ')}`;
|
|
699
|
+
});
|
|
700
|
+
|
|
701
|
+
logMessage += '\nreceiverSelected:\n';
|
|
702
|
+
forEach(this.receiveSlotAllocations.receiverSelected, (slot, key) => {
|
|
703
|
+
logMessage += ` ${key}: ${slot.logString}\n`;
|
|
704
|
+
});
|
|
618
705
|
|
|
619
706
|
LoggerProxy.logger.log(
|
|
620
|
-
`RemoteMediaManager#updateVideoReceiveSlots --> receive slots updated: unused=${this.slots.video.unused.length}, activeSpeaker=${this.slots.video.activeSpeaker.length}, receiverSelected=${this.slots.video.receiverSelected.length}`
|
|
707
|
+
`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}`
|
|
621
708
|
);
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
/**
|
|
712
|
+
* Makes sure we have the right number of receive slots created for the current layout
|
|
713
|
+
* and allocates them to the right video panes / pane groups
|
|
714
|
+
*
|
|
715
|
+
* @returns {Promise}
|
|
716
|
+
*/
|
|
717
|
+
private async updateVideoReceiveSlots() {
|
|
718
|
+
// move all active speaker slots to "unused"
|
|
719
|
+
this.trimActiveSpeakerSlots();
|
|
720
|
+
|
|
721
|
+
// move all no longer needed receiver-selected slots to "unused"
|
|
722
|
+
this.trimReceiverSelectedSlots();
|
|
723
|
+
|
|
724
|
+
// ensure we have enough total slots for current layout
|
|
725
|
+
await this.refillRequiredSlotsIfNeeded();
|
|
726
|
+
|
|
727
|
+
// allocate the slots to the right panes / pane groups
|
|
728
|
+
// reset allocations
|
|
729
|
+
this.receiveSlotAllocations = {activeSpeaker: {}, receiverSelected: {}};
|
|
730
|
+
// allocate active speaker
|
|
731
|
+
this.allocateSlotsToActiveSpeakerPaneGroups();
|
|
732
|
+
// allocate receiver selected
|
|
733
|
+
this.allocateSlotsToReceiverSelectedVideoPaneGroups();
|
|
734
|
+
|
|
735
|
+
this.logReceieveSlots();
|
|
622
736
|
|
|
623
737
|
// If this is the initial layout, there may be some "unused" slots left because of the preallocation
|
|
624
738
|
// done in this.preallocateVideoReceiveSlots(), so release them now
|
|
@@ -631,7 +745,13 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
631
745
|
*/
|
|
632
746
|
private updateVideoRemoteMediaObjects() {
|
|
633
747
|
// invalidate all the previous remote media objects and cancel their media requests
|
|
634
|
-
this.invalidateCurrentRemoteMedia({
|
|
748
|
+
this.invalidateCurrentRemoteMedia({
|
|
749
|
+
audio: false,
|
|
750
|
+
video: true,
|
|
751
|
+
screenShareAudio: false,
|
|
752
|
+
screenShareVideo: false,
|
|
753
|
+
commit: false,
|
|
754
|
+
});
|
|
635
755
|
|
|
636
756
|
// create new remoteMediaGroup objects
|
|
637
757
|
this.media.video.activeSpeakerGroups = {};
|
|
@@ -686,16 +806,53 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
686
806
|
);
|
|
687
807
|
}
|
|
688
808
|
}
|
|
689
|
-
// todo: screenshare (SPARK-377812)
|
|
690
809
|
|
|
691
810
|
this.mediaRequestManagers.video.commit();
|
|
692
811
|
}
|
|
693
812
|
|
|
813
|
+
/**
|
|
814
|
+
* Checks if current layout requires a screen share.
|
|
815
|
+
* If it does, it creates new RemoteMediaGroup object for screen share
|
|
816
|
+
* and sends the media requests for it.
|
|
817
|
+
* If it doesn't, it makes sure we clean up any RemoteMediaGroup objects
|
|
818
|
+
* created earlier for screen share (for previous layout).
|
|
819
|
+
*/
|
|
820
|
+
private updateScreenShareVideoRemoteMediaObject() {
|
|
821
|
+
this.invalidateCurrentRemoteMedia({
|
|
822
|
+
audio: false,
|
|
823
|
+
video: false,
|
|
824
|
+
screenShareAudio: false,
|
|
825
|
+
screenShareVideo: true,
|
|
826
|
+
commit: false,
|
|
827
|
+
});
|
|
828
|
+
|
|
829
|
+
this.media.screenShare.video = undefined;
|
|
830
|
+
|
|
831
|
+
if (this.currentLayout?.screenShareVideo) {
|
|
832
|
+
// we create a group of 1, because for screen share we need to use the "active speaker" policy
|
|
833
|
+
this.media.screenShare.video = new RemoteMediaGroup(
|
|
834
|
+
this.mediaRequestManagers.screenShareVideo,
|
|
835
|
+
[this.slots.screenShare.video],
|
|
836
|
+
255,
|
|
837
|
+
false,
|
|
838
|
+
{resolution: this.currentLayout.screenShareVideo.size}
|
|
839
|
+
);
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
this.mediaRequestManagers.screenShareVideo.commit();
|
|
843
|
+
}
|
|
844
|
+
|
|
694
845
|
/**
|
|
695
846
|
* Invalidates all remote media objects belonging to currently selected layout
|
|
696
847
|
*/
|
|
697
|
-
private invalidateCurrentRemoteMedia(options: {
|
|
698
|
-
|
|
848
|
+
private invalidateCurrentRemoteMedia(options: {
|
|
849
|
+
audio: boolean;
|
|
850
|
+
video: boolean;
|
|
851
|
+
screenShareAudio: boolean;
|
|
852
|
+
screenShareVideo: boolean;
|
|
853
|
+
commit: boolean;
|
|
854
|
+
}) {
|
|
855
|
+
const {audio, video, screenShareAudio, screenShareVideo, commit} = options;
|
|
699
856
|
|
|
700
857
|
if (audio && this.media.audio) {
|
|
701
858
|
this.media.audio.stop(commit);
|
|
@@ -711,12 +868,19 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
711
868
|
this.mediaRequestManagers.video.commit();
|
|
712
869
|
}
|
|
713
870
|
}
|
|
871
|
+
|
|
872
|
+
if (screenShareAudio && this.media.screenShare.audio) {
|
|
873
|
+
this.media.screenShare.audio.stop(commit);
|
|
874
|
+
}
|
|
875
|
+
if (screenShareVideo && this.media.screenShare.video) {
|
|
876
|
+
this.media.screenShare.video.stop(commit);
|
|
877
|
+
}
|
|
714
878
|
}
|
|
715
879
|
|
|
716
880
|
/** emits Event.VideoLayoutChanged */
|
|
717
881
|
private emitVideoLayoutChangedEvent() {
|
|
718
882
|
// 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
|
|
883
|
+
// wait for our media requests to be fulfilled, but there is no API for that right now (we could wait for source updates
|
|
720
884
|
// but in some cases they might never come, or would need to always make sure to use a new set of receiver slots)
|
|
721
885
|
// for now it's fine to have it like this, we will re-evaluate if it needs improving after more testing
|
|
722
886
|
|
|
@@ -730,7 +894,7 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
730
894
|
layoutId: this.currentLayoutId,
|
|
731
895
|
activeSpeakerVideoPanes: this.media.video.activeSpeakerGroups,
|
|
732
896
|
memberVideoPanes: this.media.video.memberPanes,
|
|
733
|
-
screenShareVideo:
|
|
897
|
+
screenShareVideo: this.media.screenShare.video?.getRemoteMedia()[0],
|
|
734
898
|
}
|
|
735
899
|
);
|
|
736
900
|
}
|
|
@@ -778,7 +942,7 @@ export class RemoteMediaManager extends EventsScope {
|
|
|
778
942
|
|
|
779
943
|
this.currentLayout.memberVideoPanes.push(newPane);
|
|
780
944
|
|
|
781
|
-
const receiveSlot = await this.receiveSlotManager.allocateSlot(
|
|
945
|
+
const receiveSlot = await this.receiveSlotManager.allocateSlot(MediaType.VideoMain);
|
|
782
946
|
|
|
783
947
|
this.slots.video.receiverSelected.push(receiveSlot);
|
|
784
948
|
|