@webex/plugin-meetings 3.3.1-next.13 → 3.3.1-next.15

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","_loggerProxy","_interopRequireDefault","_util","_constants","_request","_clusterReachability","Reachability","exports","default","webex","_classCallCheck2","_defineProperty2","REACHABILITY","namespace","reachabilityRequest","ReachabilityRequest","clusterReachability","_createClass2","key","value","_gatherReachability","_asyncToGenerator2","_regenerator","mark","_callee","_yield$this$reachabil","clusters","joinCookie","results","wrap","_callee$","_context","prev","next","getClusters","MeetingUtil","getIpVersion","sent","performReachabilityChecks","boundedStorage","put","localStorageResult","_stringify","localStorageJoinCookie","LoggerProxy","logger","log","abrupt","t0","error","stop","gatherReachability","apply","arguments","_getReachabilityMetrics","_callee2","stats","updateStats","resultsJson","_callee2$","_context2","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","clusterType","result","udp","outcome","concat","tcp","xtls","get","JSON","parse","_values","forEach","isVideoMesh","warn","getReachabilityMetrics","mapTransportResultToBackendDataFormat","transportResult","output","_i","_Object$entries","_entries","length","_Object$entries$_i","_slicedToArray2","reachable","untested","latencyInMilliseconds","toString","_getReachabilityResults","_callee3","_this","allClusterResults","_callee3$","_context3","mapValues","clusterResult","getReachabilityResults","_isAnyPublicClusterReachable","_callee4","reachabilityData","reachabilityResults","_callee4$","_context4","catch","some","_result$udp","_result$tcp","e","isAnyPublicClusterReachable","_isWebexMediaBackendUnreachable","_callee5","unreachable","protocols","_callee5$","_context5","tested","undefined","_keys","protocol","_result$protocol","_result$protocol2","every","isWebexMediaBackendUnreachable","getUnreachableClusters","unreachableList","_ref","_ref2","getResult","push","name","logUnreachableClusters","list","_ref3","_performReachabilityChecks","_callee6","clusterList","_this2","clusterReachabilityChecks","_callee6$","_context6","_promise","resolve","config","meetings","experimental","enableTcpReachability","enableTlsReachability","map","cluster","includeTcpReachability","includeTlsReachability","ClusterReachability","start","then","all","_x"],"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 {mapValues} from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport MeetingUtil from '../meeting/util';\n\nimport {REACHABILITY} from '../constants';\n\nimport ReachabilityRequest, {ClusterList} from './request';\nimport {\n ClusterReachability,\n ClusterReachabilityResult,\n TransportResult,\n} from './clusterReachability';\n\nexport type ReachabilityMetrics = {\n reachability_public_udp_success: number;\n reachability_public_udp_failed: number;\n reachability_public_tcp_success: number;\n reachability_public_tcp_failed: number;\n reachability_public_xtls_success: number;\n reachability_public_xtls_failed: number;\n reachability_vmn_udp_success: number;\n reachability_vmn_udp_failed: number;\n reachability_vmn_tcp_success: number;\n reachability_vmn_tcp_failed: number;\n reachability_vmn_xtls_success: number;\n reachability_vmn_xtls_failed: number;\n};\n\n/**\n * This is the type that matches what backend expects us to send to them. It is a bit weird, because\n * it uses strings instead of booleans and numbers, but that's what they require.\n */\nexport type TransportResultForBackend = {\n reachable?: 'true' | 'false';\n latencyInMilliseconds?: string;\n clientMediaIPs?: string[];\n untested?: 'true';\n};\n\nexport type ReachabilityResultForBackend = {\n udp: TransportResultForBackend;\n tcp: TransportResultForBackend;\n xtls: TransportResultForBackend;\n};\n\n// this is the type that is required by the backend when we send them reachability results\nexport type ReachabilityResultsForBackend = Record<string, ReachabilityResultForBackend>;\n\n// this is the type used by Reachability class internally and stored in local storage\nexport type ReachabilityResults = Record<\n string,\n ClusterReachabilityResult & {\n isVideoMesh?: boolean;\n }\n>;\n\n/**\n * @class Reachability\n * @export\n */\nexport default class Reachability {\n namespace = REACHABILITY.namespace;\n webex: object;\n reachabilityRequest: ReachabilityRequest;\n clusterReachability: {\n [key: string]: ClusterReachability;\n };\n\n /**\n * Creates an instance of Reachability.\n * @param {object} webex\n * @memberof Reachability\n */\n constructor(webex: object) {\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 * Gets a list of media clusters from the backend and performs reachability checks on all the clusters\n * @returns {Promise<ReachabilityResults>} reachability results\n * @public\n * @memberof Reachability\n */\n public async gatherReachability(): Promise<ReachabilityResults> {\n // Fetch clusters and measure latency\n try {\n const {clusters, joinCookie} = await this.reachabilityRequest.getClusters(\n MeetingUtil.getIpVersion(this.webex)\n );\n\n // Perform Reachability Check\n const results = await this.performReachabilityChecks(clusters);\n\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageResult,\n JSON.stringify(results)\n );\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageJoinCookie,\n JSON.stringify(joinCookie)\n );\n\n LoggerProxy.logger.log(\n 'Reachability:index#gatherReachability --> Reachability checks completed'\n );\n\n return results;\n } catch (error) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachability --> Error:`, error);\n\n return {};\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 };\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 'Roap:request#attachReachabilityData --> 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 `Roap:request#attachReachabilityData --> 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 `Roap:request#attachReachabilityData --> 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 * 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 * Performs reachability checks for all clusters\n * @param {ClusterList} clusterList\n * @returns {Promise<ReachabilityResults>} reachability check results\n */\n private async performReachabilityChecks(clusterList: ClusterList): Promise<ReachabilityResults> {\n const results: ReachabilityResults = {};\n\n if (!clusterList || !Object.keys(clusterList).length) {\n return Promise.resolve(results);\n }\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 const clusterReachabilityChecks = Object.keys(clusterList).map((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 const includeTlsReachability =\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTlsReachability && !cluster.isVideoMesh;\n\n if (!includeTlsReachability) {\n cluster.xtls = [];\n }\n\n this.clusterReachability[key] = new ClusterReachability(key, cluster);\n\n return this.clusterReachability[key].start().then((result) => {\n results[key] = result;\n results[key].isVideoMesh = cluster.isVideoMesh;\n });\n });\n\n await Promise.all(clusterReachabilityChecks);\n\n this.logUnreachableClusters();\n\n return results;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["_lodash","require","_common","_loggerProxy","_interopRequireDefault","_util","_constants","_request","_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","reachabilityRequest","ReachabilityRequest","clusterReachability","_createClass2","key","value","_gatherReachability","_asyncToGenerator2","_regenerator","mark","_callee","_yield$this$reachabil","clusters","joinCookie","wrap","_callee$","_context","prev","next","getClusters","MeetingUtil","getIpVersion","sent","boundedStorage","put","localStorageJoinCookie","_stringify","reachabilityDefer","Defer","performReachabilityChecks","abrupt","promise","t0","LoggerProxy","logger","error","stop","gatherReachability","_getReachabilityMetrics","_callee2","stats","updateStats","resultsJson","results","_callee2$","_context2","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","clusterType","outcome","concat","get","localStorageResult","JSON","parse","_values","isVideoMesh","warn","getReachabilityMetrics","mapTransportResultToBackendDataFormat","transportResult","output","_i","_Object$entries","_entries","_Object$entries$_i","_slicedToArray2","reachable","untested","latencyInMilliseconds","toString","_getReachabilityResults","_callee3","_this2","allClusterResults","_callee3$","_context3","mapValues","clusterResult","getReachabilityResults","_isAnyPublicClusterReachable","_callee4","reachabilityData","reachabilityResults","_callee4$","_context4","catch","some","_result$udp","_result$tcp","isAnyPublicClusterReachable","_isWebexMediaBackendUnreachable","_callee5","unreachable","protocols","_callee5$","_context5","tested","undefined","_keys","protocol","_result$protocol","_result$protocol2","every","isWebexMediaBackendUnreachable","getUnreachableClusters","unreachableList","_ref","_ref2","getResult","name","logUnreachableClusters","list","_ref3","log","areAllPublicClusterResultsReady","isEqual","expectedResultsCount","resultsCount","areAllResultsReady","resolveReachabilityPromise","_this$reachabilityDef","vmnTimer","clearTimeout","publicCloudTimer","resolve","abortClusterReachability","abort","getStatistics","values","map","min","max","average","Math","_toConsumableArray2","mean","_sendMetric","_callee6","_callee6$","_context6","vmn","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","REACHABILITY_COMPLETED","sendMetric","startTimers","_this3","setTimeout","overallTimer","emit","file","function","_storeResults","_callee7","_callee7$","_context7","storeResults","_x","resetResultCounters","_performReachabilityChecks","_callee10","clusterList","_this4","isFirstResult","_callee10$","_context10","config","meetings","experimental","enableTcpReachability","enableTlsReachability","cluster","includeTcpReachability","includeTlsReachability","ClusterReachability","on","Events","resultReady","_ref4","_callee8","data","clientMediaIPs","_callee8$","_context8","_x3","clientMediaIpsUpdated","_ref5","_callee9","_callee9$","_context9","_x4","start","_x2","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 {REACHABILITY} from '../constants';\n\nimport ReachabilityRequest, {ClusterList} from './request';\nimport {\n ClientMediaIpsUpdatedEventData,\n ClusterReachability,\n ClusterReachabilityResult,\n Events,\n ResultEventData,\n TransportResult,\n} from './clusterReachability';\nimport EventsScope from '../common/events/events-scope';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport Metrics from '../metrics';\n\nexport type ReachabilityMetrics = {\n reachability_public_udp_success: number;\n reachability_public_udp_failed: number;\n reachability_public_tcp_success: number;\n reachability_public_tcp_failed: number;\n reachability_public_xtls_success: number;\n reachability_public_xtls_failed: number;\n reachability_vmn_udp_success: number;\n reachability_vmn_udp_failed: number;\n reachability_vmn_tcp_success: number;\n reachability_vmn_tcp_failed: number;\n reachability_vmn_xtls_success: number;\n reachability_vmn_xtls_failed: number;\n};\n\n/**\n * This is the type that matches what backend expects us to send to them. It is a bit weird, because\n * it uses strings instead of booleans and numbers, but that's what they require.\n */\nexport type TransportResultForBackend = {\n reachable?: 'true' | 'false';\n latencyInMilliseconds?: string;\n clientMediaIPs?: string[];\n untested?: 'true';\n};\n\nexport type ReachabilityResultForBackend = {\n udp: TransportResultForBackend;\n tcp: TransportResultForBackend;\n xtls: TransportResultForBackend;\n};\n\n// this is the type that is required by the backend when we send them reachability results\nexport type ReachabilityResultsForBackend = Record<string, ReachabilityResultForBackend>;\n\n// this is the type used by Reachability class internally and stored in local storage\nexport type ReachabilityResults = Record<\n string,\n ClusterReachabilityResult & {\n isVideoMesh?: boolean;\n }\n>;\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 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\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 * Gets a list of media clusters from the backend and performs reachability checks on all the clusters\n * @returns {Promise<ReachabilityResults>} reachability results\n * @public\n * @memberof Reachability\n */\n public async gatherReachability(): Promise<ReachabilityResults> {\n // Fetch clusters and measure latency\n try {\n const {clusters, joinCookie} = await this.reachabilityRequest.getClusters(\n MeetingUtil.getIpVersion(this.webex)\n );\n\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageJoinCookie,\n JSON.stringify(joinCookie)\n );\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 * 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 };\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 'Roap:request#attachReachabilityData --> 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 `Roap:request#attachReachabilityData --> 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 `Roap:request#attachReachabilityData --> 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 * 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 * @returns {void}\n */\n private resolveReachabilityPromise() {\n if (this.vmnTimer) {\n clearTimeout(this.vmnTimer);\n }\n if (this.publicCloudTimer) {\n clearTimeout(this.publicCloudTimer);\n }\n\n this.logUnreachableClusters();\n this.reachabilityDefer?.resolve();\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 * @returns {void}\n */\n protected async sendMetric() {\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 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 };\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.REACHABILITY_COMPLETED, stats);\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 // 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 * 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 if (!clusterList || !Object.keys(clusterList).length) {\n return;\n }\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 this.startTimers();\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 // 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 clearTimeout(this.overallTimer);\n this.overallTimer = undefined;\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].start(); // not awaiting on purpose\n });\n }\n}\n"],"mappings":"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"}
@@ -66,5 +66,6 @@ declare const BEHAVIORAL_METRICS: {
66
66
  ROAP_OFFER_TO_ANSWER_LATENCY: string;
67
67
  ROAP_HTTP_RESPONSE_MISSING: string;
68
68
  TURN_DISCOVERY_REQUIRES_OK: string;
69
+ REACHABILITY_COMPLETED: string;
69
70
  };
70
71
  export { BEHAVIORAL_METRICS as default };
@@ -1,4 +1,6 @@
1
1
  import { ClusterNode } from './request';
2
+ import EventsScope from '../common/events/events-scope';
3
+ import { Enum } from '../constants';
2
4
  export type TransportResult = {
3
5
  result: 'reachable' | 'unreachable' | 'untested';
4
6
  latencyInMilliseconds?: number;
@@ -9,10 +11,26 @@ export type ClusterReachabilityResult = {
9
11
  tcp: TransportResult;
10
12
  xtls: TransportResult;
11
13
  };
14
+ export type ResultEventData = {
15
+ protocol: 'udp' | 'tcp' | 'xtls';
16
+ result: 'reachable' | 'unreachable' | 'untested';
17
+ latencyInMilliseconds: number;
18
+ clientMediaIPs?: string[];
19
+ };
20
+ export type ClientMediaIpsUpdatedEventData = {
21
+ protocol: 'udp' | 'tcp' | 'xtls';
22
+ clientMediaIPs: string[];
23
+ };
24
+ export declare const Events: {
25
+ readonly resultReady: "resultReady";
26
+ readonly clientMediaIpsUpdated: "clientMediaIpsUpdated";
27
+ };
28
+ export type Events = Enum<typeof Events>;
12
29
  /**
13
30
  * A class that handles reachability checks for a single cluster.
31
+ * It emits events from Events enum
14
32
  */
15
- export declare class ClusterReachability {
33
+ export declare class ClusterReachability extends EventsScope {
16
34
  private numUdpUrls;
17
35
  private numTcpUrls;
18
36
  private numXTlsUrls;
@@ -61,6 +79,12 @@ export declare class ClusterReachability {
61
79
  * @returns {void}
62
80
  */
63
81
  private finishReachabilityCheck;
82
+ /**
83
+ * Aborts the cluster reachability checks by closing the peer connection
84
+ *
85
+ * @returns {void}
86
+ */
87
+ abort(): void;
64
88
  /**
65
89
  * Adds public IP (client media IPs)
66
90
  * @param {string} protocol
@@ -81,13 +105,17 @@ export declare class ClusterReachability {
81
105
  */
82
106
  private haveWeGotAllResults;
83
107
  /**
84
- * Stores the latency in the result for the given protocol and marks it as reachable
108
+ * Saves the latency in the result for the given protocol and marks it as reachable,
109
+ * emits the "resultReady" event if this is the first result for that protocol,
110
+ * emits the "clientMediaIpsUpdated" event if we already had a result and only found
111
+ * a new client IP
85
112
  *
86
113
  * @param {string} protocol
87
114
  * @param {number} latency
115
+ * @param {string|null} [publicIp]
88
116
  * @returns {void}
89
117
  */
90
- private storeLatencyResult;
118
+ private saveResult;
91
119
  /**
92
120
  * Registers a listener for the icecandidate event
93
121
  *
@@ -1,8 +1,10 @@
1
1
  /*!
2
2
  * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
3
3
  */
4
+ import { Defer } from '@webex/common';
4
5
  import ReachabilityRequest from './request';
5
6
  import { ClusterReachability, ClusterReachabilityResult } from './clusterReachability';
7
+ import EventsScope from '../common/events/events-scope';
6
8
  export type ReachabilityMetrics = {
7
9
  reachability_public_udp_success: number;
8
10
  reachability_public_udp_failed: number;
@@ -40,13 +42,37 @@ export type ReachabilityResults = Record<string, ClusterReachabilityResult & {
40
42
  * @class Reachability
41
43
  * @export
42
44
  */
43
- export default class Reachability {
45
+ export default class Reachability extends EventsScope {
44
46
  namespace: string;
45
47
  webex: object;
46
48
  reachabilityRequest: ReachabilityRequest;
47
49
  clusterReachability: {
48
50
  [key: string]: ClusterReachability;
49
51
  };
52
+ reachabilityDefer?: Defer;
53
+ vmnTimer?: ReturnType<typeof setTimeout>;
54
+ publicCloudTimer?: ReturnType<typeof setTimeout>;
55
+ overallTimer?: ReturnType<typeof setTimeout>;
56
+ expectedResultsCount: {
57
+ videoMesh: {
58
+ udp: number;
59
+ };
60
+ public: {
61
+ udp: number;
62
+ tcp: number;
63
+ xtls: number;
64
+ };
65
+ };
66
+ resultsCount: {
67
+ videoMesh: {
68
+ udp: number;
69
+ };
70
+ public: {
71
+ udp: number;
72
+ tcp: number;
73
+ xtls: number;
74
+ };
75
+ };
50
76
  /**
51
77
  * Creates an instance of Reachability.
52
78
  * @param {object} webex
@@ -111,10 +137,75 @@ export default class Reachability {
111
137
  * @memberof Reachability
112
138
  */
113
139
  private logUnreachableClusters;
140
+ /**
141
+ * Returns true if we've obtained all the reachability results for all the public clusters
142
+ * In other words, it means that all public clusters are reachable over each protocol,
143
+ * because we only get a "result" if we managed to reach a cluster
144
+ *
145
+ * @returns {boolean}
146
+ */
147
+ private areAllPublicClusterResultsReady;
148
+ /**
149
+ * Returns true if we've obtained all the reachability results for all the clusters
150
+ *
151
+ * @returns {boolean}
152
+ */
153
+ private areAllResultsReady;
154
+ /**
155
+ * Resolves the promise returned by gatherReachability() method
156
+ * @returns {void}
157
+ */
158
+ private resolveReachabilityPromise;
159
+ /**
160
+ * Aborts all cluster reachability checks that are in progress
161
+ *
162
+ * @returns {void}
163
+ */
164
+ private abortClusterReachability;
165
+ /**
166
+ * Helper function for calculating min/max/average values of latency
167
+ *
168
+ * @param {Array<any>} results
169
+ * @param {string} protocol
170
+ * @param {boolean} isVideoMesh
171
+ * @returns {{min:number, max: number, average: number}}
172
+ */
173
+ protected getStatistics(results: Array<ClusterReachabilityResult & {
174
+ isVideoMesh: boolean;
175
+ }>, protocol: 'udp' | 'tcp' | 'xtls', isVideoMesh: boolean): {
176
+ min: number;
177
+ max: number;
178
+ average: number;
179
+ };
180
+ /**
181
+ * Sends a metric with all the statistics about how long reachability took
182
+ *
183
+ * @returns {void}
184
+ */
185
+ protected sendMetric(): Promise<void>;
186
+ /**
187
+ * Starts all the timers used for various timeouts
188
+ *
189
+ * @returns {void}
190
+ */
191
+ private startTimers;
192
+ /**
193
+ * Stores given reachability results in local storage
194
+ *
195
+ * @param {ReachabilityResults} results
196
+ * @returns {Promise<void>}
197
+ */
198
+ private storeResults;
199
+ /**
200
+ * Resets all the internal counters that keep track of the results
201
+ *
202
+ * @returns {void}
203
+ */
204
+ private resetResultCounters;
114
205
  /**
115
206
  * Performs reachability checks for all clusters
116
207
  * @param {ClusterList} clusterList
117
- * @returns {Promise<ReachabilityResults>} reachability check results
208
+ * @returns {Promise<void>} promise that's resolved as soon as the checks are started
118
209
  */
119
210
  private performReachabilityChecks;
120
211
  }
@@ -62,7 +62,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
62
62
  updateCanManageWebcast: function updateCanManageWebcast(canManageWebcast) {
63
63
  this.set('canManageWebcast', canManageWebcast);
64
64
  },
65
- version: "3.3.1-next.13"
65
+ version: "3.3.1-next.15"
66
66
  });
67
67
  var _default = exports.default = Webinar;
68
68
  //# 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-meetings": "3.3.1-next.13",
46
+ "@webex/plugin-meetings": "3.3.1-next.15",
47
47
  "@webex/plugin-rooms": "3.3.1-next.3",
48
48
  "@webex/test-helper-chai": "3.3.1-next.2",
49
49
  "@webex/test-helper-mocha": "3.3.1-next.2",
@@ -65,12 +65,12 @@
65
65
  "@webex/internal-media-core": "2.5.3",
66
66
  "@webex/internal-plugin-conversation": "3.3.1-next.3",
67
67
  "@webex/internal-plugin-device": "3.3.1-next.2",
68
- "@webex/internal-plugin-llm": "3.3.1-next.3",
68
+ "@webex/internal-plugin-llm": "3.3.1-next.4",
69
69
  "@webex/internal-plugin-mercury": "3.3.1-next.3",
70
70
  "@webex/internal-plugin-metrics": "3.3.1-next.2",
71
71
  "@webex/internal-plugin-support": "3.3.1-next.3",
72
72
  "@webex/internal-plugin-user": "3.3.1-next.2",
73
- "@webex/internal-plugin-voicea": "3.3.1-next.13",
73
+ "@webex/internal-plugin-voicea": "3.3.1-next.15",
74
74
  "@webex/media-helpers": "3.3.1-next.4",
75
75
  "@webex/plugin-people": "3.3.1-next.3",
76
76
  "@webex/plugin-rooms": "3.3.1-next.3",
@@ -91,5 +91,5 @@
91
91
  "//": [
92
92
  "TODO: upgrade jwt-decode when moving to node 18"
93
93
  ],
94
- "version": "3.3.1-next.13"
94
+ "version": "3.3.1-next.15"
95
95
  }
@@ -148,7 +148,6 @@ const Breakouts = WebexPlugin.extend({
148
148
  this.triggerReturnToMainEvent(breakout);
149
149
  });
150
150
  this.listenToCurrentSessionTypeChange();
151
- this.listenToBroadcastMessages();
152
151
  this.listenToBreakoutRosters();
153
152
  this.listenToBreakoutHelp();
154
153
  // @ts-ignore
@@ -161,6 +160,7 @@ const Breakouts = WebexPlugin.extend({
161
160
  */
162
161
  cleanUp() {
163
162
  this.stopListening();
163
+ this.hasSubscribedToMessage = undefined;
164
164
  },
165
165
 
166
166
  /**
@@ -170,6 +170,7 @@ const Breakouts = WebexPlugin.extend({
170
170
  */
171
171
  locusUrlUpdate(locusUrl) {
172
172
  this.set('locusUrl', locusUrl);
173
+ this.listenToBroadcastMessages();
173
174
  const {isInMainSession, mainLocusUrl} = this;
174
175
  if (isInMainSession || !mainLocusUrl) {
175
176
  this.set('mainLocusUrl', locusUrl);
@@ -255,6 +256,10 @@ const Breakouts = WebexPlugin.extend({
255
256
  * @returns {void}
256
257
  */
257
258
  listenToBroadcastMessages() {
259
+ if (!this.webex.internal.llm.isConnected() || this.hasSubscribedToMessage) {
260
+ return;
261
+ }
262
+
258
263
  this.listenTo(this.webex.internal.llm, 'event:breakout.message', (event) => {
259
264
  const {
260
265
  data: {senderUserId, sentTime, message},
@@ -270,6 +275,7 @@ const Breakouts = WebexPlugin.extend({
270
275
  sessionId: this.currentBreakoutSession.sessionId,
271
276
  });
272
277
  });
278
+ this.hasSubscribedToMessage = true;
273
279
  },
274
280
 
275
281
  /**
@@ -5233,8 +5233,13 @@ export default class Meeting extends StatelessWebexPlugin {
5233
5233
 
5234
5234
  // @ts-ignore - Fix type
5235
5235
  if (this.webex.internal.llm.isConnected()) {
5236
- // @ts-ignore - Fix type
5237
- if (url === this.webex.internal.llm.getLocusUrl() && isJoined) {
5236
+ if (
5237
+ // @ts-ignore - Fix type
5238
+ url === this.webex.internal.llm.getLocusUrl() &&
5239
+ // @ts-ignore - Fix type
5240
+ datachannelUrl === this.webex.internal.llm.getDatachannelUrl() &&
5241
+ isJoined
5242
+ ) {
5238
5243
  return undefined;
5239
5244
  }
5240
5245
  // @ts-ignore - Fix type
@@ -69,6 +69,7 @@ const BEHAVIORAL_METRICS = {
69
69
  ROAP_OFFER_TO_ANSWER_LATENCY: 'js_sdk_roap_offer_to_answer_latency',
70
70
  ROAP_HTTP_RESPONSE_MISSING: 'js_sdk_roap_http_response_missing',
71
71
  TURN_DISCOVERY_REQUIRES_OK: 'js_sdk_turn_discovery_requires_ok',
72
+ REACHABILITY_COMPLETED: 'js_sdk_reachability_completed',
72
73
  };
73
74
 
74
75
  export {BEHAVIORAL_METRICS as default};