@webex/plugin-meetings 3.0.0-beta.11 → 3.0.0-beta.110
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 +942 -0
- package/dist/breakouts/index.js.map +1 -0
- package/dist/breakouts/request.js +78 -0
- package/dist/breakouts/request.js.map +1 -0
- package/dist/breakouts/utils.js +67 -0
- package/dist/breakouts/utils.js.map +1 -0
- package/dist/common/browser-detection.js +1 -20
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +5 -20
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.js +0 -7
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.js +5 -26
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +5 -26
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +6 -27
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +5 -26
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/parameter.js +5 -33
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +5 -26
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +4 -25
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reconnection-in-progress.js +0 -17
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.js +5 -26
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +5 -26
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/common/errors/webex-errors.js +6 -41
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +1 -24
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js +0 -22
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js +0 -23
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js +0 -12
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js +0 -15
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.js +0 -4
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -8
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/common/logs/request.js +35 -61
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +4 -14
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +6 -6
- package/dist/config.js.map +1 -1
- package/dist/constants.js +193 -53
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.js +14 -0
- package/dist/controls-options-manager/constants.js.map +1 -0
- package/dist/controls-options-manager/enums.js +27 -0
- package/dist/controls-options-manager/enums.js.map +1 -0
- package/dist/controls-options-manager/index.js +297 -0
- package/dist/controls-options-manager/index.js.map +1 -0
- package/dist/controls-options-manager/types.js +7 -0
- package/dist/controls-options-manager/types.js.map +1 -0
- package/dist/controls-options-manager/util.js +286 -0
- package/dist/controls-options-manager/util.js.map +1 -0
- package/dist/index.js +72 -17
- package/dist/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.js +94 -29
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.js +3 -26
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js +0 -15
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js +4 -12
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/locus-info/index.js +383 -212
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +0 -38
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +12 -38
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +88 -123
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +99 -91
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +62 -147
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +71 -117
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +2 -9
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +505 -495
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +67 -14
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +2477 -2417
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.js +252 -113
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +296 -289
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js +7 -0
- package/dist/meeting/request.type.js.map +1 -0
- package/dist/meeting/state.js +21 -31
- package/dist/meeting/state.js.map +1 -1
- package/dist/meeting/util.js +58 -217
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +3 -25
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.js +10 -33
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +278 -281
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +1 -16
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js +98 -183
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +155 -232
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +24 -20
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +675 -593
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +23 -42
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +177 -155
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +89 -88
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +15 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +101 -69
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +12 -12
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +162 -204
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +58 -53
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js +15 -0
- package/dist/members/types.js.map +1 -0
- package/dist/members/util.js +107 -44
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/config.js +50 -16
- package/dist/metrics/config.js.map +1 -1
- package/dist/metrics/constants.js +3 -7
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +93 -162
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +167 -50
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +58 -65
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +74 -93
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +55 -74
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +6 -40
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +466 -442
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +32 -59
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +10 -45
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +2 -33
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js +0 -13
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/index.js +190 -199
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +14 -23
- package/dist/reachability/request.js.map +1 -1
- package/dist/reactions/constants.js +13 -0
- package/dist/reactions/constants.js.map +1 -0
- package/dist/reactions/reactions.js +2 -4
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.js +19 -23
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.js +326 -465
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/enums.js +17 -0
- package/dist/recording-controller/enums.js.map +1 -0
- package/dist/recording-controller/index.js +343 -0
- package/dist/recording-controller/index.js.map +1 -0
- package/dist/recording-controller/util.js +63 -0
- package/dist/recording-controller/util.js.map +1 -0
- package/dist/roap/index.js +38 -67
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +143 -134
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +149 -101
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js +1 -95
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +369 -461
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +144 -94
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +13 -45
- package/dist/transcription/index.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +34 -0
- package/dist/types/annotation/constants.d.ts +31 -0
- package/dist/types/annotation/index.d.ts +124 -0
- package/dist/types/breakouts/breakout.d.ts +8 -0
- package/dist/types/breakouts/collection.d.ts +5 -0
- package/dist/types/breakouts/edit-lock-error.d.ts +15 -0
- package/dist/types/breakouts/events.d.ts +2 -0
- package/dist/types/breakouts/index.d.ts +5 -0
- package/dist/types/breakouts/request.d.ts +22 -0
- package/dist/types/breakouts/utils.d.ts +15 -0
- package/dist/types/common/browser-detection.d.ts +9 -0
- package/dist/types/common/collection.d.ts +48 -0
- package/dist/types/common/config.d.ts +2 -0
- package/dist/types/common/errors/captcha-error.d.ts +15 -0
- package/dist/types/common/errors/intent-to-join.d.ts +16 -0
- package/dist/types/common/errors/join-meeting.d.ts +17 -0
- package/dist/types/common/errors/media.d.ts +15 -0
- package/dist/types/common/errors/parameter.d.ts +15 -0
- package/dist/types/common/errors/password-error.d.ts +15 -0
- package/dist/types/common/errors/permission.d.ts +14 -0
- package/dist/types/common/errors/reconnection-in-progress.d.ts +9 -0
- package/dist/types/common/errors/reconnection.d.ts +15 -0
- package/dist/types/common/errors/stats.d.ts +15 -0
- package/dist/types/common/errors/webex-errors.d.ts +69 -0
- package/dist/types/common/errors/webex-meetings-error.d.ts +20 -0
- package/dist/types/common/events/events-scope.d.ts +17 -0
- package/dist/types/common/events/events.d.ts +12 -0
- package/dist/types/common/events/trigger-proxy.d.ts +2 -0
- package/dist/types/common/events/util.d.ts +2 -0
- package/dist/types/common/logs/logger-config.d.ts +2 -0
- package/dist/types/common/logs/logger-proxy.d.ts +2 -0
- package/dist/types/common/logs/request.d.ts +34 -0
- package/dist/types/common/queue.d.ts +32 -0
- package/dist/types/config.d.ts +78 -0
- package/dist/types/constants.d.ts +984 -0
- package/dist/types/controls-options-manager/constants.d.ts +4 -0
- package/dist/types/controls-options-manager/enums.d.ts +15 -0
- package/dist/types/controls-options-manager/index.d.ts +136 -0
- package/dist/types/controls-options-manager/types.d.ts +43 -0
- package/dist/types/controls-options-manager/util.d.ts +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/locus-info/controlsUtils.d.ts +2 -0
- package/dist/types/locus-info/embeddedAppsUtils.d.ts +2 -0
- package/dist/types/locus-info/fullState.d.ts +2 -0
- package/dist/types/locus-info/hostUtils.d.ts +2 -0
- package/dist/types/locus-info/index.d.ts +315 -0
- package/dist/types/locus-info/infoUtils.d.ts +2 -0
- package/dist/types/locus-info/mediaSharesUtils.d.ts +2 -0
- package/dist/types/locus-info/parser.d.ts +212 -0
- package/dist/types/locus-info/selfUtils.d.ts +2 -0
- package/dist/types/media/index.d.ts +34 -0
- package/dist/types/media/properties.d.ts +108 -0
- package/dist/types/media/util.d.ts +2 -0
- package/dist/types/mediaQualityMetrics/config.d.ts +365 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +137 -0
- package/dist/types/meeting/index.d.ts +1753 -0
- package/dist/types/meeting/muteState.d.ts +185 -0
- package/dist/types/meeting/request.d.ts +275 -0
- package/dist/types/meeting/request.type.d.ts +11 -0
- package/dist/types/meeting/state.d.ts +9 -0
- package/dist/types/meeting/util.d.ts +2 -0
- package/dist/types/meeting-info/collection.d.ts +20 -0
- package/dist/types/meeting-info/index.d.ts +57 -0
- package/dist/types/meeting-info/meeting-info-v2.d.ts +115 -0
- package/dist/types/meeting-info/request.d.ts +22 -0
- package/dist/types/meeting-info/util.d.ts +2 -0
- package/dist/types/meeting-info/utilv2.d.ts +2 -0
- package/dist/types/meetings/collection.d.ts +31 -0
- package/dist/types/meetings/index.d.ts +345 -0
- package/dist/types/meetings/request.d.ts +27 -0
- package/dist/types/meetings/util.d.ts +18 -0
- package/dist/types/member/index.d.ts +157 -0
- package/dist/types/member/types.d.ts +21 -0
- package/dist/types/member/util.d.ts +2 -0
- package/dist/types/members/collection.d.ts +29 -0
- package/dist/types/members/index.d.ts +353 -0
- package/dist/types/members/request.d.ts +69 -0
- package/dist/types/members/types.d.ts +24 -0
- package/dist/types/members/util.d.ts +2 -0
- package/dist/types/metrics/config.d.ts +195 -0
- package/dist/types/metrics/constants.d.ts +54 -0
- package/dist/types/metrics/index.d.ts +169 -0
- package/dist/types/multistream/mediaRequestManager.d.ts +101 -0
- package/dist/types/multistream/receiveSlot.d.ts +68 -0
- package/dist/types/multistream/receiveSlotManager.d.ts +56 -0
- package/dist/types/multistream/remoteMedia.d.ts +72 -0
- package/dist/types/multistream/remoteMediaGroup.d.ts +47 -0
- package/dist/types/multistream/remoteMediaManager.d.ts +263 -0
- package/dist/types/networkQualityMonitor/index.d.ts +70 -0
- package/dist/types/personal-meeting-room/index.d.ts +47 -0
- package/dist/types/personal-meeting-room/request.d.ts +14 -0
- package/dist/types/personal-meeting-room/util.d.ts +2 -0
- package/dist/types/reachability/index.d.ts +152 -0
- package/dist/types/reachability/request.d.ts +37 -0
- package/dist/types/reactions/constants.d.ts +3 -0
- package/dist/types/reactions/reactions.d.ts +4 -0
- package/dist/types/reactions/reactions.type.d.ts +52 -0
- package/dist/types/reconnection-manager/index.d.ts +126 -0
- package/dist/types/recording-controller/enums.d.ts +7 -0
- package/dist/types/recording-controller/index.d.ts +193 -0
- package/dist/types/recording-controller/util.d.ts +13 -0
- package/dist/types/roap/index.d.ts +77 -0
- package/dist/types/roap/request.d.ts +38 -0
- package/dist/types/roap/turnDiscovery.d.ts +88 -0
- package/dist/types/statsAnalyzer/global.d.ts +36 -0
- package/dist/types/statsAnalyzer/index.d.ts +200 -0
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +24 -0
- package/dist/types/transcription/index.d.ts +64 -0
- package/internal-README.md +7 -6
- package/package.json +28 -21
- package/src/annotation/annotation.types.ts +41 -0
- package/src/annotation/constants.ts +36 -0
- package/src/annotation/index.ts +339 -0
- package/src/breakouts/README.md +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 +832 -0
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +57 -0
- package/src/common/browser-detection.ts +9 -6
- package/src/common/collection.ts +3 -1
- package/src/common/errors/captcha-error.ts +6 -6
- package/src/common/errors/intent-to-join.ts +6 -6
- package/src/common/errors/join-meeting.ts +12 -8
- package/src/common/errors/media.ts +6 -6
- package/src/common/errors/parameter.ts +9 -6
- package/src/common/errors/password-error.ts +6 -6
- package/src/common/errors/permission.ts +5 -5
- package/src/common/errors/reconnection.ts +6 -6
- package/src/common/errors/stats.ts +6 -6
- package/src/common/errors/webex-errors.ts +7 -5
- package/src/common/errors/webex-meetings-error.ts +1 -1
- package/src/common/events/events-scope.ts +5 -1
- package/src/common/events/events.ts +5 -1
- package/src/common/events/trigger-proxy.ts +8 -3
- package/src/common/events/util.ts +1 -2
- package/src/common/logs/logger-proxy.ts +21 -10
- package/src/common/logs/request.ts +11 -8
- package/src/config.ts +16 -12
- package/src/constants.ts +141 -6
- package/src/controls-options-manager/constants.ts +5 -0
- package/src/controls-options-manager/enums.ts +18 -0
- package/src/controls-options-manager/index.ts +278 -0
- package/src/controls-options-manager/types.ts +59 -0
- package/src/controls-options-manager/util.ts +274 -0
- package/src/index.ts +33 -0
- package/src/locus-info/controlsUtils.ts +145 -24
- package/src/locus-info/fullState.ts +15 -11
- package/src/locus-info/hostUtils.ts +4 -3
- package/src/locus-info/index.ts +326 -55
- package/src/locus-info/infoUtils.ts +12 -4
- package/src/locus-info/mediaSharesUtils.ts +4 -4
- package/src/locus-info/parser.ts +46 -68
- package/src/locus-info/selfUtils.ts +187 -56
- package/src/media/index.ts +142 -172
- package/src/media/properties.ts +43 -36
- package/src/media/util.ts +1 -1
- package/src/mediaQualityMetrics/config.ts +380 -378
- package/src/meeting/in-meeting-actions.ts +139 -3
- package/src/meeting/index.ts +2674 -1543
- package/src/meeting/muteState.ts +271 -68
- package/src/meeting/request.ts +231 -135
- package/src/meeting/request.type.ts +13 -0
- package/src/meeting/state.ts +45 -30
- package/src/meeting/util.ts +119 -110
- package/src/meeting-info/collection.ts +2 -1
- package/src/meeting-info/index.ts +32 -30
- package/src/meeting-info/meeting-info-v2.ts +201 -113
- package/src/meeting-info/request.ts +9 -3
- package/src/meeting-info/util.ts +54 -46
- package/src/meeting-info/utilv2.ts +70 -55
- package/src/meetings/collection.ts +21 -1
- package/src/meetings/index.ts +749 -437
- package/src/meetings/request.ts +29 -25
- package/src/meetings/util.ts +122 -33
- package/src/member/index.ts +95 -49
- package/src/member/types.ts +24 -0
- package/src/member/util.ts +106 -13
- package/src/members/collection.ts +8 -1
- package/src/members/index.ts +281 -129
- package/src/members/request.ts +87 -14
- package/src/members/types.ts +28 -0
- package/src/members/util.ts +140 -49
- package/src/metrics/config.ts +302 -90
- package/src/metrics/constants.ts +1 -6
- package/src/metrics/index.ts +124 -95
- package/src/multistream/mediaRequestManager.ts +203 -45
- package/src/multistream/receiveSlot.ts +69 -26
- package/src/multistream/receiveSlotManager.ts +62 -38
- package/src/multistream/remoteMedia.ts +30 -4
- package/src/multistream/remoteMediaGroup.ts +4 -3
- package/src/multistream/remoteMediaManager.ts +230 -66
- package/src/networkQualityMonitor/index.ts +24 -27
- package/src/personal-meeting-room/index.ts +12 -16
- package/src/personal-meeting-room/request.ts +10 -3
- package/src/personal-meeting-room/util.ts +3 -3
- package/src/reachability/index.ts +131 -79
- package/src/reachability/request.ts +43 -34
- package/src/reactions/constants.ts +4 -0
- package/src/reactions/reactions.ts +8 -8
- package/src/reactions/reactions.type.ts +31 -5
- package/src/reconnection-manager/index.ts +193 -111
- package/src/recording-controller/enums.ts +8 -0
- package/src/recording-controller/index.ts +315 -0
- package/src/recording-controller/util.ts +58 -0
- package/src/roap/index.ts +63 -51
- package/src/roap/request.ts +86 -53
- package/src/roap/turnDiscovery.ts +105 -46
- package/src/statsAnalyzer/global.ts +8 -104
- package/src/statsAnalyzer/index.ts +624 -376
- package/src/statsAnalyzer/mqaUtil.ts +203 -90
- package/src/transcription/index.ts +34 -32
- package/test/integration/spec/converged-space-meetings.js +177 -0
- package/test/integration/spec/journey.js +670 -466
- package/test/integration/spec/space-meeting.js +320 -204
- package/test/integration/spec/transcription.js +7 -8
- package/test/unit/spec/annotation/index.ts +435 -0
- package/test/unit/spec/breakouts/breakout.ts +184 -0
- package/test/unit/spec/breakouts/collection.ts +15 -0
- package/test/unit/spec/breakouts/edit-lock-error.ts +30 -0
- package/test/unit/spec/breakouts/events.ts +77 -0
- package/test/unit/spec/breakouts/index.ts +1524 -0
- package/test/unit/spec/breakouts/request.ts +104 -0
- package/test/unit/spec/breakouts/utils.js +72 -0
- package/test/unit/spec/common/browser-detection.js +9 -28
- package/test/unit/spec/controls-options-manager/index.js +287 -0
- package/test/unit/spec/controls-options-manager/util.js +504 -0
- package/test/unit/spec/fixture/locus.js +93 -90
- package/test/unit/spec/locus-info/controlsUtils.js +289 -32
- package/test/unit/spec/locus-info/embeddedAppsUtils.js +8 -6
- package/test/unit/spec/locus-info/index.js +585 -5
- package/test/unit/spec/locus-info/infoUtils.js +26 -33
- package/test/unit/spec/locus-info/lib/BasicSeqCmp.json +88 -430
- package/test/unit/spec/locus-info/lib/SeqCmp.json +513 -685
- package/test/unit/spec/locus-info/parser.js +3 -9
- package/test/unit/spec/locus-info/selfConstant.js +110 -103
- package/test/unit/spec/locus-info/selfUtils.js +236 -12
- package/test/unit/spec/media/index.ts +104 -8
- package/test/unit/spec/media/properties.ts +9 -9
- package/test/unit/spec/meeting/in-meeting-actions.ts +66 -3
- package/test/unit/spec/meeting/index.js +2934 -946
- package/test/unit/spec/meeting/muteState.js +368 -70
- package/test/unit/spec/meeting/request.js +194 -44
- package/test/unit/spec/meeting/utils.js +146 -165
- package/test/unit/spec/meeting-info/meetinginfov2.js +333 -74
- package/test/unit/spec/meeting-info/request.js +7 -9
- package/test/unit/spec/meeting-info/util.js +11 -12
- package/test/unit/spec/meeting-info/utilv2.js +131 -74
- package/test/unit/spec/meetings/collection.js +15 -1
- package/test/unit/spec/meetings/index.js +1052 -329
- package/test/unit/spec/meetings/utils.js +163 -14
- package/test/unit/spec/member/index.js +24 -1
- package/test/unit/spec/member/util.js +383 -32
- package/test/unit/spec/members/index.js +402 -54
- package/test/unit/spec/members/request.js +76 -20
- package/test/unit/spec/members/utils.js +191 -4
- package/test/unit/spec/metrics/index.js +104 -20
- package/test/unit/spec/multistream/mediaRequestManager.ts +650 -105
- package/test/unit/spec/multistream/receiveSlot.ts +76 -17
- package/test/unit/spec/multistream/receiveSlotManager.ts +69 -39
- package/test/unit/spec/multistream/remoteMedia.ts +32 -2
- package/test/unit/spec/multistream/remoteMediaGroup.ts +5 -5
- package/test/unit/spec/multistream/remoteMediaManager.ts +549 -65
- package/test/unit/spec/networkQualityMonitor/index.js +24 -18
- package/test/unit/spec/personal-meeting-room/personal-meeting-room.js +2 -7
- package/test/unit/spec/reachability/index.ts +176 -27
- package/test/unit/spec/reachability/request.js +66 -0
- package/test/unit/spec/reconnection-manager/index.js +62 -31
- package/test/unit/spec/recording-controller/index.js +231 -0
- package/test/unit/spec/recording-controller/util.js +102 -0
- package/test/unit/spec/roap/index.ts +21 -16
- package/test/unit/spec/roap/request.ts +217 -0
- package/test/unit/spec/roap/turnDiscovery.ts +93 -49
- package/test/unit/spec/stats-analyzer/index.js +116 -60
- package/test/utils/cmr.js +44 -42
- package/test/utils/constants.js +9 -0
- package/test/utils/integrationTestUtils.js +64 -0
- package/test/utils/testUtils.js +63 -99
- package/test/utils/webex-config.js +22 -18
- package/test/utils/webex-test-users.js +57 -50
- package/tsconfig.json +6 -0
- package/dist/media/internal-media-core-wrapper.js +0 -22
- package/dist/media/internal-media-core-wrapper.js.map +0 -1
- package/dist/meeting/effectsState.js +0 -334
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/multistream/multistreamMedia.js +0 -116
- package/dist/multistream/multistreamMedia.js.map +0 -1
- package/src/index.js +0 -15
- package/src/media/internal-media-core-wrapper.ts +0 -9
- package/src/meeting/effectsState.ts +0 -211
- package/src/multistream/multistreamMedia.ts +0 -92
- package/test/unit/spec/meeting/effectsState.js +0 -291
|
@@ -25,28 +25,33 @@ 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
|
|
50
55
|
};
|
|
51
56
|
});
|
|
52
57
|
|
|
@@ -55,7 +60,11 @@ describe('TurnDiscovery', () => {
|
|
|
55
60
|
sinon.restore();
|
|
56
61
|
});
|
|
57
62
|
|
|
58
|
-
const checkRoapMessageSent = async (
|
|
63
|
+
const checkRoapMessageSent = async (
|
|
64
|
+
messageType,
|
|
65
|
+
expectedSeq,
|
|
66
|
+
expectedMediaId = testMeeting.mediaId
|
|
67
|
+
) => {
|
|
59
68
|
await testUtils.flushPromises();
|
|
60
69
|
|
|
61
70
|
assert.calledOnce(mockRoapRequest.sendRoap);
|
|
@@ -68,9 +77,10 @@ describe('TurnDiscovery', () => {
|
|
|
68
77
|
correlationId: testMeeting.correlationId,
|
|
69
78
|
locusSelfUrl: testMeeting.selfUrl,
|
|
70
79
|
mediaId: expectedMediaId,
|
|
71
|
-
audioMuted: testMeeting.
|
|
72
|
-
videoMuted: testMeeting.
|
|
73
|
-
meetingId: testMeeting.id
|
|
80
|
+
audioMuted: testMeeting.audio?.isLocallyMuted(),
|
|
81
|
+
videoMuted: testMeeting.video?.isLocallyMuted(),
|
|
82
|
+
meetingId: testMeeting.id,
|
|
83
|
+
preferTranscoding: !testMeeting.isMultistream
|
|
74
84
|
});
|
|
75
85
|
|
|
76
86
|
if (messageType === 'TURN_DISCOVERY_REQUEST') {
|
|
@@ -93,39 +103,44 @@ describe('TurnDiscovery', () => {
|
|
|
93
103
|
};
|
|
94
104
|
|
|
95
105
|
describe('doTurnDiscovery', () => {
|
|
96
|
-
|
|
97
|
-
|
|
106
|
+
[false, true].forEach(function (enabledMultistream ) {
|
|
107
|
+
it('sends TURN_DISCOVERY_REQUEST'+ (enabledMultistream ? ' when enable Multistream':'') + ', waits for response and sends OK', async () => {
|
|
108
|
+
testMeeting.isMultistream = enabledMultistream;
|
|
98
109
|
|
|
99
|
-
|
|
110
|
+
const td = new TurnDiscovery(mockRoapRequest);
|
|
100
111
|
|
|
101
|
-
|
|
102
|
-
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
|
112
|
+
const result = td.doTurnDiscovery(testMeeting, false);
|
|
103
113
|
|
|
104
|
-
|
|
114
|
+
// check that TURN_DISCOVERY_REQUEST was sent
|
|
115
|
+
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
|
105
116
|
|
|
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
|
-
});
|
|
117
|
+
// @ts-ignore
|
|
118
|
+
mockRoapRequest.sendRoap.resetHistory();
|
|
114
119
|
|
|
115
|
-
|
|
120
|
+
// simulate the response
|
|
121
|
+
td.handleTurnDiscoveryResponse({
|
|
122
|
+
headers: [
|
|
123
|
+
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
124
|
+
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
125
|
+
`x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
|
|
126
|
+
]
|
|
127
|
+
});
|
|
116
128
|
|
|
117
|
-
|
|
118
|
-
await checkRoapMessageSent('OK', 0);
|
|
129
|
+
await testUtils.flushPromises();
|
|
119
130
|
|
|
120
|
-
|
|
131
|
+
// check that we've sent OK
|
|
132
|
+
await checkRoapMessageSent('OK', 0);
|
|
121
133
|
|
|
122
|
-
|
|
123
|
-
url: FAKE_TURN_URL,
|
|
124
|
-
username: FAKE_TURN_USERNAME,
|
|
125
|
-
password: FAKE_TURN_PASSWORD
|
|
126
|
-
});
|
|
134
|
+
const {turnServerInfo, turnDiscoverySkippedReason} = await result;
|
|
127
135
|
|
|
128
|
-
|
|
136
|
+
assert.deepEqual(turnServerInfo, {
|
|
137
|
+
url: FAKE_TURN_URL,
|
|
138
|
+
username: FAKE_TURN_USERNAME,
|
|
139
|
+
password: FAKE_TURN_PASSWORD
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
assert.isUndefined(turnDiscoverySkippedReason);
|
|
143
|
+
});
|
|
129
144
|
});
|
|
130
145
|
|
|
131
146
|
it('sends TURN_DISCOVERY_REQUEST with empty mediaId when isReconnecting is true', async () => {
|
|
@@ -137,6 +152,7 @@ describe('TurnDiscovery', () => {
|
|
|
137
152
|
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0, '');
|
|
138
153
|
|
|
139
154
|
// the main part of the test is complete now, checking the remaining part of the flow just for completeness
|
|
155
|
+
// @ts-ignore
|
|
140
156
|
mockRoapRequest.sendRoap.resetHistory();
|
|
141
157
|
|
|
142
158
|
// simulate the response
|
|
@@ -145,7 +161,7 @@ describe('TurnDiscovery', () => {
|
|
|
145
161
|
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
146
162
|
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
147
163
|
`x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
|
|
148
|
-
]
|
|
164
|
+
],
|
|
149
165
|
});
|
|
150
166
|
|
|
151
167
|
await testUtils.flushPromises();
|
|
@@ -158,7 +174,7 @@ describe('TurnDiscovery', () => {
|
|
|
158
174
|
assert.deepEqual(turnServerInfo, {
|
|
159
175
|
url: FAKE_TURN_URL,
|
|
160
176
|
username: FAKE_TURN_USERNAME,
|
|
161
|
-
password: FAKE_TURN_PASSWORD
|
|
177
|
+
password: FAKE_TURN_PASSWORD,
|
|
162
178
|
});
|
|
163
179
|
assert.isUndefined(turnDiscoverySkippedReason);
|
|
164
180
|
});
|
|
@@ -169,7 +185,7 @@ describe('TurnDiscovery', () => {
|
|
|
169
185
|
|
|
170
186
|
// check that TURN_DISCOVERY_REQUEST was sent
|
|
171
187
|
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
|
172
|
-
|
|
188
|
+
// @ts-ignore
|
|
173
189
|
mockRoapRequest.sendRoap.resetHistory();
|
|
174
190
|
|
|
175
191
|
// simulate the response with some extra headers
|
|
@@ -181,7 +197,7 @@ describe('TurnDiscovery', () => {
|
|
|
181
197
|
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
182
198
|
`x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
|
|
183
199
|
'another-header-at-the-end=12345',
|
|
184
|
-
]
|
|
200
|
+
],
|
|
185
201
|
});
|
|
186
202
|
|
|
187
203
|
await testUtils.flushPromises();
|
|
@@ -193,7 +209,7 @@ describe('TurnDiscovery', () => {
|
|
|
193
209
|
assert.deepEqual(turnServerInfo, {
|
|
194
210
|
url: FAKE_TURN_URL,
|
|
195
211
|
username: FAKE_TURN_USERNAME,
|
|
196
|
-
password: FAKE_TURN_PASSWORD
|
|
212
|
+
password: FAKE_TURN_PASSWORD,
|
|
197
213
|
});
|
|
198
214
|
assert.isUndefined(turnDiscoverySkippedReason);
|
|
199
215
|
});
|
|
@@ -202,7 +218,7 @@ describe('TurnDiscovery', () => {
|
|
|
202
218
|
const prevConfigValue = testMeeting.config.experimental.enableTurnDiscovery;
|
|
203
219
|
|
|
204
220
|
testMeeting.config.experimental.enableTurnDiscovery = false;
|
|
205
|
-
|
|
221
|
+
// @ts-ignore
|
|
206
222
|
const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
|
|
207
223
|
|
|
208
224
|
const {turnServerInfo, turnDiscoverySkippedReason} = result;
|
|
@@ -232,7 +248,7 @@ describe('TurnDiscovery', () => {
|
|
|
232
248
|
|
|
233
249
|
it('resolves with undefined when cluster is reachable', async () => {
|
|
234
250
|
const prev = testMeeting.webex.meetings.reachability.isAnyClusterReachable;
|
|
235
|
-
testMeeting.webex.meetings.reachability.isAnyClusterReachable = () => true;
|
|
251
|
+
testMeeting.webex.meetings.reachability.isAnyClusterReachable = () => Promise.resolve(true);
|
|
236
252
|
const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
|
|
237
253
|
|
|
238
254
|
const {turnServerInfo, turnDiscoverySkippedReason} = result;
|
|
@@ -242,10 +258,9 @@ describe('TurnDiscovery', () => {
|
|
|
242
258
|
assert.notCalled(mockRoapRequest.sendRoap);
|
|
243
259
|
assert.notCalled(Metrics.sendBehavioralMetric);
|
|
244
260
|
testMeeting.webex.meetings.reachability.isAnyClusterReachable = prev;
|
|
245
|
-
|
|
246
261
|
});
|
|
247
262
|
|
|
248
|
-
it(
|
|
263
|
+
it("resolves with undefined if we don't get a response within 10s", async () => {
|
|
249
264
|
const td = new TurnDiscovery(mockRoapRequest);
|
|
250
265
|
|
|
251
266
|
const promise = td.doTurnDiscovery(testMeeting, false);
|
|
@@ -264,12 +279,14 @@ describe('TurnDiscovery', () => {
|
|
|
264
279
|
const td = new TurnDiscovery(mockRoapRequest);
|
|
265
280
|
const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
|
|
266
281
|
|
|
282
|
+
await testUtils.flushPromises();
|
|
283
|
+
|
|
267
284
|
// simulate the response without the password
|
|
268
285
|
td.handleTurnDiscoveryResponse({
|
|
269
286
|
headers: [
|
|
270
287
|
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
271
288
|
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
272
|
-
]
|
|
289
|
+
],
|
|
273
290
|
});
|
|
274
291
|
await testUtils.flushPromises();
|
|
275
292
|
const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
|
|
@@ -283,6 +300,8 @@ describe('TurnDiscovery', () => {
|
|
|
283
300
|
const td = new TurnDiscovery(mockRoapRequest);
|
|
284
301
|
const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
|
|
285
302
|
|
|
303
|
+
await testUtils.flushPromises();
|
|
304
|
+
|
|
286
305
|
// simulate the response without the headers
|
|
287
306
|
td.handleTurnDiscoveryResponse({});
|
|
288
307
|
|
|
@@ -298,11 +317,13 @@ describe('TurnDiscovery', () => {
|
|
|
298
317
|
const td = new TurnDiscovery(mockRoapRequest);
|
|
299
318
|
const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
|
|
300
319
|
|
|
320
|
+
await testUtils.flushPromises();
|
|
321
|
+
|
|
301
322
|
// simulate the response without the headers
|
|
302
323
|
td.handleTurnDiscoveryResponse({headers: []});
|
|
303
324
|
|
|
304
325
|
await testUtils.flushPromises();
|
|
305
|
-
const {turnServerInfo, turnDiscoverySkippedReason}= await turnDiscoveryPromise;
|
|
326
|
+
const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
|
|
306
327
|
|
|
307
328
|
assert.isUndefined(turnServerInfo);
|
|
308
329
|
assert.isUndefined(turnDiscoverySkippedReason);
|
|
@@ -314,9 +335,11 @@ describe('TurnDiscovery', () => {
|
|
|
314
335
|
|
|
315
336
|
const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
|
|
316
337
|
|
|
338
|
+
await testUtils.flushPromises();
|
|
339
|
+
|
|
317
340
|
// check that TURN_DISCOVERY_REQUEST was sent
|
|
318
341
|
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
|
319
|
-
|
|
342
|
+
// @ts-ignore
|
|
320
343
|
mockRoapRequest.sendRoap.resetHistory();
|
|
321
344
|
|
|
322
345
|
// setup the mock so that sending of OK fails
|
|
@@ -328,7 +351,7 @@ describe('TurnDiscovery', () => {
|
|
|
328
351
|
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
329
352
|
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
330
353
|
`x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
|
|
331
|
-
]
|
|
354
|
+
],
|
|
332
355
|
});
|
|
333
356
|
|
|
334
357
|
await testUtils.flushPromises();
|
|
@@ -344,8 +367,29 @@ describe('TurnDiscovery', () => {
|
|
|
344
367
|
});
|
|
345
368
|
});
|
|
346
369
|
|
|
370
|
+
describe('isSkipped', () => {
|
|
371
|
+
[
|
|
372
|
+
{enabledInConfig: true, isAnyClusterReachable: true, expectedIsSkipped: true},
|
|
373
|
+
{enabledInConfig: true, isAnyClusterReachable: false, expectedIsSkipped: false},
|
|
374
|
+
{enabledInConfig: false, isAnyClusterReachable: true, expectedIsSkipped: true},
|
|
375
|
+
{enabledInConfig: false, isAnyClusterReachable: false, expectedIsSkipped: true},
|
|
376
|
+
].forEach(({enabledInConfig, isAnyClusterReachable, expectedIsSkipped}) => {
|
|
377
|
+
it(`returns ${expectedIsSkipped} when TURN discovery is ${enabledInConfig ? '' : 'not '} enabled in config and isAnyClusterReachable() returns ${isAnyClusterReachable ? 'true' : 'false'}`, async () => {
|
|
378
|
+
testMeeting.config.experimental.enableTurnDiscovery = enabledInConfig;
|
|
379
|
+
|
|
380
|
+
sinon.stub(testMeeting.webex.meetings.reachability, 'isAnyClusterReachable').resolves(isAnyClusterReachable);
|
|
381
|
+
|
|
382
|
+
const td = new TurnDiscovery(mockRoapRequest);
|
|
383
|
+
|
|
384
|
+
const isSkipped = await td.isSkipped(testMeeting);
|
|
385
|
+
|
|
386
|
+
assert.equal(isSkipped, expectedIsSkipped);
|
|
387
|
+
})
|
|
388
|
+
})
|
|
389
|
+
})
|
|
390
|
+
|
|
347
391
|
describe('handleTurnDiscoveryResponse', () => {
|
|
348
|
-
it(
|
|
392
|
+
it("doesn't do anything if turn discovery was not started", () => {
|
|
349
393
|
const td = new TurnDiscovery(mockRoapRequest);
|
|
350
394
|
|
|
351
395
|
// there is not much we can check, but we mainly want to make
|
|
@@ -355,7 +399,7 @@ describe('TurnDiscovery', () => {
|
|
|
355
399
|
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
356
400
|
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
357
401
|
`x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
|
|
358
|
-
]
|
|
402
|
+
],
|
|
359
403
|
});
|
|
360
404
|
|
|
361
405
|
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
|
});
|