@webex/plugin-meetings 3.0.0-beta.1 → 3.0.0-beta.104
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 +919 -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 +10 -24
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +11 -24
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +12 -25
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +10 -24
- 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 +10 -24
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +9 -23
- 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 +10 -24
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +10 -24
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.js +10 -69
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +5 -25
- 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 +37 -60
- 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 +7 -6
- package/dist/config.js.map +1 -1
- package/dist/constants.js +184 -122
- 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 +25 -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 +250 -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 +56 -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 +362 -208
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +3 -37
- 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 +92 -118
- 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 +113 -337
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +96 -135
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +1 -35
- 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 +59 -14
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +2909 -2398
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.js +257 -112
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +330 -264
- 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 +63 -261
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +6 -25
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +14 -32
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +273 -280
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +3 -15
- 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 +26 -19
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +741 -548
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +26 -41
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +194 -149
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +100 -85
- 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 +90 -68
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +13 -12
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +227 -188
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +54 -39
- 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 +5 -14
- 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 +67 -159
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +250 -0
- package/dist/multistream/mediaRequestManager.js.map +1 -0
- package/dist/multistream/receiveSlot.js +202 -0
- package/dist/multistream/receiveSlot.js.map +1 -0
- package/dist/multistream/receiveSlotManager.js +176 -0
- package/dist/multistream/receiveSlotManager.js.map +1 -0
- package/dist/multistream/remoteMedia.js +270 -0
- package/dist/multistream/remoteMedia.js.map +1 -0
- package/dist/multistream/remoteMediaGroup.js +209 -0
- package/dist/multistream/remoteMediaGroup.js.map +1 -0
- package/dist/multistream/remoteMediaManager.js +1137 -0
- package/dist/multistream/remoteMediaManager.js.map +1 -0
- package/dist/networkQualityMonitor/index.js +40 -59
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +21 -45
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +1 -31
- 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 +192 -191
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +15 -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 +109 -0
- package/dist/reactions/reactions.js.map +1 -0
- package/dist/reactions/reactions.type.js +36 -0
- package/dist/reactions/reactions.type.js.map +1 -0
- package/dist/reconnection-manager/index.js +386 -527
- 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 +84 -286
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +138 -238
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +164 -102
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js +1 -93
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +399 -470
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +143 -87
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +22 -47
- 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 +968 -0
- package/dist/types/controls-options-manager/constants.d.ts +4 -0
- package/dist/types/controls-options-manager/enums.d.ts +13 -0
- package/dist/types/controls-options-manager/index.d.ts +136 -0
- package/dist/types/controls-options-manager/types.d.ts +37 -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 +129 -0
- package/dist/types/meeting/index.d.ts +1748 -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 +112 -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 +156 -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 +172 -0
- package/dist/types/metrics/constants.d.ts +54 -0
- package/dist/types/metrics/index.d.ts +152 -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 +29 -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 +219 -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 +823 -0
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +57 -0
- package/src/common/{browser-detection.js → browser-detection.ts} +9 -6
- package/src/common/collection.ts +9 -7
- package/src/common/{config.js → config.ts} +1 -1
- package/src/common/errors/{captcha-error.js → captcha-error.ts} +11 -7
- package/src/common/errors/{intent-to-join.js → intent-to-join.ts} +12 -7
- package/src/common/errors/{join-meeting.js → join-meeting.ts} +17 -8
- package/src/common/errors/{media.js → media.ts} +11 -7
- package/src/common/errors/parameter.ts +11 -7
- package/src/common/errors/{password-error.js → password-error.ts} +11 -7
- package/src/common/errors/{permission.js → permission.ts} +10 -6
- package/src/common/errors/{reconnection.js → reconnection.ts} +11 -7
- package/src/common/errors/{stats.js → stats.ts} +11 -7
- package/src/common/errors/{webex-errors.js → webex-errors.ts} +8 -25
- package/src/common/errors/{webex-meetings-error.js → webex-meetings-error.ts} +4 -2
- package/src/common/events/{events-scope.js → events-scope.ts} +6 -2
- package/src/common/events/{events.js → events.ts} +5 -1
- package/src/common/events/{trigger-proxy.js → trigger-proxy.ts} +9 -5
- package/src/common/events/{util.js → util.ts} +2 -3
- package/src/common/logs/{logger-config.js → logger-config.ts} +1 -2
- package/src/common/logs/logger-proxy.ts +44 -0
- package/src/common/logs/{request.js → request.ts} +22 -9
- package/src/common/queue.ts +1 -2
- package/src/{config.js → config.ts} +18 -12
- package/src/constants.ts +256 -183
- package/src/controls-options-manager/constants.ts +5 -0
- package/src/controls-options-manager/enums.ts +16 -0
- package/src/controls-options-manager/index.ts +278 -0
- package/src/controls-options-manager/types.ts +49 -0
- package/src/controls-options-manager/util.ts +229 -0
- package/src/index.ts +33 -0
- package/src/locus-info/controlsUtils.ts +169 -0
- package/src/locus-info/{embeddedAppsUtils.js → embeddedAppsUtils.ts} +5 -6
- package/src/locus-info/{fullState.js → fullState.ts} +16 -12
- package/src/locus-info/{hostUtils.js → hostUtils.ts} +9 -8
- package/src/locus-info/{index.js → index.ts} +331 -80
- package/src/locus-info/{infoUtils.js → infoUtils.ts} +19 -8
- package/src/locus-info/{mediaSharesUtils.js → mediaSharesUtils.ts} +17 -17
- package/src/locus-info/{parser.js → parser.ts} +67 -79
- package/src/locus-info/{selfUtils.js → selfUtils.ts} +196 -67
- package/src/media/index.ts +488 -0
- package/src/media/{properties.js → properties.ts} +67 -54
- package/src/media/util.ts +16 -0
- package/src/mediaQualityMetrics/config.ts +384 -0
- package/src/meeting/in-meeting-actions.ts +123 -3
- package/src/meeting/{index.js → index.ts} +3334 -1775
- package/src/meeting/muteState.ts +526 -0
- package/src/meeting/{request.js → request.ts} +350 -142
- package/src/meeting/request.type.ts +13 -0
- package/src/meeting/{state.js → state.ts} +50 -35
- package/src/meeting/{util.js → util.ts} +126 -159
- package/src/meeting-info/{collection.js → collection.ts} +6 -2
- package/src/meeting-info/{index.js → index.ts} +42 -36
- package/src/meeting-info/meeting-info-v2.ts +345 -0
- package/src/meeting-info/{request.js → request.ts} +14 -4
- package/src/meeting-info/{util.js → util.ts} +60 -51
- package/src/meeting-info/{utilv2.js → utilv2.ts} +76 -60
- package/src/meetings/{collection.js → collection.ts} +26 -3
- package/src/meetings/index.ts +1394 -0
- package/src/meetings/{request.js → request.ts} +34 -25
- package/src/meetings/util.ts +288 -0
- package/src/member/{index.js → index.ts} +124 -56
- package/src/member/types.ts +24 -0
- package/src/member/{util.js → util.ts} +105 -25
- package/src/members/{collection.js → collection.ts} +10 -2
- package/src/members/{index.js → index.ts} +359 -139
- package/src/members/request.ts +215 -0
- package/src/members/types.ts +28 -0
- package/src/members/{util.js → util.ts} +145 -54
- package/src/metrics/{config.js → config.ts} +256 -92
- package/src/metrics/{constants.js → constants.ts} +1 -6
- package/src/metrics/{index.js → index.ts} +116 -97
- package/src/multistream/mediaRequestManager.ts +324 -0
- package/src/multistream/receiveSlot.ts +184 -0
- package/src/multistream/receiveSlotManager.ts +166 -0
- package/src/multistream/remoteMedia.ts +254 -0
- package/src/multistream/remoteMediaGroup.ts +225 -0
- package/src/multistream/remoteMediaManager.ts +1075 -0
- package/src/networkQualityMonitor/{index.js → index.ts} +41 -29
- package/src/personal-meeting-room/{index.js → index.ts} +28 -19
- package/src/personal-meeting-room/{request.js → request.ts} +13 -4
- package/src/personal-meeting-room/{util.js → util.ts} +4 -4
- package/src/reachability/{index.js → index.ts} +157 -94
- package/src/reachability/request.ts +46 -35
- package/src/reactions/constants.ts +4 -0
- package/src/reactions/reactions.ts +104 -0
- package/src/reactions/reactions.type.ts +62 -0
- package/src/reconnection-manager/{index.js → index.ts} +261 -163
- 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 +241 -0
- package/src/roap/request.ts +172 -0
- package/src/roap/turnDiscovery.ts +127 -53
- package/src/statsAnalyzer/global.ts +37 -0
- package/src/statsAnalyzer/index.ts +1273 -0
- package/src/statsAnalyzer/mqaUtil.ts +291 -0
- package/src/transcription/{index.js → index.ts} +46 -39
- package/test/integration/spec/converged-space-meetings.js +177 -0
- package/test/integration/spec/journey.js +666 -464
- package/test/integration/spec/space-meeting.js +321 -206
- 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 +1504 -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 +403 -0
- package/test/unit/spec/fixture/locus.js +92 -90
- package/test/unit/spec/locus-info/controlsUtils.js +177 -32
- package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
- package/test/unit/spec/locus-info/index.js +493 -3
- package/test/unit/spec/locus-info/infoUtils.js +41 -32
- 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 +303 -0
- package/test/unit/spec/media/properties.ts +73 -82
- package/test/unit/spec/meeting/in-meeting-actions.ts +58 -3
- package/test/unit/spec/meeting/index.js +3127 -975
- package/test/unit/spec/meeting/muteState.js +375 -70
- package/test/unit/spec/meeting/request.js +217 -43
- package/test/unit/spec/meeting/utils.js +205 -163
- package/test/unit/spec/meeting-info/meetinginfov2.js +268 -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 -333
- 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 +359 -32
- package/test/unit/spec/members/index.js +547 -37
- 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 +46 -20
- package/test/unit/spec/multistream/mediaRequestManager.ts +1060 -0
- package/test/unit/spec/multistream/receiveSlot.ts +163 -0
- package/test/unit/spec/multistream/receiveSlotManager.ts +203 -0
- package/test/unit/spec/multistream/remoteMedia.ts +255 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +396 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +1793 -0
- 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 +106 -9
- 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 +78 -45
- 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 +118 -65
- 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/meeting/effectsState.js +0 -327
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/peer-connection-manager/index.js +0 -794
- package/dist/peer-connection-manager/index.js.map +0 -1
- package/dist/peer-connection-manager/util.js +0 -124
- package/dist/peer-connection-manager/util.js.map +0 -1
- package/dist/roap/collection.js +0 -73
- package/dist/roap/collection.js.map +0 -1
- package/dist/roap/handler.js +0 -337
- package/dist/roap/handler.js.map +0 -1
- package/dist/roap/state.js +0 -164
- package/dist/roap/state.js.map +0 -1
- package/dist/roap/util.js +0 -102
- package/dist/roap/util.js.map +0 -1
- package/src/common/logs/logger-proxy.js +0 -33
- package/src/index.js +0 -15
- package/src/locus-info/controlsUtils.js +0 -102
- package/src/media/index.js +0 -593
- package/src/media/util.js +0 -38
- package/src/mediaQualityMetrics/config.js +0 -382
- package/src/meeting/effectsState.js +0 -205
- package/src/meeting/muteState.js +0 -318
- package/src/meeting-info/meeting-info-v2.js +0 -255
- package/src/meetings/index.js +0 -986
- package/src/meetings/util.js +0 -176
- package/src/members/request.js +0 -131
- package/src/peer-connection-manager/index.js +0 -723
- package/src/peer-connection-manager/util.ts +0 -117
- package/src/roap/collection.js +0 -63
- package/src/roap/handler.js +0 -252
- package/src/roap/index.js +0 -380
- package/src/roap/request.js +0 -198
- package/src/roap/state.js +0 -149
- package/src/roap/util.js +0 -93
- package/src/statsAnalyzer/global.js +0 -131
- package/src/statsAnalyzer/index.js +0 -1020
- package/src/statsAnalyzer/mqaUtil.js +0 -173
- package/test/unit/spec/meeting/effectsState.js +0 -293
- package/test/unit/spec/peerconnection-manager/index.js +0 -188
- package/test/unit/spec/peerconnection-manager/utils.js +0 -48
- package/test/unit/spec/peerconnection-manager/utils.test-fixtures.ts +0 -389
- package/test/unit/spec/roap/util.js +0 -30
- /package/src/common/errors/{reconnection-in-progress.js → reconnection-in-progress.ts} +0 -0
|
@@ -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
|
|
|
@@ -12,36 +11,55 @@ describe('plugin-meetings', () => {
|
|
|
12
11
|
let meeting;
|
|
13
12
|
let audio;
|
|
14
13
|
let video;
|
|
14
|
+
let originalRemoteUpdateAudioVideo;
|
|
15
15
|
|
|
16
16
|
const fakeLocus = {info: 'this is a fake locus'};
|
|
17
17
|
|
|
18
|
+
const createFakeLocalTrack = (id) => {
|
|
19
|
+
return {
|
|
20
|
+
id,
|
|
21
|
+
setMuted: sinon.stub(),
|
|
22
|
+
setServerMuted: sinon.stub(),
|
|
23
|
+
setUnmuteAllowed: sinon.stub(),
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
|
|
18
27
|
beforeEach(() => {
|
|
19
28
|
meeting = {
|
|
20
29
|
mediaProperties: {
|
|
21
|
-
audioTrack: 'fake audio track',
|
|
22
|
-
videoTrack: 'fake video track'
|
|
30
|
+
audioTrack: createFakeLocalTrack('fake audio track'),
|
|
31
|
+
videoTrack: createFakeLocalTrack('fake video track'),
|
|
23
32
|
},
|
|
24
33
|
remoteMuted: false,
|
|
25
34
|
unmuteAllowed: true,
|
|
35
|
+
remoteVideoMuted: false,
|
|
36
|
+
unmuteVideoAllowed: true,
|
|
37
|
+
|
|
26
38
|
locusInfo: {
|
|
27
|
-
onFullLocus: sinon.stub()
|
|
39
|
+
onFullLocus: sinon.stub(),
|
|
28
40
|
},
|
|
29
41
|
members: {
|
|
30
42
|
selfId: 'fake self id',
|
|
31
|
-
muteMember: sinon.stub().resolves()
|
|
32
|
-
}
|
|
43
|
+
muteMember: sinon.stub().resolves(),
|
|
44
|
+
},
|
|
33
45
|
};
|
|
34
|
-
|
|
35
|
-
|
|
46
|
+
|
|
47
|
+
audio = createMuteState(AUDIO, meeting, {sendAudio: true}, true);
|
|
48
|
+
video = createMuteState(VIDEO, meeting, {sendVideo: true}, true);
|
|
49
|
+
|
|
50
|
+
originalRemoteUpdateAudioVideo = MeetingUtil.remoteUpdateAudioVideo;
|
|
36
51
|
|
|
37
52
|
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().resolves(fakeLocus);
|
|
38
|
-
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
afterEach(() => {
|
|
56
|
+
MeetingUtil.remoteUpdateAudioVideo = originalRemoteUpdateAudioVideo;
|
|
39
57
|
});
|
|
40
58
|
|
|
41
59
|
describe('mute state library', () => {
|
|
42
60
|
it('does not create an audio instance if we are not sending audio', async () => {
|
|
43
|
-
assert.isNull(createMuteState(AUDIO, meeting, {sendAudio: false}));
|
|
44
|
-
assert.isNull(createMuteState(AUDIO, meeting, {}));
|
|
61
|
+
assert.isNull(createMuteState(AUDIO, meeting, {sendAudio: false}, true));
|
|
62
|
+
assert.isNull(createMuteState(AUDIO, meeting, {}, true));
|
|
45
63
|
});
|
|
46
64
|
|
|
47
65
|
it('does not create a video instance if we are not sending video', async () => {
|
|
@@ -69,22 +87,23 @@ describe('plugin-meetings', () => {
|
|
|
69
87
|
});
|
|
70
88
|
|
|
71
89
|
it('initialises correctly for video', async () => {
|
|
72
|
-
// setup fields related to
|
|
73
|
-
meeting.
|
|
74
|
-
meeting.
|
|
75
|
-
|
|
90
|
+
// setup fields related to video remote state
|
|
91
|
+
meeting.remoteVideoMuted = false;
|
|
92
|
+
meeting.unmuteVideoAllowed = false;
|
|
93
|
+
|
|
94
|
+
// create a new video MuteState instance
|
|
76
95
|
video = createMuteState(VIDEO, meeting, {sendVideo: true});
|
|
77
96
|
|
|
78
97
|
assert.isFalse(video.isMuted());
|
|
79
98
|
assert.isFalse(video.state.server.remoteMute);
|
|
80
|
-
assert.
|
|
99
|
+
assert.isFalse(video.state.server.unmuteAllowed);
|
|
81
100
|
});
|
|
82
101
|
|
|
83
102
|
it('takes remote mute into account when reporting current state', async () => {
|
|
84
103
|
assert.isFalse(audio.isMuted());
|
|
85
104
|
|
|
86
105
|
// simulate remote mute
|
|
87
|
-
audio.handleServerRemoteMuteUpdate(true, true);
|
|
106
|
+
audio.handleServerRemoteMuteUpdate(meeting, true, true);
|
|
88
107
|
|
|
89
108
|
assert.isTrue(audio.isMuted());
|
|
90
109
|
assert.isFalse(audio.isSelf());
|
|
@@ -103,8 +122,8 @@ describe('plugin-meetings', () => {
|
|
|
103
122
|
audio.handleServerLocalUnmuteRequired(meeting);
|
|
104
123
|
await testUtils.flushPromises();
|
|
105
124
|
|
|
106
|
-
// check that local track was
|
|
107
|
-
assert.calledWith(
|
|
125
|
+
// check that local track was unmuted
|
|
126
|
+
assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, false);
|
|
108
127
|
|
|
109
128
|
// and local unmute was sent to server
|
|
110
129
|
assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
|
|
@@ -121,11 +140,14 @@ describe('plugin-meetings', () => {
|
|
|
121
140
|
// first we need to mute and make that request last forever
|
|
122
141
|
let serverResponseResolve;
|
|
123
142
|
|
|
124
|
-
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
125
|
-
|
|
126
|
-
|
|
143
|
+
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
144
|
+
new Promise((resolve) => {
|
|
145
|
+
serverResponseResolve = resolve;
|
|
146
|
+
})
|
|
147
|
+
);
|
|
127
148
|
|
|
128
|
-
audio
|
|
149
|
+
audio
|
|
150
|
+
.handleClientRequest(meeting, true)
|
|
129
151
|
.then(() => {
|
|
130
152
|
clientPromiseResolved = true;
|
|
131
153
|
})
|
|
@@ -151,48 +173,92 @@ describe('plugin-meetings', () => {
|
|
|
151
173
|
assert.calledOnce(MeetingUtil.remoteUpdateAudioVideo);
|
|
152
174
|
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, false, undefined, meeting);
|
|
153
175
|
|
|
154
|
-
// and local track should be
|
|
155
|
-
assert.calledWith(
|
|
176
|
+
// and local track should be unmuted
|
|
177
|
+
assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, false);
|
|
156
178
|
|
|
157
179
|
assert.isFalse(audio.isMuted());
|
|
158
180
|
assert.isFalse(audio.isSelf());
|
|
159
181
|
});
|
|
160
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
|
+
|
|
161
227
|
describe('#handleClientRequest', () => {
|
|
162
228
|
it('disables/enables the local audio track when audio is muted/unmuted', async () => {
|
|
163
229
|
// mute
|
|
164
230
|
audio.handleClientRequest(meeting, true);
|
|
165
|
-
assert.calledWith(
|
|
231
|
+
assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, true);
|
|
166
232
|
|
|
167
|
-
// 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
|
|
168
234
|
audio.handleClientRequest(meeting, true);
|
|
169
|
-
assert.calledWith(
|
|
235
|
+
assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, true);
|
|
170
236
|
|
|
171
237
|
// unmute
|
|
172
238
|
audio.handleClientRequest(meeting, false);
|
|
173
|
-
assert.calledWith(
|
|
239
|
+
assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, false);
|
|
174
240
|
|
|
175
|
-
// 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
|
|
176
242
|
audio.handleClientRequest(meeting, false);
|
|
177
|
-
assert.calledWith(
|
|
243
|
+
assert.calledWith(meeting.mediaProperties.audioTrack.setMuted, false);
|
|
178
244
|
});
|
|
179
245
|
|
|
180
246
|
it('disables/enables the local video track when video is muted/unmuted', async () => {
|
|
181
247
|
// mute
|
|
182
248
|
video.handleClientRequest(meeting, true);
|
|
183
|
-
assert.calledWith(
|
|
249
|
+
assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, true);
|
|
184
250
|
|
|
185
|
-
// 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
|
|
186
252
|
video.handleClientRequest(meeting, false);
|
|
187
|
-
assert.calledWith(
|
|
253
|
+
assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, true);
|
|
188
254
|
|
|
189
255
|
// unmute
|
|
190
256
|
video.handleClientRequest(meeting, false);
|
|
191
|
-
assert.calledWith(
|
|
257
|
+
assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, false);
|
|
192
258
|
|
|
193
|
-
// 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
|
|
194
260
|
video.handleClientRequest(meeting, false);
|
|
195
|
-
assert.calledWith(
|
|
261
|
+
assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, false);
|
|
196
262
|
});
|
|
197
263
|
|
|
198
264
|
it('returns correct value in isMuted()/isSelf() methods after client mute/unmute requests', async () => {
|
|
@@ -211,32 +277,62 @@ describe('plugin-meetings', () => {
|
|
|
211
277
|
|
|
212
278
|
it('does remote unmute when unmuting and remote mute is on', async () => {
|
|
213
279
|
// simulate remote mute
|
|
214
|
-
audio.handleServerRemoteMuteUpdate(true, true);
|
|
280
|
+
audio.handleServerRemoteMuteUpdate(meeting, true, true);
|
|
215
281
|
|
|
216
282
|
// unmute
|
|
217
283
|
await audio.handleClientRequest(meeting, false);
|
|
218
284
|
|
|
219
285
|
// check that remote unmute was sent to server
|
|
220
286
|
assert.calledOnce(meeting.members.muteMember);
|
|
221
|
-
assert.calledWith(meeting.members.muteMember, meeting.members.selfId, false);
|
|
287
|
+
assert.calledWith(meeting.members.muteMember, meeting.members.selfId, false, true);
|
|
222
288
|
|
|
223
289
|
assert.isFalse(audio.isMuted());
|
|
224
290
|
assert.isFalse(audio.isSelf());
|
|
225
291
|
});
|
|
226
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
|
+
|
|
227
322
|
it('resolves client request promise once the server is updated', async () => {
|
|
228
323
|
let clientPromiseResolved = false;
|
|
229
324
|
|
|
230
325
|
let serverResponseResolve;
|
|
231
326
|
|
|
232
|
-
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
233
|
-
|
|
234
|
-
|
|
327
|
+
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
328
|
+
new Promise((resolve) => {
|
|
329
|
+
serverResponseResolve = resolve;
|
|
330
|
+
})
|
|
331
|
+
);
|
|
235
332
|
|
|
236
|
-
audio.handleClientRequest(meeting, true)
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
});
|
|
333
|
+
audio.handleClientRequest(meeting, true).then(() => {
|
|
334
|
+
clientPromiseResolved = true;
|
|
335
|
+
});
|
|
240
336
|
|
|
241
337
|
// do a small delay to make sure that the client promise doesn't resolve in that time
|
|
242
338
|
await testUtils.waitUntil(200);
|
|
@@ -250,16 +346,18 @@ describe('plugin-meetings', () => {
|
|
|
250
346
|
});
|
|
251
347
|
|
|
252
348
|
it('rejects client request promise if server request for local mute fails', async () => {
|
|
253
|
-
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
254
|
-
reject
|
|
255
|
-
|
|
349
|
+
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
350
|
+
new Promise((resolve, reject) => {
|
|
351
|
+
reject();
|
|
352
|
+
})
|
|
353
|
+
);
|
|
256
354
|
|
|
257
355
|
assert.isRejected(audio.handleClientRequest(meeting, true));
|
|
258
356
|
});
|
|
259
357
|
|
|
260
358
|
it('rejects client request promise if server request for remote mute fails', async () => {
|
|
261
359
|
// we only send remote mute requests when we're unmuting, so first we need to do a remote mute
|
|
262
|
-
audio.handleServerRemoteMuteUpdate(true, true);
|
|
360
|
+
audio.handleServerRemoteMuteUpdate(meeting, true, true);
|
|
263
361
|
|
|
264
362
|
// setup the stub to simulate server error response
|
|
265
363
|
meeting.members.muteMember = sinon.stub().rejects();
|
|
@@ -275,9 +373,11 @@ describe('plugin-meetings', () => {
|
|
|
275
373
|
it('does not send a server request if client state matches the server', async () => {
|
|
276
374
|
let serverResponseResolve;
|
|
277
375
|
|
|
278
|
-
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
279
|
-
|
|
280
|
-
|
|
376
|
+
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
377
|
+
new Promise((resolve) => {
|
|
378
|
+
serverResponseResolve = resolve;
|
|
379
|
+
})
|
|
380
|
+
);
|
|
281
381
|
|
|
282
382
|
// simulate many client requests, with the last one matching the initial one
|
|
283
383
|
audio.handleClientRequest(meeting, true);
|
|
@@ -302,22 +402,22 @@ describe('plugin-meetings', () => {
|
|
|
302
402
|
it('queues up server requests when multiple client requests are received', async () => {
|
|
303
403
|
let serverResponseResolve;
|
|
304
404
|
|
|
305
|
-
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
306
|
-
|
|
307
|
-
|
|
405
|
+
MeetingUtil.remoteUpdateAudioVideo = sinon.stub().returns(
|
|
406
|
+
new Promise((resolve) => {
|
|
407
|
+
serverResponseResolve = resolve;
|
|
408
|
+
})
|
|
409
|
+
);
|
|
308
410
|
|
|
309
411
|
let firstClientPromiseResolved = false;
|
|
310
412
|
let secondClientPromiseResolved = false;
|
|
311
413
|
|
|
312
414
|
// 2 client requests, one after another without waiting for first one to resolve
|
|
313
|
-
audio.handleClientRequest(meeting, true)
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
secondClientPromiseResolved = true;
|
|
320
|
-
});
|
|
415
|
+
audio.handleClientRequest(meeting, true).then(() => {
|
|
416
|
+
firstClientPromiseResolved = true;
|
|
417
|
+
});
|
|
418
|
+
audio.handleClientRequest(meeting, false).then(() => {
|
|
419
|
+
secondClientPromiseResolved = true;
|
|
420
|
+
});
|
|
321
421
|
|
|
322
422
|
await testUtils.flushPromises();
|
|
323
423
|
|
|
@@ -342,9 +442,10 @@ describe('plugin-meetings', () => {
|
|
|
342
442
|
});
|
|
343
443
|
|
|
344
444
|
it('rejects client request to unmute if hard mute is used', (done) => {
|
|
345
|
-
audio.handleServerRemoteMuteUpdate(true, false);
|
|
445
|
+
audio.handleServerRemoteMuteUpdate(meeting, true, false);
|
|
346
446
|
|
|
347
|
-
audio
|
|
447
|
+
audio
|
|
448
|
+
.handleClientRequest(meeting, false)
|
|
348
449
|
.then(() => {
|
|
349
450
|
done(new Error('expected handleClientRequest to fail, but it did not!'));
|
|
350
451
|
})
|
|
@@ -362,11 +463,11 @@ describe('plugin-meetings', () => {
|
|
|
362
463
|
assert.isTrue(video.isSelf());
|
|
363
464
|
|
|
364
465
|
// check local mute is done, but not remote one
|
|
365
|
-
assert.calledWith(
|
|
466
|
+
assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, true);
|
|
366
467
|
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, undefined, true, meeting);
|
|
367
468
|
assert.notCalled(meeting.members.muteMember);
|
|
368
469
|
|
|
369
|
-
|
|
470
|
+
meeting.mediaProperties.videoTrack.setMuted.resetHistory();
|
|
370
471
|
MeetingUtil.remoteUpdateAudioVideo.resetHistory();
|
|
371
472
|
meeting.members.muteMember.resetHistory();
|
|
372
473
|
|
|
@@ -376,7 +477,7 @@ describe('plugin-meetings', () => {
|
|
|
376
477
|
assert.isFalse(video.isMuted());
|
|
377
478
|
assert.isFalse(video.isSelf());
|
|
378
479
|
|
|
379
|
-
assert.calledWith(
|
|
480
|
+
assert.calledWith(meeting.mediaProperties.videoTrack.setMuted, false);
|
|
380
481
|
assert.calledWith(MeetingUtil.remoteUpdateAudioVideo, undefined, false, meeting);
|
|
381
482
|
assert.notCalled(meeting.members.muteMember);
|
|
382
483
|
});
|
|
@@ -408,3 +509,207 @@ describe('plugin-meetings', () => {
|
|
|
408
509
|
});
|
|
409
510
|
});
|
|
410
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
|
+
});
|