@webex/plugin-meetings 3.0.0-beta.337 → 3.0.0-beta.339
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/breakouts/breakout.js +1 -1
- package/dist/breakouts/index.js +1 -1
- package/dist/config.js +2 -1
- package/dist/config.js.map +1 -1
- package/dist/interpretation/index.js +1 -1
- package/dist/interpretation/siLanguage.js +1 -1
- package/dist/reachability/clusterReachability.js +356 -0
- package/dist/reachability/clusterReachability.js.map +1 -0
- package/dist/reachability/index.js +167 -451
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/util.js +29 -0
- package/dist/reachability/util.js.map +1 -0
- package/dist/statsAnalyzer/mqaUtil.js +4 -0
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/types/config.d.ts +1 -0
- package/dist/types/meetings/index.d.ts +1 -11
- package/dist/types/reachability/clusterReachability.d.ts +109 -0
- package/dist/types/reachability/index.d.ts +32 -121
- package/dist/types/reachability/util.d.ts +8 -0
- package/dist/webinar/index.js +1 -1
- package/package.json +20 -20
- package/src/config.ts +1 -0
- package/src/reachability/clusterReachability.ts +320 -0
- package/src/reachability/index.ts +124 -421
- package/src/reachability/util.ts +24 -0
- package/src/statsAnalyzer/mqaUtil.ts +4 -0
- package/test/unit/spec/reachability/clusterReachability.ts +279 -0
- package/test/unit/spec/reachability/index.ts +159 -226
- package/test/unit/spec/reachability/util.ts +40 -0
- package/test/unit/spec/roap/request.ts +26 -3
- package/test/unit/spec/stats-analyzer/index.js +47 -20
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["DEFAULT_TIMEOUT","VIDEO_MESH_TIMEOUT","Reachability","webex","REACHABILITY","namespace","reachabilityRequest","ReachabilityRequest","clusterLatencyResults","setup","boundedStorage","del","localStorageResult","localStorageJoinCookie","getClusters","MeetingUtil","getIpVersion","clusters","joinCookie","performReachabilityCheck","results","put","LoggerProxy","logger","log","error","stats","reachability_public_udp_success","reachability_public_udp_failed","reachability_public_tcp_success","reachability_public_tcp_failed","reachability_vmn_udp_success","reachability_vmn_udp_failed","reachability_vmn_tcp_success","reachability_vmn_tcp_failed","updateStats","clusterType","result","udp","reachable","outcome","tcp","get","resultsJson","internalResults","JSON","parse","forEach","isVideoMesh","warn","reachabilityResultsProps","catch","reachabilityData","reachabilityResults","some","e","cluster","iceServers","map","url","username","credential","urls","iceCandidatePoolSize","iceTransportPolicy","key","config","peerConnection","window","RTCPeerConnection","peerConnectionError","startTime","begin","clusterList","buildPeerConnectionConfig","createPeerConnection","createOffer","offerToReceiveAudio","description","setLocalDescription","iceGatheringState","iceGatheringStateError","all","then","parseIceResultsToInternalReachabilityResults","reachabilityLatencyResults","logUnreachableClusters","unreachableList","unreachable","push","onicegatheringstatechange","COMPLETE","ICE_GATHERING_STATE","iceConnectionState","elapsed","getElapsedTime","setLatencyAndClose","onicecandidate","SERVER_REFLEXIVE","candidate","String","type","toLowerCase","addPublicIP","address","ELAPSED","timeout","resolve","peerConnectionProxy","Proxy","target","property","targetMember","bind","set","value","clusterId","publicIPs","Reflect","handleIceGatheringStateChange","handleOnIceCandidate","setTimeout","CLOSED","CONNECTION_STATE","connectionState","list","getUnreachablClusters","iceResults","reachabilityMap","latencyResult","latencyInMilliseconds","toString","clientMediaIPs","untested","xtls","length","getLocalSDPForClusters","localSDPData","publicIP","modifiedPeerConnection","REACHABLE","UNREACHABLE","resultKey","intialState","close"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable class-methods-use-this */\n/* globals window */\nimport {uniq, mapValues, pick} from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport MeetingUtil from '../meeting/util';\n\nimport {ICE_GATHERING_STATE, CONNECTION_STATE, REACHABILITY} from '../constants';\n\nimport ReachabilityRequest from './request';\n\nconst DEFAULT_TIMEOUT = 3000;\nconst VIDEO_MESH_TIMEOUT = 1000;\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_vmn_udp_success: number;\n reachability_vmn_udp_failed: number;\n reachability_vmn_tcp_success: number;\n reachability_vmn_tcp_failed: number;\n};\n\n// result for a specific transport protocol (like udp or tcp)\nexport type TransportResult = {\n reachable?: 'true' | 'false';\n latencyInMilliseconds?: string;\n clientMediaIPs?: string[];\n untested?: 'true';\n};\n\n// reachability result for a specifc media cluster\ntype ReachabilityResult = {\n udp: TransportResult;\n tcp: TransportResult;\n xtls: {\n untested: 'true';\n };\n};\n// this is the type that is required by the backend when we send them reachability results\nexport type ReachabilityResults = Record<string, ReachabilityResult>;\n\n// this is the type used by Reachability class internally and stored in local storage\ntype InternalReachabilityResults = Record<\n string,\n ReachabilityResult & {\n isVideoMesh?: boolean;\n }\n>;\n\nexport type ICECandidateResult = {\n clusterId: string;\n isVideoMesh: boolean;\n elapsed?: string | null;\n publicIPs?: string[];\n};\n/**\n * @class Reachability\n * @export\n */\nexport default class Reachability {\n namespace = REACHABILITY.namespace;\n webex: object;\n reachabilityRequest: any;\n clusterLatencyResults: any;\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 /**\n * internal object of clusters latency results\n * @instance\n * @type {object}\n * @private\n * @memberof Reachability\n */\n this.clusterLatencyResults = {};\n }\n\n /**\n * fetches reachability data\n * @returns {Object} reachability data\n * @public\n * @async\n * @memberof Reachability\n */\n public async gatherReachability(): Promise<InternalReachabilityResults> {\n this.setup();\n\n // Remove stored reachability results to ensure no stale data\n // @ts-ignore\n await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageResult);\n // @ts-ignore\n await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageJoinCookie);\n\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.performReachabilityCheck(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 (getClusterError) {\n LoggerProxy.logger.error(\n `Reachability:index#gatherReachability --> Error in calling getClusters(): ${getClusterError}`\n );\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_vmn_udp_success: 0,\n reachability_vmn_udp_failed: 0,\n reachability_vmn_tcp_success: 0,\n reachability_vmn_tcp_failed: 0,\n };\n\n const updateStats = (clusterType: 'public' | 'vmn', result: ReachabilityResult) => {\n if (result.udp?.reachable) {\n const outcome = result.udp.reachable === 'true' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_udp_${outcome}`] += 1;\n }\n if (result.tcp?.reachable) {\n const outcome = result.tcp.reachable === 'true' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_tcp_${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 internalResults: InternalReachabilityResults = JSON.parse(resultsJson);\n\n Object.values(internalResults).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 * 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<ReachabilityResults | undefined> {\n let results: ReachabilityResults;\n\n // these are the only props that backend needs in the reachability results:\n const reachabilityResultsProps: Array<keyof ReachabilityResult> = ['udp', 'tcp', 'xtls'];\n\n try {\n // @ts-ignore\n const resultsJson = await this.webex.boundedStorage.get(\n REACHABILITY.namespace,\n REACHABILITY.localStorageResult\n );\n\n const internalResults: InternalReachabilityResults = JSON.parse(resultsJson);\n\n results = mapValues(internalResults, (result) => pick(result, reachabilityResultsProps));\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: InternalReachabilityResults = JSON.parse(reachabilityData);\n\n reachable = Object.values(reachabilityResults).some(\n (result) =>\n !result.isVideoMesh &&\n (result.udp?.reachable === 'true' || result.tcp?.reachable === 'true')\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 * Generate peerConnection config settings\n * @param {object} cluster\n * @returns {object} peerConnectionConfig\n * @private\n * @memberof Reachability\n */\n private buildPeerConnectionConfig(cluster: any) {\n const iceServers = uniq(cluster.udp).map((url) => ({\n username: '',\n credential: '',\n urls: [url],\n }));\n\n return {\n iceServers: [...iceServers],\n iceCandidatePoolSize: '0',\n iceTransportPolicy: 'all',\n };\n }\n\n /**\n * Creates an RTCPeerConnection\n * @param {object} cluster\n * @returns {RTCPeerConnection} peerConnection\n * @private\n * @memberof Reachability\n */\n private createPeerConnection(cluster: any) {\n const {key, config} = cluster;\n\n try {\n const peerConnection = new window.RTCPeerConnection(config);\n\n // @ts-ignore\n peerConnection.key = key;\n\n return peerConnection;\n } catch (peerConnectionError) {\n LoggerProxy.logger.log(\n `Reachability:index#createPeerConnection --> Error creating peerConnection: ${peerConnectionError}`\n );\n\n return null;\n }\n }\n\n /**\n * Gets total elapsed time\n * @param {RTCPeerConnection} peerConnection\n * @returns {Number} Milliseconds\n * @private\n * @memberof Reachability\n */\n private getElapsedTime(peerConnection: any) {\n const startTime = peerConnection.begin;\n\n delete peerConnection.begin;\n\n return Date.now() - startTime;\n }\n\n /**\n * creates offer and generates localSDP\n * @param {object} clusterList cluster List\n * @returns {Promise} Reachability latency results\n * @private\n * @memberof Reachability\n */\n private getLocalSDPForClusters(clusterList: object): Promise<InternalReachabilityResults> {\n let clusters: any[] = [...Object.keys(clusterList)];\n\n clusters = clusters.map(async (key) => {\n const cluster = clusterList[key];\n const config = this.buildPeerConnectionConfig(cluster);\n const peerConnection = this.createPeerConnection({key, config});\n const description = await peerConnection.createOffer({offerToReceiveAudio: true});\n\n // @ts-ignore\n peerConnection.begin = Date.now();\n peerConnection.setLocalDescription(description);\n\n return this.iceGatheringState(peerConnection, cluster.isVideoMesh).catch(\n (iceGatheringStateError) => {\n LoggerProxy.logger.log(\n `Reachability:index#getLocalSDPForClusters --> Error in getLocalSDP : ${iceGatheringStateError}`\n );\n }\n );\n });\n\n return Promise.all(clusters)\n .then(this.parseIceResultsToInternalReachabilityResults)\n .then((reachabilityLatencyResults) => {\n this.logUnreachableClusters();\n\n // return results\n return reachabilityLatencyResults;\n });\n }\n\n /**\n * Get list of all unreachable clusters\n * @returns {array} Unreachable clusters\n * @private\n * @memberof Reachability\n */\n private getUnreachablClusters() {\n const unreachableList = [];\n const clusters = this.clusterLatencyResults;\n\n Object.keys(clusters).forEach((key) => {\n const cluster = clusters[key];\n\n if (cluster.unreachable && !cluster.reachable) {\n unreachableList.push(key);\n }\n });\n\n return unreachableList;\n }\n\n /**\n * Attach an event handler for the icegatheringstatechange\n * event and measure latency.\n * @param {RTCPeerConnection} peerConnection\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private handleIceGatheringStateChange(peerConnection: RTCPeerConnection) {\n peerConnection.onicegatheringstatechange = () => {\n const {COMPLETE} = ICE_GATHERING_STATE;\n\n if (peerConnection.iceConnectionState === COMPLETE) {\n const elapsed = this.getElapsedTime(peerConnection);\n\n // @ts-ignore\n LoggerProxy.logger.log(\n // @ts-ignore\n `Reachability:index#onIceGatheringStateChange --> Successfully pinged ${peerConnection.key}:`,\n elapsed\n );\n this.setLatencyAndClose(peerConnection, elapsed);\n }\n };\n }\n\n /**\n * Attach an event handler for the icecandidate\n * event and measure latency.\n * @param {RTCPeerConnection} peerConnection\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private handleOnIceCandidate(peerConnection: RTCPeerConnection) {\n peerConnection.onicecandidate = (e) => {\n const SERVER_REFLEXIVE = 'srflx';\n\n if (e.candidate && String(e.candidate.type).toLowerCase() === SERVER_REFLEXIVE) {\n const elapsed = this.getElapsedTime(peerConnection);\n\n LoggerProxy.logger.log(\n // @ts-ignore\n `Reachability:index#onIceCandidate --> Successfully pinged ${peerConnection.key}:`,\n elapsed\n );\n // order is important\n this.addPublicIP(peerConnection, e.candidate.address);\n this.setLatencyAndClose(peerConnection, elapsed);\n }\n };\n }\n\n /**\n * An event handler on an RTCPeerConnection when the state of the ICE\n * candidate gathering process changes. Used to measure connection\n * speed.\n * @private\n * @param {RTCPeerConnection} peerConnection\n * @param {boolean} isVideoMesh\n * @returns {Promise}\n */\n private iceGatheringState(peerConnection: RTCPeerConnection, isVideoMesh: boolean) {\n const ELAPSED = 'elapsed';\n\n const timeout = isVideoMesh ? VIDEO_MESH_TIMEOUT : DEFAULT_TIMEOUT;\n\n return new Promise<ICECandidateResult>((resolve) => {\n const peerConnectionProxy = new window.Proxy(peerConnection, {\n // eslint-disable-next-line require-jsdoc\n get(target, property) {\n const targetMember = target[property];\n\n if (typeof targetMember === 'function') {\n return targetMember.bind(target);\n }\n\n return targetMember;\n },\n set: (target, property, value) => {\n // only intercept elapsed property\n if (property === ELAPSED) {\n resolve({\n // @ts-ignore\n clusterId: peerConnection.key,\n isVideoMesh,\n // @ts-ignore\n publicIPs: target.publicIPs,\n elapsed: value,\n });\n\n return true;\n }\n\n // pass thru\n return window.Reflect.set(target, property, value);\n },\n });\n\n // Using peerConnection proxy so handle functions below\n // won't be coupled to our promise implementation\n this.handleIceGatheringStateChange(peerConnectionProxy);\n this.handleOnIceCandidate(peerConnectionProxy);\n\n // Set maximum timeout\n window.setTimeout(() => {\n const {CLOSED} = CONNECTION_STATE;\n\n // Close any open peerConnections\n if (peerConnectionProxy.connectionState !== CLOSED) {\n // order is important\n this.addPublicIP(peerConnectionProxy, null);\n this.setLatencyAndClose(peerConnectionProxy, null);\n }\n }, timeout);\n });\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.getUnreachablClusters();\n\n list.forEach((cluster) => {\n LoggerProxy.logger.log(\n `Reachability:index#logUnreachableClusters --> No ice candidate for ${cluster}.`\n );\n });\n }\n\n /**\n * Calculates time to establish connection\n * @param {Array<ICECandidateResult>} iceResults iceResults\n * @returns {object} reachabilityMap\n * @protected\n * @memberof Reachability\n */\n protected parseIceResultsToInternalReachabilityResults(\n iceResults: Array<ICECandidateResult>\n ): InternalReachabilityResults {\n const reachabilityMap = {};\n\n iceResults.forEach(({clusterId, isVideoMesh, elapsed, publicIPs}) => {\n const latencyResult = {};\n\n if (!elapsed) {\n Object.assign(latencyResult, {reachable: 'false'});\n } else {\n Object.assign(latencyResult, {\n reachable: 'true',\n latencyInMilliseconds: elapsed.toString(),\n });\n }\n\n if (publicIPs) {\n Object.assign(latencyResult, {\n clientMediaIPs: publicIPs,\n });\n }\n\n reachabilityMap[clusterId] = {\n udp: latencyResult,\n tcp: {untested: 'true'},\n xtls: {untested: 'true'},\n isVideoMesh,\n };\n });\n\n return reachabilityMap;\n }\n\n /**\n * fetches reachability data\n * @param {object} clusterList\n * @returns {Promise<InternalReachabilityResults>} reachability check results\n * @private\n * @memberof Reachability\n */\n private performReachabilityCheck(clusterList: object): Promise<InternalReachabilityResults> {\n if (!clusterList || !Object.keys(clusterList).length) {\n return Promise.resolve({});\n }\n\n return new Promise((resolve) => {\n this.getLocalSDPForClusters(clusterList)\n .then((localSDPData) => {\n if (!localSDPData || !Object.keys(localSDPData).length) {\n // TODO: handle the error condition properly and try retry\n LoggerProxy.logger.log(\n 'Reachability:index#performReachabilityCheck --> Local SDP is empty or has missing elements..returning'\n );\n resolve({});\n } else {\n resolve(localSDPData);\n }\n })\n .catch((error) => {\n LoggerProxy.logger.error(\n `Reachability:index#performReachabilityCheck --> Error in getLocalSDPForClusters: ${error}`\n );\n resolve({});\n });\n });\n }\n\n /**\n * Adds public IP (client media IPs)\n * @param {RTCPeerConnection} peerConnection\n * @param {string} publicIP\n * @returns {void}\n */\n protected addPublicIP(peerConnection: RTCPeerConnection, publicIP?: string | null) {\n const modifiedPeerConnection: RTCPeerConnection & {publicIPs?: string[]} = peerConnection;\n const {CLOSED} = CONNECTION_STATE;\n\n if (modifiedPeerConnection.connectionState === CLOSED) {\n LoggerProxy.logger.log(\n `Reachability:index#addPublicIP --> Attempting to set publicIP of ${publicIP} on closed peerConnection.`\n );\n }\n\n if (publicIP) {\n if (modifiedPeerConnection.publicIPs) {\n modifiedPeerConnection.publicIPs.push(publicIP);\n } else {\n modifiedPeerConnection.publicIPs = [publicIP];\n }\n } else {\n modifiedPeerConnection.publicIPs = null;\n }\n }\n\n /**\n * Records latency and closes the peerConnection\n * @param {RTCPeerConnection} peerConnection\n * @param {number} elapsed Latency in milliseconds\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private setLatencyAndClose(peerConnection: RTCPeerConnection, elapsed: number) {\n const REACHABLE = 'reachable';\n const UNREACHABLE = 'unreachable';\n const {CLOSED} = CONNECTION_STATE;\n // @ts-ignore\n const {key} = peerConnection;\n const resultKey = elapsed === null ? UNREACHABLE : REACHABLE;\n const intialState = {[REACHABLE]: 0, [UNREACHABLE]: 0};\n\n if (peerConnection.connectionState === CLOSED) {\n LoggerProxy.logger.log(\n `Reachability:index#setLatencyAndClose --> Attempting to set latency of ${elapsed} on closed peerConnection.`\n );\n\n return;\n }\n\n this.clusterLatencyResults[key] = this.clusterLatencyResults[key] || intialState;\n this.clusterLatencyResults[key][resultKey] += 1;\n\n // Set to null in case this fired from\n // an event other than onIceCandidate\n peerConnection.onicecandidate = null;\n peerConnection.close();\n // @ts-ignore\n peerConnection.elapsed = elapsed;\n }\n\n /**\n * utility function\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private setup() {\n this.clusterLatencyResults = {};\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["Reachability","webex","REACHABILITY","namespace","reachabilityRequest","ReachabilityRequest","clusterReachability","boundedStorage","del","localStorageResult","localStorageJoinCookie","getClusters","MeetingUtil","getIpVersion","clusters","joinCookie","performReachabilityChecks","results","put","LoggerProxy","logger","log","error","stats","reachability_public_udp_success","reachability_public_udp_failed","reachability_public_tcp_success","reachability_public_tcp_failed","reachability_vmn_udp_success","reachability_vmn_udp_failed","reachability_vmn_tcp_success","reachability_vmn_tcp_failed","updateStats","clusterType","result","udp","outcome","tcp","get","resultsJson","JSON","parse","forEach","isVideoMesh","warn","transportResult","output","key","value","reachable","untested","latencyInMilliseconds","toString","allClusterResults","clusterResult","mapTransportResultToBackendDataFormat","xtls","catch","reachabilityData","reachabilityResults","some","e","unreachableList","getResult","push","name","protocol","list","getUnreachableClusters","clusterList","length","resolve","includeTcpReachability","config","meetings","experimental","enableTcpReachability","clusterReachabilityChecks","map","cluster","ClusterReachability","start","then","all","logUnreachableClusters"],"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_vmn_udp_success: number;\n reachability_vmn_udp_failed: number;\n reachability_vmn_tcp_success: number;\n reachability_vmn_tcp_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 // Remove stored reachability results to ensure no stale data\n // @ts-ignore\n await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageResult);\n // @ts-ignore\n await this.webex.boundedStorage.del(this.namespace, REACHABILITY.localStorageJoinCookie);\n\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_vmn_udp_success: 0,\n reachability_vmn_udp_failed: 0,\n reachability_vmn_tcp_success: 0,\n reachability_vmn_tcp_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 };\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 * 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 });\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 // @ts-ignore\n const includeTcpReachability = this.webex.config.meetings.experimental.enableTcpReachability;\n\n LoggerProxy.logger.log(\n `Reachability:index#performReachabilityChecks --> doing UDP${\n includeTcpReachability ? ' and TCP' : ''\n } reachability checks`\n );\n\n const clusterReachabilityChecks = Object.keys(clusterList).map((key) => {\n const cluster = clusterList[key];\n\n if (!includeTcpReachability) {\n cluster.tcp = [];\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":";;;;;;;;;;;;;;;;;;;;AAOA;AACA;AAEA;AAEA;AACA;AA6CA;AACA;AACA;AACA;AAHA,IAIqBA,YAAY;EAQ/B;AACF;AACA;AACA;AACA;EACE,sBAAYC,KAAa,EAAE;IAAA;IAAA,iDAZfC,uBAAY,CAACC,SAAS;IAAA;IAAA;IAAA;IAahC,IAAI,CAACF,KAAK,GAAGA,KAAK;;IAElB;AACJ;AACA;AACA;AACA;AACA;AACA;IACI,IAAI,CAACG,mBAAmB,GAAG,IAAIC,gBAAmB,CAAC,IAAI,CAACJ,KAAK,CAAC;IAE9D,IAAI,CAACK,mBAAmB,GAAG,CAAC,CAAC;EAC/B;;EAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA;MAAA,kGAMA;QAAA;QAAA;UAAA;YAAA;cAAA;cAAA,OAGQ,IAAI,CAACL,KAAK,CAACM,cAAc,CAACC,GAAG,CAAC,IAAI,CAACL,SAAS,EAAED,uBAAY,CAACO,kBAAkB,CAAC;YAAA;cAAA;cAAA,OAE9E,IAAI,CAACR,KAAK,CAACM,cAAc,CAACC,GAAG,CAAC,IAAI,CAACL,SAAS,EAAED,uBAAY,CAACQ,sBAAsB,CAAC;YAAA;cAAA;cAAA;cAAA,OAIjD,IAAI,CAACN,mBAAmB,CAACO,WAAW,CACvEC,aAAW,CAACC,YAAY,CAAC,IAAI,CAACZ,KAAK,CAAC,CACrC;YAAA;cAAA;cAFMa,QAAQ,yBAARA,QAAQ;cAAEC,UAAU,yBAAVA,UAAU;cAAA;cAAA,OAKL,IAAI,CAACC,yBAAyB,CAACF,QAAQ,CAAC;YAAA;cAAxDG,OAAO;cAAA;cAAA,OAGP,IAAI,CAAChB,KAAK,CAACM,cAAc,CAACW,GAAG,CACjC,IAAI,CAACf,SAAS,EACdD,uBAAY,CAACO,kBAAkB,EAC/B,wBAAeQ,OAAO,CAAC,CACxB;YAAA;cAAA;cAAA,OAEK,IAAI,CAAChB,KAAK,CAACM,cAAc,CAACW,GAAG,CACjC,IAAI,CAACf,SAAS,EACdD,uBAAY,CAACQ,sBAAsB,EACnC,wBAAeK,UAAU,CAAC,CAC3B;YAAA;cAEDI,oBAAW,CAACC,MAAM,CAACC,GAAG,CACpB,yEAAyE,CAC1E;cAAC,iCAEKJ,OAAO;YAAA;cAAA;cAAA;cAEdE,oBAAW,CAACC,MAAM,CAACE,KAAK,iEAA2D;cAAC,iCAE7E,CAAC,CAAC;YAAA;YAAA;cAAA;UAAA;QAAA;MAAA,CAEZ;MAAA;QAAA;MAAA;MAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA;MAAA,sGAMA;QAAA;QAAA;UAAA;YAAA;cACQC,KAA0B,GAAG;gBACjCC,+BAA+B,EAAE,CAAC;gBAClCC,8BAA8B,EAAE,CAAC;gBACjCC,+BAA+B,EAAE,CAAC;gBAClCC,8BAA8B,EAAE,CAAC;gBACjCC,4BAA4B,EAAE,CAAC;gBAC/BC,2BAA2B,EAAE,CAAC;gBAC9BC,4BAA4B,EAAE,CAAC;gBAC/BC,2BAA2B,EAAE;cAC/B,CAAC;cAEKC,WAAW,GAAG,SAAdA,WAAW,CAAIC,WAA6B,EAAEC,MAAiC,EAAK;gBACxF,IAAIA,MAAM,CAACC,GAAG,IAAID,MAAM,CAACC,GAAG,CAACD,MAAM,KAAK,UAAU,EAAE;kBAClD,IAAME,OAAO,GAAGF,MAAM,CAACC,GAAG,CAACD,MAAM,KAAK,WAAW,GAAG,SAAS,GAAG,QAAQ;kBACxEX,KAAK,wBAAiBU,WAAW,kBAAQG,OAAO,EAAG,IAAI,CAAC;gBAC1D;gBACA,IAAIF,MAAM,CAACG,GAAG,IAAIH,MAAM,CAACG,GAAG,CAACH,MAAM,KAAK,UAAU,EAAE;kBAClD,IAAME,QAAO,GAAGF,MAAM,CAACG,GAAG,CAACH,MAAM,KAAK,WAAW,GAAG,SAAS,GAAG,QAAQ;kBACxEX,KAAK,wBAAiBU,WAAW,kBAAQG,QAAO,EAAG,IAAI,CAAC;gBAC1D;cACF,CAAC;cAAA;cAAA;cAAA,OAI2B,IAAI,CAACnC,KAAK,CAACM,cAAc,CAAC+B,GAAG,CACrDpC,uBAAY,CAACC,SAAS,EACtBD,uBAAY,CAACO,kBAAkB,CAChC;YAAA;cAHK8B,WAAW;cAKXtB,OAA4B,GAAGuB,IAAI,CAACC,KAAK,CAACF,WAAW,CAAC;cAE5D,qBAActB,OAAO,CAAC,CAACyB,OAAO,CAAC,UAACR,MAAM,EAAK;gBACzCF,WAAW,CAACE,MAAM,CAACS,WAAW,GAAG,KAAK,GAAG,QAAQ,EAAET,MAAM,CAAC;cAC5D,CAAC,CAAC;cAAC;cAAA;YAAA;cAAA;cAAA;cAEH;cACAf,oBAAW,CAACC,MAAM,CAACwB,IAAI,CACrB,2EAA2E,eAE5E;YAAC;cAAA,kCAGGrB,KAAK;YAAA;YAAA;cAAA;UAAA;QAAA;MAAA,CACb;MAAA;QAAA;MAAA;MAAA;IAAA;IAED;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA,OAKA,+CACEsB,eAAgC,EACL;MAC3B,IAAMC,MAAiC,GAAG,CAAC,CAAC;MAE5C,mCAA2B,sBAAeD,eAAe,CAAC,qCAAE;QAAvD;UAAOE,IAAG;UAAEC,KAAK;QACpB,QAAQD,IAAG;UACT,KAAK,QAAQ;YACX,QAAQC,KAAK;cACX,KAAK,WAAW;gBACdF,MAAM,CAACG,SAAS,GAAG,MAAM;gBACzB;cACF,KAAK,aAAa;gBAChBH,MAAM,CAACG,SAAS,GAAG,OAAO;gBAC1B;cACF,KAAK,UAAU;gBACbH,MAAM,CAACI,QAAQ,GAAG,MAAM;gBACxB;YAAM;YAEV;UACF,KAAK,uBAAuB;YAC1BJ,MAAM,CAACK,qBAAqB,GAAGH,KAAK,CAACI,QAAQ,EAAE;YAC/C;UACF;YACEN,MAAM,CAACC,IAAG,CAAC,GAAGC,KAAK;QAAC;MAE1B;MAEA,OAAOF,MAAM;IACf;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA;MAAA,sGAKA;QAAA;QAAA;QAAA;UAAA;YAAA;cAAA;cAAA;cAAA,OAK8B,IAAI,CAAC7C,KAAK,CAACM,cAAc,CAAC+B,GAAG,CACrDpC,uBAAY,CAACC,SAAS,EACtBD,uBAAY,CAACO,kBAAkB,CAChC;YAAA;cAHK8B,WAAW;cAKXc,iBAAsC,GAAGb,IAAI,CAACC,KAAK,CAACF,WAAW,CAAC;cAEtEtB,OAAO,GAAG,yBAAUoC,iBAAiB,EAAE,UAACC,aAAa;gBAAA,OAAM;kBACzDnB,GAAG,EAAE,KAAI,CAACoB,qCAAqC,CAACD,aAAa,CAACnB,GAAG,IAAI;oBAACD,MAAM,EAAE;kBAAU,CAAC,CAAC;kBAC1FG,GAAG,EAAE,KAAI,CAACkB,qCAAqC,CAACD,aAAa,CAACjB,GAAG,IAAI;oBAACH,MAAM,EAAE;kBAAU,CAAC,CAAC;kBAC1FsB,IAAI,EAAE,KAAI,CAACD,qCAAqC,CAC9CD,aAAa,CAACE,IAAI,IAAI;oBAACtB,MAAM,EAAE;kBAAU,CAAC;gBAE9C,CAAC;cAAA,CAAC,CAAC;cAAC;cAAA;YAAA;cAAA;cAAA;cAEJ;cACAf,oBAAW,CAACC,MAAM,CAACwB,IAAI,CACrB,2EAA2E,eAE5E;YAAC;cAAA,kCAGG3B,OAAO;YAAA;YAAA;cAAA;UAAA;QAAA;MAAA,CACf;MAAA;QAAA;MAAA;MAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA;MAAA,2GAMA;QAAA;QAAA;UAAA;YAAA;cACMgC,SAAS,GAAG,KAAK,EACrB;cAAA;cAAA,OAC+B,IAAI,CAAChD,KAAK,CAACM,cAAc,CACrD+B,GAAG,CAAC,IAAI,CAACnC,SAAS,EAAED,uBAAY,CAACO,kBAAkB,CAAC,CACpDgD,KAAK,CAAC,YAAM,CAAC,CAAC,CAAC;YAAA;cAFZC,gBAAgB;cAItB,IAAIA,gBAAgB,EAAE;gBACpB,IAAI;kBACIC,mBAAwC,GAAGnB,IAAI,CAACC,KAAK,CAACiB,gBAAgB,CAAC;kBAE7ET,SAAS,GAAG,qBAAcU,mBAAmB,CAAC,CAACC,IAAI,CACjD,UAAC1B,MAAM;oBAAA;oBAAA,OACL,CAACA,MAAM,CAACS,WAAW,KAClB,gBAAAT,MAAM,CAACC,GAAG,gDAAV,YAAYD,MAAM,MAAK,WAAW,IAAI,gBAAAA,MAAM,CAACG,GAAG,gDAAV,YAAYH,MAAM,MAAK,WAAW,CAAC;kBAAA,EAC7E;gBACH,CAAC,CAAC,OAAO2B,CAAC,EAAE;kBACV1C,oBAAW,CAACC,MAAM,CAACE,KAAK,uFACyDuC,CAAC,EACjF;gBACH;cACF;cAAC,kCAEMZ,SAAS;YAAA;YAAA;cAAA;UAAA;QAAA;MAAA,CACjB;MAAA;QAAA;MAAA;MAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,kCAA0E;MACxE,IAAMa,eAAe,GAAG,EAAE;MAE1B,sBAAe,IAAI,CAACxD,mBAAmB,CAAC,CAACoC,OAAO,CAAC,gBAAgC;QAAA;UAA9BK,GAAG;UAAEzC,mBAAmB;QACzE,IAAM4B,MAAM,GAAG5B,mBAAmB,CAACyD,SAAS,EAAE;QAE9C,IAAI7B,MAAM,CAACC,GAAG,CAACD,MAAM,KAAK,aAAa,EAAE;UACvC4B,eAAe,CAACE,IAAI,CAAC;YAACC,IAAI,EAAElB,GAAG;YAAEmB,QAAQ,EAAE;UAAK,CAAC,CAAC;QACpD;QACA,IAAIhC,MAAM,CAACG,GAAG,CAACH,MAAM,KAAK,aAAa,EAAE;UACvC4B,eAAe,CAACE,IAAI,CAAC;YAACC,IAAI,EAAElB,GAAG;YAAEmB,QAAQ,EAAE;UAAK,CAAC,CAAC;QACpD;MACF,CAAC,CAAC;MAEF,OAAOJ,eAAe;IACxB;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA;IAAA,OAMA,kCAAiC;MAC/B,IAAMK,IAAI,GAAG,IAAI,CAACC,sBAAsB,EAAE;MAE1CD,IAAI,CAACzB,OAAO,CAAC,iBAAsB;QAAA,IAApBuB,IAAI,SAAJA,IAAI;UAAEC,QAAQ,SAARA,QAAQ;QAC3B/C,oBAAW,CAACC,MAAM,CAACC,GAAG,yEAC6C4C,IAAI,mBAASC,QAAQ,EACvF;MACH,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA;IAAA;MAAA,yGAKA,kBAAwCG,WAAwB;QAAA;QAAA;QAAA;UAAA;YAAA;cACxDpD,OAA4B,GAAG,CAAC,CAAC;cAAA,MAEnC,CAACoD,WAAW,IAAI,CAAC,mBAAYA,WAAW,CAAC,CAACC,MAAM;gBAAA;gBAAA;cAAA;cAAA,kCAC3C,iBAAQC,OAAO,CAACtD,OAAO,CAAC;YAAA;cAGjC;cACMuD,sBAAsB,GAAG,IAAI,CAACvE,KAAK,CAACwE,MAAM,CAACC,QAAQ,CAACC,YAAY,CAACC,qBAAqB;cAE5FzD,oBAAW,CAACC,MAAM,CAACC,GAAG,qEAElBmD,sBAAsB,GAAG,UAAU,GAAG,EAAE,0BAE3C;cAEKK,yBAAyB,GAAG,mBAAYR,WAAW,CAAC,CAACS,GAAG,CAAC,UAAC/B,GAAG,EAAK;gBACtE,IAAMgC,OAAO,GAAGV,WAAW,CAACtB,GAAG,CAAC;gBAEhC,IAAI,CAACyB,sBAAsB,EAAE;kBAC3BO,OAAO,CAAC1C,GAAG,GAAG,EAAE;gBAClB;gBAEA,MAAI,CAAC/B,mBAAmB,CAACyC,GAAG,CAAC,GAAG,IAAIiC,wCAAmB,CAACjC,GAAG,EAAEgC,OAAO,CAAC;gBAErE,OAAO,MAAI,CAACzE,mBAAmB,CAACyC,GAAG,CAAC,CAACkC,KAAK,EAAE,CAACC,IAAI,CAAC,UAAChD,MAAM,EAAK;kBAC5DjB,OAAO,CAAC8B,GAAG,CAAC,GAAGb,MAAM;kBACrBjB,OAAO,CAAC8B,GAAG,CAAC,CAACJ,WAAW,GAAGoC,OAAO,CAACpC,WAAW;gBAChD,CAAC,CAAC;cACJ,CAAC,CAAC;cAAA;cAAA,OAEI,iBAAQwC,GAAG,CAACN,yBAAyB,CAAC;YAAA;cAE5C,IAAI,CAACO,sBAAsB,EAAE;cAAC,kCAEvBnE,OAAO;YAAA;YAAA;cAAA;UAAA;QAAA;MAAA,CACf;MAAA;QAAA;MAAA;MAAA;IAAA;EAAA;EAAA;AAAA;AAAA"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
|
|
4
|
+
_Object$defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.convertStunUrlToTurn = convertStunUrlToTurn;
|
|
8
|
+
/* eslint-disable import/prefer-default-export */
|
|
9
|
+
/**
|
|
10
|
+
* Converts a stun url to a turn url
|
|
11
|
+
*
|
|
12
|
+
* @param {string} stunUrl url of a stun server
|
|
13
|
+
* @param {'tcp'|'udp'} protocol what protocol to use for the turn server
|
|
14
|
+
* @returns {string} url of a turn server
|
|
15
|
+
*/
|
|
16
|
+
function convertStunUrlToTurn(stunUrl, protocol) {
|
|
17
|
+
// stunUrl looks like this: "stun:external-media91.public.wjfkm-a-10.prod.infra.webex.com:5004"
|
|
18
|
+
// and we need it to be like this: "turn:external-media91.public.wjfkm-a-10.prod.infra.webex.com:5004?transport=tcp"
|
|
19
|
+
var url = new URL(stunUrl);
|
|
20
|
+
if (url.protocol !== 'stun:') {
|
|
21
|
+
throw new Error("Not a STUN URL: ".concat(stunUrl));
|
|
22
|
+
}
|
|
23
|
+
url.protocol = 'turn:';
|
|
24
|
+
if (protocol === 'tcp') {
|
|
25
|
+
url.searchParams.append('transport', 'tcp');
|
|
26
|
+
}
|
|
27
|
+
return url.toString();
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["convertStunUrlToTurn","stunUrl","protocol","url","URL","Error","searchParams","append","toString"],"sources":["util.ts"],"sourcesContent":["/* eslint-disable import/prefer-default-export */\n/**\n * Converts a stun url to a turn url\n *\n * @param {string} stunUrl url of a stun server\n * @param {'tcp'|'udp'} protocol what protocol to use for the turn server\n * @returns {string} url of a turn server\n */\nexport function convertStunUrlToTurn(stunUrl: string, protocol: 'udp' | 'tcp') {\n // stunUrl looks like this: \"stun:external-media91.public.wjfkm-a-10.prod.infra.webex.com:5004\"\n // and we need it to be like this: \"turn:external-media91.public.wjfkm-a-10.prod.infra.webex.com:5004?transport=tcp\"\n const url = new URL(stunUrl);\n\n if (url.protocol !== 'stun:') {\n throw new Error(`Not a STUN URL: ${stunUrl}`);\n }\n\n url.protocol = 'turn:';\n if (protocol === 'tcp') {\n url.searchParams.append('transport', 'tcp');\n }\n\n return url.toString();\n}\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,oBAAoB,CAACC,OAAe,EAAEC,QAAuB,EAAE;EAC7E;EACA;EACA,IAAMC,GAAG,GAAG,IAAIC,GAAG,CAACH,OAAO,CAAC;EAE5B,IAAIE,GAAG,CAACD,QAAQ,KAAK,OAAO,EAAE;IAC5B,MAAM,IAAIG,KAAK,2BAAoBJ,OAAO,EAAG;EAC/C;EAEAE,GAAG,CAACD,QAAQ,GAAG,OAAO;EACtB,IAAIA,QAAQ,KAAK,KAAK,EAAE;IACtBC,GAAG,CAACG,YAAY,CAACC,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC;EAC7C;EAEA,OAAOJ,GAAG,CAACK,QAAQ,EAAE;AACvB"}
|
|
@@ -29,6 +29,7 @@ var getAudioReceiverMqa = function getAudioReceiverMqa(_ref) {
|
|
|
29
29
|
audioReceiver.streams[0].common.csi.push(csi);
|
|
30
30
|
}
|
|
31
31
|
audioReceiver.common.common.direction = statsResults[mediaType].direction;
|
|
32
|
+
audioReceiver.common.common.isMain = !mediaType.includes('-share');
|
|
32
33
|
audioReceiver.common.transportType = statsResults.connectionType.local.transport;
|
|
33
34
|
|
|
34
35
|
// add rtpPacket info inside common as also for call analyzer
|
|
@@ -72,6 +73,7 @@ var getAudioSenderMqa = function getAudioSenderMqa(_ref2) {
|
|
|
72
73
|
audioSender.streams[0].common.csi.push(csi);
|
|
73
74
|
}
|
|
74
75
|
audioSender.common.common.direction = statsResults[mediaType].direction;
|
|
76
|
+
audioSender.common.common.isMain = !mediaType.includes('-share');
|
|
75
77
|
audioSender.common.transportType = statsResults.connectionType.local.transport;
|
|
76
78
|
audioSender.common.maxRemoteJitter =
|
|
77
79
|
// @ts-ignore
|
|
@@ -120,6 +122,7 @@ var getVideoReceiverMqa = function getVideoReceiverMqa(_ref3) {
|
|
|
120
122
|
videoReceiver.streams[0].common.csi.push(csi);
|
|
121
123
|
}
|
|
122
124
|
videoReceiver.common.common.direction = statsResults[mediaType].direction;
|
|
125
|
+
videoReceiver.common.common.isMain = !mediaType.includes('-share');
|
|
123
126
|
videoReceiver.common.transportType = statsResults.connectionType.local.transport;
|
|
124
127
|
|
|
125
128
|
// collect the packets received for the last min
|
|
@@ -179,6 +182,7 @@ var getVideoSenderMqa = function getVideoSenderMqa(_ref4) {
|
|
|
179
182
|
videoSender.streams[0].common.csi.push(csi);
|
|
180
183
|
}
|
|
181
184
|
videoSender.common.common.direction = statsResults[mediaType].direction;
|
|
185
|
+
videoSender.common.common.isMain = !mediaType.includes('-share');
|
|
182
186
|
videoSender.common.transportType = statsResults.connectionType.local.transport;
|
|
183
187
|
|
|
184
188
|
// @ts-ignore
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["getAudioReceiverMqa","audioReceiver","statsResults","lastMqaDataSent","mediaType","sendrecvType","STATS","RECEIVE_DIRECTION","lastPacketsReceived","totalPacketsReceived","lastPacketsLost","totalPacketsLost","lastPacketsDecoded","totalSamplesDecoded","lastSamplesReceived","totalSamplesReceived","lastConcealedSamples","concealedSamples","lastBytesReceived","totalBytesReceived","lastFecPacketsReceived","fecPacketsReceived","lastFecPacketsDiscarded","fecPacketsDiscarded","csi","streams","common","includes","push","direction","transportType","connectionType","local","transport","rtpPackets","mediaHopByHopLost","rtpHopByHopLost","maxRtpJitter","meanRtpJitter","rtpJitter","fecRecovered","rtpEndToEndLost","framesDropped","renderedFrameRate","framesReceived","concealedFrames","receivedBitrate","rtpBitrate","getAudioSenderMqa","audioSender","SEND_DIRECTION","lastPacketsSent","totalPacketsSent","totalPacketsLostOnReceiver","lastBytesSent","totalBytesSent","lastFramesEncoded","totalKeyFramesEncoded","lastFirCount","totalFirCount","maxRemoteJitter","meanRemoteJitter","availableBitrate","availableOutgoingBitrate","totalpacketsLostForaMin","remoteLossRate","maxRoundTripTime","meanRoundTripTime","roundTripTime","totalBytesSentInaMin","transmittedBitrate","transmittedKeyFrames","requestedKeyFrames","getVideoReceiverMqa","videoReceiver","lastFramesReceived","lastFramesDecoded","framesDecoded","lastFramesDropped","lastKeyFramesDecoded","keyFramesDecoded","lastPliCount","totalPliCount","totalPacketLoss","totalBytesReceivedInaMin","totalFrameReceivedInaMin","totalFrameDecodedInaMin","receivedFrameRate","Math","round","receivedHeight","height","receivedWidth","width","receivedFrameSize","receivedKeyFrames","getVideoSenderMqa","videoSender","lastKeyFramesEncoded","lastFramesSent","framesSent","totalFrameSentInaMin","transmittedFrameRate","transmittedHeight","transmittedWidth","transmittedFrameSize"],"sources":["mqaUtil.ts"],"sourcesContent":["/* eslint-disable no-param-reassign, prefer-destructuring */\n\nimport {mean, max} from 'lodash';\n\nimport {STATS} from '../constants';\n\nexport const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;\n const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;\n const lastPacketsDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].totalSamplesDecoded || 0;\n const lastSamplesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalSamplesReceived || 0;\n const lastConcealedSamples = lastMqaDataSent[mediaType]?.[sendrecvType].concealedSamples || 0;\n const lastBytesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesReceived || 0;\n const lastFecPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].fecPacketsReceived || 0;\n const lastFecPacketsDiscarded =\n lastMqaDataSent[mediaType]?.[sendrecvType].fecPacketsDiscarded || 0;\n\n const {csi} = statsResults[mediaType];\n if (csi && !audioReceiver.streams[0].common.csi.includes(csi)) {\n audioReceiver.streams[0].common.csi.push(csi);\n }\n\n audioReceiver.common.common.direction = statsResults[mediaType].direction;\n audioReceiver.common.transportType = statsResults.connectionType.local.transport;\n\n // add rtpPacket info inside common as also for call analyzer\n audioReceiver.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;\n // Hop by hop are numbers and not percentage so we compare on what we sent the last min\n // collect the packets received for the last min\n audioReceiver.streams[0].common.rtpPackets = audioReceiver.common.rtpPackets;\n audioReceiver.common.mediaHopByHopLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;\n audioReceiver.common.rtpHopByHopLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;\n\n audioReceiver.streams[0].common.maxRtpJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.meanRtpJitter =\n mean(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.rtpJitter = audioReceiver.streams[0].common.maxRtpJitter;\n\n // Fec packets do come in as part of the FEC only for audio\n const fecRecovered =\n statsResults[mediaType][sendrecvType].fecPacketsReceived -\n lastFecPacketsReceived -\n (statsResults[mediaType][sendrecvType].fecPacketsDiscarded - lastFecPacketsDiscarded);\n\n audioReceiver.streams[0].common.rtpEndToEndLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost - fecRecovered || 0;\n\n audioReceiver.streams[0].common.framesDropped =\n statsResults[mediaType][sendrecvType].totalSamplesDecoded - lastPacketsDecoded || 0;\n audioReceiver.streams[0].common.renderedFrameRate =\n (audioReceiver.streams[0].common.framesDropped * 100) / 60 || 0;\n\n audioReceiver.streams[0].common.framesReceived =\n statsResults[mediaType][sendrecvType].totalSamplesReceived - lastSamplesReceived || 0;\n audioReceiver.streams[0].common.concealedFrames =\n statsResults[mediaType][sendrecvType].concealedSamples - lastConcealedSamples || 0;\n audioReceiver.streams[0].common.receivedBitrate =\n ((statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived) * 8) / 60 || 0;\n\n audioReceiver.common.rtpBitrate = audioReceiver.streams[0].common.receivedBitrate;\n};\n\nexport const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.SEND_DIRECTION;\n\n const lastPacketsSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsSent || 0;\n const lastPacketsLost =\n lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLostOnReceiver || 0;\n const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;\n const lastFramesEncoded = lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;\n const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;\n\n const {csi} = statsResults[mediaType];\n if (csi && !audioSender.streams[0].common.csi.includes(csi)) {\n audioSender.streams[0].common.csi.push(csi);\n }\n\n audioSender.common.common.direction = statsResults[mediaType].direction;\n audioSender.common.transportType = statsResults.connectionType.local.transport;\n\n audioSender.common.maxRemoteJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n audioSender.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n audioSender.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;\n audioSender.streams[0].common.rtpPackets = audioSender.common.rtpPackets;\n // From candidate-pair\n audioSender.common.availableBitrate =\n statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;\n // Calculate based on how much packets lost of received compated to how to the client sent\n\n const totalpacketsLostForaMin =\n statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastPacketsLost;\n\n audioSender.common.remoteLossRate =\n totalpacketsLostForaMin > 0\n ? (totalpacketsLostForaMin * 100) / audioSender.common.rtpPackets\n : 0; // This is the packets sent with in last min || 0;\n\n audioSender.common.maxRoundTripTime =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.meanRoundTripTime =\n mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.roundTripTime = audioSender.common.maxRoundTripTime;\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;\n\n audioSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin\n ? (totalBytesSentInaMin * 8) / 60\n : 0;\n audioSender.common.rtpBitrate = audioSender.streams[0].common.transmittedBitrate;\n\n audioSender.streams[0].transmittedKeyFrames =\n statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastFramesEncoded || 0;\n audioSender.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;\n};\n\nexport const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;\n const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;\n const lastBytesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesReceived || 0;\n const lastFramesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].framesReceived || 0;\n const lastFramesDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].framesDecoded || 0;\n const lastFramesDropped = lastMqaDataSent[mediaType]?.[sendrecvType].framesDropped || 0;\n const lastKeyFramesDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].keyFramesDecoded || 0;\n const lastPliCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalPliCount || 0;\n\n const {csi} = statsResults[mediaType];\n if (csi && !videoReceiver.streams[0].common.csi.includes(csi)) {\n videoReceiver.streams[0].common.csi.push(csi);\n }\n\n videoReceiver.common.common.direction = statsResults[mediaType].direction;\n videoReceiver.common.transportType = statsResults.connectionType.local.transport;\n\n // collect the packets received for the last min\n videoReceiver.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;\n videoReceiver.streams[0].common.rtpPackets = videoReceiver.common.rtpPackets;\n\n const totalPacketLoss =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;\n\n // Hope by hop are numbers and not percentage so we compare on what we sent the last min\n // this is including packet lost\n videoReceiver.common.mediaHopByHopLost = totalPacketLoss;\n videoReceiver.common.rtpHopByHopLost = totalPacketLoss;\n\n // End to end packetloss is after recovery\n videoReceiver.streams[0].common.rtpEndToEndLost = totalPacketLoss;\n\n // calculate this values\n\n videoReceiver.common.maxRemoteJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoReceiver.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n videoReceiver.streams[0].common.rtpJitter = videoReceiver.common.maxRemoteJitter;\n\n // Calculate the outgoing bitrate\n const totalBytesReceivedInaMin =\n statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived;\n\n videoReceiver.streams[0].common.receivedBitrate = totalBytesReceivedInaMin\n ? (totalBytesReceivedInaMin * 8) / 60\n : 0;\n videoReceiver.common.rtpBitrate = videoReceiver.streams[0].common.receivedBitrate;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameReceivedInaMin =\n statsResults[mediaType][sendrecvType].framesReceived - lastFramesReceived;\n const totalFrameDecodedInaMin =\n statsResults[mediaType][sendrecvType].framesDecoded - lastFramesDecoded;\n\n videoReceiver.streams[0].common.receivedFrameRate = Math.round(\n totalFrameReceivedInaMin ? totalFrameReceivedInaMin / 60 : 0\n );\n videoReceiver.streams[0].common.renderedFrameRate = Math.round(\n totalFrameDecodedInaMin ? totalFrameDecodedInaMin / 60 : 0\n );\n\n videoReceiver.streams[0].common.framesDropped =\n statsResults[mediaType][sendrecvType].framesDropped - lastFramesDropped;\n videoReceiver.streams[0].receivedHeight = statsResults[mediaType][sendrecvType].height || 0;\n videoReceiver.streams[0].receivedWidth = statsResults[mediaType][sendrecvType].width || 0;\n videoReceiver.streams[0].receivedFrameSize =\n (videoReceiver.streams[0].receivedHeight * videoReceiver.streams[0].receivedWidth) / 256;\n\n videoReceiver.streams[0].receivedKeyFrames =\n statsResults[mediaType][sendrecvType].keyFramesDecoded - lastKeyFramesDecoded || 0;\n videoReceiver.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalPliCount - lastPliCount || 0;\n};\n\nexport const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.SEND_DIRECTION;\n\n const lastPacketsSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsSent || 0;\n const lastPacketsLost =\n lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLostOnReceiver || 0;\n const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;\n const lastKeyFramesEncoded =\n lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;\n const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;\n const lastFramesSent = lastMqaDataSent[mediaType]?.[sendrecvType].framesSent || 0;\n const {csi} = statsResults[mediaType];\n if (csi && !videoSender.streams[0].common.csi.includes(csi)) {\n videoSender.streams[0].common.csi.push(csi);\n }\n\n videoSender.common.common.direction = statsResults[mediaType].direction;\n videoSender.common.transportType = statsResults.connectionType.local.transport;\n\n // @ts-ignore\n videoSender.common.maxRemoteJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoSender.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n videoSender.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;\n videoSender.common.availableBitrate =\n statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;\n // Calculate based on how much packets lost of received compated to how to the client sent\n\n const totalpacketsLostForaMin =\n statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastPacketsLost;\n\n videoSender.common.remoteLossRate =\n totalpacketsLostForaMin > 0\n ? (totalpacketsLostForaMin * 100) / (videoSender.common.rtpPackets + totalpacketsLostForaMin)\n : 0; // This is the packets sent with in last min || 0;\n\n videoSender.common.maxRoundTripTime =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.meanRoundTripTime =\n mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.roundTripTime = videoSender.common.maxRoundTripTime;\n\n videoSender.streams[0].common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;\n\n videoSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin\n ? (totalBytesSentInaMin * 8) / 60\n : 0;\n\n videoSender.common.rtpBitrate = videoSender.streams[0].common.transmittedBitrate;\n\n videoSender.streams[0].transmittedKeyFrames =\n statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastKeyFramesEncoded || 0;\n videoSender.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameSentInaMin =\n statsResults[mediaType][sendrecvType].framesSent - (lastFramesSent || 0);\n\n videoSender.streams[0].common.transmittedFrameRate = Math.round(\n totalFrameSentInaMin ? totalFrameSentInaMin / 60 : 0\n );\n videoSender.streams[0].transmittedHeight = statsResults[mediaType][sendrecvType].height || 0;\n videoSender.streams[0].transmittedWidth = statsResults[mediaType][sendrecvType].width || 0;\n videoSender.streams[0].transmittedFrameSize =\n (videoSender.streams[0].transmittedHeight * videoSender.streams[0].transmittedWidth) / 256;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["getAudioReceiverMqa","audioReceiver","statsResults","lastMqaDataSent","mediaType","sendrecvType","STATS","RECEIVE_DIRECTION","lastPacketsReceived","totalPacketsReceived","lastPacketsLost","totalPacketsLost","lastPacketsDecoded","totalSamplesDecoded","lastSamplesReceived","totalSamplesReceived","lastConcealedSamples","concealedSamples","lastBytesReceived","totalBytesReceived","lastFecPacketsReceived","fecPacketsReceived","lastFecPacketsDiscarded","fecPacketsDiscarded","csi","streams","common","includes","push","direction","isMain","transportType","connectionType","local","transport","rtpPackets","mediaHopByHopLost","rtpHopByHopLost","maxRtpJitter","meanRtpJitter","rtpJitter","fecRecovered","rtpEndToEndLost","framesDropped","renderedFrameRate","framesReceived","concealedFrames","receivedBitrate","rtpBitrate","getAudioSenderMqa","audioSender","SEND_DIRECTION","lastPacketsSent","totalPacketsSent","totalPacketsLostOnReceiver","lastBytesSent","totalBytesSent","lastFramesEncoded","totalKeyFramesEncoded","lastFirCount","totalFirCount","maxRemoteJitter","meanRemoteJitter","availableBitrate","availableOutgoingBitrate","totalpacketsLostForaMin","remoteLossRate","maxRoundTripTime","meanRoundTripTime","roundTripTime","totalBytesSentInaMin","transmittedBitrate","transmittedKeyFrames","requestedKeyFrames","getVideoReceiverMqa","videoReceiver","lastFramesReceived","lastFramesDecoded","framesDecoded","lastFramesDropped","lastKeyFramesDecoded","keyFramesDecoded","lastPliCount","totalPliCount","totalPacketLoss","totalBytesReceivedInaMin","totalFrameReceivedInaMin","totalFrameDecodedInaMin","receivedFrameRate","Math","round","receivedHeight","height","receivedWidth","width","receivedFrameSize","receivedKeyFrames","getVideoSenderMqa","videoSender","lastKeyFramesEncoded","lastFramesSent","framesSent","totalFrameSentInaMin","transmittedFrameRate","transmittedHeight","transmittedWidth","transmittedFrameSize"],"sources":["mqaUtil.ts"],"sourcesContent":["/* eslint-disable no-param-reassign, prefer-destructuring */\n\nimport {mean, max} from 'lodash';\n\nimport {STATS} from '../constants';\n\nexport const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;\n const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;\n const lastPacketsDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].totalSamplesDecoded || 0;\n const lastSamplesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalSamplesReceived || 0;\n const lastConcealedSamples = lastMqaDataSent[mediaType]?.[sendrecvType].concealedSamples || 0;\n const lastBytesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesReceived || 0;\n const lastFecPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].fecPacketsReceived || 0;\n const lastFecPacketsDiscarded =\n lastMqaDataSent[mediaType]?.[sendrecvType].fecPacketsDiscarded || 0;\n\n const {csi} = statsResults[mediaType];\n if (csi && !audioReceiver.streams[0].common.csi.includes(csi)) {\n audioReceiver.streams[0].common.csi.push(csi);\n }\n\n audioReceiver.common.common.direction = statsResults[mediaType].direction;\n audioReceiver.common.common.isMain = !mediaType.includes('-share');\n audioReceiver.common.transportType = statsResults.connectionType.local.transport;\n\n // add rtpPacket info inside common as also for call analyzer\n audioReceiver.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;\n // Hop by hop are numbers and not percentage so we compare on what we sent the last min\n // collect the packets received for the last min\n audioReceiver.streams[0].common.rtpPackets = audioReceiver.common.rtpPackets;\n audioReceiver.common.mediaHopByHopLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;\n audioReceiver.common.rtpHopByHopLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;\n\n audioReceiver.streams[0].common.maxRtpJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.meanRtpJitter =\n mean(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.rtpJitter = audioReceiver.streams[0].common.maxRtpJitter;\n\n // Fec packets do come in as part of the FEC only for audio\n const fecRecovered =\n statsResults[mediaType][sendrecvType].fecPacketsReceived -\n lastFecPacketsReceived -\n (statsResults[mediaType][sendrecvType].fecPacketsDiscarded - lastFecPacketsDiscarded);\n\n audioReceiver.streams[0].common.rtpEndToEndLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost - fecRecovered || 0;\n\n audioReceiver.streams[0].common.framesDropped =\n statsResults[mediaType][sendrecvType].totalSamplesDecoded - lastPacketsDecoded || 0;\n audioReceiver.streams[0].common.renderedFrameRate =\n (audioReceiver.streams[0].common.framesDropped * 100) / 60 || 0;\n\n audioReceiver.streams[0].common.framesReceived =\n statsResults[mediaType][sendrecvType].totalSamplesReceived - lastSamplesReceived || 0;\n audioReceiver.streams[0].common.concealedFrames =\n statsResults[mediaType][sendrecvType].concealedSamples - lastConcealedSamples || 0;\n audioReceiver.streams[0].common.receivedBitrate =\n ((statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived) * 8) / 60 || 0;\n\n audioReceiver.common.rtpBitrate = audioReceiver.streams[0].common.receivedBitrate;\n};\n\nexport const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.SEND_DIRECTION;\n\n const lastPacketsSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsSent || 0;\n const lastPacketsLost =\n lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLostOnReceiver || 0;\n const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;\n const lastFramesEncoded = lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;\n const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;\n\n const {csi} = statsResults[mediaType];\n if (csi && !audioSender.streams[0].common.csi.includes(csi)) {\n audioSender.streams[0].common.csi.push(csi);\n }\n\n audioSender.common.common.direction = statsResults[mediaType].direction;\n audioSender.common.common.isMain = !mediaType.includes('-share');\n audioSender.common.transportType = statsResults.connectionType.local.transport;\n\n audioSender.common.maxRemoteJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n audioSender.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n audioSender.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;\n audioSender.streams[0].common.rtpPackets = audioSender.common.rtpPackets;\n // From candidate-pair\n audioSender.common.availableBitrate =\n statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;\n // Calculate based on how much packets lost of received compated to how to the client sent\n\n const totalpacketsLostForaMin =\n statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastPacketsLost;\n\n audioSender.common.remoteLossRate =\n totalpacketsLostForaMin > 0\n ? (totalpacketsLostForaMin * 100) / audioSender.common.rtpPackets\n : 0; // This is the packets sent with in last min || 0;\n\n audioSender.common.maxRoundTripTime =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.meanRoundTripTime =\n mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.roundTripTime = audioSender.common.maxRoundTripTime;\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;\n\n audioSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin\n ? (totalBytesSentInaMin * 8) / 60\n : 0;\n audioSender.common.rtpBitrate = audioSender.streams[0].common.transmittedBitrate;\n\n audioSender.streams[0].transmittedKeyFrames =\n statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastFramesEncoded || 0;\n audioSender.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;\n};\n\nexport const getVideoReceiverMqa = ({videoReceiver, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n const lastPacketsReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsReceived || 0;\n const lastPacketsLost = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLost || 0;\n const lastBytesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesReceived || 0;\n const lastFramesReceived = lastMqaDataSent[mediaType]?.[sendrecvType].framesReceived || 0;\n const lastFramesDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].framesDecoded || 0;\n const lastFramesDropped = lastMqaDataSent[mediaType]?.[sendrecvType].framesDropped || 0;\n const lastKeyFramesDecoded = lastMqaDataSent[mediaType]?.[sendrecvType].keyFramesDecoded || 0;\n const lastPliCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalPliCount || 0;\n\n const {csi} = statsResults[mediaType];\n if (csi && !videoReceiver.streams[0].common.csi.includes(csi)) {\n videoReceiver.streams[0].common.csi.push(csi);\n }\n\n videoReceiver.common.common.direction = statsResults[mediaType].direction;\n videoReceiver.common.common.isMain = !mediaType.includes('-share');\n videoReceiver.common.transportType = statsResults.connectionType.local.transport;\n\n // collect the packets received for the last min\n videoReceiver.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsReceived - lastPacketsReceived || 0;\n videoReceiver.streams[0].common.rtpPackets = videoReceiver.common.rtpPackets;\n\n const totalPacketLoss =\n statsResults[mediaType][sendrecvType].totalPacketsLost - lastPacketsLost || 0;\n\n // Hope by hop are numbers and not percentage so we compare on what we sent the last min\n // this is including packet lost\n videoReceiver.common.mediaHopByHopLost = totalPacketLoss;\n videoReceiver.common.rtpHopByHopLost = totalPacketLoss;\n\n // End to end packetloss is after recovery\n videoReceiver.streams[0].common.rtpEndToEndLost = totalPacketLoss;\n\n // calculate this values\n\n videoReceiver.common.maxRemoteJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoReceiver.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n videoReceiver.streams[0].common.rtpJitter = videoReceiver.common.maxRemoteJitter;\n\n // Calculate the outgoing bitrate\n const totalBytesReceivedInaMin =\n statsResults[mediaType][sendrecvType].totalBytesReceived - lastBytesReceived;\n\n videoReceiver.streams[0].common.receivedBitrate = totalBytesReceivedInaMin\n ? (totalBytesReceivedInaMin * 8) / 60\n : 0;\n videoReceiver.common.rtpBitrate = videoReceiver.streams[0].common.receivedBitrate;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameReceivedInaMin =\n statsResults[mediaType][sendrecvType].framesReceived - lastFramesReceived;\n const totalFrameDecodedInaMin =\n statsResults[mediaType][sendrecvType].framesDecoded - lastFramesDecoded;\n\n videoReceiver.streams[0].common.receivedFrameRate = Math.round(\n totalFrameReceivedInaMin ? totalFrameReceivedInaMin / 60 : 0\n );\n videoReceiver.streams[0].common.renderedFrameRate = Math.round(\n totalFrameDecodedInaMin ? totalFrameDecodedInaMin / 60 : 0\n );\n\n videoReceiver.streams[0].common.framesDropped =\n statsResults[mediaType][sendrecvType].framesDropped - lastFramesDropped;\n videoReceiver.streams[0].receivedHeight = statsResults[mediaType][sendrecvType].height || 0;\n videoReceiver.streams[0].receivedWidth = statsResults[mediaType][sendrecvType].width || 0;\n videoReceiver.streams[0].receivedFrameSize =\n (videoReceiver.streams[0].receivedHeight * videoReceiver.streams[0].receivedWidth) / 256;\n\n videoReceiver.streams[0].receivedKeyFrames =\n statsResults[mediaType][sendrecvType].keyFramesDecoded - lastKeyFramesDecoded || 0;\n videoReceiver.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalPliCount - lastPliCount || 0;\n};\n\nexport const getVideoSenderMqa = ({videoSender, statsResults, lastMqaDataSent, mediaType}) => {\n const sendrecvType = STATS.SEND_DIRECTION;\n\n const lastPacketsSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsSent || 0;\n const lastPacketsLost =\n lastMqaDataSent[mediaType]?.[sendrecvType].totalPacketsLostOnReceiver || 0;\n const lastBytesSent = lastMqaDataSent[mediaType]?.[sendrecvType].totalBytesSent || 0;\n const lastKeyFramesEncoded =\n lastMqaDataSent[mediaType]?.[sendrecvType].totalKeyFramesEncoded || 0;\n const lastFirCount = lastMqaDataSent[mediaType]?.[sendrecvType].totalFirCount || 0;\n const lastFramesSent = lastMqaDataSent[mediaType]?.[sendrecvType].framesSent || 0;\n const {csi} = statsResults[mediaType];\n if (csi && !videoSender.streams[0].common.csi.includes(csi)) {\n videoSender.streams[0].common.csi.push(csi);\n }\n\n videoSender.common.common.direction = statsResults[mediaType].direction;\n videoSender.common.common.isMain = !mediaType.includes('-share');\n videoSender.common.transportType = statsResults.connectionType.local.transport;\n\n // @ts-ignore\n videoSender.common.maxRemoteJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoSender.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n videoSender.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;\n videoSender.common.availableBitrate =\n statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;\n // Calculate based on how much packets lost of received compated to how to the client sent\n\n const totalpacketsLostForaMin =\n statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver - lastPacketsLost;\n\n videoSender.common.remoteLossRate =\n totalpacketsLostForaMin > 0\n ? (totalpacketsLostForaMin * 100) / (videoSender.common.rtpPackets + totalpacketsLostForaMin)\n : 0; // This is the packets sent with in last min || 0;\n\n videoSender.common.maxRoundTripTime =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.meanRoundTripTime =\n mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.roundTripTime = videoSender.common.maxRoundTripTime;\n\n videoSender.streams[0].common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent - lastPacketsSent || 0;\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin = statsResults[mediaType][sendrecvType].totalBytesSent - lastBytesSent;\n\n videoSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin\n ? (totalBytesSentInaMin * 8) / 60\n : 0;\n\n videoSender.common.rtpBitrate = videoSender.streams[0].common.transmittedBitrate;\n\n videoSender.streams[0].transmittedKeyFrames =\n statsResults[mediaType][sendrecvType].totalKeyFramesEncoded - lastKeyFramesEncoded || 0;\n videoSender.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalFirCount - lastFirCount || 0;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameSentInaMin =\n statsResults[mediaType][sendrecvType].framesSent - (lastFramesSent || 0);\n\n videoSender.streams[0].common.transmittedFrameRate = Math.round(\n totalFrameSentInaMin ? totalFrameSentInaMin / 60 : 0\n );\n videoSender.streams[0].transmittedHeight = statsResults[mediaType][sendrecvType].height || 0;\n videoSender.streams[0].transmittedWidth = statsResults[mediaType][sendrecvType].width || 0;\n videoSender.streams[0].transmittedFrameSize =\n (videoSender.streams[0].transmittedHeight * videoSender.streams[0].transmittedWidth) / 256;\n};\n"],"mappings":"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"}
|
package/dist/types/config.d.ts
CHANGED
|
@@ -239,17 +239,7 @@ export default class Meetings extends WebexPlugin {
|
|
|
239
239
|
* @public
|
|
240
240
|
* @memberof Meetings
|
|
241
241
|
*/
|
|
242
|
-
startReachability(): Promise<
|
|
243
|
-
[x: string]: {
|
|
244
|
-
udp: import("../reachability").TransportResult;
|
|
245
|
-
tcp: import("../reachability").TransportResult;
|
|
246
|
-
xtls: {
|
|
247
|
-
untested: "true";
|
|
248
|
-
};
|
|
249
|
-
} & {
|
|
250
|
-
isVideoMesh?: boolean;
|
|
251
|
-
};
|
|
252
|
-
}>;
|
|
242
|
+
startReachability(): Promise<import("../reachability").ReachabilityResults>;
|
|
253
243
|
/**
|
|
254
244
|
* Get geoHint for info for meetings
|
|
255
245
|
* @returns {Promise}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { ClusterNode } from './request';
|
|
2
|
+
export type TransportResult = {
|
|
3
|
+
result: 'reachable' | 'unreachable' | 'untested';
|
|
4
|
+
latencyInMilliseconds?: number;
|
|
5
|
+
clientMediaIPs?: string[];
|
|
6
|
+
};
|
|
7
|
+
export type ClusterReachabilityResult = {
|
|
8
|
+
udp: TransportResult;
|
|
9
|
+
tcp: TransportResult;
|
|
10
|
+
xtls: TransportResult;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* A class that handles reachability checks for a single cluster.
|
|
14
|
+
*/
|
|
15
|
+
export declare class ClusterReachability {
|
|
16
|
+
private numUdpUrls;
|
|
17
|
+
private numTcpUrls;
|
|
18
|
+
private result;
|
|
19
|
+
private pc?;
|
|
20
|
+
private defer;
|
|
21
|
+
private startTimestamp;
|
|
22
|
+
readonly isVideoMesh: boolean;
|
|
23
|
+
readonly name: any;
|
|
24
|
+
/**
|
|
25
|
+
* Constructor for ClusterReachability
|
|
26
|
+
* @param {string} name cluster name
|
|
27
|
+
* @param {ClusterNode} clusterInfo information about the media cluster
|
|
28
|
+
*/
|
|
29
|
+
constructor(name: string, clusterInfo: ClusterNode);
|
|
30
|
+
/**
|
|
31
|
+
* Gets total elapsed time, can be called only after start() is called
|
|
32
|
+
* @returns {Number} Milliseconds
|
|
33
|
+
*/
|
|
34
|
+
private getElapsedTime;
|
|
35
|
+
/**
|
|
36
|
+
* Generate peerConnection config settings
|
|
37
|
+
* @param {ClusterNode} cluster
|
|
38
|
+
* @returns {RTCConfiguration} peerConnectionConfig
|
|
39
|
+
*/
|
|
40
|
+
private buildPeerConnectionConfig;
|
|
41
|
+
/**
|
|
42
|
+
* Creates an RTCPeerConnection
|
|
43
|
+
* @param {ClusterNode} clusterInfo information about the media cluster
|
|
44
|
+
* @returns {RTCPeerConnection} peerConnection
|
|
45
|
+
*/
|
|
46
|
+
private createPeerConnection;
|
|
47
|
+
/**
|
|
48
|
+
* @returns {ClusterReachabilityResult} reachability result for this cluster
|
|
49
|
+
*/
|
|
50
|
+
getResult(): ClusterReachabilityResult;
|
|
51
|
+
/**
|
|
52
|
+
* Closes the peerConnection
|
|
53
|
+
*
|
|
54
|
+
* @returns {void}
|
|
55
|
+
*/
|
|
56
|
+
private closePeerConnection;
|
|
57
|
+
/**
|
|
58
|
+
* Resolves the defer, indicating that reachability checks for this cluster are completed
|
|
59
|
+
*
|
|
60
|
+
* @returns {void}
|
|
61
|
+
*/
|
|
62
|
+
private finishReachabilityCheck;
|
|
63
|
+
/**
|
|
64
|
+
* Adds public IP (client media IPs)
|
|
65
|
+
* @param {string} protocol
|
|
66
|
+
* @param {string} publicIP
|
|
67
|
+
* @returns {void}
|
|
68
|
+
*/
|
|
69
|
+
private addPublicIP;
|
|
70
|
+
/**
|
|
71
|
+
* Registers a listener for the iceGatheringStateChange event
|
|
72
|
+
*
|
|
73
|
+
* @returns {void}
|
|
74
|
+
*/
|
|
75
|
+
private registerIceGatheringStateChangeListener;
|
|
76
|
+
/**
|
|
77
|
+
* Checks if we have the results for all the protocols (UDP and TCP)
|
|
78
|
+
*
|
|
79
|
+
* @returns {boolean} true if we have all results, false otherwise
|
|
80
|
+
*/
|
|
81
|
+
private haveWeGotAllResults;
|
|
82
|
+
/**
|
|
83
|
+
* Stores the latency in the result for the given protocol and marks it as reachable
|
|
84
|
+
*
|
|
85
|
+
* @param {string} protocol
|
|
86
|
+
* @param {number} latency
|
|
87
|
+
* @returns {void}
|
|
88
|
+
*/
|
|
89
|
+
private storeLatencyResult;
|
|
90
|
+
/**
|
|
91
|
+
* Registers a listener for the icecandidate event
|
|
92
|
+
*
|
|
93
|
+
* @returns {void}
|
|
94
|
+
*/
|
|
95
|
+
private registerIceCandidateListener;
|
|
96
|
+
/**
|
|
97
|
+
* Starts the process of doing UDP and TCP reachability checks on the media cluster.
|
|
98
|
+
* XTLS reachability checking is not supported.
|
|
99
|
+
*
|
|
100
|
+
* @returns {Promise}
|
|
101
|
+
*/
|
|
102
|
+
start(): Promise<ClusterReachabilityResult>;
|
|
103
|
+
/**
|
|
104
|
+
* Starts the process of gathering ICE candidates
|
|
105
|
+
*
|
|
106
|
+
* @returns {Promise} promise that's resolved once reachability checks for this cluster are completed or timeout is reached
|
|
107
|
+
*/
|
|
108
|
+
private gatherIceCandidates;
|
|
109
|
+
}
|