@webex/plugin-meetings 3.0.0-beta.39 → 3.0.0-beta.391
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 +58 -8
- 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 +342 -0
- package/dist/annotation/index.js.map +1 -0
- package/dist/breakouts/breakout.js +94 -15
- package/dist/breakouts/breakout.js.map +1 -1
- package/dist/breakouts/events.js +45 -0
- package/dist/breakouts/events.js.map +1 -0
- package/dist/breakouts/index.js +671 -81
- package/dist/breakouts/index.js.map +1 -1
- package/dist/breakouts/utils.js +45 -1
- package/dist/breakouts/utils.js.map +1 -1
- package/dist/common/errors/no-meeting-info.js +51 -0
- package/dist/common/errors/no-meeting-info.js.map +1 -0
- package/dist/common/errors/reclaim-host-role-errors.js +158 -0
- package/dist/common/errors/reclaim-host-role-errors.js.map +1 -0
- package/dist/common/errors/webex-errors.js +48 -7
- 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/common/logs/request.js +5 -1
- package/dist/common/logs/request.js.map +1 -1
- package/dist/common/queue.js +24 -9
- package/dist/common/queue.js.map +1 -1
- package/dist/config.js +5 -10
- package/dist/config.js.map +1 -1
- package/dist/constants.js +242 -33
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.js +14 -2
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/index.js +109 -15
- package/dist/controls-options-manager/index.js.map +1 -1
- 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 +309 -18
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/index.js +110 -2
- package/dist/index.js.map +1 -1
- package/dist/interceptors/index.js +15 -0
- package/dist/interceptors/index.js.map +1 -0
- package/dist/interceptors/locusRetry.js +93 -0
- package/dist/interceptors/locusRetry.js.map +1 -0
- package/dist/interpretation/collection.js +23 -0
- package/dist/interpretation/collection.js.map +1 -0
- package/dist/interpretation/index.js +380 -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 +91 -2
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +386 -62
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.js +7 -1
- package/dist/locus-info/infoUtils.js.map +1 -1
- package/dist/locus-info/mediaSharesUtils.js +71 -1
- package/dist/locus-info/mediaSharesUtils.js.map +1 -1
- package/dist/locus-info/parser.js +249 -72
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.js +89 -14
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +65 -102
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +73 -124
- package/dist/media/properties.js.map +1 -1
- package/dist/mediaQualityMetrics/config.js +135 -330
- package/dist/mediaQualityMetrics/config.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +86 -2
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +4075 -2827
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +292 -0
- package/dist/meeting/locusMediaRequest.js.map +1 -0
- package/dist/meeting/muteState.js +224 -136
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +177 -152
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +672 -417
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/index.js +73 -7
- package/dist/meeting-info/index.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +192 -51
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/util.js +1 -1
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +36 -36
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/collection.js +39 -0
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.js +484 -119
- 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 +2 -0
- package/dist/meetings/request.js.map +1 -1
- package/dist/meetings/util.js +73 -7
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +58 -0
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +25 -0
- package/dist/member/types.js.map +1 -0
- package/dist/member/util.js +132 -25
- 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 +102 -6
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +106 -38
- 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 +326 -232
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +18 -1
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +1 -446
- package/dist/metrics/index.js.map +1 -1
- package/dist/multistream/mediaRequestManager.js +223 -32
- package/dist/multistream/mediaRequestManager.js.map +1 -1
- package/dist/multistream/receiveSlot.js +10 -0
- package/dist/multistream/receiveSlot.js.map +1 -1
- package/dist/multistream/receiveSlotManager.js +39 -36
- package/dist/multistream/receiveSlotManager.js.map +1 -1
- package/dist/multistream/remoteMedia.js +3 -1
- package/dist/multistream/remoteMedia.js.map +1 -1
- package/dist/multistream/remoteMediaGroup.js +76 -5
- package/dist/multistream/remoteMediaGroup.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +366 -104
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/multistream/sendSlotManager.js +255 -0
- package/dist/multistream/sendSlotManager.js.map +1 -0
- package/dist/reachability/clusterReachability.js +356 -0
- package/dist/reachability/clusterReachability.js.map +1 -0
- package/dist/reachability/index.js +263 -390
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +6 -4
- package/dist/reachability/request.js.map +1 -1
- package/dist/reachability/util.js +29 -0
- package/dist/reachability/util.js.map +1 -0
- package/dist/reconnection-manager/index.js +266 -202
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/index.js +21 -2
- package/dist/recording-controller/index.js.map +1 -1
- package/dist/recording-controller/util.js +9 -8
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/index.js +51 -28
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.js +48 -64
- package/dist/roap/request.js.map +1 -1
- package/dist/roap/turnDiscovery.js +220 -70
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/rtcMetrics/constants.js +12 -0
- package/dist/rtcMetrics/constants.js.map +1 -0
- package/dist/rtcMetrics/index.js +179 -0
- package/dist/rtcMetrics/index.js.map +1 -0
- package/dist/statsAnalyzer/index.js +357 -295
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +296 -156
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/types/annotation/annotation.types.d.ts +42 -0
- package/dist/types/annotation/constants.d.ts +31 -0
- package/dist/types/annotation/index.d.ts +117 -0
- package/dist/types/breakouts/events.d.ts +8 -0
- package/dist/types/breakouts/utils.d.ts +14 -0
- package/dist/types/common/errors/no-meeting-info.d.ts +14 -0
- package/dist/types/common/errors/reclaim-host-role-errors.d.ts +60 -0
- package/dist/types/common/errors/webex-errors.d.ts +25 -1
- package/dist/types/common/logs/request.d.ts +2 -0
- package/dist/types/common/queue.d.ts +9 -7
- package/dist/types/config.d.ts +2 -7
- package/dist/types/constants.d.ts +203 -31
- package/dist/types/controls-options-manager/enums.d.ts +11 -1
- package/dist/types/controls-options-manager/index.d.ts +17 -1
- package/dist/types/controls-options-manager/types.d.ts +43 -0
- package/dist/types/controls-options-manager/util.d.ts +1 -7
- package/dist/types/index.d.ts +6 -5
- package/dist/types/interceptors/index.d.ts +2 -0
- package/dist/types/interceptors/locusRetry.d.ts +27 -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/index.d.ts +57 -4
- package/dist/types/locus-info/parser.d.ts +66 -6
- package/dist/types/media/index.d.ts +2 -0
- package/dist/types/media/properties.d.ts +34 -49
- package/dist/types/mediaQualityMetrics/config.d.ts +99 -223
- package/dist/types/meeting/in-meeting-actions.d.ts +86 -2
- package/dist/types/meeting/index.d.ts +567 -496
- package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/types/meeting/muteState.d.ts +93 -25
- package/dist/types/meeting/request.d.ts +64 -43
- package/dist/types/meeting/util.d.ts +117 -1
- package/dist/types/meeting-info/index.d.ts +13 -1
- package/dist/types/meeting-info/meeting-info-v2.d.ts +31 -1
- package/dist/types/meetings/collection.d.ts +17 -0
- package/dist/types/meetings/index.d.ts +113 -21
- package/dist/types/meetings/meetings.types.d.ts +4 -0
- package/dist/types/member/index.d.ts +14 -0
- package/dist/types/member/types.d.ts +32 -0
- package/dist/types/members/collection.d.ts +5 -0
- package/dist/types/members/index.d.ts +35 -2
- package/dist/types/members/request.d.ts +73 -9
- package/dist/types/members/types.d.ts +25 -0
- package/dist/types/members/util.d.ts +214 -1
- package/dist/types/metrics/constants.d.ts +17 -0
- package/dist/types/metrics/index.d.ts +4 -111
- package/dist/types/multistream/mediaRequestManager.d.ts +72 -3
- package/dist/types/multistream/receiveSlot.d.ts +7 -3
- package/dist/types/multistream/receiveSlotManager.d.ts +14 -4
- package/dist/types/multistream/remoteMedia.d.ts +3 -31
- package/dist/types/multistream/remoteMediaGroup.d.ts +2 -9
- package/dist/types/multistream/remoteMediaManager.d.ts +62 -2
- package/dist/types/multistream/sendSlotManager.d.ts +70 -0
- package/dist/types/reachability/clusterReachability.d.ts +109 -0
- package/dist/types/reachability/index.d.ts +60 -95
- package/dist/types/reachability/request.d.ts +3 -1
- package/dist/types/reachability/util.d.ts +8 -0
- package/dist/types/reconnection-manager/index.d.ts +19 -0
- package/dist/types/recording-controller/index.d.ts +15 -1
- package/dist/types/recording-controller/util.d.ts +5 -4
- package/dist/types/roap/index.d.ts +2 -1
- package/dist/types/roap/request.d.ts +9 -8
- package/dist/types/roap/turnDiscovery.d.ts +39 -5
- package/dist/types/rtcMetrics/constants.d.ts +4 -0
- package/dist/types/rtcMetrics/index.d.ts +61 -0
- package/dist/types/statsAnalyzer/index.d.ts +34 -12
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +28 -4
- package/dist/types/webinar/collection.d.ts +16 -0
- package/dist/types/webinar/index.d.ts +5 -0
- package/dist/webinar/collection.js +44 -0
- package/dist/webinar/collection.js.map +1 -0
- package/dist/webinar/index.js +69 -0
- package/dist/webinar/index.js.map +1 -0
- package/package.json +22 -19
- package/src/annotation/annotation.types.ts +50 -0
- package/src/annotation/constants.ts +36 -0
- package/src/annotation/index.ts +328 -0
- package/src/breakouts/README.md +35 -11
- package/src/breakouts/breakout.ts +67 -9
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +558 -59
- package/src/breakouts/utils.ts +42 -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 +44 -2
- package/src/common/logs/logger-proxy.ts +1 -1
- package/src/common/logs/request.ts +5 -1
- package/src/common/queue.ts +22 -8
- package/src/config.ts +4 -9
- package/src/constants.ts +229 -21
- package/src/controls-options-manager/enums.ts +12 -0
- package/src/controls-options-manager/index.ts +116 -21
- package/src/controls-options-manager/types.ts +59 -0
- package/src/controls-options-manager/util.ts +294 -14
- package/src/index.ts +44 -0
- package/src/interceptors/index.ts +3 -0
- package/src/interceptors/locusRetry.ts +67 -0
- package/src/interpretation/README.md +60 -0
- package/src/interpretation/collection.ts +19 -0
- package/src/interpretation/index.ts +349 -0
- package/src/interpretation/siLanguage.ts +18 -0
- package/src/locus-info/controlsUtils.ts +108 -0
- package/src/locus-info/index.ts +417 -59
- package/src/locus-info/infoUtils.ts +10 -2
- package/src/locus-info/mediaSharesUtils.ts +80 -0
- package/src/locus-info/parser.ts +258 -47
- package/src/locus-info/selfUtils.ts +81 -5
- package/src/media/index.ts +100 -108
- package/src/media/properties.ts +88 -117
- package/src/mediaQualityMetrics/config.ts +103 -238
- package/src/meeting/in-meeting-actions.ts +171 -3
- package/src/meeting/index.ts +3411 -2435
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +223 -136
- package/src/meeting/request.ts +155 -120
- package/src/meeting/util.ts +685 -395
- package/src/meeting-info/index.ts +81 -8
- package/src/meeting-info/meeting-info-v2.ts +170 -14
- package/src/meeting-info/util.ts +1 -1
- package/src/meeting-info/utilv2.ts +23 -23
- package/src/meetings/collection.ts +33 -0
- package/src/meetings/index.ts +507 -127
- package/src/meetings/meetings.types.ts +12 -0
- package/src/meetings/request.ts +2 -0
- package/src/meetings/util.ts +81 -12
- package/src/member/index.ts +58 -0
- package/src/member/types.ts +38 -0
- package/src/member/util.ts +141 -25
- package/src/members/collection.ts +8 -0
- package/src/members/index.ts +134 -8
- package/src/members/request.ts +97 -17
- package/src/members/types.ts +29 -0
- package/src/members/util.ts +333 -240
- package/src/metrics/constants.ts +17 -0
- package/src/metrics/index.ts +1 -469
- package/src/multistream/mediaRequestManager.ts +271 -56
- package/src/multistream/receiveSlot.ts +11 -4
- package/src/multistream/receiveSlotManager.ts +34 -24
- package/src/multistream/remoteMedia.ts +5 -3
- package/src/multistream/remoteMediaGroup.ts +78 -0
- package/src/multistream/remoteMediaManager.ts +248 -44
- package/src/multistream/sendSlotManager.ts +199 -0
- package/src/reachability/clusterReachability.ts +320 -0
- package/src/reachability/index.ts +229 -346
- package/src/reachability/request.ts +8 -4
- package/src/reachability/util.ts +24 -0
- package/src/reconnection-manager/index.ts +128 -97
- package/src/recording-controller/index.ts +20 -3
- package/src/recording-controller/util.ts +26 -9
- package/src/roap/index.ts +52 -23
- package/src/roap/request.ts +48 -67
- package/src/roap/turnDiscovery.ts +147 -49
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +166 -0
- package/src/statsAnalyzer/index.ts +457 -416
- package/src/statsAnalyzer/mqaUtil.ts +317 -170
- package/src/webinar/collection.ts +31 -0
- package/src/webinar/index.ts +62 -0
- package/test/integration/spec/converged-space-meetings.js +60 -3
- package/test/integration/spec/journey.js +320 -261
- package/test/integration/spec/space-meeting.js +76 -3
- package/test/unit/spec/annotation/index.ts +418 -0
- package/test/unit/spec/breakouts/breakout.ts +118 -28
- package/test/unit/spec/breakouts/events.ts +89 -0
- package/test/unit/spec/breakouts/index.ts +1349 -114
- package/test/unit/spec/breakouts/utils.js +52 -1
- package/test/unit/spec/common/queue.js +31 -2
- package/test/unit/spec/controls-options-manager/index.js +163 -0
- package/test/unit/spec/controls-options-manager/util.js +576 -60
- package/test/unit/spec/fixture/locus.js +1 -0
- package/test/unit/spec/interceptors/locusRetry.ts +131 -0
- package/test/unit/spec/interpretation/collection.ts +15 -0
- package/test/unit/spec/interpretation/index.ts +625 -0
- package/test/unit/spec/interpretation/siLanguage.ts +28 -0
- package/test/unit/spec/locus-info/controlsUtils.js +316 -43
- package/test/unit/spec/locus-info/index.js +1363 -37
- package/test/unit/spec/locus-info/infoUtils.js +37 -15
- package/test/unit/spec/locus-info/lib/SeqCmp.json +16 -0
- package/test/unit/spec/locus-info/mediaSharesUtils.ts +41 -0
- package/test/unit/spec/locus-info/parser.js +116 -35
- package/test/unit/spec/locus-info/selfConstant.js +27 -4
- package/test/unit/spec/locus-info/selfUtils.js +208 -17
- package/test/unit/spec/media/index.ts +173 -81
- package/test/unit/spec/media/properties.ts +2 -2
- package/test/unit/spec/meeting/in-meeting-actions.ts +85 -3
- package/test/unit/spec/meeting/index.js +6821 -2172
- package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
- package/test/unit/spec/meeting/muteState.js +402 -212
- package/test/unit/spec/meeting/request.js +473 -54
- package/test/unit/spec/meeting/utils.js +773 -67
- package/test/unit/spec/meeting-info/index.js +300 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +526 -5
- package/test/unit/spec/meeting-info/utilv2.js +21 -0
- package/test/unit/spec/meetings/collection.js +26 -0
- package/test/unit/spec/meetings/index.js +1415 -213
- package/test/unit/spec/meetings/utils.js +229 -2
- package/test/unit/spec/member/index.js +61 -6
- package/test/unit/spec/member/util.js +510 -34
- package/test/unit/spec/members/index.js +432 -1
- package/test/unit/spec/members/request.js +206 -27
- package/test/unit/spec/members/utils.js +210 -0
- package/test/unit/spec/metrics/index.js +1 -50
- package/test/unit/spec/multistream/mediaRequestManager.ts +781 -114
- package/test/unit/spec/multistream/receiveSlot.ts +9 -1
- package/test/unit/spec/multistream/receiveSlotManager.ts +32 -30
- package/test/unit/spec/multistream/remoteMedia.ts +2 -0
- package/test/unit/spec/multistream/remoteMediaGroup.ts +345 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +525 -0
- package/test/unit/spec/multistream/sendSlotManager.ts +274 -0
- package/test/unit/spec/reachability/clusterReachability.ts +279 -0
- package/test/unit/spec/reachability/index.ts +551 -14
- package/test/unit/spec/reachability/request.js +3 -1
- package/test/unit/spec/reachability/util.ts +40 -0
- package/test/unit/spec/reconnection-manager/index.js +171 -11
- package/test/unit/spec/recording-controller/index.js +294 -218
- package/test/unit/spec/recording-controller/util.js +223 -96
- package/test/unit/spec/roap/index.ts +180 -83
- package/test/unit/spec/roap/request.ts +100 -62
- package/test/unit/spec/roap/turnDiscovery.ts +388 -96
- package/test/unit/spec/rtcMetrics/index.ts +122 -0
- package/test/unit/spec/stats-analyzer/index.js +1252 -12
- package/test/unit/spec/webinar/collection.ts +13 -0
- package/test/unit/spec/webinar/index.ts +60 -0
- package/test/utils/integrationTestUtils.js +46 -0
- package/test/utils/testUtils.js +0 -57
- package/test/utils/webex-test-users.js +12 -4
- package/dist/metrics/config.js +0 -289
- package/dist/metrics/config.js.map +0 -1
- package/dist/types/metrics/config.d.ts +0 -169
- package/src/index.js +0 -18
- package/src/metrics/config.ts +0 -485
|
@@ -5,8 +5,10 @@ import TurnDiscovery from '@webex/plugin-meetings/src/roap/turnDiscovery';
|
|
|
5
5
|
import Metrics from '@webex/plugin-meetings/src/metrics';
|
|
6
6
|
import BEHAVIORAL_METRICS from '@webex/plugin-meetings/src/metrics/constants';
|
|
7
7
|
import RoapRequest from '@webex/plugin-meetings/src/roap/request';
|
|
8
|
+
import MeetingUtil from '@webex/plugin-meetings/src/meeting/util';
|
|
8
9
|
|
|
9
10
|
import testUtils from '../../../utils/testUtils';
|
|
11
|
+
import { IP_VERSION } from '../../../../src/constants';
|
|
10
12
|
|
|
11
13
|
describe('TurnDiscovery', () => {
|
|
12
14
|
let clock;
|
|
@@ -23,6 +25,7 @@ describe('TurnDiscovery', () => {
|
|
|
23
25
|
clock = sinon.useFakeTimers();
|
|
24
26
|
|
|
25
27
|
sinon.stub(Metrics, 'sendBehavioralMetric');
|
|
28
|
+
sinon.stub(MeetingUtil, 'getIpVersion').returns(IP_VERSION.unknown);
|
|
26
29
|
|
|
27
30
|
mockRoapRequest = {
|
|
28
31
|
sendRoap: sinon.fake.resolves({mediaConnections: FAKE_MEDIA_CONNECTIONS_FROM_LOCUS}),
|
|
@@ -30,11 +33,6 @@ describe('TurnDiscovery', () => {
|
|
|
30
33
|
|
|
31
34
|
testMeeting = {
|
|
32
35
|
id: 'fake meeting id',
|
|
33
|
-
config: {
|
|
34
|
-
experimental: {
|
|
35
|
-
enableTurnDiscovery: true,
|
|
36
|
-
},
|
|
37
|
-
},
|
|
38
36
|
correlationId: 'fake correlation id',
|
|
39
37
|
selfUrl: 'fake self url',
|
|
40
38
|
mediaId: 'fake media id',
|
|
@@ -50,8 +48,11 @@ describe('TurnDiscovery', () => {
|
|
|
50
48
|
testMeeting.roapSeq = newSeq;
|
|
51
49
|
}),
|
|
52
50
|
updateMediaConnections: sinon.stub(),
|
|
53
|
-
webex: {meetings: {reachability: {
|
|
54
|
-
|
|
51
|
+
webex: {meetings: {reachability: {
|
|
52
|
+
isAnyPublicClusterReachable: () => Promise.resolve(false),
|
|
53
|
+
}}},
|
|
54
|
+
isMultistream: false,
|
|
55
|
+
locusMediaRequest: { fake: true },
|
|
55
56
|
};
|
|
56
57
|
});
|
|
57
58
|
|
|
@@ -68,30 +69,28 @@ describe('TurnDiscovery', () => {
|
|
|
68
69
|
await testUtils.flushPromises();
|
|
69
70
|
|
|
70
71
|
assert.calledOnce(mockRoapRequest.sendRoap);
|
|
71
|
-
|
|
72
|
+
|
|
73
|
+
const expectedSendRoapArgs: any = {
|
|
72
74
|
roapMessage: {
|
|
73
75
|
messageType,
|
|
74
76
|
version: '2',
|
|
75
77
|
seq: expectedSeq,
|
|
76
78
|
},
|
|
77
|
-
correlationId: testMeeting.correlationId,
|
|
78
79
|
locusSelfUrl: testMeeting.selfUrl,
|
|
79
80
|
mediaId: expectedMediaId,
|
|
80
|
-
audioMuted: testMeeting.audio?.isLocallyMuted(),
|
|
81
|
-
videoMuted: testMeeting.video?.isLocallyMuted(),
|
|
82
81
|
meetingId: testMeeting.id,
|
|
83
|
-
|
|
84
|
-
}
|
|
82
|
+
locusMediaRequest: testMeeting.locusMediaRequest,
|
|
83
|
+
};
|
|
85
84
|
|
|
86
85
|
if (messageType === 'TURN_DISCOVERY_REQUEST') {
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
assert.calledWith(testMeeting.updateMediaConnections, FAKE_MEDIA_CONNECTIONS_FROM_LOCUS);
|
|
86
|
+
expectedSendRoapArgs.ipVersion = 0;
|
|
87
|
+
expectedSendRoapArgs.roapMessage.headers = ['includeAnswerInHttpResponse', 'noOkInTransaction'];
|
|
90
88
|
}
|
|
89
|
+
|
|
90
|
+
assert.calledWith(mockRoapRequest.sendRoap, expectedSendRoapArgs);
|
|
91
91
|
};
|
|
92
92
|
|
|
93
93
|
const checkFailureMetricsSent = () => {
|
|
94
|
-
assert.calledOnce(Metrics.sendBehavioralMetric);
|
|
95
94
|
assert.calledWith(
|
|
96
95
|
Metrics.sendBehavioralMetric,
|
|
97
96
|
BEHAVIORAL_METRICS.TURN_DISCOVERY_FAILURE,
|
|
@@ -102,45 +101,318 @@ describe('TurnDiscovery', () => {
|
|
|
102
101
|
);
|
|
103
102
|
};
|
|
104
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
|
+
|
|
105
116
|
describe('doTurnDiscovery', () => {
|
|
106
|
-
[false, true].forEach(function (enabledMultistream
|
|
107
|
-
|
|
108
|
-
|
|
117
|
+
[false, true].forEach(function (enabledMultistream) {
|
|
118
|
+
describe('when Multistream is ' + (enabledMultistream ? 'enabled' : 'disabled'), () => {
|
|
119
|
+
beforeEach(() => {
|
|
120
|
+
testMeeting.isMultistream = enabledMultistream;
|
|
121
|
+
});
|
|
109
122
|
|
|
110
|
-
|
|
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
|
+
});
|
|
111
192
|
|
|
112
|
-
|
|
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
|
+
});
|
|
113
227
|
|
|
114
|
-
|
|
115
|
-
|
|
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
|
+
});
|
|
116
253
|
|
|
117
|
-
|
|
118
|
-
|
|
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
|
+
});
|
|
119
285
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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();
|
|
307
|
+
});
|
|
308
|
+
|
|
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
|
+
});
|
|
127
348
|
});
|
|
128
349
|
|
|
129
|
-
|
|
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
|
+
});
|
|
130
359
|
|
|
131
|
-
|
|
132
|
-
|
|
360
|
+
const td = new TurnDiscovery(mockRoapRequest);
|
|
361
|
+
const result = td.doTurnDiscovery(testMeeting, false);
|
|
133
362
|
|
|
134
|
-
|
|
363
|
+
// check that TURN_DISCOVERY_REQUEST was sent
|
|
364
|
+
await checkRoapMessageSent('TURN_DISCOVERY_REQUEST', 0);
|
|
135
365
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
366
|
+
// @ts-ignore
|
|
367
|
+
mockRoapRequest.sendRoap.resetHistory();
|
|
368
|
+
|
|
369
|
+
await checkResult(result, undefined, undefined);
|
|
140
370
|
});
|
|
371
|
+
});
|
|
372
|
+
});
|
|
141
373
|
|
|
142
|
-
|
|
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);
|
|
385
|
+
|
|
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,
|
|
143
411
|
});
|
|
412
|
+
assert.isUndefined(turnDiscoverySkippedReason);
|
|
413
|
+
|
|
414
|
+
// restore previous callback
|
|
415
|
+
testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = prev;
|
|
144
416
|
});
|
|
145
417
|
|
|
146
418
|
it('sends TURN_DISCOVERY_REQUEST with empty mediaId when isReconnecting is true', async () => {
|
|
@@ -156,13 +428,17 @@ describe('TurnDiscovery', () => {
|
|
|
156
428
|
mockRoapRequest.sendRoap.resetHistory();
|
|
157
429
|
|
|
158
430
|
// simulate the response
|
|
159
|
-
td.handleTurnDiscoveryResponse(
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
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
|
+
);
|
|
166
442
|
|
|
167
443
|
await testUtils.flushPromises();
|
|
168
444
|
|
|
@@ -189,16 +465,20 @@ describe('TurnDiscovery', () => {
|
|
|
189
465
|
mockRoapRequest.sendRoap.resetHistory();
|
|
190
466
|
|
|
191
467
|
// simulate the response with some extra headers
|
|
192
|
-
td.handleTurnDiscoveryResponse(
|
|
193
|
-
|
|
194
|
-
'
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
+
);
|
|
202
482
|
|
|
203
483
|
await testUtils.flushPromises();
|
|
204
484
|
|
|
@@ -214,24 +494,6 @@ describe('TurnDiscovery', () => {
|
|
|
214
494
|
assert.isUndefined(turnDiscoverySkippedReason);
|
|
215
495
|
});
|
|
216
496
|
|
|
217
|
-
it('resolves with undefined if turn discovery feature is disabled in config', async () => {
|
|
218
|
-
const prevConfigValue = testMeeting.config.experimental.enableTurnDiscovery;
|
|
219
|
-
|
|
220
|
-
testMeeting.config.experimental.enableTurnDiscovery = false;
|
|
221
|
-
// @ts-ignore
|
|
222
|
-
const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
|
|
223
|
-
|
|
224
|
-
const {turnServerInfo, turnDiscoverySkippedReason} = result;
|
|
225
|
-
|
|
226
|
-
assert.isUndefined(turnServerInfo);
|
|
227
|
-
assert.equal(turnDiscoverySkippedReason, 'config');
|
|
228
|
-
assert.notCalled(mockRoapRequest.sendRoap);
|
|
229
|
-
assert.notCalled(Metrics.sendBehavioralMetric);
|
|
230
|
-
|
|
231
|
-
// restore previous config
|
|
232
|
-
testMeeting.config.experimental.enableTurnDiscovery = prevConfigValue;
|
|
233
|
-
});
|
|
234
|
-
|
|
235
497
|
it('resolves with undefined if sending the request fails', async () => {
|
|
236
498
|
const td = new TurnDiscovery(mockRoapRequest);
|
|
237
499
|
|
|
@@ -247,8 +509,9 @@ describe('TurnDiscovery', () => {
|
|
|
247
509
|
});
|
|
248
510
|
|
|
249
511
|
it('resolves with undefined when cluster is reachable', async () => {
|
|
250
|
-
const prev = testMeeting.webex.meetings.reachability.
|
|
251
|
-
testMeeting.webex.meetings.reachability.
|
|
512
|
+
const prev = testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable;
|
|
513
|
+
testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = () =>
|
|
514
|
+
Promise.resolve(true);
|
|
252
515
|
const result = await new TurnDiscovery(mockRoapRequest).doTurnDiscovery(testMeeting);
|
|
253
516
|
|
|
254
517
|
const {turnServerInfo, turnDiscoverySkippedReason} = result;
|
|
@@ -257,7 +520,7 @@ describe('TurnDiscovery', () => {
|
|
|
257
520
|
assert.equal(turnDiscoverySkippedReason, 'reachability');
|
|
258
521
|
assert.notCalled(mockRoapRequest.sendRoap);
|
|
259
522
|
assert.notCalled(Metrics.sendBehavioralMetric);
|
|
260
|
-
testMeeting.webex.meetings.reachability.
|
|
523
|
+
testMeeting.webex.meetings.reachability.isAnyPublicClusterReachable = prev;
|
|
261
524
|
});
|
|
262
525
|
|
|
263
526
|
it("resolves with undefined if we don't get a response within 10s", async () => {
|
|
@@ -282,12 +545,16 @@ describe('TurnDiscovery', () => {
|
|
|
282
545
|
await testUtils.flushPromises();
|
|
283
546
|
|
|
284
547
|
// simulate the response without the password
|
|
285
|
-
td.handleTurnDiscoveryResponse(
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
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
|
+
);
|
|
291
558
|
await testUtils.flushPromises();
|
|
292
559
|
const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
|
|
293
560
|
|
|
@@ -303,7 +570,7 @@ describe('TurnDiscovery', () => {
|
|
|
303
570
|
await testUtils.flushPromises();
|
|
304
571
|
|
|
305
572
|
// simulate the response without the headers
|
|
306
|
-
td.handleTurnDiscoveryResponse({});
|
|
573
|
+
td.handleTurnDiscoveryResponse({messageType: 'TURN_DISCOVERY_RESPONSE'}, 'from test');
|
|
307
574
|
|
|
308
575
|
await testUtils.flushPromises();
|
|
309
576
|
const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
|
|
@@ -320,7 +587,10 @@ describe('TurnDiscovery', () => {
|
|
|
320
587
|
await testUtils.flushPromises();
|
|
321
588
|
|
|
322
589
|
// simulate the response without the headers
|
|
323
|
-
td.handleTurnDiscoveryResponse(
|
|
590
|
+
td.handleTurnDiscoveryResponse(
|
|
591
|
+
{messageType: 'TURN_DISCOVERY_RESPONSE', headers: []},
|
|
592
|
+
'from test'
|
|
593
|
+
);
|
|
324
594
|
|
|
325
595
|
await testUtils.flushPromises();
|
|
326
596
|
const {turnServerInfo, turnDiscoverySkippedReason} = await turnDiscoveryPromise;
|
|
@@ -346,13 +616,17 @@ describe('TurnDiscovery', () => {
|
|
|
346
616
|
mockRoapRequest.sendRoap = sinon.fake.rejects(new Error('fake error'));
|
|
347
617
|
|
|
348
618
|
// simulate the response
|
|
349
|
-
td.handleTurnDiscoveryResponse(
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
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
|
+
);
|
|
356
630
|
|
|
357
631
|
await testUtils.flushPromises();
|
|
358
632
|
|
|
@@ -367,6 +641,23 @@ describe('TurnDiscovery', () => {
|
|
|
367
641
|
});
|
|
368
642
|
});
|
|
369
643
|
|
|
644
|
+
describe('isSkipped', () => {
|
|
645
|
+
[
|
|
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);
|
|
651
|
+
|
|
652
|
+
const td = new TurnDiscovery(mockRoapRequest);
|
|
653
|
+
|
|
654
|
+
const isSkipped = await td.isSkipped(testMeeting);
|
|
655
|
+
|
|
656
|
+
assert.equal(isSkipped, expectedIsSkipped);
|
|
657
|
+
})
|
|
658
|
+
})
|
|
659
|
+
})
|
|
660
|
+
|
|
370
661
|
describe('handleTurnDiscoveryResponse', () => {
|
|
371
662
|
it("doesn't do anything if turn discovery was not started", () => {
|
|
372
663
|
const td = new TurnDiscovery(mockRoapRequest);
|
|
@@ -374,12 +665,13 @@ describe('TurnDiscovery', () => {
|
|
|
374
665
|
// there is not much we can check, but we mainly want to make
|
|
375
666
|
// sure that it doesn't crash
|
|
376
667
|
td.handleTurnDiscoveryResponse({
|
|
668
|
+
messageType: 'TURN_DISCOVERY_RESPONSE',
|
|
377
669
|
headers: [
|
|
378
670
|
`x-cisco-turn-url=${FAKE_TURN_URL}`,
|
|
379
671
|
`x-cisco-turn-username=${FAKE_TURN_USERNAME}`,
|
|
380
672
|
`x-cisco-turn-password=${FAKE_TURN_PASSWORD}`,
|
|
381
673
|
],
|
|
382
|
-
});
|
|
674
|
+
}, 'from test');
|
|
383
675
|
|
|
384
676
|
assert.notCalled(mockRoapRequest.sendRoap);
|
|
385
677
|
});
|