@webex/plugin-meetings 3.8.0 → 3.8.1-next.10
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 +26 -13
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +70 -6
- package/dist/breakouts/index.js.map +1 -1
- package/dist/common/errors/webex-errors.js +12 -2
- package/dist/common/errors/webex-errors.js.map +1 -1
- package/dist/config.js +5 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.js +28 -123
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/enums.js +3 -0
- package/dist/controls-options-manager/enums.js.map +1 -1
- package/dist/controls-options-manager/types.js.map +1 -1
- package/dist/controls-options-manager/util.js +78 -0
- package/dist/controls-options-manager/util.js.map +1 -1
- package/dist/interpretation/index.js +4 -4
- package/dist/interpretation/index.js.map +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/locus-info/controlsUtils.js +37 -11
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +92 -12
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/selfUtils.js +432 -418
- package/dist/locus-info/selfUtils.js.map +1 -1
- package/dist/media/index.js +17 -17
- package/dist/media/index.js.map +1 -1
- package/dist/media/properties.js +94 -6
- package/dist/media/properties.js.map +1 -1
- package/dist/meeting/brbState.js +9 -2
- package/dist/meeting/brbState.js.map +1 -1
- package/dist/meeting/in-meeting-actions.js +21 -1
- package/dist/meeting/in-meeting-actions.js.map +1 -1
- package/dist/meeting/index.js +678 -344
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/locusMediaRequest.js +21 -22
- package/dist/meeting/locusMediaRequest.js.map +1 -1
- package/dist/meeting/muteState.js +4 -4
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +30 -0
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/request.type.js.map +1 -1
- package/dist/meeting/util.js +13 -2
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +373 -68
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meeting-info/utilv2.js +5 -1
- package/dist/meeting-info/utilv2.js.map +1 -1
- package/dist/meetings/index.js +136 -1
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/util.js +14 -0
- package/dist/meetings/util.js.map +1 -1
- package/dist/member/index.js +55 -9
- package/dist/member/index.js.map +1 -1
- package/dist/member/types.js +3 -0
- package/dist/member/types.js.map +1 -1
- package/dist/member/util.js +335 -353
- package/dist/member/util.js.map +1 -1
- package/dist/members/collection.js.map +1 -1
- package/dist/members/index.js +137 -29
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.js +38 -0
- package/dist/members/request.js.map +1 -1
- package/dist/members/util.js +36 -1
- package/dist/members/util.js.map +1 -1
- package/dist/metrics/constants.js +10 -0
- package/dist/metrics/constants.js.map +1 -1
- package/dist/multistream/remoteMediaManager.js +40 -8
- package/dist/multistream/remoteMediaManager.js.map +1 -1
- package/dist/reachability/clusterReachability.js +63 -27
- package/dist/reachability/clusterReachability.js.map +1 -1
- package/dist/reachability/index.js +107 -47
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/reachability.types.js +14 -0
- package/dist/reachability/reachability.types.js.map +1 -1
- package/dist/reachability/request.js +19 -3
- package/dist/reachability/request.js.map +1 -1
- package/dist/reconnection-manager/index.js +2 -2
- package/dist/reconnection-manager/index.js.map +1 -1
- package/dist/recording-controller/util.js +5 -5
- package/dist/recording-controller/util.js.map +1 -1
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/turnDiscovery.js +45 -27
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/roap/types.js +17 -0
- package/dist/roap/types.js.map +1 -0
- package/dist/types/common/errors/webex-errors.d.ts +7 -1
- package/dist/types/config.d.ts +3 -0
- package/dist/types/constants.d.ts +20 -85
- package/dist/types/controls-options-manager/enums.d.ts +4 -1
- package/dist/types/controls-options-manager/types.d.ts +10 -1
- package/dist/types/locus-info/index.d.ts +3 -3
- package/dist/types/locus-info/selfUtils.d.ts +216 -1
- package/dist/types/media/properties.d.ts +15 -0
- package/dist/types/meeting/in-meeting-actions.d.ts +20 -0
- package/dist/types/meeting/index.d.ts +65 -1
- package/dist/types/meeting/muteState.d.ts +0 -1
- package/dist/types/meeting/request.d.ts +12 -1
- package/dist/types/meeting/request.type.d.ts +6 -0
- package/dist/types/meeting/util.d.ts +3 -1
- package/dist/types/meeting-info/meeting-info-v2.d.ts +82 -1
- package/dist/types/meetings/index.d.ts +57 -0
- package/dist/types/member/index.d.ts +21 -6
- package/dist/types/member/types.d.ts +73 -14
- package/dist/types/member/util.d.ts +156 -1
- package/dist/types/members/collection.d.ts +6 -5
- package/dist/types/members/index.d.ts +32 -43
- package/dist/types/members/request.d.ts +26 -0
- package/dist/types/members/util.d.ts +27 -0
- package/dist/types/metrics/constants.d.ts +10 -0
- package/dist/types/multistream/remoteMediaManager.d.ts +10 -1
- package/dist/types/reachability/clusterReachability.d.ts +15 -7
- package/dist/types/reachability/index.d.ts +10 -1
- package/dist/types/reachability/reachability.types.d.ts +5 -0
- package/dist/types/roap/index.d.ts +3 -2
- package/dist/types/roap/turnDiscovery.d.ts +5 -17
- package/dist/types/roap/types.d.ts +16 -0
- package/dist/webinar/index.js +2 -2
- package/dist/webinar/index.js.map +1 -1
- package/package.json +24 -23
- package/src/breakouts/index.ts +69 -0
- package/src/common/errors/webex-errors.ts +8 -1
- package/src/config.ts +3 -0
- package/src/constants.ts +30 -90
- package/src/controls-options-manager/enums.ts +3 -0
- package/src/controls-options-manager/types.ts +16 -1
- package/src/controls-options-manager/util.ts +93 -0
- package/src/interpretation/index.ts +3 -3
- package/src/locus-info/controlsUtils.ts +59 -14
- package/src/locus-info/index.ts +97 -13
- package/src/locus-info/selfUtils.ts +496 -442
- package/src/media/index.ts +23 -21
- package/src/media/properties.ts +96 -0
- package/src/meeting/brbState.ts +11 -2
- package/src/meeting/in-meeting-actions.ts +40 -0
- package/src/meeting/index.ts +470 -105
- package/src/meeting/locusMediaRequest.ts +27 -22
- package/src/meeting/muteState.ts +4 -4
- package/src/meeting/request.ts +36 -1
- package/src/meeting/request.type.ts +7 -0
- package/src/meeting/util.ts +11 -2
- package/src/meeting-info/meeting-info-v2.ts +254 -8
- package/src/meeting-info/utilv2.ts +5 -0
- package/src/meetings/index.ts +148 -1
- package/src/meetings/util.ts +18 -0
- package/src/member/index.ts +68 -22
- package/src/member/types.ts +82 -16
- package/src/member/util.ts +357 -350
- package/src/members/collection.ts +4 -3
- package/src/members/index.ts +137 -18
- package/src/members/request.ts +44 -0
- package/src/members/util.ts +43 -1
- package/src/metrics/constants.ts +10 -0
- package/src/multistream/remoteMediaManager.ts +32 -10
- package/src/reachability/clusterReachability.ts +73 -26
- package/src/reachability/index.ts +62 -1
- package/src/reachability/reachability.types.ts +6 -0
- package/src/reachability/request.ts +7 -0
- package/src/reconnection-manager/index.ts +2 -2
- package/src/recording-controller/util.ts +17 -13
- package/src/roap/index.ts +3 -7
- package/src/roap/turnDiscovery.ts +34 -39
- package/src/roap/types.ts +23 -0
- package/src/webinar/index.ts +1 -1
- package/test/unit/spec/breakouts/index.ts +167 -95
- package/test/unit/spec/controls-options-manager/util.js +178 -0
- package/test/unit/spec/interpretation/index.ts +39 -1
- package/test/unit/spec/locus-info/controlsUtils.js +155 -9
- package/test/unit/spec/locus-info/index.js +209 -73
- package/test/unit/spec/locus-info/selfUtils.js +98 -24
- package/test/unit/spec/media/index.ts +150 -18
- package/test/unit/spec/media/properties.ts +130 -0
- package/test/unit/spec/meeting/brbState.ts +40 -2
- package/test/unit/spec/meeting/in-meeting-actions.ts +23 -4
- package/test/unit/spec/meeting/index.js +804 -139
- package/test/unit/spec/meeting/locusMediaRequest.ts +95 -87
- package/test/unit/spec/meeting/muteState.js +73 -2
- package/test/unit/spec/meeting/request.js +32 -1
- package/test/unit/spec/meeting/utils.js +119 -18
- package/test/unit/spec/meeting-info/meetinginfov2.js +484 -114
- package/test/unit/spec/meeting-info/utilv2.js +19 -0
- package/test/unit/spec/meetings/index.js +146 -2
- package/test/unit/spec/member/index.js +7 -0
- package/test/unit/spec/member/util.js +24 -0
- package/test/unit/spec/members/index.js +304 -78
- package/test/unit/spec/members/request.js +68 -22
- package/test/unit/spec/members/utils.js +75 -0
- package/test/unit/spec/multistream/remoteMediaManager.ts +397 -118
- package/test/unit/spec/reachability/clusterReachability.ts +88 -56
- package/test/unit/spec/reachability/index.ts +97 -0
- package/test/unit/spec/reachability/request.js +47 -2
- package/test/unit/spec/reconnection-manager/index.js +4 -4
- package/test/unit/spec/roap/turnDiscovery.ts +110 -28
- package/test/unit/spec/webinar/index.ts +5 -0
- package/dist/annotation/annotation.types.d.ts +0 -42
- package/dist/annotation/constants.d.ts +0 -31
- package/dist/annotation/index.d.ts +0 -117
- package/dist/breakouts/breakout.d.ts +0 -8
- package/dist/breakouts/collection.d.ts +0 -5
- package/dist/breakouts/edit-lock-error.d.ts +0 -15
- package/dist/breakouts/events.d.ts +0 -8
- package/dist/breakouts/index.d.ts +0 -5
- package/dist/breakouts/request.d.ts +0 -22
- package/dist/breakouts/utils.d.ts +0 -15
- package/dist/common/browser-detection.d.ts +0 -9
- package/dist/common/collection.d.ts +0 -48
- package/dist/common/config.d.ts +0 -2
- package/dist/common/errors/captcha-error.d.ts +0 -15
- package/dist/common/errors/intent-to-join.d.ts +0 -16
- package/dist/common/errors/join-meeting.d.ts +0 -17
- package/dist/common/errors/media.d.ts +0 -15
- package/dist/common/errors/no-meeting-info.d.ts +0 -14
- package/dist/common/errors/parameter.d.ts +0 -15
- package/dist/common/errors/password-error.d.ts +0 -15
- package/dist/common/errors/permission.d.ts +0 -14
- package/dist/common/errors/reclaim-host-role-error.js +0 -149
- package/dist/common/errors/reclaim-host-role-error.js.map +0 -1
- package/dist/common/errors/reclaim-host-role-errors.d.ts +0 -60
- package/dist/common/errors/reconnection-in-progress.d.ts +0 -9
- package/dist/common/errors/reconnection-in-progress.js +0 -33
- package/dist/common/errors/reconnection-in-progress.js.map +0 -1
- package/dist/common/errors/reconnection.d.ts +0 -15
- package/dist/common/errors/stats.d.ts +0 -15
- package/dist/common/errors/webex-errors.d.ts +0 -93
- package/dist/common/errors/webex-meetings-error.d.ts +0 -20
- package/dist/common/events/events-scope.d.ts +0 -17
- package/dist/common/events/events.d.ts +0 -12
- package/dist/common/events/trigger-proxy.d.ts +0 -2
- package/dist/common/events/util.d.ts +0 -2
- package/dist/common/logs/logger-config.d.ts +0 -2
- package/dist/common/logs/logger-proxy.d.ts +0 -2
- package/dist/common/logs/request.d.ts +0 -36
- package/dist/common/queue.d.ts +0 -34
- package/dist/config.d.ts +0 -72
- package/dist/constants.d.ts +0 -1088
- package/dist/controls-options-manager/constants.d.ts +0 -4
- package/dist/controls-options-manager/enums.d.ts +0 -15
- package/dist/controls-options-manager/index.d.ts +0 -136
- package/dist/controls-options-manager/types.d.ts +0 -43
- package/dist/controls-options-manager/util.d.ts +0 -1
- package/dist/index.d.ts +0 -7
- package/dist/interceptors/index.d.ts +0 -2
- package/dist/interceptors/locusRetry.d.ts +0 -27
- package/dist/interpretation/collection.d.ts +0 -5
- package/dist/interpretation/index.d.ts +0 -5
- package/dist/interpretation/siLanguage.d.ts +0 -5
- package/dist/locus-info/controlsUtils.d.ts +0 -2
- package/dist/locus-info/embeddedAppsUtils.d.ts +0 -2
- package/dist/locus-info/fullState.d.ts +0 -2
- package/dist/locus-info/hostUtils.d.ts +0 -2
- package/dist/locus-info/index.d.ts +0 -322
- package/dist/locus-info/infoUtils.d.ts +0 -2
- package/dist/locus-info/mediaSharesUtils.d.ts +0 -2
- package/dist/locus-info/parser.d.ts +0 -272
- package/dist/locus-info/selfUtils.d.ts +0 -2
- package/dist/media/index.d.ts +0 -34
- package/dist/media/properties.d.ts +0 -93
- package/dist/media/util.d.ts +0 -2
- package/dist/mediaQualityMetrics/config.d.ts +0 -241
- package/dist/mediaQualityMetrics/config.js +0 -502
- package/dist/mediaQualityMetrics/config.js.map +0 -1
- package/dist/meeting/effectsState.js +0 -260
- package/dist/meeting/effectsState.js.map +0 -1
- package/dist/meeting/in-meeting-actions.d.ts +0 -167
- package/dist/meeting/index.d.ts +0 -1825
- package/dist/meeting/locusMediaRequest.d.ts +0 -74
- package/dist/meeting/muteState.d.ts +0 -178
- package/dist/meeting/request.d.ts +0 -295
- package/dist/meeting/request.type.d.ts +0 -11
- package/dist/meeting/state.d.ts +0 -9
- package/dist/meeting/util.d.ts +0 -119
- package/dist/meeting/voicea-meeting.d.ts +0 -16
- package/dist/meeting-info/collection.d.ts +0 -20
- package/dist/meeting-info/index.d.ts +0 -69
- package/dist/meeting-info/meeting-info-v2.d.ts +0 -123
- package/dist/meeting-info/request.d.ts +0 -22
- package/dist/meeting-info/util.d.ts +0 -2
- package/dist/meeting-info/utilv2.d.ts +0 -2
- package/dist/meetings/collection.d.ts +0 -40
- package/dist/meetings/index.d.ts +0 -390
- package/dist/meetings/meetings.types.d.ts +0 -4
- package/dist/meetings/request.d.ts +0 -27
- package/dist/meetings/util.d.ts +0 -18
- package/dist/member/index.d.ts +0 -160
- package/dist/member/member.types.js +0 -17
- package/dist/member/member.types.js.map +0 -1
- package/dist/member/types.d.ts +0 -32
- package/dist/member/util.d.ts +0 -2
- package/dist/members/collection.d.ts +0 -29
- package/dist/members/index.d.ts +0 -353
- package/dist/members/request.d.ts +0 -114
- package/dist/members/types.d.ts +0 -25
- package/dist/members/util.d.ts +0 -215
- package/dist/metrics/config.js +0 -276
- package/dist/metrics/config.js.map +0 -1
- package/dist/metrics/constants.d.ts +0 -70
- package/dist/metrics/index.d.ts +0 -45
- package/dist/multistream/mediaRequestManager.d.ts +0 -119
- package/dist/multistream/receiveSlot.d.ts +0 -68
- package/dist/multistream/receiveSlotManager.d.ts +0 -56
- package/dist/multistream/remoteMedia.d.ts +0 -72
- package/dist/multistream/remoteMediaGroup.d.ts +0 -49
- package/dist/multistream/remoteMediaManager.d.ts +0 -300
- package/dist/multistream/sendSlotManager.d.ts +0 -69
- package/dist/networkQualityMonitor/index.d.ts +0 -70
- package/dist/networkQualityMonitor/index.js +0 -221
- package/dist/networkQualityMonitor/index.js.map +0 -1
- package/dist/peer-connection-manager/index.js +0 -671
- package/dist/peer-connection-manager/index.js.map +0 -1
- package/dist/peer-connection-manager/util.js +0 -109
- package/dist/peer-connection-manager/util.js.map +0 -1
- package/dist/personal-meeting-room/index.d.ts +0 -47
- package/dist/personal-meeting-room/request.d.ts +0 -14
- package/dist/personal-meeting-room/util.d.ts +0 -2
- package/dist/reachability/clusterReachability.d.ts +0 -109
- package/dist/reachability/index.d.ts +0 -105
- package/dist/reachability/request.d.ts +0 -39
- package/dist/reachability/util.d.ts +0 -8
- package/dist/reactions/constants.d.ts +0 -3
- package/dist/reactions/reactions.d.ts +0 -4
- package/dist/reactions/reactions.type.d.ts +0 -52
- package/dist/reconnection-manager/index.d.ts +0 -136
- package/dist/recording-controller/enums.d.ts +0 -7
- package/dist/recording-controller/index.d.ts +0 -207
- package/dist/recording-controller/util.d.ts +0 -14
- package/dist/roap/collection.js +0 -62
- package/dist/roap/collection.js.map +0 -1
- package/dist/roap/handler.js +0 -275
- package/dist/roap/handler.js.map +0 -1
- package/dist/roap/index.d.ts +0 -86
- package/dist/roap/request.d.ts +0 -39
- package/dist/roap/state.js +0 -126
- package/dist/roap/state.js.map +0 -1
- package/dist/roap/turnDiscovery.d.ts +0 -155
- package/dist/roap/util.js +0 -75
- package/dist/roap/util.js.map +0 -1
- package/dist/rtcMetrics/constants.d.ts +0 -4
- package/dist/rtcMetrics/constants.js +0 -11
- package/dist/rtcMetrics/constants.js.map +0 -1
- package/dist/rtcMetrics/index.d.ts +0 -61
- package/dist/rtcMetrics/index.js +0 -197
- package/dist/rtcMetrics/index.js.map +0 -1
- package/dist/statsAnalyzer/global.d.ts +0 -36
- package/dist/statsAnalyzer/global.js +0 -126
- package/dist/statsAnalyzer/global.js.map +0 -1
- package/dist/statsAnalyzer/index.d.ts +0 -217
- package/dist/statsAnalyzer/index.js +0 -1013
- package/dist/statsAnalyzer/index.js.map +0 -1
- package/dist/statsAnalyzer/mqaUtil.d.ts +0 -48
- package/dist/statsAnalyzer/mqaUtil.js +0 -179
- package/dist/statsAnalyzer/mqaUtil.js.map +0 -1
- package/dist/transcription/index.d.ts +0 -64
- package/dist/types/common/errors/reconnection-in-progress.d.ts +0 -9
- package/dist/types/mediaQualityMetrics/config.d.ts +0 -241
- package/dist/types/networkQualityMonitor/index.d.ts +0 -70
- package/dist/types/rtcMetrics/constants.d.ts +0 -4
- package/dist/types/rtcMetrics/index.d.ts +0 -71
- package/dist/types/statsAnalyzer/global.d.ts +0 -36
- package/dist/types/statsAnalyzer/index.d.ts +0 -217
- package/dist/types/statsAnalyzer/mqaUtil.d.ts +0 -48
- package/dist/webinar/collection.d.ts +0 -16
- package/dist/webinar/index.d.ts +0 -5
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["_common","require","_loggerProxy","_interopRequireDefault","_util","_eventsScope","_constants","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","result","NewTarget","constructor","_Reflect$construct","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","Events","exports","resultReady","clientMediaIpsUpdated","ClusterReachability","_EventsScope","_inherits2","_super","name","clusterInfo","_this","_classCallCheck2","_assertThisInitialized2","isVideoMesh","numUdpUrls","udp","numTcpUrls","tcp","numXTlsUrls","xtls","pc","createPeerConnection","defer","Defer","_createClass2","key","value","getElapsedTime","Math","round","performance","now","startTimestamp","buildPeerConnectionConfig","cluster","udpIceServers","map","url","username","credential","urls","tcpIceServers","urlString","convertStunUrlToTurn","turnTlsIceServers","convertStunUrlToTurnTls","iceServers","concat","_toConsumableArray2","iceCandidatePoolSize","iceTransportPolicy","config","peerConnection","RTCPeerConnection","peerConnectionError","LoggerProxy","logger","warn","undefined","getResult","closePeerConnection","onicecandidate","onicegatheringstatechange","close","finishReachabilityCheck","resolve","abort","CLOSED","CONNECTION_STATE","connectionState","addPublicIP","protocol","publicIP","ipAdded","clientMediaIPs","includes","emit","file","function","registerIceGatheringStateChangeListener","_this2","COMPLETE","ICE_GATHERING_STATE","iceConnectionState","haveWeGotAllResults","_this3","every","saveResult","latency","publicIp","latencyInMilliseconds","log","registerIceCandidateListener","_this4","TURN_TLS_PORT","CANDIDATE_TYPES","SERVER_REFLEXIVE","RELAY","candidate","type","address","port","_start","_asyncToGenerator2","_regenerator","mark","_callee","offer","gatherIceCandidatePromise","wrap","_callee$","_context","prev","next","abrupt","createOffer","offerToReceiveAudio","sent","gatherIceCandidates","setLocalDescription","t0","stop","start","promise","EventsScope"],"sources":["clusterReachability.ts"],"sourcesContent":["import {Defer} from '@webex/common';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {ClusterNode} from './request';\nimport {convertStunUrlToTurn, convertStunUrlToTurnTls} from './util';\nimport EventsScope from '../common/events/events-scope';\n\nimport {CONNECTION_STATE, Enum, ICE_GATHERING_STATE} from '../constants';\nimport {ClusterReachabilityResult} from './reachability.types';\n\n// data for the Events.resultReady event\nexport type ResultEventData = {\n protocol: 'udp' | 'tcp' | 'xtls';\n result: 'reachable' | 'unreachable' | 'untested';\n latencyInMilliseconds: number; // amount of time it took to get the ICE candidate\n clientMediaIPs?: string[];\n};\n\n// data for the Events.clientMediaIpsUpdated event\nexport type ClientMediaIpsUpdatedEventData = {\n protocol: 'udp' | 'tcp' | 'xtls';\n clientMediaIPs: string[];\n};\n\nexport const Events = {\n resultReady: 'resultReady', // emitted when a cluster is reached successfully using specific protocol\n clientMediaIpsUpdated: 'clientMediaIpsUpdated', // emitted when more public IPs are found after resultReady was already sent for a given protocol\n} as const;\n\nexport type Events = Enum<typeof Events>;\n\n/**\n * A class that handles reachability checks for a single cluster.\n * It emits events from Events enum\n */\nexport class ClusterReachability extends EventsScope {\n private numUdpUrls: number;\n private numTcpUrls: number;\n private numXTlsUrls: number;\n private result: ClusterReachabilityResult;\n private pc?: RTCPeerConnection;\n private defer: Defer; // this defer is resolved once reachability checks for this cluster are completed\n private startTimestamp: number;\n public readonly isVideoMesh: boolean;\n public readonly name;\n\n /**\n * Constructor for ClusterReachability\n * @param {string} name cluster name\n * @param {ClusterNode} clusterInfo information about the media cluster\n */\n constructor(name: string, clusterInfo: ClusterNode) {\n super();\n this.name = name;\n this.isVideoMesh = clusterInfo.isVideoMesh;\n this.numUdpUrls = clusterInfo.udp.length;\n this.numTcpUrls = clusterInfo.tcp.length;\n this.numXTlsUrls = clusterInfo.xtls.length;\n\n this.pc = this.createPeerConnection(clusterInfo);\n\n this.defer = new Defer();\n this.result = {\n udp: {\n result: 'untested',\n },\n tcp: {\n result: 'untested',\n },\n xtls: {\n result: 'untested',\n },\n };\n }\n\n /**\n * Gets total elapsed time, can be called only after start() is called\n * @returns {Number} Milliseconds\n */\n private getElapsedTime() {\n return Math.round(performance.now() - this.startTimestamp);\n }\n\n /**\n * Generate peerConnection config settings\n * @param {ClusterNode} cluster\n * @returns {RTCConfiguration} peerConnectionConfig\n */\n private buildPeerConnectionConfig(cluster: ClusterNode): RTCConfiguration {\n const udpIceServers = cluster.udp.map((url) => ({\n username: '',\n credential: '',\n urls: [url],\n }));\n\n // STUN servers are contacted only using UDP, so in order to test TCP reachability\n // we pretend that Linus is a TURN server, because we can explicitly say \"transport=tcp\" in TURN urls.\n // We then check for relay candidates to know if TURN-TCP worked (see registerIceCandidateListener()).\n const tcpIceServers = cluster.tcp.map((urlString: string) => {\n return {\n username: 'webexturnreachuser',\n credential: 'webexturnreachpwd',\n urls: [convertStunUrlToTurn(urlString, 'tcp')],\n };\n });\n\n const turnTlsIceServers = cluster.xtls.map((urlString: string) => {\n return {\n username: 'webexturnreachuser',\n credential: 'webexturnreachpwd',\n urls: [convertStunUrlToTurnTls(urlString)],\n };\n });\n\n return {\n iceServers: [...udpIceServers, ...tcpIceServers, ...turnTlsIceServers],\n iceCandidatePoolSize: 0,\n iceTransportPolicy: 'all',\n };\n }\n\n /**\n * Creates an RTCPeerConnection\n * @param {ClusterNode} clusterInfo information about the media cluster\n * @returns {RTCPeerConnection} peerConnection\n */\n private createPeerConnection(clusterInfo: ClusterNode) {\n try {\n const config = this.buildPeerConnectionConfig(clusterInfo);\n\n const peerConnection = new RTCPeerConnection(config);\n\n return peerConnection;\n } catch (peerConnectionError) {\n LoggerProxy.logger.warn(\n `Reachability:index#createPeerConnection --> Error creating peerConnection:`,\n peerConnectionError\n );\n\n return undefined;\n }\n }\n\n /**\n * @returns {ClusterReachabilityResult} reachability result for this cluster\n */\n getResult() {\n return this.result;\n }\n\n /**\n * Closes the peerConnection\n *\n * @returns {void}\n */\n private closePeerConnection() {\n if (this.pc) {\n this.pc.onicecandidate = null;\n this.pc.onicegatheringstatechange = null;\n this.pc.close();\n }\n }\n\n /**\n * Resolves the defer, indicating that reachability checks for this cluster are completed\n *\n * @returns {void}\n */\n private finishReachabilityCheck() {\n this.defer.resolve();\n }\n\n /**\n * Aborts the cluster reachability checks by closing the peer connection\n *\n * @returns {void}\n */\n public abort() {\n const {CLOSED} = CONNECTION_STATE;\n\n if (this.pc.connectionState !== CLOSED) {\n this.closePeerConnection();\n this.finishReachabilityCheck();\n }\n }\n\n /**\n * Adds public IP (client media IPs)\n * @param {string} protocol\n * @param {string} publicIP\n * @returns {void}\n */\n private addPublicIP(protocol: 'udp' | 'tcp' | 'xtls', publicIP?: string | null) {\n const result = this.result[protocol];\n\n if (publicIP) {\n let ipAdded = false;\n\n if (result.clientMediaIPs) {\n if (!result.clientMediaIPs.includes(publicIP)) {\n result.clientMediaIPs.push(publicIP);\n ipAdded = true;\n }\n } else {\n result.clientMediaIPs = [publicIP];\n ipAdded = true;\n }\n\n if (ipAdded)\n this.emit(\n {\n file: 'clusterReachability',\n function: 'addPublicIP',\n },\n Events.clientMediaIpsUpdated,\n {\n protocol,\n clientMediaIPs: result.clientMediaIPs,\n }\n );\n }\n }\n\n /**\n * Registers a listener for the iceGatheringStateChange event\n *\n * @returns {void}\n */\n private registerIceGatheringStateChangeListener() {\n this.pc.onicegatheringstatechange = () => {\n const {COMPLETE} = ICE_GATHERING_STATE;\n\n if (this.pc.iceConnectionState === COMPLETE) {\n this.closePeerConnection();\n this.finishReachabilityCheck();\n }\n };\n }\n\n /**\n * Checks if we have the results for all the protocols (UDP and TCP)\n *\n * @returns {boolean} true if we have all results, false otherwise\n */\n private haveWeGotAllResults(): boolean {\n return ['udp', 'tcp', 'xtls'].every(\n (protocol) =>\n this.result[protocol].result === 'reachable' || this.result[protocol].result === 'untested'\n );\n }\n\n /**\n * Saves the latency in the result for the given protocol and marks it as reachable,\n * emits the \"resultReady\" event if this is the first result for that protocol,\n * emits the \"clientMediaIpsUpdated\" event if we already had a result and only found\n * a new client IP\n *\n * @param {string} protocol\n * @param {number} latency\n * @param {string|null} [publicIp]\n * @returns {void}\n */\n private saveResult(protocol: 'udp' | 'tcp' | 'xtls', latency: number, publicIp?: string | null) {\n const result = this.result[protocol];\n\n if (result.latencyInMilliseconds === undefined) {\n LoggerProxy.logger.log(\n // @ts-ignore\n `Reachability:index#saveResult --> Successfully reached ${this.name} over ${protocol}: ${latency}ms`\n );\n result.latencyInMilliseconds = latency;\n result.result = 'reachable';\n if (publicIp) {\n result.clientMediaIPs = [publicIp];\n }\n\n this.emit(\n {\n file: 'clusterReachability',\n function: 'saveResult',\n },\n Events.resultReady,\n {\n protocol,\n ...result,\n }\n );\n } else {\n this.addPublicIP(protocol, publicIp);\n }\n }\n\n /**\n * Registers a listener for the icecandidate event\n *\n * @returns {void}\n */\n private registerIceCandidateListener() {\n this.pc.onicecandidate = (e) => {\n const TURN_TLS_PORT = 443;\n const CANDIDATE_TYPES = {\n SERVER_REFLEXIVE: 'srflx',\n RELAY: 'relay',\n };\n\n const latencyInMilliseconds = this.getElapsedTime();\n\n if (e.candidate) {\n if (e.candidate.type === CANDIDATE_TYPES.SERVER_REFLEXIVE) {\n this.saveResult('udp', latencyInMilliseconds, e.candidate.address);\n }\n\n if (e.candidate.type === CANDIDATE_TYPES.RELAY) {\n const protocol = e.candidate.port === TURN_TLS_PORT ? 'xtls' : 'tcp';\n this.saveResult(protocol, latencyInMilliseconds);\n // we don't add public IP for TCP, because in the case of relay candidates\n // e.candidate.address is the TURN server address, not the client's public IP\n }\n\n if (this.haveWeGotAllResults()) {\n this.closePeerConnection();\n this.finishReachabilityCheck();\n }\n }\n };\n }\n\n /**\n * Starts the process of doing UDP and TCP reachability checks on the media cluster.\n * XTLS reachability checking is not supported.\n *\n * @returns {Promise}\n */\n async start(): Promise<ClusterReachabilityResult> {\n if (!this.pc) {\n LoggerProxy.logger.warn(\n `Reachability:ClusterReachability#start --> Error: peerConnection is undefined`\n );\n\n return this.result;\n }\n\n // Initialize this.result as saying that nothing is reachable.\n // It will get updated as we go along and successfully gather ICE candidates.\n this.result.udp = {\n result: this.numUdpUrls > 0 ? 'unreachable' : 'untested',\n };\n this.result.tcp = {\n result: this.numTcpUrls > 0 ? 'unreachable' : 'untested',\n };\n this.result.xtls = {\n result: this.numXTlsUrls > 0 ? 'unreachable' : 'untested',\n };\n\n try {\n const offer = await this.pc.createOffer({offerToReceiveAudio: true});\n\n this.startTimestamp = performance.now();\n\n // Set up the state change listeners before triggering the ICE gathering\n const gatherIceCandidatePromise = this.gatherIceCandidates();\n\n // not awaiting the next call on purpose, because we're not sending the offer anywhere and there won't be any answer\n // we just need to make this call to trigger the ICE gathering process\n this.pc.setLocalDescription(offer);\n\n await gatherIceCandidatePromise;\n } catch (error) {\n LoggerProxy.logger.warn(`Reachability:ClusterReachability#start --> Error: `, error);\n }\n\n return this.result;\n }\n\n /**\n * Starts the process of gathering ICE candidates\n *\n * @returns {Promise} promise that's resolved once reachability checks for this cluster are completed or timeout is reached\n */\n private gatherIceCandidates() {\n this.registerIceGatheringStateChangeListener();\n this.registerIceCandidateListener();\n\n return this.defer.promise;\n }\n}\n"],"mappings":"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"}
|
1
|
+
{"version":3,"names":["_common","require","_loggerProxy","_interopRequireDefault","_util","_eventsScope","_constants","_reachability","ownKeys","e","r","t","_Object$keys","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","result","NewTarget","constructor","_Reflect$construct","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","Events","exports","resultReady","clientMediaIpsUpdated","natTypeUpdated","ClusterReachability","_EventsScope","_inherits2","_super","name","clusterInfo","_this","_classCallCheck2","_assertThisInitialized2","_set","isVideoMesh","numUdpUrls","udp","numTcpUrls","tcp","numXTlsUrls","xtls","pc","createPeerConnection","defer","Defer","_createClass2","key","value","getElapsedTime","Math","round","performance","now","startTimestamp","buildPeerConnectionConfig","cluster","udpIceServers","map","url","username","credential","urls","tcpIceServers","urlString","convertStunUrlToTurn","turnTlsIceServers","convertStunUrlToTurnTls","iceServers","concat","_toConsumableArray2","iceCandidatePoolSize","iceTransportPolicy","config","peerConnection","RTCPeerConnection","peerConnectionError","LoggerProxy","logger","warn","undefined","getResult","closePeerConnection","onicecandidate","onicegatheringstatechange","close","finishReachabilityCheck","resolve","abort","CLOSED","CONNECTION_STATE","connectionState","addPublicIP","protocol","publicIP","ipAdded","clientMediaIPs","includes","emit","file","function","registerIceGatheringStateChangeListener","_this2","iceGatheringState","ICE_GATHERING_STATE","COMPLETE","saveResult","latency","publicIp","serverIp","latencyInMilliseconds","log","reachedSubnets","add","determineNatType","candidate","_this3","srflxIceCandidates","portsFound","c","address","relatedPort","port","_entries","_ref","_ref2","_slicedToArray2","ports","size","natType","NatType","SymmetricNat","registerIceCandidateListener","_this4","TURN_TLS_PORT","CANDIDATE_TYPES","SERVER_REFLEXIVE","RELAY","type","stunServerUrlRegex","match","_start","_asyncToGenerator2","_regenerator","mark","_callee","offer","gatherIceCandidatePromise","wrap","_callee$","_context","prev","next","abrupt","createOffer","offerToReceiveAudio","sent","gatherIceCandidates","setLocalDescription","t0","stop","start","promise","EventsScope"],"sources":["clusterReachability.ts"],"sourcesContent":["import {Defer} from '@webex/common';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {ClusterNode} from './request';\nimport {convertStunUrlToTurn, convertStunUrlToTurnTls} from './util';\nimport EventsScope from '../common/events/events-scope';\n\nimport {CONNECTION_STATE, Enum, ICE_GATHERING_STATE} from '../constants';\nimport {ClusterReachabilityResult, NatType} from './reachability.types';\n\n// data for the Events.resultReady event\nexport type ResultEventData = {\n protocol: 'udp' | 'tcp' | 'xtls';\n result: 'reachable' | 'unreachable' | 'untested';\n latencyInMilliseconds: number; // amount of time it took to get the ICE candidate\n clientMediaIPs?: string[];\n};\n\n// data for the Events.clientMediaIpsUpdated event\nexport type ClientMediaIpsUpdatedEventData = {\n protocol: 'udp' | 'tcp' | 'xtls';\n clientMediaIPs: string[];\n};\n\nexport type NatTypeUpdatedEventData = {\n natType: NatType;\n};\n\nexport const Events = {\n resultReady: 'resultReady', // emitted when a cluster is reached successfully using specific protocol\n clientMediaIpsUpdated: 'clientMediaIpsUpdated', // emitted when more public IPs are found after resultReady was already sent for a given protocol\n natTypeUpdated: 'natTypeUpdated', // emitted when NAT type is determined\n} as const;\n\nexport type Events = Enum<typeof Events>;\n\n/**\n * A class that handles reachability checks for a single cluster.\n * It emits events from Events enum\n */\nexport class ClusterReachability extends EventsScope {\n private numUdpUrls: number;\n private numTcpUrls: number;\n private numXTlsUrls: number;\n private result: ClusterReachabilityResult;\n private pc?: RTCPeerConnection;\n private defer: Defer; // this defer is resolved once reachability checks for this cluster are completed\n private startTimestamp: number;\n private srflxIceCandidates: RTCIceCandidate[] = [];\n public readonly isVideoMesh: boolean;\n public readonly name;\n public readonly reachedSubnets: Set<string> = new Set();\n\n /**\n * Constructor for ClusterReachability\n * @param {string} name cluster name\n * @param {ClusterNode} clusterInfo information about the media cluster\n */\n constructor(name: string, clusterInfo: ClusterNode) {\n super();\n this.name = name;\n this.isVideoMesh = clusterInfo.isVideoMesh;\n this.numUdpUrls = clusterInfo.udp.length;\n this.numTcpUrls = clusterInfo.tcp.length;\n this.numXTlsUrls = clusterInfo.xtls.length;\n\n this.pc = this.createPeerConnection(clusterInfo);\n\n this.defer = new Defer();\n this.result = {\n udp: {\n result: 'untested',\n },\n tcp: {\n result: 'untested',\n },\n xtls: {\n result: 'untested',\n },\n };\n }\n\n /**\n * Gets total elapsed time, can be called only after start() is called\n * @returns {Number} Milliseconds\n */\n private getElapsedTime() {\n return Math.round(performance.now() - this.startTimestamp);\n }\n\n /**\n * Generate peerConnection config settings\n * @param {ClusterNode} cluster\n * @returns {RTCConfiguration} peerConnectionConfig\n */\n private buildPeerConnectionConfig(cluster: ClusterNode): RTCConfiguration {\n const udpIceServers = cluster.udp.map((url) => ({\n username: '',\n credential: '',\n urls: [url],\n }));\n\n // STUN servers are contacted only using UDP, so in order to test TCP reachability\n // we pretend that Linus is a TURN server, because we can explicitly say \"transport=tcp\" in TURN urls.\n // We then check for relay candidates to know if TURN-TCP worked (see registerIceCandidateListener()).\n const tcpIceServers = cluster.tcp.map((urlString: string) => {\n return {\n username: 'webexturnreachuser',\n credential: 'webexturnreachpwd',\n urls: [convertStunUrlToTurn(urlString, 'tcp')],\n };\n });\n\n const turnTlsIceServers = cluster.xtls.map((urlString: string) => {\n return {\n username: 'webexturnreachuser',\n credential: 'webexturnreachpwd',\n urls: [convertStunUrlToTurnTls(urlString)],\n };\n });\n\n return {\n iceServers: [...udpIceServers, ...tcpIceServers, ...turnTlsIceServers],\n iceCandidatePoolSize: 0,\n iceTransportPolicy: 'all',\n };\n }\n\n /**\n * Creates an RTCPeerConnection\n * @param {ClusterNode} clusterInfo information about the media cluster\n * @returns {RTCPeerConnection} peerConnection\n */\n private createPeerConnection(clusterInfo: ClusterNode) {\n try {\n const config = this.buildPeerConnectionConfig(clusterInfo);\n\n const peerConnection = new RTCPeerConnection(config);\n\n return peerConnection;\n } catch (peerConnectionError) {\n LoggerProxy.logger.warn(\n `Reachability:index#createPeerConnection --> Error creating peerConnection:`,\n peerConnectionError\n );\n\n return undefined;\n }\n }\n\n /**\n * @returns {ClusterReachabilityResult} reachability result for this cluster\n */\n getResult() {\n return this.result;\n }\n\n /**\n * Closes the peerConnection\n *\n * @returns {void}\n */\n private closePeerConnection() {\n if (this.pc) {\n this.pc.onicecandidate = null;\n this.pc.onicegatheringstatechange = null;\n this.pc.close();\n }\n }\n\n /**\n * Resolves the defer, indicating that reachability checks for this cluster are completed\n *\n * @returns {void}\n */\n private finishReachabilityCheck() {\n this.defer.resolve();\n }\n\n /**\n * Aborts the cluster reachability checks by closing the peer connection\n *\n * @returns {void}\n */\n public abort() {\n const {CLOSED} = CONNECTION_STATE;\n\n if (this.pc.connectionState !== CLOSED) {\n this.closePeerConnection();\n this.finishReachabilityCheck();\n }\n }\n\n /**\n * Adds public IP (client media IPs)\n * @param {string} protocol\n * @param {string} publicIP\n * @returns {void}\n */\n private addPublicIP(protocol: 'udp' | 'tcp' | 'xtls', publicIP?: string | null) {\n const result = this.result[protocol];\n\n if (publicIP) {\n let ipAdded = false;\n\n if (result.clientMediaIPs) {\n if (!result.clientMediaIPs.includes(publicIP)) {\n result.clientMediaIPs.push(publicIP);\n ipAdded = true;\n }\n } else {\n result.clientMediaIPs = [publicIP];\n ipAdded = true;\n }\n\n if (ipAdded)\n this.emit(\n {\n file: 'clusterReachability',\n function: 'addPublicIP',\n },\n Events.clientMediaIpsUpdated,\n {\n protocol,\n clientMediaIPs: result.clientMediaIPs,\n }\n );\n }\n }\n\n /**\n * Registers a listener for the iceGatheringStateChange event\n *\n * @returns {void}\n */\n private registerIceGatheringStateChangeListener() {\n this.pc.onicegatheringstatechange = () => {\n if (this.pc.iceGatheringState === ICE_GATHERING_STATE.COMPLETE) {\n this.closePeerConnection();\n this.finishReachabilityCheck();\n }\n };\n }\n\n /**\n * Saves the latency in the result for the given protocol and marks it as reachable,\n * emits the \"resultReady\" event if this is the first result for that protocol,\n * emits the \"clientMediaIpsUpdated\" event if we already had a result and only found\n * a new client IP\n *\n * @param {string} protocol\n * @param {number} latency\n * @param {string|null} [publicIp]\n * @param {string|null} [serverIp]\n * @returns {void}\n */\n private saveResult(\n protocol: 'udp' | 'tcp' | 'xtls',\n latency: number,\n publicIp?: string | null,\n serverIp?: string | null\n ) {\n const result = this.result[protocol];\n\n if (result.latencyInMilliseconds === undefined) {\n LoggerProxy.logger.log(\n // @ts-ignore\n `Reachability:index#saveResult --> Successfully reached ${this.name} over ${protocol}: ${latency}ms`\n );\n result.latencyInMilliseconds = latency;\n result.result = 'reachable';\n if (publicIp) {\n result.clientMediaIPs = [publicIp];\n }\n\n this.emit(\n {\n file: 'clusterReachability',\n function: 'saveResult',\n },\n Events.resultReady,\n {\n protocol,\n ...result,\n }\n );\n } else {\n this.addPublicIP(protocol, publicIp);\n }\n\n if (serverIp) {\n this.reachedSubnets.add(serverIp);\n }\n }\n\n /**\n * Determines NAT Type.\n *\n * @param {RTCIceCandidate} candidate\n * @returns {void}\n */\n private determineNatType(candidate: RTCIceCandidate) {\n this.srflxIceCandidates.push(candidate);\n\n if (this.srflxIceCandidates.length > 1) {\n const portsFound: Record<string, Set<number>> = {};\n\n this.srflxIceCandidates.forEach((c) => {\n const key = `${c.address}:${c.relatedPort}`;\n if (!portsFound[key]) {\n portsFound[key] = new Set();\n }\n portsFound[key].add(c.port);\n });\n\n Object.entries(portsFound).forEach(([, ports]) => {\n if (ports.size > 1) {\n // Found candidates with the same address and relatedPort, but different ports\n this.emit(\n {\n file: 'clusterReachability',\n function: 'determineNatType',\n },\n Events.natTypeUpdated,\n {\n natType: NatType.SymmetricNat,\n }\n );\n }\n });\n }\n }\n\n /**\n * Registers a listener for the icecandidate event\n *\n * @returns {void}\n */\n private registerIceCandidateListener() {\n this.pc.onicecandidate = (e) => {\n const TURN_TLS_PORT = 443;\n const CANDIDATE_TYPES = {\n SERVER_REFLEXIVE: 'srflx',\n RELAY: 'relay',\n };\n\n const latencyInMilliseconds = this.getElapsedTime();\n\n if (e.candidate) {\n if (e.candidate.type === CANDIDATE_TYPES.SERVER_REFLEXIVE) {\n let serverIp = null;\n if ('url' in e.candidate) {\n const stunServerUrlRegex = /stun:([\\d.]+):\\d+/;\n\n const match = (e.candidate as any).url.match(stunServerUrlRegex);\n if (match) {\n // eslint-disable-next-line prefer-destructuring\n serverIp = match[1];\n }\n }\n\n this.saveResult('udp', latencyInMilliseconds, e.candidate.address, serverIp);\n\n this.determineNatType(e.candidate);\n }\n\n if (e.candidate.type === CANDIDATE_TYPES.RELAY) {\n const protocol = e.candidate.port === TURN_TLS_PORT ? 'xtls' : 'tcp';\n this.saveResult(protocol, latencyInMilliseconds, null, e.candidate.address);\n }\n }\n };\n }\n\n /**\n * Starts the process of doing UDP and TCP reachability checks on the media cluster.\n * XTLS reachability checking is not supported.\n *\n * @returns {Promise}\n */\n async start(): Promise<ClusterReachabilityResult> {\n if (!this.pc) {\n LoggerProxy.logger.warn(\n `Reachability:ClusterReachability#start --> Error: peerConnection is undefined`\n );\n\n return this.result;\n }\n\n // Initialize this.result as saying that nothing is reachable.\n // It will get updated as we go along and successfully gather ICE candidates.\n this.result.udp = {\n result: this.numUdpUrls > 0 ? 'unreachable' : 'untested',\n };\n this.result.tcp = {\n result: this.numTcpUrls > 0 ? 'unreachable' : 'untested',\n };\n this.result.xtls = {\n result: this.numXTlsUrls > 0 ? 'unreachable' : 'untested',\n };\n\n try {\n const offer = await this.pc.createOffer({offerToReceiveAudio: true});\n\n this.startTimestamp = performance.now();\n\n // Set up the state change listeners before triggering the ICE gathering\n const gatherIceCandidatePromise = this.gatherIceCandidates();\n\n // not awaiting the next call on purpose, because we're not sending the offer anywhere and there won't be any answer\n // we just need to make this call to trigger the ICE gathering process\n this.pc.setLocalDescription(offer);\n\n await gatherIceCandidatePromise;\n } catch (error) {\n LoggerProxy.logger.warn(`Reachability:ClusterReachability#start --> Error: `, error);\n }\n\n return this.result;\n }\n\n /**\n * Starts the process of gathering ICE candidates\n *\n * @returns {Promise} promise that's resolved once reachability checks for this cluster are completed or timeout is reached\n */\n private gatherIceCandidates() {\n this.registerIceGatheringStateChangeListener();\n this.registerIceCandidateListener();\n\n return this.defer.promise;\n }\n}\n"],"mappings":"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"}
|
@@ -15,6 +15,8 @@ exports.default = void 0;
|
|
15
15
|
var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
|
16
16
|
var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
|
17
17
|
var _values = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/values"));
|
18
|
+
var _from = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/array/from"));
|
19
|
+
var _set = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/set"));
|
18
20
|
var _entries = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/entries"));
|
19
21
|
var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
|
20
22
|
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/toConsumableArray"));
|
@@ -33,6 +35,7 @@ var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy")
|
|
33
35
|
var _util = _interopRequireDefault(require("../meeting/util"));
|
34
36
|
var _constants = require("../constants");
|
35
37
|
var _request = _interopRequireDefault(require("./request"));
|
38
|
+
var _reachability = require("./reachability.types");
|
36
39
|
var _clusterReachability = require("./clusterReachability");
|
37
40
|
var _eventsScope = _interopRequireDefault(require("../common/events/events-scope"));
|
38
41
|
var _constants2 = _interopRequireDefault(require("../metrics/constants"));
|
@@ -96,6 +99,7 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
|
|
96
99
|
});
|
97
100
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "startTime", undefined);
|
98
101
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "totalDuration", undefined);
|
102
|
+
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "natType", _reachability.NatType.Unknown);
|
99
103
|
(0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "lastTrigger", void 0);
|
100
104
|
_this.webex = webex;
|
101
105
|
|
@@ -174,6 +178,40 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
|
|
174
178
|
}
|
175
179
|
return getClusters;
|
176
180
|
}()
|
181
|
+
/**
|
182
|
+
* Checks if the given subnet is reachable
|
183
|
+
* @param {string} selectedSubnetFirstOctet - selected subnet first octet, e.g. "10" for "10.X.X.X"
|
184
|
+
* @returns {boolean | null} true if reachable, false if not reachable, null if mediaServerIp is not provided
|
185
|
+
* @public
|
186
|
+
* @memberof Reachability
|
187
|
+
*/
|
188
|
+
)
|
189
|
+
}, {
|
190
|
+
key: "isSubnetReachable",
|
191
|
+
value: function isSubnetReachable(selectedSubnetFirstOctet) {
|
192
|
+
_loggerProxy.default.logger.info("Reachability:index#isSubnetReachable --> Looking for subnet: ".concat(selectedSubnetFirstOctet, ".X.X.X"));
|
193
|
+
var matchingReachedClusters = (0, _values.default)(this.clusterReachability).reduce(function (acc, cluster) {
|
194
|
+
var reachedSubnetsArray = (0, _from.default)(cluster.reachedSubnets);
|
195
|
+
var logMessage = "Reachability:index#isSubnetReachable --> Cluster ".concat(cluster.name, " reached [");
|
196
|
+
for (var i = 0; i < reachedSubnetsArray.length; i += 1) {
|
197
|
+
var subnet = reachedSubnetsArray[i];
|
198
|
+
var reachedSubnetFirstOctet = subnet.split('.')[0];
|
199
|
+
if (selectedSubnetFirstOctet === reachedSubnetFirstOctet) {
|
200
|
+
acc.add(cluster.name);
|
201
|
+
}
|
202
|
+
logMessage += "".concat(subnet);
|
203
|
+
if (i < reachedSubnetsArray.length - 1) {
|
204
|
+
logMessage += ',';
|
205
|
+
}
|
206
|
+
}
|
207
|
+
logMessage += "]";
|
208
|
+
_loggerProxy.default.logger.info(logMessage);
|
209
|
+
return acc;
|
210
|
+
}, new _set.default());
|
211
|
+
_loggerProxy.default.logger.info("Reachability:index#isSubnetReachable --> Found ".concat(matchingReachedClusters.size, " clusters that use the subnet ").concat(selectedSubnetFirstOctet, ".X.X.X"));
|
212
|
+
return matchingReachedClusters.size > 0;
|
213
|
+
}
|
214
|
+
|
177
215
|
/**
|
178
216
|
* Gets a list of media clusters from the backend and performs reachability checks on all the clusters
|
179
217
|
* @param {string} trigger - explains the reason for starting reachability
|
@@ -181,7 +219,6 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
|
|
181
219
|
* @public
|
182
220
|
* @memberof Reachability
|
183
221
|
*/
|
184
|
-
)
|
185
222
|
}, {
|
186
223
|
key: "gatherReachability",
|
187
224
|
value: (function () {
|
@@ -190,35 +227,41 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
|
|
190
227
|
return _regenerator.default.wrap(function _callee2$(_context2) {
|
191
228
|
while (1) switch (_context2.prev = _context2.next) {
|
192
229
|
case 0:
|
193
|
-
|
230
|
+
if (this.webex.config.meetings.enableReachabilityChecks) {
|
231
|
+
_context2.next = 2;
|
232
|
+
break;
|
233
|
+
}
|
234
|
+
throw new Error('enableReachabilityChecks is disabled in config');
|
235
|
+
case 2:
|
236
|
+
_context2.prev = 2;
|
194
237
|
this.lastTrigger = trigger;
|
195
238
|
|
196
239
|
// kick off ip version detection. We don't await it, as we don't want to waste time
|
197
240
|
// and if it fails, that's ok we can still carry on
|
198
241
|
// @ts-ignore
|
199
242
|
this.webex.internal.device.ipNetworkDetector.detect(true);
|
200
|
-
_context2.next =
|
243
|
+
_context2.next = 7;
|
201
244
|
return this.getClusters('startup');
|
202
|
-
case
|
245
|
+
case 7:
|
203
246
|
_yield$this$getCluste = _context2.sent;
|
204
247
|
clusters = _yield$this$getCluste.clusters;
|
205
248
|
this.reachabilityDefer = new _common.Defer();
|
206
249
|
|
207
250
|
// Perform Reachability Check
|
208
|
-
_context2.next =
|
251
|
+
_context2.next = 12;
|
209
252
|
return this.performReachabilityChecks(clusters);
|
210
|
-
case
|
253
|
+
case 12:
|
211
254
|
return _context2.abrupt("return", this.reachabilityDefer.promise);
|
212
|
-
case
|
213
|
-
_context2.prev =
|
214
|
-
_context2.t0 = _context2["catch"](
|
255
|
+
case 15:
|
256
|
+
_context2.prev = 15;
|
257
|
+
_context2.t0 = _context2["catch"](2);
|
215
258
|
_loggerProxy.default.logger.error("Reachability:index#gatherReachability --> Error:", _context2.t0);
|
216
259
|
return _context2.abrupt("return", {});
|
217
|
-
case
|
260
|
+
case 19:
|
218
261
|
case "end":
|
219
262
|
return _context2.stop();
|
220
263
|
}
|
221
|
-
}, _callee2, this, [[
|
264
|
+
}, _callee2, this, [[2, 15]]);
|
222
265
|
}));
|
223
266
|
function gatherReachability(_x3) {
|
224
267
|
return _gatherReachability.apply(this, arguments);
|
@@ -388,7 +431,7 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
|
|
388
431
|
function: 'stopReachability'
|
389
432
|
}, 'reachability:stopped', {});
|
390
433
|
this.sendMetric(true);
|
391
|
-
this.resolveReachabilityPromise();
|
434
|
+
this.resolveReachabilityPromise(false);
|
392
435
|
}
|
393
436
|
}
|
394
437
|
|
@@ -418,7 +461,8 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
|
|
418
461
|
reachability_vmn_tcp_success: 0,
|
419
462
|
reachability_vmn_tcp_failed: 0,
|
420
463
|
reachability_vmn_xtls_success: 0,
|
421
|
-
reachability_vmn_xtls_failed: 0
|
464
|
+
reachability_vmn_xtls_failed: 0,
|
465
|
+
natType: this.natType
|
422
466
|
};
|
423
467
|
updateStats = function updateStats(clusterType, result) {
|
424
468
|
if (result.udp && result.udp.result !== 'untested') {
|
@@ -1020,11 +1064,11 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
|
|
1020
1064
|
}, {
|
1021
1065
|
key: "performReachabilityChecks",
|
1022
1066
|
value: (function () {
|
1023
|
-
var _performReachabilityChecks = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function
|
1067
|
+
var _performReachabilityChecks = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee15(clusterList) {
|
1024
1068
|
var _this4 = this;
|
1025
1069
|
var results, isFirstResult;
|
1026
|
-
return _regenerator.default.wrap(function
|
1027
|
-
while (1) switch (
|
1070
|
+
return _regenerator.default.wrap(function _callee15$(_context15) {
|
1071
|
+
while (1) switch (_context15.prev = _context15.next) {
|
1028
1072
|
case 0:
|
1029
1073
|
results = {};
|
1030
1074
|
this.clusterReachability = {};
|
@@ -1082,11 +1126,11 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
|
|
1082
1126
|
tcp: true,
|
1083
1127
|
xtls: true
|
1084
1128
|
}; // save the initialized results (in case we don't get any "resultReady" events at all)
|
1085
|
-
|
1129
|
+
_context15.next = 9;
|
1086
1130
|
return this.storeResults(results);
|
1087
1131
|
case 9:
|
1088
1132
|
if (!(!clusterList || !(0, _keys.default)(clusterList).length)) {
|
1089
|
-
|
1133
|
+
_context15.next = 13;
|
1090
1134
|
break;
|
1091
1135
|
}
|
1092
1136
|
// nothing to do, finish immediately
|
@@ -1095,7 +1139,7 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
|
|
1095
1139
|
file: 'reachability',
|
1096
1140
|
function: 'performReachabilityChecks'
|
1097
1141
|
}, 'reachability:done', {});
|
1098
|
-
return
|
1142
|
+
return _context15.abrupt("return");
|
1099
1143
|
case 13:
|
1100
1144
|
this.startTimers();
|
1101
1145
|
|
@@ -1167,13 +1211,29 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
|
|
1167
1211
|
return _ref7.apply(this, arguments);
|
1168
1212
|
};
|
1169
1213
|
}());
|
1214
|
+
_this4.clusterReachability[key].on(_clusterReachability.Events.natTypeUpdated, /*#__PURE__*/function () {
|
1215
|
+
var _ref8 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee14(data) {
|
1216
|
+
return _regenerator.default.wrap(function _callee14$(_context14) {
|
1217
|
+
while (1) switch (_context14.prev = _context14.next) {
|
1218
|
+
case 0:
|
1219
|
+
_this4.natType = data.natType;
|
1220
|
+
case 1:
|
1221
|
+
case "end":
|
1222
|
+
return _context14.stop();
|
1223
|
+
}
|
1224
|
+
}, _callee14);
|
1225
|
+
}));
|
1226
|
+
return function (_x8) {
|
1227
|
+
return _ref8.apply(this, arguments);
|
1228
|
+
};
|
1229
|
+
}());
|
1170
1230
|
_this4.clusterReachability[key].start(); // not awaiting on purpose
|
1171
1231
|
});
|
1172
1232
|
case 15:
|
1173
1233
|
case "end":
|
1174
|
-
return
|
1234
|
+
return _context15.stop();
|
1175
1235
|
}
|
1176
|
-
},
|
1236
|
+
}, _callee15, this);
|
1177
1237
|
}));
|
1178
1238
|
function performReachabilityChecks(_x5) {
|
1179
1239
|
return _performReachabilityChecks.apply(this, arguments);
|
@@ -1192,42 +1252,42 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
|
|
1192
1252
|
}, {
|
1193
1253
|
key: "getClientMediaPreferences",
|
1194
1254
|
value: (function () {
|
1195
|
-
var _getClientMediaPreferences = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function
|
1255
|
+
var _getClientMediaPreferences = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee16(isMultistream, ipver) {
|
1196
1256
|
var reachabilityReport;
|
1197
|
-
return _regenerator.default.wrap(function
|
1198
|
-
while (1) switch (
|
1257
|
+
return _regenerator.default.wrap(function _callee16$(_context16) {
|
1258
|
+
while (1) switch (_context16.prev = _context16.next) {
|
1199
1259
|
case 0:
|
1200
1260
|
if (this.orpheusApiVersion) {
|
1201
|
-
|
1261
|
+
_context16.next = 7;
|
1202
1262
|
break;
|
1203
1263
|
}
|
1204
|
-
|
1205
|
-
|
1264
|
+
_context16.t0 = ipver;
|
1265
|
+
_context16.next = 4;
|
1206
1266
|
return this.getJoinCookie();
|
1207
1267
|
case 4:
|
1208
|
-
|
1209
|
-
|
1210
|
-
return
|
1211
|
-
ipver:
|
1212
|
-
joinCookie:
|
1213
|
-
preferTranscoding:
|
1268
|
+
_context16.t1 = _context16.sent;
|
1269
|
+
_context16.t2 = !isMultistream;
|
1270
|
+
return _context16.abrupt("return", {
|
1271
|
+
ipver: _context16.t0,
|
1272
|
+
joinCookie: _context16.t1,
|
1273
|
+
preferTranscoding: _context16.t2
|
1214
1274
|
});
|
1215
1275
|
case 7:
|
1216
|
-
|
1276
|
+
_context16.next = 9;
|
1217
1277
|
return this.getReachabilityReport();
|
1218
1278
|
case 9:
|
1219
|
-
reachabilityReport =
|
1220
|
-
return
|
1279
|
+
reachabilityReport = _context16.sent;
|
1280
|
+
return _context16.abrupt("return", _objectSpread({
|
1221
1281
|
ipver: ipver,
|
1222
1282
|
preferTranscoding: !isMultistream
|
1223
1283
|
}, reachabilityReport));
|
1224
1284
|
case 11:
|
1225
1285
|
case "end":
|
1226
|
-
return
|
1286
|
+
return _context16.stop();
|
1227
1287
|
}
|
1228
|
-
},
|
1288
|
+
}, _callee16, this);
|
1229
1289
|
}));
|
1230
|
-
function getClientMediaPreferences(
|
1290
|
+
function getClientMediaPreferences(_x9, _x10) {
|
1231
1291
|
return _getClientMediaPreferences.apply(this, arguments);
|
1232
1292
|
}
|
1233
1293
|
return getClientMediaPreferences;
|
@@ -1243,22 +1303,22 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
|
|
1243
1303
|
}, {
|
1244
1304
|
key: "getReachabilityReportToAttachToRoap",
|
1245
1305
|
value: (function () {
|
1246
|
-
var _getReachabilityReportToAttachToRoap = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function
|
1247
|
-
return _regenerator.default.wrap(function
|
1248
|
-
while (1) switch (
|
1306
|
+
var _getReachabilityReportToAttachToRoap = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee17() {
|
1307
|
+
return _regenerator.default.wrap(function _callee17$(_context17) {
|
1308
|
+
while (1) switch (_context17.prev = _context17.next) {
|
1249
1309
|
case 0:
|
1250
1310
|
if (this.orpheusApiVersion) {
|
1251
|
-
|
1311
|
+
_context17.next = 2;
|
1252
1312
|
break;
|
1253
1313
|
}
|
1254
|
-
return
|
1314
|
+
return _context17.abrupt("return", this.getReachabilityResults());
|
1255
1315
|
case 2:
|
1256
|
-
return
|
1316
|
+
return _context17.abrupt("return", undefined);
|
1257
1317
|
case 3:
|
1258
1318
|
case "end":
|
1259
|
-
return
|
1319
|
+
return _context17.stop();
|
1260
1320
|
}
|
1261
|
-
},
|
1321
|
+
}, _callee17, this);
|
1262
1322
|
}));
|
1263
1323
|
function getReachabilityReportToAttachToRoap() {
|
1264
1324
|
return _getReachabilityReportToAttachToRoap.apply(this, arguments);
|