@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
|
@@ -3,16 +3,58 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
/* eslint-disable class-methods-use-this */
|
|
6
|
-
|
|
7
|
-
import _ from 'lodash';
|
|
6
|
+
import {mapValues} from 'lodash';
|
|
8
7
|
|
|
9
8
|
import LoggerProxy from '../common/logs/logger-proxy';
|
|
10
|
-
import
|
|
9
|
+
import MeetingUtil from '../meeting/util';
|
|
10
|
+
|
|
11
|
+
import {REACHABILITY} from '../constants';
|
|
12
|
+
|
|
13
|
+
import ReachabilityRequest, {ClusterList} from './request';
|
|
14
|
+
import {
|
|
15
|
+
ClusterReachability,
|
|
16
|
+
ClusterReachabilityResult,
|
|
17
|
+
TransportResult,
|
|
18
|
+
} from './clusterReachability';
|
|
19
|
+
|
|
20
|
+
export type ReachabilityMetrics = {
|
|
21
|
+
reachability_public_udp_success: number;
|
|
22
|
+
reachability_public_udp_failed: number;
|
|
23
|
+
reachability_public_tcp_success: number;
|
|
24
|
+
reachability_public_tcp_failed: number;
|
|
25
|
+
reachability_vmn_udp_success: number;
|
|
26
|
+
reachability_vmn_udp_failed: number;
|
|
27
|
+
reachability_vmn_tcp_success: number;
|
|
28
|
+
reachability_vmn_tcp_failed: number;
|
|
29
|
+
};
|
|
11
30
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
31
|
+
/**
|
|
32
|
+
* This is the type that matches what backend expects us to send to them. It is a bit weird, because
|
|
33
|
+
* it uses strings instead of booleans and numbers, but that's what they require.
|
|
34
|
+
*/
|
|
35
|
+
export type TransportResultForBackend = {
|
|
36
|
+
reachable?: 'true' | 'false';
|
|
37
|
+
latencyInMilliseconds?: string;
|
|
38
|
+
clientMediaIPs?: string[];
|
|
39
|
+
untested?: 'true';
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export type ReachabilityResultForBackend = {
|
|
43
|
+
udp: TransportResultForBackend;
|
|
44
|
+
tcp: TransportResultForBackend;
|
|
45
|
+
xtls: TransportResultForBackend;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// this is the type that is required by the backend when we send them reachability results
|
|
49
|
+
export type ReachabilityResultsForBackend = Record<string, ReachabilityResultForBackend>;
|
|
50
|
+
|
|
51
|
+
// this is the type used by Reachability class internally and stored in local storage
|
|
52
|
+
export type ReachabilityResults = Record<
|
|
53
|
+
string,
|
|
54
|
+
ClusterReachabilityResult & {
|
|
55
|
+
isVideoMesh?: boolean;
|
|
56
|
+
}
|
|
57
|
+
>;
|
|
16
58
|
|
|
17
59
|
/**
|
|
18
60
|
* @class Reachability
|
|
@@ -21,8 +63,10 @@ const VIDEO_MESH_TIMEOUT = 1000;
|
|
|
21
63
|
export default class Reachability {
|
|
22
64
|
namespace = REACHABILITY.namespace;
|
|
23
65
|
webex: object;
|
|
24
|
-
reachabilityRequest:
|
|
25
|
-
|
|
66
|
+
reachabilityRequest: ReachabilityRequest;
|
|
67
|
+
clusterReachability: {
|
|
68
|
+
[key: string]: ClusterReachability;
|
|
69
|
+
};
|
|
26
70
|
|
|
27
71
|
/**
|
|
28
72
|
* Creates an instance of Reachability.
|
|
@@ -41,38 +85,24 @@ export default class Reachability {
|
|
|
41
85
|
*/
|
|
42
86
|
this.reachabilityRequest = new ReachabilityRequest(this.webex);
|
|
43
87
|
|
|
44
|
-
|
|
45
|
-
* internal object of clusters latency results
|
|
46
|
-
* @instance
|
|
47
|
-
* @type {object}
|
|
48
|
-
* @private
|
|
49
|
-
* @memberof Reachability
|
|
50
|
-
*/
|
|
51
|
-
this.clusterLatencyResults = {};
|
|
88
|
+
this.clusterReachability = {};
|
|
52
89
|
}
|
|
53
90
|
|
|
54
91
|
/**
|
|
55
|
-
*
|
|
56
|
-
* @returns {
|
|
92
|
+
* Gets a list of media clusters from the backend and performs reachability checks on all the clusters
|
|
93
|
+
* @returns {Promise<ReachabilityResults>} reachability results
|
|
57
94
|
* @public
|
|
58
|
-
* @async
|
|
59
95
|
* @memberof Reachability
|
|
60
96
|
*/
|
|
61
|
-
public async gatherReachability() {
|
|
62
|
-
this.setup();
|
|
63
|
-
|
|
64
|
-
// Remove stored reachability results to ensure no stale data
|
|
65
|
-
// @ts-ignore
|
|
66
|
-
await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageResult);
|
|
67
|
-
// @ts-ignore
|
|
68
|
-
await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageJoinCookie);
|
|
69
|
-
|
|
97
|
+
public async gatherReachability(): Promise<ReachabilityResults> {
|
|
70
98
|
// Fetch clusters and measure latency
|
|
71
99
|
try {
|
|
72
|
-
const {clusters, joinCookie} = await this.reachabilityRequest.getClusters(
|
|
100
|
+
const {clusters, joinCookie} = await this.reachabilityRequest.getClusters(
|
|
101
|
+
MeetingUtil.getIpVersion(this.webex)
|
|
102
|
+
);
|
|
73
103
|
|
|
74
104
|
// Perform Reachability Check
|
|
75
|
-
const results = await this.
|
|
105
|
+
const results = await this.performReachabilityChecks(clusters);
|
|
76
106
|
|
|
77
107
|
// @ts-ignore
|
|
78
108
|
await this.webex.boundedStorage.put(
|
|
@@ -92,145 +122,166 @@ export default class Reachability {
|
|
|
92
122
|
);
|
|
93
123
|
|
|
94
124
|
return results;
|
|
95
|
-
} catch (
|
|
96
|
-
LoggerProxy.logger.error(
|
|
97
|
-
`Reachability:index#gatherReachability --> Error in calling getClusters(): ${getClusterError}`
|
|
98
|
-
);
|
|
125
|
+
} catch (error) {
|
|
126
|
+
LoggerProxy.logger.error(`Reachability:index#gatherReachability --> Error:`, error);
|
|
99
127
|
|
|
100
128
|
return {};
|
|
101
129
|
}
|
|
102
130
|
}
|
|
103
131
|
|
|
104
132
|
/**
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
* @
|
|
133
|
+
* Returns statistics about last reachability results. The returned value is an object
|
|
134
|
+
* with a flat list of properties so that it can be easily sent with metrics
|
|
135
|
+
*
|
|
136
|
+
* @returns {Promise} Promise with metrics values, it never rejects/throws.
|
|
109
137
|
*/
|
|
110
|
-
async
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
138
|
+
async getReachabilityMetrics(): Promise<ReachabilityMetrics> {
|
|
139
|
+
const stats: ReachabilityMetrics = {
|
|
140
|
+
reachability_public_udp_success: 0,
|
|
141
|
+
reachability_public_udp_failed: 0,
|
|
142
|
+
reachability_public_tcp_success: 0,
|
|
143
|
+
reachability_public_tcp_failed: 0,
|
|
144
|
+
reachability_vmn_udp_success: 0,
|
|
145
|
+
reachability_vmn_udp_failed: 0,
|
|
146
|
+
reachability_vmn_tcp_success: 0,
|
|
147
|
+
reachability_vmn_tcp_failed: 0,
|
|
148
|
+
};
|
|
120
149
|
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
150
|
+
const updateStats = (clusterType: 'public' | 'vmn', result: ClusterReachabilityResult) => {
|
|
151
|
+
if (result.udp && result.udp.result !== 'untested') {
|
|
152
|
+
const outcome = result.udp.result === 'reachable' ? 'success' : 'failed';
|
|
153
|
+
stats[`reachability_${clusterType}_udp_${outcome}`] += 1;
|
|
154
|
+
}
|
|
155
|
+
if (result.tcp && result.tcp.result !== 'untested') {
|
|
156
|
+
const outcome = result.tcp.result === 'reachable' ? 'success' : 'failed';
|
|
157
|
+
stats[`reachability_${clusterType}_tcp_${outcome}`] += 1;
|
|
128
158
|
}
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
try {
|
|
162
|
+
// @ts-ignore
|
|
163
|
+
const resultsJson = await this.webex.boundedStorage.get(
|
|
164
|
+
REACHABILITY.namespace,
|
|
165
|
+
REACHABILITY.localStorageResult
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
const results: ReachabilityResults = JSON.parse(resultsJson);
|
|
169
|
+
|
|
170
|
+
Object.values(results).forEach((result) => {
|
|
171
|
+
updateStats(result.isVideoMesh ? 'vmn' : 'public', result);
|
|
172
|
+
});
|
|
173
|
+
} catch (e) {
|
|
174
|
+
// empty storage, that's ok
|
|
175
|
+
LoggerProxy.logger.warn(
|
|
176
|
+
'Roap:request#getReachabilityMetrics --> Error parsing reachability data: ',
|
|
177
|
+
e
|
|
178
|
+
);
|
|
129
179
|
}
|
|
130
180
|
|
|
131
|
-
return
|
|
181
|
+
return stats;
|
|
132
182
|
}
|
|
133
183
|
|
|
134
184
|
/**
|
|
135
|
-
*
|
|
136
|
-
* @param {
|
|
137
|
-
* @returns {
|
|
138
|
-
* @private
|
|
139
|
-
* @memberof Reachability
|
|
185
|
+
* Maps our internal transport result to the format that backend expects
|
|
186
|
+
* @param {TransportResult} transportResult
|
|
187
|
+
* @returns {TransportResultForBackend}
|
|
140
188
|
*/
|
|
141
|
-
private
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
189
|
+
private mapTransportResultToBackendDataFormat(
|
|
190
|
+
transportResult: TransportResult
|
|
191
|
+
): TransportResultForBackend {
|
|
192
|
+
const output: TransportResultForBackend = {};
|
|
193
|
+
|
|
194
|
+
for (const [key, value] of Object.entries(transportResult)) {
|
|
195
|
+
switch (key) {
|
|
196
|
+
case 'result':
|
|
197
|
+
switch (value) {
|
|
198
|
+
case 'reachable':
|
|
199
|
+
output.reachable = 'true';
|
|
200
|
+
break;
|
|
201
|
+
case 'unreachable':
|
|
202
|
+
output.reachable = 'false';
|
|
203
|
+
break;
|
|
204
|
+
case 'untested':
|
|
205
|
+
output.untested = 'true';
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
break;
|
|
209
|
+
case 'latencyInMilliseconds':
|
|
210
|
+
output.latencyInMilliseconds = value.toString();
|
|
211
|
+
break;
|
|
212
|
+
default:
|
|
213
|
+
output[key] = value;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
return output;
|
|
153
218
|
}
|
|
154
219
|
|
|
155
220
|
/**
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
* @returns {
|
|
159
|
-
* @private
|
|
160
|
-
* @memberof Reachability
|
|
221
|
+
* Reachability results as an object in the format that backend expects
|
|
222
|
+
*
|
|
223
|
+
* @returns {any} reachability results that need to be sent to the backend
|
|
161
224
|
*/
|
|
162
|
-
|
|
163
|
-
|
|
225
|
+
async getReachabilityResults(): Promise<ReachabilityResultsForBackend | undefined> {
|
|
226
|
+
let results: ReachabilityResultsForBackend;
|
|
164
227
|
|
|
165
228
|
try {
|
|
166
|
-
const peerConnection = new window.RTCPeerConnection(config);
|
|
167
|
-
|
|
168
229
|
// @ts-ignore
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
} catch (peerConnectionError) {
|
|
173
|
-
LoggerProxy.logger.log(
|
|
174
|
-
`Reachability:index#createPeerConnection --> Error creating peerConnection: ${peerConnectionError}`
|
|
230
|
+
const resultsJson = await this.webex.boundedStorage.get(
|
|
231
|
+
REACHABILITY.namespace,
|
|
232
|
+
REACHABILITY.localStorageResult
|
|
175
233
|
);
|
|
176
234
|
|
|
177
|
-
|
|
235
|
+
const allClusterResults: ReachabilityResults = JSON.parse(resultsJson);
|
|
236
|
+
|
|
237
|
+
results = mapValues(allClusterResults, (clusterResult) => ({
|
|
238
|
+
udp: this.mapTransportResultToBackendDataFormat(clusterResult.udp || {result: 'untested'}),
|
|
239
|
+
tcp: this.mapTransportResultToBackendDataFormat(clusterResult.tcp || {result: 'untested'}),
|
|
240
|
+
xtls: this.mapTransportResultToBackendDataFormat(
|
|
241
|
+
clusterResult.xtls || {result: 'untested'}
|
|
242
|
+
),
|
|
243
|
+
}));
|
|
244
|
+
} catch (e) {
|
|
245
|
+
// empty storage, that's ok
|
|
246
|
+
LoggerProxy.logger.warn(
|
|
247
|
+
'Roap:request#attachReachabilityData --> Error parsing reachability data: ',
|
|
248
|
+
e
|
|
249
|
+
);
|
|
178
250
|
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* Gets total elapsed time
|
|
183
|
-
* @param {RTCPeerConnection} peerConnection
|
|
184
|
-
* @returns {Number} Milliseconds
|
|
185
|
-
* @private
|
|
186
|
-
* @memberof Reachability
|
|
187
|
-
*/
|
|
188
|
-
private getElapsedTime(peerConnection: any) {
|
|
189
|
-
const startTime = peerConnection.begin;
|
|
190
|
-
|
|
191
|
-
delete peerConnection.begin;
|
|
192
251
|
|
|
193
|
-
return
|
|
252
|
+
return results;
|
|
194
253
|
}
|
|
195
254
|
|
|
196
255
|
/**
|
|
197
|
-
*
|
|
198
|
-
* @
|
|
199
|
-
* @
|
|
200
|
-
* @private
|
|
256
|
+
* fetches reachability data and checks for cluster reachability
|
|
257
|
+
* @returns {boolean}
|
|
258
|
+
* @public
|
|
201
259
|
* @memberof Reachability
|
|
202
260
|
*/
|
|
203
|
-
|
|
204
|
-
let
|
|
261
|
+
async isAnyPublicClusterReachable() {
|
|
262
|
+
let reachable = false;
|
|
263
|
+
// @ts-ignore
|
|
264
|
+
const reachabilityData = await this.webex.boundedStorage
|
|
265
|
+
.get(this.namespace, REACHABILITY.localStorageResult)
|
|
266
|
+
.catch(() => {});
|
|
205
267
|
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
const peerConnection = this.createPeerConnection({key, config});
|
|
210
|
-
const description = await peerConnection.createOffer({offerToReceiveAudio: true});
|
|
268
|
+
if (reachabilityData) {
|
|
269
|
+
try {
|
|
270
|
+
const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);
|
|
211
271
|
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
return this.iceGatheringState(
|
|
217
|
-
peerConnection,
|
|
218
|
-
cluster.isVideoMesh ? VIDEO_MESH_TIMEOUT : DEFAULT_TIMEOUT
|
|
219
|
-
).catch((iceGatheringStateError) => {
|
|
220
|
-
LoggerProxy.logger.log(
|
|
221
|
-
`Reachability:index#getLocalSDPForClusters --> Error in getLocalSDP : ${iceGatheringStateError}`
|
|
272
|
+
reachable = Object.values(reachabilityResults).some(
|
|
273
|
+
(result) =>
|
|
274
|
+
!result.isVideoMesh &&
|
|
275
|
+
(result.udp?.result === 'reachable' || result.tcp?.result === 'reachable')
|
|
222
276
|
);
|
|
223
|
-
})
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
this.logUnreachableClusters();
|
|
277
|
+
} catch (e) {
|
|
278
|
+
LoggerProxy.logger.error(
|
|
279
|
+
`Roap:request#attachReachabilityData --> Error in parsing reachability data: ${e}`
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
230
283
|
|
|
231
|
-
|
|
232
|
-
return reachabilityLatencyResults;
|
|
233
|
-
});
|
|
284
|
+
return reachable;
|
|
234
285
|
}
|
|
235
286
|
|
|
236
287
|
/**
|
|
@@ -239,126 +290,23 @@ export default class Reachability {
|
|
|
239
290
|
* @private
|
|
240
291
|
* @memberof Reachability
|
|
241
292
|
*/
|
|
242
|
-
private
|
|
293
|
+
private getUnreachableClusters(): Array<{name: string; protocol: string}> {
|
|
243
294
|
const unreachableList = [];
|
|
244
|
-
const clusters = this.clusterLatencyResults;
|
|
245
295
|
|
|
246
|
-
Object.
|
|
247
|
-
const
|
|
296
|
+
Object.entries(this.clusterReachability).forEach(([key, clusterReachability]) => {
|
|
297
|
+
const result = clusterReachability.getResult();
|
|
248
298
|
|
|
249
|
-
if (
|
|
250
|
-
unreachableList.push(key);
|
|
299
|
+
if (result.udp.result === 'unreachable') {
|
|
300
|
+
unreachableList.push({name: key, protocol: 'udp'});
|
|
301
|
+
}
|
|
302
|
+
if (result.tcp.result === 'unreachable') {
|
|
303
|
+
unreachableList.push({name: key, protocol: 'tcp'});
|
|
251
304
|
}
|
|
252
305
|
});
|
|
253
306
|
|
|
254
307
|
return unreachableList;
|
|
255
308
|
}
|
|
256
309
|
|
|
257
|
-
/**
|
|
258
|
-
* Attach an event handler for the icegatheringstatechange
|
|
259
|
-
* event and measure latency.
|
|
260
|
-
* @param {RTCPeerConnection} peerConnection
|
|
261
|
-
* @returns {undefined}
|
|
262
|
-
* @private
|
|
263
|
-
* @memberof Reachability
|
|
264
|
-
*/
|
|
265
|
-
private handleIceGatheringStateChange(peerConnection: RTCPeerConnection) {
|
|
266
|
-
peerConnection.onicegatheringstatechange = () => {
|
|
267
|
-
const {COMPLETE} = ICE_GATHERING_STATE;
|
|
268
|
-
|
|
269
|
-
if (peerConnection.iceConnectionState === COMPLETE) {
|
|
270
|
-
const elapsed = this.getElapsedTime(peerConnection);
|
|
271
|
-
|
|
272
|
-
// @ts-ignore
|
|
273
|
-
LoggerProxy.logger.log(
|
|
274
|
-
// @ts-ignore
|
|
275
|
-
`Reachability:index#onIceGatheringStateChange --> Successfully pinged ${peerConnection.key}:`,
|
|
276
|
-
elapsed
|
|
277
|
-
);
|
|
278
|
-
this.setLatencyAndClose(peerConnection, elapsed);
|
|
279
|
-
}
|
|
280
|
-
};
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
/**
|
|
284
|
-
* Attach an event handler for the icecandidate
|
|
285
|
-
* event and measure latency.
|
|
286
|
-
* @param {RTCPeerConnection} peerConnection
|
|
287
|
-
* @returns {undefined}
|
|
288
|
-
* @private
|
|
289
|
-
* @memberof Reachability
|
|
290
|
-
*/
|
|
291
|
-
private handleOnIceCandidate(peerConnection: RTCPeerConnection) {
|
|
292
|
-
peerConnection.onicecandidate = (e) => {
|
|
293
|
-
const SERVER_REFLEXIVE = 'srflx';
|
|
294
|
-
|
|
295
|
-
if (e.candidate && String(e.candidate.type).toLowerCase() === SERVER_REFLEXIVE) {
|
|
296
|
-
const elapsed = this.getElapsedTime(peerConnection);
|
|
297
|
-
|
|
298
|
-
LoggerProxy.logger.log(
|
|
299
|
-
// @ts-ignore
|
|
300
|
-
`Reachability:index#onIceCandidate --> Successfully pinged ${peerConnection.key}:`,
|
|
301
|
-
elapsed
|
|
302
|
-
);
|
|
303
|
-
this.setLatencyAndClose(peerConnection, elapsed);
|
|
304
|
-
}
|
|
305
|
-
};
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
/**
|
|
309
|
-
* An event handler on an RTCPeerConnection when the state of the ICE
|
|
310
|
-
* candidate gathering process changes. Used to measure connection
|
|
311
|
-
* speed.
|
|
312
|
-
* @private
|
|
313
|
-
* @param {RTCPeerConnection} peerConnection
|
|
314
|
-
* @param {number} timeout
|
|
315
|
-
* @returns {Promise}
|
|
316
|
-
*/
|
|
317
|
-
private iceGatheringState(peerConnection: RTCPeerConnection, timeout: number) {
|
|
318
|
-
const ELAPSED = 'elapsed';
|
|
319
|
-
|
|
320
|
-
return new Promise((resolve) => {
|
|
321
|
-
const peerConnectionProxy = new window.Proxy(peerConnection, {
|
|
322
|
-
get(target, property) {
|
|
323
|
-
const targetMember = target[property];
|
|
324
|
-
|
|
325
|
-
if (typeof targetMember === 'function') {
|
|
326
|
-
return targetMember.bind(target);
|
|
327
|
-
}
|
|
328
|
-
|
|
329
|
-
return targetMember;
|
|
330
|
-
},
|
|
331
|
-
set: (target, property, value) => {
|
|
332
|
-
// only intercept elapsed property
|
|
333
|
-
if (property === ELAPSED) {
|
|
334
|
-
// @ts-ignore
|
|
335
|
-
resolve({clusterId: peerConnection.key, elapsed: value});
|
|
336
|
-
|
|
337
|
-
return true;
|
|
338
|
-
}
|
|
339
|
-
|
|
340
|
-
// pass thru
|
|
341
|
-
return window.Reflect.set(target, property, value);
|
|
342
|
-
},
|
|
343
|
-
});
|
|
344
|
-
|
|
345
|
-
// Using peerConnection proxy so handle functions below
|
|
346
|
-
// won't be coupled to our promise implementation
|
|
347
|
-
this.handleIceGatheringStateChange(peerConnectionProxy);
|
|
348
|
-
this.handleOnIceCandidate(peerConnectionProxy);
|
|
349
|
-
|
|
350
|
-
// Set maximum timeout
|
|
351
|
-
window.setTimeout(() => {
|
|
352
|
-
const {CLOSED} = CONNECTION_STATE;
|
|
353
|
-
|
|
354
|
-
// Close any open peerConnections
|
|
355
|
-
if (peerConnectionProxy.connectionState !== CLOSED) {
|
|
356
|
-
this.setLatencyAndClose(peerConnectionProxy, null);
|
|
357
|
-
}
|
|
358
|
-
}, timeout);
|
|
359
|
-
});
|
|
360
|
-
}
|
|
361
|
-
|
|
362
310
|
/**
|
|
363
311
|
* Make a log of unreachable clusters.
|
|
364
312
|
* @returns {undefined}
|
|
@@ -366,123 +314,58 @@ export default class Reachability {
|
|
|
366
314
|
* @memberof Reachability
|
|
367
315
|
*/
|
|
368
316
|
private logUnreachableClusters() {
|
|
369
|
-
const list = this.
|
|
317
|
+
const list = this.getUnreachableClusters();
|
|
370
318
|
|
|
371
|
-
list.forEach((
|
|
319
|
+
list.forEach(({name, protocol}) => {
|
|
372
320
|
LoggerProxy.logger.log(
|
|
373
|
-
`Reachability:index#logUnreachableClusters -->
|
|
321
|
+
`Reachability:index#logUnreachableClusters --> failed to reach ${name} over ${protocol}`
|
|
374
322
|
);
|
|
375
323
|
});
|
|
376
324
|
}
|
|
377
325
|
|
|
378
326
|
/**
|
|
379
|
-
*
|
|
380
|
-
* @param {
|
|
381
|
-
* @returns {
|
|
382
|
-
* @private
|
|
383
|
-
* @memberof Reachability
|
|
327
|
+
* Performs reachability checks for all clusters
|
|
328
|
+
* @param {ClusterList} clusterList
|
|
329
|
+
* @returns {Promise<ReachabilityResults>} reachability check results
|
|
384
330
|
*/
|
|
385
|
-
private
|
|
386
|
-
const
|
|
387
|
-
|
|
388
|
-
iceResults.forEach(({clusterId, elapsed}) => {
|
|
389
|
-
let latencyResult;
|
|
390
|
-
|
|
391
|
-
if (elapsed === null) {
|
|
392
|
-
latencyResult = {reachable: 'false'};
|
|
393
|
-
} else {
|
|
394
|
-
latencyResult = {
|
|
395
|
-
reachable: 'true',
|
|
396
|
-
latencyInMilliseconds: elapsed.toString(),
|
|
397
|
-
};
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
reachabilityMap[clusterId] = {
|
|
401
|
-
udp: latencyResult,
|
|
402
|
-
tcp: latencyResult,
|
|
403
|
-
};
|
|
404
|
-
});
|
|
405
|
-
|
|
406
|
-
return reachabilityMap;
|
|
407
|
-
}
|
|
331
|
+
private async performReachabilityChecks(clusterList: ClusterList): Promise<ReachabilityResults> {
|
|
332
|
+
const results: ReachabilityResults = {};
|
|
408
333
|
|
|
409
|
-
/**
|
|
410
|
-
* fetches reachability data
|
|
411
|
-
* @param {object} clusterList
|
|
412
|
-
* @returns {Promise<localSDPData>} reachability check results
|
|
413
|
-
* @private
|
|
414
|
-
* @memberof Reachability
|
|
415
|
-
*/
|
|
416
|
-
private performReachabilityCheck(clusterList: object) {
|
|
417
334
|
if (!clusterList || !Object.keys(clusterList).length) {
|
|
418
|
-
return Promise.resolve(
|
|
335
|
+
return Promise.resolve(results);
|
|
419
336
|
}
|
|
420
337
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
'Reachability:index#performReachabilityCheck --> Local SDP is empty or has missing elements..returning'
|
|
428
|
-
);
|
|
429
|
-
resolve({});
|
|
430
|
-
} else {
|
|
431
|
-
resolve(localSDPData);
|
|
432
|
-
}
|
|
433
|
-
})
|
|
434
|
-
.catch((error) => {
|
|
435
|
-
LoggerProxy.logger.error(
|
|
436
|
-
`Reachability:index#performReachabilityCheck --> Error in getLocalSDPForClusters: ${error}`
|
|
437
|
-
);
|
|
438
|
-
resolve({});
|
|
439
|
-
});
|
|
440
|
-
});
|
|
441
|
-
}
|
|
338
|
+
LoggerProxy.logger.log(
|
|
339
|
+
`Reachability:index#performReachabilityChecks --> doing UDP${
|
|
340
|
+
// @ts-ignore
|
|
341
|
+
this.webex.config.meetings.experimental.enableTcpReachability ? ' and TCP' : ''
|
|
342
|
+
} reachability checks`
|
|
343
|
+
);
|
|
442
344
|
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
* @param {RTCPeerConnection} peerConnection
|
|
446
|
-
* @param {number} elapsed Latency in milliseconds
|
|
447
|
-
* @returns {undefined}
|
|
448
|
-
* @private
|
|
449
|
-
* @memberof Reachability
|
|
450
|
-
*/
|
|
451
|
-
private setLatencyAndClose(peerConnection: RTCPeerConnection, elapsed: number) {
|
|
452
|
-
const REACHABLE = 'reachable';
|
|
453
|
-
const UNREACHABLE = 'unreachable';
|
|
454
|
-
const {CLOSED} = CONNECTION_STATE;
|
|
455
|
-
// @ts-ignore
|
|
456
|
-
const {key} = peerConnection;
|
|
457
|
-
const resultKey = elapsed === null ? UNREACHABLE : REACHABLE;
|
|
458
|
-
const intialState = {[REACHABLE]: 0, [UNREACHABLE]: 0};
|
|
345
|
+
const clusterReachabilityChecks = Object.keys(clusterList).map((key) => {
|
|
346
|
+
const cluster = clusterList[key];
|
|
459
347
|
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
348
|
+
// Linus doesn't support TCP reachability checks on video mesh nodes
|
|
349
|
+
const includeTcpReachability =
|
|
350
|
+
// @ts-ignore
|
|
351
|
+
this.webex.config.meetings.experimental.enableTcpReachability && !cluster.isVideoMesh;
|
|
464
352
|
|
|
465
|
-
|
|
466
|
-
|
|
353
|
+
if (!includeTcpReachability) {
|
|
354
|
+
cluster.tcp = [];
|
|
355
|
+
}
|
|
467
356
|
|
|
468
|
-
|
|
469
|
-
this.clusterLatencyResults[key][resultKey] += 1;
|
|
357
|
+
this.clusterReachability[key] = new ClusterReachability(key, cluster);
|
|
470
358
|
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
peerConnection.elapsed = elapsed;
|
|
477
|
-
}
|
|
359
|
+
return this.clusterReachability[key].start().then((result) => {
|
|
360
|
+
results[key] = result;
|
|
361
|
+
results[key].isVideoMesh = cluster.isVideoMesh;
|
|
362
|
+
});
|
|
363
|
+
});
|
|
478
364
|
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
*/
|
|
485
|
-
private setup() {
|
|
486
|
-
this.clusterLatencyResults = {};
|
|
365
|
+
await Promise.all(clusterReachabilityChecks);
|
|
366
|
+
|
|
367
|
+
this.logUnreachableClusters();
|
|
368
|
+
|
|
369
|
+
return results;
|
|
487
370
|
}
|
|
488
371
|
}
|