@webex/plugin-meetings 3.0.0-beta.41 → 3.0.0-beta.410
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 +625 -123
- package/dist/breakouts/index.js.map +1 -1
- package/dist/breakouts/utils.js +27 -8
- 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 +6 -10
- package/dist/config.js.map +1 -1
- package/dist/constants.js +247 -34
- 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 +116 -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 +4531 -2994
- 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 +236 -136
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +189 -155
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +676 -417
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting/voicea-meeting.js +172 -0
- package/dist/meeting/voicea-meeting.js.map +1 -0
- 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 +201 -57
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/util.js +8 -7
- package/dist/meeting-info/util.js.map +1 -1
- package/dist/meeting-info/utilv2.js +44 -40
- 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 +57 -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 +100 -5
- 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 +66 -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 +407 -79
- 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 +389 -304
- 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 +9 -2
- 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 +204 -32
- 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 +630 -505
- package/dist/types/meeting/locusMediaRequest.d.ts +74 -0
- package/dist/types/meeting/muteState.d.ts +88 -26
- package/dist/types/meeting/request.d.ts +67 -43
- package/dist/types/meeting/util.d.ts +117 -1
- package/dist/types/meeting/voicea-meeting.d.ts +16 -0
- 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 +71 -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 +61 -2
- package/dist/types/multistream/sendSlotManager.d.ts +69 -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 +11 -2
- package/dist/types/roap/request.d.ts +9 -8
- package/dist/types/roap/turnDiscovery.d.ts +90 -9
- 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 +27 -6
- package/src/breakouts/breakout.ts +67 -9
- package/src/breakouts/events.ts +56 -0
- package/src/breakouts/index.ts +494 -73
- package/src/breakouts/utils.ts +26 -8
- 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 +6 -13
- package/src/constants.ts +234 -22
- 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 +45 -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 +3929 -2622
- package/src/meeting/locusMediaRequest.ts +313 -0
- package/src/meeting/muteState.ts +237 -136
- package/src/meeting/request.ts +173 -122
- package/src/meeting/util.ts +690 -395
- package/src/meeting/voicea-meeting.ts +122 -0
- package/src/meeting-info/index.ts +81 -8
- package/src/meeting-info/meeting-info-v2.ts +166 -16
- package/src/meeting-info/util.ts +13 -10
- package/src/meeting-info/utilv2.ts +47 -37
- 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 +57 -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 +133 -7
- 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 -45
- package/src/multistream/sendSlotManager.ts +198 -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 +76 -25
- package/src/roap/request.ts +48 -67
- package/src/roap/turnDiscovery.ts +331 -67
- package/src/rtcMetrics/constants.ts +3 -0
- package/src/rtcMetrics/index.ts +166 -0
- package/src/statsAnalyzer/index.ts +496 -419
- 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 +321 -262
- 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 +119 -28
- package/test/unit/spec/breakouts/events.ts +89 -0
- package/test/unit/spec/breakouts/index.ts +1204 -118
- package/test/unit/spec/breakouts/utils.js +27 -2
- 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 +1372 -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 +203 -17
- package/test/unit/spec/media/index.ts +178 -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 +7835 -2501
- package/test/unit/spec/meeting/locusMediaRequest.ts +442 -0
- package/test/unit/spec/meeting/muteState.js +549 -207
- package/test/unit/spec/meeting/request.js +494 -54
- package/test/unit/spec/meeting/utils.js +827 -74
- package/test/unit/spec/meeting/voicea-meeting.ts +266 -0
- package/test/unit/spec/meeting-info/index.js +300 -0
- package/test/unit/spec/meeting-info/meetinginfov2.js +535 -9
- 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 +1489 -219
- 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 +2 -52
- package/test/unit/spec/multistream/mediaRequestManager.ts +782 -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 +344 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +524 -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 +293 -218
- package/test/unit/spec/recording-controller/util.js +223 -96
- package/test/unit/spec/roap/index.ts +233 -81
- package/test/unit/spec/roap/request.ts +100 -62
- package/test/unit/spec/roap/turnDiscovery.ts +682 -108
- package/test/unit/spec/rtcMetrics/index.ts +122 -0
- package/test/unit/spec/stats-analyzer/index.js +1431 -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
|
@@ -4,10 +4,11 @@ import {Defer} from '@webex/common';
|
|
|
4
4
|
import Metrics from '../metrics';
|
|
5
5
|
import BEHAVIORAL_METRICS from '../metrics/constants';
|
|
6
6
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
7
|
-
import {ROAP} from '../constants';
|
|
7
|
+
import {ROAP, Enum} from '../constants';
|
|
8
8
|
|
|
9
9
|
import RoapRequest from './request';
|
|
10
10
|
import Meeting from '../meeting';
|
|
11
|
+
import MeetingUtil from '../meeting/util';
|
|
11
12
|
|
|
12
13
|
const TURN_DISCOVERY_TIMEOUT = 10; // in seconds
|
|
13
14
|
|
|
@@ -17,6 +18,28 @@ const TURN_DISCOVERY_TIMEOUT = 10; // in seconds
|
|
|
17
18
|
// and do the SDP offer with seq=1
|
|
18
19
|
const TURN_DISCOVERY_SEQ = 0;
|
|
19
20
|
|
|
21
|
+
const TurnDiscoverySkipReason = {
|
|
22
|
+
missingHttpResponse: 'missing http response', // when we asked for the TURN discovery response to be in the http response, but it wasn't there
|
|
23
|
+
reachability: 'reachability', // when udp reachability to public clusters is ok, so we don't need TURN (this doens't apply when joinWithMedia() is used)
|
|
24
|
+
alreadyInProgress: 'already in progress', // when we try to start TURN discovery while it's already in progress
|
|
25
|
+
} as const;
|
|
26
|
+
|
|
27
|
+
export type TurnDiscoverySkipReason =
|
|
28
|
+
| Enum<typeof TurnDiscoverySkipReason> // this is a kind of FYI, because in practice typescript will infer the type of TurnDiscoverySkipReason as a string
|
|
29
|
+
| string // used in case of errors, contains the error message
|
|
30
|
+
| undefined; // used when TURN discovery is not skipped
|
|
31
|
+
|
|
32
|
+
export type TurnServerInfo = {
|
|
33
|
+
url: string;
|
|
34
|
+
username: string;
|
|
35
|
+
password: string;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export type TurnDiscoveryResult = {
|
|
39
|
+
turnServerInfo?: TurnServerInfo;
|
|
40
|
+
turnDiscoverySkippedReason: TurnDiscoverySkipReason;
|
|
41
|
+
};
|
|
42
|
+
|
|
20
43
|
/**
|
|
21
44
|
* Handles the process of finding out TURN server information from Linus.
|
|
22
45
|
* This is achieved by sending a TURN_DISCOVERY_REQUEST.
|
|
@@ -26,11 +49,7 @@ export default class TurnDiscovery {
|
|
|
26
49
|
|
|
27
50
|
private defer?: Defer; // used for waiting for the response
|
|
28
51
|
|
|
29
|
-
private turnInfo:
|
|
30
|
-
url: string;
|
|
31
|
-
username: string;
|
|
32
|
-
password: string;
|
|
33
|
-
};
|
|
52
|
+
private turnInfo: TurnServerInfo;
|
|
34
53
|
|
|
35
54
|
private responseTimer?: ReturnType<typeof setTimeout>;
|
|
36
55
|
|
|
@@ -55,7 +74,7 @@ export default class TurnDiscovery {
|
|
|
55
74
|
* @private
|
|
56
75
|
* @memberof Roap
|
|
57
76
|
*/
|
|
58
|
-
private waitForTurnDiscoveryResponse() {
|
|
77
|
+
private waitForTurnDiscoveryResponse(): Promise<{isOkRequired: boolean}> {
|
|
59
78
|
if (!this.defer) {
|
|
60
79
|
LoggerProxy.logger.warn(
|
|
61
80
|
'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> TURN discovery is not in progress'
|
|
@@ -84,25 +103,36 @@ export default class TurnDiscovery {
|
|
|
84
103
|
}
|
|
85
104
|
|
|
86
105
|
/**
|
|
87
|
-
*
|
|
106
|
+
* Handles TURN_DISCOVERY_RESPONSE roap message. Use it if the roap message comes over the websocket,
|
|
107
|
+
* otherwise use handleTurnDiscoveryHttpResponse() if it comes in the http response.
|
|
88
108
|
*
|
|
89
109
|
* @param {Object} roapMessage
|
|
110
|
+
* @param {string} from string to indicate how we got the response (used just for logging)
|
|
90
111
|
* @returns {void}
|
|
91
112
|
* @public
|
|
92
113
|
* @memberof Roap
|
|
93
114
|
*/
|
|
94
|
-
public handleTurnDiscoveryResponse(roapMessage:
|
|
95
|
-
// @ts-ignore - Fix missing type
|
|
115
|
+
public handleTurnDiscoveryResponse(roapMessage: any, from: string) {
|
|
96
116
|
const {headers} = roapMessage;
|
|
97
117
|
|
|
98
118
|
if (!this.defer) {
|
|
99
119
|
LoggerProxy.logger.warn(
|
|
100
|
-
|
|
120
|
+
`Roap:turnDiscovery#handleTurnDiscoveryResponse --> unexpected TURN discovery response ${from}`
|
|
101
121
|
);
|
|
102
122
|
|
|
103
123
|
return;
|
|
104
124
|
}
|
|
105
125
|
|
|
126
|
+
if (roapMessage.messageType !== ROAP.ROAP_TYPES.TURN_DISCOVERY_RESPONSE) {
|
|
127
|
+
this.defer.reject(
|
|
128
|
+
new Error(
|
|
129
|
+
`TURN_DISCOVERY_RESPONSE ${from} has unexpected messageType: ${JSON.stringify(
|
|
130
|
+
roapMessage
|
|
131
|
+
)}`
|
|
132
|
+
)
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
|
|
106
136
|
const expectedHeaders = [
|
|
107
137
|
{headerName: 'x-cisco-turn-url', field: 'url'},
|
|
108
138
|
{headerName: 'x-cisco-turn-username', field: 'username'},
|
|
@@ -128,21 +158,212 @@ export default class TurnDiscovery {
|
|
|
128
158
|
|
|
129
159
|
if (foundHeaders !== expectedHeaders.length) {
|
|
130
160
|
LoggerProxy.logger.warn(
|
|
131
|
-
`Roap:turnDiscovery#handleTurnDiscoveryResponse --> missing some headers, received: ${JSON.stringify(
|
|
161
|
+
`Roap:turnDiscovery#handleTurnDiscoveryResponse --> missing some headers, received ${from}: ${JSON.stringify(
|
|
132
162
|
headers
|
|
133
163
|
)}`
|
|
134
164
|
);
|
|
135
165
|
this.defer.reject(
|
|
136
|
-
new Error(
|
|
166
|
+
new Error(
|
|
167
|
+
`TURN_DISCOVERY_RESPONSE ${from} missing some headers: ${JSON.stringify(headers)}`
|
|
168
|
+
)
|
|
137
169
|
);
|
|
138
170
|
} else {
|
|
139
171
|
LoggerProxy.logger.info(
|
|
140
|
-
`Roap:turnDiscovery#handleTurnDiscoveryResponse --> received a valid response, url=${this.turnInfo.url}`
|
|
172
|
+
`Roap:turnDiscovery#handleTurnDiscoveryResponse --> received a valid response ${from}, url=${this.turnInfo.url}`
|
|
141
173
|
);
|
|
142
|
-
|
|
174
|
+
|
|
175
|
+
this.defer.resolve({isOkRequired: !headers?.includes('noOkInTransaction')});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Generates TURN_DISCOVERY_REQUEST roap message. When this method returns a roapMessage, it means that a TURN discovery process has started.
|
|
181
|
+
* It needs be ended by calling handleTurnDiscoveryHttpResponse() once you get a response from the backend. If you don't get any response
|
|
182
|
+
* or want to abort, you need to call abort().
|
|
183
|
+
*
|
|
184
|
+
* @param {Meeting} meeting
|
|
185
|
+
* @param {boolean} isForced
|
|
186
|
+
* @returns {Object}
|
|
187
|
+
*/
|
|
188
|
+
public async generateTurnDiscoveryRequestMessage(
|
|
189
|
+
meeting: Meeting,
|
|
190
|
+
isForced: boolean
|
|
191
|
+
): Promise<{roapMessage?: object; turnDiscoverySkippedReason: TurnDiscoverySkipReason}> {
|
|
192
|
+
if (this.defer) {
|
|
193
|
+
LoggerProxy.logger.warn(
|
|
194
|
+
'Roap:turnDiscovery#generateTurnDiscoveryRequestMessage --> TURN discovery already in progress'
|
|
195
|
+
);
|
|
196
|
+
|
|
197
|
+
return {
|
|
198
|
+
roapMessage: undefined,
|
|
199
|
+
turnDiscoverySkippedReason: TurnDiscoverySkipReason.alreadyInProgress,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
let turnDiscoverySkippedReason: TurnDiscoverySkipReason;
|
|
204
|
+
|
|
205
|
+
if (!isForced) {
|
|
206
|
+
turnDiscoverySkippedReason = await this.getSkipReason(meeting);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if (turnDiscoverySkippedReason) {
|
|
210
|
+
return {roapMessage: undefined, turnDiscoverySkippedReason};
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
this.defer = new Defer();
|
|
214
|
+
|
|
215
|
+
const roapMessage = {
|
|
216
|
+
messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,
|
|
217
|
+
version: ROAP.ROAP_VERSION,
|
|
218
|
+
seq: TURN_DISCOVERY_SEQ,
|
|
219
|
+
headers: ['includeAnswerInHttpResponse', 'noOkInTransaction'],
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
LoggerProxy.logger.info(
|
|
223
|
+
'Roap:turnDiscovery#generateTurnDiscoveryRequestMessage --> generated TURN_DISCOVERY_REQUEST message'
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
return {roapMessage, turnDiscoverySkippedReason: undefined};
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Handles any errors that occur during TURN discovery without re-throwing them.
|
|
231
|
+
*
|
|
232
|
+
* @param {Meeting} meeting
|
|
233
|
+
* @param {Error} error
|
|
234
|
+
* @returns {TurnDiscoveryResult}
|
|
235
|
+
*/
|
|
236
|
+
private handleTurnDiscoveryFailure(meeting: Meeting, error: Error): TurnDiscoveryResult {
|
|
237
|
+
// we catch any errors and resolve with no turn information so that the normal call join flow can continue without TURN
|
|
238
|
+
LoggerProxy.logger.info(
|
|
239
|
+
`Roap:turnDiscovery#doTurnDiscovery --> TURN discovery failed, continuing without TURN: ${error}`
|
|
240
|
+
);
|
|
241
|
+
|
|
242
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_FAILURE, {
|
|
243
|
+
correlation_id: meeting.correlationId,
|
|
244
|
+
locus_id: meeting.locusUrl.split('/').pop(),
|
|
245
|
+
reason: error.message,
|
|
246
|
+
stack: error.stack,
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
return {turnServerInfo: undefined, turnDiscoverySkippedReason: `failure: ${error.message}`};
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Handles TURN_DISCOVERY_RESPONSE roap message that came in http response. If the response is not valid,
|
|
254
|
+
* it returns an object with turnServerInfo set to undefined. In that case you need to call abort()
|
|
255
|
+
* to end the TURN discovery process.
|
|
256
|
+
*
|
|
257
|
+
* @param {Meeting} meeting
|
|
258
|
+
* @param {Object|undefined} httpResponse can be undefined to indicate that we didn't get the response
|
|
259
|
+
* @returns {Promise<TurnDiscoveryResult>}
|
|
260
|
+
* @memberof Roap
|
|
261
|
+
*/
|
|
262
|
+
public async handleTurnDiscoveryHttpResponse(
|
|
263
|
+
meeting: Meeting,
|
|
264
|
+
httpResponse?: object
|
|
265
|
+
): Promise<TurnDiscoveryResult> {
|
|
266
|
+
if (!this.defer) {
|
|
267
|
+
LoggerProxy.logger.warn(
|
|
268
|
+
'Roap:turnDiscovery#handleTurnDiscoveryHttpResponse --> unexpected http response, TURN discovery is not in progress'
|
|
269
|
+
);
|
|
270
|
+
|
|
271
|
+
throw new Error(
|
|
272
|
+
'handleTurnDiscoveryHttpResponse() called before generateTurnDiscoveryRequestMessage()'
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
if (httpResponse === undefined) {
|
|
277
|
+
return {
|
|
278
|
+
turnServerInfo: undefined,
|
|
279
|
+
turnDiscoverySkippedReason: TurnDiscoverySkipReason.missingHttpResponse,
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
try {
|
|
284
|
+
const roapMessage = this.parseHttpTurnDiscoveryResponse(meeting, httpResponse);
|
|
285
|
+
|
|
286
|
+
if (!roapMessage) {
|
|
287
|
+
return {
|
|
288
|
+
turnServerInfo: undefined,
|
|
289
|
+
turnDiscoverySkippedReason: TurnDiscoverySkipReason.missingHttpResponse,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
this.handleTurnDiscoveryResponse(roapMessage, 'in http response');
|
|
294
|
+
|
|
295
|
+
const {isOkRequired} = await this.defer.promise;
|
|
296
|
+
|
|
297
|
+
if (isOkRequired) {
|
|
298
|
+
await this.sendRoapOK(meeting);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
this.defer = undefined;
|
|
302
|
+
|
|
303
|
+
LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');
|
|
304
|
+
|
|
305
|
+
return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};
|
|
306
|
+
} catch (error) {
|
|
307
|
+
this.abort();
|
|
308
|
+
|
|
309
|
+
return this.handleTurnDiscoveryFailure(meeting, error);
|
|
143
310
|
}
|
|
144
311
|
}
|
|
145
312
|
|
|
313
|
+
/**
|
|
314
|
+
* Aborts current TURN discovery. This method needs to be called if you called generateTurnDiscoveryRequestMessage(),
|
|
315
|
+
* but then never got any response from the server.
|
|
316
|
+
* @returns {void}
|
|
317
|
+
*/
|
|
318
|
+
public abort() {
|
|
319
|
+
if (this.defer) {
|
|
320
|
+
this.defer.reject(new Error('TURN discovery aborted'));
|
|
321
|
+
this.defer = undefined;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Parses the TURN_DISCOVERY_RESPONSE roap message out of the http response
|
|
327
|
+
* and returns it.
|
|
328
|
+
*
|
|
329
|
+
* @param {Meeting} meeting
|
|
330
|
+
* @param {any} httpResponse
|
|
331
|
+
* @returns {any}
|
|
332
|
+
*/
|
|
333
|
+
private parseHttpTurnDiscoveryResponse(
|
|
334
|
+
meeting: Meeting,
|
|
335
|
+
httpResponse: {mediaConnections?: Array<{remoteSdp?: string}>}
|
|
336
|
+
) {
|
|
337
|
+
let turnDiscoveryResponse;
|
|
338
|
+
|
|
339
|
+
if (httpResponse.mediaConnections?.[0]?.remoteSdp) {
|
|
340
|
+
const remoteSdp = JSON.parse(httpResponse.mediaConnections[0].remoteSdp);
|
|
341
|
+
|
|
342
|
+
if (remoteSdp.roapMessage) {
|
|
343
|
+
// yes, it's misleading that remoteSdp actually contains a TURN discovery response, but that's how the backend works...
|
|
344
|
+
const {seq, messageType, errorType, errorCause, headers} = remoteSdp.roapMessage;
|
|
345
|
+
|
|
346
|
+
turnDiscoveryResponse = {
|
|
347
|
+
seq,
|
|
348
|
+
messageType,
|
|
349
|
+
errorType,
|
|
350
|
+
errorCause,
|
|
351
|
+
headers,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
if (!turnDiscoveryResponse) {
|
|
357
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.ROAP_HTTP_RESPONSE_MISSING, {
|
|
358
|
+
correlationId: meeting.correlationId,
|
|
359
|
+
messageType: 'TURN_DISCOVERY_RESPONSE',
|
|
360
|
+
isMultistream: meeting.isMultistream,
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
return turnDiscoveryResponse;
|
|
365
|
+
}
|
|
366
|
+
|
|
146
367
|
/**
|
|
147
368
|
* sends the TURN_DISCOVERY_REQUEST roap request
|
|
148
369
|
*
|
|
@@ -152,13 +373,19 @@ export default class TurnDiscovery {
|
|
|
152
373
|
* @private
|
|
153
374
|
* @memberof Roap
|
|
154
375
|
*/
|
|
155
|
-
sendRoapTurnDiscoveryRequest(
|
|
376
|
+
private sendRoapTurnDiscoveryRequest(
|
|
377
|
+
meeting: Meeting,
|
|
378
|
+
isReconnecting: boolean
|
|
379
|
+
): Promise<TurnDiscoveryResult> {
|
|
156
380
|
if (this.defer) {
|
|
157
381
|
LoggerProxy.logger.warn(
|
|
158
382
|
'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> already in progress'
|
|
159
383
|
);
|
|
160
384
|
|
|
161
|
-
return Promise.resolve(
|
|
385
|
+
return Promise.resolve({
|
|
386
|
+
turnServerInfo: undefined,
|
|
387
|
+
turnDiscoverySkippedReason: TurnDiscoverySkipReason.alreadyInProgress,
|
|
388
|
+
});
|
|
162
389
|
}
|
|
163
390
|
|
|
164
391
|
this.defer = new Defer();
|
|
@@ -167,6 +394,7 @@ export default class TurnDiscovery {
|
|
|
167
394
|
messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,
|
|
168
395
|
version: ROAP.ROAP_VERSION,
|
|
169
396
|
seq: TURN_DISCOVERY_SEQ,
|
|
397
|
+
headers: ['includeAnswerInHttpResponse', 'noOkInTransaction'],
|
|
170
398
|
};
|
|
171
399
|
|
|
172
400
|
LoggerProxy.logger.info(
|
|
@@ -176,20 +404,23 @@ export default class TurnDiscovery {
|
|
|
176
404
|
return this.roapRequest
|
|
177
405
|
.sendRoap({
|
|
178
406
|
roapMessage,
|
|
179
|
-
correlationId: meeting.correlationId,
|
|
180
407
|
// @ts-ignore - Fix missing type
|
|
181
408
|
locusSelfUrl: meeting.selfUrl,
|
|
182
409
|
// @ts-ignore - Fix missing type
|
|
183
410
|
mediaId: isReconnecting ? '' : meeting.mediaId,
|
|
184
|
-
audioMuted: meeting.audio?.isLocallyMuted(),
|
|
185
|
-
videoMuted: meeting.video?.isLocallyMuted(),
|
|
186
411
|
meetingId: meeting.id,
|
|
187
|
-
|
|
412
|
+
locusMediaRequest: meeting.locusMediaRequest,
|
|
413
|
+
// @ts-ignore - because of meeting.webex
|
|
414
|
+
ipVersion: MeetingUtil.getIpVersion(meeting.webex),
|
|
188
415
|
})
|
|
189
|
-
.then((
|
|
416
|
+
.then(async (response) => {
|
|
417
|
+
const {mediaConnections} = response;
|
|
418
|
+
|
|
190
419
|
if (mediaConnections) {
|
|
191
420
|
meeting.updateMediaConnections(mediaConnections);
|
|
192
421
|
}
|
|
422
|
+
|
|
423
|
+
return this.handleTurnDiscoveryHttpResponse(meeting, response);
|
|
193
424
|
});
|
|
194
425
|
}
|
|
195
426
|
|
|
@@ -201,7 +432,14 @@ export default class TurnDiscovery {
|
|
|
201
432
|
* @returns {Promise}
|
|
202
433
|
*/
|
|
203
434
|
sendRoapOK(meeting: Meeting) {
|
|
204
|
-
LoggerProxy.logger.info(
|
|
435
|
+
LoggerProxy.logger.info(
|
|
436
|
+
'Roap:turnDiscovery#sendRoapOK --> TURN discovery response requires OK, sending it...'
|
|
437
|
+
);
|
|
438
|
+
|
|
439
|
+
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_REQUIRES_OK, {
|
|
440
|
+
correlation_id: meeting.correlationId,
|
|
441
|
+
locus_id: meeting.locusUrl.split('/').pop(),
|
|
442
|
+
});
|
|
205
443
|
|
|
206
444
|
return this.roapRequest.sendRoap({
|
|
207
445
|
roapMessage: {
|
|
@@ -213,14 +451,45 @@ export default class TurnDiscovery {
|
|
|
213
451
|
locusSelfUrl: meeting.selfUrl,
|
|
214
452
|
// @ts-ignore - fix type
|
|
215
453
|
mediaId: meeting.mediaId,
|
|
216
|
-
correlationId: meeting.correlationId,
|
|
217
|
-
audioMuted: meeting.audio?.isLocallyMuted(),
|
|
218
|
-
videoMuted: meeting.video?.isLocallyMuted(),
|
|
219
454
|
meetingId: meeting.id,
|
|
220
|
-
|
|
455
|
+
locusMediaRequest: meeting.locusMediaRequest,
|
|
221
456
|
});
|
|
222
457
|
}
|
|
223
458
|
|
|
459
|
+
/**
|
|
460
|
+
* Gets the reason why reachability is skipped.
|
|
461
|
+
*
|
|
462
|
+
* @param {Meeting} meeting
|
|
463
|
+
* @returns {Promise<string>} Promise with empty string if reachability is not skipped or a reason if it is skipped
|
|
464
|
+
*/
|
|
465
|
+
private async getSkipReason(meeting: Meeting): Promise<TurnDiscoverySkipReason> {
|
|
466
|
+
const isAnyPublicClusterReachable =
|
|
467
|
+
// @ts-ignore - fix type
|
|
468
|
+
await meeting.webex.meetings.reachability.isAnyPublicClusterReachable();
|
|
469
|
+
|
|
470
|
+
if (isAnyPublicClusterReachable) {
|
|
471
|
+
LoggerProxy.logger.info(
|
|
472
|
+
'Roap:turnDiscovery#getSkipReason --> reachability has not failed, skipping TURN discovery'
|
|
473
|
+
);
|
|
474
|
+
|
|
475
|
+
return TurnDiscoverySkipReason.reachability;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
return undefined;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
/**
|
|
482
|
+
* Checks if TURN discovery is skipped.
|
|
483
|
+
*
|
|
484
|
+
* @param {Meeting} meeting
|
|
485
|
+
* @returns {Boolean} true if TURN discovery is being skipped, false if it is being done
|
|
486
|
+
*/
|
|
487
|
+
async isSkipped(meeting) {
|
|
488
|
+
const skipReason = await this.getSkipReason(meeting);
|
|
489
|
+
|
|
490
|
+
return !!skipReason;
|
|
491
|
+
}
|
|
492
|
+
|
|
224
493
|
/**
|
|
225
494
|
* Retrieves TURN server information from the backend by doing
|
|
226
495
|
* a roap message exchange:
|
|
@@ -234,58 +503,53 @@ export default class TurnDiscovery {
|
|
|
234
503
|
* so it works fine no matter if TURN discovery is done or not.
|
|
235
504
|
*
|
|
236
505
|
* @param {Meeting} meeting
|
|
237
|
-
* @param {Boolean} isReconnecting should be set to true if this is a new
|
|
506
|
+
* @param {Boolean} [isReconnecting] should be set to true if this is a new
|
|
238
507
|
* media connection just after a reconnection
|
|
508
|
+
* @param {Boolean} [isForced]
|
|
239
509
|
* @returns {Promise}
|
|
240
510
|
*/
|
|
241
|
-
async doTurnDiscovery(
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
511
|
+
async doTurnDiscovery(
|
|
512
|
+
meeting: Meeting,
|
|
513
|
+
isReconnecting?: boolean,
|
|
514
|
+
isForced?: boolean
|
|
515
|
+
): Promise<TurnDiscoveryResult> {
|
|
516
|
+
let turnDiscoverySkippedReason: TurnDiscoverySkipReason;
|
|
517
|
+
|
|
518
|
+
if (!isForced) {
|
|
519
|
+
turnDiscoverySkippedReason = await this.getSkipReason(meeting);
|
|
520
|
+
}
|
|
249
521
|
|
|
522
|
+
if (turnDiscoverySkippedReason) {
|
|
250
523
|
return {
|
|
251
524
|
turnServerInfo: undefined,
|
|
252
|
-
turnDiscoverySkippedReason
|
|
525
|
+
turnDiscoverySkippedReason,
|
|
253
526
|
};
|
|
254
527
|
}
|
|
255
528
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
LoggerProxy.logger.info(
|
|
259
|
-
'Roap:turnDiscovery#doTurnDiscovery --> TURN discovery disabled in config, skipping it'
|
|
260
|
-
);
|
|
529
|
+
try {
|
|
530
|
+
const turnDiscoveryResult = await this.sendRoapTurnDiscoveryRequest(meeting, isReconnecting);
|
|
261
531
|
|
|
262
|
-
|
|
263
|
-
|
|
532
|
+
if (
|
|
533
|
+
turnDiscoveryResult.turnDiscoverySkippedReason !==
|
|
534
|
+
TurnDiscoverySkipReason.missingHttpResponse
|
|
535
|
+
) {
|
|
536
|
+
return turnDiscoveryResult;
|
|
537
|
+
}
|
|
264
538
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
.then(() => this.sendRoapOK(meeting))
|
|
268
|
-
.then(() => {
|
|
269
|
-
this.defer = undefined;
|
|
539
|
+
// if we haven't got the response over http, we need to wait for it to come over the websocket via Mercury
|
|
540
|
+
const {isOkRequired} = await this.waitForTurnDiscoveryResponse();
|
|
270
541
|
|
|
271
|
-
|
|
542
|
+
if (isOkRequired) {
|
|
543
|
+
await this.sendRoapOK(meeting);
|
|
544
|
+
}
|
|
272
545
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
.
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_FAILURE, {
|
|
282
|
-
correlation_id: meeting.correlationId,
|
|
283
|
-
locus_id: meeting.locusUrl.split('/').pop(),
|
|
284
|
-
reason: e.message,
|
|
285
|
-
stack: e.stack,
|
|
286
|
-
});
|
|
287
|
-
|
|
288
|
-
return {turnServerInfo: undefined, turnDiscoverySkippedReason: undefined};
|
|
289
|
-
});
|
|
546
|
+
this.defer = undefined;
|
|
547
|
+
|
|
548
|
+
LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');
|
|
549
|
+
|
|
550
|
+
return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};
|
|
551
|
+
} catch (e) {
|
|
552
|
+
return this.handleTurnDiscoveryFailure(meeting, e);
|
|
553
|
+
}
|
|
290
554
|
}
|
|
291
555
|
}
|