@webex/plugin-meetings 3.0.0-beta.11 → 3.0.0-beta.111
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/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 +357 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.js +176 -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 +944 -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 +193 -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 +286 -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 +94 -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 +383 -212
- 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 +12 -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 +99 -91
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +62 -147
- 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 +67 -14
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +2477 -2417
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.js +252 -113
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +296 -289
- 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 +58 -217
- 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 +278 -281
- 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 +155 -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 +675 -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 +177 -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 +162 -204
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +58 -53
- 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 +107 -44
- 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 +3 -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 +38 -67
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +143 -134
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +149 -101
- 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 +34 -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 +984 -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 +137 -0
- package/dist/types/meeting/index.d.ts +1753 -0
- package/dist/types/meeting/muteState.d.ts +185 -0
- package/dist/types/meeting/request.d.ts +275 -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 +2 -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 +115 -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 +69 -0
- package/dist/types/members/types.d.ts +24 -0
- package/dist/types/members/util.d.ts +2 -0
- package/dist/types/metrics/config.d.ts +195 -0
- package/dist/types/metrics/constants.d.ts +54 -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 +38 -0
- package/dist/types/roap/turnDiscovery.d.ts +88 -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 +41 -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 +141 -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 +835 -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 +141 -6
- 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 +274 -0
- package/src/index.ts +33 -0
- package/src/locus-info/controlsUtils.ts +145 -24
- package/src/locus-info/fullState.ts +15 -11
- package/src/locus-info/hostUtils.ts +4 -3
- package/src/locus-info/index.ts +326 -55
- package/src/locus-info/infoUtils.ts +12 -4
- package/src/locus-info/mediaSharesUtils.ts +4 -4
- package/src/locus-info/parser.ts +46 -68
- package/src/locus-info/selfUtils.ts +187 -56
- package/src/media/index.ts +142 -172
- 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 +139 -3
- package/src/meeting/index.ts +2674 -1543
- package/src/meeting/muteState.ts +271 -68
- package/src/meeting/request.ts +231 -135
- package/src/meeting/request.type.ts +13 -0
- package/src/meeting/state.ts +45 -30
- package/src/meeting/util.ts +119 -110
- package/src/meeting-info/collection.ts +2 -1
- package/src/meeting-info/index.ts +32 -30
- package/src/meeting-info/meeting-info-v2.ts +201 -113
- package/src/meeting-info/request.ts +9 -3
- package/src/meeting-info/util.ts +54 -46
- package/src/meeting-info/utilv2.ts +70 -55
- package/src/meetings/collection.ts +21 -1
- package/src/meetings/index.ts +749 -437
- package/src/meetings/request.ts +29 -25
- package/src/meetings/util.ts +122 -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 +281 -129
- package/src/members/request.ts +87 -14
- package/src/members/types.ts +28 -0
- package/src/members/util.ts +140 -49
- package/src/metrics/config.ts +302 -90
- package/src/metrics/constants.ts +1 -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 +63 -51
- package/src/roap/request.ts +86 -53
- package/src/roap/turnDiscovery.ts +105 -46
- 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 +435 -0
- package/test/unit/spec/breakouts/breakout.ts +184 -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 +1542 -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 +289 -32
- package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
- package/test/unit/spec/locus-info/index.js +585 -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/parser.js +3 -9
- package/test/unit/spec/locus-info/selfConstant.js +110 -103
- package/test/unit/spec/locus-info/selfUtils.js +236 -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 +66 -3
- package/test/unit/spec/meeting/index.js +2934 -946
- package/test/unit/spec/meeting/muteState.js +368 -70
- package/test/unit/spec/meeting/request.js +194 -44
- package/test/unit/spec/meeting/utils.js +146 -165
- package/test/unit/spec/meeting-info/meetinginfov2.js +333 -74
- 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 +1052 -329
- package/test/unit/spec/meetings/utils.js +163 -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 +402 -54
- package/test/unit/spec/members/request.js +76 -20
- package/test/unit/spec/members/utils.js +191 -4
- package/test/unit/spec/metrics/index.js +104 -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 +21 -16
- package/test/unit/spec/roap/request.ts +217 -0
- package/test/unit/spec/roap/turnDiscovery.ts +93 -49
- 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
package/src/meeting/muteState.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
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
4
|
import PermissionError from '../common/errors/permission';
|
|
4
|
-
import
|
|
5
|
-
import MeetingUtil from '../meeting/util';
|
|
5
|
+
import MeetingUtil from './util';
|
|
6
6
|
import {AUDIO, VIDEO} from '../constants';
|
|
7
|
-
|
|
8
|
-
|
|
9
7
|
/* Certain aspects of server interaction for video muting are not implemented as we currently don't support remote muting of video.
|
|
10
8
|
If we ever need to support it, search for REMOTE_MUTE_VIDEO_MISSING_IMPLEMENTATION string to find the places that need updating
|
|
11
9
|
*/
|
|
12
10
|
|
|
13
|
-
|
|
14
|
-
const createMuteState = (type, meeting, mediaDirection) => {
|
|
11
|
+
// eslint-disable-next-line import/prefer-default-export
|
|
12
|
+
export const createMuteState = (type, meeting, mediaDirection, sdkOwnsLocalTrack: boolean) => {
|
|
13
|
+
// todo: remove mediaDirection argument (SPARK-399695)
|
|
14
|
+
// todo: remove the meeting argument (SPARK-399695)
|
|
15
15
|
if (type === AUDIO && !mediaDirection.sendAudio) {
|
|
16
16
|
return null;
|
|
17
17
|
}
|
|
@@ -19,9 +19,15 @@ const createMuteState = (type, meeting, mediaDirection) => {
|
|
|
19
19
|
return null;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
LoggerProxy.logger.info(
|
|
22
|
+
LoggerProxy.logger.info(
|
|
23
|
+
`Meeting:muteState#createMuteState --> ${type}: creating MuteState for meeting id ${meeting?.id}`
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
const muteState = new MuteState(type, meeting, sdkOwnsLocalTrack);
|
|
23
27
|
|
|
24
|
-
|
|
28
|
+
muteState.init(meeting);
|
|
29
|
+
|
|
30
|
+
return muteState;
|
|
25
31
|
};
|
|
26
32
|
|
|
27
33
|
/** The purpose of this class is to manage the local and remote mute state and make sure that the server state always matches
|
|
@@ -34,35 +40,103 @@ class MuteState {
|
|
|
34
40
|
pendingPromiseResolve: any;
|
|
35
41
|
state: any;
|
|
36
42
|
type: any;
|
|
43
|
+
sdkOwnsLocalTrack: boolean; // todo: remove this when doing SPARK-399695
|
|
44
|
+
ignoreMuteStateChange: boolean;
|
|
37
45
|
|
|
38
46
|
/**
|
|
39
47
|
* Constructor
|
|
40
48
|
*
|
|
41
49
|
* @param {String} type - audio or video
|
|
42
50
|
* @param {Object} meeting - the meeting object (used for reading current remote mute status)
|
|
51
|
+
* @param {boolean} sdkOwnsLocalTrack - if false, then client app owns the local track (for now that's the case only for multistream meetings)
|
|
43
52
|
*/
|
|
44
|
-
constructor(type: string, meeting: any) {
|
|
45
|
-
if (
|
|
53
|
+
constructor(type: string, meeting: any, sdkOwnsLocalTrack: boolean) {
|
|
54
|
+
if (type !== AUDIO && type !== VIDEO) {
|
|
46
55
|
throw new ParameterError('Mute state is designed for handling audio or video only');
|
|
47
56
|
}
|
|
48
57
|
this.type = type;
|
|
58
|
+
this.sdkOwnsLocalTrack = sdkOwnsLocalTrack;
|
|
59
|
+
this.ignoreMuteStateChange = false;
|
|
49
60
|
this.state = {
|
|
50
61
|
client: {
|
|
51
|
-
localMute: false
|
|
62
|
+
localMute: false,
|
|
52
63
|
},
|
|
53
64
|
server: {
|
|
54
65
|
localMute: false,
|
|
55
|
-
//
|
|
56
|
-
remoteMute: type === AUDIO ? meeting.remoteMuted : false,
|
|
57
|
-
unmuteAllowed: type === AUDIO ? meeting.unmuteAllowed : true
|
|
66
|
+
// because remoteVideoMuted and unmuteVideoAllowed are updated seperately, they might be undefined
|
|
67
|
+
remoteMute: type === AUDIO ? meeting.remoteMuted : meeting.remoteVideoMuted ?? false,
|
|
68
|
+
unmuteAllowed: type === AUDIO ? meeting.unmuteAllowed : meeting.unmuteVideoAllowed ?? true,
|
|
58
69
|
},
|
|
59
|
-
syncToServerInProgress: false
|
|
70
|
+
syncToServerInProgress: false,
|
|
60
71
|
};
|
|
61
72
|
// these 2 hold the resolve, reject methods for the promise we returned to the client in last handleClientRequest() call
|
|
62
73
|
this.pendingPromiseResolve = null;
|
|
63
74
|
this.pendingPromiseReject = null;
|
|
64
75
|
}
|
|
65
76
|
|
|
77
|
+
/**
|
|
78
|
+
* Starts the mute state machine. Needs to be called after a new MuteState instance is created.
|
|
79
|
+
*
|
|
80
|
+
* @param {Object} meeting - the meeting object
|
|
81
|
+
* @returns {void}
|
|
82
|
+
*/
|
|
83
|
+
public init(meeting: any) {
|
|
84
|
+
if (!this.sdkOwnsLocalTrack) {
|
|
85
|
+
this.applyUnmuteAllowedToTrack(meeting);
|
|
86
|
+
|
|
87
|
+
// if we are remotely muted, we need to apply that to the local track now (mute on-entry)
|
|
88
|
+
if (this.state.server.remoteMute) {
|
|
89
|
+
this.muteLocalTrack(meeting, this.state.server.remoteMute, 'remotelyMuted');
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const initialMute =
|
|
93
|
+
this.type === AUDIO
|
|
94
|
+
? meeting.mediaProperties.audioTrack?.muted
|
|
95
|
+
: meeting.mediaProperties.videoTrack?.muted;
|
|
96
|
+
|
|
97
|
+
LoggerProxy.logger.info(
|
|
98
|
+
`Meeting:muteState#start --> ${this.type}: local track initial mute state: ${initialMute}`
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
if (initialMute !== undefined) {
|
|
102
|
+
this.state.client.localMute = initialMute;
|
|
103
|
+
|
|
104
|
+
this.applyClientStateToServer(meeting);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* This method needs to be called whenever the local audio/video track has changed.
|
|
111
|
+
* It reapplies the remote mute state onto the new track and also reads the current
|
|
112
|
+
* local mute state from the track and updates the internal state machine and sends
|
|
113
|
+
* any required requests to the server.
|
|
114
|
+
*
|
|
115
|
+
* @param {Object} meeting - the meeting object
|
|
116
|
+
* @returns {void}
|
|
117
|
+
*/
|
|
118
|
+
public handleLocalTrackChange(meeting: any) {
|
|
119
|
+
return this.init(meeting);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Mutes/unmutes local track
|
|
124
|
+
*
|
|
125
|
+
* @param {Object} meeting - the meeting object
|
|
126
|
+
* @param {Boolean} mute - true to mute the track, false to unmute it
|
|
127
|
+
* @param {ServerMuteReason} reason - reason for muting/unmuting
|
|
128
|
+
* @returns {void}
|
|
129
|
+
*/
|
|
130
|
+
private muteLocalTrack(meeting: any, mute: boolean, reason: ServerMuteReason) {
|
|
131
|
+
this.ignoreMuteStateChange = true;
|
|
132
|
+
if (this.type === AUDIO) {
|
|
133
|
+
meeting.mediaProperties.audioTrack?.setServerMuted(mute, reason);
|
|
134
|
+
} else {
|
|
135
|
+
meeting.mediaProperties.videoTrack?.setServerMuted(mute, reason);
|
|
136
|
+
}
|
|
137
|
+
this.ignoreMuteStateChange = false;
|
|
138
|
+
}
|
|
139
|
+
|
|
66
140
|
/**
|
|
67
141
|
* Handles mute/unmute request from the client/user. Returns a promise that's resolved once the server update is completed or
|
|
68
142
|
* at the point that this request becomese superseded by another client request.
|
|
@@ -77,16 +151,22 @@ class MuteState {
|
|
|
77
151
|
* @param {Boolean} [mute] true for muting, false for unmuting request
|
|
78
152
|
* @returns {Promise}
|
|
79
153
|
*/
|
|
80
|
-
public handleClientRequest(meeting
|
|
81
|
-
|
|
154
|
+
public handleClientRequest(meeting: object, mute?: boolean) {
|
|
155
|
+
// todo: this whole method will be removed in SPARK-399695
|
|
156
|
+
LoggerProxy.logger.info(
|
|
157
|
+
`Meeting:muteState#handleClientRequest --> ${this.type}: user requesting new mute state: ${mute}`
|
|
158
|
+
);
|
|
82
159
|
|
|
83
160
|
if (!mute && !this.state.server.unmuteAllowed) {
|
|
84
|
-
return Promise.reject(
|
|
161
|
+
return Promise.reject(
|
|
162
|
+
new PermissionError('User is not allowed to unmute self (hard mute feature is being used)')
|
|
163
|
+
);
|
|
85
164
|
}
|
|
86
165
|
|
|
87
166
|
// 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,
|
|
88
|
-
// because the client may have changed the audio/
|
|
167
|
+
// because the client may have changed the audio/video tracks
|
|
89
168
|
this.state.client.localMute = mute;
|
|
169
|
+
|
|
90
170
|
this.applyClientStateLocally(meeting);
|
|
91
171
|
|
|
92
172
|
return new Promise((resolve, reject) => {
|
|
@@ -100,19 +180,52 @@ class MuteState {
|
|
|
100
180
|
});
|
|
101
181
|
}
|
|
102
182
|
|
|
183
|
+
/**
|
|
184
|
+
* This method should be called when the local track mute state is changed
|
|
185
|
+
* @public
|
|
186
|
+
* @memberof MuteState
|
|
187
|
+
* @param {Object} [meeting] the meeting object
|
|
188
|
+
* @param {Boolean} [mute] true for muting, false for unmuting request
|
|
189
|
+
* @returns {void}
|
|
190
|
+
*/
|
|
191
|
+
public handleLocalTrackMuteStateChange(meeting?: object, mute?: boolean) {
|
|
192
|
+
if (this.ignoreMuteStateChange) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
LoggerProxy.logger.info(
|
|
196
|
+
`Meeting:muteState#handleLocalTrackMuteStateChange --> ${this.type}: local track new mute state: ${mute}`
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
if (this.pendingPromiseReject) {
|
|
200
|
+
LoggerProxy.logger.error(
|
|
201
|
+
`Meeting:muteState#handleLocalTrackMuteStateChange --> ${this.type}: Local track mute state change handler called while a client request is handled - this should never happen!, mute state: ${mute}`
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
this.state.client.localMute = mute;
|
|
206
|
+
|
|
207
|
+
this.applyClientStateToServer(meeting);
|
|
208
|
+
}
|
|
209
|
+
|
|
103
210
|
/**
|
|
104
211
|
* Applies the current mute state to the local track (by enabling or disabling it accordingly)
|
|
105
212
|
*
|
|
106
213
|
* @public
|
|
107
214
|
* @param {Object} [meeting] the meeting object
|
|
215
|
+
* @param {ServerMuteReason} reason - reason why we're applying our client state to the local track
|
|
108
216
|
* @memberof MuteState
|
|
109
217
|
* @returns {void}
|
|
110
218
|
*/
|
|
111
|
-
public applyClientStateLocally(meeting?: any) {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
219
|
+
public applyClientStateLocally(meeting?: any, reason?: ServerMuteReason) {
|
|
220
|
+
if (this.sdkOwnsLocalTrack) {
|
|
221
|
+
if (this.type === AUDIO) {
|
|
222
|
+
meeting.mediaProperties.audioTrack?.setMuted(this.state.client.localMute);
|
|
223
|
+
} else {
|
|
224
|
+
meeting.mediaProperties.videoTrack?.setMuted(this.state.client.localMute);
|
|
225
|
+
}
|
|
226
|
+
} else {
|
|
227
|
+
this.muteLocalTrack(meeting, this.state.client.localMute, reason);
|
|
228
|
+
}
|
|
116
229
|
}
|
|
117
230
|
|
|
118
231
|
/**
|
|
@@ -125,19 +238,27 @@ class MuteState {
|
|
|
125
238
|
*/
|
|
126
239
|
private applyClientStateToServer(meeting?: object) {
|
|
127
240
|
if (this.state.syncToServerInProgress) {
|
|
128
|
-
LoggerProxy.logger.info(
|
|
241
|
+
LoggerProxy.logger.info(
|
|
242
|
+
`Meeting:muteState#applyClientStateToServer --> ${this.type}: request to server in progress, we need to wait for it to complete`
|
|
243
|
+
);
|
|
129
244
|
|
|
130
245
|
return;
|
|
131
246
|
}
|
|
132
247
|
|
|
133
|
-
const localMuteRequiresSync =
|
|
134
|
-
const remoteMuteRequiresSync =
|
|
248
|
+
const localMuteRequiresSync = this.state.client.localMute !== this.state.server.localMute;
|
|
249
|
+
const remoteMuteRequiresSync = !this.state.client.localMute && this.state.server.remoteMute;
|
|
135
250
|
|
|
136
|
-
LoggerProxy.logger.info(
|
|
137
|
-
|
|
251
|
+
LoggerProxy.logger.info(
|
|
252
|
+
`Meeting:muteState#applyClientStateToServer --> ${this.type}: localMuteRequiresSync: ${localMuteRequiresSync} (${this.state.client.localMute} ?= ${this.state.server.localMute})`
|
|
253
|
+
);
|
|
254
|
+
LoggerProxy.logger.info(
|
|
255
|
+
`Meeting:muteState#applyClientStateToServer --> ${this.type}: remoteMuteRequiresSync: ${remoteMuteRequiresSync}`
|
|
256
|
+
);
|
|
138
257
|
|
|
139
258
|
if (!localMuteRequiresSync && !remoteMuteRequiresSync) {
|
|
140
|
-
LoggerProxy.logger.info(
|
|
259
|
+
LoggerProxy.logger.info(
|
|
260
|
+
`Meeting:muteState#applyClientStateToServer --> ${this.type}: client state already matching server state, nothing to do`
|
|
261
|
+
);
|
|
141
262
|
|
|
142
263
|
if (this.pendingPromiseResolve) {
|
|
143
264
|
this.pendingPromiseResolve();
|
|
@@ -151,15 +272,20 @@ class MuteState {
|
|
|
151
272
|
this.state.syncToServerInProgress = true;
|
|
152
273
|
|
|
153
274
|
// first sync local mute with server
|
|
154
|
-
const localMuteSyncPromise =
|
|
275
|
+
const localMuteSyncPromise = localMuteRequiresSync
|
|
276
|
+
? this.sendLocalMuteRequestToServer(meeting)
|
|
277
|
+
: Promise.resolve();
|
|
155
278
|
|
|
156
279
|
localMuteSyncPromise
|
|
157
280
|
.then(() =>
|
|
158
281
|
// then follow it up with remote mute sync
|
|
159
|
-
|
|
282
|
+
remoteMuteRequiresSync ? this.sendRemoteMuteRequestToServer(meeting) : Promise.resolve()
|
|
283
|
+
)
|
|
160
284
|
.then(() => {
|
|
161
285
|
this.state.syncToServerInProgress = false;
|
|
162
|
-
LoggerProxy.logger.info(
|
|
286
|
+
LoggerProxy.logger.info(
|
|
287
|
+
`Meeting:muteState#applyClientStateToServer --> ${this.type}: sync with server completed`
|
|
288
|
+
);
|
|
163
289
|
|
|
164
290
|
// need to check if a new sync is required, because this.state.client may have changed while we were doing the current sync
|
|
165
291
|
this.applyClientStateToServer(meeting);
|
|
@@ -172,6 +298,8 @@ class MuteState {
|
|
|
172
298
|
}
|
|
173
299
|
this.pendingPromiseResolve = null;
|
|
174
300
|
this.pendingPromiseReject = null;
|
|
301
|
+
|
|
302
|
+
this.applyServerMuteToLocalTrack(meeting, 'clientRequestFailed');
|
|
175
303
|
});
|
|
176
304
|
}
|
|
177
305
|
|
|
@@ -184,10 +312,14 @@ class MuteState {
|
|
|
184
312
|
* @returns {Promise}
|
|
185
313
|
*/
|
|
186
314
|
private sendLocalMuteRequestToServer(meeting?: any) {
|
|
187
|
-
const audioMuted =
|
|
188
|
-
|
|
315
|
+
const audioMuted =
|
|
316
|
+
this.type === AUDIO ? this.state.client.localMute : meeting.audio?.state.client.localMute;
|
|
317
|
+
const videoMuted =
|
|
318
|
+
this.type === VIDEO ? this.state.client.localMute : meeting.video?.state.client.localMute;
|
|
189
319
|
|
|
190
|
-
LoggerProxy.logger.info(
|
|
320
|
+
LoggerProxy.logger.info(
|
|
321
|
+
`Meeting:muteState#sendLocalMuteRequestToServer --> ${this.type}: sending local mute (audio=${audioMuted}, video=${videoMuted}) to server`
|
|
322
|
+
);
|
|
191
323
|
|
|
192
324
|
return MeetingUtil.remoteUpdateAudioVideo(audioMuted, videoMuted, meeting)
|
|
193
325
|
.then((locus) => {
|
|
@@ -195,7 +327,7 @@ class MuteState {
|
|
|
195
327
|
`Meeting:muteState#sendLocalMuteRequestToServer --> ${this.type}: local mute (audio=${audioMuted}, video=${videoMuted}) applied to server`
|
|
196
328
|
);
|
|
197
329
|
|
|
198
|
-
this.state.server.localMute =
|
|
330
|
+
this.state.server.localMute = this.type === AUDIO ? audioMuted : videoMuted;
|
|
199
331
|
|
|
200
332
|
meeting.locusInfo.onFullLocus(locus);
|
|
201
333
|
|
|
@@ -210,7 +342,6 @@ class MuteState {
|
|
|
210
342
|
});
|
|
211
343
|
}
|
|
212
344
|
|
|
213
|
-
|
|
214
345
|
/**
|
|
215
346
|
* Sets the remote mute value in the server
|
|
216
347
|
*
|
|
@@ -220,32 +351,57 @@ class MuteState {
|
|
|
220
351
|
* @returns {Promise}
|
|
221
352
|
*/
|
|
222
353
|
private sendRemoteMuteRequestToServer(meeting?: any) {
|
|
223
|
-
|
|
224
|
-
const remoteMute = this.state.client.localMute;
|
|
354
|
+
const remoteMute = this.state.client.localMute;
|
|
225
355
|
|
|
226
|
-
|
|
356
|
+
LoggerProxy.logger.info(
|
|
357
|
+
`Meeting:muteState#sendRemoteMuteRequestToServer --> ${this.type}: sending remote mute:${remoteMute} to server`
|
|
358
|
+
);
|
|
359
|
+
|
|
360
|
+
return meeting.members
|
|
361
|
+
.muteMember(meeting.members.selfId, remoteMute, this.type === AUDIO)
|
|
362
|
+
.then(() => {
|
|
363
|
+
LoggerProxy.logger.info(
|
|
364
|
+
`Meeting:muteState#sendRemoteMuteRequestToServer --> ${this.type}: remote mute:${remoteMute} applied to server`
|
|
365
|
+
);
|
|
366
|
+
|
|
367
|
+
this.state.server.remoteMute = remoteMute;
|
|
368
|
+
})
|
|
369
|
+
.catch((remoteUpdateError) => {
|
|
370
|
+
LoggerProxy.logger.warn(
|
|
371
|
+
`Meeting:muteState#sendRemoteMuteRequestToServer --> ${this.type}: failed to apply remote mute ${remoteMute} to server: ${remoteUpdateError}`
|
|
372
|
+
);
|
|
227
373
|
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
`Meeting:muteState#sendRemoteMuteRequestToServer --> ${this.type}: remote mute:${remoteMute} applied to server`
|
|
232
|
-
);
|
|
374
|
+
return Promise.reject(remoteUpdateError);
|
|
375
|
+
});
|
|
376
|
+
}
|
|
233
377
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
378
|
+
/** Sets the mute state of the local track according to what server thinks is our state
|
|
379
|
+
* @param {Object} meeting - the meeting object
|
|
380
|
+
* @param {ServerMuteReason} serverMuteReason - reason why we're applying server mute to the local track
|
|
381
|
+
* @returns {void}
|
|
382
|
+
*/
|
|
383
|
+
private applyServerMuteToLocalTrack(meeting: any, serverMuteReason: ServerMuteReason) {
|
|
384
|
+
if (!this.sdkOwnsLocalTrack) {
|
|
385
|
+
const muted = this.state.server.localMute || this.state.server.remoteMute;
|
|
240
386
|
|
|
241
|
-
|
|
242
|
-
|
|
387
|
+
// update the local track mute state, but not this.state.client.localMute
|
|
388
|
+
this.muteLocalTrack(meeting, muted, serverMuteReason);
|
|
243
389
|
}
|
|
390
|
+
}
|
|
244
391
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
392
|
+
/** Applies the current value for unmute allowed to the underlying track
|
|
393
|
+
*
|
|
394
|
+
* @param {Meeting} meeting
|
|
395
|
+
* @returns {void}
|
|
396
|
+
*/
|
|
397
|
+
private applyUnmuteAllowedToTrack(meeting: any) {
|
|
398
|
+
if (!this.sdkOwnsLocalTrack) {
|
|
399
|
+
if (this.type === AUDIO) {
|
|
400
|
+
meeting.mediaProperties.audioTrack?.setUnmuteAllowed(this.state.server.unmuteAllowed);
|
|
401
|
+
} else {
|
|
402
|
+
meeting.mediaProperties.videoTrack?.setUnmuteAllowed(this.state.server.unmuteAllowed);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
249
405
|
}
|
|
250
406
|
|
|
251
407
|
/**
|
|
@@ -253,14 +409,23 @@ class MuteState {
|
|
|
253
409
|
*
|
|
254
410
|
* @public
|
|
255
411
|
* @memberof MuteState
|
|
412
|
+
* @param {Meeting} meeting
|
|
256
413
|
* @param {Boolean} [muted] true if user is remotely muted, false otherwise
|
|
257
414
|
* @param {Boolean} [unmuteAllowed] indicates if user is allowed to unmute self (false when "hard mute" feature is used)
|
|
258
415
|
* @returns {undefined}
|
|
259
416
|
*/
|
|
260
|
-
public handleServerRemoteMuteUpdate(muted?: boolean, unmuteAllowed?: boolean) {
|
|
261
|
-
LoggerProxy.logger.info(
|
|
262
|
-
|
|
263
|
-
|
|
417
|
+
public handleServerRemoteMuteUpdate(meeting: any, muted?: boolean, unmuteAllowed?: boolean) {
|
|
418
|
+
LoggerProxy.logger.info(
|
|
419
|
+
`Meeting:muteState#handleServerRemoteMuteUpdate --> ${this.type}: updating server remoteMute to (${muted})`
|
|
420
|
+
);
|
|
421
|
+
if (unmuteAllowed !== undefined) {
|
|
422
|
+
this.state.server.unmuteAllowed = unmuteAllowed;
|
|
423
|
+
this.applyUnmuteAllowedToTrack(meeting);
|
|
424
|
+
}
|
|
425
|
+
if (muted !== undefined) {
|
|
426
|
+
this.state.server.remoteMute = muted;
|
|
427
|
+
this.applyServerMuteToLocalTrack(meeting, 'remotelyMuted');
|
|
428
|
+
}
|
|
264
429
|
}
|
|
265
430
|
|
|
266
431
|
/**
|
|
@@ -272,18 +437,23 @@ class MuteState {
|
|
|
272
437
|
* @returns {undefined}
|
|
273
438
|
*/
|
|
274
439
|
public handleServerLocalUnmuteRequired(meeting?: object) {
|
|
275
|
-
LoggerProxy.logger.info(
|
|
440
|
+
LoggerProxy.logger.info(
|
|
441
|
+
`Meeting:muteState#handleServerLocalUnmuteRequired --> ${this.type}: localAudioUnmuteRequired received -> doing local unmute`
|
|
442
|
+
);
|
|
276
443
|
|
|
444
|
+
// 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
|
|
277
445
|
this.state.server.remoteMute = false;
|
|
278
446
|
this.state.client.localMute = false;
|
|
279
447
|
|
|
280
448
|
if (this.pendingPromiseReject) {
|
|
281
|
-
this.pendingPromiseReject(
|
|
449
|
+
this.pendingPromiseReject(
|
|
450
|
+
new Error('Server requested local unmute - this overrides any client request in progress')
|
|
451
|
+
);
|
|
282
452
|
this.pendingPromiseResolve = null;
|
|
283
453
|
this.pendingPromiseReject = null;
|
|
284
454
|
}
|
|
285
455
|
|
|
286
|
-
this.applyClientStateLocally(meeting);
|
|
456
|
+
this.applyClientStateLocally(meeting, 'localUnmuteRequired');
|
|
287
457
|
this.applyClientStateToServer(meeting);
|
|
288
458
|
}
|
|
289
459
|
|
|
@@ -295,7 +465,42 @@ class MuteState {
|
|
|
295
465
|
* @returns {Boolean}
|
|
296
466
|
*/
|
|
297
467
|
public isMuted() {
|
|
298
|
-
return
|
|
468
|
+
return (
|
|
469
|
+
this.state.client.localMute || this.state.server.localMute || this.state.server.remoteMute
|
|
470
|
+
);
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/**
|
|
474
|
+
* Returns true if the user is remotely muted
|
|
475
|
+
*
|
|
476
|
+
* @public
|
|
477
|
+
* @memberof MuteState
|
|
478
|
+
* @returns {Boolean}
|
|
479
|
+
*/
|
|
480
|
+
public isRemotelyMuted() {
|
|
481
|
+
return this.state.server.remoteMute;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
/**
|
|
485
|
+
* Returns true if unmute is allowed
|
|
486
|
+
*
|
|
487
|
+
* @public
|
|
488
|
+
* @memberof MuteState
|
|
489
|
+
* @returns {Boolean}
|
|
490
|
+
*/
|
|
491
|
+
public isUnmuteAllowed() {
|
|
492
|
+
return this.state.server.unmuteAllowed;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
/**
|
|
496
|
+
* Returns true if the user is locally muted
|
|
497
|
+
*
|
|
498
|
+
* @public
|
|
499
|
+
* @memberof MuteState
|
|
500
|
+
* @returns {Boolean}
|
|
501
|
+
*/
|
|
502
|
+
public isLocallyMuted() {
|
|
503
|
+
return this.state.client.localMute || this.state.server.localMute;
|
|
299
504
|
}
|
|
300
505
|
|
|
301
506
|
/**
|
|
@@ -319,5 +524,3 @@ class MuteState {
|
|
|
319
524
|
return this.isSelf();
|
|
320
525
|
}
|
|
321
526
|
}
|
|
322
|
-
|
|
323
|
-
export default createMuteState;
|