@webex/plugin-meetings 3.9.0-next.1 → 3.9.0-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.
@@ -1 +1 @@
1
- {"version":3,"names":["_lodash","require","_common","_loggerProxy","_interopRequireDefault","_util","_constants","_request","_reachability","_clusterReachability","_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","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","result","NewTarget","constructor","_Reflect$construct","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","DEFAULT_TIMEOUT","VIDEO_MESH_TIMEOUT","OVERALL_TIMEOUT","Reachability","exports","_EventsScope","_inherits2","_super","webex","_this","_classCallCheck2","_assertThisInitialized2","REACHABILITY","namespace","videoMesh","udp","public","tcp","xtls","undefined","NatType","Unknown","reachabilityRequest","ReachabilityRequest","clusterReachability","_createClass2","key","value","_getClusters","_asyncToGenerator2","_regenerator","mark","_callee","trigger","previousReport","isRetry","_yield$this$reachabil","clusters","joinCookie","discoveryOptions","_args","wrap","_callee$","_context","prev","next","getClusters","MeetingUtil","getIpVersion","sent","minRequiredClusters","orpheusApiVersion","boundedStorage","put","localStorageJoinCookie","_stringify","abrupt","t0","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","_callee2$","_context2","config","meetings","enableReachabilityChecks","Error","lastTrigger","internal","device","ipNetworkDetector","detect","reachabilityDefer","Defer","performReachabilityChecks","promise","gatherReachability","_x3","_getJoinCookie","_callee3","joinCookieRaw","_callee3$","_context3","get","catch","JSON","parse","getJoinCookie","_getReachabilityReport","_callee4","reachabilityResult","_callee4$","_context4","getReachabilityResults","reachability","version","usedDiscoveryOptions","metrics","totalDuration","tests","getReachabilityReport","_gatherReachabilityFallback","_callee5","reachabilityReport","_yield$this$getCluste2","_callee5$","_context5","abortCurrentChecks","gatherReachabilityFallback","stopReachability","overallTimer","log","emit","file","function","sendMetric","resolveReachabilityPromise","_getReachabilityMetrics","_callee6","stats","updateStats","resultsJson","results","_callee6$","_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","warn","getReachabilityMetrics","mapTransportResultToBackendDataFormat","transportResult","output","_i","_Object$entries","_entries","_Object$entries$_i","_slicedToArray2","reachable","untested","latencyInMilliseconds","toString","_getReachabilityResults","_callee7","_this2","allClusterResults","_callee7$","_context7","mapValues","clusterResult","_isAnyPublicClusterReachable","_callee8","reachabilityData","reachabilityResults","_callee8$","_context8","some","_result$udp","_result$tcp","isAnyPublicClusterReachable","_isWebexMediaBackendUnreachable","_callee9","unreachable","protocols","_callee9$","_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","_callee10","aborted","_args10","_callee10$","_context10","vmn","ipver","firstIpV4","firstIpV6","firstMdns","totalTime","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","REACHABILITY_COMPLETED","prepareMetricFields","startTimers","_this3","vmnTimer","setTimeout","publicCloudTimer","_storeResults","_callee11","_callee11$","_context11","storeResults","_x4","resetResultCounters","timer","clearTimeout","_performReachabilityChecks","_callee15","clusterList","_this4","isFirstResult","_callee15$","_context15","experimental","enableTcpReachability","enableTlsReachability","includeTcpReachability","includeTlsReachability","ClusterReachability","on","Events","resultReady","_ref6","_callee12","data","clientMediaIPs","_callee12$","_context12","_x6","clientMediaIpsUpdated","_ref7","_callee13","_callee13$","_context13","_x7","natTypeUpdated","_ref8","_callee14","_callee14$","_context14","_x8","start","_x5","_getClientMediaPreferences","_callee16","isMultistream","_callee16$","_context16","t1","t2","preferTranscoding","getClientMediaPreferences","_x9","_x10","_getReachabilityReportToAttachToRoap","_callee17","_callee17$","_context17","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 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 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 (!this.webex.config.meetings.enableReachabilityChecks) {\n throw new Error('enableReachabilityChecks is disabled in config');\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.experimental.enableTlsReachability === false,\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 LoggerProxy.logger.log(\n `Reachability:index#performReachabilityChecks --> doing UDP${\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTcpReachability ? ',TCP' : ''\n }${\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTlsReachability ? ',TLS' : ''\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 =\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTcpReachability && !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 =\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTlsReachability && !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;\n if (!cluster.isVideoMesh) {\n this.expectedResultsCount.public.tcp += cluster.tcp.length;\n this.expectedResultsCount.public.xtls += cluster.xtls.length;\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(key, cluster);\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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"}
1
+ {"version":3,"names":["_lodash","require","_common","_loggerProxy","_interopRequireDefault","_util","_constants","_request","_reachability","_clusterReachability","_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","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","result","NewTarget","constructor","_Reflect$construct","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","DEFAULT_TIMEOUT","VIDEO_MESH_TIMEOUT","OVERALL_TIMEOUT","Reachability","exports","_EventsScope","_inherits2","_super","webex","_this","_classCallCheck2","_assertThisInitialized2","REACHABILITY","namespace","videoMesh","udp","public","tcp","xtls","undefined","NatType","Unknown","reachabilityRequest","ReachabilityRequest","clusterReachability","_createClass2","key","value","_getClusters","_asyncToGenerator2","_regenerator","mark","_callee","trigger","previousReport","isRetry","_yield$this$reachabil","clusters","joinCookie","discoveryOptions","_args","wrap","_callee$","_context","prev","next","getClusters","MeetingUtil","getIpVersion","sent","minRequiredClusters","orpheusApiVersion","boundedStorage","put","localStorageJoinCookie","_stringify","abrupt","t0","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","_callee2$","_context2","config","meetings","enableReachabilityChecks","Error","lastTrigger","internal","device","ipNetworkDetector","detect","reachabilityDefer","Defer","performReachabilityChecks","promise","gatherReachability","_x3","_getJoinCookie","_callee3","joinCookieRaw","_callee3$","_context3","get","catch","JSON","parse","getJoinCookie","_getReachabilityReport","_callee4","reachabilityResult","_callee4$","_context4","getReachabilityResults","reachability","version","usedDiscoveryOptions","metrics","totalDuration","tests","getReachabilityReport","_gatherReachabilityFallback","_callee5","reachabilityReport","_yield$this$getCluste2","_callee5$","_context5","abortCurrentChecks","gatherReachabilityFallback","stopReachability","overallTimer","log","emit","file","function","sendMetric","resolveReachabilityPromise","_getReachabilityMetrics","_callee6","stats","updateStats","resultsJson","results","_callee6$","_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","warn","getReachabilityMetrics","mapTransportResultToBackendDataFormat","transportResult","output","_i","_Object$entries","_entries","_Object$entries$_i","_slicedToArray2","reachable","untested","latencyInMilliseconds","toString","_getReachabilityResults","_callee7","_this2","allClusterResults","_callee7$","_context7","mapValues","clusterResult","_isAnyPublicClusterReachable","_callee8","reachabilityData","reachabilityResults","_callee8$","_context8","some","_result$udp","_result$tcp","isAnyPublicClusterReachable","_isWebexMediaBackendUnreachable","_callee9","unreachable","protocols","_callee9$","_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","_callee10","aborted","_args10","_callee10$","_context10","vmn","ipver","firstIpV4","firstIpV6","firstMdns","totalTime","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","REACHABILITY_COMPLETED","prepareMetricFields","startTimers","_this3","vmnTimer","setTimeout","publicCloudTimer","_storeResults","_callee11","_callee11$","_context11","storeResults","_x4","resetResultCounters","timer","clearTimeout","_performReachabilityChecks","_callee15","clusterList","_this4","isFirstResult","_callee15$","_context15","experimental","enableTcpReachability","enableTlsReachability","includeTcpReachability","includeTlsReachability","ClusterReachability","on","Events","resultReady","_ref6","_callee12","data","clientMediaIPs","_callee12$","_context12","_x6","clientMediaIpsUpdated","_ref7","_callee13","_callee13$","_context13","_x7","natTypeUpdated","_ref8","_callee14","_callee14$","_context14","_x8","start","_x5","_getClientMediaPreferences","_callee16","isMultistream","_callee16$","_context16","t1","t2","preferTranscoding","getClientMediaPreferences","_x9","_x10","_getReachabilityReportToAttachToRoap","_callee17","_callee17$","_context17","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 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 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 (!this.webex.config.meetings.enableReachabilityChecks) {\n throw new Error('enableReachabilityChecks is disabled in config');\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.experimental.enableTlsReachability === false,\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 LoggerProxy.logger.log(\n `Reachability:index#performReachabilityChecks --> doing UDP${\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTcpReachability ? ',TCP' : ''\n }${\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTlsReachability ? ',TLS' : ''\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 =\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTcpReachability && !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 =\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTlsReachability && !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(key, cluster);\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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"}
@@ -49,6 +49,8 @@ export default class LocusInfo extends EventsScope {
49
49
  * Does a Locus sync. It tries to get the latest delta DTO or if it can't, it falls back to getting the full Locus DTO.
50
50
  *
51
51
  * @param {Meeting} meeting
52
+ * @param {boolean} isLocusUrlChanged
53
+ * @param {Locus} locus
52
54
  * @returns {undefined}
53
55
  */
54
56
  private doLocusSync;
@@ -338,9 +338,10 @@ export default class Members extends StatelessWebexPlugin {
338
338
  * @param {string} memberId - id of the participant who is receiving request
339
339
  * @param {string} requestingParticipantId - id of the participant who is sending request (optional)
340
340
  * @param {string} [alias] - alias name
341
+ * @param {string} [suffix] - name suffix (optional)
341
342
  * @returns {Promise}
342
343
  * @public
343
344
  * @memberof Members
344
345
  */
345
- editDisplayName(memberId: string, requestingParticipantId: string, alias: string): any;
346
+ editDisplayName(memberId: string, requestingParticipantId: string, alias: string, suffix?: string): any;
346
347
  }
@@ -110,13 +110,15 @@ declare const MembersUtil: {
110
110
  * @param {String} requestingParticipantId id of the participant who is sending request (optional)
111
111
  * @param {String} alias alias name
112
112
  * @param {String} locusUrl url
113
+ * @param {String} suffix optional suffix
113
114
  * @returns {Object} consists of {memberID: string, requestingParticipantId: string, alias: string, locusUrl: string}
114
115
  */
115
- generateEditDisplayNameMemberOptions: (memberId: any, requestingParticipantId: any, alias: any, locusUrl: any) => {
116
+ generateEditDisplayNameMemberOptions: (memberId: any, requestingParticipantId: any, alias: any, locusUrl: any, suffix: any) => {
116
117
  memberId: any;
117
118
  requestingParticipantId: any;
118
119
  alias: any;
119
120
  locusUrl: any;
121
+ suffix: any;
120
122
  };
121
123
  getMuteMemberRequestParams: (options: any) => {
122
124
  method: string;
@@ -178,8 +180,9 @@ declare const MembersUtil: {
178
180
  method: string;
179
181
  uri: string;
180
182
  body: {
181
- aliasValue: any;
182
- requestingParticipantId: any;
183
+ aliasValue: string;
184
+ requestingParticipantId: string;
185
+ suffixValue?: string;
183
186
  };
184
187
  };
185
188
  getTransferHostToMemberRequestParams: (options: any) => {
@@ -458,7 +458,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
458
458
  }, _callee7);
459
459
  }))();
460
460
  },
461
- version: "3.9.0-next.1"
461
+ version: "3.9.0-next.10"
462
462
  });
463
463
  var _default = exports.default = Webinar;
464
464
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -43,7 +43,7 @@
43
43
  "@webex/eslint-config-legacy": "0.0.0",
44
44
  "@webex/jest-config-legacy": "0.0.0",
45
45
  "@webex/legacy-tools": "0.0.0",
46
- "@webex/plugin-rooms": "3.8.1-next.15",
46
+ "@webex/plugin-rooms": "3.9.0-next.2",
47
47
  "@webex/test-helper-chai": "3.8.1-next.11",
48
48
  "@webex/test-helper-mocha": "3.8.1-next.11",
49
49
  "@webex/test-helper-mock-webex": "3.8.1-next.11",
@@ -63,20 +63,20 @@
63
63
  "@webex/common": "3.8.1-next.11",
64
64
  "@webex/event-dictionary-ts": "^1.0.1819",
65
65
  "@webex/internal-media-core": "2.18.5",
66
- "@webex/internal-plugin-conversation": "3.8.1-next.18",
67
- "@webex/internal-plugin-device": "3.8.1-next.15",
68
- "@webex/internal-plugin-llm": "3.8.1-next.16",
69
- "@webex/internal-plugin-mercury": "3.8.1-next.15",
70
- "@webex/internal-plugin-metrics": "3.8.1-next.15",
71
- "@webex/internal-plugin-support": "3.8.1-next.18",
72
- "@webex/internal-plugin-user": "3.8.1-next.15",
73
- "@webex/internal-plugin-voicea": "3.8.1-next.42",
66
+ "@webex/internal-plugin-conversation": "3.9.0-next.2",
67
+ "@webex/internal-plugin-device": "3.9.0-next.2",
68
+ "@webex/internal-plugin-llm": "3.9.0-next.2",
69
+ "@webex/internal-plugin-mercury": "3.9.0-next.2",
70
+ "@webex/internal-plugin-metrics": "3.9.0-next.2",
71
+ "@webex/internal-plugin-support": "3.9.0-next.3",
72
+ "@webex/internal-plugin-user": "3.9.0-next.2",
73
+ "@webex/internal-plugin-voicea": "3.9.0-next.2",
74
74
  "@webex/media-helpers": "3.8.1-next.16",
75
- "@webex/plugin-people": "3.8.1-next.15",
76
- "@webex/plugin-rooms": "3.8.1-next.15",
75
+ "@webex/plugin-people": "3.9.0-next.2",
76
+ "@webex/plugin-rooms": "3.9.0-next.2",
77
77
  "@webex/ts-sdp": "^1.8.1",
78
78
  "@webex/web-capabilities": "^1.6.0",
79
- "@webex/webex-core": "3.8.1-next.15",
79
+ "@webex/webex-core": "3.9.0-next.2",
80
80
  "ampersand-collection": "^2.0.2",
81
81
  "bowser": "^2.11.0",
82
82
  "btoa": "^1.2.1",
@@ -92,5 +92,5 @@
92
92
  "//": [
93
93
  "TODO: upgrade jwt-decode when moving to node 18"
94
94
  ],
95
- "version": "3.9.0-next.1"
95
+ "version": "3.9.0-next.10"
96
96
  }
@@ -93,19 +93,26 @@ export default class LocusInfo extends EventsScope {
93
93
  * Does a Locus sync. It tries to get the latest delta DTO or if it can't, it falls back to getting the full Locus DTO.
94
94
  *
95
95
  * @param {Meeting} meeting
96
+ * @param {boolean} isLocusUrlChanged
97
+ * @param {Locus} locus
96
98
  * @returns {undefined}
97
99
  */
98
- private doLocusSync(meeting: any) {
99
- let isDelta;
100
+ private doLocusSync(meeting: any, isLocusUrlChanged: boolean, locus: any) {
100
101
  let url;
102
+ let isDelta = false;
101
103
  let meetingDestroyed = false;
102
104
 
103
- if (this.locusParser.workingCopy.syncUrl) {
105
+ if (isLocusUrlChanged) {
106
+ // for the locus url changed case from breakout to main session, we should always do a full sync, in this case, the url from locus is always on main session,
107
+ // so use the main session locus url to get the full locus(full participants list in the response).
108
+ // for the locus url changed case from main session to breakout, we don't need to care about it here,
109
+ // because it is a USE_INCOMING case, it will not be executed here.
110
+ url = locus.url;
111
+ } else if (this.locusParser.workingCopy?.syncUrl) {
104
112
  url = this.locusParser.workingCopy.syncUrl;
105
113
  isDelta = true;
106
114
  } else {
107
115
  url = meeting.locusUrl;
108
- isDelta = false;
109
116
  }
110
117
 
111
118
  LoggerProxy.logger.info(
@@ -217,6 +224,7 @@ export default class LocusInfo extends EventsScope {
217
224
  */
218
225
  applyLocusDeltaData(action: string, locus: any, meeting: any) {
219
226
  const {DESYNC, USE_CURRENT, USE_INCOMING, WAIT, LOCUS_URL_CHANGED} = LocusDeltaParser.loci;
227
+ const isLocusUrlChanged = action === LOCUS_URL_CHANGED;
220
228
 
221
229
  switch (action) {
222
230
  case USE_INCOMING:
@@ -228,7 +236,7 @@ export default class LocusInfo extends EventsScope {
228
236
  break;
229
237
  case DESYNC:
230
238
  case LOCUS_URL_CHANGED:
231
- this.doLocusSync(meeting);
239
+ this.doLocusSync(meeting, isLocusUrlChanged, locus);
232
240
  break;
233
241
  default:
234
242
  LoggerProxy.logger.info(
@@ -728,13 +728,17 @@ export default class Parser {
728
728
  break;
729
729
 
730
730
  case USE_INCOMING:
731
- case LOCUS_URL_CHANGED:
732
731
  // update working copy for future comparisons.
733
732
  // Note: The working copy of parser gets updated in .onFullLocus()
734
733
  // and here when USE_INCOMING or LOCUS_URL_CHANGED locus.
735
734
  this.workingCopy = newLoci;
736
735
  break;
737
736
 
737
+ case LOCUS_URL_CHANGED:
738
+ // clear the working copy completely, do a full locus sync
739
+ this.workingCopy = null;
740
+ break;
741
+
738
742
  case WAIT:
739
743
  // we've taken newLoci from the front of the queue, so put it back there as we have to wait
740
744
  // for the one that should be in front of it, before we can process it
@@ -3149,6 +3149,23 @@ export default class Meeting extends StatelessWebexPlugin {
3149
3149
  },
3150
3150
  EVENT_TRIGGERS.MEETING_STOPPED_SHARING_WHITEBOARD
3151
3151
  );
3152
+ // @ts-ignore
3153
+ this.webex.internal.newMetrics.callDiagnosticLatencies.saveTimestamp({
3154
+ key: 'internal.client.share.stopped',
3155
+ });
3156
+ // @ts-ignore
3157
+ this.webex.internal.newMetrics.submitClientEvent({
3158
+ name: 'client.share.stopped',
3159
+ payload: {
3160
+ mediaType: 'whiteboard',
3161
+ shareDuration:
3162
+ // @ts-ignore
3163
+ this.webex.internal.newMetrics.callDiagnosticLatencies.getShareDuration(),
3164
+ },
3165
+ options: {
3166
+ meetingId: this.id,
3167
+ },
3168
+ });
3152
3169
  break;
3153
3170
 
3154
3171
  case SHARE_STATUS.NO_SHARE:
@@ -6948,10 +6965,10 @@ export default class Meeting extends StatelessWebexPlugin {
6948
6965
  }
6949
6966
  }
6950
6967
 
6951
- // Count members that are in the meeting.
6968
+ // Count members that are in the meeting or in the lobby.
6952
6969
  const {members} = this.getMembers().membersCollection;
6953
6970
  event.data.intervalMetadata.meetingUserCount = Object.values(members).filter(
6954
- (member: Member) => member.isInMeeting
6971
+ (member: Member) => member.isInMeeting || member.isInLobby
6955
6972
  ).length;
6956
6973
 
6957
6974
  // @ts-ignore
@@ -7819,6 +7836,9 @@ export default class Meeting extends StatelessWebexPlugin {
7819
7836
 
7820
7837
  this.allowMediaInLobby = options?.allowMediaInLobby;
7821
7838
 
7839
+ // @ts-ignore
7840
+ const ipver = MeetingUtil.getIpVersion(this.webex); // used just for metrics
7841
+
7822
7842
  // If the user is unjoined or guest waiting in lobby dont allow the user to addMedia
7823
7843
  // @ts-ignore - isUserUnadmitted coming from SelfUtil
7824
7844
  if (this.isUserUnadmitted && !this.wirelessShare && !this.allowMediaInLobby) {
@@ -7917,6 +7937,7 @@ export default class Meeting extends StatelessWebexPlugin {
7917
7937
  locus_id: this.locusUrl.split('/').pop(),
7918
7938
  connectionType,
7919
7939
  ipVersion,
7940
+ ipver,
7920
7941
  selectedCandidatePairChanges,
7921
7942
  numTransports,
7922
7943
  isMultistream: this.isMultistream,
@@ -7985,6 +8006,7 @@ export default class Meeting extends StatelessWebexPlugin {
7985
8006
  ...reachabilityMetrics,
7986
8007
  ...iceCandidateErrors,
7987
8008
  iceCandidatesCount: this.iceCandidatesCount,
8009
+ ipver,
7988
8010
  });
7989
8011
 
7990
8012
  await this.cleanUpOnAddMediaFailure();