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