@webex/plugin-meetings 3.0.0-beta.22 → 3.0.0-beta.221
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 +46 -8
- 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 +188 -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 +357 -62
- 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 +49 -106
- 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 +2587 -2560
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +292 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.js +228 -123
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +244 -194
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +568 -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 +361 -84
- 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 +90 -30
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +16 -7
- 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 +25 -29
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +111 -89
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +97 -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 +1028 -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 +1512 -0
- package/dist/types/meeting/locusMediaRequest.d.ts +75 -0
- package/dist/types/meeting/muteState.d.ts +184 -0
- package/dist/types/meeting/request.d.ts +289 -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 +94 -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 +361 -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 +158 -0
- package/dist/types/reachability/request.d.ts +39 -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 +38 -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 +47 -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 +175 -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 +381 -59
- 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 +89 -109
- 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 +2062 -2137
- package/src/meeting/locusMediaRequest.ts +314 -0
- package/src/meeting/muteState.ts +227 -130
- package/src/meeting/request.ts +157 -116
- package/src/meeting/util.ts +555 -396
- 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 +397 -102
- 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 +76 -18
- package/src/reachability/request.ts +16 -7
- 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 +25 -30
- package/src/roap/request.ts +103 -95
- package/src/roap/turnDiscovery.ts +51 -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 +3510 -1747
- package/test/unit/spec/meeting/locusMediaRequest.ts +443 -0
- package/test/unit/spec/meeting/muteState.js +370 -208
- package/test/unit/spec/meeting/request.js +417 -45
- package/test/unit/spec/meeting/utils.js +601 -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 +874 -150
- 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 +185 -7
- package/test/unit/spec/reachability/request.js +68 -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 +27 -51
- package/test/unit/spec/roap/request.ts +202 -85
- package/test/unit/spec/roap/turnDiscovery.ts +36 -8
- package/test/unit/spec/rtcMetrics/index.ts +68 -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/src/index.js +0 -16
- package/src/meeting/effectsState.ts +0 -211
- package/src/metrics/config.ts +0 -495
- package/test/unit/spec/meeting/effectsState.js +0 -285
package/src/meeting/muteState.ts
CHANGED
|
@@ -1,108 +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
|
-
/* Certain aspects of server interaction for video muting are not implemented as we currently don't support remote muting of video.
|
|
9
|
-
If we ever need to support it, search for REMOTE_MUTE_VIDEO_MISSING_IMPLEMENTATION string to find the places that need updating
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
7
|
// eslint-disable-next-line import/prefer-default-export
|
|
13
|
-
export const createMuteState = (type, meeting,
|
|
14
|
-
|
|
15
|
-
return null;
|
|
16
|
-
}
|
|
17
|
-
if (type === VIDEO && !mediaDirection.sendVideo) {
|
|
18
|
-
return null;
|
|
19
|
-
}
|
|
8
|
+
export const createMuteState = (type, meeting, enabled: boolean) => {
|
|
9
|
+
// todo: remove the meeting argument (SPARK-399695)
|
|
20
10
|
|
|
21
11
|
LoggerProxy.logger.info(
|
|
22
12
|
`Meeting:muteState#createMuteState --> ${type}: creating MuteState for meeting id ${meeting?.id}`
|
|
23
13
|
);
|
|
24
14
|
|
|
25
|
-
|
|
15
|
+
const muteState = new MuteState(type, meeting, enabled);
|
|
16
|
+
|
|
17
|
+
return muteState;
|
|
26
18
|
};
|
|
27
19
|
|
|
28
20
|
/** The purpose of this class is to manage the local and remote mute state and make sure that the server state always matches
|
|
29
21
|
the last requested state by the client.
|
|
30
22
|
|
|
31
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
|
|
32
26
|
*/
|
|
33
|
-
class MuteState {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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
|
+
|
|
37
37
|
type: any;
|
|
38
|
+
ignoreMuteStateChange: boolean;
|
|
38
39
|
|
|
39
40
|
/**
|
|
40
41
|
* Constructor
|
|
41
42
|
*
|
|
42
43
|
* @param {String} type - audio or video
|
|
43
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
|
|
44
46
|
*/
|
|
45
|
-
constructor(type: string, meeting: any) {
|
|
47
|
+
constructor(type: string, meeting: any, enabled: boolean) {
|
|
46
48
|
if (type !== AUDIO && type !== VIDEO) {
|
|
47
49
|
throw new ParameterError('Mute state is designed for handling audio or video only');
|
|
48
50
|
}
|
|
49
51
|
this.type = type;
|
|
52
|
+
this.ignoreMuteStateChange = false;
|
|
50
53
|
this.state = {
|
|
51
54
|
client: {
|
|
52
|
-
|
|
55
|
+
enabled,
|
|
56
|
+
localMute: true,
|
|
53
57
|
},
|
|
54
58
|
server: {
|
|
55
|
-
localMute:
|
|
56
|
-
//
|
|
57
|
-
remoteMute: type === AUDIO ? meeting.remoteMuted : false,
|
|
58
|
-
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,
|
|
59
63
|
},
|
|
60
64
|
syncToServerInProgress: false,
|
|
61
65
|
};
|
|
62
|
-
// these 2 hold the resolve, reject methods for the promise we returned to the client in last handleClientRequest() call
|
|
63
|
-
this.pendingPromiseResolve = null;
|
|
64
|
-
this.pendingPromiseReject = null;
|
|
65
66
|
}
|
|
66
67
|
|
|
67
68
|
/**
|
|
68
|
-
*
|
|
69
|
-
* 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.
|
|
70
70
|
*
|
|
71
|
-
*
|
|
72
|
-
*
|
|
73
|
-
|
|
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.
|
|
74
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
|
|
75
147
|
* @public
|
|
76
148
|
* @memberof MuteState
|
|
77
149
|
* @param {Object} [meeting] the meeting object
|
|
78
150
|
* @param {Boolean} [mute] true for muting, false for unmuting request
|
|
79
|
-
* @returns {
|
|
151
|
+
* @returns {void}
|
|
80
152
|
*/
|
|
81
|
-
public
|
|
153
|
+
public handleLocalTrackMuteStateChange(meeting?: object, mute?: boolean) {
|
|
154
|
+
if (this.ignoreMuteStateChange) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
82
157
|
LoggerProxy.logger.info(
|
|
83
|
-
`Meeting:muteState#
|
|
158
|
+
`Meeting:muteState#handleLocalTrackMuteStateChange --> ${this.type}: local track new mute state: ${mute}`
|
|
84
159
|
);
|
|
85
160
|
|
|
86
|
-
if (!mute && !this.state.server.unmuteAllowed) {
|
|
87
|
-
return Promise.reject(
|
|
88
|
-
new PermissionError('User is not allowed to unmute self (hard mute feature is being used)')
|
|
89
|
-
);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// 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,
|
|
93
|
-
// because the client may have changed the audio/vidoe tracks
|
|
94
161
|
this.state.client.localMute = mute;
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
return new Promise((resolve, reject) => {
|
|
98
|
-
if (this.pendingPromiseResolve) {
|
|
99
|
-
// resolve the last promise we returned to the client as the client has issued a new request that has superseded the previous one
|
|
100
|
-
this.pendingPromiseResolve();
|
|
101
|
-
}
|
|
102
|
-
this.pendingPromiseResolve = resolve;
|
|
103
|
-
this.pendingPromiseReject = reject;
|
|
104
|
-
this.applyClientStateToServer(meeting);
|
|
105
|
-
});
|
|
162
|
+
|
|
163
|
+
this.applyClientStateToServer(meeting);
|
|
106
164
|
}
|
|
107
165
|
|
|
108
166
|
/**
|
|
@@ -110,14 +168,21 @@ class MuteState {
|
|
|
110
168
|
*
|
|
111
169
|
* @public
|
|
112
170
|
* @param {Object} [meeting] the meeting object
|
|
171
|
+
* @param {ServerMuteReason} reason - reason why we're applying our client state to the local track
|
|
113
172
|
* @memberof MuteState
|
|
114
173
|
* @returns {void}
|
|
115
174
|
*/
|
|
116
|
-
public applyClientStateLocally(meeting?: any) {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
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;
|
|
121
186
|
}
|
|
122
187
|
|
|
123
188
|
/**
|
|
@@ -128,7 +193,7 @@ class MuteState {
|
|
|
128
193
|
* @memberof MuteState
|
|
129
194
|
* @returns {void}
|
|
130
195
|
*/
|
|
131
|
-
private applyClientStateToServer(meeting?:
|
|
196
|
+
private applyClientStateToServer(meeting?: any) {
|
|
132
197
|
if (this.state.syncToServerInProgress) {
|
|
133
198
|
LoggerProxy.logger.info(
|
|
134
199
|
`Meeting:muteState#applyClientStateToServer --> ${this.type}: request to server in progress, we need to wait for it to complete`
|
|
@@ -137,11 +202,12 @@ class MuteState {
|
|
|
137
202
|
return;
|
|
138
203
|
}
|
|
139
204
|
|
|
140
|
-
const
|
|
141
|
-
const
|
|
205
|
+
const localMuteState = this.getClientLocalMuteState();
|
|
206
|
+
const localMuteRequiresSync = localMuteState !== this.state.server.localMute;
|
|
207
|
+
const remoteMuteRequiresSync = !localMuteState && this.state.server.remoteMute;
|
|
142
208
|
|
|
143
209
|
LoggerProxy.logger.info(
|
|
144
|
-
`Meeting:muteState#applyClientStateToServer --> ${this.type}: localMuteRequiresSync: ${localMuteRequiresSync} (${
|
|
210
|
+
`Meeting:muteState#applyClientStateToServer --> ${this.type}: localMuteRequiresSync: ${localMuteRequiresSync} (${localMuteState} ?= ${this.state.server.localMute})`
|
|
145
211
|
);
|
|
146
212
|
LoggerProxy.logger.info(
|
|
147
213
|
`Meeting:muteState#applyClientStateToServer --> ${this.type}: remoteMuteRequiresSync: ${remoteMuteRequiresSync}`
|
|
@@ -152,12 +218,6 @@ class MuteState {
|
|
|
152
218
|
`Meeting:muteState#applyClientStateToServer --> ${this.type}: client state already matching server state, nothing to do`
|
|
153
219
|
);
|
|
154
220
|
|
|
155
|
-
if (this.pendingPromiseResolve) {
|
|
156
|
-
this.pendingPromiseResolve();
|
|
157
|
-
}
|
|
158
|
-
this.pendingPromiseResolve = null;
|
|
159
|
-
this.pendingPromiseReject = null;
|
|
160
|
-
|
|
161
221
|
return;
|
|
162
222
|
}
|
|
163
223
|
|
|
@@ -185,11 +245,11 @@ class MuteState {
|
|
|
185
245
|
.catch((e) => {
|
|
186
246
|
this.state.syncToServerInProgress = false;
|
|
187
247
|
|
|
188
|
-
|
|
189
|
-
this.
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
this.
|
|
248
|
+
LoggerProxy.logger.warn(
|
|
249
|
+
`Meeting:muteState#applyClientStateToServer --> ${this.type}: error: ${e}`
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
this.applyServerMuteToLocalTrack(meeting, 'clientRequestFailed');
|
|
193
253
|
});
|
|
194
254
|
}
|
|
195
255
|
|
|
@@ -202,16 +262,14 @@ class MuteState {
|
|
|
202
262
|
* @returns {Promise}
|
|
203
263
|
*/
|
|
204
264
|
private sendLocalMuteRequestToServer(meeting?: any) {
|
|
205
|
-
const audioMuted =
|
|
206
|
-
|
|
207
|
-
const videoMuted =
|
|
208
|
-
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;
|
|
209
267
|
|
|
210
268
|
LoggerProxy.logger.info(
|
|
211
269
|
`Meeting:muteState#sendLocalMuteRequestToServer --> ${this.type}: sending local mute (audio=${audioMuted}, video=${videoMuted}) to server`
|
|
212
270
|
);
|
|
213
271
|
|
|
214
|
-
return MeetingUtil.remoteUpdateAudioVideo(audioMuted, videoMuted
|
|
272
|
+
return MeetingUtil.remoteUpdateAudioVideo(meeting, audioMuted, videoMuted)
|
|
215
273
|
.then((locus) => {
|
|
216
274
|
LoggerProxy.logger.info(
|
|
217
275
|
`Meeting:muteState#sendLocalMuteRequestToServer --> ${this.type}: local mute (audio=${audioMuted}, video=${videoMuted}) applied to server`
|
|
@@ -219,7 +277,9 @@ class MuteState {
|
|
|
219
277
|
|
|
220
278
|
this.state.server.localMute = this.type === AUDIO ? audioMuted : videoMuted;
|
|
221
279
|
|
|
222
|
-
|
|
280
|
+
if (locus) {
|
|
281
|
+
meeting.locusInfo.handleLocusDelta(locus, meeting);
|
|
282
|
+
}
|
|
223
283
|
|
|
224
284
|
return locus;
|
|
225
285
|
})
|
|
@@ -241,35 +301,53 @@ class MuteState {
|
|
|
241
301
|
* @returns {Promise}
|
|
242
302
|
*/
|
|
243
303
|
private sendRemoteMuteRequestToServer(meeting?: any) {
|
|
244
|
-
|
|
245
|
-
const remoteMute = this.state.client.localMute;
|
|
304
|
+
const remoteMute = this.getClientLocalMuteState();
|
|
246
305
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
306
|
+
LoggerProxy.logger.info(
|
|
307
|
+
`Meeting:muteState#sendRemoteMuteRequestToServer --> ${this.type}: sending remote mute:${remoteMute} to server`
|
|
308
|
+
);
|
|
250
309
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
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
|
+
);
|
|
316
|
+
|
|
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
|
+
}
|
|
268
327
|
|
|
269
|
-
|
|
270
|
-
|
|
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;
|
|
335
|
+
|
|
336
|
+
// update the local track mute state, but not this.state.client.localMute
|
|
337
|
+
this.muteLocalTrack(meeting, muted, serverMuteReason);
|
|
338
|
+
}
|
|
271
339
|
|
|
272
|
-
|
|
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
|
+
}
|
|
273
351
|
}
|
|
274
352
|
|
|
275
353
|
/**
|
|
@@ -277,16 +355,23 @@ class MuteState {
|
|
|
277
355
|
*
|
|
278
356
|
* @public
|
|
279
357
|
* @memberof MuteState
|
|
358
|
+
* @param {Meeting} meeting
|
|
280
359
|
* @param {Boolean} [muted] true if user is remotely muted, false otherwise
|
|
281
360
|
* @param {Boolean} [unmuteAllowed] indicates if user is allowed to unmute self (false when "hard mute" feature is used)
|
|
282
361
|
* @returns {undefined}
|
|
283
362
|
*/
|
|
284
|
-
public handleServerRemoteMuteUpdate(muted?: boolean, unmuteAllowed?: boolean) {
|
|
363
|
+
public handleServerRemoteMuteUpdate(meeting: any, muted?: boolean, unmuteAllowed?: boolean) {
|
|
285
364
|
LoggerProxy.logger.info(
|
|
286
365
|
`Meeting:muteState#handleServerRemoteMuteUpdate --> ${this.type}: updating server remoteMute to (${muted})`
|
|
287
366
|
);
|
|
288
|
-
|
|
289
|
-
|
|
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
|
+
}
|
|
290
375
|
}
|
|
291
376
|
|
|
292
377
|
/**
|
|
@@ -298,27 +383,27 @@ class MuteState {
|
|
|
298
383
|
* @returns {undefined}
|
|
299
384
|
*/
|
|
300
385
|
public handleServerLocalUnmuteRequired(meeting?: object) {
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
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
|
+
}
|
|
304
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
|
|
305
397
|
this.state.server.remoteMute = false;
|
|
306
398
|
this.state.client.localMute = false;
|
|
307
399
|
|
|
308
|
-
|
|
309
|
-
this.pendingPromiseReject(
|
|
310
|
-
new Error('Server requested local unmute - this overrides any client request in progress')
|
|
311
|
-
);
|
|
312
|
-
this.pendingPromiseResolve = null;
|
|
313
|
-
this.pendingPromiseReject = null;
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
this.applyClientStateLocally(meeting);
|
|
400
|
+
this.applyClientStateLocally(meeting, 'localUnmuteRequired');
|
|
317
401
|
this.applyClientStateToServer(meeting);
|
|
318
402
|
}
|
|
319
403
|
|
|
320
404
|
/**
|
|
321
|
-
* 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.
|
|
322
407
|
*
|
|
323
408
|
* @public
|
|
324
409
|
* @memberof MuteState
|
|
@@ -331,23 +416,35 @@ class MuteState {
|
|
|
331
416
|
}
|
|
332
417
|
|
|
333
418
|
/**
|
|
334
|
-
* Returns true if the user is
|
|
419
|
+
* Returns true if the user is remotely muted
|
|
335
420
|
*
|
|
336
421
|
* @public
|
|
337
422
|
* @memberof MuteState
|
|
338
423
|
* @returns {Boolean}
|
|
339
424
|
*/
|
|
340
|
-
public
|
|
341
|
-
return this.state.
|
|
425
|
+
public isRemotelyMuted() {
|
|
426
|
+
return this.state.server.remoteMute;
|
|
342
427
|
}
|
|
343
428
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
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;
|
|
347
438
|
}
|
|
348
439
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
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();
|
|
352
449
|
}
|
|
353
450
|
}
|