@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
|
@@ -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} 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,41 @@ describe('plugin-meetings', () => {
|
|
|
16
15
|
|
|
17
16
|
const fakeLocus = {info: 'this is a fake locus'};
|
|
18
17
|
|
|
18
|
+
const createFakeLocalTrack = (id) => {
|
|
19
|
+
return {
|
|
20
|
+
id,
|
|
21
|
+
setMuted: sinon.stub(),
|
|
22
|
+
setServerMuted: sinon.stub(),
|
|
23
|
+
setUnmuteAllowed: sinon.stub(),
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
|
|
19
27
|
beforeEach(() => {
|
|
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
|
-
onFullLocus: sinon.stub()
|
|
39
|
+
onFullLocus: 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
|
-
|
|
36
|
-
|
|
46
|
+
|
|
47
|
+
audio = createMuteState(AUDIO, meeting, {sendAudio: true}, true);
|
|
48
|
+
video = createMuteState(VIDEO, meeting, {sendVideo: true}, true);
|
|
37
49
|
|
|
38
50
|
originalRemoteUpdateAudioVideo = MeetingUtil.remoteUpdateAudioVideo;
|
|
39
51
|
|
|
40
52
|
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().resolves(fakeLocus);
|
|
41
|
-
Media.setLocalTrack = sinon.stub();
|
|
42
53
|
});
|
|
43
54
|
|
|
44
55
|
afterEach(() => {
|
|
@@ -47,8 +58,8 @@ describe('plugin-meetings', () => {
|
|
|
47
58
|
|
|
48
59
|
describe('mute state library', () => {
|
|
49
60
|
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, {}));
|
|
61
|
+
assert.isNull(createMuteState(AUDIO, meeting, {sendAudio: false}, true));
|
|
62
|
+
assert.isNull(createMuteState(AUDIO, meeting, {}, true));
|
|
52
63
|
});
|
|
53
64
|
|
|
54
65
|
it('does not create a video instance if we are not sending video', async () => {
|
|
@@ -76,22 +87,23 @@ describe('plugin-meetings', () => {
|
|
|
76
87
|
});
|
|
77
88
|
|
|
78
89
|
it('initialises correctly for video', async () => {
|
|
79
|
-
// setup fields related to
|
|
80
|
-
meeting.
|
|
81
|
-
meeting.
|
|
82
|
-
|
|
90
|
+
// setup fields related to video remote state
|
|
91
|
+
meeting.remoteVideoMuted = false;
|
|
92
|
+
meeting.unmuteVideoAllowed = false;
|
|
93
|
+
|
|
94
|
+
// create a new video MuteState instance
|
|
83
95
|
video = createMuteState(VIDEO, meeting, {sendVideo: true});
|
|
84
96
|
|
|
85
97
|
assert.isFalse(video.isMuted());
|
|
86
98
|
assert.isFalse(video.state.server.remoteMute);
|
|
87
|
-
assert.
|
|
99
|
+
assert.isFalse(video.state.server.unmuteAllowed);
|
|
88
100
|
});
|
|
89
101
|
|
|
90
102
|
it('takes remote mute into account when reporting current state', async () => {
|
|
91
103
|
assert.isFalse(audio.isMuted());
|
|
92
104
|
|
|
93
105
|
// simulate remote mute
|
|
94
|
-
audio.handleServerRemoteMuteUpdate(true, true);
|
|
106
|
+
audio.handleServerRemoteMuteUpdate(meeting, true, true);
|
|
95
107
|
|
|
96
108
|
assert.isTrue(audio.isMuted());
|
|
97
109
|
assert.isFalse(audio.isSelf());
|
|
@@ -110,8 +122,8 @@ describe('plugin-meetings', () => {
|
|
|
110
122
|
audio.handleServerLocalUnmuteRequired(meeting);
|
|
111
123
|
await testUtils.flushPromises();
|
|
112
124
|
|
|
113
|
-
// check that local track was
|
|
114
|
-
assert.calledWith(
|
|
125
|
+
// check that local track was unmuted
|
|
126
|
+
assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, false);
|
|
115
127
|
|
|
116
128
|
// and local unmute was sent to server
|
|
117
129
|
assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
|
|
@@ -128,11 +140,14 @@ describe('plugin-meetings', () => {
|
|
|
128
140
|
// first we need to mute and make that request last forever
|
|
129
141
|
let serverResponseResolve;
|
|
130
142
|
|
|
131
|
-
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
132
|
-
|
|
133
|
-
|
|
143
|
+
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
144
|
+
new Promise((resolve) => {
|
|
145
|
+
serverResponseResolve = resolve;
|
|
146
|
+
})
|
|
147
|
+
);
|
|
134
148
|
|
|
135
|
-
audio
|
|
149
|
+
audio
|
|
150
|
+
.handleClientRequest(meeting, true)
|
|
136
151
|
.then(() => {
|
|
137
152
|
clientPromiseResolved = true;
|
|
138
153
|
})
|
|
@@ -158,48 +173,92 @@ describe('plugin-meetings', () => {
|
|
|
158
173
|
assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
|
|
159
174
|
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, false, undefined, meeting);
|
|
160
175
|
|
|
161
|
-
// and local track should be
|
|
162
|
-
assert.calledWith(
|
|
176
|
+
// and local track should be unmuted
|
|
177
|
+
assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, false);
|
|
163
178
|
|
|
164
179
|
assert.isFalse(audio.isMuted());
|
|
165
180
|
assert.isFalse(audio.isSelf());
|
|
166
181
|
});
|
|
167
182
|
|
|
183
|
+
it('does local video unmute if localVideoUnmuteRequired is received', async () => {
|
|
184
|
+
// first we need to mute
|
|
185
|
+
await video.handleClientRequest(meeting, true);
|
|
186
|
+
|
|
187
|
+
assert.isTrue(video.isMuted());
|
|
188
|
+
assert.isTrue(video.isSelf());
|
|
189
|
+
|
|
190
|
+
MeetingUtil.remoteUpdateAudioVideo.resetHistory();
|
|
191
|
+
|
|
192
|
+
// now simulate server requiring us to locally unmute
|
|
193
|
+
video.handleServerLocalUnmuteRequired(meeting);
|
|
194
|
+
await testUtils.flushPromises();
|
|
195
|
+
|
|
196
|
+
// check that local track was unmuted
|
|
197
|
+
assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, false);
|
|
198
|
+
|
|
199
|
+
// and local unmute was sent to server
|
|
200
|
+
assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
|
|
201
|
+
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, undefined, false, meeting);
|
|
202
|
+
|
|
203
|
+
assert.isFalse(video.isMuted());
|
|
204
|
+
assert.isFalse(video.isSelf());
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
describe('#isLocallyMuted()', () => {
|
|
208
|
+
it('does not consider remote mute status for audio', async () => {
|
|
209
|
+
// simulate being already remote muted
|
|
210
|
+
meeting.remoteMuted = true;
|
|
211
|
+
// create a new MuteState intance
|
|
212
|
+
audio = createMuteState(AUDIO, meeting, {sendAudio: true});
|
|
213
|
+
|
|
214
|
+
assert.isFalse(audio.isLocallyMuted());
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
it('does not consider remote mute status for video', async () => {
|
|
218
|
+
// simulate being already remote muted
|
|
219
|
+
meeting.remoteVideoMuted = true;
|
|
220
|
+
// create a new MuteState intance
|
|
221
|
+
video = createMuteState(VIDEO, meeting, {sendVideo: true});
|
|
222
|
+
|
|
223
|
+
assert.isFalse(video.isLocallyMuted());
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
|
|
168
227
|
describe('#handleClientRequest', () => {
|
|
169
228
|
it('disables/enables the local audio track when audio is muted/unmuted', async () => {
|
|
170
229
|
// mute
|
|
171
230
|
audio.handleClientRequest(meeting, true);
|
|
172
|
-
assert.calledWith(
|
|
231
|
+
assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, true);
|
|
173
232
|
|
|
174
|
-
// even when calling mute when it's already muted should still call
|
|
233
|
+
// even when calling mute when it's already muted should still call setMuted
|
|
175
234
|
audio.handleClientRequest(meeting, true);
|
|
176
|
-
assert.calledWith(
|
|
235
|
+
assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, true);
|
|
177
236
|
|
|
178
237
|
// unmute
|
|
179
238
|
audio.handleClientRequest(meeting, false);
|
|
180
|
-
assert.calledWith(
|
|
239
|
+
assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, false);
|
|
181
240
|
|
|
182
|
-
// even when calling unmute when it's already unmuted should still call
|
|
241
|
+
// even when calling unmute when it's already unmuted should still call setMuted
|
|
183
242
|
audio.handleClientRequest(meeting, false);
|
|
184
|
-
assert.calledWith(
|
|
243
|
+
assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, false);
|
|
185
244
|
});
|
|
186
245
|
|
|
187
246
|
it('disables/enables the local video track when video is muted/unmuted', async () => {
|
|
188
247
|
// mute
|
|
189
248
|
video.handleClientRequest(meeting, true);
|
|
190
|
-
assert.calledWith(
|
|
249
|
+
assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, true);
|
|
191
250
|
|
|
192
|
-
// even when calling mute when it's already muted should still call
|
|
251
|
+
// even when calling mute when it's already muted should still call setMuted
|
|
193
252
|
video.handleClientRequest(meeting, false);
|
|
194
|
-
assert.calledWith(
|
|
253
|
+
assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, true);
|
|
195
254
|
|
|
196
255
|
// unmute
|
|
197
256
|
video.handleClientRequest(meeting, false);
|
|
198
|
-
assert.calledWith(
|
|
257
|
+
assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, false);
|
|
199
258
|
|
|
200
|
-
// even when calling unmute when it's already unmuted should still call
|
|
259
|
+
// even when calling unmute when it's already unmuted should still call setMuted
|
|
201
260
|
video.handleClientRequest(meeting, false);
|
|
202
|
-
assert.calledWith(
|
|
261
|
+
assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, false);
|
|
203
262
|
});
|
|
204
263
|
|
|
205
264
|
it('returns correct value in isMuted()/isSelf() methods after client mute/unmute requests', async () => {
|
|
@@ -218,32 +277,62 @@ describe('plugin-meetings', () => {
|
|
|
218
277
|
|
|
219
278
|
it('does remote unmute when unmuting and remote mute is on', async () => {
|
|
220
279
|
// simulate remote mute
|
|
221
|
-
audio.handleServerRemoteMuteUpdate(true, true);
|
|
280
|
+
audio.handleServerRemoteMuteUpdate(meeting, true, true);
|
|
222
281
|
|
|
223
282
|
// unmute
|
|
224
283
|
await audio.handleClientRequest(meeting, false);
|
|
225
284
|
|
|
226
285
|
// check that remote unmute was sent to server
|
|
227
286
|
assert.calledOnce(meeting.members.muteMember);
|
|
228
|
-
assert.calledWith(meeting.members.muteMember, meeting.members.selfId, false);
|
|
287
|
+
assert.calledWith(meeting.members.muteMember, meeting.members.selfId, false, true);
|
|
229
288
|
|
|
230
289
|
assert.isFalse(audio.isMuted());
|
|
231
290
|
assert.isFalse(audio.isSelf());
|
|
232
291
|
});
|
|
233
292
|
|
|
293
|
+
it('does video remote unmute when unmuting and remote mute is on', async () => {
|
|
294
|
+
// simulate remote mute
|
|
295
|
+
video.handleServerRemoteMuteUpdate(meeting, true, true);
|
|
296
|
+
|
|
297
|
+
// unmute
|
|
298
|
+
await video.handleClientRequest(meeting, false);
|
|
299
|
+
|
|
300
|
+
// check that remote unmute was sent to server
|
|
301
|
+
assert.calledOnce(meeting.members.muteMember);
|
|
302
|
+
assert.calledWith(meeting.members.muteMember, meeting.members.selfId, false, false);
|
|
303
|
+
|
|
304
|
+
assert.isFalse(video.isMuted());
|
|
305
|
+
assert.isFalse(video.isSelf());
|
|
306
|
+
});
|
|
307
|
+
|
|
308
|
+
it('does not video remote unmute when unmuting and remote mute is off', async () => {
|
|
309
|
+
// simulate remote mute
|
|
310
|
+
video.handleServerRemoteMuteUpdate(meeting, false, true);
|
|
311
|
+
|
|
312
|
+
// unmute
|
|
313
|
+
await video.handleClientRequest(meeting, false);
|
|
314
|
+
|
|
315
|
+
// check that remote unmute was sent to server
|
|
316
|
+
assert.notCalled(meeting.members.muteMember);
|
|
317
|
+
|
|
318
|
+
assert.isFalse(video.isMuted());
|
|
319
|
+
assert.isFalse(video.isSelf());
|
|
320
|
+
});
|
|
321
|
+
|
|
234
322
|
it('resolves client request promise once the server is updated', async () => {
|
|
235
323
|
let clientPromiseResolved = false;
|
|
236
324
|
|
|
237
325
|
let serverResponseResolve;
|
|
238
326
|
|
|
239
|
-
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
240
|
-
|
|
241
|
-
|
|
327
|
+
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
328
|
+
new Promise((resolve) => {
|
|
329
|
+
serverResponseResolve = resolve;
|
|
330
|
+
})
|
|
331
|
+
);
|
|
242
332
|
|
|
243
|
-
audio.handleClientRequest(meeting, true)
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
});
|
|
333
|
+
audio.handleClientRequest(meeting, true).then(() => {
|
|
334
|
+
clientPromiseResolved = true;
|
|
335
|
+
});
|
|
247
336
|
|
|
248
337
|
// do a small delay to make sure that the client promise doesn't resolve in that time
|
|
249
338
|
await testUtils.waitUntil(200);
|
|
@@ -257,16 +346,18 @@ describe('plugin-meetings', () => {
|
|
|
257
346
|
});
|
|
258
347
|
|
|
259
348
|
it('rejects client request promise if server request for local mute fails', async () => {
|
|
260
|
-
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
261
|
-
reject
|
|
262
|
-
|
|
349
|
+
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
350
|
+
new Promise((resolve, reject) => {
|
|
351
|
+
reject();
|
|
352
|
+
})
|
|
353
|
+
);
|
|
263
354
|
|
|
264
355
|
assert.isRejected(audio.handleClientRequest(meeting, true));
|
|
265
356
|
});
|
|
266
357
|
|
|
267
358
|
it('rejects client request promise if server request for remote mute fails', async () => {
|
|
268
359
|
// we only send remote mute requests when we're unmuting, so first we need to do a remote mute
|
|
269
|
-
audio.handleServerRemoteMuteUpdate(true, true);
|
|
360
|
+
audio.handleServerRemoteMuteUpdate(meeting, true, true);
|
|
270
361
|
|
|
271
362
|
// setup the stub to simulate server error response
|
|
272
363
|
meeting.members.muteMember = sinon.stub().rejects();
|
|
@@ -282,9 +373,11 @@ describe('plugin-meetings', () => {
|
|
|
282
373
|
it('does not send a server request if client state matches the server', async () => {
|
|
283
374
|
let serverResponseResolve;
|
|
284
375
|
|
|
285
|
-
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
286
|
-
|
|
287
|
-
|
|
376
|
+
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
377
|
+
new Promise((resolve) => {
|
|
378
|
+
serverResponseResolve = resolve;
|
|
379
|
+
})
|
|
380
|
+
);
|
|
288
381
|
|
|
289
382
|
// simulate many client requests, with the last one matching the initial one
|
|
290
383
|
audio.handleClientRequest(meeting, true);
|
|
@@ -309,22 +402,22 @@ describe('plugin-meetings', () => {
|
|
|
309
402
|
it('queues up server requests when multiple client requests are received', async () => {
|
|
310
403
|
let serverResponseResolve;
|
|
311
404
|
|
|
312
|
-
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
313
|
-
|
|
314
|
-
|
|
405
|
+
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
406
|
+
new Promise((resolve) => {
|
|
407
|
+
serverResponseResolve = resolve;
|
|
408
|
+
})
|
|
409
|
+
);
|
|
315
410
|
|
|
316
411
|
let firstClientPromiseResolved = false;
|
|
317
412
|
let secondClientPromiseResolved = false;
|
|
318
413
|
|
|
319
414
|
// 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
|
-
});
|
|
415
|
+
audio.handleClientRequest(meeting, true).then(() => {
|
|
416
|
+
firstClientPromiseResolved = true;
|
|
417
|
+
});
|
|
418
|
+
audio.handleClientRequest(meeting, false).then(() => {
|
|
419
|
+
secondClientPromiseResolved = true;
|
|
420
|
+
});
|
|
328
421
|
|
|
329
422
|
await testUtils.flushPromises();
|
|
330
423
|
|
|
@@ -349,9 +442,10 @@ describe('plugin-meetings', () => {
|
|
|
349
442
|
});
|
|
350
443
|
|
|
351
444
|
it('rejects client request to unmute if hard mute is used', (done) => {
|
|
352
|
-
audio.handleServerRemoteMuteUpdate(true, false);
|
|
445
|
+
audio.handleServerRemoteMuteUpdate(meeting, true, false);
|
|
353
446
|
|
|
354
|
-
audio
|
|
447
|
+
audio
|
|
448
|
+
.handleClientRequest(meeting, false)
|
|
355
449
|
.then(() => {
|
|
356
450
|
done(new Error('expected handleClientRequest to fail, but it did not!'));
|
|
357
451
|
})
|
|
@@ -369,11 +463,11 @@ describe('plugin-meetings', () => {
|
|
|
369
463
|
assert.isTrue(video.isSelf());
|
|
370
464
|
|
|
371
465
|
// check local mute is done, but not remote one
|
|
372
|
-
assert.calledWith(
|
|
466
|
+
assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, true);
|
|
373
467
|
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, undefined, true, meeting);
|
|
374
468
|
assert.notCalled(meeting.members.muteMember);
|
|
375
469
|
|
|
376
|
-
|
|
470
|
+
meeting.mediaProperties.videoTrack.setMuted.resetHistory();
|
|
377
471
|
MeetingUtil.remoteUpdateAudioVideo.resetHistory();
|
|
378
472
|
meeting.members.muteMember.resetHistory();
|
|
379
473
|
|
|
@@ -383,7 +477,7 @@ describe('plugin-meetings', () => {
|
|
|
383
477
|
assert.isFalse(video.isMuted());
|
|
384
478
|
assert.isFalse(video.isSelf());
|
|
385
479
|
|
|
386
|
-
assert.calledWith(
|
|
480
|
+
assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, false);
|
|
387
481
|
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, undefined, false, meeting);
|
|
388
482
|
assert.notCalled(meeting.members.muteMember);
|
|
389
483
|
});
|
|
@@ -415,3 +509,207 @@ describe('plugin-meetings', () => {
|
|
|
415
509
|
});
|
|
416
510
|
});
|
|
417
511
|
});
|
|
512
|
+
|
|
513
|
+
describe('#init, #handleLocalTrackChange', () => {
|
|
514
|
+
let meeting;
|
|
515
|
+
let muteState;
|
|
516
|
+
let setServerMutedSpy;
|
|
517
|
+
let setMutedSpy, setUnmuteAllowedSpy;
|
|
518
|
+
const fakeLocus = {info: 'this is a fake locus'};
|
|
519
|
+
|
|
520
|
+
const createFakeLocalTrack = (id, muted) => {
|
|
521
|
+
return {
|
|
522
|
+
id,
|
|
523
|
+
setMuted: sinon.stub(),
|
|
524
|
+
setServerMuted: sinon.stub(),
|
|
525
|
+
setUnmuteAllowed: sinon.stub(),
|
|
526
|
+
muted,
|
|
527
|
+
};
|
|
528
|
+
};
|
|
529
|
+
|
|
530
|
+
const setup = (mediaType, remoteMuted = false, muted = false, defineTracks = true) => {
|
|
531
|
+
|
|
532
|
+
const remoteMuteField = mediaType === AUDIO ? 'remoteMuted' : 'remoteVideoMuted';
|
|
533
|
+
|
|
534
|
+
meeting = {
|
|
535
|
+
mediaProperties: {
|
|
536
|
+
audioTrack: defineTracks ? createFakeLocalTrack('fake audio track', muted) : undefined,
|
|
537
|
+
videoTrack: defineTracks ? createFakeLocalTrack('fake video track', muted) : undefined,
|
|
538
|
+
},
|
|
539
|
+
[remoteMuteField]: remoteMuted,
|
|
540
|
+
unmuteAllowed: true,
|
|
541
|
+
unmuteVideoAllowed: true,
|
|
542
|
+
|
|
543
|
+
locusInfo: {
|
|
544
|
+
onFullLocus: sinon.stub(),
|
|
545
|
+
},
|
|
546
|
+
members: {
|
|
547
|
+
selfId: 'fake self id',
|
|
548
|
+
muteMember: sinon.stub().resolves(),
|
|
549
|
+
},
|
|
550
|
+
};
|
|
551
|
+
|
|
552
|
+
const direction = mediaType === AUDIO ? {sendAudio: true} : {sendVideo: true};
|
|
553
|
+
sinon.spy(MeetingUtil, 'remoteUpdateAudioVideo');
|
|
554
|
+
muteState = createMuteState(mediaType, meeting, direction, false);
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
const setupSpies = (mediaType) => {
|
|
558
|
+
setUnmuteAllowedSpy = mediaType === AUDIO ? meeting.mediaProperties.audioTrack?.setUnmuteAllowed : meeting.mediaProperties.videoTrack?.setUnmuteAllowed;
|
|
559
|
+
setServerMutedSpy = mediaType === AUDIO ? meeting.mediaProperties.audioTrack?.setServerMuted : meeting.mediaProperties.videoTrack?.setServerMuted;
|
|
560
|
+
setMutedSpy = mediaType === AUDIO ? meeting.mediaProperties.audioTrack?.setMuted : meeting.mediaProperties.videoTrack?.setMuted;
|
|
561
|
+
|
|
562
|
+
clearSpies();
|
|
563
|
+
};
|
|
564
|
+
|
|
565
|
+
const clearSpies = () => {
|
|
566
|
+
setUnmuteAllowedSpy?.resetHistory();
|
|
567
|
+
setServerMutedSpy?.resetHistory();
|
|
568
|
+
setMutedSpy?.resetHistory();
|
|
569
|
+
};
|
|
570
|
+
const tests = [
|
|
571
|
+
{mediaType: AUDIO, title: 'audio'},
|
|
572
|
+
{mediaType: VIDEO, title: 'video'}
|
|
573
|
+
];
|
|
574
|
+
|
|
575
|
+
tests.forEach(({mediaType, title}) =>
|
|
576
|
+
describe(title, () => {
|
|
577
|
+
|
|
578
|
+
afterEach(() => {
|
|
579
|
+
sinon.restore();
|
|
580
|
+
});
|
|
581
|
+
|
|
582
|
+
describe('#handleLocalTrackChange',() => {
|
|
583
|
+
|
|
584
|
+
it('calls init()', async () => {
|
|
585
|
+
setup(mediaType);
|
|
586
|
+
const spy = sinon.spy(muteState, 'init');
|
|
587
|
+
muteState.handleLocalTrackChange(meeting);
|
|
588
|
+
assert.calledOnceWithExactly(spy, meeting);
|
|
589
|
+
});
|
|
590
|
+
});
|
|
591
|
+
|
|
592
|
+
describe('#init', () => {
|
|
593
|
+
|
|
594
|
+
afterEach(() => {
|
|
595
|
+
sinon.restore();
|
|
596
|
+
});
|
|
597
|
+
|
|
598
|
+
it('nothing goes bad when track is undefined', async () => {
|
|
599
|
+
setup(mediaType, false, false, false);
|
|
600
|
+
setupSpies(mediaType);
|
|
601
|
+
|
|
602
|
+
muteState.init(meeting);
|
|
603
|
+
|
|
604
|
+
assert.isFalse(muteState.state.client.localMute);
|
|
605
|
+
});
|
|
606
|
+
|
|
607
|
+
it('tests when track muted is true and remoteMuted is false', async () => {
|
|
608
|
+
setup(mediaType, false, true);
|
|
609
|
+
setupSpies(mediaType);
|
|
610
|
+
|
|
611
|
+
muteState.init(meeting);
|
|
612
|
+
|
|
613
|
+
assert.calledWith(setUnmuteAllowedSpy, muteState.state.server.unmuteAllowed);
|
|
614
|
+
assert.notCalled(setServerMutedSpy);
|
|
615
|
+
assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
|
|
616
|
+
assert.isTrue(muteState.state.client.localMute);
|
|
617
|
+
});
|
|
618
|
+
|
|
619
|
+
|
|
620
|
+
it('tests when track muted is false and remoteMuted is false', async () => {
|
|
621
|
+
setup(mediaType, false, false);
|
|
622
|
+
setupSpies(mediaType);
|
|
623
|
+
muteState.state.server.localMute = true;
|
|
624
|
+
|
|
625
|
+
muteState.init(meeting);
|
|
626
|
+
|
|
627
|
+
assert.calledWith(setUnmuteAllowedSpy, muteState.state.server.unmuteAllowed);
|
|
628
|
+
assert.notCalled(setServerMutedSpy);
|
|
629
|
+
assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
|
|
630
|
+
assert.isFalse(muteState.state.client.localMute);
|
|
631
|
+
});
|
|
632
|
+
|
|
633
|
+
it('tests when remoteMuted is true', async () => {
|
|
634
|
+
// testing that muteLocalTrack is called
|
|
635
|
+
setup(mediaType, true);
|
|
636
|
+
setupSpies(mediaType);
|
|
637
|
+
|
|
638
|
+
muteState.init(meeting);
|
|
639
|
+
|
|
640
|
+
assert.calledWith(setUnmuteAllowedSpy, muteState.state.server.unmuteAllowed);
|
|
641
|
+
assert.calledOnceWithExactly(setServerMutedSpy, true, 'remotelyMuted');
|
|
642
|
+
});
|
|
643
|
+
});
|
|
644
|
+
|
|
645
|
+
describe('#handleLocalTrackMuteStateChange', () => {
|
|
646
|
+
|
|
647
|
+
afterEach(() => {
|
|
648
|
+
sinon.restore();
|
|
649
|
+
});
|
|
650
|
+
|
|
651
|
+
it('checks when ignoreMuteStateChange is true nothing changes', () => {
|
|
652
|
+
setup(mediaType, false, false);
|
|
653
|
+
muteState.ignoreMuteStateChange= true;
|
|
654
|
+
|
|
655
|
+
muteState.handleLocalTrackMuteStateChange(meeting, true);
|
|
656
|
+
assert.notCalled(MeetingUtil.remoteUpdateAudioVideo);
|
|
657
|
+
|
|
658
|
+
assert.isFalse(muteState.state.client.localMute);
|
|
659
|
+
});
|
|
660
|
+
|
|
661
|
+
it('tests localMute - true to false', () => {
|
|
662
|
+
setup(mediaType, false, true);
|
|
663
|
+
|
|
664
|
+
muteState.handleLocalTrackMuteStateChange(meeting, false);
|
|
665
|
+
assert.equal(muteState.state.client.localMute, false);
|
|
666
|
+
assert.called(MeetingUtil.remoteUpdateAudioVideo);
|
|
667
|
+
});
|
|
668
|
+
|
|
669
|
+
it('tests localMute - false to true', () => {
|
|
670
|
+
setup(mediaType, false, false);
|
|
671
|
+
|
|
672
|
+
muteState.handleLocalTrackMuteStateChange(meeting, true);
|
|
673
|
+
assert.equal(muteState.state.client.localMute, true);
|
|
674
|
+
assert.called(MeetingUtil.remoteUpdateAudioVideo);
|
|
675
|
+
});
|
|
676
|
+
});
|
|
677
|
+
|
|
678
|
+
describe('#applyClientStateLocally', () => {
|
|
679
|
+
|
|
680
|
+
afterEach(() => {
|
|
681
|
+
sinon.restore();
|
|
682
|
+
});
|
|
683
|
+
|
|
684
|
+
it('checks when sdkOwnsLocalTrack is false', () => {
|
|
685
|
+
setup(mediaType);
|
|
686
|
+
setupSpies(mediaType);
|
|
687
|
+
muteState.sdkOwnsLocalTrack= false;
|
|
688
|
+
|
|
689
|
+
muteState.applyClientStateLocally(meeting, 'somereason');
|
|
690
|
+
assert.calledOnceWithExactly(setServerMutedSpy, muteState.state.client.localMute, 'somereason');
|
|
691
|
+
assert.notCalled(setMutedSpy);
|
|
692
|
+
});
|
|
693
|
+
|
|
694
|
+
it('checks when sdkOwnsLocalTrack is true', () => {
|
|
695
|
+
setup(mediaType);
|
|
696
|
+
setupSpies(mediaType);
|
|
697
|
+
muteState.sdkOwnsLocalTrack= true;
|
|
698
|
+
|
|
699
|
+
muteState.applyClientStateLocally(meeting, 'somereason');
|
|
700
|
+
assert.notCalled(setServerMutedSpy);
|
|
701
|
+
assert.calledOnceWithExactly(setMutedSpy, muteState.state.client.localMute);
|
|
702
|
+
});
|
|
703
|
+
|
|
704
|
+
it('checks nothing explodes when tracks are undefined', () => {
|
|
705
|
+
setup(mediaType, false, false, false);
|
|
706
|
+
setupSpies(mediaType);
|
|
707
|
+
muteState.sdkOwnsLocalTrack= true;
|
|
708
|
+
|
|
709
|
+
muteState.applyClientStateLocally(meeting, 'somereason');
|
|
710
|
+
});
|
|
711
|
+
});
|
|
712
|
+
|
|
713
|
+
})
|
|
714
|
+
);
|
|
715
|
+
});
|