@webex/plugin-meetings 3.0.0-beta.17 → 3.0.0-beta.171
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 -7
- package/dist/annotation/annotation.types.js +7 -0
- package/dist/annotation/annotation.types.js.map +1 -0
- package/dist/annotation/constants.js +49 -0
- package/dist/annotation/constants.js.map +1 -0
- package/dist/annotation/index.js +359 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.js +216 -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 +45 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.js +1048 -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/errors/webex-errors.js +3 -2
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -1
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/config.js +6 -8
- package/dist/config.js.map +1 -1
- package/dist/constants.js +194 -28
- 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 +300 -0
- package/dist/controls-options-manager/util.js.map +1 -0
- package/dist/index.js +107 -0
- package/dist/index.js.map +1 -1
- package/dist/interpretation/collection.js +23 -0
- package/dist/interpretation/collection.js.map +1 -0
- package/dist/interpretation/index.js +214 -0
- package/dist/interpretation/index.js.map +1 -0
- package/dist/interpretation/siLanguage.js +25 -0
- package/dist/interpretation/siLanguage.js.map +1 -0
- package/dist/locus-info/controlsUtils.js +92 -2
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +350 -41
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +43 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +2 -1
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +97 -14
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +41 -136
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +33 -94
- package/dist/media/properties.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +505 -493
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +76 -2
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +2757 -2439
- 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 +229 -124
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +191 -167
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js.map +1 -1
- package/dist/meeting/util.js +477 -466
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/index.js +48 -7
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +172 -50
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/utilv2.js +20 -5
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +22 -0
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +377 -82
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/meetings.types.js +7 -0
- package/dist/meetings/meetings.types.js.map +1 -0
- package/dist/meetings/request.js +16 -12
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +88 -1
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +43 -0
- 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 +97 -3
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +10 -0
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +94 -11
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +109 -39
- package/dist/members/request.js.map +1 -1
- package/dist/members/types.js +15 -0
- package/dist/members/types.js.map +1 -0
- package/dist/members/util.js +316 -233
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +3 -5
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +1 -468
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +265 -36
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +52 -19
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +53 -33
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +44 -18
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +60 -3
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +322 -103
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +4 -2
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/reachability/index.js +117 -60
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +12 -5
- 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 -2
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.js +18 -18
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/reconnection-manager/index.js +216 -162
- 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 +363 -0
- package/dist/recording-controller/index.js.map +1 -0
- package/dist/recording-controller/util.js +64 -0
- package/dist/recording-controller/util.js.map +1 -0
- package/dist/roap/index.js +21 -29
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +135 -94
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +135 -53
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js +1 -93
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +329 -314
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +103 -54
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +43 -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 +8 -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 +72 -0
- package/dist/types/constants.d.ts +1007 -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/interpretation/collection.d.ts +5 -0
- package/dist/types/interpretation/index.d.ts +5 -0
- package/dist/types/interpretation/siLanguage.d.ts +5 -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 +93 -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 +149 -0
- package/dist/types/meeting/index.d.ts +1462 -0
- package/dist/types/meeting/locusMediaRequest.d.ts +70 -0
- package/dist/types/meeting/muteState.d.ts +184 -0
- package/dist/types/meeting/request.d.ts +270 -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 +77 -0
- package/dist/types/meeting-info/collection.d.ts +20 -0
- package/dist/types/meeting-info/index.d.ts +62 -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 +365 -0
- package/dist/types/meetings/meetings.types.d.ts +4 -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 +158 -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/constants.d.ts +55 -0
- package/dist/types/metrics/index.d.ts +45 -0
- package/dist/types/multistream/mediaRequestManager.d.ts +118 -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 +277 -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 +208 -0
- package/dist/types/recording-controller/util.d.ts +14 -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/package.json +29 -21
- package/src/annotation/annotation.types.ts +52 -0
- package/src/annotation/constants.ts +36 -0
- package/src/annotation/index.ts +343 -0
- package/src/breakouts/README.md +220 -0
- package/src/breakouts/breakout.ts +188 -0
- package/src/breakouts/collection.ts +19 -0
- package/src/breakouts/edit-lock-error.ts +25 -0
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +925 -0
- package/src/breakouts/request.ts +55 -0
- package/src/breakouts/utils.ts +57 -0
- package/src/common/errors/webex-errors.ts +6 -2
- package/src/common/logs/logger-proxy.ts +1 -1
- package/src/config.ts +5 -7
- package/src/constants.ts +183 -22
- 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 +286 -0
- package/src/index.ts +39 -0
- package/src/interpretation/README.md +51 -0
- package/src/interpretation/collection.ts +19 -0
- package/src/interpretation/index.ts +182 -0
- package/src/interpretation/siLanguage.ts +18 -0
- package/src/locus-info/controlsUtils.ts +110 -0
- package/src/locus-info/index.ts +374 -38
- package/src/locus-info/mediaSharesUtils.ts +48 -0
- package/src/locus-info/parser.ts +2 -1
- package/src/locus-info/selfUtils.ts +86 -2
- package/src/media/index.ts +78 -144
- package/src/media/properties.ts +55 -99
- package/src/mediaQualityMetrics/config.ts +379 -377
- package/src/meeting/in-meeting-actions.ts +151 -3
- package/src/meeting/index.ts +2181 -2052
- package/src/meeting/locusMediaRequest.ts +309 -0
- package/src/meeting/muteState.ts +228 -132
- package/src/meeting/request.ts +100 -91
- package/src/meeting/request.type.ts +2 -0
- package/src/meeting/util.ts +450 -439
- package/src/meeting-info/index.ts +54 -8
- package/src/meeting-info/meeting-info-v2.ts +150 -14
- package/src/meeting-info/utilv2.ts +13 -3
- package/src/meetings/collection.ts +20 -0
- package/src/meetings/index.ts +396 -89
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +3 -1
- package/src/meetings/util.ts +103 -4
- package/src/member/index.ts +42 -0
- package/src/member/types.ts +24 -0
- package/src/member/util.ts +95 -1
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +108 -6
- package/src/members/request.ts +98 -17
- package/src/members/types.ts +28 -0
- package/src/members/util.ts +319 -240
- package/src/metrics/constants.ts +2 -4
- package/src/metrics/index.ts +1 -490
- package/src/multistream/mediaRequestManager.ts +337 -63
- package/src/multistream/receiveSlot.ts +68 -26
- package/src/multistream/receiveSlotManager.ts +61 -38
- package/src/multistream/remoteMedia.ts +29 -3
- package/src/multistream/remoteMediaGroup.ts +61 -2
- package/src/multistream/remoteMediaManager.ts +260 -66
- package/src/networkQualityMonitor/index.ts +6 -6
- package/src/reachability/index.ts +75 -25
- package/src/reachability/request.ts +10 -5
- package/src/reactions/constants.ts +4 -0
- package/src/reactions/reactions.ts +4 -4
- package/src/reactions/reactions.type.ts +28 -3
- package/src/reconnection-manager/index.ts +83 -49
- package/src/recording-controller/enums.ts +8 -0
- package/src/recording-controller/index.ts +333 -0
- package/src/recording-controller/util.ts +75 -0
- package/src/roap/index.ts +21 -30
- package/src/roap/request.ts +72 -61
- package/src/roap/turnDiscovery.ts +51 -27
- package/src/statsAnalyzer/global.ts +1 -94
- package/src/statsAnalyzer/index.ts +380 -390
- package/src/statsAnalyzer/mqaUtil.ts +106 -99
- package/test/integration/spec/converged-space-meetings.js +233 -0
- package/test/integration/spec/journey.js +336 -259
- package/test/integration/spec/space-meeting.js +77 -4
- package/test/unit/spec/annotation/index.ts +436 -0
- package/test/unit/spec/breakouts/breakout.ts +237 -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 +89 -0
- package/test/unit/spec/breakouts/index.ts +1790 -0
- package/test/unit/spec/breakouts/request.ts +104 -0
- package/test/unit/spec/breakouts/utils.js +72 -0
- package/test/unit/spec/controls-options-manager/index.js +287 -0
- package/test/unit/spec/controls-options-manager/util.js +518 -0
- package/test/unit/spec/fixture/locus.js +1 -0
- package/test/unit/spec/interpretation/collection.ts +15 -0
- package/test/unit/spec/interpretation/index.ts +329 -0
- package/test/unit/spec/interpretation/siLanguage.ts +26 -0
- package/test/unit/spec/locus-info/controlsUtils.js +323 -30
- package/test/unit/spec/locus-info/index.js +792 -4
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +22 -0
- package/test/unit/spec/locus-info/selfConstant.js +48 -0
- package/test/unit/spec/locus-info/selfUtils.js +275 -0
- package/test/unit/spec/media/index.ts +130 -24
- package/test/unit/spec/media/properties.ts +9 -9
- package/test/unit/spec/meeting/in-meeting-actions.ts +75 -3
- package/test/unit/spec/meeting/index.js +2834 -1442
- package/test/unit/spec/meeting/locusMediaRequest.ts +436 -0
- package/test/unit/spec/meeting/muteState.js +370 -208
- package/test/unit/spec/meeting/request.js +354 -42
- package/test/unit/spec/meeting/utils.js +384 -170
- package/test/unit/spec/meeting-info/index.js +181 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +383 -5
- package/test/unit/spec/meeting-info/utilv2.js +21 -0
- package/test/unit/spec/meetings/collection.js +14 -0
- package/test/unit/spec/meetings/index.js +847 -121
- package/test/unit/spec/meetings/utils.js +206 -2
- package/test/unit/spec/member/index.js +31 -0
- package/test/unit/spec/member/util.js +408 -32
- package/test/unit/spec/members/index.js +320 -1
- package/test/unit/spec/members/request.js +206 -27
- package/test/unit/spec/members/utils.js +184 -0
- package/test/unit/spec/metrics/index.js +1 -50
- package/test/unit/spec/multistream/mediaRequestManager.ts +1012 -109
- package/test/unit/spec/multistream/receiveSlot.ts +77 -18
- 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 +271 -5
- package/test/unit/spec/multistream/remoteMediaManager.ts +672 -65
- package/test/unit/spec/networkQualityMonitor/index.js +4 -4
- package/test/unit/spec/reachability/index.ts +176 -25
- package/test/unit/spec/reachability/request.js +66 -0
- package/test/unit/spec/reconnection-manager/index.js +95 -13
- package/test/unit/spec/recording-controller/index.js +307 -0
- package/test/unit/spec/recording-controller/util.js +229 -0
- package/test/unit/spec/roap/index.ts +28 -52
- package/test/unit/spec/roap/request.ts +225 -0
- package/test/unit/spec/roap/turnDiscovery.ts +73 -34
- package/test/unit/spec/stats-analyzer/index.js +94 -43
- package/test/utils/constants.js +9 -0
- package/test/utils/integrationTestUtils.js +46 -0
- package/test/utils/testUtils.js +0 -45
- package/test/utils/webex-config.js +4 -0
- package/test/utils/webex-test-users.js +7 -3
- package/tsconfig.json +6 -0
- package/dist/media/internal-media-core-wrapper.js +0 -18
- package/dist/media/internal-media-core-wrapper.js.map +0 -1
- package/dist/meeting/effectsState.js +0 -262
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/metrics/config.js +0 -299
- package/dist/metrics/config.js.map +0 -1
- package/dist/multistream/multistreamMedia.js +0 -106
- 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/metrics/config.ts +0 -495
- package/src/multistream/multistreamMedia.ts +0 -93
- package/test/unit/spec/meeting/effectsState.js +0 -281
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import sinon from 'sinon';
|
|
2
|
+
import {assert} from '@webex/test-helper-chai';
|
|
3
|
+
import MockWebex from '@webex/test-helper-mock-webex';
|
|
4
|
+
import Meetings from '@webex/plugin-meetings';
|
|
5
|
+
import RoapRequest from '@webex/plugin-meetings/src/roap/request';
|
|
6
|
+
import {REACHABILITY} from '@webex/plugin-meetings/src/constants';
|
|
7
|
+
|
|
8
|
+
describe('plugin-meetings/roap', () => {
|
|
9
|
+
let roapRequest;
|
|
10
|
+
let webex;
|
|
11
|
+
const locusUrl = 'locusUrl';
|
|
12
|
+
|
|
13
|
+
beforeEach(async () => {
|
|
14
|
+
webex = new MockWebex({
|
|
15
|
+
children: {
|
|
16
|
+
meetings: Meetings,
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
webex.meetings.clientRegion = {
|
|
21
|
+
countryCode: 'US',
|
|
22
|
+
regionCode: 'WEST-COAST',
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
webex.internal = {
|
|
26
|
+
services: {
|
|
27
|
+
get: sinon.mock().returns(locusUrl),
|
|
28
|
+
waitForCatalog: sinon.mock().returns(Promise.resolve({})),
|
|
29
|
+
},
|
|
30
|
+
device: {
|
|
31
|
+
url: 'url',
|
|
32
|
+
},
|
|
33
|
+
newMetrics: {
|
|
34
|
+
submitClientEvent: sinon.stub()
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// @ts-ignore
|
|
39
|
+
roapRequest = new RoapRequest({webex});
|
|
40
|
+
|
|
41
|
+
roapRequest.request = sinon.mock().returns(
|
|
42
|
+
Promise.resolve({
|
|
43
|
+
body: {
|
|
44
|
+
locus: {
|
|
45
|
+
roapSeq: '',
|
|
46
|
+
id: '',
|
|
47
|
+
url: 'url/path',
|
|
48
|
+
fullState: {
|
|
49
|
+
lastActive: 'lastActive',
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
})
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
await webex.boundedStorage.put(
|
|
57
|
+
REACHABILITY.namespace,
|
|
58
|
+
REACHABILITY.localStorageJoinCookie,
|
|
59
|
+
JSON.stringify({
|
|
60
|
+
anycastEntryPoint: 'aws-eu-west-1',
|
|
61
|
+
})
|
|
62
|
+
);
|
|
63
|
+
await webex.boundedStorage.put(
|
|
64
|
+
REACHABILITY.namespace,
|
|
65
|
+
REACHABILITY.localStorageResult,
|
|
66
|
+
JSON.stringify({
|
|
67
|
+
clusterId: {
|
|
68
|
+
udp: 'test',
|
|
69
|
+
},
|
|
70
|
+
})
|
|
71
|
+
);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
describe('#attachReachabilityData', () => {
|
|
75
|
+
it('returns the correct reachability data', async () => {
|
|
76
|
+
const res = await roapRequest.attachReachabilityData({});
|
|
77
|
+
|
|
78
|
+
assert.deepEqual(res.localSdp, {
|
|
79
|
+
reachability: {
|
|
80
|
+
clusterId: {
|
|
81
|
+
udp: 'test',
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
});
|
|
85
|
+
assert.deepEqual(res.joinCookie, {
|
|
86
|
+
anycastEntryPoint: 'aws-eu-west-1',
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('handles the case when reachability data does not exist', async () => {
|
|
91
|
+
await webex.boundedStorage.del(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie);
|
|
92
|
+
|
|
93
|
+
await webex.boundedStorage.del(REACHABILITY.namespace, REACHABILITY.localStorageResult);
|
|
94
|
+
const sdp = {
|
|
95
|
+
some: 'attribute',
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const result = await roapRequest.attachReachabilityData(sdp);
|
|
99
|
+
|
|
100
|
+
assert.deepEqual(result, {
|
|
101
|
+
joinCookie: undefined,
|
|
102
|
+
localSdp: {
|
|
103
|
+
some: 'attribute',
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
describe('sendRoap', () => {
|
|
110
|
+
it('includes joinCookie in the request correctly', async () => {
|
|
111
|
+
const locusMediaRequest = {send: sinon.stub().resolves({body: {locus: {}}})};
|
|
112
|
+
|
|
113
|
+
await roapRequest.sendRoap({
|
|
114
|
+
locusSelfUrl: locusUrl,
|
|
115
|
+
mediaId: 'mediaId',
|
|
116
|
+
roapMessage: {
|
|
117
|
+
seq: 'seq',
|
|
118
|
+
},
|
|
119
|
+
meetingId: 'meeting-id',
|
|
120
|
+
locusMediaRequest,
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
|
|
124
|
+
name: 'client.locus.media.request',
|
|
125
|
+
options: {
|
|
126
|
+
meetingId: 'meeting-id',
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
|
|
131
|
+
name: 'client.locus.media.response',
|
|
132
|
+
options: {
|
|
133
|
+
meetingId: 'meeting-id',
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
const requestParams = locusMediaRequest.send.getCall(0).args[0];
|
|
138
|
+
assert.deepEqual(requestParams, {
|
|
139
|
+
type: 'RoapMessage',
|
|
140
|
+
selfUrl: locusUrl,
|
|
141
|
+
joinCookie: {
|
|
142
|
+
anycastEntryPoint: 'aws-eu-west-1',
|
|
143
|
+
},
|
|
144
|
+
mediaId: 'mediaId',
|
|
145
|
+
roapMessage: {
|
|
146
|
+
seq: 'seq',
|
|
147
|
+
},
|
|
148
|
+
reachability: {clusterId: {udp: 'test'}},
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
it('sends correct client event when fails', async () => {
|
|
153
|
+
const locusMediaRequest = {send: sinon.stub().rejects({code: 300, message: 'error'})};
|
|
154
|
+
try {
|
|
155
|
+
await roapRequest.sendRoap({
|
|
156
|
+
locusSelfUrl: locusUrl,
|
|
157
|
+
mediaId: 'mediaId',
|
|
158
|
+
roapMessage: {
|
|
159
|
+
seq: 'seq',
|
|
160
|
+
},
|
|
161
|
+
meetingId: 'meeting-id',
|
|
162
|
+
locusMediaRequest,
|
|
163
|
+
});
|
|
164
|
+
} catch (err) {
|
|
165
|
+
assert.calledWith(webex.internal.newMetrics.submitClientEvent, {
|
|
166
|
+
name: 'client.locus.media.response',
|
|
167
|
+
options: {
|
|
168
|
+
meetingId: 'meeting-id',
|
|
169
|
+
rawError: {code: 300, message: 'error'},
|
|
170
|
+
},
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it('calls attachReachabilityData when sendRoap', async () => {
|
|
177
|
+
const locusMediaRequest = { send: sinon.stub().resolves({body: {locus: {}}})};
|
|
178
|
+
|
|
179
|
+
const newSdp = {
|
|
180
|
+
new: 'sdp',
|
|
181
|
+
reachability: { someResult: 'whatever' }
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
roapRequest.attachReachabilityData = sinon.stub().returns(
|
|
185
|
+
Promise.resolve({
|
|
186
|
+
localSdp: newSdp,
|
|
187
|
+
joinCookie: {
|
|
188
|
+
anycastEntryPoint: 'aws-eu-west-1',
|
|
189
|
+
},
|
|
190
|
+
})
|
|
191
|
+
);
|
|
192
|
+
|
|
193
|
+
await roapRequest.sendRoap({
|
|
194
|
+
roapMessage: {
|
|
195
|
+
seq: 1,
|
|
196
|
+
},
|
|
197
|
+
locusSelfUrl: 'locusSelfUrl',
|
|
198
|
+
mediaId: 'mediaId',
|
|
199
|
+
meetingId: 'meetingId',
|
|
200
|
+
preferTranscoding: true,
|
|
201
|
+
locusMediaRequest
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
const requestParams = locusMediaRequest.send.getCall(0).args[0];
|
|
205
|
+
|
|
206
|
+
assert.deepEqual(requestParams, {
|
|
207
|
+
type: 'RoapMessage',
|
|
208
|
+
selfUrl: 'locusSelfUrl',
|
|
209
|
+
joinCookie: {
|
|
210
|
+
anycastEntryPoint: 'aws-eu-west-1',
|
|
211
|
+
},
|
|
212
|
+
mediaId: 'mediaId',
|
|
213
|
+
roapMessage: {
|
|
214
|
+
seq: 1,
|
|
215
|
+
},
|
|
216
|
+
reachability: { someResult: 'whatever' },
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
assert.calledOnceWithExactly(roapRequest.attachReachabilityData, {
|
|
220
|
+
roapMessage: {
|
|
221
|
+
seq: 1,
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
});
|
|
225
|
+
});
|
|
@@ -40,13 +40,19 @@ describe('TurnDiscovery', () => {
|
|
|
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
|
|
|
@@ -69,12 +75,10 @@ describe('TurnDiscovery', () => {
|
|
|
69
75
|
version: '2',
|
|
70
76
|
seq: expectedSeq,
|
|
71
77
|
},
|
|
72
|
-
correlationId: testMeeting.correlationId,
|
|
73
78
|
locusSelfUrl: testMeeting.selfUrl,
|
|
74
79
|
mediaId: expectedMediaId,
|
|
75
|
-
audioMuted: testMeeting.isAudioMuted(),
|
|
76
|
-
videoMuted: testMeeting.isVideoMuted(),
|
|
77
80
|
meetingId: testMeeting.id,
|
|
81
|
+
locusMediaRequest: testMeeting.locusMediaRequest
|
|
78
82
|
});
|
|
79
83
|
|
|
80
84
|
if (messageType === 'TURN_DISCOVERY_REQUEST') {
|
|
@@ -97,39 +101,44 @@ describe('TurnDiscovery', () => {
|
|
|
97
101
|
};
|
|
98
102
|
|
|
99
103
|
describe('doTurnDiscovery', () => {
|
|
100
|
-
|
|
101
|
-
|
|
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;
|
|
102
107
|
|
|
103
|
-
|
|
108
|
+
const td = new TurnDiscovery(mockRoapRequest);
|
|
104
109
|
|
|
105
|
-
|
|
106
|
-
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
|
110
|
+
const result = td.doTurnDiscovery(testMeeting, false);
|
|
107
111
|
|
|
108
|
-
|
|
112
|
+
// check that TURN_DISCOVERY_REQUEST was sent
|
|
113
|
+
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
|
109
114
|
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
headers: [
|
|
113
|
-
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
114
|
-
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
115
|
-
`x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
|
|
116
|
-
],
|
|
117
|
-
});
|
|
115
|
+
// @ts-ignore
|
|
116
|
+
mockRoapRequest.sendRoap.resetHistory();
|
|
118
117
|
|
|
119
|
-
|
|
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
|
+
});
|
|
120
126
|
|
|
121
|
-
|
|
122
|
-
await checkRoapMessageSent('OK', 0);
|
|
127
|
+
await testUtils.flushPromises();
|
|
123
128
|
|
|
124
|
-
|
|
129
|
+
// check that we've sent OK
|
|
130
|
+
await checkRoapMessageSent('OK', 0);
|
|
125
131
|
|
|
126
|
-
|
|
127
|
-
url: FAKE_TURN_URL,
|
|
128
|
-
username: FAKE_TURN_USERNAME,
|
|
129
|
-
password: FAKE_TURN_PASSWORD,
|
|
130
|
-
});
|
|
132
|
+
const {turnServerInfo, turnDiscoverySkippedReason} = await result;
|
|
131
133
|
|
|
132
|
-
|
|
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
|
+
});
|
|
133
142
|
});
|
|
134
143
|
|
|
135
144
|
it('sends TURN_DISCOVERY_REQUEST with empty mediaId when isReconnecting is true', async () => {
|
|
@@ -141,6 +150,7 @@ describe('TurnDiscovery', () => {
|
|
|
141
150
|
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0, '');
|
|
142
151
|
|
|
143
152
|
// the main part of the test is complete now, checking the remaining part of the flow just for completeness
|
|
153
|
+
// @ts-ignore
|
|
144
154
|
mockRoapRequest.sendRoap.resetHistory();
|
|
145
155
|
|
|
146
156
|
// simulate the response
|
|
@@ -173,7 +183,7 @@ describe('TurnDiscovery', () => {
|
|
|
173
183
|
|
|
174
184
|
// check that TURN_DISCOVERY_REQUEST was sent
|
|
175
185
|
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
|
176
|
-
|
|
186
|
+
// @ts-ignore
|
|
177
187
|
mockRoapRequest.sendRoap.resetHistory();
|
|
178
188
|
|
|
179
189
|
// simulate the response with some extra headers
|
|
@@ -206,7 +216,7 @@ describe('TurnDiscovery', () => {
|
|
|
206
216
|
const prevConfigValue = testMeeting.config.experimental.enableTurnDiscovery;
|
|
207
217
|
|
|
208
218
|
testMeeting.config.experimental.enableTurnDiscovery = false;
|
|
209
|
-
|
|
219
|
+
// @ts-ignore
|
|
210
220
|
const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
|
|
211
221
|
|
|
212
222
|
const {turnServerInfo, turnDiscoverySkippedReason} = result;
|
|
@@ -236,7 +246,7 @@ describe('TurnDiscovery', () => {
|
|
|
236
246
|
|
|
237
247
|
it('resolves with undefined when cluster is reachable', async () => {
|
|
238
248
|
const prev = testMeeting.webex.meetings.reachability.isAnyClusterReachable;
|
|
239
|
-
testMeeting.webex.meetings.reachability.isAnyClusterReachable = () => true;
|
|
249
|
+
testMeeting.webex.meetings.reachability.isAnyClusterReachable = () => Promise.resolve(true);
|
|
240
250
|
const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
|
|
241
251
|
|
|
242
252
|
const {turnServerInfo, turnDiscoverySkippedReason} = result;
|
|
@@ -267,6 +277,8 @@ describe('TurnDiscovery', () => {
|
|
|
267
277
|
const td = new TurnDiscovery(mockRoapRequest);
|
|
268
278
|
const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
|
|
269
279
|
|
|
280
|
+
await testUtils.flushPromises();
|
|
281
|
+
|
|
270
282
|
// simulate the response without the password
|
|
271
283
|
td.handleTurnDiscoveryResponse({
|
|
272
284
|
headers: [
|
|
@@ -286,6 +298,8 @@ describe('TurnDiscovery', () => {
|
|
|
286
298
|
const td = new TurnDiscovery(mockRoapRequest);
|
|
287
299
|
const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
|
|
288
300
|
|
|
301
|
+
await testUtils.flushPromises();
|
|
302
|
+
|
|
289
303
|
// simulate the response without the headers
|
|
290
304
|
td.handleTurnDiscoveryResponse({});
|
|
291
305
|
|
|
@@ -301,6 +315,8 @@ describe('TurnDiscovery', () => {
|
|
|
301
315
|
const td = new TurnDiscovery(mockRoapRequest);
|
|
302
316
|
const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
|
|
303
317
|
|
|
318
|
+
await testUtils.flushPromises();
|
|
319
|
+
|
|
304
320
|
// simulate the response without the headers
|
|
305
321
|
td.handleTurnDiscoveryResponse({headers: []});
|
|
306
322
|
|
|
@@ -317,9 +333,11 @@ describe('TurnDiscovery', () => {
|
|
|
317
333
|
|
|
318
334
|
const turnDiscoveryPromise = td.doTurnDiscovery(testMeeting, false);
|
|
319
335
|
|
|
336
|
+
await testUtils.flushPromises();
|
|
337
|
+
|
|
320
338
|
// check that TURN_DISCOVERY_REQUEST was sent
|
|
321
339
|
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
|
322
|
-
|
|
340
|
+
// @ts-ignore
|
|
323
341
|
mockRoapRequest.sendRoap.resetHistory();
|
|
324
342
|
|
|
325
343
|
// setup the mock so that sending of OK fails
|
|
@@ -347,6 +365,27 @@ describe('TurnDiscovery', () => {
|
|
|
347
365
|
});
|
|
348
366
|
});
|
|
349
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
|
+
|
|
350
389
|
describe('handleTurnDiscoveryResponse', () => {
|
|
351
390
|
it("doesn't do anything if turn discovery was not started", () => {
|
|
352
391
|
const td = new TurnDiscovery(mockRoapRequest);
|
|
@@ -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';
|
|
@@ -24,14 +24,15 @@ describe('plugin-meetings', () => {
|
|
|
24
24
|
};
|
|
25
25
|
|
|
26
26
|
const defaultStats = {
|
|
27
|
+
resolutions: {},
|
|
27
28
|
internal: {
|
|
28
|
-
video: {
|
|
29
|
+
'video-send-1': {
|
|
29
30
|
send: {
|
|
30
31
|
totalPacketsLostOnReceiver: 10,
|
|
31
32
|
},
|
|
32
33
|
},
|
|
33
34
|
},
|
|
34
|
-
video: {
|
|
35
|
+
'video-send-1': {
|
|
35
36
|
send: {
|
|
36
37
|
packetsSent: 2,
|
|
37
38
|
meanRemoteJitter: [],
|
|
@@ -52,7 +53,12 @@ describe('plugin-meetings', () => {
|
|
|
52
53
|
beforeEach(() => {
|
|
53
54
|
const networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
|
|
54
55
|
|
|
55
|
-
statsAnalyzer = new StatsAnalyzer(
|
|
56
|
+
statsAnalyzer = new StatsAnalyzer(
|
|
57
|
+
initialConfig,
|
|
58
|
+
() => ({}),
|
|
59
|
+
networkQualityMonitor,
|
|
60
|
+
defaultStats
|
|
61
|
+
);
|
|
56
62
|
|
|
57
63
|
sandBoxSpy = sandbox.spy(
|
|
58
64
|
statsAnalyzer.networkQualityMonitor,
|
|
@@ -65,12 +71,12 @@ describe('plugin-meetings', () => {
|
|
|
65
71
|
});
|
|
66
72
|
|
|
67
73
|
it('should trigger determineUplinkNetworkQuality with specific arguments', async () => {
|
|
68
|
-
await statsAnalyzer.parseGetStatsResult(statusResult, 'video');
|
|
74
|
+
await statsAnalyzer.parseGetStatsResult(statusResult, 'video-send-1', true);
|
|
69
75
|
|
|
70
76
|
assert.calledOnce(statsAnalyzer.networkQualityMonitor.determineUplinkNetworkQuality);
|
|
71
77
|
assert(
|
|
72
78
|
sandBoxSpy.calledWith({
|
|
73
|
-
mediaType: 'video',
|
|
79
|
+
mediaType: 'video-send-1',
|
|
74
80
|
remoteRtpResults: statusResult,
|
|
75
81
|
statsAnalyzerCurrentStats: statsAnalyzer.statsResults,
|
|
76
82
|
})
|
|
@@ -83,6 +89,7 @@ describe('plugin-meetings', () => {
|
|
|
83
89
|
let pc;
|
|
84
90
|
let networkQualityMonitor;
|
|
85
91
|
let statsAnalyzer;
|
|
92
|
+
let mqeData;
|
|
86
93
|
|
|
87
94
|
let receivedEventsData = {
|
|
88
95
|
local: {},
|
|
@@ -110,57 +117,83 @@ describe('plugin-meetings', () => {
|
|
|
110
117
|
// bytesReceived and bytesSent need to be non-zero in order for StatsAnalyzer to parse any other values
|
|
111
118
|
fakeStats = {
|
|
112
119
|
audio: {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
+
],
|
|
123
142
|
},
|
|
124
143
|
video: {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
+
],
|
|
135
169
|
},
|
|
136
170
|
};
|
|
137
171
|
|
|
138
172
|
pc = {
|
|
139
|
-
getConnectionState: sinon.stub().returns(
|
|
173
|
+
getConnectionState: sinon.stub().returns(ConnectionState.Connected),
|
|
140
174
|
getTransceiverStats: sinon.stub().resolves({
|
|
141
175
|
audio: {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
currentDirection: 'sendrecv',
|
|
145
|
-
localTrackLabel: 'fake mic',
|
|
176
|
+
senders: [fakeStats.audio.senders[0]],
|
|
177
|
+
receivers: [fakeStats.audio.receivers[0]],
|
|
146
178
|
},
|
|
147
179
|
video: {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
180
|
+
senders: [fakeStats.video.senders[0]],
|
|
181
|
+
receivers: [fakeStats.video.receivers[0]],
|
|
182
|
+
},
|
|
183
|
+
screenShareAudio: {
|
|
184
|
+
senders: [],
|
|
185
|
+
receivers: [],
|
|
152
186
|
},
|
|
153
187
|
screenShareVideo: {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
currentDirection: 'sendrecv',
|
|
188
|
+
senders: [],
|
|
189
|
+
receivers: [],
|
|
157
190
|
},
|
|
158
191
|
}),
|
|
159
192
|
};
|
|
160
193
|
|
|
161
194
|
networkQualityMonitor = new NetworkQualityMonitor(initialConfig);
|
|
162
195
|
|
|
163
|
-
statsAnalyzer = new StatsAnalyzer(initialConfig, networkQualityMonitor);
|
|
196
|
+
statsAnalyzer = new StatsAnalyzer(initialConfig, () => ({}), networkQualityMonitor);
|
|
164
197
|
|
|
165
198
|
statsAnalyzer.on(EVENTS.LOCAL_MEDIA_STARTED, (data) => {
|
|
166
199
|
receivedEventsData.local.started = data;
|
|
@@ -174,6 +207,9 @@ describe('plugin-meetings', () => {
|
|
|
174
207
|
statsAnalyzer.on(EVENTS.REMOTE_MEDIA_STOPPED, (data) => {
|
|
175
208
|
receivedEventsData.remote.stopped = data;
|
|
176
209
|
});
|
|
210
|
+
statsAnalyzer.on(EVENTS.MEDIA_QUALITY, ({data}) => {
|
|
211
|
+
mqeData = data;
|
|
212
|
+
});
|
|
177
213
|
});
|
|
178
214
|
|
|
179
215
|
afterEach(() => {
|
|
@@ -200,6 +236,12 @@ describe('plugin-meetings', () => {
|
|
|
200
236
|
assert.deepEqual(receivedEventsData.remote.stopped, expected.remote?.stopped);
|
|
201
237
|
};
|
|
202
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
|
+
|
|
203
245
|
it('emits LOCAL_MEDIA_STARTED and LOCAL_MEDIA_STOPPED events for audio', async () => {
|
|
204
246
|
await startStatsAnalyzer({expected: {sendAudio: true}});
|
|
205
247
|
|
|
@@ -207,7 +249,7 @@ describe('plugin-meetings', () => {
|
|
|
207
249
|
checkReceivedEvent({expected: {}});
|
|
208
250
|
|
|
209
251
|
// setup a mock to return some values higher the previous ones
|
|
210
|
-
fakeStats.audio.
|
|
252
|
+
fakeStats.audio.senders[0].report[0].packetsSent += 10;
|
|
211
253
|
|
|
212
254
|
await progressTime();
|
|
213
255
|
|
|
@@ -227,7 +269,7 @@ describe('plugin-meetings', () => {
|
|
|
227
269
|
checkReceivedEvent({expected: {}});
|
|
228
270
|
|
|
229
271
|
// setup a mock to return some values higher the previous ones
|
|
230
|
-
fakeStats.video.
|
|
272
|
+
fakeStats.video.senders[0].report[0].framesSent += 1;
|
|
231
273
|
|
|
232
274
|
await progressTime();
|
|
233
275
|
|
|
@@ -247,7 +289,7 @@ describe('plugin-meetings', () => {
|
|
|
247
289
|
checkReceivedEvent({expected: {}});
|
|
248
290
|
|
|
249
291
|
// setup a mock to return some values higher the previous ones
|
|
250
|
-
fakeStats.audio.
|
|
292
|
+
fakeStats.audio.receivers[0].report[0].packetsReceived += 5;
|
|
251
293
|
|
|
252
294
|
await progressTime();
|
|
253
295
|
// check that we got the REMOTE_MEDIA_STARTED event for audio
|
|
@@ -267,7 +309,7 @@ describe('plugin-meetings', () => {
|
|
|
267
309
|
checkReceivedEvent({expected: {}});
|
|
268
310
|
|
|
269
311
|
// setup a mock to return some values higher the previous ones
|
|
270
|
-
fakeStats.video.
|
|
312
|
+
fakeStats.video.receivers[0].report[0].framesDecoded += 1;
|
|
271
313
|
|
|
272
314
|
await progressTime();
|
|
273
315
|
// check that we got the REMOTE_MEDIA_STARTED event for video
|
|
@@ -279,6 +321,15 @@ describe('plugin-meetings', () => {
|
|
|
279
321
|
|
|
280
322
|
checkReceivedEvent({expected: {remote: {stopped: {type: 'video'}}}});
|
|
281
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
|
+
});
|
|
282
333
|
});
|
|
283
334
|
});
|
|
284
335
|
});
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// MOVE TO TEST CONSTANTS
|
|
2
|
+
export const MEDIA_SERVERS = {
|
|
3
|
+
// The homer media server for converged multistream meetings.
|
|
4
|
+
HOMER: 'homer',
|
|
5
|
+
// The linus media server
|
|
6
|
+
LINUS: 'linus',
|
|
7
|
+
// The calliope media server for transcoded meetings
|
|
8
|
+
CALLIOPE: 'calliope',
|
|
9
|
+
};
|