@webex/plugin-meetings 3.0.0-stream-classes.5 → 3.0.0
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/.eslintrc.js +6 -0
- package/README.md +12 -0
- package/babel.config.js +3 -0
- package/dist/annotation/constants.js +12 -20
- package/dist/annotation/constants.js.map +1 -1
- package/dist/annotation/index.js +25 -10
- package/dist/annotation/index.js.map +1 -1
- package/dist/breakouts/breakout.js +2 -3
- package/dist/breakouts/breakout.js.map +1 -1
- package/dist/breakouts/collection.js +1 -2
- package/dist/breakouts/collection.js.map +1 -1
- package/dist/breakouts/edit-lock-error.js +1 -2
- package/dist/breakouts/edit-lock-error.js.map +1 -1
- package/dist/breakouts/events.js +1 -2
- package/dist/breakouts/events.js.map +1 -1
- package/dist/breakouts/index.js +13 -14
- package/dist/breakouts/index.js.map +1 -1
- package/dist/breakouts/request.js +1 -2
- package/dist/breakouts/request.js.map +1 -1
- package/dist/breakouts/utils.js +3 -6
- package/dist/breakouts/utils.js.map +1 -1
- package/dist/common/browser-detection.js +2 -3
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +3 -4
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.js +1 -2
- package/dist/common/config.js.map +1 -1
- package/dist/common/errors/captcha-error.js +1 -2
- package/dist/common/errors/captcha-error.js.map +1 -1
- package/dist/common/errors/intent-to-join.js +1 -2
- package/dist/common/errors/intent-to-join.js.map +1 -1
- package/dist/common/errors/join-meeting.js +1 -2
- package/dist/common/errors/join-meeting.js.map +1 -1
- package/dist/common/errors/media.js +1 -2
- package/dist/common/errors/media.js.map +1 -1
- package/dist/common/errors/no-meeting-info.d.ts +14 -0
- package/dist/common/errors/no-meeting-info.js +50 -0
- package/dist/common/errors/no-meeting-info.js.map +1 -0
- package/dist/common/errors/parameter.js +3 -4
- package/dist/common/errors/parameter.js.map +1 -1
- package/dist/common/errors/password-error.js +1 -2
- package/dist/common/errors/password-error.js.map +1 -1
- package/dist/common/errors/permission.js +1 -2
- package/dist/common/errors/permission.js.map +1 -1
- package/dist/common/errors/reclaim-host-role-errors.d.ts +60 -0
- package/dist/common/errors/reclaim-host-role-errors.js +154 -0
- package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
- package/dist/common/errors/reconnection-in-progress.js +1 -2
- package/dist/common/errors/reconnection-in-progress.js.map +1 -1
- package/dist/common/errors/reconnection.js +1 -2
- package/dist/common/errors/reconnection.js.map +1 -1
- package/dist/common/errors/stats.js +1 -2
- package/dist/common/errors/stats.js.map +1 -1
- package/dist/{types/common → common}/errors/webex-errors.d.ts +13 -1
- package/dist/common/errors/webex-errors.js +35 -16
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/common/errors/webex-meetings-error.js +1 -2
- package/dist/common/errors/webex-meetings-error.js.map +1 -1
- package/dist/common/events/events-scope.js +1 -2
- package/dist/common/events/events-scope.js.map +1 -1
- package/dist/common/events/events.js +1 -2
- package/dist/common/events/events.js.map +1 -1
- package/dist/common/events/trigger-proxy.js +1 -2
- package/dist/common/events/trigger-proxy.js.map +1 -1
- package/dist/common/events/util.js +1 -2
- package/dist/common/events/util.js.map +1 -1
- package/dist/common/logs/logger-config.js +1 -2
- package/dist/common/logs/logger-config.js.map +1 -1
- package/dist/common/logs/logger-proxy.js +1 -2
- package/dist/common/logs/logger-proxy.js.map +1 -1
- package/dist/{types/common → common}/logs/request.d.ts +3 -1
- package/dist/common/logs/request.js +8 -5
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +2 -4
- package/dist/common/queue.js.map +1 -1
- package/dist/{types/config.d.ts → config.d.ts} +1 -1
- package/dist/config.js +3 -3
- package/dist/config.js.map +1 -1
- package/dist/{types/constants.d.ts → constants.d.ts} +71 -15
- package/dist/constants.js +252 -371
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.js +3 -6
- package/dist/controls-options-manager/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.js +7 -10
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.js +27 -32
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/util.js +1 -2
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/index.js +8 -5
- package/dist/index.js.map +1 -1
- package/dist/interceptors/index.d.ts +2 -0
- package/dist/interceptors/index.js +15 -0
- package/dist/interceptors/index.js.map +1 -0
- package/dist/interceptors/locusRetry.d.ts +27 -0
- package/dist/interceptors/locusRetry.js +94 -0
- package/dist/interceptors/locusRetry.js.map +1 -0
- package/dist/interpretation/collection.js +1 -2
- package/dist/interpretation/collection.js.map +1 -1
- package/dist/interpretation/index.js +2 -3
- package/dist/interpretation/index.js.map +1 -1
- package/dist/interpretation/siLanguage.js +2 -3
- package/dist/interpretation/siLanguage.js.map +1 -1
- package/dist/locus-info/controlsUtils.js +12 -13
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.js +3 -4
- package/dist/locus-info/embeddedAppsUtils.js.map +1 -1
- package/dist/locus-info/fullState.js +1 -2
- package/dist/locus-info/fullState.js.map +1 -1
- package/dist/locus-info/hostUtils.js +1 -2
- package/dist/locus-info/hostUtils.js.map +1 -1
- package/dist/{types/locus-info → locus-info}/index.d.ts +1 -1
- package/dist/locus-info/index.js +38 -37
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +3 -4
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +16 -3
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/{types/locus-info → locus-info}/parser.d.ts +3 -2
- package/dist/locus-info/parser.js +43 -31
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +7 -6
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +15 -10
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +16 -7
- package/dist/media/properties.js.map +1 -1
- package/dist/media/util.js +1 -2
- package/dist/media/util.js.map +1 -1
- package/dist/mediaQualityMetrics/config.d.ts +241 -0
- package/dist/mediaQualityMetrics/config.js +135 -339
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/{types/meeting → meeting}/in-meeting-actions.d.ts +4 -0
- package/dist/meeting/in-meeting-actions.js +18 -2
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/{types/meeting → meeting}/index.d.ts +318 -45
- package/dist/meeting/index.js +2620 -1405
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +4 -5
- package/dist/meeting/locusMediaRequest.js.map +1 -1
- package/dist/meeting/muteState.js +2 -4
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/{types/meeting → meeting}/request.d.ts +2 -0
- package/dist/meeting/request.js +46 -31
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/state.js +1 -2
- package/dist/meeting/state.js.map +1 -1
- package/dist/{types/meeting → meeting}/util.d.ts +17 -0
- package/dist/meeting/util.js +83 -10
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting/voicea-meeting.d.ts +16 -0
- package/dist/meeting/voicea-meeting.js +169 -0
- package/dist/meeting/voicea-meeting.js.map +1 -0
- package/dist/meeting-info/collection.js +3 -4
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/{types/meeting-info → meeting-info}/index.d.ts +7 -0
- package/dist/meeting-info/index.js +53 -27
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/{types/meeting-info → meeting-info}/meeting-info-v2.d.ts +1 -0
- package/dist/meeting-info/meeting-info-v2.js +52 -33
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/request.js +1 -2
- package/dist/meeting-info/request.js.map +1 -1
- package/dist/meeting-info/util.js +8 -8
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +12 -9
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/{types/meetings → meetings}/collection.d.ts +9 -0
- package/dist/meetings/collection.js +21 -5
- package/dist/meetings/collection.js.map +1 -1
- package/dist/{types/meetings → meetings}/index.d.ts +45 -16
- package/dist/meetings/index.js +166 -74
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +2 -3
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +3 -10
- package/dist/meetings/util.js.map +1 -1
- package/dist/{types/member → member}/index.d.ts +1 -0
- package/dist/member/index.js +10 -3
- package/dist/member/index.js.map +1 -1
- package/dist/member/member.types.d.ts +11 -0
- package/dist/member/member.types.js +17 -0
- package/dist/member/member.types.js.map +1 -0
- package/dist/member/types.js +6 -8
- package/dist/member/types.js.map +1 -1
- package/dist/member/util.js +12 -2
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js +1 -2
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +25 -8
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +2 -3
- package/dist/members/request.js.map +1 -1
- package/dist/{types/members → members}/types.d.ts +1 -0
- package/dist/members/types.js +3 -4
- package/dist/members/types.js.map +1 -1
- package/dist/{types/members → members}/util.d.ts +6 -1
- package/dist/members/util.js +18 -8
- package/dist/members/util.js.map +1 -1
- package/dist/{types/metrics → metrics}/constants.d.ts +12 -0
- package/dist/metrics/constants.js +14 -3
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +3 -2
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +9 -11
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +3 -5
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +7 -9
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +3 -5
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +7 -6
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +28 -27
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/multistream/sendSlotManager.js +9 -6
- package/dist/multistream/sendSlotManager.js.map +1 -1
- package/dist/networkQualityMonitor/index.js +1 -2
- package/dist/networkQualityMonitor/index.js.map +1 -1
- package/dist/personal-meeting-room/index.js +2 -3
- package/dist/personal-meeting-room/index.js.map +1 -1
- package/dist/personal-meeting-room/request.js +2 -3
- package/dist/personal-meeting-room/request.js.map +1 -1
- package/dist/personal-meeting-room/util.js +1 -2
- package/dist/personal-meeting-room/util.js.map +1 -1
- package/dist/reachability/clusterReachability.d.ts +109 -0
- package/dist/reachability/clusterReachability.js +357 -0
- package/dist/reachability/clusterReachability.js.map +1 -0
- package/dist/reachability/index.d.ts +105 -0
- package/dist/reachability/index.js +279 -436
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +14 -11
- package/dist/reachability/request.js.map +1 -1
- package/dist/reachability/util.d.ts +8 -0
- package/dist/reachability/util.js +29 -0
- package/dist/reachability/util.js.map +1 -0
- package/dist/reactions/constants.js +1 -2
- package/dist/reactions/constants.js.map +1 -1
- package/dist/reactions/reactions.js +2 -4
- package/dist/reactions/reactions.js.map +1 -1
- package/dist/reactions/reactions.type.js +6 -8
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/{types/reconnection-manager → reconnection-manager}/index.d.ts +10 -0
- package/dist/reconnection-manager/index.js +129 -106
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/enums.js +4 -5
- package/dist/recording-controller/enums.js.map +1 -1
- package/dist/recording-controller/index.js +43 -51
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.js +1 -2
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/{types/roap → roap}/index.d.ts +2 -1
- package/dist/roap/index.js +59 -28
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +14 -22
- package/dist/roap/request.js.map +1 -1
- package/dist/{types/roap → roap}/turnDiscovery.d.ts +21 -4
- package/dist/roap/turnDiscovery.js +182 -89
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/rtcMetrics/constants.js +1 -2
- package/dist/rtcMetrics/constants.js.map +1 -1
- package/dist/{types/rtcMetrics → rtcMetrics}/index.d.ts +15 -1
- package/dist/rtcMetrics/index.js +72 -12
- package/dist/rtcMetrics/index.js.map +1 -1
- package/dist/statsAnalyzer/global.js +1 -2
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/{types/statsAnalyzer → statsAnalyzer}/index.d.ts +28 -11
- package/dist/statsAnalyzer/index.js +371 -318
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.d.ts +48 -0
- package/dist/statsAnalyzer/mqaUtil.js +295 -162
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.js +1 -2
- package/dist/transcription/index.js.map +1 -1
- package/dist/webinar/collection.d.ts +16 -0
- package/dist/webinar/collection.js +43 -0
- package/dist/webinar/collection.js.map +1 -0
- package/dist/webinar/index.d.ts +5 -0
- package/dist/webinar/index.js +68 -0
- package/dist/webinar/index.js.map +1 -0
- package/jest.config.js +3 -0
- package/package.json +44 -24
- package/process +1 -0
- package/src/common/errors/no-meeting-info.ts +24 -0
- package/src/common/errors/reclaim-host-role-errors.ts +134 -0
- package/src/common/errors/webex-errors.ts +19 -2
- package/src/common/logs/request.ts +5 -1
- package/src/config.ts +3 -5
- package/src/constants.ts +77 -8
- package/src/index.ts +4 -0
- package/src/interceptors/index.ts +3 -0
- package/src/interceptors/locusRetry.ts +67 -0
- package/src/locus-info/index.ts +19 -14
- package/src/locus-info/mediaSharesUtils.ts +16 -0
- package/src/locus-info/parser.ts +40 -21
- package/src/media/index.ts +8 -6
- package/src/media/properties.ts +17 -2
- package/src/mediaQualityMetrics/config.ts +103 -238
- package/src/meeting/in-meeting-actions.ts +8 -0
- package/src/meeting/index.ts +1664 -642
- package/src/meeting/request.ts +18 -0
- package/src/meeting/util.ts +102 -1
- package/src/meeting/voicea-meeting.ts +122 -0
- package/src/meeting-info/index.ts +47 -20
- package/src/meeting-info/meeting-info-v2.ts +32 -16
- package/src/meeting-info/util.ts +12 -9
- package/src/meeting-info/utilv2.ts +25 -15
- package/src/meetings/collection.ts +13 -0
- package/src/meetings/index.ts +112 -31
- package/src/meetings/util.ts +2 -8
- package/src/member/index.ts +9 -1
- package/src/member/member.types.ts +13 -0
- package/src/member/util.ts +14 -0
- package/src/members/index.ts +29 -2
- package/src/members/types.ts +1 -0
- package/src/members/util.ts +15 -1
- package/src/metrics/constants.ts +12 -0
- package/src/reachability/clusterReachability.ts +320 -0
- package/src/reachability/index.ts +221 -382
- package/src/reachability/request.ts +1 -1
- package/src/reachability/util.ts +24 -0
- package/src/reconnection-manager/index.ts +87 -83
- package/src/roap/index.ts +60 -24
- package/src/roap/request.ts +4 -17
- package/src/roap/turnDiscovery.ts +112 -39
- package/src/rtcMetrics/index.ts +71 -5
- package/src/statsAnalyzer/index.ts +430 -427
- package/src/statsAnalyzer/mqaUtil.ts +317 -168
- package/src/webinar/collection.ts +31 -0
- package/src/webinar/index.ts +62 -0
- package/test/integration/spec/journey.js +12 -12
- package/test/integration/spec/space-meeting.js +1 -1
- package/test/unit/spec/breakouts/breakout.ts +2 -1
- package/test/unit/spec/breakouts/index.ts +7 -4
- package/test/unit/spec/interceptors/locusRetry.ts +131 -0
- package/test/unit/spec/locus-info/index.js +88 -12
- package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +10 -0
- package/test/unit/spec/locus-info/parser.js +54 -13
- package/test/unit/spec/locus-info/selfUtils.js +1 -1
- package/test/unit/spec/media/index.ts +25 -4
- package/test/unit/spec/media/properties.ts +2 -2
- package/test/unit/spec/meeting/in-meeting-actions.ts +4 -0
- package/test/unit/spec/meeting/index.js +4388 -1382
- package/test/unit/spec/meeting/request.js +63 -12
- package/test/unit/spec/meeting/utils.js +145 -10
- package/test/unit/spec/meeting/voicea-meeting.ts +266 -0
- package/test/unit/spec/meeting-info/index.js +180 -61
- package/test/unit/spec/meeting-info/meetinginfov2.js +216 -68
- package/test/unit/spec/meetings/collection.js +12 -0
- package/test/unit/spec/meetings/index.js +674 -193
- package/test/unit/spec/meetings/utils.js +35 -12
- package/test/unit/spec/member/index.js +8 -7
- package/test/unit/spec/member/util.js +32 -0
- package/test/unit/spec/members/index.js +130 -17
- package/test/unit/spec/members/utils.js +26 -0
- package/test/unit/spec/metrics/index.js +1 -2
- package/test/unit/spec/multistream/mediaRequestManager.ts +1 -0
- package/test/unit/spec/reachability/clusterReachability.ts +279 -0
- package/test/unit/spec/reachability/index.ts +505 -135
- package/test/unit/spec/reachability/util.ts +40 -0
- package/test/unit/spec/reconnection-manager/index.js +74 -17
- package/test/unit/spec/recording-controller/index.js +0 -1
- package/test/unit/spec/roap/index.ts +181 -61
- package/test/unit/spec/roap/request.ts +27 -3
- package/test/unit/spec/roap/turnDiscovery.ts +363 -102
- package/test/unit/spec/rtcMetrics/index.ts +57 -3
- package/test/unit/spec/stats-analyzer/index.js +1225 -12
- package/test/unit/spec/webinar/collection.ts +13 -0
- package/test/unit/spec/webinar/index.ts +60 -0
- package/test/utils/webex-test-users.js +12 -4
- package/dist/types/mediaQualityMetrics/config.d.ts +0 -365
- package/dist/types/reachability/index.d.ts +0 -152
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +0 -24
- /package/dist/{types/annotation → annotation}/annotation.types.d.ts +0 -0
- /package/dist/{types/annotation → annotation}/constants.d.ts +0 -0
- /package/dist/{types/annotation → annotation}/index.d.ts +0 -0
- /package/dist/{types/breakouts → breakouts}/breakout.d.ts +0 -0
- /package/dist/{types/breakouts → breakouts}/collection.d.ts +0 -0
- /package/dist/{types/breakouts → breakouts}/edit-lock-error.d.ts +0 -0
- /package/dist/{types/breakouts → breakouts}/events.d.ts +0 -0
- /package/dist/{types/breakouts → breakouts}/index.d.ts +0 -0
- /package/dist/{types/breakouts → breakouts}/request.d.ts +0 -0
- /package/dist/{types/breakouts → breakouts}/utils.d.ts +0 -0
- /package/dist/{types/common → common}/browser-detection.d.ts +0 -0
- /package/dist/{types/common → common}/collection.d.ts +0 -0
- /package/dist/{types/common → common}/config.d.ts +0 -0
- /package/dist/{types/common → common}/errors/captcha-error.d.ts +0 -0
- /package/dist/{types/common → common}/errors/intent-to-join.d.ts +0 -0
- /package/dist/{types/common → common}/errors/join-meeting.d.ts +0 -0
- /package/dist/{types/common → common}/errors/media.d.ts +0 -0
- /package/dist/{types/common → common}/errors/parameter.d.ts +0 -0
- /package/dist/{types/common → common}/errors/password-error.d.ts +0 -0
- /package/dist/{types/common → common}/errors/permission.d.ts +0 -0
- /package/dist/{types/common → common}/errors/reconnection-in-progress.d.ts +0 -0
- /package/dist/{types/common → common}/errors/reconnection.d.ts +0 -0
- /package/dist/{types/common → common}/errors/stats.d.ts +0 -0
- /package/dist/{types/common → common}/errors/webex-meetings-error.d.ts +0 -0
- /package/dist/{types/common → common}/events/events-scope.d.ts +0 -0
- /package/dist/{types/common → common}/events/events.d.ts +0 -0
- /package/dist/{types/common → common}/events/trigger-proxy.d.ts +0 -0
- /package/dist/{types/common → common}/events/util.d.ts +0 -0
- /package/dist/{types/common → common}/logs/logger-config.d.ts +0 -0
- /package/dist/{types/common → common}/logs/logger-proxy.d.ts +0 -0
- /package/dist/{types/common → common}/queue.d.ts +0 -0
- /package/dist/{types/controls-options-manager → controls-options-manager}/constants.d.ts +0 -0
- /package/dist/{types/controls-options-manager → controls-options-manager}/enums.d.ts +0 -0
- /package/dist/{types/controls-options-manager → controls-options-manager}/index.d.ts +0 -0
- /package/dist/{types/controls-options-manager → controls-options-manager}/types.d.ts +0 -0
- /package/dist/{types/controls-options-manager → controls-options-manager}/util.d.ts +0 -0
- /package/dist/{types/index.d.ts → index.d.ts} +0 -0
- /package/dist/{types/interpretation → interpretation}/collection.d.ts +0 -0
- /package/dist/{types/interpretation → interpretation}/index.d.ts +0 -0
- /package/dist/{types/interpretation → interpretation}/siLanguage.d.ts +0 -0
- /package/dist/{types/locus-info → locus-info}/controlsUtils.d.ts +0 -0
- /package/dist/{types/locus-info → locus-info}/embeddedAppsUtils.d.ts +0 -0
- /package/dist/{types/locus-info → locus-info}/fullState.d.ts +0 -0
- /package/dist/{types/locus-info → locus-info}/hostUtils.d.ts +0 -0
- /package/dist/{types/locus-info → locus-info}/infoUtils.d.ts +0 -0
- /package/dist/{types/locus-info → locus-info}/mediaSharesUtils.d.ts +0 -0
- /package/dist/{types/locus-info → locus-info}/selfUtils.d.ts +0 -0
- /package/dist/{types/media → media}/index.d.ts +0 -0
- /package/dist/{types/media → media}/properties.d.ts +0 -0
- /package/dist/{types/media → media}/util.d.ts +0 -0
- /package/dist/{types/meeting → meeting}/locusMediaRequest.d.ts +0 -0
- /package/dist/{types/meeting → meeting}/muteState.d.ts +0 -0
- /package/dist/{types/meeting → meeting}/request.type.d.ts +0 -0
- /package/dist/{types/meeting → meeting}/state.d.ts +0 -0
- /package/dist/{types/meeting-info → meeting-info}/collection.d.ts +0 -0
- /package/dist/{types/meeting-info → meeting-info}/request.d.ts +0 -0
- /package/dist/{types/meeting-info → meeting-info}/util.d.ts +0 -0
- /package/dist/{types/meeting-info → meeting-info}/utilv2.d.ts +0 -0
- /package/dist/{types/meetings → meetings}/meetings.types.d.ts +0 -0
- /package/dist/{types/meetings → meetings}/request.d.ts +0 -0
- /package/dist/{types/meetings → meetings}/util.d.ts +0 -0
- /package/dist/{types/member → member}/types.d.ts +0 -0
- /package/dist/{types/member → member}/util.d.ts +0 -0
- /package/dist/{types/members → members}/collection.d.ts +0 -0
- /package/dist/{types/members → members}/index.d.ts +0 -0
- /package/dist/{types/members → members}/request.d.ts +0 -0
- /package/dist/{types/metrics → metrics}/index.d.ts +0 -0
- /package/dist/{types/multistream → multistream}/mediaRequestManager.d.ts +0 -0
- /package/dist/{types/multistream → multistream}/receiveSlot.d.ts +0 -0
- /package/dist/{types/multistream → multistream}/receiveSlotManager.d.ts +0 -0
- /package/dist/{types/multistream → multistream}/remoteMedia.d.ts +0 -0
- /package/dist/{types/multistream → multistream}/remoteMediaGroup.d.ts +0 -0
- /package/dist/{types/multistream → multistream}/remoteMediaManager.d.ts +0 -0
- /package/dist/{types/multistream → multistream}/sendSlotManager.d.ts +0 -0
- /package/dist/{types/networkQualityMonitor → networkQualityMonitor}/index.d.ts +0 -0
- /package/dist/{types/personal-meeting-room → personal-meeting-room}/index.d.ts +0 -0
- /package/dist/{types/personal-meeting-room → personal-meeting-room}/request.d.ts +0 -0
- /package/dist/{types/personal-meeting-room → personal-meeting-room}/util.d.ts +0 -0
- /package/dist/{types/reachability → reachability}/request.d.ts +0 -0
- /package/dist/{types/reactions → reactions}/constants.d.ts +0 -0
- /package/dist/{types/reactions → reactions}/reactions.d.ts +0 -0
- /package/dist/{types/reactions → reactions}/reactions.type.d.ts +0 -0
- /package/dist/{types/recording-controller → recording-controller}/enums.d.ts +0 -0
- /package/dist/{types/recording-controller → recording-controller}/index.d.ts +0 -0
- /package/dist/{types/recording-controller → recording-controller}/util.d.ts +0 -0
- /package/dist/{types/roap → roap}/request.d.ts +0 -0
- /package/dist/{types/rtcMetrics → rtcMetrics}/constants.d.ts +0 -0
- /package/dist/{types/statsAnalyzer → statsAnalyzer}/global.d.ts +0 -0
- /package/dist/{types/transcription → transcription}/index.d.ts +0 -0
- /package/test/unit/spec/locus-info/{selfConstant.js → lib/selfConstant.js} +0 -0
|
@@ -33,11 +33,6 @@ describe('TurnDiscovery', () => {
|
|
|
33
33
|
|
|
34
34
|
testMeeting = {
|
|
35
35
|
id: 'fake meeting id',
|
|
36
|
-
config: {
|
|
37
|
-
experimental: {
|
|
38
|
-
enableTurnDiscovery: true,
|
|
39
|
-
},
|
|
40
|
-
},
|
|
41
36
|
correlationId: 'fake correlation id',
|
|
42
37
|
selfUrl: 'fake self url',
|
|
43
38
|
mediaId: 'fake media id',
|
|
@@ -54,7 +49,7 @@ describe('TurnDiscovery', () => {
|
|
|
54
49
|
}),
|
|
55
50
|
updateMediaConnections: sinon.stub(),
|
|
56
51
|
webex: {meetings: {reachability: {
|
|
57
|
-
|
|
52
|
+
isAnyPublicClusterReachable: () => Promise.resolve(false),
|
|
58
53
|
}}},
|
|
59
54
|
isMultistream: false,
|
|
60
55
|
locusMediaRequest: { fake: true },
|
|
@@ -89,19 +84,13 @@ describe('TurnDiscovery', () => {
|
|
|
89
84
|
|
|
90
85
|
if (messageType === 'TURN_DISCOVERY_REQUEST') {
|
|
91
86
|
expectedSendRoapArgs.ipVersion = 0;
|
|
87
|
+
expectedSendRoapArgs.roapMessage.headers = ['includeAnswerInHttpResponse', 'noOkInTransaction'];
|
|
92
88
|
}
|
|
93
|
-
|
|
94
|
-
assert.calledWith(mockRoapRequest.sendRoap, expectedSendRoapArgs);
|
|
95
89
|
|
|
96
|
-
|
|
97
|
-
// check also that we've applied the media connections from the response
|
|
98
|
-
assert.calledOnce(testMeeting.updateMediaConnections);
|
|
99
|
-
assert.calledWith(testMeeting.updateMediaConnections, FAKE_MEDIA_CONNECTIONS_FROM_LOCUS);
|
|
100
|
-
}
|
|
90
|
+
assert.calledWith(mockRoapRequest.sendRoap, expectedSendRoapArgs);
|
|
101
91
|
};
|
|
102
92
|
|
|
103
93
|
const checkFailureMetricsSent = () => {
|
|
104
|
-
assert.calledOnce(Metrics.sendBehavioralMetric);
|
|
105
94
|
assert.calledWith(
|
|
106
95
|
Metrics.sendBehavioralMetric,
|
|
107
96
|
BEHAVIORAL_METRICS.TURN_DISCOVERY_FAILURE,
|
|
@@ -112,45 +101,318 @@ describe('TurnDiscovery', () => {
|
|
|
112
101
|
);
|
|
113
102
|
};
|
|
114
103
|
|
|
104
|
+
const checkHttpResponseMissingMetricsSent = () => {
|
|
105
|
+
assert.calledWith(
|
|
106
|
+
Metrics.sendBehavioralMetric,
|
|
107
|
+
BEHAVIORAL_METRICS.ROAP_HTTP_RESPONSE_MISSING,
|
|
108
|
+
sinon.match({
|
|
109
|
+
correlationId: testMeeting.correlationId,
|
|
110
|
+
messageType: 'TURN_DISCOVERY_RESPONSE',
|
|
111
|
+
isMultistream: testMeeting.isMultistream,
|
|
112
|
+
})
|
|
113
|
+
);
|
|
114
|
+
};
|
|
115
|
+
|
|
115
116
|
describe('doTurnDiscovery', () => {
|
|
116
|
-
[false, true].forEach(function (enabledMultistream
|
|
117
|
-
|
|
118
|
-
|
|
117
|
+
[false, true].forEach(function (enabledMultistream) {
|
|
118
|
+
describe('when Multistream is ' + (enabledMultistream ? 'enabled' : 'disabled'), () => {
|
|
119
|
+
beforeEach(() => {
|
|
120
|
+
testMeeting.isMultistream = enabledMultistream;
|
|
121
|
+
});
|
|
119
122
|
|
|
120
|
-
|
|
123
|
+
// checks that OK roap message was sent or not sent and that the result is as expected
|
|
124
|
+
const checkResult = async (resultPromise, expectedRoapMessageSent, expectedResult) => {
|
|
125
|
+
let turnServerInfo, turnDiscoverySkippedReason;
|
|
126
|
+
|
|
127
|
+
if (expectedRoapMessageSent === 'OK') {
|
|
128
|
+
await testUtils.flushPromises();
|
|
129
|
+
|
|
130
|
+
// check that we've sent OK
|
|
131
|
+
await checkRoapMessageSent('OK', 0);
|
|
132
|
+
|
|
133
|
+
assert.calledWith(
|
|
134
|
+
Metrics.sendBehavioralMetric,
|
|
135
|
+
BEHAVIORAL_METRICS.TURN_DISCOVERY_REQUIRES_OK,
|
|
136
|
+
sinon.match({
|
|
137
|
+
correlation_id: testMeeting.correlationId,
|
|
138
|
+
locus_id: FAKE_LOCUS_ID,
|
|
139
|
+
})
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
({turnServerInfo, turnDiscoverySkippedReason} = await resultPromise);
|
|
143
|
+
} else {
|
|
144
|
+
({turnServerInfo, turnDiscoverySkippedReason} = await resultPromise);
|
|
145
|
+
|
|
146
|
+
await testUtils.flushPromises();
|
|
147
|
+
|
|
148
|
+
// check that we didn't send OK or any other message
|
|
149
|
+
assert.notCalled(mockRoapRequest.sendRoap);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
assert.deepEqual(turnServerInfo, expectedResult);
|
|
153
|
+
assert.isUndefined(turnDiscoverySkippedReason);
|
|
154
|
+
};
|
|
155
|
+
|
|
156
|
+
it('sends TURN_DISCOVERY_REQUEST, waits for response and sends OK', async () => {
|
|
157
|
+
const td = new TurnDiscovery(mockRoapRequest);
|
|
158
|
+
const result = td.doTurnDiscovery(testMeeting, false);
|
|
159
|
+
|
|
160
|
+
// check that TURN_DISCOVERY_REQUEST was sent
|
|
161
|
+
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
|
162
|
+
|
|
163
|
+
// check also that we've applied the media connections from the response
|
|
164
|
+
assert.calledOnce(testMeeting.updateMediaConnections);
|
|
165
|
+
assert.calledWith(testMeeting.updateMediaConnections, FAKE_MEDIA_CONNECTIONS_FROM_LOCUS);
|
|
166
|
+
|
|
167
|
+
// response is not in http response, so we expect a metric for that
|
|
168
|
+
checkHttpResponseMissingMetricsSent();
|
|
169
|
+
|
|
170
|
+
// @ts-ignore
|
|
171
|
+
mockRoapRequest.sendRoap.resetHistory();
|
|
172
|
+
|
|
173
|
+
// simulate the response
|
|
174
|
+
td.handleTurnDiscoveryResponse(
|
|
175
|
+
{
|
|
176
|
+
messageType: 'TURN_DISCOVERY_RESPONSE',
|
|
177
|
+
headers: [
|
|
178
|
+
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
179
|
+
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
180
|
+
`x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
'from test'
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
await checkResult(result, 'OK', {
|
|
187
|
+
url: FAKE_TURN_URL,
|
|
188
|
+
username: FAKE_TURN_USERNAME,
|
|
189
|
+
password: FAKE_TURN_PASSWORD,
|
|
190
|
+
});
|
|
191
|
+
});
|
|
121
192
|
|
|
122
|
-
|
|
193
|
+
it('sends TURN_DISCOVERY_REQUEST, waits for response and does not send OK if response received from Mercury has "noOkInTransaction" header', async () => {
|
|
194
|
+
const td = new TurnDiscovery(mockRoapRequest);
|
|
195
|
+
const result = td.doTurnDiscovery(testMeeting, false);
|
|
196
|
+
|
|
197
|
+
// check that TURN_DISCOVERY_REQUEST was sent
|
|
198
|
+
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
|
199
|
+
|
|
200
|
+
// check also that we've applied the media connections from the response
|
|
201
|
+
assert.calledOnce(testMeeting.updateMediaConnections);
|
|
202
|
+
assert.calledWith(testMeeting.updateMediaConnections, FAKE_MEDIA_CONNECTIONS_FROM_LOCUS);
|
|
203
|
+
|
|
204
|
+
// @ts-ignore
|
|
205
|
+
mockRoapRequest.sendRoap.resetHistory();
|
|
206
|
+
|
|
207
|
+
// simulate the response
|
|
208
|
+
td.handleTurnDiscoveryResponse(
|
|
209
|
+
{
|
|
210
|
+
messageType: 'TURN_DISCOVERY_RESPONSE',
|
|
211
|
+
headers: [
|
|
212
|
+
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
213
|
+
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
214
|
+
`x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
|
|
215
|
+
'noOkInTransaction',
|
|
216
|
+
],
|
|
217
|
+
},
|
|
218
|
+
'from test'
|
|
219
|
+
);
|
|
220
|
+
|
|
221
|
+
await checkResult(result, undefined, {
|
|
222
|
+
url: FAKE_TURN_URL,
|
|
223
|
+
username: FAKE_TURN_USERNAME,
|
|
224
|
+
password: FAKE_TURN_PASSWORD,
|
|
225
|
+
});
|
|
226
|
+
});
|
|
123
227
|
|
|
124
|
-
|
|
125
|
-
|
|
228
|
+
it('sends TURN_DISCOVERY_REQUEST, handles http response and does not send OK if received response has "noOkInTransaction" header', async () => {
|
|
229
|
+
mockRoapRequest.sendRoap = sinon.fake.resolves({
|
|
230
|
+
mediaConnections: [
|
|
231
|
+
{
|
|
232
|
+
mediaId: '464ff97f-4bda-466a-ad06-3a22184a2274',
|
|
233
|
+
remoteSdp: `{"roapMessage": {"messageType":"TURN_DISCOVERY_RESPONSE","seq":"0","headers": ["x-cisco-turn-url=${FAKE_TURN_URL}","x-cisco-turn-username=${FAKE_TURN_USERNAME}","x-cisco-turn-password=${FAKE_TURN_PASSWORD}", "noOkInTransaction"]}}`,
|
|
234
|
+
},
|
|
235
|
+
],
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
const td = new TurnDiscovery(mockRoapRequest);
|
|
239
|
+
const result = td.doTurnDiscovery(testMeeting, false);
|
|
240
|
+
|
|
241
|
+
// check that TURN_DISCOVERY_REQUEST was sent
|
|
242
|
+
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
|
243
|
+
|
|
244
|
+
// @ts-ignore
|
|
245
|
+
mockRoapRequest.sendRoap.resetHistory();
|
|
246
|
+
|
|
247
|
+
await checkResult(result, undefined, {
|
|
248
|
+
url: FAKE_TURN_URL,
|
|
249
|
+
username: FAKE_TURN_USERNAME,
|
|
250
|
+
password: FAKE_TURN_PASSWORD,
|
|
251
|
+
});
|
|
252
|
+
});
|
|
126
253
|
|
|
127
|
-
|
|
128
|
-
|
|
254
|
+
it('sends TURN_DISCOVERY_REQUEST, handles http response and sends OK if received response does not have "noOkInTransaction" header', async () => {
|
|
255
|
+
let sendRoapPromiseResolve;
|
|
256
|
+
const sendRoapResult = {
|
|
257
|
+
mediaConnections: [
|
|
258
|
+
{
|
|
259
|
+
mediaId: '464ff97f-4bda-466a-ad06-3a22184a2274',
|
|
260
|
+
remoteSdp: `{"roapMessage": {"messageType":"TURN_DISCOVERY_RESPONSE","seq":"0","headers": ["x-cisco-turn-url=${FAKE_TURN_URL}","x-cisco-turn-username=${FAKE_TURN_USERNAME}","x-cisco-turn-password=${FAKE_TURN_PASSWORD}"]}}`,
|
|
261
|
+
},
|
|
262
|
+
],
|
|
263
|
+
};
|
|
264
|
+
mockRoapRequest.sendRoap = sinon.fake.returns(new Promise((resolve) => {
|
|
265
|
+
sendRoapPromiseResolve = resolve;
|
|
266
|
+
}));
|
|
267
|
+
|
|
268
|
+
const td = new TurnDiscovery(mockRoapRequest);
|
|
269
|
+
const result = td.doTurnDiscovery(testMeeting, false);
|
|
270
|
+
|
|
271
|
+
// check that TURN_DISCOVERY_REQUEST was sent
|
|
272
|
+
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
|
273
|
+
|
|
274
|
+
// @ts-ignore
|
|
275
|
+
mockRoapRequest.sendRoap.resetHistory();
|
|
276
|
+
// simulate the http response without 'noOkInTransaction' header
|
|
277
|
+
sendRoapPromiseResolve(sendRoapResult);
|
|
278
|
+
|
|
279
|
+
await checkResult(result, 'OK', {
|
|
280
|
+
url: FAKE_TURN_URL,
|
|
281
|
+
username: FAKE_TURN_USERNAME,
|
|
282
|
+
password: FAKE_TURN_PASSWORD,
|
|
283
|
+
});
|
|
284
|
+
});
|
|
129
285
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
286
|
+
it('handles http response that has invalid JSON in the remoteSdp field', async () => {
|
|
287
|
+
mockRoapRequest.sendRoap = sinon.fake.resolves({
|
|
288
|
+
mediaConnections: [
|
|
289
|
+
{
|
|
290
|
+
mediaId: '464ff97f-4bda-466a-ad06-3a22184a2274',
|
|
291
|
+
remoteSdp: `not a json`,
|
|
292
|
+
},
|
|
293
|
+
],
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
const td = new TurnDiscovery(mockRoapRequest);
|
|
297
|
+
const result = td.doTurnDiscovery(testMeeting, false);
|
|
298
|
+
|
|
299
|
+
// check that TURN_DISCOVERY_REQUEST was sent
|
|
300
|
+
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
|
301
|
+
|
|
302
|
+
// @ts-ignore
|
|
303
|
+
mockRoapRequest.sendRoap.resetHistory();
|
|
304
|
+
|
|
305
|
+
await checkResult(result, undefined, undefined);
|
|
306
|
+
checkFailureMetricsSent();
|
|
137
307
|
});
|
|
138
308
|
|
|
139
|
-
|
|
309
|
+
it('waits for response from Mercury if http response does not contain a roapMessage', async () => {
|
|
310
|
+
mockRoapRequest.sendRoap = sinon.fake.resolves({
|
|
311
|
+
mediaConnections: [
|
|
312
|
+
{
|
|
313
|
+
mediaId: '464ff97f-4bda-466a-ad06-3a22184a2274',
|
|
314
|
+
remoteSdp: `{"something": "whatever"}`,
|
|
315
|
+
},
|
|
316
|
+
],
|
|
317
|
+
});
|
|
318
|
+
|
|
319
|
+
const td = new TurnDiscovery(mockRoapRequest);
|
|
320
|
+
const result = td.doTurnDiscovery(testMeeting, false);
|
|
321
|
+
|
|
322
|
+
// check that TURN_DISCOVERY_REQUEST was sent
|
|
323
|
+
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
|
324
|
+
|
|
325
|
+
checkHttpResponseMissingMetricsSent();
|
|
326
|
+
|
|
327
|
+
// @ts-ignore
|
|
328
|
+
mockRoapRequest.sendRoap.resetHistory();
|
|
329
|
+
|
|
330
|
+
// simulate the response coming from Mercury
|
|
331
|
+
td.handleTurnDiscoveryResponse(
|
|
332
|
+
{
|
|
333
|
+
messageType: 'TURN_DISCOVERY_RESPONSE',
|
|
334
|
+
headers: [
|
|
335
|
+
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
336
|
+
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
337
|
+
`x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
|
|
338
|
+
],
|
|
339
|
+
},
|
|
340
|
+
'from test'
|
|
341
|
+
);
|
|
342
|
+
|
|
343
|
+
await checkResult(result, 'OK', {
|
|
344
|
+
url: FAKE_TURN_URL,
|
|
345
|
+
username: FAKE_TURN_USERNAME,
|
|
346
|
+
password: FAKE_TURN_PASSWORD,
|
|
347
|
+
});
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
it('handles unexpected roap message type in http response', async () => {
|
|
351
|
+
mockRoapRequest.sendRoap = sinon.fake.resolves({
|
|
352
|
+
mediaConnections: [
|
|
353
|
+
{
|
|
354
|
+
mediaId: '464ff97f-4bda-466a-ad06-3a22184a2274',
|
|
355
|
+
remoteSdp: `{"roapMessage": {"messageType":"ERROR","seq":"0"}}`,
|
|
356
|
+
},
|
|
357
|
+
],
|
|
358
|
+
});
|
|
359
|
+
|
|
360
|
+
const td = new TurnDiscovery(mockRoapRequest);
|
|
361
|
+
const result = td.doTurnDiscovery(testMeeting, false);
|
|
140
362
|
|
|
141
|
-
|
|
142
|
-
|
|
363
|
+
// check that TURN_DISCOVERY_REQUEST was sent
|
|
364
|
+
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
|
143
365
|
|
|
144
|
-
|
|
366
|
+
// @ts-ignore
|
|
367
|
+
mockRoapRequest.sendRoap.resetHistory();
|
|
145
368
|
|
|
146
|
-
|
|
147
|
-
url: FAKE_TURN_URL,
|
|
148
|
-
username: FAKE_TURN_USERNAME,
|
|
149
|
-
password: FAKE_TURN_PASSWORD
|
|
369
|
+
await checkResult(result, undefined, undefined);
|
|
150
370
|
});
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
it('sends TURN_DISCOVERY_REQUEST, waits for response and sends OK when isForced = true when cluster is reachable', async () => {
|
|
375
|
+
const prev = testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable;
|
|
376
|
+
testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = sinon
|
|
377
|
+
.stub()
|
|
378
|
+
.resolves(true);
|
|
379
|
+
|
|
380
|
+
const td = new TurnDiscovery(mockRoapRequest);
|
|
381
|
+
const result = td.doTurnDiscovery(testMeeting, false, true);
|
|
382
|
+
|
|
383
|
+
// We ignore reachability results so we don't get skip reason
|
|
384
|
+
assert.notCalled(testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable);
|
|
151
385
|
|
|
152
|
-
|
|
386
|
+
// check that TURN_DISCOVERY_REQUEST was sent
|
|
387
|
+
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
|
388
|
+
// @ts-ignore
|
|
389
|
+
mockRoapRequest.sendRoap.resetHistory();
|
|
390
|
+
// simulate the response
|
|
391
|
+
td.handleTurnDiscoveryResponse(
|
|
392
|
+
{
|
|
393
|
+
messageType: 'TURN_DISCOVERY_RESPONSE',
|
|
394
|
+
headers: [
|
|
395
|
+
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
396
|
+
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
397
|
+
`x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
|
|
398
|
+
],
|
|
399
|
+
},
|
|
400
|
+
'from test'
|
|
401
|
+
);
|
|
402
|
+
await testUtils.flushPromises();
|
|
403
|
+
// check that we've sent OK
|
|
404
|
+
await checkRoapMessageSent('OK', 0);
|
|
405
|
+
|
|
406
|
+
const {turnServerInfo, turnDiscoverySkippedReason} = await result;
|
|
407
|
+
assert.deepEqual(turnServerInfo, {
|
|
408
|
+
url: FAKE_TURN_URL,
|
|
409
|
+
username: FAKE_TURN_USERNAME,
|
|
410
|
+
password: FAKE_TURN_PASSWORD,
|
|
153
411
|
});
|
|
412
|
+
assert.isUndefined(turnDiscoverySkippedReason);
|
|
413
|
+
|
|
414
|
+
// restore previous callback
|
|
415
|
+
testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = prev;
|
|
154
416
|
});
|
|
155
417
|
|
|
156
418
|
it('sends TURN_DISCOVERY_REQUEST with empty mediaId when isReconnecting is true', async () => {
|
|
@@ -166,13 +428,17 @@ describe('TurnDiscovery', () => {
|
|
|
166
428
|
mockRoapRequest.sendRoap.resetHistory();
|
|
167
429
|
|
|
168
430
|
// simulate the response
|
|
169
|
-
td.handleTurnDiscoveryResponse(
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
431
|
+
td.handleTurnDiscoveryResponse(
|
|
432
|
+
{
|
|
433
|
+
messageType: 'TURN_DISCOVERY_RESPONSE',
|
|
434
|
+
headers: [
|
|
435
|
+
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
436
|
+
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
437
|
+
`x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
|
|
438
|
+
],
|
|
439
|
+
},
|
|
440
|
+
'from test'
|
|
441
|
+
);
|
|
176
442
|
|
|
177
443
|
await testUtils.flushPromises();
|
|
178
444
|
|
|
@@ -199,16 +465,20 @@ describe('TurnDiscovery', () => {
|
|
|
199
465
|
mockRoapRequest.sendRoap.resetHistory();
|
|
200
466
|
|
|
201
467
|
// simulate the response with some extra headers
|
|
202
|
-
td.handleTurnDiscoveryResponse(
|
|
203
|
-
|
|
204
|
-
'
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
468
|
+
td.handleTurnDiscoveryResponse(
|
|
469
|
+
{
|
|
470
|
+
messageType: 'TURN_DISCOVERY_RESPONSE',
|
|
471
|
+
headers: [
|
|
472
|
+
'x-cisco-turn-unexpected-header=xxx',
|
|
473
|
+
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
474
|
+
'x-cisco-some-other-header',
|
|
475
|
+
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
476
|
+
`x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
|
|
477
|
+
'another-header-at-the-end=12345',
|
|
478
|
+
],
|
|
479
|
+
},
|
|
480
|
+
'from test'
|
|
481
|
+
);
|
|
212
482
|
|
|
213
483
|
await testUtils.flushPromises();
|
|
214
484
|
|
|
@@ -224,24 +494,6 @@ describe('TurnDiscovery', () => {
|
|
|
224
494
|
assert.isUndefined(turnDiscoverySkippedReason);
|
|
225
495
|
});
|
|
226
496
|
|
|
227
|
-
it('resolves with undefined if turn discovery feature is disabled in config', async () => {
|
|
228
|
-
const prevConfigValue = testMeeting.config.experimental.enableTurnDiscovery;
|
|
229
|
-
|
|
230
|
-
testMeeting.config.experimental.enableTurnDiscovery = false;
|
|
231
|
-
// @ts-ignore
|
|
232
|
-
const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
|
|
233
|
-
|
|
234
|
-
const {turnServerInfo, turnDiscoverySkippedReason} = result;
|
|
235
|
-
|
|
236
|
-
assert.isUndefined(turnServerInfo);
|
|
237
|
-
assert.equal(turnDiscoverySkippedReason, 'config');
|
|
238
|
-
assert.notCalled(mockRoapRequest.sendRoap);
|
|
239
|
-
assert.notCalled(Metrics.sendBehavioralMetric);
|
|
240
|
-
|
|
241
|
-
// restore previous config
|
|
242
|
-
testMeeting.config.experimental.enableTurnDiscovery = prevConfigValue;
|
|
243
|
-
});
|
|
244
|
-
|
|
245
497
|
it('resolves with undefined if sending the request fails', async () => {
|
|
246
498
|
const td = new TurnDiscovery(mockRoapRequest);
|
|
247
499
|
|
|
@@ -257,8 +509,9 @@ describe('TurnDiscovery', () => {
|
|
|
257
509
|
});
|
|
258
510
|
|
|
259
511
|
it('resolves with undefined when cluster is reachable', async () => {
|
|
260
|
-
const prev = testMeeting.webex.meetings.reachability.
|
|
261
|
-
testMeeting.webex.meetings.reachability.
|
|
512
|
+
const prev = testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable;
|
|
513
|
+
testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = () =>
|
|
514
|
+
Promise.resolve(true);
|
|
262
515
|
const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
|
|
263
516
|
|
|
264
517
|
const {turnServerInfo, turnDiscoverySkippedReason} = result;
|
|
@@ -267,7 +520,7 @@ describe('TurnDiscovery', () => {
|
|
|
267
520
|
assert.equal(turnDiscoverySkippedReason, 'reachability');
|
|
268
521
|
assert.notCalled(mockRoapRequest.sendRoap);
|
|
269
522
|
assert.notCalled(Metrics.sendBehavioralMetric);
|
|
270
|
-
testMeeting.webex.meetings.reachability.
|
|
523
|
+
testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = prev;
|
|
271
524
|
});
|
|
272
525
|
|
|
273
526
|
it("resolves with undefined if we don't get a response within 10s", async () => {
|
|
@@ -292,12 +545,16 @@ describe('TurnDiscovery', () => {
|
|
|
292
545
|
await testUtils.flushPromises();
|
|
293
546
|
|
|
294
547
|
// simulate the response without the password
|
|
295
|
-
td.handleTurnDiscoveryResponse(
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
548
|
+
td.handleTurnDiscoveryResponse(
|
|
549
|
+
{
|
|
550
|
+
messageType: 'TURN_DISCOVERY_RESPONSE',
|
|
551
|
+
headers: [
|
|
552
|
+
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
553
|
+
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
554
|
+
],
|
|
555
|
+
},
|
|
556
|
+
'from test'
|
|
557
|
+
);
|
|
301
558
|
await testUtils.flushPromises();
|
|
302
559
|
const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
|
|
303
560
|
|
|
@@ -313,7 +570,7 @@ describe('TurnDiscovery', () => {
|
|
|
313
570
|
await testUtils.flushPromises();
|
|
314
571
|
|
|
315
572
|
// simulate the response without the headers
|
|
316
|
-
td.handleTurnDiscoveryResponse({});
|
|
573
|
+
td.handleTurnDiscoveryResponse({messageType: 'TURN_DISCOVERY_RESPONSE'}, 'from test');
|
|
317
574
|
|
|
318
575
|
await testUtils.flushPromises();
|
|
319
576
|
const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
|
|
@@ -330,7 +587,10 @@ describe('TurnDiscovery', () => {
|
|
|
330
587
|
await testUtils.flushPromises();
|
|
331
588
|
|
|
332
589
|
// simulate the response without the headers
|
|
333
|
-
td.handleTurnDiscoveryResponse(
|
|
590
|
+
td.handleTurnDiscoveryResponse(
|
|
591
|
+
{messageType: 'TURN_DISCOVERY_RESPONSE', headers: []},
|
|
592
|
+
'from test'
|
|
593
|
+
);
|
|
334
594
|
|
|
335
595
|
await testUtils.flushPromises();
|
|
336
596
|
const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
|
|
@@ -356,13 +616,17 @@ describe('TurnDiscovery', () => {
|
|
|
356
616
|
mockRoapRequest.sendRoap = sinon.fake.rejects(new Error('fake error'));
|
|
357
617
|
|
|
358
618
|
// simulate the response
|
|
359
|
-
td.handleTurnDiscoveryResponse(
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
619
|
+
td.handleTurnDiscoveryResponse(
|
|
620
|
+
{
|
|
621
|
+
messageType: 'TURN_DISCOVERY_RESPONSE',
|
|
622
|
+
headers: [
|
|
623
|
+
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
624
|
+
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
625
|
+
`x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
|
|
626
|
+
],
|
|
627
|
+
},
|
|
628
|
+
'from test'
|
|
629
|
+
);
|
|
366
630
|
|
|
367
631
|
await testUtils.flushPromises();
|
|
368
632
|
|
|
@@ -379,15 +643,11 @@ describe('TurnDiscovery', () => {
|
|
|
379
643
|
|
|
380
644
|
describe('isSkipped', () => {
|
|
381
645
|
[
|
|
382
|
-
{
|
|
383
|
-
{
|
|
384
|
-
|
|
385
|
-
{
|
|
386
|
-
|
|
387
|
-
it(`returns ${expectedIsSkipped} when TURN discovery is ${enabledInConfig ? '' : 'not '} enabled in config and isAnyClusterReachable() returns ${isAnyClusterReachable ? 'true' : 'false'}`, async () => {
|
|
388
|
-
testMeeting.config.experimental.enableTurnDiscovery = enabledInConfig;
|
|
389
|
-
|
|
390
|
-
sinon.stub(testMeeting.webex.meetings.reachability, 'isAnyClusterReachable').resolves(isAnyClusterReachable);
|
|
646
|
+
{isAnyPublicClusterReachable: true, expectedIsSkipped: true},
|
|
647
|
+
{isAnyPublicClusterReachable: false, expectedIsSkipped: false},
|
|
648
|
+
].forEach(({isAnyPublicClusterReachable, expectedIsSkipped}) => {
|
|
649
|
+
it(`returns ${expectedIsSkipped} when isAnyPublicClusterReachable() returns ${isAnyPublicClusterReachable ? 'true' : 'false'}`, async () => {
|
|
650
|
+
sinon.stub(testMeeting.webex.meetings.reachability, 'isAnyPublicClusterReachable').resolves(isAnyPublicClusterReachable);
|
|
391
651
|
|
|
392
652
|
const td = new TurnDiscovery(mockRoapRequest);
|
|
393
653
|
|
|
@@ -405,12 +665,13 @@ describe('TurnDiscovery', () => {
|
|
|
405
665
|
// there is not much we can check, but we mainly want to make
|
|
406
666
|
// sure that it doesn't crash
|
|
407
667
|
td.handleTurnDiscoveryResponse({
|
|
668
|
+
messageType: 'TURN_DISCOVERY_RESPONSE',
|
|
408
669
|
headers: [
|
|
409
670
|
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
410
671
|
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
411
672
|
`x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
|
|
412
673
|
],
|
|
413
|
-
});
|
|
674
|
+
}, 'from test');
|
|
414
675
|
|
|
415
676
|
assert.notCalled(mockRoapRequest.sendRoap);
|
|
416
677
|
});
|