@webex/plugin-meetings 3.12.0-next.91 → 3.12.0-next.93

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.
Files changed (38) hide show
  1. package/dist/aiEnableRequest/index.js +1 -1
  2. package/dist/breakouts/breakout.js +1 -1
  3. package/dist/breakouts/index.js +1 -1
  4. package/dist/common/errors/webex-errors.js +47 -5
  5. package/dist/common/errors/webex-errors.js.map +1 -1
  6. package/dist/interpretation/index.js +1 -1
  7. package/dist/interpretation/siLanguage.js +1 -1
  8. package/dist/locus-info/index.js +14 -5
  9. package/dist/locus-info/index.js.map +1 -1
  10. package/dist/media/MediaConnectionAwaiter.js +15 -2
  11. package/dist/media/MediaConnectionAwaiter.js.map +1 -1
  12. package/dist/media/index.js +5 -1
  13. package/dist/media/index.js.map +1 -1
  14. package/dist/meeting/index.js +458 -365
  15. package/dist/meeting/index.js.map +1 -1
  16. package/dist/reachability/clusterReachability.js.map +1 -1
  17. package/dist/reachability/index.js +111 -70
  18. package/dist/reachability/index.js.map +1 -1
  19. package/dist/types/common/errors/webex-errors.d.ts +31 -2
  20. package/dist/types/media/MediaConnectionAwaiter.d.ts +10 -1
  21. package/dist/types/meeting/index.d.ts +18 -3
  22. package/dist/types/reachability/clusterReachability.d.ts +3 -3
  23. package/dist/types/reachability/index.d.ts +9 -2
  24. package/dist/webinar/index.js +1 -1
  25. package/package.json +3 -3
  26. package/src/common/errors/webex-errors.ts +47 -3
  27. package/src/locus-info/index.ts +15 -5
  28. package/src/media/MediaConnectionAwaiter.ts +21 -4
  29. package/src/media/index.ts +7 -1
  30. package/src/meeting/index.ts +100 -27
  31. package/src/reachability/clusterReachability.ts +3 -2
  32. package/src/reachability/index.ts +28 -1
  33. package/test/unit/spec/common/errors/webex-errors.ts +62 -0
  34. package/test/unit/spec/locus-info/index.js +44 -0
  35. package/test/unit/spec/media/MediaConnectionAwaiter.ts +55 -0
  36. package/test/unit/spec/media/index.ts +61 -0
  37. package/test/unit/spec/meeting/index.js +290 -8
  38. package/test/unit/spec/reachability/index.ts +69 -0
@@ -1 +1 @@
1
- {"version":3,"names":["_lodash","require","_common","_webCapabilities","_loggerProxy","_interopRequireDefault","_util","_constants","_request","_reachability","_clusterReachability","_util2","_eventsScope","_constants2","_metrics","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","Boolean","prototype","valueOf","call","DEFAULT_TIMEOUT","VIDEO_MESH_TIMEOUT","OVERALL_TIMEOUT","Reachability","exports","_EventsScope","webex","_this","_classCallCheck2","REACHABILITY","namespace","videoMesh","udp","public","tcp","xtls","undefined","NatType","Unknown","reachabilityRequest","ReachabilityRequest","clusterReachability","_inherits2","_createClass2","key","value","_getClusters","_asyncToGenerator2","_regenerator","mark","_callee","trigger","previousReport","isRetry","_yield$this$reachabil","clusters","joinCookie","discoveryOptions","_args","_t","wrap","_context","prev","next","getClusters","MeetingUtil","getIpVersion","sent","minRequiredClusters","orpheusApiVersion","boundedStorage","put","localStorageJoinCookie","_stringify","abrupt","LoggerProxy","logger","error","concat","stop","_x","_x2","isSubnetReachable","selectedSubnetFirstOctet","info","matchingReachedClusters","_values","reduce","acc","cluster","reachedSubnetsArray","_from","reachedSubnets","logMessage","name","i","subnet","reachedSubnetFirstOctet","split","add","_set","size","_gatherReachability","_callee2","_yield$this$getCluste","_t2","_context2","isReachabilityEnabled","config","meetings","enableReachabilityChecks","Error","WebCapabilities","supportsRTCPeerConnection","CapabilityState","CAPABLE","warn","lastTrigger","internal","device","ipNetworkDetector","detect","reachabilityDefer","Defer","performReachabilityChecks","promise","gatherReachability","_x3","_getJoinCookie","_callee3","joinCookieRaw","_context3","get","catch","JSON","parse","getJoinCookie","_getReachabilityReport","_callee4","reachabilityResult","_context4","getReachabilityResults","reachability","version","result","usedDiscoveryOptions","metrics","totalDuration","tests","getReachabilityReport","_gatherReachabilityFallback","_callee5","reachabilityReport","_yield$this$getCluste2","_t3","_context5","abortCurrentChecks","gatherReachabilityFallback","stopReachability","overallTimer","log","emit","file","function","sendMetric","resolveReachabilityPromise","_getReachabilityMetrics","_callee6","stats","updateStats","resultsJson","results","_t4","_context6","reachability_public_udp_success","reachability_public_udp_failed","reachability_public_tcp_success","reachability_public_tcp_failed","reachability_public_xtls_success","reachability_public_xtls_failed","reachability_vmn_udp_success","reachability_vmn_udp_failed","reachability_vmn_tcp_success","reachability_vmn_tcp_failed","reachability_vmn_xtls_success","reachability_vmn_xtls_failed","natType","clusterType","outcome","localStorageResult","isVideoMesh","getReachabilityMetrics","mapTransportResultToBackendDataFormat","transportResult","output","_i","_Object$entries","_entries","_Object$entries$_i","_slicedToArray2","reachable","untested","latencyInMilliseconds","toString","_getReachabilityResults","_callee7","_this2","allClusterResults","_t5","_context7","mapValues","clusterResult","_isAnyPublicClusterReachable","_callee8","reachabilityData","reachabilityResults","_context8","some","_result$udp","_result$tcp","isAnyPublicClusterReachable","_isWebexMediaBackendUnreachable","_callee9","unreachable","protocols","_context9","tested","_keys","protocol","_result$protocol","_result$protocol2","every","isWebexMediaBackendUnreachable","getUnreachableClusters","unreachableList","_ref","_ref2","getResult","getNumberOfReachableClusters","count","_ref3","_ref4","logUnreachableClusters","list","_ref5","areAllPublicClusterResultsReady","isEqual","expectedResultsCount","resultsCount","areAllResultsReady","_this$reachabilityDef","checkMinRequiredClusters","performance","now","startTime","clearTimer","resolve","numReachableClusters","abortClusterReachability","abort","getStatistics","values","map","min","max","average","Math","_toConsumableArray2","mean","_sendMetric","_callee0","aborted","_args0","_context0","vmn","ipver","firstIpV4","firstIpV6","firstMdns","totalTime","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","REACHABILITY_COMPLETED","prepareMetricFields","startTimers","_this3","vmnTimer","setTimeout","publicCloudTimer","_storeResults","_callee1","_context1","storeResults","_x4","resetResultCounters","timer","clearTimeout","_performReachabilityChecks","_callee13","clusterList","_this4","enabledProtocols","isFirstResult","_context13","resolveReachabilityProtocols","tls","join","includeTcpReachability","includeTlsReachability","ClusterReachability","enablePerUdpUrlReachability","on","Events","resultReady","_ref6","_callee10","data","clientMediaIPs","_context10","_x6","clientMediaIpsUpdated","_ref7","_callee11","_context11","_x7","natTypeUpdated","_ref8","_callee12","_context12","_x8","start","_x5","_getClientMediaPreferences","_callee14","isMultistream","_t6","_t7","_t8","_context14","preferTranscoding","getClientMediaPreferences","_x9","_x0","_getReachabilityReportToAttachToRoap","_callee15","_context15","getReachabilityReportToAttachToRoap","EventsScope"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable class-methods-use-this */\nimport {isEqual, mapValues, mean} from 'lodash';\n\nimport {Defer} from '@webex/common';\nimport {CapabilityState, WebCapabilities} from '@webex/web-capabilities';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport MeetingUtil from '../meeting/util';\n\nimport {IP_VERSION, REACHABILITY} from '../constants';\n\nimport ReachabilityRequest, {ClusterList} from './request';\nimport {\n ClusterReachabilityResult,\n TransportResult,\n ClientMediaPreferences,\n ReachabilityMetrics,\n ReachabilityReportV0,\n ReachabilityReportV1,\n ReachabilityResults,\n ReachabilityResultsForBackend,\n TransportResultForBackend,\n GetClustersTrigger,\n NatType,\n} from './reachability.types';\nimport {\n ClientMediaIpsUpdatedEventData,\n ClusterReachability,\n Events,\n NatTypeUpdatedEventData,\n ResultEventData,\n} from './clusterReachability';\nimport {isReachabilityEnabled, resolveReachabilityProtocols} from './util';\nimport EventsScope from '../common/events/events-scope';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport Metrics from '../metrics';\n\n// timeouts in seconds\nconst DEFAULT_TIMEOUT = 3;\nconst VIDEO_MESH_TIMEOUT = 1;\nconst OVERALL_TIMEOUT = 15;\n\n/**\n * @class Reachability\n * @export\n */\nexport default class Reachability extends EventsScope {\n namespace = REACHABILITY.namespace;\n webex: object;\n reachabilityRequest: ReachabilityRequest;\n clusterReachability: {\n [key: string]: ClusterReachability;\n };\n\n minRequiredClusters?: number;\n orpheusApiVersion?: number;\n\n reachabilityDefer?: Defer;\n\n vmnTimer?: ReturnType<typeof setTimeout>;\n publicCloudTimer?: ReturnType<typeof setTimeout>;\n overallTimer?: ReturnType<typeof setTimeout>;\n\n expectedResultsCount = {videoMesh: {udp: 0}, public: {udp: 0, tcp: 0, xtls: 0}};\n resultsCount = {videoMesh: {udp: 0}, public: {udp: 0, tcp: 0, xtls: 0}};\n startTime = undefined;\n totalDuration = undefined;\n natType = NatType.Unknown;\n\n protected lastTrigger?: string;\n\n /**\n * Creates an instance of Reachability.\n * @param {object} webex\n * @memberof Reachability\n */\n constructor(webex: object) {\n super();\n this.webex = webex;\n\n /**\n * internal request object for the server\n * @instance\n * @type {Array}\n * @private\n * @memberof Reachability\n */\n this.reachabilityRequest = new ReachabilityRequest(this.webex);\n\n this.clusterReachability = {};\n }\n\n /**\n * Fetches the list of media clusters from the backend\n * @param {string} trigger - explains the reason for starting reachability, used by Orpheus\n * @param {Object} previousReport - last reachability report\n * @param {boolean} isRetry\n * @private\n * @returns {Promise<{clusters: ClusterList, joinCookie: any}>}\n */\n async getClusters(\n trigger: GetClustersTrigger,\n previousReport?: any,\n isRetry = false\n ): Promise<{\n clusters: ClusterList;\n joinCookie: any;\n }> {\n try {\n const {clusters, joinCookie, discoveryOptions} = await this.reachabilityRequest.getClusters(\n trigger,\n MeetingUtil.getIpVersion(this.webex),\n previousReport\n );\n\n this.minRequiredClusters = discoveryOptions?.['early-call-min-clusters'];\n this.orpheusApiVersion = discoveryOptions?.['report-version'];\n\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageJoinCookie,\n JSON.stringify(joinCookie)\n );\n\n return {clusters, joinCookie};\n } catch (error) {\n if (isRetry) {\n throw error;\n }\n\n LoggerProxy.logger.error(\n `Reachability:index#getClusters --> Failed with error: ${error}, retrying...`\n );\n\n return this.getClusters(trigger, previousReport, true);\n }\n }\n\n /**\n * Checks if the given subnet is reachable\n * @param {string} selectedSubnetFirstOctet - selected subnet first octet, e.g. \"10\" for \"10.X.X.X\"\n * @returns {boolean | null} true if reachable, false if not reachable, null if mediaServerIp is not provided\n * @public\n * @memberof Reachability\n */\n public isSubnetReachable(selectedSubnetFirstOctet: string): boolean | null {\n LoggerProxy.logger.info(\n `Reachability:index#isSubnetReachable --> Looking for subnet: ${selectedSubnetFirstOctet}.X.X.X`\n );\n\n const matchingReachedClusters = Object.values(this.clusterReachability).reduce(\n (acc, cluster) => {\n const reachedSubnetsArray = Array.from(cluster.reachedSubnets);\n\n let logMessage = `Reachability:index#isSubnetReachable --> Cluster ${cluster.name} reached [`;\n for (let i = 0; i < reachedSubnetsArray.length; i += 1) {\n const subnet = reachedSubnetsArray[i];\n const reachedSubnetFirstOctet = subnet.split('.')[0];\n\n if (selectedSubnetFirstOctet === reachedSubnetFirstOctet) {\n acc.add(cluster.name);\n }\n\n logMessage += `${subnet}`;\n if (i < reachedSubnetsArray.length - 1) {\n logMessage += ',';\n }\n }\n logMessage += `]`;\n\n LoggerProxy.logger.info(logMessage);\n\n return acc;\n },\n new Set<string>()\n );\n\n LoggerProxy.logger.info(\n `Reachability:index#isSubnetReachable --> Found ${matchingReachedClusters.size} clusters that use the subnet ${selectedSubnetFirstOctet}.X.X.X`\n );\n\n return matchingReachedClusters.size > 0;\n }\n\n /**\n * Gets a list of media clusters from the backend and performs reachability checks on all the clusters\n * @param {string} trigger - explains the reason for starting reachability\n * @returns {Promise<ReachabilityResults>} reachability results\n * @public\n * @memberof Reachability\n */\n public async gatherReachability(trigger: string): Promise<ReachabilityResults> {\n // @ts-ignore\n if (!isReachabilityEnabled(this.webex.config.meetings.enableReachabilityChecks)) {\n throw new Error('enableReachabilityChecks is disabled in config');\n }\n\n if (WebCapabilities.supportsRTCPeerConnection() !== CapabilityState.CAPABLE) {\n LoggerProxy.logger.warn(\n 'Reachability:index#gatherReachability --> WebRTC API is not available, skipping reachability checks'\n );\n\n return {};\n }\n // Fetch clusters and measure latency\n try {\n this.lastTrigger = trigger;\n\n // kick off ip version detection. We don't await it, as we don't want to waste time\n // and if it fails, that's ok we can still carry on\n // @ts-ignore\n this.webex.internal.device.ipNetworkDetector.detect(true);\n\n const {clusters} = await this.getClusters('startup');\n\n this.reachabilityDefer = new Defer();\n\n // Perform Reachability Check\n await this.performReachabilityChecks(clusters);\n\n return this.reachabilityDefer.promise;\n } catch (error) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachability --> Error:`, error);\n\n return {};\n }\n }\n\n /**\n * Gets the last join cookie we got from Orpheus\n *\n * @returns {Promise<Object>} join cookie\n */\n async getJoinCookie() {\n // @ts-ignore\n const joinCookieRaw = await this.webex.boundedStorage\n .get(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie)\n .catch(() => {});\n\n let joinCookie;\n\n if (joinCookieRaw) {\n try {\n joinCookie = JSON.parse(joinCookieRaw);\n } catch (e) {\n LoggerProxy.logger.error(\n `MeetingRequest#constructor --> Error in parsing join cookie data: ${e}`\n );\n }\n }\n\n return joinCookie;\n }\n\n /**\n * Returns the reachability report that needs to be attached to the ROAP messages\n * that we send to the backend.\n *\n * @returns {Promise<Object>}\n */\n async getReachabilityReport(): Promise<\n | {\n joinCookie: any;\n reachability?: ReachabilityReportV1;\n }\n | {\n reachability: ReachabilityReportV0;\n }\n > {\n const reachabilityResult = await this.getReachabilityResults();\n const joinCookie = await this.getJoinCookie();\n\n // Orpheus API version 0\n if (!this.orpheusApiVersion) {\n return {\n reachability: reachabilityResult,\n };\n }\n\n // Orpheus API version 1\n return {\n reachability: {\n version: 1,\n result: {\n usedDiscoveryOptions: {\n 'early-call-min-clusters': this.minRequiredClusters,\n },\n metrics: {\n 'total-duration-ms': this.totalDuration,\n },\n tests: reachabilityResult,\n },\n },\n joinCookie,\n };\n }\n\n /**\n * This method is called when we don't succeed in reaching the minimum number of clusters\n * required by Orpheus. It sends the results to Orpheus and gets a new list that it tries to reach again.\n * @returns {Promise<ReachabilityResults>} reachability results\n * @public\n * @memberof Reachability\n */\n public async gatherReachabilityFallback(): Promise<void> {\n try {\n const reachabilityReport = await this.getReachabilityReport();\n\n const {clusters} = await this.getClusters('early-call/no-min-reached', reachabilityReport);\n\n // stop all previous reachability checks that might still be going on in the background\n this.abortCurrentChecks();\n\n // Perform Reachability Check\n await this.performReachabilityChecks(clusters);\n } catch (error) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachabilityFallback --> Error:`, error);\n }\n }\n\n /**\n * Stops all reachability checks that are in progress\n * @public\n * @memberof Reachability\n * @returns {void}\n */\n public stopReachability() {\n // overallTimer is always there only if there is reachability in progress\n if (this.overallTimer) {\n LoggerProxy.logger.log(\n 'Reachability:index#stopReachability --> stopping reachability checks'\n );\n this.abortCurrentChecks();\n this.emit(\n {\n file: 'reachability',\n function: 'stopReachability',\n },\n 'reachability:stopped',\n {}\n );\n this.sendMetric(true);\n this.resolveReachabilityPromise(false);\n }\n }\n\n /**\n * Returns statistics about last reachability results. The returned value is an object\n * with a flat list of properties so that it can be easily sent with metrics\n *\n * @returns {Promise} Promise with metrics values, it never rejects/throws.\n */\n async getReachabilityMetrics(): Promise<ReachabilityMetrics> {\n const stats: ReachabilityMetrics = {\n reachability_public_udp_success: 0,\n reachability_public_udp_failed: 0,\n reachability_public_tcp_success: 0,\n reachability_public_tcp_failed: 0,\n reachability_public_xtls_success: 0,\n reachability_public_xtls_failed: 0,\n reachability_vmn_udp_success: 0,\n reachability_vmn_udp_failed: 0,\n reachability_vmn_tcp_success: 0,\n reachability_vmn_tcp_failed: 0,\n reachability_vmn_xtls_success: 0,\n reachability_vmn_xtls_failed: 0,\n natType: this.natType,\n };\n\n const updateStats = (clusterType: 'public' | 'vmn', result: ClusterReachabilityResult) => {\n if (result.udp && result.udp.result !== 'untested') {\n const outcome = result.udp.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_udp_${outcome}`] += 1;\n }\n if (result.tcp && result.tcp.result !== 'untested') {\n const outcome = result.tcp.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_tcp_${outcome}`] += 1;\n }\n if (result.xtls && result.xtls.result !== 'untested') {\n const outcome = result.xtls.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_xtls_${outcome}`] += 1;\n }\n };\n\n try {\n // @ts-ignore\n const resultsJson = await this.webex.boundedStorage.get(\n REACHABILITY.namespace,\n REACHABILITY.localStorageResult\n );\n\n const results: ReachabilityResults = JSON.parse(resultsJson);\n\n Object.values(results).forEach((result) => {\n updateStats(result.isVideoMesh ? 'vmn' : 'public', result);\n });\n } catch (e) {\n // empty storage, that's ok\n LoggerProxy.logger.warn(\n 'Roap:request#getReachabilityMetrics --> Error parsing reachability data: ',\n e\n );\n }\n\n return stats;\n }\n\n /**\n * Maps our internal transport result to the format that backend expects\n * @param {TransportResult} transportResult\n * @returns {TransportResultForBackend}\n */\n private mapTransportResultToBackendDataFormat(\n transportResult: TransportResult\n ): TransportResultForBackend {\n const output: TransportResultForBackend = {};\n\n for (const [key, value] of Object.entries(transportResult)) {\n switch (key) {\n case 'result':\n switch (value) {\n case 'reachable':\n output.reachable = 'true';\n break;\n case 'unreachable':\n output.reachable = 'false';\n break;\n case 'untested':\n output.untested = 'true';\n break;\n }\n break;\n case 'latencyInMilliseconds':\n output.latencyInMilliseconds = value.toString();\n break;\n default:\n output[key] = value;\n }\n }\n\n return output;\n }\n\n /**\n * Reachability results as an object in the format that backend expects\n *\n * @returns {any} reachability results that need to be sent to the backend\n */\n async getReachabilityResults(): Promise<ReachabilityResultsForBackend | undefined> {\n let results: ReachabilityResultsForBackend;\n\n try {\n // @ts-ignore\n const resultsJson = await this.webex.boundedStorage.get(\n REACHABILITY.namespace,\n REACHABILITY.localStorageResult\n );\n\n const allClusterResults: ReachabilityResults = JSON.parse(resultsJson);\n\n results = mapValues(allClusterResults, (clusterResult) => ({\n udp: this.mapTransportResultToBackendDataFormat(clusterResult.udp || {result: 'untested'}),\n tcp: this.mapTransportResultToBackendDataFormat(clusterResult.tcp || {result: 'untested'}),\n xtls: this.mapTransportResultToBackendDataFormat(\n clusterResult.xtls || {result: 'untested'}\n ),\n }));\n } catch (e) {\n // empty storage, that's ok\n LoggerProxy.logger.warn(\n 'Reachability:index#getReachabilityResults --> Error parsing reachability data: ',\n e\n );\n }\n\n return results;\n }\n\n /**\n * fetches reachability data and checks for cluster reachability\n * @returns {boolean}\n * @public\n * @memberof Reachability\n */\n async isAnyPublicClusterReachable() {\n let reachable = false;\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);\n\n reachable = Object.values(reachabilityResults).some(\n (result) =>\n !result.isVideoMesh &&\n (result.udp?.result === 'reachable' || result.tcp?.result === 'reachable')\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Reachability:index#isAnyPublicClusterReachable --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return reachable;\n }\n\n /**\n * Returns true only if ALL protocols (UDP, TCP and TLS) have been tested and none\n * of the media clusters where reachable with any of the protocols. This is done\n * irrespective of the config, so for example:\n * if config.meetings.enableReachabilityChecks disables TLS,\n * it will return false, because TLS reachability won't be tested,\n * so we can't say for sure that media backend is unreachable over TLS.\n *\n * @returns {boolean}\n */\n async isWebexMediaBackendUnreachable() {\n let unreachable = false;\n\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);\n\n const protocols = {\n udp: {tested: false, reachable: undefined},\n tcp: {tested: false, reachable: undefined},\n xtls: {tested: false, reachable: undefined},\n };\n\n Object.values(reachabilityResults).forEach((result) => {\n Object.keys(protocols).forEach((protocol) => {\n if (\n result[protocol]?.result === 'reachable' ||\n result[protocol]?.result === 'unreachable'\n ) {\n protocols[protocol].tested = true;\n\n // we need at least 1 'reachable' result to mark the whole protocol as reachable\n if (result[protocol].result === 'reachable') {\n protocols[protocol].reachable = true;\n }\n }\n });\n });\n\n unreachable = Object.values(protocols).every(\n (protocol) => protocol.tested && !protocol.reachable\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Reachability:index#isWebexMediaBackendUnreachable --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return unreachable;\n }\n\n /**\n * Get list of all unreachable clusters\n * @returns {array} Unreachable clusters\n * @private\n * @memberof Reachability\n */\n private getUnreachableClusters(): Array<{name: string; protocol: string}> {\n const unreachableList = [];\n\n Object.entries(this.clusterReachability).forEach(([key, clusterReachability]) => {\n const result = clusterReachability.getResult();\n\n if (result.udp.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'udp'});\n }\n if (result.tcp.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'tcp'});\n }\n if (result.xtls.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'xtls'});\n }\n });\n\n return unreachableList;\n }\n\n /**\n * Gets the number of reachable clusters from last run reachability check\n * @returns {number} reachable clusters count\n * @private\n * @memberof Reachability\n */\n private getNumberOfReachableClusters(): number {\n let count = 0;\n\n Object.entries(this.clusterReachability).forEach(([key, clusterReachability]) => {\n const result = clusterReachability.getResult();\n\n if (\n result.udp.result === 'reachable' ||\n result.tcp.result === 'reachable' ||\n result.xtls.result === 'reachable'\n ) {\n count += 1;\n }\n });\n\n return count;\n }\n\n /**\n * Make a log of unreachable clusters.\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private logUnreachableClusters() {\n const list = this.getUnreachableClusters();\n\n list.forEach(({name, protocol}) => {\n LoggerProxy.logger.log(\n `Reachability:index#logUnreachableClusters --> failed to reach ${name} over ${protocol}`\n );\n });\n }\n\n /**\n * Returns true if we've obtained all the reachability results for all the public clusters\n * In other words, it means that all public clusters are reachable over each protocol,\n * because we only get a \"result\" if we managed to reach a cluster\n *\n * @returns {boolean}\n */\n private areAllPublicClusterResultsReady() {\n return isEqual(this.expectedResultsCount.public, this.resultsCount.public);\n }\n\n /**\n * Returns true if we've obtained all the reachability results for all the clusters\n *\n * @returns {boolean}\n */\n private areAllResultsReady() {\n return isEqual(this.expectedResultsCount, this.resultsCount);\n }\n\n /**\n * Resolves the promise returned by gatherReachability() method\n * @param {boolean} checkMinRequiredClusters - if true, it will check if we have reached the minimum required clusters and do a fallback if needed\n * @returns {void}\n */\n private resolveReachabilityPromise(checkMinRequiredClusters = true) {\n this.totalDuration = performance.now() - this.startTime;\n\n this.clearTimer('vmnTimer');\n this.clearTimer('publicCloudTimer');\n\n this.logUnreachableClusters();\n this.reachabilityDefer?.resolve();\n\n if (checkMinRequiredClusters) {\n const numReachableClusters = this.getNumberOfReachableClusters();\n if (this.minRequiredClusters && numReachableClusters < this.minRequiredClusters) {\n LoggerProxy.logger.log(\n `Reachability:index#resolveReachabilityPromise --> minRequiredClusters not reached (${numReachableClusters} < ${this.minRequiredClusters}), doing reachability fallback`\n );\n this.gatherReachabilityFallback();\n }\n }\n }\n\n /**\n * Aborts all cluster reachability checks that are in progress\n *\n * @returns {void}\n */\n private abortClusterReachability() {\n Object.values(this.clusterReachability).forEach((clusterReachability) => {\n clusterReachability.abort();\n });\n }\n\n /**\n * Helper function for calculating min/max/average values of latency\n *\n * @param {Array<any>} results\n * @param {string} protocol\n * @param {boolean} isVideoMesh\n * @returns {{min:number, max: number, average: number}}\n */\n protected getStatistics(\n results: Array<ClusterReachabilityResult & {isVideoMesh: boolean}>,\n protocol: 'udp' | 'tcp' | 'xtls',\n isVideoMesh: boolean\n ) {\n const values = results\n .filter((result) => result.isVideoMesh === isVideoMesh)\n .filter((result) => result[protocol].result === 'reachable')\n .map((result) => result[protocol].latencyInMilliseconds);\n\n if (values.length === 0) {\n return {\n min: -1,\n max: -1,\n average: -1,\n };\n }\n\n return {\n min: Math.min(...values),\n max: Math.max(...values),\n average: mean(values),\n };\n }\n\n /**\n * Sends a metric with all the statistics about how long reachability took\n *\n * @param {boolean} aborted true if the reachability checks were aborted\n * @returns {void}\n */\n protected async sendMetric(aborted = false) {\n const results = [];\n\n Object.values(this.clusterReachability).forEach((clusterReachability) => {\n results.push({\n ...clusterReachability.getResult(),\n isVideoMesh: clusterReachability.isVideoMesh,\n });\n });\n\n const stats = {\n aborted,\n vmn: {\n udp: this.getStatistics(results, 'udp', true),\n },\n public: {\n udp: this.getStatistics(results, 'udp', false),\n tcp: this.getStatistics(results, 'tcp', false),\n xtls: this.getStatistics(results, 'xtls', false),\n },\n ipver: {\n // @ts-ignore\n firstIpV4: this.webex.internal.device.ipNetworkDetector.firstIpV4,\n // @ts-ignore\n firstIpV6: this.webex.internal.device.ipNetworkDetector.firstIpV6,\n // @ts-ignore\n firstMdns: this.webex.internal.device.ipNetworkDetector.firstMdns,\n // @ts-ignore\n totalTime: this.webex.internal.device.ipNetworkDetector.totalTime,\n },\n trigger: this.lastTrigger,\n };\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.REACHABILITY_COMPLETED,\n Metrics.prepareMetricFields(stats)\n );\n }\n\n /**\n * Starts all the timers used for various timeouts\n *\n * @returns {void}\n */\n private startTimers() {\n this.vmnTimer = setTimeout(() => {\n this.vmnTimer = undefined;\n // if we are only missing VMN results, then we don't want to wait for them any longer\n // as they are likely to fail if users are not on corporate network\n if (this.areAllPublicClusterResultsReady()) {\n LoggerProxy.logger.log(\n 'Reachability:index#startTimers --> Reachability checks timed out (VMN timeout)'\n );\n\n this.resolveReachabilityPromise();\n }\n }, VIDEO_MESH_TIMEOUT * 1000);\n\n this.publicCloudTimer = setTimeout(() => {\n this.publicCloudTimer = undefined;\n\n LoggerProxy.logger.log(\n `Reachability:index#startTimers --> Reachability checks timed out (${DEFAULT_TIMEOUT}s)`\n );\n\n // check against minimum required clusters, do a new call if we don't have enough\n\n // resolve the promise, so that the client won't be blocked waiting on meetings.register() for too long\n this.resolveReachabilityPromise();\n }, DEFAULT_TIMEOUT * 1000);\n\n this.overallTimer = setTimeout(() => {\n this.overallTimer = undefined;\n this.abortClusterReachability();\n this.emit(\n {\n file: 'reachability',\n function: 'overallTimer timeout',\n },\n 'reachability:done',\n {}\n );\n this.sendMetric();\n\n LoggerProxy.logger.log(\n `Reachability:index#startTimers --> Reachability checks fully timed out (${OVERALL_TIMEOUT}s)`\n );\n }, OVERALL_TIMEOUT * 1000);\n }\n\n /**\n * Stores given reachability results in local storage\n *\n * @param {ReachabilityResults} results\n * @returns {Promise<void>}\n */\n private async storeResults(results: ReachabilityResults) {\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageResult,\n JSON.stringify(results)\n );\n }\n\n /**\n * Resets all the internal counters that keep track of the results\n *\n * @returns {void}\n */\n private resetResultCounters() {\n this.expectedResultsCount.videoMesh.udp = 0;\n this.expectedResultsCount.public.udp = 0;\n this.expectedResultsCount.public.tcp = 0;\n this.expectedResultsCount.public.xtls = 0;\n\n this.resultsCount.videoMesh.udp = 0;\n this.resultsCount.public.udp = 0;\n this.resultsCount.public.tcp = 0;\n this.resultsCount.public.xtls = 0;\n }\n\n /**\n * Clears the timer\n *\n * @param {string} timer name of the timer to clear\n * @returns {void}\n */\n private clearTimer(timer: string) {\n if (this[timer]) {\n clearTimeout(this[timer]);\n this[timer] = undefined;\n }\n }\n\n /**\n * Aborts current checks that are in progress\n *\n * @returns {void}\n */\n private abortCurrentChecks() {\n this.clearTimer('vmnTimer');\n this.clearTimer('publicCloudTimer');\n this.clearTimer('overallTimer');\n\n this.abortClusterReachability();\n }\n\n /**\n * Performs reachability checks for all clusters\n * @param {ClusterList} clusterList\n * @returns {Promise<void>} promise that's resolved as soon as the checks are started\n */\n private async performReachabilityChecks(clusterList: ClusterList) {\n const results: ReachabilityResults = {};\n\n this.clusterReachability = {};\n\n this.startTime = performance.now();\n\n const protocols = resolveReachabilityProtocols(\n // @ts-ignore\n this.webex.config.meetings.enableReachabilityChecks\n );\n\n const enabledProtocols = [\n protocols.udp && 'UDP',\n protocols.tcp && 'TCP',\n protocols.tls && 'TLS',\n ].filter(Boolean);\n\n LoggerProxy.logger.log(\n `Reachability:index#performReachabilityChecks --> doing ${enabledProtocols.join(\n ','\n )} reachability checks`\n );\n\n this.resetResultCounters();\n\n // sanitize the urls in the clusterList\n Object.keys(clusterList).forEach((key) => {\n const cluster = clusterList[key];\n\n // Linus doesn't support TCP reachability checks on video mesh nodes\n const includeTcpReachability = protocols.tcp && !cluster.isVideoMesh;\n\n if (!includeTcpReachability) {\n cluster.tcp = [];\n }\n\n // Linus doesn't support xTLS reachability checks on video mesh nodes\n const includeTlsReachability = protocols.tls && !cluster.isVideoMesh;\n\n if (!includeTlsReachability) {\n cluster.xtls = [];\n }\n\n // initialize the result for this cluster\n results[key] = {\n udp: {result: cluster.udp.length > 0 ? 'unreachable' : 'untested'},\n tcp: {result: cluster.tcp.length > 0 ? 'unreachable' : 'untested'},\n xtls: {result: cluster.xtls.length > 0 ? 'unreachable' : 'untested'},\n isVideoMesh: cluster.isVideoMesh,\n };\n\n // update expected results counters to include this cluster\n this.expectedResultsCount[cluster.isVideoMesh ? 'videoMesh' : 'public'].udp +=\n cluster.udp.length > 0 ? 1 : 0;\n if (!cluster.isVideoMesh) {\n this.expectedResultsCount.public.tcp += cluster.tcp.length > 0 ? 1 : 0;\n this.expectedResultsCount.public.xtls += cluster.xtls.length > 0 ? 1 : 0;\n }\n });\n\n const isFirstResult = {\n udp: true,\n tcp: true,\n xtls: true,\n };\n\n // save the initialized results (in case we don't get any \"resultReady\" events at all)\n await this.storeResults(results);\n\n if (!clusterList || !Object.keys(clusterList).length) {\n // nothing to do, finish immediately\n this.resolveReachabilityPromise(false);\n\n this.emit(\n {\n file: 'reachability',\n function: 'performReachabilityChecks',\n },\n 'reachability:done',\n {}\n );\n\n return;\n }\n\n this.startTimers();\n\n // now start the reachability on all the clusters\n Object.keys(clusterList).forEach((key) => {\n const cluster = clusterList[key];\n\n this.clusterReachability[key] = new ClusterReachability(\n key,\n cluster,\n // @ts-ignore\n this.webex.config.meetings.enablePerUdpUrlReachability\n );\n this.clusterReachability[key].on(Events.resultReady, async (data: ResultEventData) => {\n const {protocol, result, clientMediaIPs, latencyInMilliseconds} = data;\n\n if (isFirstResult[protocol]) {\n this.emit(\n {\n file: 'reachability',\n function: 'resultReady event handler',\n },\n 'reachability:firstResultAvailable',\n {\n protocol,\n }\n );\n isFirstResult[protocol] = false;\n }\n this.resultsCount[cluster.isVideoMesh ? 'videoMesh' : 'public'][protocol] += 1;\n\n const areAllResultsReady = this.areAllResultsReady();\n\n results[key][protocol].result = result;\n results[key][protocol].clientMediaIPs = clientMediaIPs;\n results[key][protocol].latencyInMilliseconds = latencyInMilliseconds;\n\n await this.storeResults(results);\n\n if (areAllResultsReady) {\n this.clearTimer('overallTimer');\n this.emit(\n {\n file: 'reachability',\n function: 'performReachabilityChecks',\n },\n 'reachability:done',\n {}\n );\n this.sendMetric();\n\n LoggerProxy.logger.log(\n `Reachability:index#gatherReachability --> Reachability checks fully completed`\n );\n this.resolveReachabilityPromise();\n }\n });\n\n // clientMediaIps can be updated independently from the results, so we need to listen for them too\n this.clusterReachability[key].on(\n Events.clientMediaIpsUpdated,\n async (data: ClientMediaIpsUpdatedEventData) => {\n results[key][data.protocol].clientMediaIPs = data.clientMediaIPs;\n\n await this.storeResults(results);\n }\n );\n\n this.clusterReachability[key].on(\n Events.natTypeUpdated,\n async (data: NatTypeUpdatedEventData) => {\n this.natType = data.natType;\n }\n );\n\n this.clusterReachability[key].start(); // not awaiting on purpose\n });\n }\n\n /**\n * Returns the clientMediaPreferences object that needs to be sent to the backend\n * when joining a meeting\n *\n * @param {boolean} isMultistream\n * @param {IP_VERSION} ipver\n * @returns {Object}\n */\n async getClientMediaPreferences(\n isMultistream: boolean,\n ipver?: IP_VERSION\n ): Promise<ClientMediaPreferences> {\n // if 0 or undefined, we assume version 0 and don't send any reachability in clientMediaPreferences\n if (!this.orpheusApiVersion) {\n return {\n ipver,\n joinCookie: await this.getJoinCookie(),\n preferTranscoding: !isMultistream,\n };\n }\n\n // must be version 1\n\n // for version 1, the reachability report goes into clientMediaPreferences (and it contains joinCookie)\n const reachabilityReport = (await this.getReachabilityReport()) as {\n joinCookie: any;\n reachability?: ReachabilityReportV1;\n };\n\n return {\n ipver,\n preferTranscoding: !isMultistream,\n ...reachabilityReport,\n };\n }\n\n /**\n * Returns the reachability report that needs to be attached to the ROAP messages\n * that we send to the backend.\n * It may return undefined, if reachability is not needed to be attached to ROAP messages (that's the case for v1 or Orpheus API)\n *\n * @returns {Promise<ReachabilityReportV0>} object that needs to be attached to Roap messages\n */\n async getReachabilityReportToAttachToRoap(): Promise<ReachabilityReportV0 | undefined> {\n // version 0\n if (!this.orpheusApiVersion) {\n return this.getReachabilityResults();\n }\n\n // version 1\n\n // for version 1 we don't attach anything to Roap messages, reachability report is sent inside clientMediaPreferences\n return undefined;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_lodash","require","_common","_webCapabilities","_loggerProxy","_interopRequireDefault","_util","_constants","_request","_reachability","_clusterReachability","_util2","_eventsScope","_constants2","_metrics","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_callSuper","_getPrototypeOf2","_possibleConstructorReturn2","_isNativeReflectConstruct","_Reflect$construct","constructor","Boolean","prototype","valueOf","call","DEFAULT_TIMEOUT","VIDEO_MESH_TIMEOUT","OVERALL_TIMEOUT","Reachability","exports","_EventsScope","webex","_this","_classCallCheck2","REACHABILITY","namespace","videoMesh","udp","public","tcp","xtls","undefined","NatType","Unknown","reachabilityRequest","ReachabilityRequest","clusterReachability","_inherits2","_createClass2","key","value","_getClusters","_asyncToGenerator2","_regenerator","mark","_callee","trigger","previousReport","isRetry","_yield$this$reachabil","clusters","joinCookie","discoveryOptions","_args","_t","wrap","_context","prev","next","getClusters","MeetingUtil","getIpVersion","sent","minRequiredClusters","orpheusApiVersion","boundedStorage","put","localStorageJoinCookie","_stringify","abrupt","LoggerProxy","logger","error","concat","stop","_x","_x2","isSubnetReachable","selectedSubnetFirstOctet","info","matchingReachedClusters","_values","reduce","acc","cluster","reachedSubnetsArray","_from","reachedSubnets","logMessage","name","i","subnet","reachedSubnetFirstOctet","split","add","_set","size","_gatherReachability","_callee2","_yield$this$getCluste","_t2","_context2","isReachabilityEnabled","config","meetings","enableReachabilityChecks","Error","WebCapabilities","supportsRTCPeerConnection","CapabilityState","CAPABLE","warn","lastTrigger","internal","device","ipNetworkDetector","detect","reachabilityDefer","Defer","performReachabilityChecks","promise","gatherReachability","_x3","_getJoinCookie","_callee3","joinCookieRaw","_context3","get","catch","JSON","parse","getJoinCookie","_getReachabilityReport","_callee4","reachabilityResult","_context4","getReachabilityResults","reachability","version","result","usedDiscoveryOptions","metrics","totalDuration","tests","getReachabilityReport","_gatherReachabilityFallback","_callee5","reachabilityReport","_yield$this$getCluste2","_t3","_context5","abortCurrentChecks","gatherReachabilityFallback","stopReachability","overallTimer","log","emit","file","function","sendMetric","resolveReachabilityPromise","_getReachabilityMetrics","_callee6","stats","updateStats","resultsJson","results","_t4","_context6","reachability_public_udp_success","reachability_public_udp_failed","reachability_public_tcp_success","reachability_public_tcp_failed","reachability_public_xtls_success","reachability_public_xtls_failed","reachability_vmn_udp_success","reachability_vmn_udp_failed","reachability_vmn_tcp_success","reachability_vmn_tcp_failed","reachability_vmn_xtls_success","reachability_vmn_xtls_failed","natType","clusterType","outcome","localStorageResult","isVideoMesh","getReachabilityMetrics","mapTransportResultToBackendDataFormat","transportResult","output","_i","_Object$entries","_entries","_Object$entries$_i","_slicedToArray2","reachable","untested","latencyInMilliseconds","toString","_getReachabilityResults","_callee7","_this2","allClusterResults","_t5","_context7","mapValues","clusterResult","_isAnyPublicClusterReachable","_callee8","reachabilityData","reachabilityResults","_context8","some","_result$udp","_result$tcp","isAnyPublicClusterReachable","_isWebexMediaBackendUnreachable","_callee9","unreachable","protocols","_context9","tested","_keys","protocol","_result$protocol","_result$protocol2","every","isWebexMediaBackendUnreachable","_isAnyClusterReachableViaProtocol","_callee0","_t6","_context0","_result$protocol3","isAnyClusterReachableViaProtocol","_x4","getUnreachableClusters","unreachableList","_ref","_ref2","getResult","getNumberOfReachableClusters","count","_ref3","_ref4","logUnreachableClusters","list","_ref5","areAllPublicClusterResultsReady","isEqual","expectedResultsCount","resultsCount","areAllResultsReady","_this$reachabilityDef","checkMinRequiredClusters","performance","now","startTime","clearTimer","resolve","numReachableClusters","abortClusterReachability","abort","getStatistics","values","map","min","max","average","Math","_toConsumableArray2","mean","_sendMetric","_callee1","aborted","_args1","_context1","vmn","ipver","firstIpV4","firstIpV6","firstMdns","totalTime","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","REACHABILITY_COMPLETED","prepareMetricFields","startTimers","_this3","vmnTimer","setTimeout","publicCloudTimer","_storeResults","_callee10","_context10","storeResults","_x5","resetResultCounters","timer","clearTimeout","_performReachabilityChecks","_callee14","clusterList","_this4","enabledProtocols","isFirstResult","_context14","resolveReachabilityProtocols","tls","join","includeTcpReachability","includeTlsReachability","ClusterReachability","enablePerUdpUrlReachability","on","Events","resultReady","_ref6","_callee11","data","clientMediaIPs","_context11","_x7","clientMediaIpsUpdated","_ref7","_callee12","_context12","_x8","natTypeUpdated","_ref8","_callee13","_context13","_x9","start","_x6","_getClientMediaPreferences","_callee15","isMultistream","_t7","_t8","_t9","_context15","preferTranscoding","getClientMediaPreferences","_x0","_x1","_getReachabilityReportToAttachToRoap","_callee16","_context16","getReachabilityReportToAttachToRoap","EventsScope"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable class-methods-use-this */\nimport {isEqual, mapValues, mean} from 'lodash';\n\nimport {Defer} from '@webex/common';\nimport {CapabilityState, WebCapabilities} from '@webex/web-capabilities';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport MeetingUtil from '../meeting/util';\n\nimport {IP_VERSION, REACHABILITY} from '../constants';\n\nimport ReachabilityRequest, {ClusterList} from './request';\nimport {\n ClusterReachabilityResult,\n TransportResult,\n ClientMediaPreferences,\n ReachabilityMetrics,\n ReachabilityReportV0,\n ReachabilityReportV1,\n ReachabilityResults,\n ReachabilityResultsForBackend,\n TransportResultForBackend,\n GetClustersTrigger,\n NatType,\n Protocol,\n} from './reachability.types';\nimport {\n ClientMediaIpsUpdatedEventData,\n ClusterReachability,\n Events,\n NatTypeUpdatedEventData,\n ResultEventData,\n} from './clusterReachability';\nimport {isReachabilityEnabled, resolveReachabilityProtocols} from './util';\nimport EventsScope from '../common/events/events-scope';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport Metrics from '../metrics';\n\n// timeouts in seconds\nconst DEFAULT_TIMEOUT = 3;\nconst VIDEO_MESH_TIMEOUT = 1;\nconst OVERALL_TIMEOUT = 15;\n\n/**\n * @class Reachability\n * @export\n */\nexport default class Reachability extends EventsScope {\n namespace = REACHABILITY.namespace;\n webex: object;\n reachabilityRequest: ReachabilityRequest;\n clusterReachability: {\n [key: string]: ClusterReachability;\n };\n\n minRequiredClusters?: number;\n orpheusApiVersion?: number;\n\n reachabilityDefer?: Defer;\n\n vmnTimer?: ReturnType<typeof setTimeout>;\n publicCloudTimer?: ReturnType<typeof setTimeout>;\n overallTimer?: ReturnType<typeof setTimeout>;\n\n expectedResultsCount = {videoMesh: {udp: 0}, public: {udp: 0, tcp: 0, xtls: 0}};\n resultsCount = {videoMesh: {udp: 0}, public: {udp: 0, tcp: 0, xtls: 0}};\n startTime = undefined;\n totalDuration = undefined;\n natType = NatType.Unknown;\n\n protected lastTrigger?: string;\n\n /**\n * Creates an instance of Reachability.\n * @param {object} webex\n * @memberof Reachability\n */\n constructor(webex: object) {\n super();\n this.webex = webex;\n\n /**\n * internal request object for the server\n * @instance\n * @type {Array}\n * @private\n * @memberof Reachability\n */\n this.reachabilityRequest = new ReachabilityRequest(this.webex);\n\n this.clusterReachability = {};\n }\n\n /**\n * Fetches the list of media clusters from the backend\n * @param {string} trigger - explains the reason for starting reachability, used by Orpheus\n * @param {Object} previousReport - last reachability report\n * @param {boolean} isRetry\n * @private\n * @returns {Promise<{clusters: ClusterList, joinCookie: any}>}\n */\n async getClusters(\n trigger: GetClustersTrigger,\n previousReport?: any,\n isRetry = false\n ): Promise<{\n clusters: ClusterList;\n joinCookie: any;\n }> {\n try {\n const {clusters, joinCookie, discoveryOptions} = await this.reachabilityRequest.getClusters(\n trigger,\n MeetingUtil.getIpVersion(this.webex),\n previousReport\n );\n\n this.minRequiredClusters = discoveryOptions?.['early-call-min-clusters'];\n this.orpheusApiVersion = discoveryOptions?.['report-version'];\n\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageJoinCookie,\n JSON.stringify(joinCookie)\n );\n\n return {clusters, joinCookie};\n } catch (error) {\n if (isRetry) {\n throw error;\n }\n\n LoggerProxy.logger.error(\n `Reachability:index#getClusters --> Failed with error: ${error}, retrying...`\n );\n\n return this.getClusters(trigger, previousReport, true);\n }\n }\n\n /**\n * Checks if the given subnet is reachable\n * @param {string} selectedSubnetFirstOctet - selected subnet first octet, e.g. \"10\" for \"10.X.X.X\"\n * @returns {boolean | null} true if reachable, false if not reachable, null if mediaServerIp is not provided\n * @public\n * @memberof Reachability\n */\n public isSubnetReachable(selectedSubnetFirstOctet: string): boolean | null {\n LoggerProxy.logger.info(\n `Reachability:index#isSubnetReachable --> Looking for subnet: ${selectedSubnetFirstOctet}.X.X.X`\n );\n\n const matchingReachedClusters = Object.values(this.clusterReachability).reduce(\n (acc, cluster) => {\n const reachedSubnetsArray = Array.from(cluster.reachedSubnets);\n\n let logMessage = `Reachability:index#isSubnetReachable --> Cluster ${cluster.name} reached [`;\n for (let i = 0; i < reachedSubnetsArray.length; i += 1) {\n const subnet = reachedSubnetsArray[i];\n const reachedSubnetFirstOctet = subnet.split('.')[0];\n\n if (selectedSubnetFirstOctet === reachedSubnetFirstOctet) {\n acc.add(cluster.name);\n }\n\n logMessage += `${subnet}`;\n if (i < reachedSubnetsArray.length - 1) {\n logMessage += ',';\n }\n }\n logMessage += `]`;\n\n LoggerProxy.logger.info(logMessage);\n\n return acc;\n },\n new Set<string>()\n );\n\n LoggerProxy.logger.info(\n `Reachability:index#isSubnetReachable --> Found ${matchingReachedClusters.size} clusters that use the subnet ${selectedSubnetFirstOctet}.X.X.X`\n );\n\n return matchingReachedClusters.size > 0;\n }\n\n /**\n * Gets a list of media clusters from the backend and performs reachability checks on all the clusters\n * @param {string} trigger - explains the reason for starting reachability\n * @returns {Promise<ReachabilityResults>} reachability results\n * @public\n * @memberof Reachability\n */\n public async gatherReachability(trigger: string): Promise<ReachabilityResults> {\n // @ts-ignore\n if (!isReachabilityEnabled(this.webex.config.meetings.enableReachabilityChecks)) {\n throw new Error('enableReachabilityChecks is disabled in config');\n }\n\n if (WebCapabilities.supportsRTCPeerConnection() !== CapabilityState.CAPABLE) {\n LoggerProxy.logger.warn(\n 'Reachability:index#gatherReachability --> WebRTC API is not available, skipping reachability checks'\n );\n\n return {};\n }\n // Fetch clusters and measure latency\n try {\n this.lastTrigger = trigger;\n\n // kick off ip version detection. We don't await it, as we don't want to waste time\n // and if it fails, that's ok we can still carry on\n // @ts-ignore\n this.webex.internal.device.ipNetworkDetector.detect(true);\n\n const {clusters} = await this.getClusters('startup');\n\n this.reachabilityDefer = new Defer();\n\n // Perform Reachability Check\n await this.performReachabilityChecks(clusters);\n\n return this.reachabilityDefer.promise;\n } catch (error) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachability --> Error:`, error);\n\n return {};\n }\n }\n\n /**\n * Gets the last join cookie we got from Orpheus\n *\n * @returns {Promise<Object>} join cookie\n */\n async getJoinCookie() {\n // @ts-ignore\n const joinCookieRaw = await this.webex.boundedStorage\n .get(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie)\n .catch(() => {});\n\n let joinCookie;\n\n if (joinCookieRaw) {\n try {\n joinCookie = JSON.parse(joinCookieRaw);\n } catch (e) {\n LoggerProxy.logger.error(\n `MeetingRequest#constructor --> Error in parsing join cookie data: ${e}`\n );\n }\n }\n\n return joinCookie;\n }\n\n /**\n * Returns the reachability report that needs to be attached to the ROAP messages\n * that we send to the backend.\n *\n * @returns {Promise<Object>}\n */\n async getReachabilityReport(): Promise<\n | {\n joinCookie: any;\n reachability?: ReachabilityReportV1;\n }\n | {\n reachability: ReachabilityReportV0;\n }\n > {\n const reachabilityResult = await this.getReachabilityResults();\n const joinCookie = await this.getJoinCookie();\n\n // Orpheus API version 0\n if (!this.orpheusApiVersion) {\n return {\n reachability: reachabilityResult,\n };\n }\n\n // Orpheus API version 1\n return {\n reachability: {\n version: 1,\n result: {\n usedDiscoveryOptions: {\n 'early-call-min-clusters': this.minRequiredClusters,\n },\n metrics: {\n 'total-duration-ms': this.totalDuration,\n },\n tests: reachabilityResult,\n },\n },\n joinCookie,\n };\n }\n\n /**\n * This method is called when we don't succeed in reaching the minimum number of clusters\n * required by Orpheus. It sends the results to Orpheus and gets a new list that it tries to reach again.\n * @returns {Promise<ReachabilityResults>} reachability results\n * @public\n * @memberof Reachability\n */\n public async gatherReachabilityFallback(): Promise<void> {\n try {\n const reachabilityReport = await this.getReachabilityReport();\n\n const {clusters} = await this.getClusters('early-call/no-min-reached', reachabilityReport);\n\n // stop all previous reachability checks that might still be going on in the background\n this.abortCurrentChecks();\n\n // Perform Reachability Check\n await this.performReachabilityChecks(clusters);\n } catch (error) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachabilityFallback --> Error:`, error);\n }\n }\n\n /**\n * Stops all reachability checks that are in progress\n * @public\n * @memberof Reachability\n * @returns {void}\n */\n public stopReachability() {\n // overallTimer is always there only if there is reachability in progress\n if (this.overallTimer) {\n LoggerProxy.logger.log(\n 'Reachability:index#stopReachability --> stopping reachability checks'\n );\n this.abortCurrentChecks();\n this.emit(\n {\n file: 'reachability',\n function: 'stopReachability',\n },\n 'reachability:stopped',\n {}\n );\n this.sendMetric(true);\n this.resolveReachabilityPromise(false);\n }\n }\n\n /**\n * Returns statistics about last reachability results. The returned value is an object\n * with a flat list of properties so that it can be easily sent with metrics\n *\n * @returns {Promise} Promise with metrics values, it never rejects/throws.\n */\n async getReachabilityMetrics(): Promise<ReachabilityMetrics> {\n const stats: ReachabilityMetrics = {\n reachability_public_udp_success: 0,\n reachability_public_udp_failed: 0,\n reachability_public_tcp_success: 0,\n reachability_public_tcp_failed: 0,\n reachability_public_xtls_success: 0,\n reachability_public_xtls_failed: 0,\n reachability_vmn_udp_success: 0,\n reachability_vmn_udp_failed: 0,\n reachability_vmn_tcp_success: 0,\n reachability_vmn_tcp_failed: 0,\n reachability_vmn_xtls_success: 0,\n reachability_vmn_xtls_failed: 0,\n natType: this.natType,\n };\n\n const updateStats = (clusterType: 'public' | 'vmn', result: ClusterReachabilityResult) => {\n if (result.udp && result.udp.result !== 'untested') {\n const outcome = result.udp.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_udp_${outcome}`] += 1;\n }\n if (result.tcp && result.tcp.result !== 'untested') {\n const outcome = result.tcp.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_tcp_${outcome}`] += 1;\n }\n if (result.xtls && result.xtls.result !== 'untested') {\n const outcome = result.xtls.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_xtls_${outcome}`] += 1;\n }\n };\n\n try {\n // @ts-ignore\n const resultsJson = await this.webex.boundedStorage.get(\n REACHABILITY.namespace,\n REACHABILITY.localStorageResult\n );\n\n const results: ReachabilityResults = JSON.parse(resultsJson);\n\n Object.values(results).forEach((result) => {\n updateStats(result.isVideoMesh ? 'vmn' : 'public', result);\n });\n } catch (e) {\n // empty storage, that's ok\n LoggerProxy.logger.warn(\n 'Roap:request#getReachabilityMetrics --> Error parsing reachability data: ',\n e\n );\n }\n\n return stats;\n }\n\n /**\n * Maps our internal transport result to the format that backend expects\n * @param {TransportResult} transportResult\n * @returns {TransportResultForBackend}\n */\n private mapTransportResultToBackendDataFormat(\n transportResult: TransportResult\n ): TransportResultForBackend {\n const output: TransportResultForBackend = {};\n\n for (const [key, value] of Object.entries(transportResult)) {\n switch (key) {\n case 'result':\n switch (value) {\n case 'reachable':\n output.reachable = 'true';\n break;\n case 'unreachable':\n output.reachable = 'false';\n break;\n case 'untested':\n output.untested = 'true';\n break;\n }\n break;\n case 'latencyInMilliseconds':\n output.latencyInMilliseconds = value.toString();\n break;\n default:\n output[key] = value;\n }\n }\n\n return output;\n }\n\n /**\n * Reachability results as an object in the format that backend expects\n *\n * @returns {any} reachability results that need to be sent to the backend\n */\n async getReachabilityResults(): Promise<ReachabilityResultsForBackend | undefined> {\n let results: ReachabilityResultsForBackend;\n\n try {\n // @ts-ignore\n const resultsJson = await this.webex.boundedStorage.get(\n REACHABILITY.namespace,\n REACHABILITY.localStorageResult\n );\n\n const allClusterResults: ReachabilityResults = JSON.parse(resultsJson);\n\n results = mapValues(allClusterResults, (clusterResult) => ({\n udp: this.mapTransportResultToBackendDataFormat(clusterResult.udp || {result: 'untested'}),\n tcp: this.mapTransportResultToBackendDataFormat(clusterResult.tcp || {result: 'untested'}),\n xtls: this.mapTransportResultToBackendDataFormat(\n clusterResult.xtls || {result: 'untested'}\n ),\n }));\n } catch (e) {\n // empty storage, that's ok\n LoggerProxy.logger.warn(\n 'Reachability:index#getReachabilityResults --> Error parsing reachability data: ',\n e\n );\n }\n\n return results;\n }\n\n /**\n * fetches reachability data and checks for cluster reachability\n * @returns {boolean}\n * @public\n * @memberof Reachability\n */\n async isAnyPublicClusterReachable() {\n let reachable = false;\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);\n\n reachable = Object.values(reachabilityResults).some(\n (result) =>\n !result.isVideoMesh &&\n (result.udp?.result === 'reachable' || result.tcp?.result === 'reachable')\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Reachability:index#isAnyPublicClusterReachable --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return reachable;\n }\n\n /**\n * Returns true only if ALL protocols (UDP, TCP and TLS) have been tested and none\n * of the media clusters where reachable with any of the protocols. This is done\n * irrespective of the config, so for example:\n * if config.meetings.enableReachabilityChecks disables TLS,\n * it will return false, because TLS reachability won't be tested,\n * so we can't say for sure that media backend is unreachable over TLS.\n *\n * @returns {boolean}\n */\n async isWebexMediaBackendUnreachable() {\n let unreachable = false;\n\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);\n\n const protocols = {\n udp: {tested: false, reachable: undefined},\n tcp: {tested: false, reachable: undefined},\n xtls: {tested: false, reachable: undefined},\n };\n\n Object.values(reachabilityResults).forEach((result) => {\n Object.keys(protocols).forEach((protocol) => {\n if (\n result[protocol]?.result === 'reachable' ||\n result[protocol]?.result === 'unreachable'\n ) {\n protocols[protocol].tested = true;\n\n // we need at least 1 'reachable' result to mark the whole protocol as reachable\n if (result[protocol].result === 'reachable') {\n protocols[protocol].reachable = true;\n }\n }\n });\n });\n\n unreachable = Object.values(protocols).every(\n (protocol) => protocol.tested && !protocol.reachable\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Reachability:index#isWebexMediaBackendUnreachable --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return unreachable;\n }\n\n /**\n * Checks if any cluster is reachable via the given protocol based on stored reachability results.\n *\n * @param {string} protocol - the protocol to check ('udp', 'tcp', or 'xtls')\n * @returns {Promise<boolean>} true if at least one cluster has a 'reachable' result for the given protocol\n */\n async isAnyClusterReachableViaProtocol(protocol: Protocol): Promise<boolean> {\n try {\n // @ts-ignore\n const resultsJson = await this.webex.boundedStorage.get(\n this.namespace,\n REACHABILITY.localStorageResult\n );\n\n const results: ReachabilityResults = JSON.parse(resultsJson);\n\n return Object.values(results).some((result) => result[protocol]?.result === 'reachable');\n } catch (e) {\n LoggerProxy.logger.warn(\n `Reachability:index#isAnyClusterReachableViaProtocol --> Error reading reachability data: ${e}`\n );\n\n return false;\n }\n }\n\n /**\n * Get list of all unreachable clusters\n * @returns {array} Unreachable clusters\n * @private\n * @memberof Reachability\n */\n private getUnreachableClusters(): Array<{name: string; protocol: string}> {\n const unreachableList = [];\n\n Object.entries(this.clusterReachability).forEach(([key, clusterReachability]) => {\n const result = clusterReachability.getResult();\n\n if (result.udp.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'udp'});\n }\n if (result.tcp.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'tcp'});\n }\n if (result.xtls.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'xtls'});\n }\n });\n\n return unreachableList;\n }\n\n /**\n * Gets the number of reachable clusters from last run reachability check\n * @returns {number} reachable clusters count\n * @private\n * @memberof Reachability\n */\n private getNumberOfReachableClusters(): number {\n let count = 0;\n\n Object.entries(this.clusterReachability).forEach(([key, clusterReachability]) => {\n const result = clusterReachability.getResult();\n\n if (\n result.udp.result === 'reachable' ||\n result.tcp.result === 'reachable' ||\n result.xtls.result === 'reachable'\n ) {\n count += 1;\n }\n });\n\n return count;\n }\n\n /**\n * Make a log of unreachable clusters.\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private logUnreachableClusters() {\n const list = this.getUnreachableClusters();\n\n list.forEach(({name, protocol}) => {\n LoggerProxy.logger.log(\n `Reachability:index#logUnreachableClusters --> failed to reach ${name} over ${protocol}`\n );\n });\n }\n\n /**\n * Returns true if we've obtained all the reachability results for all the public clusters\n * In other words, it means that all public clusters are reachable over each protocol,\n * because we only get a \"result\" if we managed to reach a cluster\n *\n * @returns {boolean}\n */\n private areAllPublicClusterResultsReady() {\n return isEqual(this.expectedResultsCount.public, this.resultsCount.public);\n }\n\n /**\n * Returns true if we've obtained all the reachability results for all the clusters\n *\n * @returns {boolean}\n */\n private areAllResultsReady() {\n return isEqual(this.expectedResultsCount, this.resultsCount);\n }\n\n /**\n * Resolves the promise returned by gatherReachability() method\n * @param {boolean} checkMinRequiredClusters - if true, it will check if we have reached the minimum required clusters and do a fallback if needed\n * @returns {void}\n */\n private resolveReachabilityPromise(checkMinRequiredClusters = true) {\n this.totalDuration = performance.now() - this.startTime;\n\n this.clearTimer('vmnTimer');\n this.clearTimer('publicCloudTimer');\n\n this.logUnreachableClusters();\n this.reachabilityDefer?.resolve();\n\n if (checkMinRequiredClusters) {\n const numReachableClusters = this.getNumberOfReachableClusters();\n if (this.minRequiredClusters && numReachableClusters < this.minRequiredClusters) {\n LoggerProxy.logger.log(\n `Reachability:index#resolveReachabilityPromise --> minRequiredClusters not reached (${numReachableClusters} < ${this.minRequiredClusters}), doing reachability fallback`\n );\n this.gatherReachabilityFallback();\n }\n }\n }\n\n /**\n * Aborts all cluster reachability checks that are in progress\n *\n * @returns {void}\n */\n private abortClusterReachability() {\n Object.values(this.clusterReachability).forEach((clusterReachability) => {\n clusterReachability.abort();\n });\n }\n\n /**\n * Helper function for calculating min/max/average values of latency\n *\n * @param {Array<any>} results\n * @param {string} protocol\n * @param {boolean} isVideoMesh\n * @returns {{min:number, max: number, average: number}}\n */\n protected getStatistics(\n results: Array<ClusterReachabilityResult & {isVideoMesh: boolean}>,\n protocol: Protocol,\n isVideoMesh: boolean\n ) {\n const values = results\n .filter((result) => result.isVideoMesh === isVideoMesh)\n .filter((result) => result[protocol].result === 'reachable')\n .map((result) => result[protocol].latencyInMilliseconds);\n\n if (values.length === 0) {\n return {\n min: -1,\n max: -1,\n average: -1,\n };\n }\n\n return {\n min: Math.min(...values),\n max: Math.max(...values),\n average: mean(values),\n };\n }\n\n /**\n * Sends a metric with all the statistics about how long reachability took\n *\n * @param {boolean} aborted true if the reachability checks were aborted\n * @returns {void}\n */\n protected async sendMetric(aborted = false) {\n const results = [];\n\n Object.values(this.clusterReachability).forEach((clusterReachability) => {\n results.push({\n ...clusterReachability.getResult(),\n isVideoMesh: clusterReachability.isVideoMesh,\n });\n });\n\n const stats = {\n aborted,\n vmn: {\n udp: this.getStatistics(results, 'udp', true),\n },\n public: {\n udp: this.getStatistics(results, 'udp', false),\n tcp: this.getStatistics(results, 'tcp', false),\n xtls: this.getStatistics(results, 'xtls', false),\n },\n ipver: {\n // @ts-ignore\n firstIpV4: this.webex.internal.device.ipNetworkDetector.firstIpV4,\n // @ts-ignore\n firstIpV6: this.webex.internal.device.ipNetworkDetector.firstIpV6,\n // @ts-ignore\n firstMdns: this.webex.internal.device.ipNetworkDetector.firstMdns,\n // @ts-ignore\n totalTime: this.webex.internal.device.ipNetworkDetector.totalTime,\n },\n trigger: this.lastTrigger,\n };\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.REACHABILITY_COMPLETED,\n Metrics.prepareMetricFields(stats)\n );\n }\n\n /**\n * Starts all the timers used for various timeouts\n *\n * @returns {void}\n */\n private startTimers() {\n this.vmnTimer = setTimeout(() => {\n this.vmnTimer = undefined;\n // if we are only missing VMN results, then we don't want to wait for them any longer\n // as they are likely to fail if users are not on corporate network\n if (this.areAllPublicClusterResultsReady()) {\n LoggerProxy.logger.log(\n 'Reachability:index#startTimers --> Reachability checks timed out (VMN timeout)'\n );\n\n this.resolveReachabilityPromise();\n }\n }, VIDEO_MESH_TIMEOUT * 1000);\n\n this.publicCloudTimer = setTimeout(() => {\n this.publicCloudTimer = undefined;\n\n LoggerProxy.logger.log(\n `Reachability:index#startTimers --> Reachability checks timed out (${DEFAULT_TIMEOUT}s)`\n );\n\n // check against minimum required clusters, do a new call if we don't have enough\n\n // resolve the promise, so that the client won't be blocked waiting on meetings.register() for too long\n this.resolveReachabilityPromise();\n }, DEFAULT_TIMEOUT * 1000);\n\n this.overallTimer = setTimeout(() => {\n this.overallTimer = undefined;\n this.abortClusterReachability();\n this.emit(\n {\n file: 'reachability',\n function: 'overallTimer timeout',\n },\n 'reachability:done',\n {}\n );\n this.sendMetric();\n\n LoggerProxy.logger.log(\n `Reachability:index#startTimers --> Reachability checks fully timed out (${OVERALL_TIMEOUT}s)`\n );\n }, OVERALL_TIMEOUT * 1000);\n }\n\n /**\n * Stores given reachability results in local storage\n *\n * @param {ReachabilityResults} results\n * @returns {Promise<void>}\n */\n private async storeResults(results: ReachabilityResults) {\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageResult,\n JSON.stringify(results)\n );\n }\n\n /**\n * Resets all the internal counters that keep track of the results\n *\n * @returns {void}\n */\n private resetResultCounters() {\n this.expectedResultsCount.videoMesh.udp = 0;\n this.expectedResultsCount.public.udp = 0;\n this.expectedResultsCount.public.tcp = 0;\n this.expectedResultsCount.public.xtls = 0;\n\n this.resultsCount.videoMesh.udp = 0;\n this.resultsCount.public.udp = 0;\n this.resultsCount.public.tcp = 0;\n this.resultsCount.public.xtls = 0;\n }\n\n /**\n * Clears the timer\n *\n * @param {string} timer name of the timer to clear\n * @returns {void}\n */\n private clearTimer(timer: string) {\n if (this[timer]) {\n clearTimeout(this[timer]);\n this[timer] = undefined;\n }\n }\n\n /**\n * Aborts current checks that are in progress\n *\n * @returns {void}\n */\n private abortCurrentChecks() {\n this.clearTimer('vmnTimer');\n this.clearTimer('publicCloudTimer');\n this.clearTimer('overallTimer');\n\n this.abortClusterReachability();\n }\n\n /**\n * Performs reachability checks for all clusters\n * @param {ClusterList} clusterList\n * @returns {Promise<void>} promise that's resolved as soon as the checks are started\n */\n private async performReachabilityChecks(clusterList: ClusterList) {\n const results: ReachabilityResults = {};\n\n this.clusterReachability = {};\n\n this.startTime = performance.now();\n\n const protocols = resolveReachabilityProtocols(\n // @ts-ignore\n this.webex.config.meetings.enableReachabilityChecks\n );\n\n const enabledProtocols = [\n protocols.udp && 'UDP',\n protocols.tcp && 'TCP',\n protocols.tls && 'TLS',\n ].filter(Boolean);\n\n LoggerProxy.logger.log(\n `Reachability:index#performReachabilityChecks --> doing ${enabledProtocols.join(\n ','\n )} reachability checks`\n );\n\n this.resetResultCounters();\n\n // sanitize the urls in the clusterList\n Object.keys(clusterList).forEach((key) => {\n const cluster = clusterList[key];\n\n // Linus doesn't support TCP reachability checks on video mesh nodes\n const includeTcpReachability = protocols.tcp && !cluster.isVideoMesh;\n\n if (!includeTcpReachability) {\n cluster.tcp = [];\n }\n\n // Linus doesn't support xTLS reachability checks on video mesh nodes\n const includeTlsReachability = protocols.tls && !cluster.isVideoMesh;\n\n if (!includeTlsReachability) {\n cluster.xtls = [];\n }\n\n // initialize the result for this cluster\n results[key] = {\n udp: {result: cluster.udp.length > 0 ? 'unreachable' : 'untested'},\n tcp: {result: cluster.tcp.length > 0 ? 'unreachable' : 'untested'},\n xtls: {result: cluster.xtls.length > 0 ? 'unreachable' : 'untested'},\n isVideoMesh: cluster.isVideoMesh,\n };\n\n // update expected results counters to include this cluster\n this.expectedResultsCount[cluster.isVideoMesh ? 'videoMesh' : 'public'].udp +=\n cluster.udp.length > 0 ? 1 : 0;\n if (!cluster.isVideoMesh) {\n this.expectedResultsCount.public.tcp += cluster.tcp.length > 0 ? 1 : 0;\n this.expectedResultsCount.public.xtls += cluster.xtls.length > 0 ? 1 : 0;\n }\n });\n\n const isFirstResult = {\n udp: true,\n tcp: true,\n xtls: true,\n };\n\n // save the initialized results (in case we don't get any \"resultReady\" events at all)\n await this.storeResults(results);\n\n if (!clusterList || !Object.keys(clusterList).length) {\n // nothing to do, finish immediately\n this.resolveReachabilityPromise(false);\n\n this.emit(\n {\n file: 'reachability',\n function: 'performReachabilityChecks',\n },\n 'reachability:done',\n {}\n );\n\n return;\n }\n\n this.startTimers();\n\n // now start the reachability on all the clusters\n Object.keys(clusterList).forEach((key) => {\n const cluster = clusterList[key];\n\n this.clusterReachability[key] = new ClusterReachability(\n key,\n cluster,\n // @ts-ignore\n this.webex.config.meetings.enablePerUdpUrlReachability\n );\n this.clusterReachability[key].on(Events.resultReady, async (data: ResultEventData) => {\n const {protocol, result, clientMediaIPs, latencyInMilliseconds} = data;\n\n if (isFirstResult[protocol]) {\n this.emit(\n {\n file: 'reachability',\n function: 'resultReady event handler',\n },\n 'reachability:firstResultAvailable',\n {\n protocol,\n }\n );\n isFirstResult[protocol] = false;\n }\n this.resultsCount[cluster.isVideoMesh ? 'videoMesh' : 'public'][protocol] += 1;\n\n const areAllResultsReady = this.areAllResultsReady();\n\n results[key][protocol].result = result;\n results[key][protocol].clientMediaIPs = clientMediaIPs;\n results[key][protocol].latencyInMilliseconds = latencyInMilliseconds;\n\n await this.storeResults(results);\n\n if (areAllResultsReady) {\n this.clearTimer('overallTimer');\n this.emit(\n {\n file: 'reachability',\n function: 'performReachabilityChecks',\n },\n 'reachability:done',\n {}\n );\n this.sendMetric();\n\n LoggerProxy.logger.log(\n `Reachability:index#gatherReachability --> Reachability checks fully completed`\n );\n this.resolveReachabilityPromise();\n }\n });\n\n // clientMediaIps can be updated independently from the results, so we need to listen for them too\n this.clusterReachability[key].on(\n Events.clientMediaIpsUpdated,\n async (data: ClientMediaIpsUpdatedEventData) => {\n results[key][data.protocol].clientMediaIPs = data.clientMediaIPs;\n\n await this.storeResults(results);\n }\n );\n\n this.clusterReachability[key].on(\n Events.natTypeUpdated,\n async (data: NatTypeUpdatedEventData) => {\n this.natType = data.natType;\n }\n );\n\n this.clusterReachability[key].start(); // not awaiting on purpose\n });\n }\n\n /**\n * Returns the clientMediaPreferences object that needs to be sent to the backend\n * when joining a meeting\n *\n * @param {boolean} isMultistream\n * @param {IP_VERSION} ipver\n * @returns {Object}\n */\n async getClientMediaPreferences(\n isMultistream: boolean,\n ipver?: IP_VERSION\n ): Promise<ClientMediaPreferences> {\n // if 0 or undefined, we assume version 0 and don't send any reachability in clientMediaPreferences\n if (!this.orpheusApiVersion) {\n return {\n ipver,\n joinCookie: await this.getJoinCookie(),\n preferTranscoding: !isMultistream,\n };\n }\n\n // must be version 1\n\n // for version 1, the reachability report goes into clientMediaPreferences (and it contains joinCookie)\n const reachabilityReport = (await this.getReachabilityReport()) as {\n joinCookie: any;\n reachability?: ReachabilityReportV1;\n };\n\n return {\n ipver,\n preferTranscoding: !isMultistream,\n ...reachabilityReport,\n };\n }\n\n /**\n * Returns the reachability report that needs to be attached to the ROAP messages\n * that we send to the backend.\n * It may return undefined, if reachability is not needed to be attached to ROAP messages (that's the case for v1 or Orpheus API)\n *\n * @returns {Promise<ReachabilityReportV0>} object that needs to be attached to Roap messages\n */\n async getReachabilityReportToAttachToRoap(): Promise<ReachabilityReportV0 | undefined> {\n // version 0\n if (!this.orpheusApiVersion) {\n return this.getReachabilityResults();\n }\n\n // version 1\n\n // for version 1 we don't attach anything to Roap messages, reachability report is sent inside clientMediaPreferences\n return undefined;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -90,13 +90,42 @@ export { IceGatheringFailed };
90
90
  declare class AddMediaFailed extends WebexMeetingsError {
91
91
  static CODE: number;
92
92
  cause?: Error;
93
+ connectionType?: string;
94
+ selectedCandidatePairChanges?: number;
95
+ numTransports?: number;
96
+ iceConnected?: boolean;
93
97
  /**
94
98
  * Creates a new AddMediaFailed error
95
- * @param {Error} [cause] - The underlying error that caused the media addition to fail
99
+ * @param {Object} options
100
+ * @param {Error} [options.cause] - The underlying error that caused the media addition to fail
101
+ * @param {string} [options.connectionType] - The ICE connection type at the time of failure (e.g. 'UDP', 'TURN-TLS')
102
+ * @param {number} [options.selectedCandidatePairChanges] - Number of times the selected candidate pair changed
103
+ * @param {number} [options.numTransports] - Number of ICE transports
104
+ * @param {boolean} [options.iceConnected] - Whether ICE connection was established before the failure
96
105
  */
97
- constructor(cause?: Error);
106
+ constructor(options?: {
107
+ cause?: Error;
108
+ connectionType?: string;
109
+ selectedCandidatePairChanges?: number;
110
+ numTransports?: number;
111
+ iceConnected?: boolean;
112
+ });
113
+ /**
114
+ * Returns true if the failure was due to a DTLS handshake failure
115
+ * (ICE connected successfully but the overall media connection failed).
116
+ */
117
+ get isDtlsHandshakeFailure(): boolean;
98
118
  }
99
119
  export { AddMediaFailed };
120
+ /**
121
+ * @class MediaConnectionTimedOutError
122
+ * @classdesc Internal error thrown when the media connection times out waiting to connect.
123
+ */
124
+ declare class MediaConnectionTimedOutError extends Error {
125
+ iceConnected: boolean;
126
+ constructor(message: string, iceConnected: boolean);
127
+ }
128
+ export { MediaConnectionTimedOutError };
100
129
  /**
101
130
  * @class SdpResponseTimeoutError
102
131
  * @classdesc Raised whenever we timeout waiting for remote SDP answer
@@ -2,6 +2,9 @@ export interface MediaConnectionAwaiterProps {
2
2
  webrtcMediaConnection: any;
3
3
  correlationId: string;
4
4
  }
5
+ export interface FailureResult {
6
+ iceConnected: boolean;
7
+ }
5
8
  /**
6
9
  * @class MediaConnectionAwaiter
7
10
  */
@@ -32,6 +35,12 @@ export default class MediaConnectionAwaiter {
32
35
  * @returns {boolean}
33
36
  */
34
37
  private isFailed;
38
+ /**
39
+ * Returns true if ICE connection state indicates connectivity.
40
+ *
41
+ * @returns {boolean}
42
+ */
43
+ private isIceConnected;
35
44
  /**
36
45
  * Returns true if the ICE Gathering is completed, false otherwise.
37
46
  *
@@ -84,7 +93,7 @@ export default class MediaConnectionAwaiter {
84
93
  /**
85
94
  * Waits for the webrtc media connection to be connected.
86
95
  *
87
- * @returns {Promise}
96
+ * @returns {Promise<void>} In case of failure, the promise is rejected with FailureResult
88
97
  */
89
98
  waitForMediaConnectionConnected(): Promise<void>;
90
99
  }
@@ -1546,12 +1546,26 @@ export default class Meeting extends StatelessWebexPlugin {
1546
1546
  */
1547
1547
  setupStatsAnalyzerEventHandlers: () => void;
1548
1548
  getMediaConnectionDebugId(): string;
1549
+ /**
1550
+ * Determines if the next media attempt should use only TURN-TLS (iceTransportPolicy='relay').
1551
+ * We do this in the hope that it will minimize the chance of Homer sending DTLS packets on a wrong
1552
+ * transport (as there will be only 1 transport) and dealing with firewalls that let STUN packets through, but block
1553
+ * other UDP traffic.
1554
+ *
1555
+ * For clients landing on video mesh nodes (VMN), reachability might still have successful TLS (to public nodes)
1556
+ * but TURN discovery will result in empty TURN urls array and iceTransportPolicy='relay' will still be overriden to undefined,
1557
+ * see the code in establishMediaConnection()
1558
+ *
1559
+ * @param {Error} prevError - The error from the previous addMedia attempt
1560
+ * @returns {Promise<boolean>}
1561
+ */
1562
+ private shouldRetryMediaWithOnlyTurnTLS;
1549
1563
  /**
1550
1564
  * Creates a webrtc media connection and publishes streams to it
1551
1565
  *
1552
1566
  * @param {Object} turnServerInfo TURN server information
1553
1567
  * @param {BundlePolicy} [bundlePolicy] Bundle policy settings
1554
- * @param {AddMediaOptions} [options] Options for enabling/disabling audio/video
1568
+ * @param {RTCIceTransportPolicy} [iceTransportPolicy] ICE transport policy override
1555
1569
  * @returns {RoapMediaConnection | MultistreamRoapMediaConnection}
1556
1570
  */
1557
1571
  private createMediaConnection;
@@ -1697,14 +1711,15 @@ export default class Meeting extends StatelessWebexPlugin {
1697
1711
  * Internal version of addMedia() with some more arguments for finer control of its behavior
1698
1712
  *
1699
1713
  * @param {Function} icePhaseCallback - callback to determine the icePhase for CA "client.ice.end" failure events
1700
- * @param {TurnServerInfo} turnServerInfo - TURN server information
1701
1714
  * @param {boolean} forceTurnDiscovery - if true, TURN discovery will be done
1715
+ * @param {TurnServerInfo} turnServerInfo - TURN server information
1716
+ * @param {RTCIceTransportPolicy} [iceTransportPolicy] - ICE transport policy override
1702
1717
  * @param {AddMediaOptions} options - same as options of the public addMedia() method
1703
1718
  * @returns {Promise<void>}
1704
1719
  * @protected
1705
1720
  * @memberof Meeting
1706
1721
  */
1707
- protected addMediaInternal(icePhaseCallback: () => string, turnServerInfo: TurnServerInfo, forceTurnDiscovery: any, options?: AddMediaOptions): Promise<void>;
1722
+ protected addMediaInternal(icePhaseCallback: () => string, forceTurnDiscovery: boolean, turnServerInfo?: TurnServerInfo, iceTransportPolicy?: RTCIceTransportPolicy, options?: AddMediaOptions): Promise<void>;
1708
1723
  /**
1709
1724
  * Informs if the peer connection is in a state that can be updated with updateMedia (audio/video/share)
1710
1725
  * @returns {Boolean}
@@ -1,15 +1,15 @@
1
1
  import { ClusterNode } from './request';
2
2
  import EventsScope from '../common/events/events-scope';
3
3
  import { Enum } from '../constants';
4
- import { ClusterReachabilityResult, NatType } from './reachability.types';
4
+ import { ClusterReachabilityResult, NatType, Protocol } from './reachability.types';
5
5
  export type ResultEventData = {
6
- protocol: 'udp' | 'tcp' | 'xtls';
6
+ protocol: Protocol;
7
7
  result: 'reachable' | 'unreachable' | 'untested';
8
8
  latencyInMilliseconds: number;
9
9
  clientMediaIPs?: string[];
10
10
  };
11
11
  export type ClientMediaIpsUpdatedEventData = {
12
- protocol: 'udp' | 'tcp' | 'xtls';
12
+ protocol: Protocol;
13
13
  clientMediaIPs: string[];
14
14
  };
15
15
  export type NatTypeUpdatedEventData = {
@@ -4,7 +4,7 @@
4
4
  import { Defer } from '@webex/common';
5
5
  import { IP_VERSION } from '../constants';
6
6
  import ReachabilityRequest, { ClusterList } from './request';
7
- import { ClusterReachabilityResult, ClientMediaPreferences, ReachabilityMetrics, ReachabilityReportV0, ReachabilityReportV1, ReachabilityResults, ReachabilityResultsForBackend, GetClustersTrigger, NatType } from './reachability.types';
7
+ import { ClusterReachabilityResult, ClientMediaPreferences, ReachabilityMetrics, ReachabilityReportV0, ReachabilityReportV1, ReachabilityResults, ReachabilityResultsForBackend, GetClustersTrigger, NatType, Protocol } from './reachability.types';
8
8
  import { ClusterReachability } from './clusterReachability';
9
9
  import EventsScope from '../common/events/events-scope';
10
10
  /**
@@ -152,6 +152,13 @@ export default class Reachability extends EventsScope {
152
152
  * @returns {boolean}
153
153
  */
154
154
  isWebexMediaBackendUnreachable(): Promise<boolean>;
155
+ /**
156
+ * Checks if any cluster is reachable via the given protocol based on stored reachability results.
157
+ *
158
+ * @param {string} protocol - the protocol to check ('udp', 'tcp', or 'xtls')
159
+ * @returns {Promise<boolean>} true if at least one cluster has a 'reachable' result for the given protocol
160
+ */
161
+ isAnyClusterReachableViaProtocol(protocol: Protocol): Promise<boolean>;
155
162
  /**
156
163
  * Get list of all unreachable clusters
157
164
  * @returns {array} Unreachable clusters
@@ -209,7 +216,7 @@ export default class Reachability extends EventsScope {
209
216
  */
210
217
  protected getStatistics(results: Array<ClusterReachabilityResult & {
211
218
  isVideoMesh: boolean;
212
- }>, protocol: 'udp' | 'tcp' | 'xtls', isVideoMesh: boolean): {
219
+ }>, protocol: Protocol, isVideoMesh: boolean): {
213
220
  min: number;
214
221
  max: number;
215
222
  average: number;
@@ -869,7 +869,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
869
869
  }, _callee1);
870
870
  }))();
871
871
  },
872
- version: "3.12.0-next.91"
872
+ version: "3.12.0-next.93"
873
873
  });
874
874
  var _default = exports.default = Webinar;
875
875
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -62,7 +62,7 @@
62
62
  },
63
63
  "dependencies": {
64
64
  "@webex/common": "3.12.0-next.5",
65
- "@webex/internal-media-core": "2.26.1",
65
+ "@webex/internal-media-core": "2.26.2",
66
66
  "@webex/internal-plugin-conversation": "3.12.0-next.31",
67
67
  "@webex/internal-plugin-device": "3.12.0-next.29",
68
68
  "@webex/internal-plugin-llm": "3.12.0-next.33",
@@ -71,7 +71,7 @@
71
71
  "@webex/internal-plugin-support": "3.12.0-next.31",
72
72
  "@webex/internal-plugin-user": "3.12.0-next.30",
73
73
  "@webex/internal-plugin-voicea": "3.12.0-next.33",
74
- "@webex/media-helpers": "3.12.0-next.9",
74
+ "@webex/media-helpers": "3.12.0-next.10",
75
75
  "@webex/plugin-people": "3.12.0-next.30",
76
76
  "@webex/plugin-rooms": "3.12.0-next.31",
77
77
  "@webex/ts-sdp": "^1.8.1",
@@ -94,5 +94,5 @@
94
94
  "//": [
95
95
  "TODO: upgrade jwt-decode when moving to node 18"
96
96
  ],
97
- "version": "3.12.0-next.91"
97
+ "version": "3.12.0-next.93"
98
98
  }