@webex/plugin-meetings 3.0.0-beta.21 → 3.0.0-beta.211
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -7
- package/dist/annotation/annotation.types.js +7 -0
- package/dist/annotation/annotation.types.js.map +1 -0
- package/dist/annotation/constants.js +49 -0
- package/dist/annotation/constants.js.map +1 -0
- package/dist/annotation/index.js +342 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.js +114 -14
- package/dist/breakouts/breakout.js.map +1 -1
- package/dist/breakouts/edit-lock-error.js +52 -0
- package/dist/breakouts/edit-lock-error.js.map +1 -0
- package/dist/breakouts/events.js +45 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.js +841 -19
- package/dist/breakouts/index.js.map +1 -1
- 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/common/queue.js +24 -9
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +3 -8
- package/dist/config.js.map +1 -1
- package/dist/constants.js +179 -30
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.js +14 -0
- package/dist/controls-options-manager/constants.js.map +1 -0
- package/dist/controls-options-manager/enums.js +27 -0
- package/dist/controls-options-manager/enums.js.map +1 -0
- package/dist/controls-options-manager/index.js +297 -0
- package/dist/controls-options-manager/index.js.map +1 -0
- package/dist/controls-options-manager/types.js +7 -0
- package/dist/controls-options-manager/types.js.map +1 -0
- package/dist/controls-options-manager/util.js +319 -0
- package/dist/controls-options-manager/util.js.map +1 -0
- package/dist/index.js +106 -1
- package/dist/index.js.map +1 -1
- package/dist/interpretation/collection.js +23 -0
- package/dist/interpretation/collection.js.map +1 -0
- package/dist/interpretation/index.js +366 -0
- package/dist/interpretation/index.js.map +1 -0
- package/dist/interpretation/siLanguage.js +25 -0
- package/dist/interpretation/siLanguage.js.map +1 -0
- package/dist/locus-info/controlsUtils.js +91 -2
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +359 -64
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +7 -1
- package/dist/locus-info/infoUtils.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 +219 -63
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +89 -14
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +48 -135
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +29 -90
- 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 +90 -2
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +2770 -2547
- 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 +199 -193
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +532 -414
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/index.js +48 -7
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +171 -51
- 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 +357 -66
- 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 +2 -0
- 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 +49 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +25 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +121 -25
- 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 +86 -5
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +106 -38
- 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/constants.js +3 -5
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +1 -468
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +238 -49
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +49 -16
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +52 -34
- 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 +173 -59
- 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 +72 -27
- 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/reconnection-manager/index.js +196 -155
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/index.js +21 -2
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.js +9 -8
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/index.js +21 -29
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +110 -89
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +93 -36
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/rtcMetrics/constants.js +12 -0
- package/dist/rtcMetrics/constants.js.map +1 -0
- package/dist/rtcMetrics/index.js +117 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/statsAnalyzer/global.js +1 -93
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +326 -311
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +90 -53
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +42 -0
- package/dist/types/annotation/constants.d.ts +31 -0
- package/dist/types/annotation/index.d.ts +117 -0
- package/dist/types/breakouts/breakout.d.ts +8 -0
- package/dist/types/breakouts/collection.d.ts +5 -0
- package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/types/breakouts/events.d.ts +8 -0
- package/dist/types/breakouts/index.d.ts +5 -0
- package/dist/types/breakouts/request.d.ts +22 -0
- package/dist/types/breakouts/utils.d.ts +15 -0
- package/dist/types/common/browser-detection.d.ts +9 -0
- package/dist/types/common/collection.d.ts +48 -0
- package/dist/types/common/config.d.ts +2 -0
- package/dist/types/common/errors/captcha-error.d.ts +15 -0
- package/dist/types/common/errors/intent-to-join.d.ts +16 -0
- package/dist/types/common/errors/join-meeting.d.ts +17 -0
- package/dist/types/common/errors/media.d.ts +15 -0
- package/dist/types/common/errors/parameter.d.ts +15 -0
- package/dist/types/common/errors/password-error.d.ts +15 -0
- package/dist/types/common/errors/permission.d.ts +14 -0
- package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
- package/dist/types/common/errors/reconnection.d.ts +15 -0
- package/dist/types/common/errors/stats.d.ts +15 -0
- package/dist/types/common/errors/webex-errors.d.ts +69 -0
- package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
- package/dist/types/common/events/events-scope.d.ts +17 -0
- package/dist/types/common/events/events.d.ts +12 -0
- package/dist/types/common/events/trigger-proxy.d.ts +2 -0
- package/dist/types/common/events/util.d.ts +2 -0
- package/dist/types/common/logs/logger-config.d.ts +2 -0
- package/dist/types/common/logs/logger-proxy.d.ts +2 -0
- package/dist/types/common/logs/request.d.ts +34 -0
- package/dist/types/common/queue.d.ts +34 -0
- package/dist/types/config.d.ts +72 -0
- package/dist/types/constants.d.ts +1020 -0
- package/dist/types/controls-options-manager/constants.d.ts +4 -0
- package/dist/types/controls-options-manager/enums.d.ts +15 -0
- package/dist/types/controls-options-manager/index.d.ts +136 -0
- package/dist/types/controls-options-manager/types.d.ts +43 -0
- package/dist/types/controls-options-manager/util.d.ts +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/interpretation/collection.d.ts +5 -0
- package/dist/types/interpretation/index.d.ts +5 -0
- package/dist/types/interpretation/siLanguage.d.ts +5 -0
- package/dist/types/locus-info/controlsUtils.d.ts +2 -0
- package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
- package/dist/types/locus-info/fullState.d.ts +2 -0
- package/dist/types/locus-info/hostUtils.d.ts +2 -0
- package/dist/types/locus-info/index.d.ts +322 -0
- package/dist/types/locus-info/infoUtils.d.ts +2 -0
- package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
- package/dist/types/locus-info/parser.d.ts +271 -0
- package/dist/types/locus-info/selfUtils.d.ts +2 -0
- package/dist/types/media/index.d.ts +34 -0
- package/dist/types/media/properties.d.ts +93 -0
- package/dist/types/media/util.d.ts +2 -0
- package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +163 -0
- package/dist/types/meeting/index.d.ts +1482 -0
- package/dist/types/meeting/locusMediaRequest.d.ts +72 -0
- package/dist/types/meeting/muteState.d.ts +184 -0
- package/dist/types/meeting/request.d.ts +257 -0
- package/dist/types/meeting/request.type.d.ts +11 -0
- package/dist/types/meeting/state.d.ts +9 -0
- package/dist/types/meeting/util.d.ts +79 -0
- package/dist/types/meeting-info/collection.d.ts +20 -0
- package/dist/types/meeting-info/index.d.ts +62 -0
- package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
- package/dist/types/meeting-info/request.d.ts +22 -0
- package/dist/types/meeting-info/util.d.ts +2 -0
- package/dist/types/meeting-info/utilv2.d.ts +2 -0
- package/dist/types/meetings/collection.d.ts +31 -0
- package/dist/types/meetings/index.d.ts +367 -0
- package/dist/types/meetings/meetings.types.d.ts +4 -0
- package/dist/types/meetings/request.d.ts +27 -0
- package/dist/types/meetings/util.d.ts +18 -0
- package/dist/types/member/index.d.ts +159 -0
- package/dist/types/member/types.d.ts +32 -0
- package/dist/types/member/util.d.ts +2 -0
- package/dist/types/members/collection.d.ts +29 -0
- package/dist/types/members/index.d.ts +353 -0
- package/dist/types/members/request.d.ts +114 -0
- package/dist/types/members/types.d.ts +24 -0
- package/dist/types/members/util.d.ts +210 -0
- package/dist/types/metrics/constants.d.ts +55 -0
- package/dist/types/metrics/index.d.ts +45 -0
- package/dist/types/multistream/mediaRequestManager.d.ts +118 -0
- package/dist/types/multistream/receiveSlot.d.ts +68 -0
- package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
- package/dist/types/multistream/remoteMedia.d.ts +72 -0
- package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
- package/dist/types/multistream/remoteMediaManager.d.ts +277 -0
- package/dist/types/networkQualityMonitor/index.d.ts +70 -0
- package/dist/types/personal-meeting-room/index.d.ts +47 -0
- package/dist/types/personal-meeting-room/request.d.ts +14 -0
- package/dist/types/personal-meeting-room/util.d.ts +2 -0
- package/dist/types/reachability/index.d.ts +152 -0
- package/dist/types/reachability/request.d.ts +37 -0
- package/dist/types/reactions/constants.d.ts +3 -0
- package/dist/types/reactions/reactions.d.ts +4 -0
- package/dist/types/reactions/reactions.type.d.ts +52 -0
- package/dist/types/reconnection-manager/index.d.ts +126 -0
- package/dist/types/recording-controller/enums.d.ts +7 -0
- package/dist/types/recording-controller/index.d.ts +207 -0
- package/dist/types/recording-controller/util.d.ts +14 -0
- package/dist/types/roap/index.d.ts +77 -0
- package/dist/types/roap/request.d.ts +36 -0
- package/dist/types/roap/turnDiscovery.d.ts +91 -0
- package/dist/types/rtcMetrics/constants.d.ts +4 -0
- package/dist/types/rtcMetrics/index.d.ts +46 -0
- package/dist/types/statsAnalyzer/global.d.ts +36 -0
- package/dist/types/statsAnalyzer/index.d.ts +200 -0
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
- package/dist/types/transcription/index.d.ts +64 -0
- package/package.json +23 -20
- package/src/annotation/annotation.types.ts +50 -0
- package/src/annotation/constants.ts +36 -0
- package/src/annotation/index.ts +328 -0
- package/src/breakouts/README.md +44 -14
- package/src/breakouts/breakout.ts +87 -9
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +710 -10
- 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/common/queue.ts +22 -8
- package/src/config.ts +2 -7
- package/src/constants.ts +165 -21
- package/src/controls-options-manager/constants.ts +5 -0
- package/src/controls-options-manager/enums.ts +18 -0
- package/src/controls-options-manager/index.ts +278 -0
- package/src/controls-options-manager/types.ts +59 -0
- package/src/controls-options-manager/util.ts +300 -0
- package/src/index.ts +39 -0
- package/src/interpretation/README.md +60 -0
- package/src/interpretation/collection.ts +19 -0
- package/src/interpretation/index.ts +332 -0
- package/src/interpretation/siLanguage.ts +18 -0
- package/src/locus-info/controlsUtils.ts +108 -0
- package/src/locus-info/index.ts +383 -61
- package/src/locus-info/infoUtils.ts +10 -2
- package/src/locus-info/mediaSharesUtils.ts +48 -0
- package/src/locus-info/parser.ts +224 -39
- package/src/locus-info/selfUtils.ts +81 -5
- package/src/media/index.ts +87 -140
- package/src/media/properties.ts +49 -90
- package/src/mediaQualityMetrics/config.ts +379 -377
- package/src/meeting/in-meeting-actions.ts +179 -3
- package/src/meeting/index.ts +2099 -2083
- package/src/meeting/locusMediaRequest.ts +311 -0
- package/src/meeting/muteState.ts +228 -132
- package/src/meeting/request.ts +105 -115
- package/src/meeting/util.ts +511 -397
- package/src/meeting-info/index.ts +54 -8
- package/src/meeting-info/meeting-info-v2.ts +148 -14
- package/src/meeting-info/utilv2.ts +13 -3
- package/src/meetings/collection.ts +20 -0
- package/src/meetings/index.ts +392 -84
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +2 -0
- package/src/meetings/util.ts +103 -4
- package/src/member/index.ts +49 -0
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +127 -25
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +107 -6
- package/src/members/request.ts +97 -17
- package/src/members/types.ts +28 -0
- package/src/members/util.ts +319 -240
- package/src/metrics/constants.ts +2 -4
- package/src/metrics/index.ts +1 -490
- package/src/multistream/mediaRequestManager.ts +289 -79
- package/src/multistream/receiveSlot.ts +55 -18
- package/src/multistream/receiveSlotManager.ts +46 -24
- package/src/multistream/remoteMedia.ts +27 -2
- package/src/multistream/remoteMediaGroup.ts +59 -0
- package/src/multistream/remoteMediaManager.ts +113 -32
- package/src/networkQualityMonitor/index.ts +6 -6
- package/src/reachability/index.ts +62 -15
- package/src/reachability/request.ts +10 -5
- package/src/reconnection-manager/index.ts +68 -43
- package/src/recording-controller/index.ts +20 -3
- package/src/recording-controller/util.ts +26 -9
- package/src/roap/index.ts +21 -30
- package/src/roap/request.ts +101 -95
- package/src/roap/turnDiscovery.ts +47 -25
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +100 -0
- package/src/statsAnalyzer/global.ts +1 -94
- package/src/statsAnalyzer/index.ts +376 -386
- package/src/statsAnalyzer/mqaUtil.ts +100 -99
- package/test/integration/spec/converged-space-meetings.js +233 -0
- package/test/integration/spec/journey.js +336 -259
- package/test/integration/spec/space-meeting.js +77 -4
- package/test/unit/spec/annotation/index.ts +418 -0
- package/test/unit/spec/breakouts/breakout.ts +142 -24
- package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
- package/test/unit/spec/breakouts/events.ts +89 -0
- package/test/unit/spec/breakouts/index.ts +1545 -48
- package/test/unit/spec/breakouts/request.ts +104 -0
- package/test/unit/spec/breakouts/utils.js +72 -0
- package/test/unit/spec/common/queue.js +31 -2
- package/test/unit/spec/controls-options-manager/index.js +287 -0
- package/test/unit/spec/controls-options-manager/util.js +582 -0
- package/test/unit/spec/fixture/locus.js +1 -0
- package/test/unit/spec/interpretation/collection.ts +15 -0
- package/test/unit/spec/interpretation/index.ts +589 -0
- package/test/unit/spec/interpretation/siLanguage.ts +28 -0
- package/test/unit/spec/locus-info/controlsUtils.js +316 -43
- package/test/unit/spec/locus-info/index.js +1169 -36
- package/test/unit/spec/locus-info/infoUtils.js +37 -15
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
- package/test/unit/spec/locus-info/parser.js +62 -22
- package/test/unit/spec/locus-info/selfConstant.js +27 -4
- package/test/unit/spec/locus-info/selfUtils.js +208 -17
- package/test/unit/spec/media/index.ts +138 -28
- package/test/unit/spec/meeting/in-meeting-actions.ts +89 -3
- package/test/unit/spec/meeting/index.js +3573 -1663
- package/test/unit/spec/meeting/locusMediaRequest.ts +438 -0
- package/test/unit/spec/meeting/muteState.js +370 -208
- package/test/unit/spec/meeting/request.js +339 -44
- package/test/unit/spec/meeting/utils.js +456 -53
- package/test/unit/spec/meeting-info/index.js +181 -0
- 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 +867 -125
- package/test/unit/spec/meetings/utils.js +206 -2
- package/test/unit/spec/member/index.js +58 -4
- package/test/unit/spec/member/util.js +479 -35
- package/test/unit/spec/members/index.js +319 -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 +1 -50
- package/test/unit/spec/multistream/mediaRequestManager.ts +803 -162
- package/test/unit/spec/multistream/receiveSlot.ts +72 -13
- package/test/unit/spec/multistream/receiveSlotManager.ts +58 -28
- package/test/unit/spec/multistream/remoteMedia.ts +30 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +266 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +318 -0
- package/test/unit/spec/networkQualityMonitor/index.js +4 -4
- package/test/unit/spec/reachability/index.ts +125 -8
- package/test/unit/spec/reachability/request.js +66 -0
- package/test/unit/spec/reconnection-manager/index.js +59 -6
- package/test/unit/spec/recording-controller/index.js +294 -218
- package/test/unit/spec/recording-controller/util.js +223 -96
- package/test/unit/spec/roap/index.ts +26 -51
- package/test/unit/spec/roap/request.ts +196 -85
- package/test/unit/spec/roap/turnDiscovery.ts +30 -7
- package/test/unit/spec/rtcMetrics/index.ts +60 -0
- package/test/unit/spec/stats-analyzer/index.js +92 -41
- 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 +6 -3
- package/dist/meeting/effectsState.js +0 -262
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/metrics/config.js +0 -299
- package/dist/metrics/config.js.map +0 -1
- package/dist/multistream/multistreamMedia.js +0 -110
- package/dist/multistream/multistreamMedia.js.map +0 -1
- package/src/index.js +0 -16
- package/src/meeting/effectsState.ts +0 -211
- package/src/metrics/config.ts +0 -495
- package/src/multistream/multistreamMedia.ts +0 -97
- package/test/unit/spec/meeting/effectsState.js +0 -285
package/src/meeting/muteState.ts
CHANGED
|
@@ -1,107 +1,166 @@
|
|
|
1
|
+
import {ServerMuteReason} from '@webex/media-helpers';
|
|
1
2
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
2
3
|
import ParameterError from '../common/errors/parameter';
|
|
3
|
-
import PermissionError from '../common/errors/permission';
|
|
4
|
-
import Media from '../media';
|
|
5
4
|
import MeetingUtil from './util';
|
|
6
5
|
import {AUDIO, VIDEO} from '../constants';
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const createMuteState = (type, meeting, mediaDirection) => {
|
|
13
|
-
if (type === AUDIO && !mediaDirection.sendAudio) {
|
|
14
|
-
return null;
|
|
15
|
-
}
|
|
16
|
-
if (type === VIDEO && !mediaDirection.sendVideo) {
|
|
17
|
-
return null;
|
|
18
|
-
}
|
|
7
|
+
// eslint-disable-next-line import/prefer-default-export
|
|
8
|
+
export const createMuteState = (type, meeting, enabled: boolean) => {
|
|
9
|
+
// todo: remove the meeting argument (SPARK-399695)
|
|
19
10
|
|
|
20
11
|
LoggerProxy.logger.info(
|
|
21
12
|
`Meeting:muteState#createMuteState --> ${type}: creating MuteState for meeting id ${meeting?.id}`
|
|
22
13
|
);
|
|
23
14
|
|
|
24
|
-
|
|
15
|
+
const muteState = new MuteState(type, meeting, enabled);
|
|
16
|
+
|
|
17
|
+
return muteState;
|
|
25
18
|
};
|
|
26
19
|
|
|
27
20
|
/** The purpose of this class is to manage the local and remote mute state and make sure that the server state always matches
|
|
28
21
|
the last requested state by the client.
|
|
29
22
|
|
|
30
23
|
More info about Locus muting API: https://sqbu-github.cisco.com/pages/WebExSquared/locus/guides/mute.html#
|
|
24
|
+
|
|
25
|
+
This class is exported only for unit tests. It should never be instantiated directly with new MuteState(), instead createMuteState() should be called
|
|
31
26
|
*/
|
|
32
|
-
class MuteState {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
27
|
+
export class MuteState {
|
|
28
|
+
state: {
|
|
29
|
+
client: {
|
|
30
|
+
enabled: boolean; // indicates if audio/video is enabled at all or not
|
|
31
|
+
localMute: boolean;
|
|
32
|
+
};
|
|
33
|
+
server: {localMute: boolean; remoteMute: boolean; unmuteAllowed: boolean};
|
|
34
|
+
syncToServerInProgress: boolean;
|
|
35
|
+
};
|
|
36
|
+
|
|
36
37
|
type: any;
|
|
38
|
+
ignoreMuteStateChange: boolean;
|
|
37
39
|
|
|
38
40
|
/**
|
|
39
41
|
* Constructor
|
|
40
42
|
*
|
|
41
43
|
* @param {String} type - audio or video
|
|
42
44
|
* @param {Object} meeting - the meeting object (used for reading current remote mute status)
|
|
45
|
+
* @param {boolean} enabled - whether the client audio/video is enabled at all
|
|
43
46
|
*/
|
|
44
|
-
constructor(type: string, meeting: any) {
|
|
47
|
+
constructor(type: string, meeting: any, enabled: boolean) {
|
|
45
48
|
if (type !== AUDIO && type !== VIDEO) {
|
|
46
49
|
throw new ParameterError('Mute state is designed for handling audio or video only');
|
|
47
50
|
}
|
|
48
51
|
this.type = type;
|
|
52
|
+
this.ignoreMuteStateChange = false;
|
|
49
53
|
this.state = {
|
|
50
54
|
client: {
|
|
51
|
-
|
|
55
|
+
enabled,
|
|
56
|
+
localMute: true,
|
|
52
57
|
},
|
|
53
58
|
server: {
|
|
54
|
-
localMute:
|
|
55
|
-
//
|
|
56
|
-
remoteMute: type === AUDIO ? meeting.remoteMuted : false,
|
|
57
|
-
unmuteAllowed: type === AUDIO ? meeting.unmuteAllowed : true,
|
|
59
|
+
localMute: true,
|
|
60
|
+
// because remoteVideoMuted and unmuteVideoAllowed are updated seperately, they might be undefined
|
|
61
|
+
remoteMute: type === AUDIO ? meeting.remoteMuted : meeting.remoteVideoMuted ?? false,
|
|
62
|
+
unmuteAllowed: type === AUDIO ? meeting.unmuteAllowed : meeting.unmuteVideoAllowed ?? true,
|
|
58
63
|
},
|
|
59
64
|
syncToServerInProgress: false,
|
|
60
65
|
};
|
|
61
|
-
// these 2 hold the resolve, reject methods for the promise we returned to the client in last handleClientRequest() call
|
|
62
|
-
this.pendingPromiseResolve = null;
|
|
63
|
-
this.pendingPromiseReject = null;
|
|
64
66
|
}
|
|
65
67
|
|
|
66
68
|
/**
|
|
67
|
-
*
|
|
68
|
-
* at the point that this request becomese superseded by another client request.
|
|
69
|
+
* Starts the mute state machine. Needs to be called after a new MuteState instance is created.
|
|
69
70
|
*
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
|
|
71
|
+
* @param {Object} meeting - the meeting object
|
|
72
|
+
* @returns {void}
|
|
73
|
+
*/
|
|
74
|
+
public init(meeting: any) {
|
|
75
|
+
this.applyUnmuteAllowedToTrack(meeting);
|
|
76
|
+
|
|
77
|
+
// if we are remotely muted, we need to apply that to the local track now (mute on-entry)
|
|
78
|
+
if (this.state.server.remoteMute) {
|
|
79
|
+
this.muteLocalTrack(meeting, this.state.server.remoteMute, 'remotelyMuted');
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const initialMute =
|
|
83
|
+
this.type === AUDIO
|
|
84
|
+
? meeting.mediaProperties.audioTrack?.muted
|
|
85
|
+
: meeting.mediaProperties.videoTrack?.muted;
|
|
86
|
+
|
|
87
|
+
LoggerProxy.logger.info(
|
|
88
|
+
`Meeting:muteState#init --> ${this.type}: local track initial mute state: ${initialMute}`
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
if (initialMute !== undefined) {
|
|
92
|
+
this.state.client.localMute = initialMute;
|
|
93
|
+
} else {
|
|
94
|
+
// there is no track, so it's like we are locally muted
|
|
95
|
+
// (this is important especially for transcoded meetings, in which the SDP m-line direction always stays "sendrecv")
|
|
96
|
+
this.state.client.localMute = true;
|
|
97
|
+
}
|
|
98
|
+
this.applyClientStateToServer(meeting);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* This method needs to be called whenever the local audio/video track has changed.
|
|
103
|
+
* It reapplies the remote mute state onto the new track and also reads the current
|
|
104
|
+
* local mute state from the track and updates the internal state machine and sends
|
|
105
|
+
* any required requests to the server.
|
|
73
106
|
*
|
|
107
|
+
* @param {Object} meeting - the meeting object
|
|
108
|
+
* @returns {void}
|
|
109
|
+
*/
|
|
110
|
+
public handleLocalTrackChange(meeting: any) {
|
|
111
|
+
return this.init(meeting);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Enables/disables audio/video
|
|
116
|
+
*
|
|
117
|
+
* @param {Object} meeting - the meeting object
|
|
118
|
+
* @param {boolean} enable
|
|
119
|
+
* @returns {void}
|
|
120
|
+
*/
|
|
121
|
+
public enable(meeting: any, enable: boolean) {
|
|
122
|
+
this.state.client.enabled = enable;
|
|
123
|
+
|
|
124
|
+
this.applyClientStateToServer(meeting);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Mutes/unmutes local track
|
|
129
|
+
*
|
|
130
|
+
* @param {Object} meeting - the meeting object
|
|
131
|
+
* @param {Boolean} mute - true to mute the track, false to unmute it
|
|
132
|
+
* @param {ServerMuteReason} reason - reason for muting/unmuting
|
|
133
|
+
* @returns {void}
|
|
134
|
+
*/
|
|
135
|
+
private muteLocalTrack(meeting: any, mute: boolean, reason: ServerMuteReason) {
|
|
136
|
+
this.ignoreMuteStateChange = true;
|
|
137
|
+
if (this.type === AUDIO) {
|
|
138
|
+
meeting.mediaProperties.audioTrack?.setServerMuted(mute, reason);
|
|
139
|
+
} else {
|
|
140
|
+
meeting.mediaProperties.videoTrack?.setServerMuted(mute, reason);
|
|
141
|
+
}
|
|
142
|
+
this.ignoreMuteStateChange = false;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* This method should be called when the local track mute state is changed
|
|
74
147
|
* @public
|
|
75
148
|
* @memberof MuteState
|
|
76
149
|
* @param {Object} [meeting] the meeting object
|
|
77
150
|
* @param {Boolean} [mute] true for muting, false for unmuting request
|
|
78
|
-
* @returns {
|
|
151
|
+
* @returns {void}
|
|
79
152
|
*/
|
|
80
|
-
public
|
|
153
|
+
public handleLocalTrackMuteStateChange(meeting?: object, mute?: boolean) {
|
|
154
|
+
if (this.ignoreMuteStateChange) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
81
157
|
LoggerProxy.logger.info(
|
|
82
|
-
`Meeting:muteState#
|
|
158
|
+
`Meeting:muteState#handleLocalTrackMuteStateChange --> ${this.type}: local track new mute state: ${mute}`
|
|
83
159
|
);
|
|
84
160
|
|
|
85
|
-
if (!mute && !this.state.server.unmuteAllowed) {
|
|
86
|
-
return Promise.reject(
|
|
87
|
-
new PermissionError('User is not allowed to unmute self (hard mute feature is being used)')
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
// we don't check if we're already in the same state, because even if we were, we would still have to apply the mute state locally,
|
|
92
|
-
// because the client may have changed the audio/vidoe tracks
|
|
93
161
|
this.state.client.localMute = mute;
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
return new Promise((resolve, reject) => {
|
|
97
|
-
if (this.pendingPromiseResolve) {
|
|
98
|
-
// resolve the last promise we returned to the client as the client has issued a new request that has superseded the previous one
|
|
99
|
-
this.pendingPromiseResolve();
|
|
100
|
-
}
|
|
101
|
-
this.pendingPromiseResolve = resolve;
|
|
102
|
-
this.pendingPromiseReject = reject;
|
|
103
|
-
this.applyClientStateToServer(meeting);
|
|
104
|
-
});
|
|
162
|
+
|
|
163
|
+
this.applyClientStateToServer(meeting);
|
|
105
164
|
}
|
|
106
165
|
|
|
107
166
|
/**
|
|
@@ -109,14 +168,21 @@ class MuteState {
|
|
|
109
168
|
*
|
|
110
169
|
* @public
|
|
111
170
|
* @param {Object} [meeting] the meeting object
|
|
171
|
+
* @param {ServerMuteReason} reason - reason why we're applying our client state to the local track
|
|
112
172
|
* @memberof MuteState
|
|
113
173
|
* @returns {void}
|
|
114
174
|
*/
|
|
115
|
-
public applyClientStateLocally(meeting?: any) {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
175
|
+
public applyClientStateLocally(meeting?: any, reason?: ServerMuteReason) {
|
|
176
|
+
this.muteLocalTrack(meeting, this.state.client.localMute, reason);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/** Returns true if client is locally muted - it takes into account not just the client local mute state,
|
|
180
|
+
* but also whether audio/video is enabled at all
|
|
181
|
+
*
|
|
182
|
+
* @returns {boolean}
|
|
183
|
+
*/
|
|
184
|
+
private getClientLocalMuteState() {
|
|
185
|
+
return this.state.client.enabled ? this.state.client.localMute : true;
|
|
120
186
|
}
|
|
121
187
|
|
|
122
188
|
/**
|
|
@@ -127,7 +193,7 @@ class MuteState {
|
|
|
127
193
|
* @memberof MuteState
|
|
128
194
|
* @returns {void}
|
|
129
195
|
*/
|
|
130
|
-
private applyClientStateToServer(meeting?:
|
|
196
|
+
private applyClientStateToServer(meeting?: any) {
|
|
131
197
|
if (this.state.syncToServerInProgress) {
|
|
132
198
|
LoggerProxy.logger.info(
|
|
133
199
|
`Meeting:muteState#applyClientStateToServer --> ${this.type}: request to server in progress, we need to wait for it to complete`
|
|
@@ -136,11 +202,12 @@ class MuteState {
|
|
|
136
202
|
return;
|
|
137
203
|
}
|
|
138
204
|
|
|
139
|
-
const
|
|
140
|
-
const
|
|
205
|
+
const localMuteState = this.getClientLocalMuteState();
|
|
206
|
+
const localMuteRequiresSync = localMuteState !== this.state.server.localMute;
|
|
207
|
+
const remoteMuteRequiresSync = !localMuteState && this.state.server.remoteMute;
|
|
141
208
|
|
|
142
209
|
LoggerProxy.logger.info(
|
|
143
|
-
`Meeting:muteState#applyClientStateToServer --> ${this.type}: localMuteRequiresSync: ${localMuteRequiresSync} (${
|
|
210
|
+
`Meeting:muteState#applyClientStateToServer --> ${this.type}: localMuteRequiresSync: ${localMuteRequiresSync} (${localMuteState} ?= ${this.state.server.localMute})`
|
|
144
211
|
);
|
|
145
212
|
LoggerProxy.logger.info(
|
|
146
213
|
`Meeting:muteState#applyClientStateToServer --> ${this.type}: remoteMuteRequiresSync: ${remoteMuteRequiresSync}`
|
|
@@ -151,12 +218,6 @@ class MuteState {
|
|
|
151
218
|
`Meeting:muteState#applyClientStateToServer --> ${this.type}: client state already matching server state, nothing to do`
|
|
152
219
|
);
|
|
153
220
|
|
|
154
|
-
if (this.pendingPromiseResolve) {
|
|
155
|
-
this.pendingPromiseResolve();
|
|
156
|
-
}
|
|
157
|
-
this.pendingPromiseResolve = null;
|
|
158
|
-
this.pendingPromiseReject = null;
|
|
159
|
-
|
|
160
221
|
return;
|
|
161
222
|
}
|
|
162
223
|
|
|
@@ -184,11 +245,11 @@ class MuteState {
|
|
|
184
245
|
.catch((e) => {
|
|
185
246
|
this.state.syncToServerInProgress = false;
|
|
186
247
|
|
|
187
|
-
|
|
188
|
-
this.
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
this.
|
|
248
|
+
LoggerProxy.logger.warn(
|
|
249
|
+
`Meeting:muteState#applyClientStateToServer --> ${this.type}: error: ${e}`
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
this.applyServerMuteToLocalTrack(meeting, 'clientRequestFailed');
|
|
192
253
|
});
|
|
193
254
|
}
|
|
194
255
|
|
|
@@ -201,16 +262,14 @@ class MuteState {
|
|
|
201
262
|
* @returns {Promise}
|
|
202
263
|
*/
|
|
203
264
|
private sendLocalMuteRequestToServer(meeting?: any) {
|
|
204
|
-
const audioMuted =
|
|
205
|
-
|
|
206
|
-
const videoMuted =
|
|
207
|
-
this.type === VIDEO ? this.state.client.localMute : meeting.video?.state.client.localMute;
|
|
265
|
+
const audioMuted = this.type === AUDIO ? this.getClientLocalMuteState() : undefined;
|
|
266
|
+
const videoMuted = this.type === VIDEO ? this.getClientLocalMuteState() : undefined;
|
|
208
267
|
|
|
209
268
|
LoggerProxy.logger.info(
|
|
210
269
|
`Meeting:muteState#sendLocalMuteRequestToServer --> ${this.type}: sending local mute (audio=${audioMuted}, video=${videoMuted}) to server`
|
|
211
270
|
);
|
|
212
271
|
|
|
213
|
-
return MeetingUtil.remoteUpdateAudioVideo(audioMuted, videoMuted
|
|
272
|
+
return MeetingUtil.remoteUpdateAudioVideo(meeting, audioMuted, videoMuted)
|
|
214
273
|
.then((locus) => {
|
|
215
274
|
LoggerProxy.logger.info(
|
|
216
275
|
`Meeting:muteState#sendLocalMuteRequestToServer --> ${this.type}: local mute (audio=${audioMuted}, video=${videoMuted}) applied to server`
|
|
@@ -218,7 +277,9 @@ class MuteState {
|
|
|
218
277
|
|
|
219
278
|
this.state.server.localMute = this.type === AUDIO ? audioMuted : videoMuted;
|
|
220
279
|
|
|
221
|
-
|
|
280
|
+
if (locus) {
|
|
281
|
+
meeting.locusInfo.handleLocusDelta(locus, meeting);
|
|
282
|
+
}
|
|
222
283
|
|
|
223
284
|
return locus;
|
|
224
285
|
})
|
|
@@ -240,35 +301,53 @@ class MuteState {
|
|
|
240
301
|
* @returns {Promise}
|
|
241
302
|
*/
|
|
242
303
|
private sendRemoteMuteRequestToServer(meeting?: any) {
|
|
243
|
-
|
|
244
|
-
const remoteMute = this.state.client.localMute;
|
|
304
|
+
const remoteMute = this.getClientLocalMuteState();
|
|
245
305
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
306
|
+
LoggerProxy.logger.info(
|
|
307
|
+
`Meeting:muteState#sendRemoteMuteRequestToServer --> ${this.type}: sending remote mute:${remoteMute} to server`
|
|
308
|
+
);
|
|
249
309
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
this.state.server.remoteMute = remoteMute;
|
|
258
|
-
})
|
|
259
|
-
.catch((remoteUpdateError) => {
|
|
260
|
-
LoggerProxy.logger.warn(
|
|
261
|
-
`Meeting:muteState#sendRemoteMuteRequestToServer --> ${this.type}: failed to apply remote mute ${remoteMute} to server: ${remoteUpdateError}`
|
|
262
|
-
);
|
|
263
|
-
|
|
264
|
-
return Promise.reject(remoteUpdateError);
|
|
265
|
-
});
|
|
266
|
-
}
|
|
310
|
+
return meeting.members
|
|
311
|
+
.muteMember(meeting.members.selfId, remoteMute, this.type === AUDIO)
|
|
312
|
+
.then(() => {
|
|
313
|
+
LoggerProxy.logger.info(
|
|
314
|
+
`Meeting:muteState#sendRemoteMuteRequestToServer --> ${this.type}: remote mute:${remoteMute} applied to server`
|
|
315
|
+
);
|
|
267
316
|
|
|
268
|
-
|
|
269
|
-
|
|
317
|
+
this.state.server.remoteMute = remoteMute;
|
|
318
|
+
})
|
|
319
|
+
.catch((remoteUpdateError) => {
|
|
320
|
+
LoggerProxy.logger.warn(
|
|
321
|
+
`Meeting:muteState#sendRemoteMuteRequestToServer --> ${this.type}: failed to apply remote mute ${remoteMute} to server: ${remoteUpdateError}`
|
|
322
|
+
);
|
|
323
|
+
|
|
324
|
+
return Promise.reject(remoteUpdateError);
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
/** Sets the mute state of the local track according to what server thinks is our state
|
|
329
|
+
* @param {Object} meeting - the meeting object
|
|
330
|
+
* @param {ServerMuteReason} serverMuteReason - reason why we're applying server mute to the local track
|
|
331
|
+
* @returns {void}
|
|
332
|
+
*/
|
|
333
|
+
private applyServerMuteToLocalTrack(meeting: any, serverMuteReason: ServerMuteReason) {
|
|
334
|
+
const muted = this.state.server.localMute || this.state.server.remoteMute;
|
|
270
335
|
|
|
271
|
-
|
|
336
|
+
// update the local track mute state, but not this.state.client.localMute
|
|
337
|
+
this.muteLocalTrack(meeting, muted, serverMuteReason);
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/** Applies the current value for unmute allowed to the underlying track
|
|
341
|
+
*
|
|
342
|
+
* @param {Meeting} meeting
|
|
343
|
+
* @returns {void}
|
|
344
|
+
*/
|
|
345
|
+
private applyUnmuteAllowedToTrack(meeting: any) {
|
|
346
|
+
if (this.type === AUDIO) {
|
|
347
|
+
meeting.mediaProperties.audioTrack?.setUnmuteAllowed(this.state.server.unmuteAllowed);
|
|
348
|
+
} else {
|
|
349
|
+
meeting.mediaProperties.videoTrack?.setUnmuteAllowed(this.state.server.unmuteAllowed);
|
|
350
|
+
}
|
|
272
351
|
}
|
|
273
352
|
|
|
274
353
|
/**
|
|
@@ -276,16 +355,23 @@ class MuteState {
|
|
|
276
355
|
*
|
|
277
356
|
* @public
|
|
278
357
|
* @memberof MuteState
|
|
358
|
+
* @param {Meeting} meeting
|
|
279
359
|
* @param {Boolean} [muted] true if user is remotely muted, false otherwise
|
|
280
360
|
* @param {Boolean} [unmuteAllowed] indicates if user is allowed to unmute self (false when "hard mute" feature is used)
|
|
281
361
|
* @returns {undefined}
|
|
282
362
|
*/
|
|
283
|
-
public handleServerRemoteMuteUpdate(muted?: boolean, unmuteAllowed?: boolean) {
|
|
363
|
+
public handleServerRemoteMuteUpdate(meeting: any, muted?: boolean, unmuteAllowed?: boolean) {
|
|
284
364
|
LoggerProxy.logger.info(
|
|
285
365
|
`Meeting:muteState#handleServerRemoteMuteUpdate --> ${this.type}: updating server remoteMute to (${muted})`
|
|
286
366
|
);
|
|
287
|
-
|
|
288
|
-
|
|
367
|
+
if (unmuteAllowed !== undefined) {
|
|
368
|
+
this.state.server.unmuteAllowed = unmuteAllowed;
|
|
369
|
+
this.applyUnmuteAllowedToTrack(meeting);
|
|
370
|
+
}
|
|
371
|
+
if (muted !== undefined) {
|
|
372
|
+
this.state.server.remoteMute = muted;
|
|
373
|
+
this.applyServerMuteToLocalTrack(meeting, 'remotelyMuted');
|
|
374
|
+
}
|
|
289
375
|
}
|
|
290
376
|
|
|
291
377
|
/**
|
|
@@ -297,27 +383,27 @@ class MuteState {
|
|
|
297
383
|
* @returns {undefined}
|
|
298
384
|
*/
|
|
299
385
|
public handleServerLocalUnmuteRequired(meeting?: object) {
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
386
|
+
if (!this.state.client.enabled) {
|
|
387
|
+
LoggerProxy.logger.warn(
|
|
388
|
+
`Meeting:muteState#handleServerLocalUnmuteRequired --> ${this.type}: localAudioUnmuteRequired received while ${this.type} is disabled -> local unmute will not result in ${this.type} being sent`
|
|
389
|
+
);
|
|
390
|
+
} else {
|
|
391
|
+
LoggerProxy.logger.info(
|
|
392
|
+
`Meeting:muteState#handleServerLocalUnmuteRequired --> ${this.type}: localAudioUnmuteRequired received -> doing local unmute`
|
|
393
|
+
);
|
|
394
|
+
}
|
|
303
395
|
|
|
396
|
+
// todo: I'm seeing "you can now unmute yourself " popup when this happens - but same thing happens on web.w.c so we can ignore for now
|
|
304
397
|
this.state.server.remoteMute = false;
|
|
305
398
|
this.state.client.localMute = false;
|
|
306
399
|
|
|
307
|
-
|
|
308
|
-
this.pendingPromiseReject(
|
|
309
|
-
new Error('Server requested local unmute - this overrides any client request in progress')
|
|
310
|
-
);
|
|
311
|
-
this.pendingPromiseResolve = null;
|
|
312
|
-
this.pendingPromiseReject = null;
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
this.applyClientStateLocally(meeting);
|
|
400
|
+
this.applyClientStateLocally(meeting, 'localUnmuteRequired');
|
|
316
401
|
this.applyClientStateToServer(meeting);
|
|
317
402
|
}
|
|
318
403
|
|
|
319
404
|
/**
|
|
320
|
-
* Returns true if the user is locally or remotely muted
|
|
405
|
+
* Returns true if the user is locally or remotely muted.
|
|
406
|
+
* It only checks the mute status, ignoring the fact whether audio/video is enabled.
|
|
321
407
|
*
|
|
322
408
|
* @public
|
|
323
409
|
* @memberof MuteState
|
|
@@ -330,25 +416,35 @@ class MuteState {
|
|
|
330
416
|
}
|
|
331
417
|
|
|
332
418
|
/**
|
|
333
|
-
* Returns true if the user is
|
|
419
|
+
* Returns true if the user is remotely muted
|
|
334
420
|
*
|
|
335
421
|
* @public
|
|
336
422
|
* @memberof MuteState
|
|
337
423
|
* @returns {Boolean}
|
|
338
424
|
*/
|
|
339
|
-
public
|
|
340
|
-
return this.state.
|
|
425
|
+
public isRemotelyMuted() {
|
|
426
|
+
return this.state.server.remoteMute;
|
|
341
427
|
}
|
|
342
428
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
429
|
+
/**
|
|
430
|
+
* Returns true if unmute is allowed
|
|
431
|
+
*
|
|
432
|
+
* @public
|
|
433
|
+
* @memberof MuteState
|
|
434
|
+
* @returns {Boolean}
|
|
435
|
+
*/
|
|
436
|
+
public isUnmuteAllowed() {
|
|
437
|
+
return this.state.server.unmuteAllowed;
|
|
346
438
|
}
|
|
347
439
|
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
440
|
+
/**
|
|
441
|
+
* Returns true if the user is locally muted or audio/video is disabled
|
|
442
|
+
*
|
|
443
|
+
* @public
|
|
444
|
+
* @memberof MuteState
|
|
445
|
+
* @returns {Boolean}
|
|
446
|
+
*/
|
|
447
|
+
public isLocallyMuted() {
|
|
448
|
+
return this.getClientLocalMuteState();
|
|
351
449
|
}
|
|
352
450
|
}
|
|
353
|
-
|
|
354
|
-
export default createMuteState;
|