@webex/plugin-meetings 3.4.0-next.6 → 3.4.0-next.8

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.
@@ -209,7 +209,7 @@ var Breakout = _webexCore.WebexPlugin.extend({
209
209
  sessionId: this.sessionId
210
210
  });
211
211
  },
212
- version: "3.4.0-next.6"
212
+ version: "3.4.0-next.8"
213
213
  });
214
214
  var _default = exports.default = Breakout;
215
215
  //# sourceMappingURL=breakout.js.map
@@ -1046,7 +1046,7 @@ var Breakouts = _webexCore.WebexPlugin.extend({
1046
1046
  this.trigger(_constants.BREAKOUTS.EVENTS.ASK_RETURN_TO_MAIN);
1047
1047
  }
1048
1048
  },
1049
- version: "3.4.0-next.6"
1049
+ version: "3.4.0-next.8"
1050
1050
  });
1051
1051
  var _default = exports.default = Breakouts;
1052
1052
  //# sourceMappingURL=index.js.map
@@ -373,7 +373,7 @@ var SimultaneousInterpretation = _webexCore.WebexPlugin.extend({
373
373
  throw error;
374
374
  });
375
375
  },
376
- version: "3.4.0-next.6"
376
+ version: "3.4.0-next.8"
377
377
  });
378
378
  var _default = exports.default = SimultaneousInterpretation;
379
379
  //# sourceMappingURL=index.js.map
@@ -18,7 +18,7 @@ var SILanguage = _webexCore.WebexPlugin.extend({
18
18
  languageCode: 'number',
19
19
  languageName: 'string'
20
20
  },
21
- version: "3.4.0-next.6"
21
+ version: "3.4.0-next.8"
22
22
  });
23
23
  var _default = exports.default = SILanguage;
24
24
  //# sourceMappingURL=siLanguage.js.map
@@ -183,32 +183,36 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
183
183
  while (1) switch (_context2.prev = _context2.next) {
184
184
  case 0:
185
185
  _context2.prev = 0;
186
- _context2.next = 3;
186
+ // kick off ip version detection. For now we don't await it, as we're doing it
187
+ // to gather the timings and send them with our reachability metrics
188
+ // @ts-ignore
189
+ this.webex.internal.device.ipNetworkDetector.detect();
190
+ _context2.next = 4;
187
191
  return this.getClusters();
188
- case 3:
192
+ case 4:
189
193
  _yield$this$getCluste = _context2.sent;
190
194
  clusters = _yield$this$getCluste.clusters;
191
195
  joinCookie = _yield$this$getCluste.joinCookie;
192
- _context2.next = 8;
196
+ _context2.next = 9;
193
197
  return this.webex.boundedStorage.put(this.namespace, _constants.REACHABILITY.localStorageJoinCookie, (0, _stringify.default)(joinCookie));
194
- case 8:
198
+ case 9:
195
199
  this.reachabilityDefer = new _common.Defer();
196
200
 
197
201
  // Perform Reachability Check
198
- _context2.next = 11;
202
+ _context2.next = 12;
199
203
  return this.performReachabilityChecks(clusters);
200
- case 11:
204
+ case 12:
201
205
  return _context2.abrupt("return", this.reachabilityDefer.promise);
202
- case 14:
203
- _context2.prev = 14;
206
+ case 15:
207
+ _context2.prev = 15;
204
208
  _context2.t0 = _context2["catch"](0);
205
209
  _loggerProxy.default.logger.error("Reachability:index#gatherReachability --> Error:", _context2.t0);
206
210
  return _context2.abrupt("return", {});
207
- case 18:
211
+ case 19:
208
212
  case "end":
209
213
  return _context2.stop();
210
214
  }
211
- }, _callee2, this, [[0, 14]]);
215
+ }, _callee2, this, [[0, 15]]);
212
216
  }));
213
217
  function gatherReachability() {
214
218
  return _gatherReachability.apply(this, arguments);
@@ -663,6 +667,16 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
663
667
  udp: this.getStatistics(results, 'udp', false),
664
668
  tcp: this.getStatistics(results, 'tcp', false),
665
669
  xtls: this.getStatistics(results, 'xtls', false)
670
+ },
671
+ ipver: {
672
+ // @ts-ignore
673
+ firstIpV4: this.webex.internal.device.ipNetworkDetector.firstIpV4,
674
+ // @ts-ignore
675
+ firstIpV6: this.webex.internal.device.ipNetworkDetector.firstIpV6,
676
+ // @ts-ignore
677
+ firstMdns: this.webex.internal.device.ipNetworkDetector.firstMdns,
678
+ // @ts-ignore
679
+ totalTime: this.webex.internal.device.ipNetworkDetector.totalTime
666
680
  }
667
681
  };
668
682
  _metrics.default.sendBehavioralMetric(_constants2.default.REACHABILITY_COMPLETED, _metrics.default.prepareMetricFields(stats));
@@ -1 +1 @@
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","_getClusters","_asyncToGenerator2","_regenerator","mark","_callee","isRetry","_yield$this$reachabil","clusters","joinCookie","_args","wrap","_callee$","_context","prev","next","undefined","getClusters","MeetingUtil","getIpVersion","sent","abrupt","t0","LoggerProxy","logger","error","concat","stop","_gatherReachability","_callee2","_yield$this$getCluste","_callee2$","_context2","boundedStorage","put","localStorageJoinCookie","_stringify","reachabilityDefer","Defer","performReachabilityChecks","promise","gatherReachability","_getReachabilityMetrics","_callee3","stats","updateStats","resultsJson","results","_callee3$","_context3","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","get","localStorageResult","JSON","parse","_values","isVideoMesh","warn","getReachabilityMetrics","mapTransportResultToBackendDataFormat","transportResult","output","_i","_Object$entries","_entries","_Object$entries$_i","_slicedToArray2","reachable","untested","latencyInMilliseconds","toString","_getReachabilityResults","_callee4","_this2","allClusterResults","_callee4$","_context4","mapValues","clusterResult","getReachabilityResults","_isAnyPublicClusterReachable","_callee5","reachabilityData","reachabilityResults","_callee5$","_context5","catch","some","_result$udp","_result$tcp","isAnyPublicClusterReachable","_isWebexMediaBackendUnreachable","_callee6","unreachable","protocols","_callee6$","_context6","tested","_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","_callee7","_callee7$","_context7","vmn","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","REACHABILITY_COMPLETED","prepareMetricFields","sendMetric","startTimers","_this3","setTimeout","overallTimer","emit","file","function","_storeResults","_callee8","_callee8$","_context8","storeResults","_x","resetResultCounters","_performReachabilityChecks","_callee11","clusterList","_this4","isFirstResult","_callee11$","_context11","config","meetings","experimental","enableTcpReachability","enableTlsReachability","cluster","includeTcpReachability","includeTlsReachability","ClusterReachability","on","Events","resultReady","_ref4","_callee9","data","clientMediaIPs","_callee9$","_context9","_x3","clientMediaIpsUpdated","_ref5","_callee10","_callee10$","_context10","_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 * Fetches the list of media clusters from the backend\n * @param {boolean} isRetry\n * @private\n * @returns {Promise<{clusters: ClusterList, joinCookie: any}>}\n */\n async getClusters(isRetry = false): Promise<{clusters: ClusterList; joinCookie: any}> {\n try {\n const {clusters, joinCookie} = await this.reachabilityRequest.getClusters(\n MeetingUtil.getIpVersion(this.webex)\n );\n\n return {clusters, joinCookie};\n } catch (error) {\n if (isRetry) {\n throw error;\n }\n\n LoggerProxy.logger.error(\n `Reachability:index#getClusters --> Failed with error: ${error}, retrying...`\n );\n\n return this.getClusters(true);\n }\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.getClusters();\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(\n BEHAVIORAL_METRICS.REACHABILITY_COMPLETED,\n Metrics.prepareMetricFields(stats)\n );\n }\n\n /**\n * Starts all the timers used for various timeouts\n *\n * @returns {void}\n */\n private startTimers() {\n this.vmnTimer = setTimeout(() => {\n this.vmnTimer = undefined;\n // if we are only missing VMN results, then we don't want to wait for them any longer\n // as they are likely to fail if users are not on corporate network\n if (this.areAllPublicClusterResultsReady()) {\n LoggerProxy.logger.log(\n 'Reachability:index#startTimers --> Reachability checks timed out (VMN timeout)'\n );\n\n this.resolveReachabilityPromise();\n }\n }, VIDEO_MESH_TIMEOUT * 1000);\n\n this.publicCloudTimer = setTimeout(() => {\n this.publicCloudTimer = undefined;\n\n LoggerProxy.logger.log(\n `Reachability:index#startTimers --> Reachability checks timed out (${DEFAULT_TIMEOUT}s)`\n );\n\n // 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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"}
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","_getClusters","_asyncToGenerator2","_regenerator","mark","_callee","isRetry","_yield$this$reachabil","clusters","joinCookie","_args","wrap","_callee$","_context","prev","next","undefined","getClusters","MeetingUtil","getIpVersion","sent","abrupt","t0","LoggerProxy","logger","error","concat","stop","_gatherReachability","_callee2","_yield$this$getCluste","_callee2$","_context2","internal","device","ipNetworkDetector","detect","boundedStorage","put","localStorageJoinCookie","_stringify","reachabilityDefer","Defer","performReachabilityChecks","promise","gatherReachability","_getReachabilityMetrics","_callee3","stats","updateStats","resultsJson","results","_callee3$","_context3","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","get","localStorageResult","JSON","parse","_values","isVideoMesh","warn","getReachabilityMetrics","mapTransportResultToBackendDataFormat","transportResult","output","_i","_Object$entries","_entries","_Object$entries$_i","_slicedToArray2","reachable","untested","latencyInMilliseconds","toString","_getReachabilityResults","_callee4","_this2","allClusterResults","_callee4$","_context4","mapValues","clusterResult","getReachabilityResults","_isAnyPublicClusterReachable","_callee5","reachabilityData","reachabilityResults","_callee5$","_context5","catch","some","_result$udp","_result$tcp","isAnyPublicClusterReachable","_isWebexMediaBackendUnreachable","_callee6","unreachable","protocols","_callee6$","_context6","tested","_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","_callee7","_callee7$","_context7","vmn","ipver","firstIpV4","firstIpV6","firstMdns","totalTime","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","REACHABILITY_COMPLETED","prepareMetricFields","sendMetric","startTimers","_this3","setTimeout","overallTimer","emit","file","function","_storeResults","_callee8","_callee8$","_context8","storeResults","_x","resetResultCounters","_performReachabilityChecks","_callee11","clusterList","_this4","isFirstResult","_callee11$","_context11","config","meetings","experimental","enableTcpReachability","enableTlsReachability","cluster","includeTcpReachability","includeTlsReachability","ClusterReachability","on","Events","resultReady","_ref4","_callee9","data","clientMediaIPs","_callee9$","_context9","_x3","clientMediaIpsUpdated","_ref5","_callee10","_callee10$","_context10","_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 * Fetches the list of media clusters from the backend\n * @param {boolean} isRetry\n * @private\n * @returns {Promise<{clusters: ClusterList, joinCookie: any}>}\n */\n async getClusters(isRetry = false): Promise<{clusters: ClusterList; joinCookie: any}> {\n try {\n const {clusters, joinCookie} = await this.reachabilityRequest.getClusters(\n MeetingUtil.getIpVersion(this.webex)\n );\n\n return {clusters, joinCookie};\n } catch (error) {\n if (isRetry) {\n throw error;\n }\n\n LoggerProxy.logger.error(\n `Reachability:index#getClusters --> Failed with error: ${error}, retrying...`\n );\n\n return this.getClusters(true);\n }\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 // kick off ip version detection. For now we don't await it, as we're doing it\n // to gather the timings and send them with our reachability metrics\n // @ts-ignore\n this.webex.internal.device.ipNetworkDetector.detect();\n\n const {clusters, joinCookie} = await this.getClusters();\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 ipver: {\n // @ts-ignore\n firstIpV4: this.webex.internal.device.ipNetworkDetector.firstIpV4,\n // @ts-ignore\n firstIpV6: this.webex.internal.device.ipNetworkDetector.firstIpV6,\n // @ts-ignore\n firstMdns: this.webex.internal.device.ipNetworkDetector.firstMdns,\n // @ts-ignore\n totalTime: this.webex.internal.device.ipNetworkDetector.totalTime,\n },\n };\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.REACHABILITY_COMPLETED,\n Metrics.prepareMetricFields(stats)\n );\n }\n\n /**\n * Starts all the timers used for various timeouts\n *\n * @returns {void}\n */\n private startTimers() {\n this.vmnTimer = setTimeout(() => {\n this.vmnTimer = undefined;\n // if we are only missing VMN results, then we don't want to wait for them any longer\n // as they are likely to fail if users are not on corporate network\n if (this.areAllPublicClusterResultsReady()) {\n LoggerProxy.logger.log(\n 'Reachability:index#startTimers --> Reachability checks timed out (VMN timeout)'\n );\n\n this.resolveReachabilityPromise();\n }\n }, VIDEO_MESH_TIMEOUT * 1000);\n\n this.publicCloudTimer = setTimeout(() => {\n this.publicCloudTimer = undefined;\n\n LoggerProxy.logger.log(\n `Reachability:index#startTimers --> Reachability checks timed out (${DEFAULT_TIMEOUT}s)`\n );\n\n // 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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"}
@@ -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.4.0-next.6"
65
+ version: "3.4.0-next.8"
66
66
  });
67
67
  var _default = exports.default = Webinar;
68
68
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -43,13 +43,13 @@
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.4.0-next.6",
47
- "@webex/plugin-rooms": "3.4.0-next.1",
48
- "@webex/test-helper-chai": "3.4.0-next.1",
49
- "@webex/test-helper-mocha": "3.4.0-next.1",
50
- "@webex/test-helper-mock-webex": "3.4.0-next.1",
51
- "@webex/test-helper-retry": "3.4.0-next.1",
52
- "@webex/test-helper-test-users": "3.4.0-next.1",
46
+ "@webex/plugin-meetings": "3.4.0-next.8",
47
+ "@webex/plugin-rooms": "3.4.0-next.2",
48
+ "@webex/test-helper-chai": "3.4.0-next.2",
49
+ "@webex/test-helper-mocha": "3.4.0-next.2",
50
+ "@webex/test-helper-mock-webex": "3.4.0-next.2",
51
+ "@webex/test-helper-retry": "3.4.0-next.2",
52
+ "@webex/test-helper-test-users": "3.4.0-next.2",
53
53
  "chai": "^4.3.4",
54
54
  "chai-as-promised": "^7.1.1",
55
55
  "eslint": "^8.24.0",
@@ -61,21 +61,21 @@
61
61
  "typescript": "^4.7.4"
62
62
  },
63
63
  "dependencies": {
64
- "@webex/common": "3.4.0-next.1",
64
+ "@webex/common": "3.4.0-next.2",
65
65
  "@webex/internal-media-core": "2.10.2",
66
- "@webex/internal-plugin-conversation": "3.4.0-next.1",
67
- "@webex/internal-plugin-device": "3.4.0-next.1",
68
- "@webex/internal-plugin-llm": "3.4.0-next.1",
69
- "@webex/internal-plugin-mercury": "3.4.0-next.1",
70
- "@webex/internal-plugin-metrics": "3.4.0-next.1",
71
- "@webex/internal-plugin-support": "3.4.0-next.1",
72
- "@webex/internal-plugin-user": "3.4.0-next.1",
73
- "@webex/internal-plugin-voicea": "3.4.0-next.6",
74
- "@webex/media-helpers": "3.4.0-next.2",
75
- "@webex/plugin-people": "3.4.0-next.1",
76
- "@webex/plugin-rooms": "3.4.0-next.1",
66
+ "@webex/internal-plugin-conversation": "3.4.0-next.2",
67
+ "@webex/internal-plugin-device": "3.4.0-next.2",
68
+ "@webex/internal-plugin-llm": "3.4.0-next.2",
69
+ "@webex/internal-plugin-mercury": "3.4.0-next.2",
70
+ "@webex/internal-plugin-metrics": "3.4.0-next.2",
71
+ "@webex/internal-plugin-support": "3.4.0-next.2",
72
+ "@webex/internal-plugin-user": "3.4.0-next.2",
73
+ "@webex/internal-plugin-voicea": "3.4.0-next.8",
74
+ "@webex/media-helpers": "3.4.0-next.3",
75
+ "@webex/plugin-people": "3.4.0-next.2",
76
+ "@webex/plugin-rooms": "3.4.0-next.2",
77
77
  "@webex/web-capabilities": "^1.4.0",
78
- "@webex/webex-core": "3.4.0-next.1",
78
+ "@webex/webex-core": "3.4.0-next.2",
79
79
  "ampersand-collection": "^2.0.2",
80
80
  "bowser": "^2.11.0",
81
81
  "btoa": "^1.2.1",
@@ -91,5 +91,5 @@
91
91
  "//": [
92
92
  "TODO: upgrade jwt-decode when moving to node 18"
93
93
  ],
94
- "version": "3.4.0-next.6"
94
+ "version": "3.4.0-next.8"
95
95
  }
@@ -149,6 +149,11 @@ export default class Reachability extends EventsScope {
149
149
  public async gatherReachability(): Promise<ReachabilityResults> {
150
150
  // Fetch clusters and measure latency
151
151
  try {
152
+ // kick off ip version detection. For now we don't await it, as we're doing it
153
+ // to gather the timings and send them with our reachability metrics
154
+ // @ts-ignore
155
+ this.webex.internal.device.ipNetworkDetector.detect();
156
+
152
157
  const {clusters, joinCookie} = await this.getClusters();
153
158
 
154
159
  // @ts-ignore
@@ -537,6 +542,16 @@ export default class Reachability extends EventsScope {
537
542
  tcp: this.getStatistics(results, 'tcp', false),
538
543
  xtls: this.getStatistics(results, 'xtls', false),
539
544
  },
545
+ ipver: {
546
+ // @ts-ignore
547
+ firstIpV4: this.webex.internal.device.ipNetworkDetector.firstIpV4,
548
+ // @ts-ignore
549
+ firstIpV6: this.webex.internal.device.ipNetworkDetector.firstIpV6,
550
+ // @ts-ignore
551
+ firstMdns: this.webex.internal.device.ipNetworkDetector.firstMdns,
552
+ // @ts-ignore
553
+ totalTime: this.webex.internal.device.ipNetworkDetector.totalTime,
554
+ },
540
555
  };
541
556
  Metrics.sendBehavioralMetric(
542
557
  BEHAVIORAL_METRICS.REACHABILITY_COMPLETED,
@@ -485,6 +485,16 @@ describe('gatherReachability', () => {
485
485
  JSON.stringify({old: 'joinCookie'})
486
486
  );
487
487
 
488
+ webex.internal.device.ipNetworkDetector = {
489
+ supportsIpV4: false,
490
+ supportsIpV6: false,
491
+ firstIpV4: -1,
492
+ firstIpV6: -1,
493
+ firstMdns: -1,
494
+ totalTime: -1,
495
+ detect: sinon.stub().resolves(),
496
+ };
497
+
488
498
  clock = sinon.useFakeTimers();
489
499
 
490
500
  mockClusterReachabilityInstances = {};
@@ -1034,6 +1044,15 @@ describe('gatherReachability', () => {
1034
1044
  enableTlsReachability: true,
1035
1045
  };
1036
1046
 
1047
+ // the metrics related to ipver are not tested in these tests and are all the same, so setting them up here
1048
+ const expectedMetricsFull = {
1049
+ ...expectedMetrics,
1050
+ ipver_firstIpV4: -1,
1051
+ ipver_firstIpV6: -1,
1052
+ ipver_firstMdns: -1,
1053
+ ipver_totalTime: -1,
1054
+ };
1055
+
1037
1056
  const receivedEvents = {
1038
1057
  done: 0,
1039
1058
  firstResultAvailable: {
@@ -1118,11 +1137,89 @@ describe('gatherReachability', () => {
1118
1137
  assert.calledWith(
1119
1138
  Metrics.sendBehavioralMetric,
1120
1139
  'js_sdk_reachability_completed',
1121
- expectedMetrics
1140
+ expectedMetricsFull
1122
1141
  );
1123
1142
  })
1124
1143
  );
1125
1144
 
1145
+ it(`starts ip network version detection and includes the results in the metrics`, async () => {
1146
+ webex.config.meetings.experimental = {
1147
+ enableTcpReachability: true,
1148
+ enableTlsReachability: true,
1149
+ };
1150
+ webex.internal.device.ipNetworkDetector = {
1151
+ supportsIpV4: true,
1152
+ supportsIpV6: true,
1153
+ firstIpV4: 10,
1154
+ firstIpV6: 20,
1155
+ firstMdns: 30,
1156
+ totalTime: 40,
1157
+ detect: sinon.stub().resolves(),
1158
+ };
1159
+
1160
+ const receivedEvents = {
1161
+ done: 0,
1162
+ };
1163
+
1164
+ const reachability = new Reachability(webex);
1165
+
1166
+ reachability.on('reachability:done', () => {
1167
+ receivedEvents.done += 1;
1168
+ });
1169
+
1170
+ // simulate having just 1 cluster, we don't need more for this test
1171
+ reachability.reachabilityRequest.getClusters = sinon.stub().returns({
1172
+ clusters: {
1173
+ publicCluster: {
1174
+ udp: ['udp-url'],
1175
+ tcp: [],
1176
+ xtls: [],
1177
+ isVideoMesh: false,
1178
+ },
1179
+ },
1180
+ joinCookie: {id: 'id'},
1181
+ });
1182
+
1183
+ const resultPromise = reachability.gatherReachability();
1184
+
1185
+ await testUtils.flushPromises();
1186
+
1187
+ // trigger mock result events from ClusterReachability instance
1188
+ mockClusterReachabilityInstances['publicCluster'].emitFakeResult('udp', {
1189
+ result: 'reachable',
1190
+ clientMediaIPs: ['1.2.3.4'],
1191
+ latencyInMilliseconds: 100,
1192
+ });
1193
+
1194
+ await resultPromise;
1195
+
1196
+ // check events emitted by Reachability class
1197
+ assert.equal(receivedEvents['done'], 1);
1198
+
1199
+ // and that ip network detection was started
1200
+ assert.calledOnceWithExactly(webex.internal.device.ipNetworkDetector.detect);
1201
+
1202
+ // finally, check the metrics - they should contain values from ipNetworkDetector
1203
+ assert.calledWith(Metrics.sendBehavioralMetric, 'js_sdk_reachability_completed', {
1204
+ vmn_udp_min: -1,
1205
+ vmn_udp_max: -1,
1206
+ vmn_udp_average: -1,
1207
+ public_udp_min: 100,
1208
+ public_udp_max: 100,
1209
+ public_udp_average: 100,
1210
+ public_tcp_min: -1,
1211
+ public_tcp_max: -1,
1212
+ public_tcp_average: -1,
1213
+ public_xtls_min: -1,
1214
+ public_xtls_max: -1,
1215
+ public_xtls_average: -1,
1216
+ ipver_firstIpV4: webex.internal.device.ipNetworkDetector.firstIpV4,
1217
+ ipver_firstIpV6: webex.internal.device.ipNetworkDetector.firstIpV6,
1218
+ ipver_firstMdns: webex.internal.device.ipNetworkDetector.firstMdns,
1219
+ ipver_totalTime: webex.internal.device.ipNetworkDetector.totalTime,
1220
+ });
1221
+ });
1222
+
1126
1223
  it('keeps updating reachability results after the 3s public cloud timeout expires', async () => {
1127
1224
  webex.config.meetings.experimental = {
1128
1225
  enableTcpReachability: true,