@webex/plugin-meetings 3.0.0-beta.13 → 3.0.0-beta.131
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -1
- package/UPGRADING.md +9 -9
- package/browsers.js +19 -24
- package/dist/annotation/annotation.types.js +7 -0
- package/dist/annotation/annotation.types.js.map +1 -0
- package/dist/annotation/constants.js +48 -0
- package/dist/annotation/constants.js.map +1 -0
- package/dist/annotation/index.js +355 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.js +193 -0
- package/dist/breakouts/breakout.js.map +1 -0
- package/dist/breakouts/collection.js +23 -0
- package/dist/breakouts/collection.js.map +1 -0
- package/dist/breakouts/edit-lock-error.js +52 -0
- package/dist/breakouts/edit-lock-error.js.map +1 -0
- package/dist/breakouts/events.js +43 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.js +994 -0
- package/dist/breakouts/index.js.map +1 -0
- package/dist/breakouts/request.js +78 -0
- package/dist/breakouts/request.js.map +1 -0
- package/dist/breakouts/utils.js +67 -0
- package/dist/breakouts/utils.js.map +1 -0
- package/dist/common/browser-detection.js +1 -20
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +5 -20
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.js +0 -7
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.js +5 -26
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +5 -26
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +6 -27
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +5 -26
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.js +5 -33
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +5 -26
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +4 -25
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reconnection-in-progress.js +0 -17
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.js +5 -26
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +5 -26
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.js +6 -41
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +1 -24
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js +0 -22
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js +0 -23
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js +0 -12
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js +0 -15
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.js +0 -4
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -8
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js +35 -61
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +4 -14
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +6 -6
- package/dist/config.js.map +1 -1
- package/dist/constants.js +203 -53
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.js +14 -0
- package/dist/controls-options-manager/constants.js.map +1 -0
- package/dist/controls-options-manager/enums.js +27 -0
- package/dist/controls-options-manager/enums.js.map +1 -0
- package/dist/controls-options-manager/index.js +297 -0
- package/dist/controls-options-manager/index.js.map +1 -0
- package/dist/controls-options-manager/types.js +7 -0
- package/dist/controls-options-manager/types.js.map +1 -0
- package/dist/controls-options-manager/util.js +294 -0
- package/dist/controls-options-manager/util.js.map +1 -0
- package/dist/index.js +72 -17
- package/dist/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.js +100 -29
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.js +3 -26
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js +0 -15
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js +4 -12
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.js +406 -216
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +0 -38
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +54 -38
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +88 -123
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +105 -91
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +55 -165
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +71 -117
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +2 -9
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +505 -495
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +77 -14
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +2603 -2462
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +291 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.js +292 -138
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +315 -336
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js +7 -0
- package/dist/meeting/request.type.js.map +1 -0
- package/dist/meeting/state.js +21 -31
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.js +463 -583
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +3 -25
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +10 -33
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +305 -286
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +1 -16
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js +98 -183
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +156 -232
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +24 -20
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +692 -593
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +23 -42
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +186 -155
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +89 -88
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +15 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +101 -69
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +12 -12
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +166 -205
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +120 -85
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js +15 -0
- package/dist/members/types.js.map +1 -0
- package/dist/members/util.js +314 -260
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.js +50 -16
- package/dist/metrics/config.js.map +1 -1
- package/dist/metrics/constants.js +4 -7
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +93 -162
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +167 -50
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +58 -65
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +74 -93
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +55 -74
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +6 -40
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +466 -442
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +32 -59
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +10 -45
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +2 -33
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js +0 -13
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.js +190 -199
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +14 -23
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/constants.js +13 -0
- package/dist/reactions/constants.js.map +1 -0
- package/dist/reactions/reactions.js +2 -4
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.js +19 -23
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.js +326 -465
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/enums.js +17 -0
- package/dist/recording-controller/enums.js.map +1 -0
- package/dist/recording-controller/index.js +343 -0
- package/dist/recording-controller/index.js.map +1 -0
- package/dist/recording-controller/util.js +63 -0
- package/dist/recording-controller/util.js.map +1 -0
- package/dist/roap/index.js +31 -75
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +129 -136
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +143 -103
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js +1 -95
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +369 -461
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +144 -94
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +13 -45
- package/dist/transcription/index.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +35 -0
- package/dist/types/annotation/constants.d.ts +31 -0
- package/dist/types/annotation/index.d.ts +124 -0
- package/dist/types/breakouts/breakout.d.ts +8 -0
- package/dist/types/breakouts/collection.d.ts +5 -0
- package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/types/breakouts/events.d.ts +2 -0
- package/dist/types/breakouts/index.d.ts +5 -0
- package/dist/types/breakouts/request.d.ts +22 -0
- package/dist/types/breakouts/utils.d.ts +15 -0
- package/dist/types/common/browser-detection.d.ts +9 -0
- package/dist/types/common/collection.d.ts +48 -0
- package/dist/types/common/config.d.ts +2 -0
- package/dist/types/common/errors/captcha-error.d.ts +15 -0
- package/dist/types/common/errors/intent-to-join.d.ts +16 -0
- package/dist/types/common/errors/join-meeting.d.ts +17 -0
- package/dist/types/common/errors/media.d.ts +15 -0
- package/dist/types/common/errors/parameter.d.ts +15 -0
- package/dist/types/common/errors/password-error.d.ts +15 -0
- package/dist/types/common/errors/permission.d.ts +14 -0
- package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
- package/dist/types/common/errors/reconnection.d.ts +15 -0
- package/dist/types/common/errors/stats.d.ts +15 -0
- package/dist/types/common/errors/webex-errors.d.ts +69 -0
- package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
- package/dist/types/common/events/events-scope.d.ts +17 -0
- package/dist/types/common/events/events.d.ts +12 -0
- package/dist/types/common/events/trigger-proxy.d.ts +2 -0
- package/dist/types/common/events/util.d.ts +2 -0
- package/dist/types/common/logs/logger-config.d.ts +2 -0
- package/dist/types/common/logs/logger-proxy.d.ts +2 -0
- package/dist/types/common/logs/request.d.ts +34 -0
- package/dist/types/common/queue.d.ts +32 -0
- package/dist/types/config.d.ts +78 -0
- package/dist/types/constants.d.ts +993 -0
- package/dist/types/controls-options-manager/constants.d.ts +4 -0
- package/dist/types/controls-options-manager/enums.d.ts +15 -0
- package/dist/types/controls-options-manager/index.d.ts +136 -0
- package/dist/types/controls-options-manager/types.d.ts +43 -0
- package/dist/types/controls-options-manager/util.d.ts +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/locus-info/controlsUtils.d.ts +2 -0
- package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
- package/dist/types/locus-info/fullState.d.ts +2 -0
- package/dist/types/locus-info/hostUtils.d.ts +2 -0
- package/dist/types/locus-info/index.d.ts +315 -0
- package/dist/types/locus-info/infoUtils.d.ts +2 -0
- package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
- package/dist/types/locus-info/parser.d.ts +212 -0
- package/dist/types/locus-info/selfUtils.d.ts +2 -0
- package/dist/types/media/index.d.ts +34 -0
- package/dist/types/media/properties.d.ts +108 -0
- package/dist/types/media/util.d.ts +2 -0
- package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +147 -0
- package/dist/types/meeting/index.d.ts +1762 -0
- package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
- package/dist/types/meeting/muteState.d.ts +186 -0
- package/dist/types/meeting/request.d.ts +269 -0
- package/dist/types/meeting/request.type.d.ts +11 -0
- package/dist/types/meeting/state.d.ts +9 -0
- package/dist/types/meeting/util.d.ts +76 -0
- package/dist/types/meeting-info/collection.d.ts +20 -0
- package/dist/types/meeting-info/index.d.ts +57 -0
- package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
- package/dist/types/meeting-info/request.d.ts +22 -0
- package/dist/types/meeting-info/util.d.ts +2 -0
- package/dist/types/meeting-info/utilv2.d.ts +2 -0
- package/dist/types/meetings/collection.d.ts +31 -0
- package/dist/types/meetings/index.d.ts +345 -0
- package/dist/types/meetings/request.d.ts +27 -0
- package/dist/types/meetings/util.d.ts +18 -0
- package/dist/types/member/index.d.ts +157 -0
- package/dist/types/member/types.d.ts +21 -0
- package/dist/types/member/util.d.ts +2 -0
- package/dist/types/members/collection.d.ts +29 -0
- package/dist/types/members/index.d.ts +353 -0
- package/dist/types/members/request.d.ts +114 -0
- package/dist/types/members/types.d.ts +24 -0
- package/dist/types/members/util.d.ts +210 -0
- package/dist/types/metrics/config.d.ts +195 -0
- package/dist/types/metrics/constants.d.ts +55 -0
- package/dist/types/metrics/index.d.ts +169 -0
- package/dist/types/multistream/mediaRequestManager.d.ts +101 -0
- package/dist/types/multistream/receiveSlot.d.ts +68 -0
- package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
- package/dist/types/multistream/remoteMedia.d.ts +72 -0
- package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
- package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
- package/dist/types/networkQualityMonitor/index.d.ts +70 -0
- package/dist/types/personal-meeting-room/index.d.ts +47 -0
- package/dist/types/personal-meeting-room/request.d.ts +14 -0
- package/dist/types/personal-meeting-room/util.d.ts +2 -0
- package/dist/types/reachability/index.d.ts +152 -0
- package/dist/types/reachability/request.d.ts +37 -0
- package/dist/types/reactions/constants.d.ts +3 -0
- package/dist/types/reactions/reactions.d.ts +4 -0
- package/dist/types/reactions/reactions.type.d.ts +52 -0
- package/dist/types/reconnection-manager/index.d.ts +126 -0
- package/dist/types/recording-controller/enums.d.ts +7 -0
- package/dist/types/recording-controller/index.d.ts +193 -0
- package/dist/types/recording-controller/util.d.ts +13 -0
- package/dist/types/roap/index.d.ts +77 -0
- package/dist/types/roap/request.d.ts +36 -0
- package/dist/types/roap/turnDiscovery.d.ts +91 -0
- package/dist/types/statsAnalyzer/global.d.ts +36 -0
- package/dist/types/statsAnalyzer/index.d.ts +200 -0
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
- package/dist/types/transcription/index.d.ts +64 -0
- package/internal-README.md +7 -6
- package/package.json +28 -21
- package/src/annotation/annotation.types.ts +42 -0
- package/src/annotation/constants.ts +36 -0
- package/src/annotation/index.ts +339 -0
- package/src/breakouts/README.md +220 -0
- package/src/breakouts/breakout.ts +163 -0
- package/src/breakouts/collection.ts +19 -0
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +37 -0
- package/src/breakouts/index.ts +860 -0
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +57 -0
- package/src/common/browser-detection.ts +9 -6
- package/src/common/collection.ts +3 -1
- package/src/common/errors/captcha-error.ts +6 -6
- package/src/common/errors/intent-to-join.ts +6 -6
- package/src/common/errors/join-meeting.ts +12 -8
- package/src/common/errors/media.ts +6 -6
- package/src/common/errors/parameter.ts +9 -6
- package/src/common/errors/password-error.ts +6 -6
- package/src/common/errors/permission.ts +5 -5
- package/src/common/errors/reconnection.ts +6 -6
- package/src/common/errors/stats.ts +6 -6
- package/src/common/errors/webex-errors.ts +7 -5
- package/src/common/errors/webex-meetings-error.ts +1 -1
- package/src/common/events/events-scope.ts +5 -1
- package/src/common/events/events.ts +5 -1
- package/src/common/events/trigger-proxy.ts +8 -3
- package/src/common/events/util.ts +1 -2
- package/src/common/logs/logger-proxy.ts +21 -10
- package/src/common/logs/request.ts +11 -8
- package/src/config.ts +16 -12
- package/src/constants.ts +153 -7
- package/src/controls-options-manager/constants.ts +5 -0
- package/src/controls-options-manager/enums.ts +18 -0
- package/src/controls-options-manager/index.ts +278 -0
- package/src/controls-options-manager/types.ts +59 -0
- package/src/controls-options-manager/util.ts +281 -0
- package/src/index.ts +33 -0
- package/src/locus-info/controlsUtils.ts +142 -24
- package/src/locus-info/fullState.ts +15 -11
- package/src/locus-info/hostUtils.ts +4 -3
- package/src/locus-info/index.ts +346 -55
- package/src/locus-info/infoUtils.ts +12 -4
- package/src/locus-info/mediaSharesUtils.ts +52 -4
- package/src/locus-info/parser.ts +46 -68
- package/src/locus-info/selfUtils.ts +195 -56
- package/src/media/index.ts +139 -196
- package/src/media/properties.ts +43 -36
- package/src/media/util.ts +1 -1
- package/src/mediaQualityMetrics/config.ts +380 -378
- package/src/meeting/in-meeting-actions.ts +159 -3
- package/src/meeting/index.ts +2803 -1584
- package/src/meeting/locusMediaRequest.ts +309 -0
- package/src/meeting/muteState.ts +290 -72
- package/src/meeting/request.ts +247 -178
- package/src/meeting/request.type.ts +13 -0
- package/src/meeting/state.ts +45 -30
- package/src/meeting/util.ts +445 -395
- package/src/meeting-info/collection.ts +2 -1
- package/src/meeting-info/index.ts +32 -30
- package/src/meeting-info/meeting-info-v2.ts +235 -116
- package/src/meeting-info/request.ts +9 -3
- package/src/meeting-info/util.ts +54 -46
- package/src/meeting-info/utilv2.ts +71 -55
- package/src/meetings/collection.ts +21 -1
- package/src/meetings/index.ts +772 -437
- package/src/meetings/request.ts +29 -25
- package/src/meetings/util.ts +132 -33
- package/src/member/index.ts +95 -49
- package/src/member/types.ts +24 -0
- package/src/member/util.ts +106 -13
- package/src/members/collection.ts +8 -1
- package/src/members/index.ts +288 -130
- package/src/members/request.ts +144 -31
- package/src/members/types.ts +28 -0
- package/src/members/util.ts +316 -235
- package/src/metrics/config.ts +302 -90
- package/src/metrics/constants.ts +2 -6
- package/src/metrics/index.ts +124 -95
- package/src/multistream/mediaRequestManager.ts +203 -45
- package/src/multistream/receiveSlot.ts +69 -26
- package/src/multistream/receiveSlotManager.ts +62 -38
- package/src/multistream/remoteMedia.ts +30 -4
- package/src/multistream/remoteMediaGroup.ts +4 -3
- package/src/multistream/remoteMediaManager.ts +230 -66
- package/src/networkQualityMonitor/index.ts +24 -27
- package/src/personal-meeting-room/index.ts +12 -16
- package/src/personal-meeting-room/request.ts +10 -3
- package/src/personal-meeting-room/util.ts +3 -3
- package/src/reachability/index.ts +131 -79
- package/src/reachability/request.ts +43 -34
- package/src/reactions/constants.ts +4 -0
- package/src/reactions/reactions.ts +8 -8
- package/src/reactions/reactions.type.ts +31 -5
- package/src/reconnection-manager/index.ts +193 -111
- package/src/recording-controller/enums.ts +8 -0
- package/src/recording-controller/index.ts +315 -0
- package/src/recording-controller/util.ts +58 -0
- package/src/roap/index.ts +53 -53
- package/src/roap/request.ts +77 -64
- package/src/roap/turnDiscovery.ts +101 -48
- package/src/statsAnalyzer/global.ts +8 -104
- package/src/statsAnalyzer/index.ts +624 -376
- package/src/statsAnalyzer/mqaUtil.ts +203 -90
- package/src/transcription/index.ts +34 -32
- package/test/integration/spec/converged-space-meetings.js +177 -0
- package/test/integration/spec/journey.js +670 -466
- package/test/integration/spec/space-meeting.js +320 -204
- package/test/integration/spec/transcription.js +7 -8
- package/test/unit/spec/annotation/index.ts +433 -0
- package/test/unit/spec/breakouts/breakout.ts +203 -0
- package/test/unit/spec/breakouts/collection.ts +15 -0
- package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
- package/test/unit/spec/breakouts/events.ts +77 -0
- package/test/unit/spec/breakouts/index.ts +1609 -0
- package/test/unit/spec/breakouts/request.ts +104 -0
- package/test/unit/spec/breakouts/utils.js +72 -0
- package/test/unit/spec/common/browser-detection.js +9 -28
- package/test/unit/spec/controls-options-manager/index.js +287 -0
- package/test/unit/spec/controls-options-manager/util.js +504 -0
- package/test/unit/spec/fixture/locus.js +93 -90
- package/test/unit/spec/locus-info/controlsUtils.js +305 -32
- package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
- package/test/unit/spec/locus-info/index.js +636 -5
- package/test/unit/spec/locus-info/infoUtils.js +26 -33
- package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
- package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
- package/test/unit/spec/locus-info/parser.js +3 -9
- package/test/unit/spec/locus-info/selfConstant.js +110 -103
- package/test/unit/spec/locus-info/selfUtils.js +252 -12
- package/test/unit/spec/media/index.ts +104 -8
- package/test/unit/spec/media/properties.ts +9 -9
- package/test/unit/spec/meeting/in-meeting-actions.ts +76 -3
- package/test/unit/spec/meeting/index.js +3112 -921
- package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
- package/test/unit/spec/meeting/muteState.js +421 -94
- package/test/unit/spec/meeting/request.js +421 -79
- package/test/unit/spec/meeting/utils.js +326 -189
- package/test/unit/spec/meeting-info/meetinginfov2.js +481 -76
- package/test/unit/spec/meeting-info/request.js +7 -9
- package/test/unit/spec/meeting-info/util.js +11 -12
- package/test/unit/spec/meeting-info/utilv2.js +131 -74
- package/test/unit/spec/meetings/collection.js +15 -1
- package/test/unit/spec/meetings/index.js +1126 -328
- package/test/unit/spec/meetings/utils.js +220 -14
- package/test/unit/spec/member/index.js +24 -1
- package/test/unit/spec/member/util.js +383 -32
- package/test/unit/spec/members/index.js +424 -55
- package/test/unit/spec/members/request.js +228 -40
- package/test/unit/spec/members/utils.js +191 -4
- package/test/unit/spec/metrics/index.js +113 -20
- package/test/unit/spec/multistream/mediaRequestManager.ts +650 -105
- package/test/unit/spec/multistream/receiveSlot.ts +76 -17
- package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
- package/test/unit/spec/multistream/remoteMedia.ts +32 -2
- package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
- package/test/unit/spec/multistream/remoteMediaManager.ts +549 -65
- package/test/unit/spec/networkQualityMonitor/index.js +24 -18
- package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
- package/test/unit/spec/reachability/index.ts +176 -27
- package/test/unit/spec/reachability/request.js +66 -0
- package/test/unit/spec/reconnection-manager/index.js +62 -31
- package/test/unit/spec/recording-controller/index.js +231 -0
- package/test/unit/spec/recording-controller/util.js +102 -0
- package/test/unit/spec/roap/index.ts +19 -49
- package/test/unit/spec/roap/request.ts +187 -0
- package/test/unit/spec/roap/turnDiscovery.ts +92 -50
- package/test/unit/spec/stats-analyzer/index.js +116 -60
- package/test/utils/cmr.js +44 -42
- package/test/utils/constants.js +9 -0
- package/test/utils/integrationTestUtils.js +64 -0
- package/test/utils/testUtils.js +63 -99
- package/test/utils/webex-config.js +22 -18
- package/test/utils/webex-test-users.js +57 -50
- package/tsconfig.json +6 -0
- package/dist/media/internal-media-core-wrapper.js +0 -22
- package/dist/media/internal-media-core-wrapper.js.map +0 -1
- package/dist/meeting/effectsState.js +0 -334
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/multistream/multistreamMedia.js +0 -116
- package/dist/multistream/multistreamMedia.js.map +0 -1
- package/src/index.js +0 -15
- package/src/media/internal-media-core-wrapper.ts +0 -9
- package/src/meeting/effectsState.ts +0 -211
- package/src/multistream/multistreamMedia.ts +0 -92
- package/test/unit/spec/meeting/effectsState.js +0 -291
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import sinon from 'sinon';
|
|
2
2
|
import {assert} from '@webex/test-helper-chai';
|
|
3
3
|
import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
|
|
4
|
-
import createMuteState from '@webex/plugin-meetings/src/meeting/muteState';
|
|
5
|
-
import Media from '@webex/plugin-meetings/src/media/index';
|
|
4
|
+
import {createMuteState, MuteState} from '@webex/plugin-meetings/src/meeting/muteState';
|
|
6
5
|
import PermissionError from '@webex/plugin-meetings/src/common/errors/permission';
|
|
7
6
|
import {AUDIO, VIDEO} from '@webex/plugin-meetings/src/constants';
|
|
8
7
|
|
|
@@ -16,29 +15,43 @@ describe('plugin-meetings', () => {
|
|
|
16
15
|
|
|
17
16
|
const fakeLocus = {info: 'this is a fake locus'};
|
|
18
17
|
|
|
19
|
-
|
|
18
|
+
const createFakeLocalTrack = (id) => {
|
|
19
|
+
return {
|
|
20
|
+
id,
|
|
21
|
+
setMuted: sinon.stub(),
|
|
22
|
+
setServerMuted: sinon.stub(),
|
|
23
|
+
setUnmuteAllowed: sinon.stub(),
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
beforeEach(async () => {
|
|
20
28
|
meeting = {
|
|
21
29
|
mediaProperties: {
|
|
22
|
-
audioTrack: 'fake audio track',
|
|
23
|
-
videoTrack: 'fake video track'
|
|
30
|
+
audioTrack: createFakeLocalTrack('fake audio track'),
|
|
31
|
+
videoTrack: createFakeLocalTrack('fake video track'),
|
|
24
32
|
},
|
|
25
33
|
remoteMuted: false,
|
|
26
34
|
unmuteAllowed: true,
|
|
35
|
+
remoteVideoMuted: false,
|
|
36
|
+
unmuteVideoAllowed: true,
|
|
37
|
+
|
|
27
38
|
locusInfo: {
|
|
28
|
-
|
|
39
|
+
onDeltaLocus: sinon.stub(),
|
|
29
40
|
},
|
|
30
41
|
members: {
|
|
31
42
|
selfId: 'fake self id',
|
|
32
|
-
muteMember: sinon.stub().resolves()
|
|
33
|
-
}
|
|
43
|
+
muteMember: sinon.stub().resolves(),
|
|
44
|
+
},
|
|
34
45
|
};
|
|
35
|
-
audio = createMuteState(AUDIO, meeting, {sendAudio: true});
|
|
36
|
-
video = createMuteState(VIDEO, meeting, {sendVideo: true});
|
|
37
46
|
|
|
38
47
|
originalRemoteUpdateAudioVideo = MeetingUtil.remoteUpdateAudioVideo;
|
|
39
48
|
|
|
40
49
|
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().resolves(fakeLocus);
|
|
41
|
-
|
|
50
|
+
|
|
51
|
+
audio = createMuteState(AUDIO, meeting, {sendAudio: true}, true);
|
|
52
|
+
video = createMuteState(VIDEO, meeting, {sendVideo: true}, true);
|
|
53
|
+
|
|
54
|
+
await testUtils.flushPromises();
|
|
42
55
|
});
|
|
43
56
|
|
|
44
57
|
afterEach(() => {
|
|
@@ -47,8 +60,8 @@ describe('plugin-meetings', () => {
|
|
|
47
60
|
|
|
48
61
|
describe('mute state library', () => {
|
|
49
62
|
it('does not create an audio instance if we are not sending audio', async () => {
|
|
50
|
-
assert.isNull(createMuteState(AUDIO, meeting, {sendAudio: false}));
|
|
51
|
-
assert.isNull(createMuteState(AUDIO, meeting, {}));
|
|
63
|
+
assert.isNull(createMuteState(AUDIO, meeting, {sendAudio: false}, true));
|
|
64
|
+
assert.isNull(createMuteState(AUDIO, meeting, {}, true));
|
|
52
65
|
});
|
|
53
66
|
|
|
54
67
|
it('does not create a video instance if we are not sending video', async () => {
|
|
@@ -59,8 +72,11 @@ describe('plugin-meetings', () => {
|
|
|
59
72
|
it('takes into account current remote mute status when instantiated', async () => {
|
|
60
73
|
// simulate being already remote muted
|
|
61
74
|
meeting.remoteMuted = true;
|
|
62
|
-
|
|
63
|
-
|
|
75
|
+
|
|
76
|
+
// create a new MuteState instance
|
|
77
|
+
audio = createMuteState(AUDIO, meeting, {sendAudio: true}, true);
|
|
78
|
+
|
|
79
|
+
await testUtils.flushPromises();
|
|
64
80
|
|
|
65
81
|
assert.isTrue(audio.isMuted());
|
|
66
82
|
assert.isFalse(audio.isSelf());
|
|
@@ -68,30 +84,35 @@ describe('plugin-meetings', () => {
|
|
|
68
84
|
// now check the opposite case
|
|
69
85
|
meeting.remoteMuted = false;
|
|
70
86
|
|
|
71
|
-
// create a new MuteState
|
|
72
|
-
audio = createMuteState(AUDIO, meeting, {sendAudio: true});
|
|
87
|
+
// create a new MuteState instance
|
|
88
|
+
audio = createMuteState(AUDIO, meeting, {sendAudio: true}, true);
|
|
89
|
+
|
|
90
|
+
await testUtils.flushPromises();
|
|
73
91
|
|
|
74
92
|
assert.isFalse(audio.isMuted());
|
|
75
93
|
assert.isFalse(audio.isSelf());
|
|
76
94
|
});
|
|
77
95
|
|
|
78
96
|
it('initialises correctly for video', async () => {
|
|
79
|
-
// setup fields related to
|
|
80
|
-
meeting.
|
|
81
|
-
meeting.
|
|
82
|
-
|
|
83
|
-
|
|
97
|
+
// setup fields related to video remote state
|
|
98
|
+
meeting.remoteVideoMuted = false;
|
|
99
|
+
meeting.unmuteVideoAllowed = false;
|
|
100
|
+
|
|
101
|
+
// create a new video MuteState instance
|
|
102
|
+
video = createMuteState(VIDEO, meeting, {sendVideo: true}, true);
|
|
103
|
+
|
|
104
|
+
await testUtils.flushPromises();
|
|
84
105
|
|
|
85
106
|
assert.isFalse(video.isMuted());
|
|
86
107
|
assert.isFalse(video.state.server.remoteMute);
|
|
87
|
-
assert.
|
|
108
|
+
assert.isFalse(video.state.server.unmuteAllowed);
|
|
88
109
|
});
|
|
89
110
|
|
|
90
111
|
it('takes remote mute into account when reporting current state', async () => {
|
|
91
112
|
assert.isFalse(audio.isMuted());
|
|
92
113
|
|
|
93
114
|
// simulate remote mute
|
|
94
|
-
audio.handleServerRemoteMuteUpdate(true, true);
|
|
115
|
+
audio.handleServerRemoteMuteUpdate(meeting, true, true);
|
|
95
116
|
|
|
96
117
|
assert.isTrue(audio.isMuted());
|
|
97
118
|
assert.isFalse(audio.isSelf());
|
|
@@ -110,12 +131,12 @@ describe('plugin-meetings', () => {
|
|
|
110
131
|
audio.handleServerLocalUnmuteRequired(meeting);
|
|
111
132
|
await testUtils.flushPromises();
|
|
112
133
|
|
|
113
|
-
// check that local track was
|
|
114
|
-
assert.calledWith(
|
|
134
|
+
// check that local track was unmuted
|
|
135
|
+
assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, false);
|
|
115
136
|
|
|
116
137
|
// and local unmute was sent to server
|
|
117
138
|
assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
|
|
118
|
-
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, false, undefined
|
|
139
|
+
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, meeting, false, undefined);
|
|
119
140
|
|
|
120
141
|
assert.isFalse(audio.isMuted());
|
|
121
142
|
assert.isFalse(audio.isSelf());
|
|
@@ -128,11 +149,14 @@ describe('plugin-meetings', () => {
|
|
|
128
149
|
// first we need to mute and make that request last forever
|
|
129
150
|
let serverResponseResolve;
|
|
130
151
|
|
|
131
|
-
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
132
|
-
|
|
133
|
-
|
|
152
|
+
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
153
|
+
new Promise((resolve) => {
|
|
154
|
+
serverResponseResolve = resolve;
|
|
155
|
+
})
|
|
156
|
+
);
|
|
134
157
|
|
|
135
|
-
audio
|
|
158
|
+
audio
|
|
159
|
+
.handleClientRequest(meeting, true)
|
|
136
160
|
.then(() => {
|
|
137
161
|
clientPromiseResolved = true;
|
|
138
162
|
})
|
|
@@ -156,50 +180,98 @@ describe('plugin-meetings', () => {
|
|
|
156
180
|
|
|
157
181
|
// local unmute should be sent to server
|
|
158
182
|
assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
|
|
159
|
-
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, false, undefined
|
|
183
|
+
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, meeting, false, undefined);
|
|
160
184
|
|
|
161
|
-
// and local track should be
|
|
162
|
-
assert.calledWith(
|
|
185
|
+
// and local track should be unmuted
|
|
186
|
+
assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, false);
|
|
163
187
|
|
|
164
188
|
assert.isFalse(audio.isMuted());
|
|
165
189
|
assert.isFalse(audio.isSelf());
|
|
166
190
|
});
|
|
167
191
|
|
|
192
|
+
it('does local video unmute if localVideoUnmuteRequired is received', async () => {
|
|
193
|
+
// first we need to mute
|
|
194
|
+
await video.handleClientRequest(meeting, true);
|
|
195
|
+
|
|
196
|
+
assert.isTrue(video.isMuted());
|
|
197
|
+
assert.isTrue(video.isSelf());
|
|
198
|
+
|
|
199
|
+
MeetingUtil.remoteUpdateAudioVideo.resetHistory();
|
|
200
|
+
|
|
201
|
+
// now simulate server requiring us to locally unmute
|
|
202
|
+
video.handleServerLocalUnmuteRequired(meeting);
|
|
203
|
+
await testUtils.flushPromises();
|
|
204
|
+
|
|
205
|
+
// check that local track was unmuted
|
|
206
|
+
assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, false);
|
|
207
|
+
|
|
208
|
+
// and local unmute was sent to server
|
|
209
|
+
assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
|
|
210
|
+
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, meeting, undefined, false);
|
|
211
|
+
|
|
212
|
+
assert.isFalse(video.isMuted());
|
|
213
|
+
assert.isFalse(video.isSelf());
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
describe('#isLocallyMuted()', () => {
|
|
217
|
+
it('does not consider remote mute status for audio', async () => {
|
|
218
|
+
// simulate being already remote muted
|
|
219
|
+
meeting.remoteMuted = true;
|
|
220
|
+
// create a new MuteState instance
|
|
221
|
+
audio = createMuteState(AUDIO, meeting, {sendAudio: true}, true);
|
|
222
|
+
|
|
223
|
+
await testUtils.flushPromises();
|
|
224
|
+
|
|
225
|
+
assert.isFalse(audio.isLocallyMuted());
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
it('does not consider remote mute status for video', async () => {
|
|
229
|
+
// simulate being already remote muted
|
|
230
|
+
meeting.remoteVideoMuted = true;
|
|
231
|
+
// create a new MuteState instance
|
|
232
|
+
video = createMuteState(VIDEO, meeting, {sendVideo: true}, true);
|
|
233
|
+
|
|
234
|
+
await testUtils.flushPromises();
|
|
235
|
+
|
|
236
|
+
assert.isFalse(video.isLocallyMuted());
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
|
|
168
240
|
describe('#handleClientRequest', () => {
|
|
169
241
|
it('disables/enables the local audio track when audio is muted/unmuted', async () => {
|
|
170
242
|
// mute
|
|
171
243
|
audio.handleClientRequest(meeting, true);
|
|
172
|
-
assert.calledWith(
|
|
244
|
+
assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, true);
|
|
173
245
|
|
|
174
|
-
// even when calling mute when it's already muted should still call
|
|
246
|
+
// even when calling mute when it's already muted should still call setMuted
|
|
175
247
|
audio.handleClientRequest(meeting, true);
|
|
176
|
-
assert.calledWith(
|
|
248
|
+
assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, true);
|
|
177
249
|
|
|
178
250
|
// unmute
|
|
179
251
|
audio.handleClientRequest(meeting, false);
|
|
180
|
-
assert.calledWith(
|
|
252
|
+
assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, false);
|
|
181
253
|
|
|
182
|
-
// even when calling unmute when it's already unmuted should still call
|
|
254
|
+
// even when calling unmute when it's already unmuted should still call setMuted
|
|
183
255
|
audio.handleClientRequest(meeting, false);
|
|
184
|
-
assert.calledWith(
|
|
256
|
+
assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, false);
|
|
185
257
|
});
|
|
186
258
|
|
|
187
259
|
it('disables/enables the local video track when video is muted/unmuted', async () => {
|
|
188
260
|
// mute
|
|
189
261
|
video.handleClientRequest(meeting, true);
|
|
190
|
-
assert.calledWith(
|
|
262
|
+
assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, true);
|
|
191
263
|
|
|
192
|
-
// even when calling mute when it's already muted should still call
|
|
264
|
+
// even when calling mute when it's already muted should still call setMuted
|
|
193
265
|
video.handleClientRequest(meeting, false);
|
|
194
|
-
assert.calledWith(
|
|
266
|
+
assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, true);
|
|
195
267
|
|
|
196
268
|
// unmute
|
|
197
269
|
video.handleClientRequest(meeting, false);
|
|
198
|
-
assert.calledWith(
|
|
270
|
+
assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, false);
|
|
199
271
|
|
|
200
|
-
// even when calling unmute when it's already unmuted should still call
|
|
272
|
+
// even when calling unmute when it's already unmuted should still call setMuted
|
|
201
273
|
video.handleClientRequest(meeting, false);
|
|
202
|
-
assert.calledWith(
|
|
274
|
+
assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, false);
|
|
203
275
|
});
|
|
204
276
|
|
|
205
277
|
it('returns correct value in isMuted()/isSelf() methods after client mute/unmute requests', async () => {
|
|
@@ -218,55 +290,90 @@ describe('plugin-meetings', () => {
|
|
|
218
290
|
|
|
219
291
|
it('does remote unmute when unmuting and remote mute is on', async () => {
|
|
220
292
|
// simulate remote mute
|
|
221
|
-
audio.handleServerRemoteMuteUpdate(true, true);
|
|
293
|
+
audio.handleServerRemoteMuteUpdate(meeting, true, true);
|
|
222
294
|
|
|
223
295
|
// unmute
|
|
224
296
|
await audio.handleClientRequest(meeting, false);
|
|
225
297
|
|
|
226
298
|
// check that remote unmute was sent to server
|
|
227
299
|
assert.calledOnce(meeting.members.muteMember);
|
|
228
|
-
assert.calledWith(meeting.members.muteMember, meeting.members.selfId, false);
|
|
300
|
+
assert.calledWith(meeting.members.muteMember, meeting.members.selfId, false, true);
|
|
229
301
|
|
|
230
302
|
assert.isFalse(audio.isMuted());
|
|
231
303
|
assert.isFalse(audio.isSelf());
|
|
232
304
|
});
|
|
233
305
|
|
|
306
|
+
it('does video remote unmute when unmuting and remote mute is on', async () => {
|
|
307
|
+
// simulate remote mute
|
|
308
|
+
video.handleServerRemoteMuteUpdate(meeting, true, true);
|
|
309
|
+
|
|
310
|
+
// unmute
|
|
311
|
+
await video.handleClientRequest(meeting, false);
|
|
312
|
+
|
|
313
|
+
// check that remote unmute was sent to server
|
|
314
|
+
assert.calledOnce(meeting.members.muteMember);
|
|
315
|
+
assert.calledWith(meeting.members.muteMember, meeting.members.selfId, false, false);
|
|
316
|
+
|
|
317
|
+
assert.isFalse(video.isMuted());
|
|
318
|
+
assert.isFalse(video.isSelf());
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
it('does not video remote unmute when unmuting and remote mute is off', async () => {
|
|
322
|
+
// simulate remote mute
|
|
323
|
+
video.handleServerRemoteMuteUpdate(meeting, false, true);
|
|
324
|
+
|
|
325
|
+
// unmute
|
|
326
|
+
await video.handleClientRequest(meeting, false);
|
|
327
|
+
|
|
328
|
+
// check that remote unmute was sent to server
|
|
329
|
+
assert.notCalled(meeting.members.muteMember);
|
|
330
|
+
|
|
331
|
+
assert.isFalse(video.isMuted());
|
|
332
|
+
assert.isFalse(video.isSelf());
|
|
333
|
+
});
|
|
334
|
+
|
|
234
335
|
it('resolves client request promise once the server is updated', async () => {
|
|
235
336
|
let clientPromiseResolved = false;
|
|
236
337
|
|
|
237
338
|
let serverResponseResolve;
|
|
238
339
|
|
|
239
|
-
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
240
|
-
|
|
241
|
-
|
|
340
|
+
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
341
|
+
new Promise((resolve) => {
|
|
342
|
+
serverResponseResolve = resolve;
|
|
343
|
+
})
|
|
344
|
+
);
|
|
242
345
|
|
|
243
|
-
audio.handleClientRequest(meeting, true)
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
});
|
|
346
|
+
audio.handleClientRequest(meeting, true).then(() => {
|
|
347
|
+
clientPromiseResolved = true;
|
|
348
|
+
});
|
|
247
349
|
|
|
248
350
|
// do a small delay to make sure that the client promise doesn't resolve in that time
|
|
249
351
|
await testUtils.waitUntil(200);
|
|
250
352
|
assert.isFalse(clientPromiseResolved);
|
|
251
353
|
|
|
354
|
+
meeting.locusInfo.onDeltaLocus.resetHistory();
|
|
355
|
+
|
|
252
356
|
// now allow the server response to arrive, this should trigger the client promise to get resolved
|
|
253
|
-
serverResponseResolve();
|
|
357
|
+
serverResponseResolve(fakeLocus);
|
|
254
358
|
await testUtils.flushPromises();
|
|
255
359
|
|
|
256
360
|
assert.isTrue(clientPromiseResolved);
|
|
361
|
+
assert.calledOnceWithExactly(meeting.locusInfo.onDeltaLocus, fakeLocus);
|
|
257
362
|
});
|
|
258
363
|
|
|
259
364
|
it('rejects client request promise if server request for local mute fails', async () => {
|
|
260
|
-
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
261
|
-
reject
|
|
262
|
-
|
|
365
|
+
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
366
|
+
new Promise((resolve, reject) => {
|
|
367
|
+
reject();
|
|
368
|
+
})
|
|
369
|
+
);
|
|
263
370
|
|
|
264
371
|
assert.isRejected(audio.handleClientRequest(meeting, true));
|
|
265
372
|
});
|
|
266
373
|
|
|
267
374
|
it('rejects client request promise if server request for remote mute fails', async () => {
|
|
268
375
|
// we only send remote mute requests when we're unmuting, so first we need to do a remote mute
|
|
269
|
-
audio.handleServerRemoteMuteUpdate(true, true);
|
|
376
|
+
audio.handleServerRemoteMuteUpdate(meeting, true, true);
|
|
270
377
|
|
|
271
378
|
// setup the stub to simulate server error response
|
|
272
379
|
meeting.members.muteMember = sinon.stub().rejects();
|
|
@@ -282,9 +389,11 @@ describe('plugin-meetings', () => {
|
|
|
282
389
|
it('does not send a server request if client state matches the server', async () => {
|
|
283
390
|
let serverResponseResolve;
|
|
284
391
|
|
|
285
|
-
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
286
|
-
|
|
287
|
-
|
|
392
|
+
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
393
|
+
new Promise((resolve) => {
|
|
394
|
+
serverResponseResolve = resolve;
|
|
395
|
+
})
|
|
396
|
+
);
|
|
288
397
|
|
|
289
398
|
// simulate many client requests, with the last one matching the initial one
|
|
290
399
|
audio.handleClientRequest(meeting, true);
|
|
@@ -309,27 +418,27 @@ describe('plugin-meetings', () => {
|
|
|
309
418
|
it('queues up server requests when multiple client requests are received', async () => {
|
|
310
419
|
let serverResponseResolve;
|
|
311
420
|
|
|
312
|
-
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
313
|
-
|
|
314
|
-
|
|
421
|
+
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
422
|
+
new Promise((resolve) => {
|
|
423
|
+
serverResponseResolve = resolve;
|
|
424
|
+
})
|
|
425
|
+
);
|
|
315
426
|
|
|
316
427
|
let firstClientPromiseResolved = false;
|
|
317
428
|
let secondClientPromiseResolved = false;
|
|
318
429
|
|
|
319
430
|
// 2 client requests, one after another without waiting for first one to resolve
|
|
320
|
-
audio.handleClientRequest(meeting, true)
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
secondClientPromiseResolved = true;
|
|
327
|
-
});
|
|
431
|
+
audio.handleClientRequest(meeting, true).then(() => {
|
|
432
|
+
firstClientPromiseResolved = true;
|
|
433
|
+
});
|
|
434
|
+
audio.handleClientRequest(meeting, false).then(() => {
|
|
435
|
+
secondClientPromiseResolved = true;
|
|
436
|
+
});
|
|
328
437
|
|
|
329
438
|
await testUtils.flushPromises();
|
|
330
439
|
|
|
331
440
|
assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
|
|
332
|
-
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, true, undefined
|
|
441
|
+
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, meeting, true, undefined);
|
|
333
442
|
|
|
334
443
|
// now allow the first request to complete
|
|
335
444
|
serverResponseResolve();
|
|
@@ -338,9 +447,7 @@ describe('plugin-meetings', () => {
|
|
|
338
447
|
|
|
339
448
|
// that should trigger the second server request to be sent
|
|
340
449
|
assert.calledTwice(MeetingUtil.remoteUpdateAudioVideo);
|
|
341
|
-
assert.
|
|
342
|
-
assert.strictEqual(undefined, MeetingUtil.remoteUpdateAudioVideo.getCall(1).args[1]);
|
|
343
|
-
assert.strictEqual(meeting, MeetingUtil.remoteUpdateAudioVideo.getCall(1).args[2]);
|
|
450
|
+
assert.deepEqual([meeting, false, undefined], MeetingUtil.remoteUpdateAudioVideo.getCall(1).args);
|
|
344
451
|
|
|
345
452
|
serverResponseResolve();
|
|
346
453
|
await testUtils.flushPromises();
|
|
@@ -349,9 +456,10 @@ describe('plugin-meetings', () => {
|
|
|
349
456
|
});
|
|
350
457
|
|
|
351
458
|
it('rejects client request to unmute if hard mute is used', (done) => {
|
|
352
|
-
audio.handleServerRemoteMuteUpdate(true, false);
|
|
459
|
+
audio.handleServerRemoteMuteUpdate(meeting, true, false);
|
|
353
460
|
|
|
354
|
-
audio
|
|
461
|
+
audio
|
|
462
|
+
.handleClientRequest(meeting, false)
|
|
355
463
|
.then(() => {
|
|
356
464
|
done(new Error('expected handleClientRequest to fail, but it did not!'));
|
|
357
465
|
})
|
|
@@ -369,11 +477,11 @@ describe('plugin-meetings', () => {
|
|
|
369
477
|
assert.isTrue(video.isSelf());
|
|
370
478
|
|
|
371
479
|
// check local mute is done, but not remote one
|
|
372
|
-
assert.calledWith(
|
|
373
|
-
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, undefined, true
|
|
480
|
+
assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, true);
|
|
481
|
+
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, meeting, undefined, true);
|
|
374
482
|
assert.notCalled(meeting.members.muteMember);
|
|
375
483
|
|
|
376
|
-
|
|
484
|
+
meeting.mediaProperties.videoTrack.setMuted.resetHistory();
|
|
377
485
|
MeetingUtil.remoteUpdateAudioVideo.resetHistory();
|
|
378
486
|
meeting.members.muteMember.resetHistory();
|
|
379
487
|
|
|
@@ -383,35 +491,254 @@ describe('plugin-meetings', () => {
|
|
|
383
491
|
assert.isFalse(video.isMuted());
|
|
384
492
|
assert.isFalse(video.isSelf());
|
|
385
493
|
|
|
386
|
-
assert.calledWith(
|
|
387
|
-
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, undefined, false
|
|
494
|
+
assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, false);
|
|
495
|
+
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, meeting, undefined, false);
|
|
388
496
|
assert.notCalled(meeting.members.muteMember);
|
|
389
497
|
});
|
|
390
498
|
|
|
391
|
-
it('sends
|
|
499
|
+
it('sends undefined value for the other media type when sending local mute', async () => {
|
|
392
500
|
// make sure the meeting object has mute state machines for both audio and video
|
|
393
501
|
meeting.audio = audio;
|
|
394
502
|
meeting.video = video;
|
|
395
503
|
|
|
396
|
-
// mute audio ->
|
|
504
|
+
// mute audio -> the call to remoteUpdateAudioVideo should have video undefined
|
|
397
505
|
await audio.handleClientRequest(meeting, true);
|
|
398
|
-
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo,
|
|
506
|
+
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, meeting, true, undefined);
|
|
399
507
|
MeetingUtil.remoteUpdateAudioVideo.resetHistory();
|
|
400
508
|
|
|
401
|
-
// now mute video ->
|
|
509
|
+
// now mute video -> the call to remoteUpdateAudioVideo should have mute for video and undefined for audio
|
|
402
510
|
await video.handleClientRequest(meeting, true);
|
|
403
|
-
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo,
|
|
511
|
+
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, meeting, undefined, true);
|
|
404
512
|
MeetingUtil.remoteUpdateAudioVideo.resetHistory();
|
|
405
513
|
|
|
406
|
-
// now unmute the audio ->
|
|
514
|
+
// now unmute the audio -> the call to remoteUpdateAudioVideo should have video undefined
|
|
407
515
|
await audio.handleClientRequest(meeting, false);
|
|
408
|
-
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo,
|
|
516
|
+
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, meeting, false, undefined);
|
|
409
517
|
MeetingUtil.remoteUpdateAudioVideo.resetHistory();
|
|
410
518
|
|
|
411
|
-
// unmute video ->
|
|
519
|
+
// unmute video -> the call to remoteUpdateAudioVideo should have both audio undefined
|
|
412
520
|
await video.handleClientRequest(meeting, false);
|
|
413
|
-
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo,
|
|
521
|
+
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, meeting, undefined, false);
|
|
414
522
|
});
|
|
415
523
|
});
|
|
416
524
|
});
|
|
417
525
|
});
|
|
526
|
+
|
|
527
|
+
describe('#init, #handleLocalTrackChange', () => {
|
|
528
|
+
let meeting;
|
|
529
|
+
let muteState;
|
|
530
|
+
let setServerMutedSpy;
|
|
531
|
+
let setMutedSpy, setUnmuteAllowedSpy;
|
|
532
|
+
const fakeLocus = {info: 'this is a fake locus'};
|
|
533
|
+
|
|
534
|
+
const createFakeLocalTrack = (id, muted) => {
|
|
535
|
+
return {
|
|
536
|
+
id,
|
|
537
|
+
setMuted: sinon.stub(),
|
|
538
|
+
setServerMuted: sinon.stub(),
|
|
539
|
+
setUnmuteAllowed: sinon.stub(),
|
|
540
|
+
muted,
|
|
541
|
+
};
|
|
542
|
+
};
|
|
543
|
+
|
|
544
|
+
const setupMeeting = (mediaType, remoteMuted = false, muted = false, defineTracks = true) => {
|
|
545
|
+
const remoteMuteField = mediaType === AUDIO ? 'remoteMuted' : 'remoteVideoMuted';
|
|
546
|
+
|
|
547
|
+
meeting = {
|
|
548
|
+
mediaProperties: {
|
|
549
|
+
audioTrack: defineTracks ? createFakeLocalTrack('fake audio track', muted) : undefined,
|
|
550
|
+
videoTrack: defineTracks ? createFakeLocalTrack('fake video track', muted) : undefined,
|
|
551
|
+
},
|
|
552
|
+
[remoteMuteField]: remoteMuted,
|
|
553
|
+
unmuteAllowed: true,
|
|
554
|
+
unmuteVideoAllowed: true,
|
|
555
|
+
|
|
556
|
+
locusInfo: {
|
|
557
|
+
onFullLocus: sinon.stub(),
|
|
558
|
+
},
|
|
559
|
+
members: {
|
|
560
|
+
selfId: 'fake self id',
|
|
561
|
+
muteMember: sinon.stub().resolves(),
|
|
562
|
+
},
|
|
563
|
+
};
|
|
564
|
+
};
|
|
565
|
+
|
|
566
|
+
const setup = async (mediaType, remoteMuted = false, muted = false, defineTracks = true) => {
|
|
567
|
+
|
|
568
|
+
setupMeeting(mediaType, remoteMuted, muted, defineTracks);
|
|
569
|
+
|
|
570
|
+
const direction = mediaType === AUDIO ? {sendAudio: true} : {sendVideo: true};
|
|
571
|
+
|
|
572
|
+
muteState = createMuteState(mediaType, meeting, direction, false);
|
|
573
|
+
|
|
574
|
+
await testUtils.flushPromises();
|
|
575
|
+
|
|
576
|
+
MeetingUtil.remoteUpdateAudioVideo.resetHistory();
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
const setupSpies = (mediaType) => {
|
|
580
|
+
setUnmuteAllowedSpy = mediaType === AUDIO ? meeting.mediaProperties.audioTrack?.setUnmuteAllowed : meeting.mediaProperties.videoTrack?.setUnmuteAllowed;
|
|
581
|
+
setServerMutedSpy = mediaType === AUDIO ? meeting.mediaProperties.audioTrack?.setServerMuted : meeting.mediaProperties.videoTrack?.setServerMuted;
|
|
582
|
+
setMutedSpy = mediaType === AUDIO ? meeting.mediaProperties.audioTrack?.setMuted : meeting.mediaProperties.videoTrack?.setMuted;
|
|
583
|
+
|
|
584
|
+
clearSpies();
|
|
585
|
+
};
|
|
586
|
+
|
|
587
|
+
const clearSpies = () => {
|
|
588
|
+
setUnmuteAllowedSpy?.resetHistory();
|
|
589
|
+
setServerMutedSpy?.resetHistory();
|
|
590
|
+
setMutedSpy?.resetHistory();
|
|
591
|
+
};
|
|
592
|
+
const tests = [
|
|
593
|
+
{mediaType: AUDIO, title: 'audio'},
|
|
594
|
+
{mediaType: VIDEO, title: 'video'}
|
|
595
|
+
];
|
|
596
|
+
|
|
597
|
+
tests.forEach(({mediaType, title}) =>
|
|
598
|
+
describe(title, () => {
|
|
599
|
+
let originalRemoteUpdateAudioVideo;
|
|
600
|
+
|
|
601
|
+
beforeEach(() => {
|
|
602
|
+
originalRemoteUpdateAudioVideo = MeetingUtil.remoteUpdateAudioVideo;
|
|
603
|
+
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().resolves({info: 'fake locus'});
|
|
604
|
+
});
|
|
605
|
+
|
|
606
|
+
afterEach(() => {
|
|
607
|
+
MeetingUtil.remoteUpdateAudioVideo = originalRemoteUpdateAudioVideo;
|
|
608
|
+
sinon.restore();
|
|
609
|
+
});
|
|
610
|
+
|
|
611
|
+
describe('#handleLocalTrackChange',() => {
|
|
612
|
+
|
|
613
|
+
it('calls init()', async () => {
|
|
614
|
+
await setup(mediaType);
|
|
615
|
+
const spy = sinon.spy(muteState, 'init');
|
|
616
|
+
muteState.handleLocalTrackChange(meeting);
|
|
617
|
+
assert.calledOnceWithExactly(spy, meeting);
|
|
618
|
+
});
|
|
619
|
+
});
|
|
620
|
+
|
|
621
|
+
describe('#init', () => {
|
|
622
|
+
|
|
623
|
+
// does the setup by calling new MuteState() so that MuteState.init() doesn't get called
|
|
624
|
+
const setupWithoutInit = async (mediaType, remoteMuted = false, muted = false, defineTracks = true) => {
|
|
625
|
+
|
|
626
|
+
setupMeeting(mediaType, remoteMuted, muted, defineTracks);
|
|
627
|
+
|
|
628
|
+
muteState = new MuteState(mediaType, meeting, false);
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
it('nothing goes bad when track is undefined', async () => {
|
|
632
|
+
await setupWithoutInit(mediaType, false, false, false);
|
|
633
|
+
setupSpies(mediaType);
|
|
634
|
+
|
|
635
|
+
muteState.init(meeting);
|
|
636
|
+
|
|
637
|
+
assert.isFalse(muteState.state.client.localMute);
|
|
638
|
+
});
|
|
639
|
+
|
|
640
|
+
it('tests when track muted is true and remoteMuted is false', async () => {
|
|
641
|
+
await setupWithoutInit(mediaType, false, true);
|
|
642
|
+
setupSpies(mediaType);
|
|
643
|
+
|
|
644
|
+
muteState.init(meeting);
|
|
645
|
+
|
|
646
|
+
assert.calledWith(setUnmuteAllowedSpy, muteState.state.server.unmuteAllowed);
|
|
647
|
+
assert.notCalled(setServerMutedSpy);
|
|
648
|
+
assert.notCalled(MeetingUtil.remoteUpdateAudioVideo);
|
|
649
|
+
assert.isTrue(muteState.state.client.localMute);
|
|
650
|
+
});
|
|
651
|
+
|
|
652
|
+
|
|
653
|
+
it('tests when track muted is false and remoteMuted is false', async () => {
|
|
654
|
+
await setupWithoutInit(mediaType, false, false);
|
|
655
|
+
setupSpies(mediaType);
|
|
656
|
+
muteState.state.server.localMute = true;
|
|
657
|
+
|
|
658
|
+
muteState.init(meeting);
|
|
659
|
+
|
|
660
|
+
assert.calledWith(setUnmuteAllowedSpy, muteState.state.server.unmuteAllowed);
|
|
661
|
+
assert.notCalled(setServerMutedSpy);
|
|
662
|
+
assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
|
|
663
|
+
assert.isFalse(muteState.state.client.localMute);
|
|
664
|
+
});
|
|
665
|
+
|
|
666
|
+
it('tests when remoteMuted is true', async () => {
|
|
667
|
+
// testing that muteLocalTrack is called
|
|
668
|
+
await setupWithoutInit(mediaType, true);
|
|
669
|
+
setupSpies(mediaType);
|
|
670
|
+
|
|
671
|
+
muteState.init(meeting);
|
|
672
|
+
|
|
673
|
+
assert.calledWith(setUnmuteAllowedSpy, muteState.state.server.unmuteAllowed);
|
|
674
|
+
assert.calledOnceWithExactly(setServerMutedSpy, true, 'remotelyMuted');
|
|
675
|
+
});
|
|
676
|
+
});
|
|
677
|
+
|
|
678
|
+
describe('#handleLocalTrackMuteStateChange', () => {
|
|
679
|
+
|
|
680
|
+
it('checks when ignoreMuteStateChange is true nothing changes', async () => {
|
|
681
|
+
await setup(mediaType, false, false);
|
|
682
|
+
muteState.ignoreMuteStateChange = true;
|
|
683
|
+
|
|
684
|
+
muteState.handleLocalTrackMuteStateChange(meeting, true);
|
|
685
|
+
assert.notCalled(MeetingUtil.remoteUpdateAudioVideo);
|
|
686
|
+
|
|
687
|
+
assert.isFalse(muteState.state.client.localMute);
|
|
688
|
+
});
|
|
689
|
+
|
|
690
|
+
it('tests localMute - true to false', async () => {
|
|
691
|
+
await setup(mediaType, false, true);
|
|
692
|
+
|
|
693
|
+
muteState.handleLocalTrackMuteStateChange(meeting, false);
|
|
694
|
+
assert.equal(muteState.state.client.localMute, false);
|
|
695
|
+
assert.called(MeetingUtil.remoteUpdateAudioVideo);
|
|
696
|
+
});
|
|
697
|
+
|
|
698
|
+
it('tests localMute - false to true', async () => {
|
|
699
|
+
await setup(mediaType, false, false);
|
|
700
|
+
|
|
701
|
+
muteState.handleLocalTrackMuteStateChange(meeting, true);
|
|
702
|
+
assert.equal(muteState.state.client.localMute, true);
|
|
703
|
+
assert.called(MeetingUtil.remoteUpdateAudioVideo);
|
|
704
|
+
});
|
|
705
|
+
});
|
|
706
|
+
|
|
707
|
+
describe('#applyClientStateLocally', () => {
|
|
708
|
+
|
|
709
|
+
afterEach(() => {
|
|
710
|
+
sinon.restore();
|
|
711
|
+
});
|
|
712
|
+
|
|
713
|
+
it('checks when sdkOwnsLocalTrack is false', async () => {
|
|
714
|
+
await setup(mediaType);
|
|
715
|
+
setupSpies(mediaType);
|
|
716
|
+
muteState.sdkOwnsLocalTrack= false;
|
|
717
|
+
|
|
718
|
+
muteState.applyClientStateLocally(meeting, 'somereason');
|
|
719
|
+
assert.calledOnceWithExactly(setServerMutedSpy, muteState.state.client.localMute, 'somereason');
|
|
720
|
+
assert.notCalled(setMutedSpy);
|
|
721
|
+
});
|
|
722
|
+
|
|
723
|
+
it('checks when sdkOwnsLocalTrack is true', async () => {
|
|
724
|
+
await setup(mediaType);
|
|
725
|
+
setupSpies(mediaType);
|
|
726
|
+
muteState.sdkOwnsLocalTrack= true;
|
|
727
|
+
|
|
728
|
+
muteState.applyClientStateLocally(meeting, 'somereason');
|
|
729
|
+
assert.notCalled(setServerMutedSpy);
|
|
730
|
+
assert.calledOnceWithExactly(setMutedSpy, muteState.state.client.localMute);
|
|
731
|
+
});
|
|
732
|
+
|
|
733
|
+
it('checks nothing explodes when tracks are undefined', async () => {
|
|
734
|
+
await setup(mediaType, false, false, false);
|
|
735
|
+
setupSpies(mediaType);
|
|
736
|
+
muteState.sdkOwnsLocalTrack= true;
|
|
737
|
+
|
|
738
|
+
muteState.applyClientStateLocally(meeting, 'somereason');
|
|
739
|
+
});
|
|
740
|
+
});
|
|
741
|
+
|
|
742
|
+
})
|
|
743
|
+
);
|
|
744
|
+
});
|