@webex/plugin-meetings 3.0.0-beta.13 → 3.0.0-beta.131
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -1
- package/UPGRADING.md +9 -9
- package/browsers.js +19 -24
- package/dist/annotation/annotation.types.js +7 -0
- package/dist/annotation/annotation.types.js.map +1 -0
- package/dist/annotation/constants.js +48 -0
- package/dist/annotation/constants.js.map +1 -0
- package/dist/annotation/index.js +355 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.js +193 -0
- package/dist/breakouts/breakout.js.map +1 -0
- package/dist/breakouts/collection.js +23 -0
- package/dist/breakouts/collection.js.map +1 -0
- package/dist/breakouts/edit-lock-error.js +52 -0
- package/dist/breakouts/edit-lock-error.js.map +1 -0
- package/dist/breakouts/events.js +43 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.js +994 -0
- package/dist/breakouts/index.js.map +1 -0
- package/dist/breakouts/request.js +78 -0
- package/dist/breakouts/request.js.map +1 -0
- package/dist/breakouts/utils.js +67 -0
- package/dist/breakouts/utils.js.map +1 -0
- package/dist/common/browser-detection.js +1 -20
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +5 -20
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.js +0 -7
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.js +5 -26
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +5 -26
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +6 -27
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +5 -26
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.js +5 -33
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +5 -26
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +4 -25
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reconnection-in-progress.js +0 -17
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.js +5 -26
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +5 -26
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.js +6 -41
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +1 -24
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js +0 -22
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js +0 -23
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js +0 -12
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js +0 -15
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.js +0 -4
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -8
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js +35 -61
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +4 -14
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +6 -6
- package/dist/config.js.map +1 -1
- package/dist/constants.js +203 -53
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.js +14 -0
- package/dist/controls-options-manager/constants.js.map +1 -0
- package/dist/controls-options-manager/enums.js +27 -0
- package/dist/controls-options-manager/enums.js.map +1 -0
- package/dist/controls-options-manager/index.js +297 -0
- package/dist/controls-options-manager/index.js.map +1 -0
- package/dist/controls-options-manager/types.js +7 -0
- package/dist/controls-options-manager/types.js.map +1 -0
- package/dist/controls-options-manager/util.js +294 -0
- package/dist/controls-options-manager/util.js.map +1 -0
- package/dist/index.js +72 -17
- package/dist/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.js +100 -29
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.js +3 -26
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js +0 -15
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js +4 -12
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.js +406 -216
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +0 -38
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +54 -38
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +88 -123
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +105 -91
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +55 -165
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +71 -117
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +2 -9
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +505 -495
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +77 -14
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +2603 -2462
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +291 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.js +292 -138
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +315 -336
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js +7 -0
- package/dist/meeting/request.type.js.map +1 -0
- package/dist/meeting/state.js +21 -31
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.js +463 -583
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +3 -25
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +10 -33
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +305 -286
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +1 -16
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js +98 -183
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +156 -232
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +24 -20
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +692 -593
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +23 -42
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +186 -155
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +89 -88
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +15 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +101 -69
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +12 -12
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +166 -205
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +120 -85
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js +15 -0
- package/dist/members/types.js.map +1 -0
- package/dist/members/util.js +314 -260
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.js +50 -16
- package/dist/metrics/config.js.map +1 -1
- package/dist/metrics/constants.js +4 -7
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +93 -162
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +167 -50
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +58 -65
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +74 -93
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +55 -74
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +6 -40
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +466 -442
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +32 -59
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +10 -45
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +2 -33
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js +0 -13
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.js +190 -199
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +14 -23
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/constants.js +13 -0
- package/dist/reactions/constants.js.map +1 -0
- package/dist/reactions/reactions.js +2 -4
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.js +19 -23
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.js +326 -465
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/enums.js +17 -0
- package/dist/recording-controller/enums.js.map +1 -0
- package/dist/recording-controller/index.js +343 -0
- package/dist/recording-controller/index.js.map +1 -0
- package/dist/recording-controller/util.js +63 -0
- package/dist/recording-controller/util.js.map +1 -0
- package/dist/roap/index.js +31 -75
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +129 -136
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +143 -103
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js +1 -95
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +369 -461
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +144 -94
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +13 -45
- package/dist/transcription/index.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +35 -0
- package/dist/types/annotation/constants.d.ts +31 -0
- package/dist/types/annotation/index.d.ts +124 -0
- package/dist/types/breakouts/breakout.d.ts +8 -0
- package/dist/types/breakouts/collection.d.ts +5 -0
- package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/types/breakouts/events.d.ts +2 -0
- package/dist/types/breakouts/index.d.ts +5 -0
- package/dist/types/breakouts/request.d.ts +22 -0
- package/dist/types/breakouts/utils.d.ts +15 -0
- package/dist/types/common/browser-detection.d.ts +9 -0
- package/dist/types/common/collection.d.ts +48 -0
- package/dist/types/common/config.d.ts +2 -0
- package/dist/types/common/errors/captcha-error.d.ts +15 -0
- package/dist/types/common/errors/intent-to-join.d.ts +16 -0
- package/dist/types/common/errors/join-meeting.d.ts +17 -0
- package/dist/types/common/errors/media.d.ts +15 -0
- package/dist/types/common/errors/parameter.d.ts +15 -0
- package/dist/types/common/errors/password-error.d.ts +15 -0
- package/dist/types/common/errors/permission.d.ts +14 -0
- package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
- package/dist/types/common/errors/reconnection.d.ts +15 -0
- package/dist/types/common/errors/stats.d.ts +15 -0
- package/dist/types/common/errors/webex-errors.d.ts +69 -0
- package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
- package/dist/types/common/events/events-scope.d.ts +17 -0
- package/dist/types/common/events/events.d.ts +12 -0
- package/dist/types/common/events/trigger-proxy.d.ts +2 -0
- package/dist/types/common/events/util.d.ts +2 -0
- package/dist/types/common/logs/logger-config.d.ts +2 -0
- package/dist/types/common/logs/logger-proxy.d.ts +2 -0
- package/dist/types/common/logs/request.d.ts +34 -0
- package/dist/types/common/queue.d.ts +32 -0
- package/dist/types/config.d.ts +78 -0
- package/dist/types/constants.d.ts +993 -0
- package/dist/types/controls-options-manager/constants.d.ts +4 -0
- package/dist/types/controls-options-manager/enums.d.ts +15 -0
- package/dist/types/controls-options-manager/index.d.ts +136 -0
- package/dist/types/controls-options-manager/types.d.ts +43 -0
- package/dist/types/controls-options-manager/util.d.ts +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/locus-info/controlsUtils.d.ts +2 -0
- package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
- package/dist/types/locus-info/fullState.d.ts +2 -0
- package/dist/types/locus-info/hostUtils.d.ts +2 -0
- package/dist/types/locus-info/index.d.ts +315 -0
- package/dist/types/locus-info/infoUtils.d.ts +2 -0
- package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
- package/dist/types/locus-info/parser.d.ts +212 -0
- package/dist/types/locus-info/selfUtils.d.ts +2 -0
- package/dist/types/media/index.d.ts +34 -0
- package/dist/types/media/properties.d.ts +108 -0
- package/dist/types/media/util.d.ts +2 -0
- package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +147 -0
- package/dist/types/meeting/index.d.ts +1762 -0
- package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
- package/dist/types/meeting/muteState.d.ts +186 -0
- package/dist/types/meeting/request.d.ts +269 -0
- package/dist/types/meeting/request.type.d.ts +11 -0
- package/dist/types/meeting/state.d.ts +9 -0
- package/dist/types/meeting/util.d.ts +76 -0
- package/dist/types/meeting-info/collection.d.ts +20 -0
- package/dist/types/meeting-info/index.d.ts +57 -0
- package/dist/types/meeting-info/meeting-info-v2.d.ts +122 -0
- package/dist/types/meeting-info/request.d.ts +22 -0
- package/dist/types/meeting-info/util.d.ts +2 -0
- package/dist/types/meeting-info/utilv2.d.ts +2 -0
- package/dist/types/meetings/collection.d.ts +31 -0
- package/dist/types/meetings/index.d.ts +345 -0
- package/dist/types/meetings/request.d.ts +27 -0
- package/dist/types/meetings/util.d.ts +18 -0
- package/dist/types/member/index.d.ts +157 -0
- package/dist/types/member/types.d.ts +21 -0
- package/dist/types/member/util.d.ts +2 -0
- package/dist/types/members/collection.d.ts +29 -0
- package/dist/types/members/index.d.ts +353 -0
- package/dist/types/members/request.d.ts +114 -0
- package/dist/types/members/types.d.ts +24 -0
- package/dist/types/members/util.d.ts +210 -0
- package/dist/types/metrics/config.d.ts +195 -0
- package/dist/types/metrics/constants.d.ts +55 -0
- package/dist/types/metrics/index.d.ts +169 -0
- package/dist/types/multistream/mediaRequestManager.d.ts +101 -0
- package/dist/types/multistream/receiveSlot.d.ts +68 -0
- package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
- package/dist/types/multistream/remoteMedia.d.ts +72 -0
- package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
- package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
- package/dist/types/networkQualityMonitor/index.d.ts +70 -0
- package/dist/types/personal-meeting-room/index.d.ts +47 -0
- package/dist/types/personal-meeting-room/request.d.ts +14 -0
- package/dist/types/personal-meeting-room/util.d.ts +2 -0
- package/dist/types/reachability/index.d.ts +152 -0
- package/dist/types/reachability/request.d.ts +37 -0
- package/dist/types/reactions/constants.d.ts +3 -0
- package/dist/types/reactions/reactions.d.ts +4 -0
- package/dist/types/reactions/reactions.type.d.ts +52 -0
- package/dist/types/reconnection-manager/index.d.ts +126 -0
- package/dist/types/recording-controller/enums.d.ts +7 -0
- package/dist/types/recording-controller/index.d.ts +193 -0
- package/dist/types/recording-controller/util.d.ts +13 -0
- package/dist/types/roap/index.d.ts +77 -0
- package/dist/types/roap/request.d.ts +36 -0
- package/dist/types/roap/turnDiscovery.d.ts +91 -0
- package/dist/types/statsAnalyzer/global.d.ts +36 -0
- package/dist/types/statsAnalyzer/index.d.ts +200 -0
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
- package/dist/types/transcription/index.d.ts +64 -0
- package/internal-README.md +7 -6
- package/package.json +28 -21
- package/src/annotation/annotation.types.ts +42 -0
- package/src/annotation/constants.ts +36 -0
- package/src/annotation/index.ts +339 -0
- package/src/breakouts/README.md +220 -0
- package/src/breakouts/breakout.ts +163 -0
- package/src/breakouts/collection.ts +19 -0
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +37 -0
- package/src/breakouts/index.ts +860 -0
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +57 -0
- package/src/common/browser-detection.ts +9 -6
- package/src/common/collection.ts +3 -1
- package/src/common/errors/captcha-error.ts +6 -6
- package/src/common/errors/intent-to-join.ts +6 -6
- package/src/common/errors/join-meeting.ts +12 -8
- package/src/common/errors/media.ts +6 -6
- package/src/common/errors/parameter.ts +9 -6
- package/src/common/errors/password-error.ts +6 -6
- package/src/common/errors/permission.ts +5 -5
- package/src/common/errors/reconnection.ts +6 -6
- package/src/common/errors/stats.ts +6 -6
- package/src/common/errors/webex-errors.ts +7 -5
- package/src/common/errors/webex-meetings-error.ts +1 -1
- package/src/common/events/events-scope.ts +5 -1
- package/src/common/events/events.ts +5 -1
- package/src/common/events/trigger-proxy.ts +8 -3
- package/src/common/events/util.ts +1 -2
- package/src/common/logs/logger-proxy.ts +21 -10
- package/src/common/logs/request.ts +11 -8
- package/src/config.ts +16 -12
- package/src/constants.ts +153 -7
- package/src/controls-options-manager/constants.ts +5 -0
- package/src/controls-options-manager/enums.ts +18 -0
- package/src/controls-options-manager/index.ts +278 -0
- package/src/controls-options-manager/types.ts +59 -0
- package/src/controls-options-manager/util.ts +281 -0
- package/src/index.ts +33 -0
- package/src/locus-info/controlsUtils.ts +142 -24
- package/src/locus-info/fullState.ts +15 -11
- package/src/locus-info/hostUtils.ts +4 -3
- package/src/locus-info/index.ts +346 -55
- package/src/locus-info/infoUtils.ts +12 -4
- package/src/locus-info/mediaSharesUtils.ts +52 -4
- package/src/locus-info/parser.ts +46 -68
- package/src/locus-info/selfUtils.ts +195 -56
- package/src/media/index.ts +139 -196
- package/src/media/properties.ts +43 -36
- package/src/media/util.ts +1 -1
- package/src/mediaQualityMetrics/config.ts +380 -378
- package/src/meeting/in-meeting-actions.ts +159 -3
- package/src/meeting/index.ts +2803 -1584
- package/src/meeting/locusMediaRequest.ts +309 -0
- package/src/meeting/muteState.ts +290 -72
- package/src/meeting/request.ts +247 -178
- package/src/meeting/request.type.ts +13 -0
- package/src/meeting/state.ts +45 -30
- package/src/meeting/util.ts +445 -395
- package/src/meeting-info/collection.ts +2 -1
- package/src/meeting-info/index.ts +32 -30
- package/src/meeting-info/meeting-info-v2.ts +235 -116
- package/src/meeting-info/request.ts +9 -3
- package/src/meeting-info/util.ts +54 -46
- package/src/meeting-info/utilv2.ts +71 -55
- package/src/meetings/collection.ts +21 -1
- package/src/meetings/index.ts +772 -437
- package/src/meetings/request.ts +29 -25
- package/src/meetings/util.ts +132 -33
- package/src/member/index.ts +95 -49
- package/src/member/types.ts +24 -0
- package/src/member/util.ts +106 -13
- package/src/members/collection.ts +8 -1
- package/src/members/index.ts +288 -130
- package/src/members/request.ts +144 -31
- package/src/members/types.ts +28 -0
- package/src/members/util.ts +316 -235
- package/src/metrics/config.ts +302 -90
- package/src/metrics/constants.ts +2 -6
- package/src/metrics/index.ts +124 -95
- package/src/multistream/mediaRequestManager.ts +203 -45
- package/src/multistream/receiveSlot.ts +69 -26
- package/src/multistream/receiveSlotManager.ts +62 -38
- package/src/multistream/remoteMedia.ts +30 -4
- package/src/multistream/remoteMediaGroup.ts +4 -3
- package/src/multistream/remoteMediaManager.ts +230 -66
- package/src/networkQualityMonitor/index.ts +24 -27
- package/src/personal-meeting-room/index.ts +12 -16
- package/src/personal-meeting-room/request.ts +10 -3
- package/src/personal-meeting-room/util.ts +3 -3
- package/src/reachability/index.ts +131 -79
- package/src/reachability/request.ts +43 -34
- package/src/reactions/constants.ts +4 -0
- package/src/reactions/reactions.ts +8 -8
- package/src/reactions/reactions.type.ts +31 -5
- package/src/reconnection-manager/index.ts +193 -111
- package/src/recording-controller/enums.ts +8 -0
- package/src/recording-controller/index.ts +315 -0
- package/src/recording-controller/util.ts +58 -0
- package/src/roap/index.ts +53 -53
- package/src/roap/request.ts +77 -64
- package/src/roap/turnDiscovery.ts +101 -48
- package/src/statsAnalyzer/global.ts +8 -104
- package/src/statsAnalyzer/index.ts +624 -376
- package/src/statsAnalyzer/mqaUtil.ts +203 -90
- package/src/transcription/index.ts +34 -32
- package/test/integration/spec/converged-space-meetings.js +177 -0
- package/test/integration/spec/journey.js +670 -466
- package/test/integration/spec/space-meeting.js +320 -204
- package/test/integration/spec/transcription.js +7 -8
- package/test/unit/spec/annotation/index.ts +433 -0
- package/test/unit/spec/breakouts/breakout.ts +203 -0
- package/test/unit/spec/breakouts/collection.ts +15 -0
- package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
- package/test/unit/spec/breakouts/events.ts +77 -0
- package/test/unit/spec/breakouts/index.ts +1609 -0
- package/test/unit/spec/breakouts/request.ts +104 -0
- package/test/unit/spec/breakouts/utils.js +72 -0
- package/test/unit/spec/common/browser-detection.js +9 -28
- package/test/unit/spec/controls-options-manager/index.js +287 -0
- package/test/unit/spec/controls-options-manager/util.js +504 -0
- package/test/unit/spec/fixture/locus.js +93 -90
- package/test/unit/spec/locus-info/controlsUtils.js +305 -32
- package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
- package/test/unit/spec/locus-info/index.js +636 -5
- package/test/unit/spec/locus-info/infoUtils.js +26 -33
- package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
- package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
- package/test/unit/spec/locus-info/parser.js +3 -9
- package/test/unit/spec/locus-info/selfConstant.js +110 -103
- package/test/unit/spec/locus-info/selfUtils.js +252 -12
- package/test/unit/spec/media/index.ts +104 -8
- package/test/unit/spec/media/properties.ts +9 -9
- package/test/unit/spec/meeting/in-meeting-actions.ts +76 -3
- package/test/unit/spec/meeting/index.js +3112 -921
- package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
- package/test/unit/spec/meeting/muteState.js +421 -94
- package/test/unit/spec/meeting/request.js +421 -79
- package/test/unit/spec/meeting/utils.js +326 -189
- package/test/unit/spec/meeting-info/meetinginfov2.js +481 -76
- package/test/unit/spec/meeting-info/request.js +7 -9
- package/test/unit/spec/meeting-info/util.js +11 -12
- package/test/unit/spec/meeting-info/utilv2.js +131 -74
- package/test/unit/spec/meetings/collection.js +15 -1
- package/test/unit/spec/meetings/index.js +1126 -328
- package/test/unit/spec/meetings/utils.js +220 -14
- package/test/unit/spec/member/index.js +24 -1
- package/test/unit/spec/member/util.js +383 -32
- package/test/unit/spec/members/index.js +424 -55
- package/test/unit/spec/members/request.js +228 -40
- package/test/unit/spec/members/utils.js +191 -4
- package/test/unit/spec/metrics/index.js +113 -20
- package/test/unit/spec/multistream/mediaRequestManager.ts +650 -105
- package/test/unit/spec/multistream/receiveSlot.ts +76 -17
- package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
- package/test/unit/spec/multistream/remoteMedia.ts +32 -2
- package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
- package/test/unit/spec/multistream/remoteMediaManager.ts +549 -65
- package/test/unit/spec/networkQualityMonitor/index.js +24 -18
- package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
- package/test/unit/spec/reachability/index.ts +176 -27
- package/test/unit/spec/reachability/request.js +66 -0
- package/test/unit/spec/reconnection-manager/index.js +62 -31
- package/test/unit/spec/recording-controller/index.js +231 -0
- package/test/unit/spec/recording-controller/util.js +102 -0
- package/test/unit/spec/roap/index.ts +19 -49
- package/test/unit/spec/roap/request.ts +187 -0
- package/test/unit/spec/roap/turnDiscovery.ts +92 -50
- package/test/unit/spec/stats-analyzer/index.js +116 -60
- package/test/utils/cmr.js +44 -42
- package/test/utils/constants.js +9 -0
- package/test/utils/integrationTestUtils.js +64 -0
- package/test/utils/testUtils.js +63 -99
- package/test/utils/webex-config.js +22 -18
- package/test/utils/webex-test-users.js +57 -50
- package/tsconfig.json +6 -0
- package/dist/media/internal-media-core-wrapper.js +0 -22
- package/dist/media/internal-media-core-wrapper.js.map +0 -1
- package/dist/meeting/effectsState.js +0 -334
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/multistream/multistreamMedia.js +0 -116
- package/dist/multistream/multistreamMedia.js.map +0 -1
- package/src/index.js +0 -15
- package/src/media/internal-media-core-wrapper.ts +0 -9
- package/src/meeting/effectsState.ts +0 -211
- package/src/multistream/multistreamMedia.ts +0 -92
- package/test/unit/spec/meeting/effectsState.js +0 -291
|
@@ -25,28 +25,34 @@ describe('TurnDiscovery', () => {
|
|
|
25
25
|
sinon.stub(Metrics, 'sendBehavioralMetric');
|
|
26
26
|
|
|
27
27
|
mockRoapRequest = {
|
|
28
|
-
sendRoap: sinon.fake.resolves({mediaConnections: FAKE_MEDIA_CONNECTIONS_FROM_LOCUS})
|
|
28
|
+
sendRoap: sinon.fake.resolves({mediaConnections: FAKE_MEDIA_CONNECTIONS_FROM_LOCUS}),
|
|
29
29
|
} as unknown as RoapRequest;
|
|
30
30
|
|
|
31
31
|
testMeeting = {
|
|
32
32
|
id: 'fake meeting id',
|
|
33
33
|
config: {
|
|
34
34
|
experimental: {
|
|
35
|
-
enableTurnDiscovery: true
|
|
36
|
-
}
|
|
35
|
+
enableTurnDiscovery: true,
|
|
36
|
+
},
|
|
37
37
|
},
|
|
38
38
|
correlationId: 'fake correlation id',
|
|
39
39
|
selfUrl: 'fake self url',
|
|
40
40
|
mediaId: 'fake media id',
|
|
41
41
|
locusUrl: `https://locus-a.wbx2.com/locus/api/v1/loci/${FAKE_LOCUS_ID}`,
|
|
42
42
|
roapSeq: -1,
|
|
43
|
-
|
|
44
|
-
|
|
43
|
+
audio:{
|
|
44
|
+
isLocallyMuted: () => true,
|
|
45
|
+
},
|
|
46
|
+
video:{
|
|
47
|
+
isLocallyMuted: () => false,
|
|
48
|
+
},
|
|
45
49
|
setRoapSeq: sinon.fake((newSeq) => {
|
|
46
50
|
testMeeting.roapSeq = newSeq;
|
|
47
51
|
}),
|
|
48
52
|
updateMediaConnections: sinon.stub(),
|
|
49
|
-
webex: {meetings: {reachability: {isAnyClusterReachable: () => false}}}
|
|
53
|
+
webex: {meetings: {reachability: {isAnyClusterReachable: () => Promise.resolve(false)}}},
|
|
54
|
+
isMultistream: false,
|
|
55
|
+
locusMediaRequest: { fake: true },
|
|
50
56
|
};
|
|
51
57
|
});
|
|
52
58
|
|
|
@@ -55,7 +61,11 @@ describe('TurnDiscovery', () => {
|
|
|
55
61
|
sinon.restore();
|
|
56
62
|
});
|
|
57
63
|
|
|
58
|
-
const checkRoapMessageSent = async (
|
|
64
|
+
const checkRoapMessageSent = async (
|
|
65
|
+
messageType,
|
|
66
|
+
expectedSeq,
|
|
67
|
+
expectedMediaId = testMeeting.mediaId
|
|
68
|
+
) => {
|
|
59
69
|
await testUtils.flushPromises();
|
|
60
70
|
|
|
61
71
|
assert.calledOnce(mockRoapRequest.sendRoap);
|
|
@@ -65,12 +75,10 @@ describe('TurnDiscovery', () => {
|
|
|
65
75
|
version: '2',
|
|
66
76
|
seq: expectedSeq,
|
|
67
77
|
},
|
|
68
|
-
correlationId: testMeeting.correlationId,
|
|
69
78
|
locusSelfUrl: testMeeting.selfUrl,
|
|
70
79
|
mediaId: expectedMediaId,
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
meetingId: testMeeting.id
|
|
80
|
+
meetingId: testMeeting.id,
|
|
81
|
+
locusMediaRequest: testMeeting.locusMediaRequest
|
|
74
82
|
});
|
|
75
83
|
|
|
76
84
|
if (messageType === 'TURN_DISCOVERY_REQUEST') {
|
|
@@ -93,39 +101,44 @@ describe('TurnDiscovery', () => {
|
|
|
93
101
|
};
|
|
94
102
|
|
|
95
103
|
describe('doTurnDiscovery', () => {
|
|
96
|
-
|
|
97
|
-
|
|
104
|
+
[false, true].forEach(function (enabledMultistream ) {
|
|
105
|
+
it('sends TURN_DISCOVERY_REQUEST'+ (enabledMultistream ? ' when enable Multistream':'') + ', waits for response and sends OK', async () => {
|
|
106
|
+
testMeeting.isMultistream = enabledMultistream;
|
|
98
107
|
|
|
99
|
-
|
|
108
|
+
const td = new TurnDiscovery(mockRoapRequest);
|
|
100
109
|
|
|
101
|
-
|
|
102
|
-
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
|
110
|
+
const result = td.doTurnDiscovery(testMeeting, false);
|
|
103
111
|
|
|
104
|
-
|
|
112
|
+
// check that TURN_DISCOVERY_REQUEST was sent
|
|
113
|
+
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
|
105
114
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
headers: [
|
|
109
|
-
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
110
|
-
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
111
|
-
`x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
|
|
112
|
-
]
|
|
113
|
-
});
|
|
115
|
+
// @ts-ignore
|
|
116
|
+
mockRoapRequest.sendRoap.resetHistory();
|
|
114
117
|
|
|
115
|
-
|
|
118
|
+
// simulate the response
|
|
119
|
+
td.handleTurnDiscoveryResponse({
|
|
120
|
+
headers: [
|
|
121
|
+
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
122
|
+
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
123
|
+
`x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
|
|
124
|
+
]
|
|
125
|
+
});
|
|
116
126
|
|
|
117
|
-
|
|
118
|
-
await checkRoapMessageSent('OK', 0);
|
|
127
|
+
await testUtils.flushPromises();
|
|
119
128
|
|
|
120
|
-
|
|
129
|
+
// check that we've sent OK
|
|
130
|
+
await checkRoapMessageSent('OK', 0);
|
|
121
131
|
|
|
122
|
-
|
|
123
|
-
url: FAKE_TURN_URL,
|
|
124
|
-
username: FAKE_TURN_USERNAME,
|
|
125
|
-
password: FAKE_TURN_PASSWORD
|
|
126
|
-
});
|
|
132
|
+
const {turnServerInfo, turnDiscoverySkippedReason} = await result;
|
|
127
133
|
|
|
128
|
-
|
|
134
|
+
assert.deepEqual(turnServerInfo, {
|
|
135
|
+
url: FAKE_TURN_URL,
|
|
136
|
+
username: FAKE_TURN_USERNAME,
|
|
137
|
+
password: FAKE_TURN_PASSWORD
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
assert.isUndefined(turnDiscoverySkippedReason);
|
|
141
|
+
});
|
|
129
142
|
});
|
|
130
143
|
|
|
131
144
|
it('sends TURN_DISCOVERY_REQUEST with empty mediaId when isReconnecting is true', async () => {
|
|
@@ -137,6 +150,7 @@ describe('TurnDiscovery', () => {
|
|
|
137
150
|
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0, '');
|
|
138
151
|
|
|
139
152
|
// the main part of the test is complete now, checking the remaining part of the flow just for completeness
|
|
153
|
+
// @ts-ignore
|
|
140
154
|
mockRoapRequest.sendRoap.resetHistory();
|
|
141
155
|
|
|
142
156
|
// simulate the response
|
|
@@ -145,7 +159,7 @@ describe('TurnDiscovery', () => {
|
|
|
145
159
|
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
146
160
|
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
147
161
|
`x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
|
|
148
|
-
]
|
|
162
|
+
],
|
|
149
163
|
});
|
|
150
164
|
|
|
151
165
|
await testUtils.flushPromises();
|
|
@@ -158,7 +172,7 @@ describe('TurnDiscovery', () => {
|
|
|
158
172
|
assert.deepEqual(turnServerInfo, {
|
|
159
173
|
url: FAKE_TURN_URL,
|
|
160
174
|
username: FAKE_TURN_USERNAME,
|
|
161
|
-
password: FAKE_TURN_PASSWORD
|
|
175
|
+
password: FAKE_TURN_PASSWORD,
|
|
162
176
|
});
|
|
163
177
|
assert.isUndefined(turnDiscoverySkippedReason);
|
|
164
178
|
});
|
|
@@ -169,7 +183,7 @@ describe('TurnDiscovery', () => {
|
|
|
169
183
|
|
|
170
184
|
// check that TURN_DISCOVERY_REQUEST was sent
|
|
171
185
|
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
|
172
|
-
|
|
186
|
+
// @ts-ignore
|
|
173
187
|
mockRoapRequest.sendRoap.resetHistory();
|
|
174
188
|
|
|
175
189
|
// simulate the response with some extra headers
|
|
@@ -181,7 +195,7 @@ describe('TurnDiscovery', () => {
|
|
|
181
195
|
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
182
196
|
`x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
|
|
183
197
|
'another-header-at-the-end=12345',
|
|
184
|
-
]
|
|
198
|
+
],
|
|
185
199
|
});
|
|
186
200
|
|
|
187
201
|
await testUtils.flushPromises();
|
|
@@ -193,7 +207,7 @@ describe('TurnDiscovery', () => {
|
|
|
193
207
|
assert.deepEqual(turnServerInfo, {
|
|
194
208
|
url: FAKE_TURN_URL,
|
|
195
209
|
username: FAKE_TURN_USERNAME,
|
|
196
|
-
password: FAKE_TURN_PASSWORD
|
|
210
|
+
password: FAKE_TURN_PASSWORD,
|
|
197
211
|
});
|
|
198
212
|
assert.isUndefined(turnDiscoverySkippedReason);
|
|
199
213
|
});
|
|
@@ -202,7 +216,7 @@ describe('TurnDiscovery', () => {
|
|
|
202
216
|
const prevConfigValue = testMeeting.config.experimental.enableTurnDiscovery;
|
|
203
217
|
|
|
204
218
|
testMeeting.config.experimental.enableTurnDiscovery = false;
|
|
205
|
-
|
|
219
|
+
// @ts-ignore
|
|
206
220
|
const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
|
|
207
221
|
|
|
208
222
|
const {turnServerInfo, turnDiscoverySkippedReason} = result;
|
|
@@ -232,7 +246,7 @@ describe('TurnDiscovery', () => {
|
|
|
232
246
|
|
|
233
247
|
it('resolves with undefined when cluster is reachable', async () => {
|
|
234
248
|
const prev = testMeeting.webex.meetings.reachability.isAnyClusterReachable;
|
|
235
|
-
testMeeting.webex.meetings.reachability.isAnyClusterReachable = () => true;
|
|
249
|
+
testMeeting.webex.meetings.reachability.isAnyClusterReachable = () => Promise.resolve(true);
|
|
236
250
|
const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
|
|
237
251
|
|
|
238
252
|
const {turnServerInfo, turnDiscoverySkippedReason} = result;
|
|
@@ -242,10 +256,9 @@ describe('TurnDiscovery', () => {
|
|
|
242
256
|
assert.notCalled(mockRoapRequest.sendRoap);
|
|
243
257
|
assert.notCalled(Metrics.sendBehavioralMetric);
|
|
244
258
|
testMeeting.webex.meetings.reachability.isAnyClusterReachable = prev;
|
|
245
|
-
|
|
246
259
|
});
|
|
247
260
|
|
|
248
|
-
it(
|
|
261
|
+
it("resolves with undefined if we don't get a response within 10s", async () => {
|
|
249
262
|
const td = new TurnDiscovery(mockRoapRequest);
|
|
250
263
|
|
|
251
264
|
const promise = td.doTurnDiscovery(testMeeting, false);
|
|
@@ -264,12 +277,14 @@ describe('TurnDiscovery', () => {
|
|
|
264
277
|
const td = new TurnDiscovery(mockRoapRequest);
|
|
265
278
|
const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
|
|
266
279
|
|
|
280
|
+
await testUtils.flushPromises();
|
|
281
|
+
|
|
267
282
|
// simulate the response without the password
|
|
268
283
|
td.handleTurnDiscoveryResponse({
|
|
269
284
|
headers: [
|
|
270
285
|
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
271
286
|
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
272
|
-
]
|
|
287
|
+
],
|
|
273
288
|
});
|
|
274
289
|
await testUtils.flushPromises();
|
|
275
290
|
const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
|
|
@@ -283,6 +298,8 @@ describe('TurnDiscovery', () => {
|
|
|
283
298
|
const td = new TurnDiscovery(mockRoapRequest);
|
|
284
299
|
const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
|
|
285
300
|
|
|
301
|
+
await testUtils.flushPromises();
|
|
302
|
+
|
|
286
303
|
// simulate the response without the headers
|
|
287
304
|
td.handleTurnDiscoveryResponse({});
|
|
288
305
|
|
|
@@ -298,11 +315,13 @@ describe('TurnDiscovery', () => {
|
|
|
298
315
|
const td = new TurnDiscovery(mockRoapRequest);
|
|
299
316
|
const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
|
|
300
317
|
|
|
318
|
+
await testUtils.flushPromises();
|
|
319
|
+
|
|
301
320
|
// simulate the response without the headers
|
|
302
321
|
td.handleTurnDiscoveryResponse({headers: []});
|
|
303
322
|
|
|
304
323
|
await testUtils.flushPromises();
|
|
305
|
-
const {turnServerInfo, turnDiscoverySkippedReason}= await turnDiscoveryPromise;
|
|
324
|
+
const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
|
|
306
325
|
|
|
307
326
|
assert.isUndefined(turnServerInfo);
|
|
308
327
|
assert.isUndefined(turnDiscoverySkippedReason);
|
|
@@ -314,9 +333,11 @@ describe('TurnDiscovery', () => {
|
|
|
314
333
|
|
|
315
334
|
const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
|
|
316
335
|
|
|
336
|
+
await testUtils.flushPromises();
|
|
337
|
+
|
|
317
338
|
// check that TURN_DISCOVERY_REQUEST was sent
|
|
318
339
|
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
|
319
|
-
|
|
340
|
+
// @ts-ignore
|
|
320
341
|
mockRoapRequest.sendRoap.resetHistory();
|
|
321
342
|
|
|
322
343
|
// setup the mock so that sending of OK fails
|
|
@@ -328,7 +349,7 @@ describe('TurnDiscovery', () => {
|
|
|
328
349
|
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
329
350
|
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
330
351
|
`x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
|
|
331
|
-
]
|
|
352
|
+
],
|
|
332
353
|
});
|
|
333
354
|
|
|
334
355
|
await testUtils.flushPromises();
|
|
@@ -344,8 +365,29 @@ describe('TurnDiscovery', () => {
|
|
|
344
365
|
});
|
|
345
366
|
});
|
|
346
367
|
|
|
368
|
+
describe('isSkipped', () => {
|
|
369
|
+
[
|
|
370
|
+
{enabledInConfig: true, isAnyClusterReachable: true, expectedIsSkipped: true},
|
|
371
|
+
{enabledInConfig: true, isAnyClusterReachable: false, expectedIsSkipped: false},
|
|
372
|
+
{enabledInConfig: false, isAnyClusterReachable: true, expectedIsSkipped: true},
|
|
373
|
+
{enabledInConfig: false, isAnyClusterReachable: false, expectedIsSkipped: true},
|
|
374
|
+
].forEach(({enabledInConfig, isAnyClusterReachable, expectedIsSkipped}) => {
|
|
375
|
+
it(`returns ${expectedIsSkipped} when TURN discovery is ${enabledInConfig ? '' : 'not '} enabled in config and isAnyClusterReachable() returns ${isAnyClusterReachable ? 'true' : 'false'}`, async () => {
|
|
376
|
+
testMeeting.config.experimental.enableTurnDiscovery = enabledInConfig;
|
|
377
|
+
|
|
378
|
+
sinon.stub(testMeeting.webex.meetings.reachability, 'isAnyClusterReachable').resolves(isAnyClusterReachable);
|
|
379
|
+
|
|
380
|
+
const td = new TurnDiscovery(mockRoapRequest);
|
|
381
|
+
|
|
382
|
+
const isSkipped = await td.isSkipped(testMeeting);
|
|
383
|
+
|
|
384
|
+
assert.equal(isSkipped, expectedIsSkipped);
|
|
385
|
+
})
|
|
386
|
+
})
|
|
387
|
+
})
|
|
388
|
+
|
|
347
389
|
describe('handleTurnDiscoveryResponse', () => {
|
|
348
|
-
it(
|
|
390
|
+
it("doesn't do anything if turn discovery was not started", () => {
|
|
349
391
|
const td = new TurnDiscovery(mockRoapRequest);
|
|
350
392
|
|
|
351
393
|
// there is not much we can check, but we mainly want to make
|
|
@@ -355,7 +397,7 @@ describe('TurnDiscovery', () => {
|
|
|
355
397
|
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
356
398
|
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
357
399
|
`x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
|
|
358
|
-
]
|
|
400
|
+
],
|
|
359
401
|
});
|
|
360
402
|
|
|
361
403
|
assert.notCalled(mockRoapRequest.sendRoap);
|
|
@@ -2,7 +2,7 @@ import 'jsdom-global/register';
|
|
|
2
2
|
import chai from 'chai';
|
|
3
3
|
import chaiAsPromised from 'chai-as-promised';
|
|
4
4
|
import sinon from 'sinon';
|
|
5
|
-
import {
|
|
5
|
+
import {ConnectionState} from '@webex/internal-media-core';
|
|
6
6
|
|
|
7
7
|
import {StatsAnalyzer, EVENTS} from '../../../../src/statsAnalyzer';
|
|
8
8
|
import NetworkQualityMonitor from '../../../../src/networkQualityMonitor';
|
|
@@ -20,31 +20,32 @@ describe('plugin-meetings', () => {
|
|
|
20
20
|
let sandBoxSpy;
|
|
21
21
|
|
|
22
22
|
const initialConfig = {
|
|
23
|
-
videoPacketLossRatioThreshold: 9
|
|
23
|
+
videoPacketLossRatioThreshold: 9,
|
|
24
24
|
};
|
|
25
25
|
|
|
26
26
|
const defaultStats = {
|
|
27
|
+
resolutions: {},
|
|
27
28
|
internal: {
|
|
28
|
-
video: {
|
|
29
|
+
'video-send-1': {
|
|
29
30
|
send: {
|
|
30
|
-
totalPacketsLostOnReceiver: 10
|
|
31
|
-
}
|
|
32
|
-
}
|
|
31
|
+
totalPacketsLostOnReceiver: 10,
|
|
32
|
+
},
|
|
33
|
+
},
|
|
33
34
|
},
|
|
34
|
-
video: {
|
|
35
|
+
'video-send-1': {
|
|
35
36
|
send: {
|
|
36
37
|
packetsSent: 2,
|
|
37
38
|
meanRemoteJitter: [],
|
|
38
|
-
meanRoundTripTime: []
|
|
39
|
-
}
|
|
40
|
-
}
|
|
39
|
+
meanRoundTripTime: [],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
41
42
|
};
|
|
42
43
|
|
|
43
44
|
const statusResult = {
|
|
44
45
|
type: 'remote-inbound-rtp',
|
|
45
46
|
packetsLost: 11,
|
|
46
47
|
rttThreshold: 501,
|
|
47
|
-
jitterThreshold: 501
|
|
48
|
+
jitterThreshold: 501,
|
|
48
49
|
};
|
|
49
50
|
|
|
50
51
|
const sandbox = sinon.createSandbox();
|
|
@@ -52,9 +53,17 @@ describe('plugin-meetings', () => {
|
|
|
52
53
|
beforeEach(() => {
|
|
53
54
|
const networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
|
|
54
55
|
|
|
55
|
-
statsAnalyzer = new StatsAnalyzer(
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
statsAnalyzer = new StatsAnalyzer(
|
|
57
|
+
initialConfig,
|
|
58
|
+
() => ({}),
|
|
59
|
+
networkQualityMonitor,
|
|
60
|
+
defaultStats
|
|
61
|
+
);
|
|
62
|
+
|
|
63
|
+
sandBoxSpy = sandbox.spy(
|
|
64
|
+
statsAnalyzer.networkQualityMonitor,
|
|
65
|
+
'determineUplinkNetworkQuality'
|
|
66
|
+
);
|
|
58
67
|
});
|
|
59
68
|
|
|
60
69
|
afterEach(() => {
|
|
@@ -62,14 +71,16 @@ describe('plugin-meetings', () => {
|
|
|
62
71
|
});
|
|
63
72
|
|
|
64
73
|
it('should trigger determineUplinkNetworkQuality with specific arguments', async () => {
|
|
65
|
-
await statsAnalyzer.parseGetStatsResult(statusResult, 'video');
|
|
74
|
+
await statsAnalyzer.parseGetStatsResult(statusResult, 'video-send-1', true);
|
|
66
75
|
|
|
67
76
|
assert.calledOnce(statsAnalyzer.networkQualityMonitor.determineUplinkNetworkQuality);
|
|
68
|
-
assert(
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
77
|
+
assert(
|
|
78
|
+
sandBoxSpy.calledWith({
|
|
79
|
+
mediaType: 'video-send-1',
|
|
80
|
+
remoteRtpResults: statusResult,
|
|
81
|
+
statsAnalyzerCurrentStats: statsAnalyzer.statsResults,
|
|
82
|
+
})
|
|
83
|
+
);
|
|
73
84
|
});
|
|
74
85
|
});
|
|
75
86
|
|
|
@@ -78,6 +89,7 @@ describe('plugin-meetings', () => {
|
|
|
78
89
|
let pc;
|
|
79
90
|
let networkQualityMonitor;
|
|
80
91
|
let statsAnalyzer;
|
|
92
|
+
let mqeData;
|
|
81
93
|
|
|
82
94
|
let receivedEventsData = {
|
|
83
95
|
local: {},
|
|
@@ -105,57 +117,83 @@ describe('plugin-meetings', () => {
|
|
|
105
117
|
// bytesReceived and bytesSent need to be non-zero in order for StatsAnalyzer to parse any other values
|
|
106
118
|
fakeStats = {
|
|
107
119
|
audio: {
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
120
|
+
senders: [
|
|
121
|
+
{
|
|
122
|
+
report: [
|
|
123
|
+
{
|
|
124
|
+
type: 'outbound-rtp',
|
|
125
|
+
packetsSent: 0,
|
|
126
|
+
bytesSent: 1,
|
|
127
|
+
},
|
|
128
|
+
],
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
receivers: [
|
|
132
|
+
{
|
|
133
|
+
report: [
|
|
134
|
+
{
|
|
135
|
+
type: 'inbound-rtp',
|
|
136
|
+
packetsReceived: 0,
|
|
137
|
+
bytesReceived: 1,
|
|
138
|
+
},
|
|
139
|
+
],
|
|
140
|
+
},
|
|
141
|
+
],
|
|
118
142
|
},
|
|
119
143
|
video: {
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
144
|
+
senders: [
|
|
145
|
+
{
|
|
146
|
+
report: [
|
|
147
|
+
{
|
|
148
|
+
type: 'outbound-rtp',
|
|
149
|
+
framesSent: 0,
|
|
150
|
+
bytesSent: 1,
|
|
151
|
+
},
|
|
152
|
+
],
|
|
153
|
+
},
|
|
154
|
+
],
|
|
155
|
+
receivers: [
|
|
156
|
+
{
|
|
157
|
+
report: [
|
|
158
|
+
{
|
|
159
|
+
type: 'inbound-rtp',
|
|
160
|
+
framesDecoded: 0,
|
|
161
|
+
bytesReceived: 1,
|
|
162
|
+
frameHeight: 720,
|
|
163
|
+
frameWidth: 1280,
|
|
164
|
+
framesReceived: 1,
|
|
165
|
+
},
|
|
166
|
+
],
|
|
167
|
+
},
|
|
168
|
+
],
|
|
169
|
+
},
|
|
131
170
|
};
|
|
132
171
|
|
|
133
172
|
pc = {
|
|
134
|
-
getConnectionState: sinon.stub().returns(
|
|
173
|
+
getConnectionState: sinon.stub().returns(ConnectionState.Connected),
|
|
135
174
|
getTransceiverStats: sinon.stub().resolves({
|
|
136
175
|
audio: {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
currentDirection: 'sendrecv',
|
|
140
|
-
localTrackLabel: 'fake mic',
|
|
176
|
+
senders: [fakeStats.audio.senders[0]],
|
|
177
|
+
receivers: [fakeStats.audio.receivers[0]],
|
|
141
178
|
},
|
|
142
179
|
video: {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
180
|
+
senders: [fakeStats.video.senders[0]],
|
|
181
|
+
receivers: [fakeStats.video.receivers[0]],
|
|
182
|
+
},
|
|
183
|
+
screenShareAudio: {
|
|
184
|
+
senders: [],
|
|
185
|
+
receivers: [],
|
|
147
186
|
},
|
|
148
187
|
screenShareVideo: {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
})
|
|
188
|
+
senders: [],
|
|
189
|
+
receivers: [],
|
|
190
|
+
},
|
|
191
|
+
}),
|
|
154
192
|
};
|
|
155
193
|
|
|
156
194
|
networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
|
|
157
195
|
|
|
158
|
-
statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor);
|
|
196
|
+
statsAnalyzer = new StatsAnalyzer(initialConfig, () => ({}), networkQualityMonitor);
|
|
159
197
|
|
|
160
198
|
statsAnalyzer.on(EVENTS.LOCAL_MEDIA_STARTED, (data) => {
|
|
161
199
|
receivedEventsData.local.started = data;
|
|
@@ -169,6 +207,9 @@ describe('plugin-meetings', () => {
|
|
|
169
207
|
statsAnalyzer.on(EVENTS.REMOTE_MEDIA_STOPPED, (data) => {
|
|
170
208
|
receivedEventsData.remote.stopped = data;
|
|
171
209
|
});
|
|
210
|
+
statsAnalyzer.on(EVENTS.MEDIA_QUALITY, ({data}) => {
|
|
211
|
+
mqeData = data;
|
|
212
|
+
});
|
|
172
213
|
});
|
|
173
214
|
|
|
174
215
|
afterEach(() => {
|
|
@@ -195,6 +236,12 @@ describe('plugin-meetings', () => {
|
|
|
195
236
|
assert.deepEqual(receivedEventsData.remote.stopped, expected.remote?.stopped);
|
|
196
237
|
};
|
|
197
238
|
|
|
239
|
+
const checkMqeData = () => {
|
|
240
|
+
assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedFrameSize, 3600);
|
|
241
|
+
assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedHeight, 720);
|
|
242
|
+
assert.strictEqual(mqeData.videoReceive[0].streams[0].receivedWidth, 1280);
|
|
243
|
+
};
|
|
244
|
+
|
|
198
245
|
it('emits LOCAL_MEDIA_STARTED and LOCAL_MEDIA_STOPPED events for audio', async () => {
|
|
199
246
|
await startStatsAnalyzer({expected: {sendAudio: true}});
|
|
200
247
|
|
|
@@ -202,7 +249,7 @@ describe('plugin-meetings', () => {
|
|
|
202
249
|
checkReceivedEvent({expected: {}});
|
|
203
250
|
|
|
204
251
|
// setup a mock to return some values higher the previous ones
|
|
205
|
-
fakeStats.audio.
|
|
252
|
+
fakeStats.audio.senders[0].report[0].packetsSent += 10;
|
|
206
253
|
|
|
207
254
|
await progressTime();
|
|
208
255
|
|
|
@@ -222,7 +269,7 @@ describe('plugin-meetings', () => {
|
|
|
222
269
|
checkReceivedEvent({expected: {}});
|
|
223
270
|
|
|
224
271
|
// setup a mock to return some values higher the previous ones
|
|
225
|
-
fakeStats.video.
|
|
272
|
+
fakeStats.video.senders[0].report[0].framesSent += 1;
|
|
226
273
|
|
|
227
274
|
await progressTime();
|
|
228
275
|
|
|
@@ -242,7 +289,7 @@ describe('plugin-meetings', () => {
|
|
|
242
289
|
checkReceivedEvent({expected: {}});
|
|
243
290
|
|
|
244
291
|
// setup a mock to return some values higher the previous ones
|
|
245
|
-
fakeStats.audio.
|
|
292
|
+
fakeStats.audio.receivers[0].report[0].packetsReceived += 5;
|
|
246
293
|
|
|
247
294
|
await progressTime();
|
|
248
295
|
// check that we got the REMOTE_MEDIA_STARTED event for audio
|
|
@@ -262,7 +309,7 @@ describe('plugin-meetings', () => {
|
|
|
262
309
|
checkReceivedEvent({expected: {}});
|
|
263
310
|
|
|
264
311
|
// setup a mock to return some values higher the previous ones
|
|
265
|
-
fakeStats.video.
|
|
312
|
+
fakeStats.video.receivers[0].report[0].framesDecoded += 1;
|
|
266
313
|
|
|
267
314
|
await progressTime();
|
|
268
315
|
// check that we got the REMOTE_MEDIA_STARTED event for video
|
|
@@ -274,6 +321,15 @@ describe('plugin-meetings', () => {
|
|
|
274
321
|
|
|
275
322
|
checkReceivedEvent({expected: {remote: {stopped: {type: 'video'}}}});
|
|
276
323
|
});
|
|
324
|
+
|
|
325
|
+
it('emits the correct MEDIA_QUALITY events', async () => {
|
|
326
|
+
await startStatsAnalyzer({expected: {receiveVideo: true}});
|
|
327
|
+
|
|
328
|
+
await progressTime();
|
|
329
|
+
|
|
330
|
+
// Check that the mqe data has been emitted and is correctly computed.
|
|
331
|
+
checkMqeData();
|
|
332
|
+
});
|
|
277
333
|
});
|
|
278
334
|
});
|
|
279
335
|
});
|