@webex/plugin-meetings 3.7.0-next.58 → 3.7.0-next.59

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.
@@ -369,13 +369,35 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
369
369
  }
370
370
  return gatherReachabilityFallback;
371
371
  }()
372
+ /**
373
+ * Stops all reachability checks that are in progress
374
+ * @public
375
+ * @memberof Reachability
376
+ * @returns {void}
377
+ */
378
+ )
379
+ }, {
380
+ key: "stopReachability",
381
+ value: function stopReachability() {
382
+ // overallTimer is always there only if there is reachability in progress
383
+ if (this.overallTimer) {
384
+ _loggerProxy.default.logger.log('Reachability:index#stopReachability --> stopping reachability checks');
385
+ this.abortCurrentChecks();
386
+ this.emit({
387
+ file: 'reachability',
388
+ function: 'stopReachability'
389
+ }, 'reachability:stopped', {});
390
+ this.sendMetric(true);
391
+ this.resolveReachabilityPromise();
392
+ }
393
+ }
394
+
372
395
  /**
373
396
  * Returns statistics about last reachability results. The returned value is an object
374
397
  * with a flat list of properties so that it can be easily sent with metrics
375
398
  *
376
399
  * @returns {Promise} Promise with metrics values, it never rejects/throws.
377
400
  */
378
- )
379
401
  }, {
380
402
  key: "getReachabilityMetrics",
381
403
  value: (function () {
@@ -821,16 +843,21 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
821
843
  /**
822
844
  * Sends a metric with all the statistics about how long reachability took
823
845
  *
846
+ * @param {boolean} aborted true if the reachability checks were aborted
824
847
  * @returns {void}
825
848
  */
826
849
  }, {
827
850
  key: "sendMetric",
828
851
  value: (function () {
829
852
  var _sendMetric = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee10() {
830
- var results, stats;
853
+ var aborted,
854
+ results,
855
+ stats,
856
+ _args10 = arguments;
831
857
  return _regenerator.default.wrap(function _callee10$(_context10) {
832
858
  while (1) switch (_context10.prev = _context10.next) {
833
859
  case 0:
860
+ aborted = _args10.length > 0 && _args10[0] !== undefined ? _args10[0] : false;
834
861
  results = [];
835
862
  (0, _values.default)(this.clusterReachability).forEach(function (clusterReachability) {
836
863
  results.push(_objectSpread(_objectSpread({}, clusterReachability.getResult()), {}, {
@@ -838,6 +865,7 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
838
865
  }));
839
866
  });
840
867
  stats = {
868
+ aborted: aborted,
841
869
  vmn: {
842
870
  udp: this.getStatistics(results, 'udp', true)
843
871
  },
@@ -859,7 +887,7 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
859
887
  trigger: this.lastTrigger
860
888
  };
861
889
  _metrics.default.sendBehavioralMetric(_constants2.default.REACHABILITY_COMPLETED, _metrics.default.prepareMetricFields(stats));
862
- case 4:
890
+ case 5:
863
891
  case "end":
864
892
  return _context10.stop();
865
893
  }
@@ -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","undefined","reachabilityRequest","ReachabilityRequest","clusterReachability","_createClass2","key","value","_getClusters","_asyncToGenerator2","_regenerator","mark","_callee","trigger","previousReport","isRetry","_yield$this$reachabil","clusters","joinCookie","discoveryOptions","_args","wrap","_callee$","_context","prev","next","getClusters","MeetingUtil","getIpVersion","sent","minRequiredClusters","orpheusApiVersion","boundedStorage","put","localStorageJoinCookie","_stringify","abrupt","t0","LoggerProxy","logger","error","concat","stop","_x","_x2","_gatherReachability","_callee2","_yield$this$getCluste","_callee2$","_context2","lastTrigger","internal","device","ipNetworkDetector","detect","reachabilityDefer","Defer","performReachabilityChecks","promise","gatherReachability","_x3","_getJoinCookie","_callee3","joinCookieRaw","_callee3$","_context3","get","catch","JSON","parse","getJoinCookie","_getReachabilityReport","_callee4","reachabilityResult","_callee4$","_context4","getReachabilityResults","reachability","version","usedDiscoveryOptions","metrics","totalDuration","tests","getReachabilityReport","_gatherReachabilityFallback","_callee5","reachabilityReport","_yield$this$getCluste2","_callee5$","_context5","abortCurrentChecks","gatherReachabilityFallback","_getReachabilityMetrics","_callee6","stats","updateStats","resultsJson","results","_callee6$","_context6","reachability_public_udp_success","reachability_public_udp_failed","reachability_public_tcp_success","reachability_public_tcp_failed","reachability_public_xtls_success","reachability_public_xtls_failed","reachability_vmn_udp_success","reachability_vmn_udp_failed","reachability_vmn_tcp_success","reachability_vmn_tcp_failed","reachability_vmn_xtls_success","reachability_vmn_xtls_failed","clusterType","outcome","localStorageResult","_values","isVideoMesh","warn","getReachabilityMetrics","mapTransportResultToBackendDataFormat","transportResult","output","_i","_Object$entries","_entries","_Object$entries$_i","_slicedToArray2","reachable","untested","latencyInMilliseconds","toString","_getReachabilityResults","_callee7","_this2","allClusterResults","_callee7$","_context7","mapValues","clusterResult","_isAnyPublicClusterReachable","_callee8","reachabilityData","reachabilityResults","_callee8$","_context8","some","_result$udp","_result$tcp","isAnyPublicClusterReachable","_isWebexMediaBackendUnreachable","_callee9","unreachable","protocols","_callee9$","_context9","tested","_keys","protocol","_result$protocol","_result$protocol2","every","isWebexMediaBackendUnreachable","getUnreachableClusters","unreachableList","_ref","_ref2","getResult","name","getNumberOfReachableClusters","count","_ref3","_ref4","logUnreachableClusters","list","_ref5","log","areAllPublicClusterResultsReady","isEqual","expectedResultsCount","resultsCount","areAllResultsReady","resolveReachabilityPromise","_this$reachabilityDef","checkMinRequiredClusters","performance","now","startTime","clearTimer","resolve","numReachableClusters","abortClusterReachability","abort","getStatistics","values","map","min","max","average","Math","_toConsumableArray2","mean","_sendMetric","_callee10","_callee10$","_context10","vmn","ipver","firstIpV4","firstIpV6","firstMdns","totalTime","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","REACHABILITY_COMPLETED","prepareMetricFields","sendMetric","startTimers","_this3","vmnTimer","setTimeout","publicCloudTimer","overallTimer","emit","file","function","_storeResults","_callee11","_callee11$","_context11","storeResults","_x4","resetResultCounters","timer","clearTimeout","_performReachabilityChecks","_callee14","clusterList","_this4","isFirstResult","_callee14$","_context14","config","meetings","experimental","enableTcpReachability","enableTlsReachability","cluster","includeTcpReachability","includeTlsReachability","ClusterReachability","on","Events","resultReady","_ref6","_callee12","data","clientMediaIPs","_callee12$","_context12","_x6","clientMediaIpsUpdated","_ref7","_callee13","_callee13$","_context13","_x7","start","_x5","_getClientMediaPreferences","_callee15","isMultistream","_callee15$","_context15","t1","t2","preferTranscoding","getClientMediaPreferences","_x8","_x9","_getReachabilityReportToAttachToRoap","_callee16","_callee16$","_context16","getReachabilityReportToAttachToRoap","EventsScope"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable class-methods-use-this */\nimport {isEqual, mapValues, mean} from 'lodash';\n\nimport {Defer} from '@webex/common';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport MeetingUtil from '../meeting/util';\n\nimport {IP_VERSION, REACHABILITY} from '../constants';\n\nimport ReachabilityRequest, {ClusterList} from './request';\nimport {\n ClusterReachabilityResult,\n TransportResult,\n ClientMediaPreferences,\n ReachabilityMetrics,\n ReachabilityReportV0,\n ReachabilityReportV1,\n ReachabilityResults,\n ReachabilityResultsForBackend,\n TransportResultForBackend,\n GetClustersTrigger,\n} from './reachability.types';\nimport {\n ClientMediaIpsUpdatedEventData,\n ClusterReachability,\n Events,\n ResultEventData,\n} from './clusterReachability';\nimport EventsScope from '../common/events/events-scope';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport Metrics from '../metrics';\n\n// timeouts in seconds\nconst DEFAULT_TIMEOUT = 3;\nconst VIDEO_MESH_TIMEOUT = 1;\nconst OVERALL_TIMEOUT = 15;\n\n/**\n * @class Reachability\n * @export\n */\nexport default class Reachability extends EventsScope {\n namespace = REACHABILITY.namespace;\n webex: object;\n reachabilityRequest: ReachabilityRequest;\n clusterReachability: {\n [key: string]: ClusterReachability;\n };\n\n minRequiredClusters?: number;\n orpheusApiVersion?: number;\n\n reachabilityDefer?: Defer;\n\n vmnTimer?: ReturnType<typeof setTimeout>;\n publicCloudTimer?: ReturnType<typeof setTimeout>;\n overallTimer?: ReturnType<typeof setTimeout>;\n\n expectedResultsCount = {videoMesh: {udp: 0}, public: {udp: 0, tcp: 0, xtls: 0}};\n resultsCount = {videoMesh: {udp: 0}, public: {udp: 0, tcp: 0, xtls: 0}};\n startTime = undefined;\n totalDuration = undefined;\n\n protected lastTrigger?: string;\n\n /**\n * Creates an instance of Reachability.\n * @param {object} webex\n * @memberof Reachability\n */\n constructor(webex: object) {\n super();\n this.webex = webex;\n\n /**\n * internal request object for the server\n * @instance\n * @type {Array}\n * @private\n * @memberof Reachability\n */\n this.reachabilityRequest = new ReachabilityRequest(this.webex);\n\n this.clusterReachability = {};\n }\n\n /**\n * Fetches the list of media clusters from the backend\n * @param {string} trigger - explains the reason for starting reachability, used by Orpheus\n * @param {Object} previousReport - last reachability report\n * @param {boolean} isRetry\n * @private\n * @returns {Promise<{clusters: ClusterList, joinCookie: any}>}\n */\n async getClusters(\n trigger: GetClustersTrigger,\n previousReport?: any,\n isRetry = false\n ): Promise<{\n clusters: ClusterList;\n joinCookie: any;\n }> {\n try {\n const {clusters, joinCookie, discoveryOptions} = await this.reachabilityRequest.getClusters(\n trigger,\n MeetingUtil.getIpVersion(this.webex),\n previousReport\n );\n\n this.minRequiredClusters = discoveryOptions?.['early-call-min-clusters'];\n this.orpheusApiVersion = discoveryOptions?.['report-version'];\n\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageJoinCookie,\n JSON.stringify(joinCookie)\n );\n\n return {clusters, joinCookie};\n } catch (error) {\n if (isRetry) {\n throw error;\n }\n\n LoggerProxy.logger.error(\n `Reachability:index#getClusters --> Failed with error: ${error}, retrying...`\n );\n\n return this.getClusters(trigger, previousReport, true);\n }\n }\n\n /**\n * Gets a list of media clusters from the backend and performs reachability checks on all the clusters\n * @param {string} trigger - explains the reason for starting reachability\n * @returns {Promise<ReachabilityResults>} reachability results\n * @public\n * @memberof Reachability\n */\n public async gatherReachability(trigger: string): Promise<ReachabilityResults> {\n // Fetch clusters and measure latency\n try {\n this.lastTrigger = trigger;\n\n // kick off ip version detection. We don't await it, as we don't want to waste time\n // and if it fails, that's ok we can still carry on\n // @ts-ignore\n this.webex.internal.device.ipNetworkDetector.detect(true);\n\n const {clusters} = await this.getClusters('startup');\n\n this.reachabilityDefer = new Defer();\n\n // Perform Reachability Check\n await this.performReachabilityChecks(clusters);\n\n return this.reachabilityDefer.promise;\n } catch (error) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachability --> Error:`, error);\n\n return {};\n }\n }\n\n /**\n * Gets the last join cookie we got from Orpheus\n *\n * @returns {Promise<Object>} join cookie\n */\n async getJoinCookie() {\n // @ts-ignore\n const joinCookieRaw = await this.webex.boundedStorage\n .get(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie)\n .catch(() => {});\n\n let joinCookie;\n\n if (joinCookieRaw) {\n try {\n joinCookie = JSON.parse(joinCookieRaw);\n } catch (e) {\n LoggerProxy.logger.error(\n `MeetingRequest#constructor --> Error in parsing join cookie data: ${e}`\n );\n }\n }\n\n return joinCookie;\n }\n\n /**\n * Returns the reachability report that needs to be attached to the ROAP messages\n * that we send to the backend.\n *\n * @returns {Promise<Object>}\n */\n async getReachabilityReport(): Promise<\n | {\n joinCookie: any;\n reachability?: ReachabilityReportV1;\n }\n | {\n reachability: ReachabilityReportV0;\n }\n > {\n const reachabilityResult = await this.getReachabilityResults();\n const joinCookie = await this.getJoinCookie();\n\n // Orpheus API version 0\n if (!this.orpheusApiVersion) {\n return {\n reachability: reachabilityResult,\n };\n }\n\n // Orpheus API version 1\n return {\n reachability: {\n version: 1,\n result: {\n usedDiscoveryOptions: {\n 'early-call-min-clusters': this.minRequiredClusters,\n },\n metrics: {\n 'total-duration-ms': this.totalDuration,\n },\n tests: reachabilityResult,\n },\n },\n joinCookie,\n };\n }\n\n /**\n * This method is called when we don't succeed in reaching the minimum number of clusters\n * required by Orpheus. It sends the results to Orpheus and gets a new list that it tries to reach again.\n * @returns {Promise<ReachabilityResults>} reachability results\n * @public\n * @memberof Reachability\n */\n public async gatherReachabilityFallback(): Promise<void> {\n try {\n const reachabilityReport = await this.getReachabilityReport();\n\n const {clusters} = await this.getClusters('early-call/no-min-reached', reachabilityReport);\n\n // stop all previous reachability checks that might still be going on in the background\n this.abortCurrentChecks();\n\n // Perform Reachability Check\n await this.performReachabilityChecks(clusters);\n } catch (error) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachabilityFallback --> Error:`, error);\n }\n }\n\n /**\n * 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 'Reachability:index#getReachabilityResults --> Error parsing reachability data: ',\n e\n );\n }\n\n return results;\n }\n\n /**\n * fetches reachability data and checks for cluster reachability\n * @returns {boolean}\n * @public\n * @memberof Reachability\n */\n async isAnyPublicClusterReachable() {\n let reachable = false;\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);\n\n reachable = Object.values(reachabilityResults).some(\n (result) =>\n !result.isVideoMesh &&\n (result.udp?.result === 'reachable' || result.tcp?.result === 'reachable')\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Reachability:index#isAnyPublicClusterReachable --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return reachable;\n }\n\n /**\n * Returns true only if ALL protocols (UDP, TCP and TLS) have been tested and none\n * of the media clusters where reachable with any of the protocols. This is done\n * irrespective of the config, so for example:\n * if config.meetings.experimental.enableTlsReachability === false,\n * it will return false, because TLS reachability won't be tested,\n * so we can't say for sure that media backend is unreachable over TLS.\n *\n * @returns {boolean}\n */\n async isWebexMediaBackendUnreachable() {\n let unreachable = false;\n\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);\n\n const protocols = {\n udp: {tested: false, reachable: undefined},\n tcp: {tested: false, reachable: undefined},\n xtls: {tested: false, reachable: undefined},\n };\n\n Object.values(reachabilityResults).forEach((result) => {\n Object.keys(protocols).forEach((protocol) => {\n if (\n result[protocol]?.result === 'reachable' ||\n result[protocol]?.result === 'unreachable'\n ) {\n protocols[protocol].tested = true;\n\n // we need at least 1 'reachable' result to mark the whole protocol as reachable\n if (result[protocol].result === 'reachable') {\n protocols[protocol].reachable = true;\n }\n }\n });\n });\n\n unreachable = Object.values(protocols).every(\n (protocol) => protocol.tested && !protocol.reachable\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Reachability:index#isWebexMediaBackendUnreachable --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return unreachable;\n }\n\n /**\n * Get list of all unreachable clusters\n * @returns {array} Unreachable clusters\n * @private\n * @memberof Reachability\n */\n private getUnreachableClusters(): Array<{name: string; protocol: string}> {\n const unreachableList = [];\n\n Object.entries(this.clusterReachability).forEach(([key, clusterReachability]) => {\n const result = clusterReachability.getResult();\n\n if (result.udp.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'udp'});\n }\n if (result.tcp.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'tcp'});\n }\n if (result.xtls.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'xtls'});\n }\n });\n\n return unreachableList;\n }\n\n /**\n * Gets the number of reachable clusters from last run reachability check\n * @returns {number} reachable clusters count\n * @private\n * @memberof Reachability\n */\n private getNumberOfReachableClusters(): number {\n let count = 0;\n\n Object.entries(this.clusterReachability).forEach(([key, clusterReachability]) => {\n const result = clusterReachability.getResult();\n\n if (\n result.udp.result === 'reachable' ||\n result.tcp.result === 'reachable' ||\n result.xtls.result === 'reachable'\n ) {\n count += 1;\n }\n });\n\n return count;\n }\n\n /**\n * Make a log of unreachable clusters.\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private logUnreachableClusters() {\n const list = this.getUnreachableClusters();\n\n list.forEach(({name, protocol}) => {\n LoggerProxy.logger.log(\n `Reachability:index#logUnreachableClusters --> failed to reach ${name} over ${protocol}`\n );\n });\n }\n\n /**\n * Returns true if we've obtained all the reachability results for all the public clusters\n * In other words, it means that all public clusters are reachable over each protocol,\n * because we only get a \"result\" if we managed to reach a cluster\n *\n * @returns {boolean}\n */\n private areAllPublicClusterResultsReady() {\n return isEqual(this.expectedResultsCount.public, this.resultsCount.public);\n }\n\n /**\n * Returns true if we've obtained all the reachability results for all the clusters\n *\n * @returns {boolean}\n */\n private areAllResultsReady() {\n return isEqual(this.expectedResultsCount, this.resultsCount);\n }\n\n /**\n * Resolves the promise returned by gatherReachability() method\n * @param {boolean} checkMinRequiredClusters - if true, it will check if we have reached the minimum required clusters and do a fallback if needed\n * @returns {void}\n */\n private resolveReachabilityPromise(checkMinRequiredClusters = true) {\n this.totalDuration = performance.now() - this.startTime;\n\n this.clearTimer('vmnTimer');\n this.clearTimer('publicCloudTimer');\n\n this.logUnreachableClusters();\n this.reachabilityDefer?.resolve();\n\n if (checkMinRequiredClusters) {\n const numReachableClusters = this.getNumberOfReachableClusters();\n if (this.minRequiredClusters && numReachableClusters < this.minRequiredClusters) {\n LoggerProxy.logger.log(\n `Reachability:index#resolveReachabilityPromise --> minRequiredClusters not reached (${numReachableClusters} < ${this.minRequiredClusters}), doing reachability fallback`\n );\n this.gatherReachabilityFallback();\n }\n }\n }\n\n /**\n * Aborts all cluster reachability checks that are in progress\n *\n * @returns {void}\n */\n private abortClusterReachability() {\n Object.values(this.clusterReachability).forEach((clusterReachability) => {\n clusterReachability.abort();\n });\n }\n\n /**\n * Helper function for calculating min/max/average values of latency\n *\n * @param {Array<any>} results\n * @param {string} protocol\n * @param {boolean} isVideoMesh\n * @returns {{min:number, max: number, average: number}}\n */\n protected getStatistics(\n results: Array<ClusterReachabilityResult & {isVideoMesh: boolean}>,\n protocol: 'udp' | 'tcp' | 'xtls',\n isVideoMesh: boolean\n ) {\n const values = results\n .filter((result) => result.isVideoMesh === isVideoMesh)\n .filter((result) => result[protocol].result === 'reachable')\n .map((result) => result[protocol].latencyInMilliseconds);\n\n if (values.length === 0) {\n return {\n min: -1,\n max: -1,\n average: -1,\n };\n }\n\n return {\n min: Math.min(...values),\n max: Math.max(...values),\n average: mean(values),\n };\n }\n\n /**\n * Sends a metric with all the statistics about how long reachability took\n *\n * @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 trigger: this.lastTrigger,\n };\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.REACHABILITY_COMPLETED,\n Metrics.prepareMetricFields(stats)\n );\n }\n\n /**\n * Starts all the timers used for various timeouts\n *\n * @returns {void}\n */\n private startTimers() {\n this.vmnTimer = setTimeout(() => {\n this.vmnTimer = undefined;\n // if we are only missing VMN results, then we don't want to wait for them any longer\n // as they are likely to fail if users are not on corporate network\n if (this.areAllPublicClusterResultsReady()) {\n LoggerProxy.logger.log(\n 'Reachability:index#startTimers --> Reachability checks timed out (VMN timeout)'\n );\n\n this.resolveReachabilityPromise();\n }\n }, VIDEO_MESH_TIMEOUT * 1000);\n\n this.publicCloudTimer = setTimeout(() => {\n this.publicCloudTimer = undefined;\n\n LoggerProxy.logger.log(\n `Reachability:index#startTimers --> Reachability checks timed out (${DEFAULT_TIMEOUT}s)`\n );\n\n // check against minimum required clusters, do a new call if we don't have enough\n\n // resolve the promise, so that the client won't be blocked waiting on meetings.register() for too long\n this.resolveReachabilityPromise();\n }, DEFAULT_TIMEOUT * 1000);\n\n this.overallTimer = setTimeout(() => {\n this.overallTimer = undefined;\n this.abortClusterReachability();\n this.emit(\n {\n file: 'reachability',\n function: 'overallTimer timeout',\n },\n 'reachability:done',\n {}\n );\n this.sendMetric();\n\n LoggerProxy.logger.log(\n `Reachability:index#startTimers --> Reachability checks fully timed out (${OVERALL_TIMEOUT}s)`\n );\n }, OVERALL_TIMEOUT * 1000);\n }\n\n /**\n * Stores given reachability results in local storage\n *\n * @param {ReachabilityResults} results\n * @returns {Promise<void>}\n */\n private async storeResults(results: ReachabilityResults) {\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageResult,\n JSON.stringify(results)\n );\n }\n\n /**\n * Resets all the internal counters that keep track of the results\n *\n * @returns {void}\n */\n private resetResultCounters() {\n this.expectedResultsCount.videoMesh.udp = 0;\n this.expectedResultsCount.public.udp = 0;\n this.expectedResultsCount.public.tcp = 0;\n this.expectedResultsCount.public.xtls = 0;\n\n this.resultsCount.videoMesh.udp = 0;\n this.resultsCount.public.udp = 0;\n this.resultsCount.public.tcp = 0;\n this.resultsCount.public.xtls = 0;\n }\n\n /**\n * Clears the timer\n *\n * @param {string} timer name of the timer to clear\n * @returns {void}\n */\n private clearTimer(timer: string) {\n if (this[timer]) {\n clearTimeout(this[timer]);\n this[timer] = undefined;\n }\n }\n\n /**\n * Aborts current checks that are in progress\n *\n * @returns {void}\n */\n private abortCurrentChecks() {\n this.clearTimer('vmnTimer');\n this.clearTimer('publicCloudTimer');\n this.clearTimer('overallTimer');\n\n this.abortClusterReachability();\n }\n\n /**\n * Performs reachability checks for all clusters\n * @param {ClusterList} clusterList\n * @returns {Promise<void>} promise that's resolved as soon as the checks are started\n */\n private async performReachabilityChecks(clusterList: ClusterList) {\n const results: ReachabilityResults = {};\n\n this.clusterReachability = {};\n\n this.startTime = performance.now();\n\n LoggerProxy.logger.log(\n `Reachability:index#performReachabilityChecks --> doing UDP${\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTcpReachability ? ',TCP' : ''\n }${\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTlsReachability ? ',TLS' : ''\n } reachability checks`\n );\n\n this.resetResultCounters();\n\n // sanitize the urls in the clusterList\n Object.keys(clusterList).forEach((key) => {\n const cluster = clusterList[key];\n\n // Linus doesn't support TCP reachability checks on video mesh nodes\n const includeTcpReachability =\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTcpReachability && !cluster.isVideoMesh;\n\n if (!includeTcpReachability) {\n cluster.tcp = [];\n }\n\n // Linus doesn't support xTLS reachability checks on video mesh nodes\n const includeTlsReachability =\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTlsReachability && !cluster.isVideoMesh;\n\n if (!includeTlsReachability) {\n cluster.xtls = [];\n }\n\n // initialize the result for this cluster\n results[key] = {\n udp: {result: cluster.udp.length > 0 ? 'unreachable' : 'untested'},\n tcp: {result: cluster.tcp.length > 0 ? 'unreachable' : 'untested'},\n xtls: {result: cluster.xtls.length > 0 ? 'unreachable' : 'untested'},\n isVideoMesh: cluster.isVideoMesh,\n };\n\n // update expected results counters to include this cluster\n this.expectedResultsCount[cluster.isVideoMesh ? 'videoMesh' : 'public'].udp +=\n cluster.udp.length;\n if (!cluster.isVideoMesh) {\n this.expectedResultsCount.public.tcp += cluster.tcp.length;\n this.expectedResultsCount.public.xtls += cluster.xtls.length;\n }\n });\n\n const isFirstResult = {\n udp: true,\n tcp: true,\n xtls: true,\n };\n\n // save the initialized results (in case we don't get any \"resultReady\" events at all)\n await this.storeResults(results);\n\n if (!clusterList || !Object.keys(clusterList).length) {\n // nothing to do, finish immediately\n this.resolveReachabilityPromise(false);\n\n this.emit(\n {\n file: 'reachability',\n function: 'performReachabilityChecks',\n },\n 'reachability:done',\n {}\n );\n\n return;\n }\n\n this.startTimers();\n\n // now start the reachability on all the clusters\n Object.keys(clusterList).forEach((key) => {\n const cluster = clusterList[key];\n\n this.clusterReachability[key] = new ClusterReachability(key, cluster);\n this.clusterReachability[key].on(Events.resultReady, async (data: ResultEventData) => {\n const {protocol, result, clientMediaIPs, latencyInMilliseconds} = data;\n\n if (isFirstResult[protocol]) {\n this.emit(\n {\n file: 'reachability',\n function: 'resultReady event handler',\n },\n 'reachability:firstResultAvailable',\n {\n protocol,\n }\n );\n isFirstResult[protocol] = false;\n }\n this.resultsCount[cluster.isVideoMesh ? 'videoMesh' : 'public'][protocol] += 1;\n\n const areAllResultsReady = this.areAllResultsReady();\n\n results[key][protocol].result = result;\n results[key][protocol].clientMediaIPs = clientMediaIPs;\n results[key][protocol].latencyInMilliseconds = latencyInMilliseconds;\n\n await this.storeResults(results);\n\n if (areAllResultsReady) {\n this.clearTimer('overallTimer');\n this.emit(\n {\n file: 'reachability',\n function: 'performReachabilityChecks',\n },\n 'reachability:done',\n {}\n );\n this.sendMetric();\n\n LoggerProxy.logger.log(\n `Reachability:index#gatherReachability --> Reachability checks fully completed`\n );\n this.resolveReachabilityPromise();\n }\n });\n\n // clientMediaIps can be updated independently from the results, so we need to listen for them too\n this.clusterReachability[key].on(\n Events.clientMediaIpsUpdated,\n async (data: ClientMediaIpsUpdatedEventData) => {\n results[key][data.protocol].clientMediaIPs = data.clientMediaIPs;\n\n await this.storeResults(results);\n }\n );\n\n this.clusterReachability[key].start(); // not awaiting on purpose\n });\n }\n\n /**\n * Returns the clientMediaPreferences object that needs to be sent to the backend\n * when joining a meeting\n *\n * @param {boolean} isMultistream\n * @param {IP_VERSION} ipver\n * @returns {Object}\n */\n async getClientMediaPreferences(\n isMultistream: boolean,\n ipver?: IP_VERSION\n ): Promise<ClientMediaPreferences> {\n // if 0 or undefined, we assume version 0 and don't send any reachability in clientMediaPreferences\n if (!this.orpheusApiVersion) {\n return {\n ipver,\n joinCookie: await this.getJoinCookie(),\n preferTranscoding: !isMultistream,\n };\n }\n\n // must be version 1\n\n // for version 1, the reachability report goes into clientMediaPreferences (and it contains joinCookie)\n const reachabilityReport = (await this.getReachabilityReport()) as {\n joinCookie: any;\n reachability?: ReachabilityReportV1;\n };\n\n return {\n ipver,\n preferTranscoding: !isMultistream,\n ...reachabilityReport,\n };\n }\n\n /**\n * Returns the reachability report that needs to be attached to the ROAP messages\n * that we send to the backend.\n * It may return undefined, if reachability is not needed to be attached to ROAP messages (that's the case for v1 or Orpheus API)\n *\n * @returns {Promise<ReachabilityReportV0>} object that needs to be attached to Roap messages\n */\n async getReachabilityReportToAttachToRoap(): Promise<ReachabilityReportV0 | undefined> {\n // version 0\n if (!this.orpheusApiVersion) {\n return this.getReachabilityResults();\n }\n\n // version 1\n\n // for version 1 we don't attach anything to Roap messages, reachability report is sent inside clientMediaPreferences\n return undefined;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,IAAAA,OAAA,GAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,YAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,KAAA,GAAAD,sBAAA,CAAAH,OAAA;AAEA,IAAAK,UAAA,GAAAL,OAAA;AAEA,IAAAM,QAAA,GAAAH,sBAAA,CAAAH,OAAA;AAaA,IAAAO,oBAAA,GAAAP,OAAA;AAMA,IAAAQ,YAAA,GAAAL,sBAAA,CAAAH,OAAA;AACA,IAAAS,WAAA,GAAAN,sBAAA,CAAAH,OAAA;AACA,IAAAU,QAAA,GAAAP,sBAAA,CAAAH,OAAA;AAAiC,SAAAW,QAAAC,CAAA,EAAAC,CAAA,QAAAC,CAAA,GAAAC,aAAA,CAAAH,CAAA,OAAAI,6BAAA,QAAAC,CAAA,GAAAD,6BAAA,CAAAJ,CAAA,GAAAC,CAAA,KAAAI,CAAA,GAAAA,CAAA,CAAAC,MAAA,WAAAL,CAAA,WAAAM,gCAAA,CAAAP,CAAA,EAAAC,CAAA,EAAAO,UAAA,OAAAN,CAAA,CAAAO,IAAA,CAAAC,KAAA,CAAAR,CAAA,EAAAG,CAAA,YAAAH,CAAA;AAAA,SAAAS,cAAAX,CAAA,aAAAC,CAAA,MAAAA,CAAA,GAAAW,SAAA,CAAAC,MAAA,EAAAZ,CAAA,UAAAC,CAAA,WAAAU,SAAA,CAAAX,CAAA,IAAAW,SAAA,CAAAX,CAAA,QAAAA,CAAA,OAAAF,OAAA,CAAAe,MAAA,CAAAZ,CAAA,OAAAa,OAAA,WAAAd,CAAA,QAAAe,gBAAA,CAAAC,OAAA,EAAAjB,CAAA,EAAAC,CAAA,EAAAC,CAAA,CAAAD,CAAA,SAAAiB,iCAAA,GAAAC,wBAAA,CAAAnB,CAAA,EAAAkB,iCAAA,CAAAhB,CAAA,KAAAH,OAAA,CAAAe,MAAA,CAAAZ,CAAA,GAAAa,OAAA,WAAAd,CAAA,IAAAmB,sBAAA,CAAApB,CAAA,EAAAC,CAAA,EAAAM,gCAAA,CAAAL,CAAA,EAAAD,CAAA,iBAAAD,CAAA;AAAA,SAAAqB,aAAAC,OAAA,QAAAC,yBAAA,GAAAC,yBAAA,oBAAAC,qBAAA,QAAAC,KAAA,OAAAC,gBAAA,CAAAV,OAAA,EAAAK,OAAA,GAAAM,MAAA,MAAAL,yBAAA,QAAAM,SAAA,OAAAF,gBAAA,CAAAV,OAAA,QAAAa,WAAA,EAAAF,MAAA,GAAAG,kBAAA,CAAAL,KAAA,EAAAd,SAAA,EAAAiB,SAAA,YAAAD,MAAA,GAAAF,KAAA,CAAAhB,KAAA,OAAAE,SAAA,gBAAAoB,2BAAA,CAAAf,OAAA,QAAAW,MAAA;AAAA,SAAAJ,0BAAA,eAAAS,OAAA,qBAAAF,kBAAA,oBAAAA,kBAAA,CAAAG,IAAA,2BAAAC,KAAA,oCAAAC,OAAA,CAAAC,SAAA,CAAAC,OAAA,CAAAC,IAAA,CAAAR,kBAAA,CAAAK,OAAA,8CAAApC,CAAA,sBAlCjC;AACA;AACA,GAFA,CAIA;AAgCA;AACA,IAAMwC,eAAe,GAAG,CAAC;AACzB,IAAMC,kBAAkB,GAAG,CAAC;AAC5B,IAAMC,eAAe,GAAG,EAAE;;AAE1B;AACA;AACA;AACA;AAHA,IAIqBC,YAAY,GAAAC,OAAA,CAAA3B,OAAA,0BAAA4B,YAAA;EAAA,IAAAC,UAAA,CAAA7B,OAAA,EAAA0B,YAAA,EAAAE,YAAA;EAAA,IAAAE,MAAA,GAAA1B,YAAA,CAAAsB,YAAA;EAwB/B;AACF;AACA;AACA;AACA;EACE,SAAAA,aAAYK,KAAa,EAAE;IAAA,IAAAC,KAAA;IAAA,IAAAC,gBAAA,CAAAjC,OAAA,QAAA0B,YAAA;IACzBM,KAAA,GAAAF,MAAA,CAAAR,IAAA;IAAQ,IAAAvB,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA,gBA7BEG,uBAAY,CAACC,SAAS;IAAA,IAAArC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAAA,IAAAjC,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA,2BAgBX;MAACK,SAAS,EAAE;QAACC,GAAG,EAAE;MAAC,CAAC;MAAEC,MAAM,EAAE;QAACD,GAAG,EAAE,CAAC;QAAEE,GAAG,EAAE,CAAC;QAAEC,IAAI,EAAE;MAAC;IAAC,CAAC;IAAA,IAAA1C,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA,mBAChE;MAACK,SAAS,EAAE;QAACC,GAAG,EAAE;MAAC,CAAC;MAAEC,MAAM,EAAE;QAACD,GAAG,EAAE,CAAC;QAAEE,GAAG,EAAE,CAAC;QAAEC,IAAI,EAAE;MAAC;IAAC,CAAC;IAAA,IAAA1C,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA,gBAC3DU,SAAS;IAAA,IAAA3C,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA,oBACLU,SAAS;IAAA,IAAA3C,gBAAA,CAAAC,OAAA,MAAAkC,uBAAA,CAAAlC,OAAA,EAAAgC,KAAA;IAWvBA,KAAA,CAAKD,KAAK,GAAGA,KAAK;;IAElB;AACJ;AACA;AACA;AACA;AACA;AACA;IACIC,KAAA,CAAKW,mBAAmB,GAAG,IAAIC,gBAAmB,CAACZ,KAAA,CAAKD,KAAK,CAAC;IAE9DC,KAAA,CAAKa,mBAAmB,GAAG,CAAC,CAAC;IAAC,OAAAb,KAAA;EAChC;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE,IAAAc,aAAA,CAAA9C,OAAA,EAAA0B,YAAA;IAAAqB,GAAA;IAAAC,KAAA;MAAA,IAAAC,YAAA,OAAAC,kBAAA,CAAAlD,OAAA,gBAAAmD,YAAA,CAAAnD,OAAA,CAAAoD,IAAA,CAQA,SAAAC,QACEC,OAA2B,EAC3BC,cAAoB;QAAA,IAAAC,OAAA;UAAAC,qBAAA;UAAAC,QAAA;UAAAC,UAAA;UAAAC,gBAAA;UAAAC,KAAA,GAAAlE,SAAA;QAAA,OAAAwD,YAAA,CAAAnD,OAAA,CAAA8D,IAAA,UAAAC,SAAAC,QAAA;UAAA,kBAAAA,QAAA,CAAAC,IAAA,GAAAD,QAAA,CAAAE,IAAA;YAAA;cACpBV,OAAO,GAAAK,KAAA,CAAAjE,MAAA,QAAAiE,KAAA,QAAAnB,SAAA,GAAAmB,KAAA,MAAG,KAAK;cAAAG,QAAA,CAAAC,IAAA;cAAAD,QAAA,CAAAE,IAAA;cAAA,OAM0C,IAAI,CAACvB,mBAAmB,CAACwB,WAAW,CACzFb,OAAO,EACPc,aAAW,CAACC,YAAY,CAAC,IAAI,CAACtC,KAAK,CAAC,EACpCwB,cACF,CAAC;YAAA;cAAAE,qBAAA,GAAAO,QAAA,CAAAM,IAAA;cAJMZ,QAAQ,GAAAD,qBAAA,CAARC,QAAQ;cAAEC,UAAU,GAAAF,qBAAA,CAAVE,UAAU;cAAEC,gBAAgB,GAAAH,qBAAA,CAAhBG,gBAAgB;cAM7C,IAAI,CAACW,mBAAmB,GAAGX,gBAAgB,aAAhBA,gBAAgB,uBAAhBA,gBAAgB,CAAG,yBAAyB,CAAC;cACxE,IAAI,CAACY,iBAAiB,GAAGZ,gBAAgB,aAAhBA,gBAAgB,uBAAhBA,gBAAgB,CAAG,gBAAgB,CAAC;;cAE7D;cAAAI,QAAA,CAAAE,IAAA;cAAA,OACM,IAAI,CAACnC,KAAK,CAAC0C,cAAc,CAACC,GAAG,CACjC,IAAI,CAACtC,SAAS,EACdD,uBAAY,CAACwC,sBAAsB,EACnC,IAAAC,UAAA,CAAA5E,OAAA,EAAe2D,UAAU,CAC3B,CAAC;YAAA;cAAA,OAAAK,QAAA,CAAAa,MAAA,WAEM;gBAACnB,QAAQ,EAARA,QAAQ;gBAAEC,UAAU,EAAVA;cAAU,CAAC;YAAA;cAAAK,QAAA,CAAAC,IAAA;cAAAD,QAAA,CAAAc,EAAA,GAAAd,QAAA;cAAA,KAEzBR,OAAO;gBAAAQ,QAAA,CAAAE,IAAA;gBAAA;cAAA;cAAA,MAAAF,QAAA,CAAAc,EAAA;YAAA;cAIXC,oBAAW,CAACC,MAAM,CAACC,KAAK,0DAAAC,MAAA,CAAAlB,QAAA,CAAAc,EAAA,kBAExB,CAAC;cAAC,OAAAd,QAAA,CAAAa,MAAA,WAEK,IAAI,CAACV,WAAW,CAACb,OAAO,EAAEC,cAAc,EAAE,IAAI,CAAC;YAAA;YAAA;cAAA,OAAAS,QAAA,CAAAmB,IAAA;UAAA;QAAA,GAAA9B,OAAA;MAAA,CAEzD;MAAA,SAAAc,YAAAiB,EAAA,EAAAC,GAAA;QAAA,OAAApC,YAAA,CAAAxD,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAwE,WAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;AACA;IANE;EAAA;IAAApB,GAAA;IAAAC,KAAA;MAAA,IAAAsC,mBAAA,OAAApC,kBAAA,CAAAlD,OAAA,gBAAAmD,YAAA,CAAAnD,OAAA,CAAAoD,IAAA,CAOA,SAAAmC,SAAgCjC,OAAe;QAAA,IAAAkC,qBAAA,EAAA9B,QAAA;QAAA,OAAAP,YAAA,CAAAnD,OAAA,CAAA8D,IAAA,UAAA2B,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAAzB,IAAA,GAAAyB,SAAA,CAAAxB,IAAA;YAAA;cAAAwB,SAAA,CAAAzB,IAAA;cAG3C,IAAI,CAAC0B,WAAW,GAAGrC,OAAO;;cAE1B;cACA;cACA;cACA,IAAI,CAACvB,KAAK,CAAC6D,QAAQ,CAACC,MAAM,CAACC,iBAAiB,CAACC,MAAM,CAAC,IAAI,CAAC;cAACL,SAAA,CAAAxB,IAAA;cAAA,OAEjC,IAAI,CAACC,WAAW,CAAC,SAAS,CAAC;YAAA;cAAAqB,qBAAA,GAAAE,SAAA,CAAApB,IAAA;cAA7CZ,QAAQ,GAAA8B,qBAAA,CAAR9B,QAAQ;cAEf,IAAI,CAACsC,iBAAiB,GAAG,IAAIC,aAAK,CAAC,CAAC;;cAEpC;cAAAP,SAAA,CAAAxB,IAAA;cAAA,OACM,IAAI,CAACgC,yBAAyB,CAACxC,QAAQ,CAAC;YAAA;cAAA,OAAAgC,SAAA,CAAAb,MAAA,WAEvC,IAAI,CAACmB,iBAAiB,CAACG,OAAO;YAAA;cAAAT,SAAA,CAAAzB,IAAA;cAAAyB,SAAA,CAAAZ,EAAA,GAAAY,SAAA;cAErCX,oBAAW,CAACC,MAAM,CAACC,KAAK,qDAAAS,SAAA,CAAAZ,EAA0D,CAAC;cAAC,OAAAY,SAAA,CAAAb,MAAA,WAE7E,CAAC,CAAC;YAAA;YAAA;cAAA,OAAAa,SAAA,CAAAP,IAAA;UAAA;QAAA,GAAAI,QAAA;MAAA,CAEZ;MAAA,SAAAa,mBAAAC,GAAA;QAAA,OAAAf,mBAAA,CAAA7F,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAyG,kBAAA;IAAA;IAED;AACF;AACA;AACA;AACA;IAJE;EAAA;IAAArD,GAAA;IAAAC,KAAA;MAAA,IAAAsD,cAAA,OAAApD,kBAAA,CAAAlD,OAAA,gBAAAmD,YAAA,CAAAnD,OAAA,CAAAoD,IAAA,CAKA,SAAAmD,SAAA;QAAA,IAAAC,aAAA,EAAA7C,UAAA;QAAA,OAAAR,YAAA,CAAAnD,OAAA,CAAA8D,IAAA,UAAA2C,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAAzC,IAAA,GAAAyC,SAAA,CAAAxC,IAAA;YAAA;cAAAwC,SAAA,CAAAxC,IAAA;cAAA,OAE8B,IAAI,CAACnC,KAAK,CAAC0C,cAAc,CAClDkC,GAAG,CAACxE,uBAAY,CAACC,SAAS,EAAED,uBAAY,CAACwC,sBAAsB,CAAC,CAChEiC,KAAK,CAAC,YAAM,CAAC,CAAC,CAAC;YAAA;cAFZJ,aAAa,GAAAE,SAAA,CAAApC,IAAA;cAMnB,IAAIkC,aAAa,EAAE;gBACjB,IAAI;kBACF7C,UAAU,GAAGkD,IAAI,CAACC,KAAK,CAACN,aAAa,CAAC;gBACxC,CAAC,CAAC,OAAOzH,CAAC,EAAE;kBACVgG,oBAAW,CAACC,MAAM,CAACC,KAAK,sEAAAC,MAAA,CAC+CnG,CAAC,CACxE,CAAC;gBACH;cACF;cAAC,OAAA2H,SAAA,CAAA7B,MAAA,WAEMlB,UAAU;YAAA;YAAA;cAAA,OAAA+C,SAAA,CAAAvB,IAAA;UAAA;QAAA,GAAAoB,QAAA;MAAA,CAClB;MAAA,SAAAQ,cAAA;QAAA,OAAAT,cAAA,CAAA7G,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAoH,aAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;IALE;EAAA;IAAAhE,GAAA;IAAAC,KAAA;MAAA,IAAAgE,sBAAA,OAAA9D,kBAAA,CAAAlD,OAAA,gBAAAmD,YAAA,CAAAnD,OAAA,CAAAoD,IAAA,CAMA,SAAA6D,SAAA;QAAA,IAAAC,kBAAA,EAAAvD,UAAA;QAAA,OAAAR,YAAA,CAAAnD,OAAA,CAAA8D,IAAA,UAAAqD,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAAnD,IAAA,GAAAmD,SAAA,CAAAlD,IAAA;YAAA;cAAAkD,SAAA,CAAAlD,IAAA;cAAA,OASmC,IAAI,CAACmD,sBAAsB,CAAC,CAAC;YAAA;cAAxDH,kBAAkB,GAAAE,SAAA,CAAA9C,IAAA;cAAA8C,SAAA,CAAAlD,IAAA;cAAA,OACC,IAAI,CAAC6C,aAAa,CAAC,CAAC;YAAA;cAAvCpD,UAAU,GAAAyD,SAAA,CAAA9C,IAAA;cAAA,IAGX,IAAI,CAACE,iBAAiB;gBAAA4C,SAAA,CAAAlD,IAAA;gBAAA;cAAA;cAAA,OAAAkD,SAAA,CAAAvC,MAAA,WAClB;gBACLyC,YAAY,EAAEJ;cAChB,CAAC;YAAA;cAAA,OAAAE,SAAA,CAAAvC,MAAA,WAII;gBACLyC,YAAY,EAAE;kBACZC,OAAO,EAAE,CAAC;kBACV5G,MAAM,EAAE;oBACN6G,oBAAoB,EAAE;sBACpB,yBAAyB,EAAE,IAAI,CAACjD;oBAClC,CAAC;oBACDkD,OAAO,EAAE;sBACP,mBAAmB,EAAE,IAAI,CAACC;oBAC5B,CAAC;oBACDC,KAAK,EAAET;kBACT;gBACF,CAAC;gBACDvD,UAAU,EAAVA;cACF,CAAC;YAAA;YAAA;cAAA,OAAAyD,SAAA,CAAAjC,IAAA;UAAA;QAAA,GAAA8B,QAAA;MAAA,CACF;MAAA,SAAAW,sBAAA;QAAA,OAAAZ,sBAAA,CAAAvH,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAiI,qBAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;AACA;IANE;EAAA;IAAA7E,GAAA;IAAAC,KAAA;MAAA,IAAA6E,2BAAA,OAAA3E,kBAAA,CAAAlD,OAAA,gBAAAmD,YAAA,CAAAnD,OAAA,CAAAoD,IAAA,CAOA,SAAA0E,SAAA;QAAA,IAAAC,kBAAA,EAAAC,sBAAA,EAAAtE,QAAA;QAAA,OAAAP,YAAA,CAAAnD,OAAA,CAAA8D,IAAA,UAAAmE,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAAjE,IAAA,GAAAiE,SAAA,CAAAhE,IAAA;YAAA;cAAAgE,SAAA,CAAAjE,IAAA;cAAAiE,SAAA,CAAAhE,IAAA;cAAA,OAEqC,IAAI,CAAC0D,qBAAqB,CAAC,CAAC;YAAA;cAAvDG,kBAAkB,GAAAG,SAAA,CAAA5D,IAAA;cAAA4D,SAAA,CAAAhE,IAAA;cAAA,OAEC,IAAI,CAACC,WAAW,CAAC,2BAA2B,EAAE4D,kBAAkB,CAAC;YAAA;cAAAC,sBAAA,GAAAE,SAAA,CAAA5D,IAAA;cAAnFZ,QAAQ,GAAAsE,sBAAA,CAARtE,QAAQ;cAEf;cACA,IAAI,CAACyE,kBAAkB,CAAC,CAAC;;cAEzB;cAAAD,SAAA,CAAAhE,IAAA;cAAA,OACM,IAAI,CAACgC,yBAAyB,CAACxC,QAAQ,CAAC;YAAA;cAAAwE,SAAA,CAAAhE,IAAA;cAAA;YAAA;cAAAgE,SAAA,CAAAjE,IAAA;cAAAiE,SAAA,CAAApD,EAAA,GAAAoD,SAAA;cAE9CnD,oBAAW,CAACC,MAAM,CAACC,KAAK,6DAAAiD,SAAA,CAAApD,EAAkE,CAAC;YAAC;YAAA;cAAA,OAAAoD,SAAA,CAAA/C,IAAA;UAAA;QAAA,GAAA2C,QAAA;MAAA,CAE/F;MAAA,SAAAM,2BAAA;QAAA,OAAAP,2BAAA,CAAApI,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAyI,0BAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;IALE;EAAA;IAAArF,GAAA;IAAAC,KAAA;MAAA,IAAAqF,uBAAA,OAAAnF,kBAAA,CAAAlD,OAAA,gBAAAmD,YAAA,CAAAnD,OAAA,CAAAoD,IAAA,CAMA,SAAAkF,SAAA;QAAA,IAAAC,KAAA,EAAAC,WAAA,EAAAC,WAAA,EAAAC,OAAA;QAAA,OAAAvF,YAAA,CAAAnD,OAAA,CAAA8D,IAAA,UAAA6E,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAA3E,IAAA,GAAA2E,SAAA,CAAA1E,IAAA;YAAA;cACQqE,KAA0B,GAAG;gBACjCM,+BAA+B,EAAE,CAAC;gBAClCC,8BAA8B,EAAE,CAAC;gBACjCC,+BAA+B,EAAE,CAAC;gBAClCC,8BAA8B,EAAE,CAAC;gBACjCC,gCAAgC,EAAE,CAAC;gBACnCC,+BAA+B,EAAE,CAAC;gBAClCC,4BAA4B,EAAE,CAAC;gBAC/BC,2BAA2B,EAAE,CAAC;gBAC9BC,4BAA4B,EAAE,CAAC;gBAC/BC,2BAA2B,EAAE,CAAC;gBAC9BC,6BAA6B,EAAE,CAAC;gBAChCC,4BAA4B,EAAE;cAChC,CAAC;cAEKhB,WAAW,GAAG,SAAdA,WAAWA,CAAIiB,WAA6B,EAAE9I,MAAiC,EAAK;gBACxF,IAAIA,MAAM,CAAC2B,GAAG,IAAI3B,MAAM,CAAC2B,GAAG,CAAC3B,MAAM,KAAK,UAAU,EAAE;kBAClD,IAAM+I,OAAO,GAAG/I,MAAM,CAAC2B,GAAG,CAAC3B,MAAM,KAAK,WAAW,GAAG,SAAS,GAAG,QAAQ;kBACxE4H,KAAK,iBAAArD,MAAA,CAAiBuE,WAAW,WAAAvE,MAAA,CAAQwE,OAAO,EAAG,IAAI,CAAC;gBAC1D;gBACA,IAAI/I,MAAM,CAAC6B,GAAG,IAAI7B,MAAM,CAAC6B,GAAG,CAAC7B,MAAM,KAAK,UAAU,EAAE;kBAClD,IAAM+I,QAAO,GAAG/I,MAAM,CAAC6B,GAAG,CAAC7B,MAAM,KAAK,WAAW,GAAG,SAAS,GAAG,QAAQ;kBACxE4H,KAAK,iBAAArD,MAAA,CAAiBuE,WAAW,WAAAvE,MAAA,CAAQwE,QAAO,EAAG,IAAI,CAAC;gBAC1D;gBACA,IAAI/I,MAAM,CAAC8B,IAAI,IAAI9B,MAAM,CAAC8B,IAAI,CAAC9B,MAAM,KAAK,UAAU,EAAE;kBACpD,IAAM+I,SAAO,GAAG/I,MAAM,CAAC8B,IAAI,CAAC9B,MAAM,KAAK,WAAW,GAAG,SAAS,GAAG,QAAQ;kBACzE4H,KAAK,iBAAArD,MAAA,CAAiBuE,WAAW,YAAAvE,MAAA,CAASwE,SAAO,EAAG,IAAI,CAAC;gBAC3D;cACF,CAAC;cAAAd,SAAA,CAAA3E,IAAA;cAAA2E,SAAA,CAAA1E,IAAA;cAAA,OAI2B,IAAI,CAACnC,KAAK,CAAC0C,cAAc,CAACkC,GAAG,CACrDxE,uBAAY,CAACC,SAAS,EACtBD,uBAAY,CAACwH,kBACf,CAAC;YAAA;cAHKlB,WAAW,GAAAG,SAAA,CAAAtE,IAAA;cAKXoE,OAA4B,GAAG7B,IAAI,CAACC,KAAK,CAAC2B,WAAW,CAAC;cAE5D,IAAAmB,OAAA,CAAA5J,OAAA,EAAc0I,OAAO,CAAC,CAAC5I,OAAO,CAAC,UAACa,MAAM,EAAK;gBACzC6H,WAAW,CAAC7H,MAAM,CAACkJ,WAAW,GAAG,KAAK,GAAG,QAAQ,EAAElJ,MAAM,CAAC;cAC5D,CAAC,CAAC;cAACiI,SAAA,CAAA1E,IAAA;cAAA;YAAA;cAAA0E,SAAA,CAAA3E,IAAA;cAAA2E,SAAA,CAAA9D,EAAA,GAAA8D,SAAA;cAEH;cACA7D,oBAAW,CAACC,MAAM,CAAC8E,IAAI,CACrB,2EAA2E,EAAAlB,SAAA,CAAA9D,EAE7E,CAAC;YAAC;cAAA,OAAA8D,SAAA,CAAA/D,MAAA,WAGG0D,KAAK;YAAA;YAAA;cAAA,OAAAK,SAAA,CAAAzD,IAAA;UAAA;QAAA,GAAAmD,QAAA;MAAA,CACb;MAAA,SAAAyB,uBAAA;QAAA,OAAA1B,uBAAA,CAAA5I,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAoK,sBAAA;IAAA;IAED;AACF;AACA;AACA;AACA;IAJE;EAAA;IAAAhH,GAAA;IAAAC,KAAA,EAKA,SAAAgH,sCACEC,eAAgC,EACL;MAC3B,IAAMC,MAAiC,GAAG,CAAC,CAAC;MAE5C,SAAAC,EAAA,MAAAC,eAAA,GAA2B,IAAAC,QAAA,CAAArK,OAAA,EAAeiK,eAAe,CAAC,EAAAE,EAAA,GAAAC,eAAA,CAAAxK,MAAA,EAAAuK,EAAA,IAAE;QAAvD,IAAAG,kBAAA,OAAAC,eAAA,CAAAvK,OAAA,EAAAoK,eAAA,CAAAD,EAAA;UAAOpH,IAAG,GAAAuH,kBAAA;UAAEtH,KAAK,GAAAsH,kBAAA;QACpB,QAAQvH,IAAG;UACT,KAAK,QAAQ;YACX,QAAQC,KAAK;cACX,KAAK,WAAW;gBACdkH,MAAM,CAACM,SAAS,GAAG,MAAM;gBACzB;cACF,KAAK,aAAa;gBAChBN,MAAM,CAACM,SAAS,GAAG,OAAO;gBAC1B;cACF,KAAK,UAAU;gBACbN,MAAM,CAACO,QAAQ,GAAG,MAAM;gBACxB;YACJ;YACA;UACF,KAAK,uBAAuB;YAC1BP,MAAM,CAACQ,qBAAqB,GAAG1H,KAAK,CAAC2H,QAAQ,CAAC,CAAC;YAC/C;UACF;YACET,MAAM,CAACnH,IAAG,CAAC,GAAGC,KAAK;QACvB;MACF;MAEA,OAAOkH,MAAM;IACf;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAnH,GAAA;IAAAC,KAAA;MAAA,IAAA4H,uBAAA,OAAA1H,kBAAA,CAAAlD,OAAA,gBAAAmD,YAAA,CAAAnD,OAAA,CAAAoD,IAAA,CAKA,SAAAyH,SAAA;QAAA,IAAAC,MAAA;QAAA,IAAApC,OAAA,EAAAD,WAAA,EAAAsC,iBAAA;QAAA,OAAA5H,YAAA,CAAAnD,OAAA,CAAA8D,IAAA,UAAAkH,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAAhH,IAAA,GAAAgH,SAAA,CAAA/G,IAAA;YAAA;cAAA+G,SAAA,CAAAhH,IAAA;cAAAgH,SAAA,CAAA/G,IAAA;cAAA,OAK8B,IAAI,CAACnC,KAAK,CAAC0C,cAAc,CAACkC,GAAG,CACrDxE,uBAAY,CAACC,SAAS,EACtBD,uBAAY,CAACwH,kBACf,CAAC;YAAA;cAHKlB,WAAW,GAAAwC,SAAA,CAAA3G,IAAA;cAKXyG,iBAAsC,GAAGlE,IAAI,CAACC,KAAK,CAAC2B,WAAW,CAAC;cAEtEC,OAAO,GAAG,IAAAwC,iBAAS,EAACH,iBAAiB,EAAE,UAACI,aAAa;gBAAA,OAAM;kBACzD7I,GAAG,EAAEwI,MAAI,CAACd,qCAAqC,CAACmB,aAAa,CAAC7I,GAAG,IAAI;oBAAC3B,MAAM,EAAE;kBAAU,CAAC,CAAC;kBAC1F6B,GAAG,EAAEsI,MAAI,CAACd,qCAAqC,CAACmB,aAAa,CAAC3I,GAAG,IAAI;oBAAC7B,MAAM,EAAE;kBAAU,CAAC,CAAC;kBAC1F8B,IAAI,EAAEqI,MAAI,CAACd,qCAAqC,CAC9CmB,aAAa,CAAC1I,IAAI,IAAI;oBAAC9B,MAAM,EAAE;kBAAU,CAC3C;gBACF,CAAC;cAAA,CAAC,CAAC;cAACsK,SAAA,CAAA/G,IAAA;cAAA;YAAA;cAAA+G,SAAA,CAAAhH,IAAA;cAAAgH,SAAA,CAAAnG,EAAA,GAAAmG,SAAA;cAEJ;cACAlG,oBAAW,CAACC,MAAM,CAAC8E,IAAI,CACrB,iFAAiF,EAAAmB,SAAA,CAAAnG,EAEnF,CAAC;YAAC;cAAA,OAAAmG,SAAA,CAAApG,MAAA,WAGG6D,OAAO;YAAA;YAAA;cAAA,OAAAuC,SAAA,CAAA9F,IAAA;UAAA;QAAA,GAAA0F,QAAA;MAAA,CACf;MAAA,SAAAxD,uBAAA;QAAA,OAAAuD,uBAAA,CAAAnL,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAA0H,sBAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;IALE;EAAA;IAAAtE,GAAA;IAAAC,KAAA;MAAA,IAAAoI,4BAAA,OAAAlI,kBAAA,CAAAlD,OAAA,gBAAAmD,YAAA,CAAAnD,OAAA,CAAAoD,IAAA,CAMA,SAAAiI,SAAA;QAAA,IAAAb,SAAA,EAAAc,gBAAA,EAAAC,mBAAA;QAAA,OAAApI,YAAA,CAAAnD,OAAA,CAAA8D,IAAA,UAAA0H,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAAxH,IAAA,GAAAwH,SAAA,CAAAvH,IAAA;YAAA;cACMsG,SAAS,GAAG,KAAK,EACrB;cAAAiB,SAAA,CAAAvH,IAAA;cAAA,OAC+B,IAAI,CAACnC,KAAK,CAAC0C,cAAc,CACrDkC,GAAG,CAAC,IAAI,CAACvE,SAAS,EAAED,uBAAY,CAACwH,kBAAkB,CAAC,CACpD/C,KAAK,CAAC,YAAM,CAAC,CAAC,CAAC;YAAA;cAFZ0E,gBAAgB,GAAAG,SAAA,CAAAnH,IAAA;cAItB,IAAIgH,gBAAgB,EAAE;gBACpB,IAAI;kBACIC,mBAAwC,GAAG1E,IAAI,CAACC,KAAK,CAACwE,gBAAgB,CAAC;kBAE7Ed,SAAS,GAAG,IAAAZ,OAAA,CAAA5J,OAAA,EAAcuL,mBAAmB,CAAC,CAACG,IAAI,CACjD,UAAC/K,MAAM;oBAAA,IAAAgL,WAAA,EAAAC,WAAA;oBAAA,OACL,CAACjL,MAAM,CAACkJ,WAAW,KAClB,EAAA8B,WAAA,GAAAhL,MAAM,CAAC2B,GAAG,cAAAqJ,WAAA,uBAAVA,WAAA,CAAYhL,MAAM,MAAK,WAAW,IAAI,EAAAiL,WAAA,GAAAjL,MAAM,CAAC6B,GAAG,cAAAoJ,WAAA,uBAAVA,WAAA,CAAYjL,MAAM,MAAK,WAAW,CAAC;kBAAA,CAC9E,CAAC;gBACH,CAAC,CAAC,OAAO5B,CAAC,EAAE;kBACVgG,oBAAW,CAACC,MAAM,CAACC,KAAK,2FAAAC,MAAA,CACoEnG,CAAC,CAC7F,CAAC;gBACH;cACF;cAAC,OAAA0M,SAAA,CAAA5G,MAAA,WAEM2F,SAAS;YAAA;YAAA;cAAA,OAAAiB,SAAA,CAAAtG,IAAA;UAAA;QAAA,GAAAkG,QAAA;MAAA,CACjB;MAAA,SAAAQ,4BAAA;QAAA,OAAAT,4BAAA,CAAA3L,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAkM,2BAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IATE;EAAA;IAAA9I,GAAA;IAAAC,KAAA;MAAA,IAAA8I,+BAAA,OAAA5I,kBAAA,CAAAlD,OAAA,gBAAAmD,YAAA,CAAAnD,OAAA,CAAAoD,IAAA,CAUA,SAAA2I,SAAA;QAAA,IAAAC,WAAA,EAAAV,gBAAA,EAAAC,mBAAA,EAAAU,SAAA;QAAA,OAAA9I,YAAA,CAAAnD,OAAA,CAAA8D,IAAA,UAAAoI,UAAAC,SAAA;UAAA,kBAAAA,SAAA,CAAAlI,IAAA,GAAAkI,SAAA,CAAAjI,IAAA;YAAA;cACM8H,WAAW,GAAG,KAAK,EAEvB;cAAAG,SAAA,CAAAjI,IAAA;cAAA,OAC+B,IAAI,CAACnC,KAAK,CAAC0C,cAAc,CACrDkC,GAAG,CAAC,IAAI,CAACvE,SAAS,EAAED,uBAAY,CAACwH,kBAAkB,CAAC,CACpD/C,KAAK,CAAC,YAAM,CAAC,CAAC,CAAC;YAAA;cAFZ0E,gBAAgB,GAAAa,SAAA,CAAA7H,IAAA;cAItB,IAAIgH,gBAAgB,EAAE;gBACpB,IAAI;kBACIC,mBAAwC,GAAG1E,IAAI,CAACC,KAAK,CAACwE,gBAAgB,CAAC;kBAEvEW,SAAS,GAAG;oBAChB3J,GAAG,EAAE;sBAAC8J,MAAM,EAAE,KAAK;sBAAE5B,SAAS,EAAE9H;oBAAS,CAAC;oBAC1CF,GAAG,EAAE;sBAAC4J,MAAM,EAAE,KAAK;sBAAE5B,SAAS,EAAE9H;oBAAS,CAAC;oBAC1CD,IAAI,EAAE;sBAAC2J,MAAM,EAAE,KAAK;sBAAE5B,SAAS,EAAE9H;oBAAS;kBAC5C,CAAC;kBAED,IAAAkH,OAAA,CAAA5J,OAAA,EAAcuL,mBAAmB,CAAC,CAACzL,OAAO,CAAC,UAACa,MAAM,EAAK;oBACrD,IAAA0L,KAAA,CAAArM,OAAA,EAAYiM,SAAS,CAAC,CAACnM,OAAO,CAAC,UAACwM,QAAQ,EAAK;sBAAA,IAAAC,gBAAA,EAAAC,iBAAA;sBAC3C,IACE,EAAAD,gBAAA,GAAA5L,MAAM,CAAC2L,QAAQ,CAAC,cAAAC,gBAAA,uBAAhBA,gBAAA,CAAkB5L,MAAM,MAAK,WAAW,IACxC,EAAA6L,iBAAA,GAAA7L,MAAM,CAAC2L,QAAQ,CAAC,cAAAE,iBAAA,uBAAhBA,iBAAA,CAAkB7L,MAAM,MAAK,aAAa,EAC1C;wBACAsL,SAAS,CAACK,QAAQ,CAAC,CAACF,MAAM,GAAG,IAAI;;wBAEjC;wBACA,IAAIzL,MAAM,CAAC2L,QAAQ,CAAC,CAAC3L,MAAM,KAAK,WAAW,EAAE;0BAC3CsL,SAAS,CAACK,QAAQ,CAAC,CAAC9B,SAAS,GAAG,IAAI;wBACtC;sBACF;oBACF,CAAC,CAAC;kBACJ,CAAC,CAAC;kBAEFwB,WAAW,GAAG,IAAApC,OAAA,CAAA5J,OAAA,EAAciM,SAAS,CAAC,CAACQ,KAAK,CAC1C,UAACH,QAAQ;oBAAA,OAAKA,QAAQ,CAACF,MAAM,IAAI,CAACE,QAAQ,CAAC9B,SAAS;kBAAA,CACtD,CAAC;gBACH,CAAC,CAAC,OAAOzL,CAAC,EAAE;kBACVgG,oBAAW,CAACC,MAAM,CAACC,KAAK,8FAAAC,MAAA,CACuEnG,CAAC,CAChG,CAAC;gBACH;cACF;cAAC,OAAAoN,SAAA,CAAAtH,MAAA,WAEMmH,WAAW;YAAA;YAAA;cAAA,OAAAG,SAAA,CAAAhH,IAAA;UAAA;QAAA,GAAA4G,QAAA;MAAA,CACnB;MAAA,SAAAW,+BAAA;QAAA,OAAAZ,+BAAA,CAAArM,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAA+M,8BAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;IALE;EAAA;IAAA3J,GAAA;IAAAC,KAAA,EAMA,SAAA2J,uBAAA,EAA0E;MACxE,IAAMC,eAAe,GAAG,EAAE;MAE1B,IAAAvC,QAAA,CAAArK,OAAA,EAAe,IAAI,CAAC6C,mBAAmB,CAAC,CAAC/C,OAAO,CAAC,UAAA+M,IAAA,EAAgC;QAAA,IAAAC,KAAA,OAAAvC,eAAA,CAAAvK,OAAA,EAAA6M,IAAA;UAA9B9J,GAAG,GAAA+J,KAAA;UAAEjK,mBAAmB,GAAAiK,KAAA;QACzE,IAAMnM,MAAM,GAAGkC,mBAAmB,CAACkK,SAAS,CAAC,CAAC;QAE9C,IAAIpM,MAAM,CAAC2B,GAAG,CAAC3B,MAAM,KAAK,aAAa,EAAE;UACvCiM,eAAe,CAACpN,IAAI,CAAC;YAACwN,IAAI,EAAEjK,GAAG;YAAEuJ,QAAQ,EAAE;UAAK,CAAC,CAAC;QACpD;QACA,IAAI3L,MAAM,CAAC6B,GAAG,CAAC7B,MAAM,KAAK,aAAa,EAAE;UACvCiM,eAAe,CAACpN,IAAI,CAAC;YAACwN,IAAI,EAAEjK,GAAG;YAAEuJ,QAAQ,EAAE;UAAK,CAAC,CAAC;QACpD;QACA,IAAI3L,MAAM,CAAC8B,IAAI,CAAC9B,MAAM,KAAK,aAAa,EAAE;UACxCiM,eAAe,CAACpN,IAAI,CAAC;YAACwN,IAAI,EAAEjK,GAAG;YAAEuJ,QAAQ,EAAE;UAAM,CAAC,CAAC;QACrD;MACF,CAAC,CAAC;MAEF,OAAOM,eAAe;IACxB;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAA7J,GAAA;IAAAC,KAAA,EAMA,SAAAiK,6BAAA,EAA+C;MAC7C,IAAIC,KAAK,GAAG,CAAC;MAEb,IAAA7C,QAAA,CAAArK,OAAA,EAAe,IAAI,CAAC6C,mBAAmB,CAAC,CAAC/C,OAAO,CAAC,UAAAqN,KAAA,EAAgC;QAAA,IAAAC,KAAA,OAAA7C,eAAA,CAAAvK,OAAA,EAAAmN,KAAA;UAA9BpK,GAAG,GAAAqK,KAAA;UAAEvK,mBAAmB,GAAAuK,KAAA;QACzE,IAAMzM,MAAM,GAAGkC,mBAAmB,CAACkK,SAAS,CAAC,CAAC;QAE9C,IACEpM,MAAM,CAAC2B,GAAG,CAAC3B,MAAM,KAAK,WAAW,IACjCA,MAAM,CAAC6B,GAAG,CAAC7B,MAAM,KAAK,WAAW,IACjCA,MAAM,CAAC8B,IAAI,CAAC9B,MAAM,KAAK,WAAW,EAClC;UACAuM,KAAK,IAAI,CAAC;QACZ;MACF,CAAC,CAAC;MAEF,OAAOA,KAAK;IACd;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAnK,GAAA;IAAAC,KAAA,EAMA,SAAAqK,uBAAA,EAAiC;MAC/B,IAAMC,IAAI,GAAG,IAAI,CAACX,sBAAsB,CAAC,CAAC;MAE1CW,IAAI,CAACxN,OAAO,CAAC,UAAAyN,KAAA,EAAsB;QAAA,IAApBP,IAAI,GAAAO,KAAA,CAAJP,IAAI;UAAEV,QAAQ,GAAAiB,KAAA,CAARjB,QAAQ;QAC3BvH,oBAAW,CAACC,MAAM,CAACwI,GAAG,kEAAAtI,MAAA,CAC6C8H,IAAI,YAAA9H,MAAA,CAASoH,QAAQ,CACxF,CAAC;MACH,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;EANE;IAAAvJ,GAAA;IAAAC,KAAA,EAOA,SAAAyK,gCAAA,EAA0C;MACxC,OAAO,IAAAC,eAAO,EAAC,IAAI,CAACC,oBAAoB,CAACpL,MAAM,EAAE,IAAI,CAACqL,YAAY,CAACrL,MAAM,CAAC;IAC5E;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAQ,GAAA;IAAAC,KAAA,EAKA,SAAA6K,mBAAA,EAA6B;MAC3B,OAAO,IAAAH,eAAO,EAAC,IAAI,CAACC,oBAAoB,EAAE,IAAI,CAACC,YAAY,CAAC;IAC9D;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA7K,GAAA;IAAAC,KAAA,EAKA,SAAA8K,2BAAA,EAAoE;MAAA,IAAAC,qBAAA;MAAA,IAAjCC,wBAAwB,GAAArO,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAA+C,SAAA,GAAA/C,SAAA,MAAG,IAAI;MAChE,IAAI,CAAC+H,aAAa,GAAGuG,WAAW,CAACC,GAAG,CAAC,CAAC,GAAG,IAAI,CAACC,SAAS;MAEvD,IAAI,CAACC,UAAU,CAAC,UAAU,CAAC;MAC3B,IAAI,CAACA,UAAU,CAAC,kBAAkB,CAAC;MAEnC,IAAI,CAACf,sBAAsB,CAAC,CAAC;MAC7B,CAAAU,qBAAA,OAAI,CAAC/H,iBAAiB,cAAA+H,qBAAA,uBAAtBA,qBAAA,CAAwBM,OAAO,CAAC,CAAC;MAEjC,IAAIL,wBAAwB,EAAE;QAC5B,IAAMM,oBAAoB,GAAG,IAAI,CAACrB,4BAA4B,CAAC,CAAC;QAChE,IAAI,IAAI,CAAC1I,mBAAmB,IAAI+J,oBAAoB,GAAG,IAAI,CAAC/J,mBAAmB,EAAE;UAC/EQ,oBAAW,CAACC,MAAM,CAACwI,GAAG,uFAAAtI,MAAA,CACkEoJ,oBAAoB,SAAApJ,MAAA,CAAM,IAAI,CAACX,mBAAmB,mCAC1I,CAAC;UACD,IAAI,CAAC6D,0BAA0B,CAAC,CAAC;QACnC;MACF;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAArF,GAAA;IAAAC,KAAA,EAKA,SAAAuL,yBAAA,EAAmC;MACjC,IAAA3E,OAAA,CAAA5J,OAAA,EAAc,IAAI,CAAC6C,mBAAmB,CAAC,CAAC/C,OAAO,CAAC,UAAC+C,mBAAmB,EAAK;QACvEA,mBAAmB,CAAC2L,KAAK,CAAC,CAAC;MAC7B,CAAC,CAAC;IACJ;;IAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;EAPE;IAAAzL,GAAA;IAAAC,KAAA,EAQA,SAAAyL,cACE/F,OAAkE,EAClE4D,QAAgC,EAChCzC,WAAoB,EACpB;MACA,IAAM6E,MAAM,GAAGhG,OAAO,CACnBrJ,MAAM,CAAC,UAACsB,MAAM;QAAA,OAAKA,MAAM,CAACkJ,WAAW,KAAKA,WAAW;MAAA,EAAC,CACtDxK,MAAM,CAAC,UAACsB,MAAM;QAAA,OAAKA,MAAM,CAAC2L,QAAQ,CAAC,CAAC3L,MAAM,KAAK,WAAW;MAAA,EAAC,CAC3DgO,GAAG,CAAC,UAAChO,MAAM;QAAA,OAAKA,MAAM,CAAC2L,QAAQ,CAAC,CAAC5B,qBAAqB;MAAA,EAAC;MAE1D,IAAIgE,MAAM,CAAC9O,MAAM,KAAK,CAAC,EAAE;QACvB,OAAO;UACLgP,GAAG,EAAE,CAAC,CAAC;UACPC,GAAG,EAAE,CAAC,CAAC;UACPC,OAAO,EAAE,CAAC;QACZ,CAAC;MACH;MAEA,OAAO;QACLF,GAAG,EAAEG,IAAI,CAACH,GAAG,CAAAnP,KAAA,CAARsP,IAAI,MAAAC,mBAAA,CAAAhP,OAAA,EAAQ0O,MAAM,EAAC;QACxBG,GAAG,EAAEE,IAAI,CAACF,GAAG,CAAApP,KAAA,CAARsP,IAAI,MAAAC,mBAAA,CAAAhP,OAAA,EAAQ0O,MAAM,EAAC;QACxBI,OAAO,EAAE,IAAAG,YAAI,EAACP,MAAM;MACtB,CAAC;IACH;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAA3L,GAAA;IAAAC,KAAA;MAAA,IAAAkM,WAAA,OAAAhM,kBAAA,CAAAlD,OAAA,gBAAAmD,YAAA,CAAAnD,OAAA,CAAAoD,IAAA,CAKA,SAAA+L,UAAA;QAAA,IAAAzG,OAAA,EAAAH,KAAA;QAAA,OAAApF,YAAA,CAAAnD,OAAA,CAAA8D,IAAA,UAAAsL,WAAAC,UAAA;UAAA,kBAAAA,UAAA,CAAApL,IAAA,GAAAoL,UAAA,CAAAnL,IAAA;YAAA;cACQwE,OAAO,GAAG,EAAE;cAElB,IAAAkB,OAAA,CAAA5J,OAAA,EAAc,IAAI,CAAC6C,mBAAmB,CAAC,CAAC/C,OAAO,CAAC,UAAC+C,mBAAmB,EAAK;gBACvE6F,OAAO,CAAClJ,IAAI,CAAAE,aAAA,CAAAA,aAAA,KACPmD,mBAAmB,CAACkK,SAAS,CAAC,CAAC;kBAClClD,WAAW,EAAEhH,mBAAmB,CAACgH;gBAAW,EAC7C,CAAC;cACJ,CAAC,CAAC;cAEItB,KAAK,GAAG;gBACZ+G,GAAG,EAAE;kBACHhN,GAAG,EAAE,IAAI,CAACmM,aAAa,CAAC/F,OAAO,EAAE,KAAK,EAAE,IAAI;gBAC9C,CAAC;gBACDnG,MAAM,EAAE;kBACND,GAAG,EAAE,IAAI,CAACmM,aAAa,CAAC/F,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC;kBAC9ClG,GAAG,EAAE,IAAI,CAACiM,aAAa,CAAC/F,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC;kBAC9CjG,IAAI,EAAE,IAAI,CAACgM,aAAa,CAAC/F,OAAO,EAAE,MAAM,EAAE,KAAK;gBACjD,CAAC;gBACD6G,KAAK,EAAE;kBACL;kBACAC,SAAS,EAAE,IAAI,CAACzN,KAAK,CAAC6D,QAAQ,CAACC,MAAM,CAACC,iBAAiB,CAAC0J,SAAS;kBACjE;kBACAC,SAAS,EAAE,IAAI,CAAC1N,KAAK,CAAC6D,QAAQ,CAACC,MAAM,CAACC,iBAAiB,CAAC2J,SAAS;kBACjE;kBACAC,SAAS,EAAE,IAAI,CAAC3N,KAAK,CAAC6D,QAAQ,CAACC,MAAM,CAACC,iBAAiB,CAAC4J,SAAS;kBACjE;kBACAC,SAAS,EAAE,IAAI,CAAC5N,KAAK,CAAC6D,QAAQ,CAACC,MAAM,CAACC,iBAAiB,CAAC6J;gBAC1D,CAAC;gBACDrM,OAAO,EAAE,IAAI,CAACqC;cAChB,CAAC;cACDiK,gBAAO,CAACC,oBAAoB,CAC1BC,mBAAkB,CAACC,sBAAsB,EACzCH,gBAAO,CAACI,mBAAmB,CAACzH,KAAK,CACnC,CAAC;YAAC;YAAA;cAAA,OAAA8G,UAAA,CAAAlK,IAAA;UAAA;QAAA,GAAAgK,SAAA;MAAA,CACH;MAAA,SAAAc,WAAA;QAAA,OAAAf,WAAA,CAAAzP,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAsQ,UAAA;IAAA;IAED;AACF;AACA;AACA;AACA;IAJE;EAAA;IAAAlN,GAAA;IAAAC,KAAA,EAKA,SAAAkN,YAAA,EAAsB;MAAA,IAAAC,MAAA;MACpB,IAAI,CAACC,QAAQ,GAAGC,UAAU,CAAC,YAAM;QAC/BF,MAAI,CAACC,QAAQ,GAAG1N,SAAS;QACzB;QACA;QACA,IAAIyN,MAAI,CAAC1C,+BAA+B,CAAC,CAAC,EAAE;UAC1C1I,oBAAW,CAACC,MAAM,CAACwI,GAAG,CACpB,gFACF,CAAC;UAED2C,MAAI,CAACrC,0BAA0B,CAAC,CAAC;QACnC;MACF,CAAC,EAAEtM,kBAAkB,GAAG,IAAI,CAAC;MAE7B,IAAI,CAAC8O,gBAAgB,GAAGD,UAAU,CAAC,YAAM;QACvCF,MAAI,CAACG,gBAAgB,GAAG5N,SAAS;QAEjCqC,oBAAW,CAACC,MAAM,CAACwI,GAAG,sEAAAtI,MAAA,CACiD3D,eAAe,OACtF,CAAC;;QAED;;QAEA;QACA4O,MAAI,CAACrC,0BAA0B,CAAC,CAAC;MACnC,CAAC,EAAEvM,eAAe,GAAG,IAAI,CAAC;MAE1B,IAAI,CAACgP,YAAY,GAAGF,UAAU,CAAC,YAAM;QACnCF,MAAI,CAACI,YAAY,GAAG7N,SAAS;QAC7ByN,MAAI,CAAC5B,wBAAwB,CAAC,CAAC;QAC/B4B,MAAI,CAACK,IAAI,CACP;UACEC,IAAI,EAAE,cAAc;UACpBC,QAAQ,EAAE;QACZ,CAAC,EACD,mBAAmB,EACnB,CAAC,CACH,CAAC;QACDP,MAAI,CAACF,UAAU,CAAC,CAAC;QAEjBlL,oBAAW,CAACC,MAAM,CAACwI,GAAG,4EAAAtI,MAAA,CACuDzD,eAAe,OAC5F,CAAC;MACH,CAAC,EAAEA,eAAe,GAAG,IAAI,CAAC;IAC5B;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAsB,GAAA;IAAAC,KAAA;MAAA,IAAA2N,aAAA,OAAAzN,kBAAA,CAAAlD,OAAA,gBAAAmD,YAAA,CAAAnD,OAAA,CAAAoD,IAAA,CAMA,SAAAwN,UAA2BlI,OAA4B;QAAA,OAAAvF,YAAA,CAAAnD,OAAA,CAAA8D,IAAA,UAAA+M,WAAAC,UAAA;UAAA,kBAAAA,UAAA,CAAA7M,IAAA,GAAA6M,UAAA,CAAA5M,IAAA;YAAA;cAAA4M,UAAA,CAAA5M,IAAA;cAAA,OAE/C,IAAI,CAACnC,KAAK,CAAC0C,cAAc,CAACC,GAAG,CACjC,IAAI,CAACtC,SAAS,EACdD,uBAAY,CAACwH,kBAAkB,EAC/B,IAAA/E,UAAA,CAAA5E,OAAA,EAAe0I,OAAO,CACxB,CAAC;YAAA;YAAA;cAAA,OAAAoI,UAAA,CAAA3L,IAAA;UAAA;QAAA,GAAAyL,SAAA;MAAA,CACF;MAAA,SAAAG,aAAAC,GAAA;QAAA,OAAAL,aAAA,CAAAlR,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAoR,YAAA;IAAA;IAED;AACF;AACA;AACA;AACA;IAJE;EAAA;IAAAhO,GAAA;IAAAC,KAAA,EAKA,SAAAiO,oBAAA,EAA8B;MAC5B,IAAI,CAACtD,oBAAoB,CAACtL,SAAS,CAACC,GAAG,GAAG,CAAC;MAC3C,IAAI,CAACqL,oBAAoB,CAACpL,MAAM,CAACD,GAAG,GAAG,CAAC;MACxC,IAAI,CAACqL,oBAAoB,CAACpL,MAAM,CAACC,GAAG,GAAG,CAAC;MACxC,IAAI,CAACmL,oBAAoB,CAACpL,MAAM,CAACE,IAAI,GAAG,CAAC;MAEzC,IAAI,CAACmL,YAAY,CAACvL,SAAS,CAACC,GAAG,GAAG,CAAC;MACnC,IAAI,CAACsL,YAAY,CAACrL,MAAM,CAACD,GAAG,GAAG,CAAC;MAChC,IAAI,CAACsL,YAAY,CAACrL,MAAM,CAACC,GAAG,GAAG,CAAC;MAChC,IAAI,CAACoL,YAAY,CAACrL,MAAM,CAACE,IAAI,GAAG,CAAC;IACnC;;IAEA;AACF;AACA;AACA;AACA;AACA;EALE;IAAAM,GAAA;IAAAC,KAAA,EAMA,SAAAoL,WAAmB8C,KAAa,EAAE;MAChC,IAAI,IAAI,CAACA,KAAK,CAAC,EAAE;QACfC,YAAY,CAAC,IAAI,CAACD,KAAK,CAAC,CAAC;QACzB,IAAI,CAACA,KAAK,CAAC,GAAGxO,SAAS;MACzB;IACF;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAK,GAAA;IAAAC,KAAA,EAKA,SAAAmF,mBAAA,EAA6B;MAC3B,IAAI,CAACiG,UAAU,CAAC,UAAU,CAAC;MAC3B,IAAI,CAACA,UAAU,CAAC,kBAAkB,CAAC;MACnC,IAAI,CAACA,UAAU,CAAC,cAAc,CAAC;MAE/B,IAAI,CAACG,wBAAwB,CAAC,CAAC;IACjC;;IAEA;AACF;AACA;AACA;AACA;EAJE;IAAAxL,GAAA;IAAAC,KAAA;MAAA,IAAAoO,0BAAA,OAAAlO,kBAAA,CAAAlD,OAAA,gBAAAmD,YAAA,CAAAnD,OAAA,CAAAoD,IAAA,CAKA,SAAAiO,UAAwCC,WAAwB;QAAA,IAAAC,MAAA;QAAA,IAAA7I,OAAA,EAAA8I,aAAA;QAAA,OAAArO,YAAA,CAAAnD,OAAA,CAAA8D,IAAA,UAAA2N,WAAAC,UAAA;UAAA,kBAAAA,UAAA,CAAAzN,IAAA,GAAAyN,UAAA,CAAAxN,IAAA;YAAA;cACxDwE,OAA4B,GAAG,CAAC,CAAC;cAEvC,IAAI,CAAC7F,mBAAmB,GAAG,CAAC,CAAC;cAE7B,IAAI,CAACsL,SAAS,GAAGF,WAAW,CAACC,GAAG,CAAC,CAAC;cAElCnJ,oBAAW,CAACC,MAAM,CAACwI,GAAG,8DAAAtI,MAAA;cAElB;cACA,IAAI,CAACnD,KAAK,CAAC4P,MAAM,CAACC,QAAQ,CAACC,YAAY,CAACC,qBAAqB,GAAG,MAAM,GAAG,EAAE,EAAA5M,MAAA;cAE3E;cACA,IAAI,CAACnD,KAAK,CAAC4P,MAAM,CAACC,QAAQ,CAACC,YAAY,CAACE,qBAAqB,GAAG,MAAM,GAAG,EAAE,yBAE/E,CAAC;cAED,IAAI,CAACd,mBAAmB,CAAC,CAAC;;cAE1B;cACA,IAAA5E,KAAA,CAAArM,OAAA,EAAYsR,WAAW,CAAC,CAACxR,OAAO,CAAC,UAACiD,GAAG,EAAK;gBACxC,IAAMiP,OAAO,GAAGV,WAAW,CAACvO,GAAG,CAAC;;gBAEhC;gBACA,IAAMkP,sBAAsB;gBAC1B;gBACAV,MAAI,CAACxP,KAAK,CAAC4P,MAAM,CAACC,QAAQ,CAACC,YAAY,CAACC,qBAAqB,IAAI,CAACE,OAAO,CAACnI,WAAW;gBAEvF,IAAI,CAACoI,sBAAsB,EAAE;kBAC3BD,OAAO,CAACxP,GAAG,GAAG,EAAE;gBAClB;;gBAEA;gBACA,IAAM0P,sBAAsB;gBAC1B;gBACAX,MAAI,CAACxP,KAAK,CAAC4P,MAAM,CAACC,QAAQ,CAACC,YAAY,CAACE,qBAAqB,IAAI,CAACC,OAAO,CAACnI,WAAW;gBAEvF,IAAI,CAACqI,sBAAsB,EAAE;kBAC3BF,OAAO,CAACvP,IAAI,GAAG,EAAE;gBACnB;;gBAEA;gBACAiG,OAAO,CAAC3F,GAAG,CAAC,GAAG;kBACbT,GAAG,EAAE;oBAAC3B,MAAM,EAAEqR,OAAO,CAAC1P,GAAG,CAAC1C,MAAM,GAAG,CAAC,GAAG,aAAa,GAAG;kBAAU,CAAC;kBAClE4C,GAAG,EAAE;oBAAC7B,MAAM,EAAEqR,OAAO,CAACxP,GAAG,CAAC5C,MAAM,GAAG,CAAC,GAAG,aAAa,GAAG;kBAAU,CAAC;kBAClE6C,IAAI,EAAE;oBAAC9B,MAAM,EAAEqR,OAAO,CAACvP,IAAI,CAAC7C,MAAM,GAAG,CAAC,GAAG,aAAa,GAAG;kBAAU,CAAC;kBACpEiK,WAAW,EAAEmI,OAAO,CAACnI;gBACvB,CAAC;;gBAED;gBACA0H,MAAI,CAAC5D,oBAAoB,CAACqE,OAAO,CAACnI,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC,CAACvH,GAAG,IACzE0P,OAAO,CAAC1P,GAAG,CAAC1C,MAAM;gBACpB,IAAI,CAACoS,OAAO,CAACnI,WAAW,EAAE;kBACxB0H,MAAI,CAAC5D,oBAAoB,CAACpL,MAAM,CAACC,GAAG,IAAIwP,OAAO,CAACxP,GAAG,CAAC5C,MAAM;kBAC1D2R,MAAI,CAAC5D,oBAAoB,CAACpL,MAAM,CAACE,IAAI,IAAIuP,OAAO,CAACvP,IAAI,CAAC7C,MAAM;gBAC9D;cACF,CAAC,CAAC;cAEI4R,aAAa,GAAG;gBACpBlP,GAAG,EAAE,IAAI;gBACTE,GAAG,EAAE,IAAI;gBACTC,IAAI,EAAE;cACR,CAAC,EAED;cAAAiP,UAAA,CAAAxN,IAAA;cAAA,OACM,IAAI,CAAC6M,YAAY,CAACrI,OAAO,CAAC;YAAA;cAAA,MAE5B,CAAC4I,WAAW,IAAI,CAAC,IAAAjF,KAAA,CAAArM,OAAA,EAAYsR,WAAW,CAAC,CAAC1R,MAAM;gBAAA8R,UAAA,CAAAxN,IAAA;gBAAA;cAAA;cAClD;cACA,IAAI,CAAC4J,0BAA0B,CAAC,KAAK,CAAC;cAEtC,IAAI,CAAC0C,IAAI,CACP;gBACEC,IAAI,EAAE,cAAc;gBACpBC,QAAQ,EAAE;cACZ,CAAC,EACD,mBAAmB,EACnB,CAAC,CACH,CAAC;cAAC,OAAAgB,UAAA,CAAA7M,MAAA;YAAA;cAKJ,IAAI,CAACqL,WAAW,CAAC,CAAC;;cAElB;cACA,IAAA7D,KAAA,CAAArM,OAAA,EAAYsR,WAAW,CAAC,CAACxR,OAAO,CAAC,UAACiD,GAAG,EAAK;gBACxC,IAAMiP,OAAO,GAAGV,WAAW,CAACvO,GAAG,CAAC;gBAEhCwO,MAAI,CAAC1O,mBAAmB,CAACE,GAAG,CAAC,GAAG,IAAIoP,wCAAmB,CAACpP,GAAG,EAAEiP,OAAO,CAAC;gBACrET,MAAI,CAAC1O,mBAAmB,CAACE,GAAG,CAAC,CAACqP,EAAE,CAACC,2BAAM,CAACC,WAAW;kBAAA,IAAAC,KAAA,OAAArP,kBAAA,CAAAlD,OAAA,gBAAAmD,YAAA,CAAAnD,OAAA,CAAAoD,IAAA,CAAE,SAAAoP,UAAOC,IAAqB;oBAAA,IAAAnG,QAAA,EAAA3L,MAAA,EAAA+R,cAAA,EAAAhI,qBAAA,EAAAmD,kBAAA;oBAAA,OAAA1K,YAAA,CAAAnD,OAAA,CAAA8D,IAAA,UAAA6O,WAAAC,UAAA;sBAAA,kBAAAA,UAAA,CAAA3O,IAAA,GAAA2O,UAAA,CAAA1O,IAAA;wBAAA;0BACxEoI,QAAQ,GAAmDmG,IAAI,CAA/DnG,QAAQ,EAAE3L,MAAM,GAA2C8R,IAAI,CAArD9R,MAAM,EAAE+R,cAAc,GAA2BD,IAAI,CAA7CC,cAAc,EAAEhI,qBAAqB,GAAI+H,IAAI,CAA7B/H,qBAAqB;0BAE9D,IAAI8G,aAAa,CAAClF,QAAQ,CAAC,EAAE;4BAC3BiF,MAAI,CAACf,IAAI,CACP;8BACEC,IAAI,EAAE,cAAc;8BACpBC,QAAQ,EAAE;4BACZ,CAAC,EACD,mCAAmC,EACnC;8BACEpE,QAAQ,EAARA;4BACF,CACF,CAAC;4BACDkF,aAAa,CAAClF,QAAQ,CAAC,GAAG,KAAK;0BACjC;0BACAiF,MAAI,CAAC3D,YAAY,CAACoE,OAAO,CAACnI,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC,CAACyC,QAAQ,CAAC,IAAI,CAAC;0BAExEuB,kBAAkB,GAAG0D,MAAI,CAAC1D,kBAAkB,CAAC,CAAC;0BAEpDnF,OAAO,CAAC3F,GAAG,CAAC,CAACuJ,QAAQ,CAAC,CAAC3L,MAAM,GAAGA,MAAM;0BACtC+H,OAAO,CAAC3F,GAAG,CAAC,CAACuJ,QAAQ,CAAC,CAACoG,cAAc,GAAGA,cAAc;0BACtDhK,OAAO,CAAC3F,GAAG,CAAC,CAACuJ,QAAQ,CAAC,CAAC5B,qBAAqB,GAAGA,qBAAqB;0BAACkI,UAAA,CAAA1O,IAAA;0BAAA,OAE/DqN,MAAI,CAACR,YAAY,CAACrI,OAAO,CAAC;wBAAA;0BAEhC,IAAImF,kBAAkB,EAAE;4BACtB0D,MAAI,CAACnD,UAAU,CAAC,cAAc,CAAC;4BAC/BmD,MAAI,CAACf,IAAI,CACP;8BACEC,IAAI,EAAE,cAAc;8BACpBC,QAAQ,EAAE;4BACZ,CAAC,EACD,mBAAmB,EACnB,CAAC,CACH,CAAC;4BACDa,MAAI,CAACtB,UAAU,CAAC,CAAC;4BAEjBlL,oBAAW,CAACC,MAAM,CAACwI,GAAG,gFAEtB,CAAC;4BACD+D,MAAI,CAACzD,0BAA0B,CAAC,CAAC;0BACnC;wBAAC;wBAAA;0BAAA,OAAA8E,UAAA,CAAAzN,IAAA;sBAAA;oBAAA,GAAAqN,SAAA;kBAAA,CACF;kBAAA,iBAAAK,GAAA;oBAAA,OAAAN,KAAA,CAAA9S,KAAA,OAAAE,SAAA;kBAAA;gBAAA,IAAC;;gBAEF;gBACA4R,MAAI,CAAC1O,mBAAmB,CAACE,GAAG,CAAC,CAACqP,EAAE,CAC9BC,2BAAM,CAACS,qBAAqB;kBAAA,IAAAC,KAAA,OAAA7P,kBAAA,CAAAlD,OAAA,gBAAAmD,YAAA,CAAAnD,OAAA,CAAAoD,IAAA,CAC5B,SAAA4P,UAAOP,IAAoC;oBAAA,OAAAtP,YAAA,CAAAnD,OAAA,CAAA8D,IAAA,UAAAmP,WAAAC,UAAA;sBAAA,kBAAAA,UAAA,CAAAjP,IAAA,GAAAiP,UAAA,CAAAhP,IAAA;wBAAA;0BACzCwE,OAAO,CAAC3F,GAAG,CAAC,CAAC0P,IAAI,CAACnG,QAAQ,CAAC,CAACoG,cAAc,GAAGD,IAAI,CAACC,cAAc;0BAACQ,UAAA,CAAAhP,IAAA;0BAAA,OAE3DqN,MAAI,CAACR,YAAY,CAACrI,OAAO,CAAC;wBAAA;wBAAA;0BAAA,OAAAwK,UAAA,CAAA/N,IAAA;sBAAA;oBAAA,GAAA6N,SAAA;kBAAA,CACjC;kBAAA,iBAAAG,GAAA;oBAAA,OAAAJ,KAAA,CAAAtT,KAAA,OAAAE,SAAA;kBAAA;gBAAA,GACH,CAAC;gBAED4R,MAAI,CAAC1O,mBAAmB,CAACE,GAAG,CAAC,CAACqQ,KAAK,CAAC,CAAC,CAAC,CAAC;cACzC,CAAC,CAAC;YAAC;YAAA;cAAA,OAAA1B,UAAA,CAAAvM,IAAA;UAAA;QAAA,GAAAkM,SAAA;MAAA,CACJ;MAAA,SAAAnL,0BAAAmN,GAAA;QAAA,OAAAjC,0BAAA,CAAA3R,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAuG,yBAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;AACA;AACA;IAPE;EAAA;IAAAnD,GAAA;IAAAC,KAAA;MAAA,IAAAsQ,0BAAA,OAAApQ,kBAAA,CAAAlD,OAAA,gBAAAmD,YAAA,CAAAnD,OAAA,CAAAoD,IAAA,CAQA,SAAAmQ,UACEC,aAAsB,EACtBjE,KAAkB;QAAA,IAAAxH,kBAAA;QAAA,OAAA5E,YAAA,CAAAnD,OAAA,CAAA8D,IAAA,UAAA2P,WAAAC,UAAA;UAAA,kBAAAA,UAAA,CAAAzP,IAAA,GAAAyP,UAAA,CAAAxP,IAAA;YAAA;cAAA,IAGb,IAAI,CAACM,iBAAiB;gBAAAkP,UAAA,CAAAxP,IAAA;gBAAA;cAAA;cAAAwP,UAAA,CAAA5O,EAAA,GAEvByK,KAAK;cAAAmE,UAAA,CAAAxP,IAAA;cAAA,OACa,IAAI,CAAC6C,aAAa,CAAC,CAAC;YAAA;cAAA2M,UAAA,CAAAC,EAAA,GAAAD,UAAA,CAAApP,IAAA;cAAAoP,UAAA,CAAAE,EAAA,GACnB,CAACJ,aAAa;cAAA,OAAAE,UAAA,CAAA7O,MAAA;gBAFjC0K,KAAK,EAAAmE,UAAA,CAAA5O,EAAA;gBACLnB,UAAU,EAAA+P,UAAA,CAAAC,EAAA;gBACVE,iBAAiB,EAAAH,UAAA,CAAAE;cAAA;YAAA;cAAAF,UAAA,CAAAxP,IAAA;cAAA,OAOa,IAAI,CAAC0D,qBAAqB,CAAC,CAAC;YAAA;cAAxDG,kBAAkB,GAAA2L,UAAA,CAAApP,IAAA;cAAA,OAAAoP,UAAA,CAAA7O,MAAA,WAAAnF,aAAA;gBAMtB6P,KAAK,EAALA,KAAK;gBACLsE,iBAAiB,EAAE,CAACL;cAAa,GAC9BzL,kBAAkB;YAAA;YAAA;cAAA,OAAA2L,UAAA,CAAAvO,IAAA;UAAA;QAAA,GAAAoO,SAAA;MAAA,CAExB;MAAA,SAAAO,0BAAAC,GAAA,EAAAC,GAAA;QAAA,OAAAV,0BAAA,CAAA7T,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAAmU,yBAAA;IAAA;IAED;AACF;AACA;AACA;AACA;AACA;AACA;IANE;EAAA;IAAA/Q,GAAA;IAAAC,KAAA;MAAA,IAAAiR,oCAAA,OAAA/Q,kBAAA,CAAAlD,OAAA,gBAAAmD,YAAA,CAAAnD,OAAA,CAAAoD,IAAA,CAOA,SAAA8Q,UAAA;QAAA,OAAA/Q,YAAA,CAAAnD,OAAA,CAAA8D,IAAA,UAAAqQ,WAAAC,UAAA;UAAA,kBAAAA,UAAA,CAAAnQ,IAAA,GAAAmQ,UAAA,CAAAlQ,IAAA;YAAA;cAAA,IAEO,IAAI,CAACM,iBAAiB;gBAAA4P,UAAA,CAAAlQ,IAAA;gBAAA;cAAA;cAAA,OAAAkQ,UAAA,CAAAvP,MAAA,WAClB,IAAI,CAACwC,sBAAsB,CAAC,CAAC;YAAA;cAAA,OAAA+M,UAAA,CAAAvP,MAAA,WAM/BnC,SAAS;YAAA;YAAA;cAAA,OAAA0R,UAAA,CAAAjP,IAAA;UAAA;QAAA,GAAA+O,SAAA;MAAA,CACjB;MAAA,SAAAG,oCAAA;QAAA,OAAAJ,oCAAA,CAAAxU,KAAA,OAAAE,SAAA;MAAA;MAAA,OAAA0U,mCAAA;IAAA;EAAA;EAAA,OAAA3S,YAAA;AAAA,EAr7BuC4S,oBAAW"}
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","undefined","reachabilityRequest","ReachabilityRequest","clusterReachability","_createClass2","key","value","_getClusters","_asyncToGenerator2","_regenerator","mark","_callee","trigger","previousReport","isRetry","_yield$this$reachabil","clusters","joinCookie","discoveryOptions","_args","wrap","_callee$","_context","prev","next","getClusters","MeetingUtil","getIpVersion","sent","minRequiredClusters","orpheusApiVersion","boundedStorage","put","localStorageJoinCookie","_stringify","abrupt","t0","LoggerProxy","logger","error","concat","stop","_x","_x2","_gatherReachability","_callee2","_yield$this$getCluste","_callee2$","_context2","lastTrigger","internal","device","ipNetworkDetector","detect","reachabilityDefer","Defer","performReachabilityChecks","promise","gatherReachability","_x3","_getJoinCookie","_callee3","joinCookieRaw","_callee3$","_context3","get","catch","JSON","parse","getJoinCookie","_getReachabilityReport","_callee4","reachabilityResult","_callee4$","_context4","getReachabilityResults","reachability","version","usedDiscoveryOptions","metrics","totalDuration","tests","getReachabilityReport","_gatherReachabilityFallback","_callee5","reachabilityReport","_yield$this$getCluste2","_callee5$","_context5","abortCurrentChecks","gatherReachabilityFallback","stopReachability","overallTimer","log","emit","file","function","sendMetric","resolveReachabilityPromise","_getReachabilityMetrics","_callee6","stats","updateStats","resultsJson","results","_callee6$","_context6","reachability_public_udp_success","reachability_public_udp_failed","reachability_public_tcp_success","reachability_public_tcp_failed","reachability_public_xtls_success","reachability_public_xtls_failed","reachability_vmn_udp_success","reachability_vmn_udp_failed","reachability_vmn_tcp_success","reachability_vmn_tcp_failed","reachability_vmn_xtls_success","reachability_vmn_xtls_failed","clusterType","outcome","localStorageResult","_values","isVideoMesh","warn","getReachabilityMetrics","mapTransportResultToBackendDataFormat","transportResult","output","_i","_Object$entries","_entries","_Object$entries$_i","_slicedToArray2","reachable","untested","latencyInMilliseconds","toString","_getReachabilityResults","_callee7","_this2","allClusterResults","_callee7$","_context7","mapValues","clusterResult","_isAnyPublicClusterReachable","_callee8","reachabilityData","reachabilityResults","_callee8$","_context8","some","_result$udp","_result$tcp","isAnyPublicClusterReachable","_isWebexMediaBackendUnreachable","_callee9","unreachable","protocols","_callee9$","_context9","tested","_keys","protocol","_result$protocol","_result$protocol2","every","isWebexMediaBackendUnreachable","getUnreachableClusters","unreachableList","_ref","_ref2","getResult","name","getNumberOfReachableClusters","count","_ref3","_ref4","logUnreachableClusters","list","_ref5","areAllPublicClusterResultsReady","isEqual","expectedResultsCount","resultsCount","areAllResultsReady","_this$reachabilityDef","checkMinRequiredClusters","performance","now","startTime","clearTimer","resolve","numReachableClusters","abortClusterReachability","abort","getStatistics","values","map","min","max","average","Math","_toConsumableArray2","mean","_sendMetric","_callee10","aborted","_args10","_callee10$","_context10","vmn","ipver","firstIpV4","firstIpV6","firstMdns","totalTime","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","REACHABILITY_COMPLETED","prepareMetricFields","startTimers","_this3","vmnTimer","setTimeout","publicCloudTimer","_storeResults","_callee11","_callee11$","_context11","storeResults","_x4","resetResultCounters","timer","clearTimeout","_performReachabilityChecks","_callee14","clusterList","_this4","isFirstResult","_callee14$","_context14","config","meetings","experimental","enableTcpReachability","enableTlsReachability","cluster","includeTcpReachability","includeTlsReachability","ClusterReachability","on","Events","resultReady","_ref6","_callee12","data","clientMediaIPs","_callee12$","_context12","_x6","clientMediaIpsUpdated","_ref7","_callee13","_callee13$","_context13","_x7","start","_x5","_getClientMediaPreferences","_callee15","isMultistream","_callee15$","_context15","t1","t2","preferTranscoding","getClientMediaPreferences","_x8","_x9","_getReachabilityReportToAttachToRoap","_callee16","_callee16$","_context16","getReachabilityReportToAttachToRoap","EventsScope"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable class-methods-use-this */\nimport {isEqual, mapValues, mean} from 'lodash';\n\nimport {Defer} from '@webex/common';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport MeetingUtil from '../meeting/util';\n\nimport {IP_VERSION, REACHABILITY} from '../constants';\n\nimport ReachabilityRequest, {ClusterList} from './request';\nimport {\n ClusterReachabilityResult,\n TransportResult,\n ClientMediaPreferences,\n ReachabilityMetrics,\n ReachabilityReportV0,\n ReachabilityReportV1,\n ReachabilityResults,\n ReachabilityResultsForBackend,\n TransportResultForBackend,\n GetClustersTrigger,\n} from './reachability.types';\nimport {\n ClientMediaIpsUpdatedEventData,\n ClusterReachability,\n Events,\n ResultEventData,\n} from './clusterReachability';\nimport EventsScope from '../common/events/events-scope';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport Metrics from '../metrics';\n\n// timeouts in seconds\nconst DEFAULT_TIMEOUT = 3;\nconst VIDEO_MESH_TIMEOUT = 1;\nconst OVERALL_TIMEOUT = 15;\n\n/**\n * @class Reachability\n * @export\n */\nexport default class Reachability extends EventsScope {\n namespace = REACHABILITY.namespace;\n webex: object;\n reachabilityRequest: ReachabilityRequest;\n clusterReachability: {\n [key: string]: ClusterReachability;\n };\n\n minRequiredClusters?: number;\n orpheusApiVersion?: number;\n\n reachabilityDefer?: Defer;\n\n vmnTimer?: ReturnType<typeof setTimeout>;\n publicCloudTimer?: ReturnType<typeof setTimeout>;\n overallTimer?: ReturnType<typeof setTimeout>;\n\n expectedResultsCount = {videoMesh: {udp: 0}, public: {udp: 0, tcp: 0, xtls: 0}};\n resultsCount = {videoMesh: {udp: 0}, public: {udp: 0, tcp: 0, xtls: 0}};\n startTime = undefined;\n totalDuration = undefined;\n\n protected lastTrigger?: string;\n\n /**\n * Creates an instance of Reachability.\n * @param {object} webex\n * @memberof Reachability\n */\n constructor(webex: object) {\n super();\n this.webex = webex;\n\n /**\n * internal request object for the server\n * @instance\n * @type {Array}\n * @private\n * @memberof Reachability\n */\n this.reachabilityRequest = new ReachabilityRequest(this.webex);\n\n this.clusterReachability = {};\n }\n\n /**\n * Fetches the list of media clusters from the backend\n * @param {string} trigger - explains the reason for starting reachability, used by Orpheus\n * @param {Object} previousReport - last reachability report\n * @param {boolean} isRetry\n * @private\n * @returns {Promise<{clusters: ClusterList, joinCookie: any}>}\n */\n async getClusters(\n trigger: GetClustersTrigger,\n previousReport?: any,\n isRetry = false\n ): Promise<{\n clusters: ClusterList;\n joinCookie: any;\n }> {\n try {\n const {clusters, joinCookie, discoveryOptions} = await this.reachabilityRequest.getClusters(\n trigger,\n MeetingUtil.getIpVersion(this.webex),\n previousReport\n );\n\n this.minRequiredClusters = discoveryOptions?.['early-call-min-clusters'];\n this.orpheusApiVersion = discoveryOptions?.['report-version'];\n\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageJoinCookie,\n JSON.stringify(joinCookie)\n );\n\n return {clusters, joinCookie};\n } catch (error) {\n if (isRetry) {\n throw error;\n }\n\n LoggerProxy.logger.error(\n `Reachability:index#getClusters --> Failed with error: ${error}, retrying...`\n );\n\n return this.getClusters(trigger, previousReport, true);\n }\n }\n\n /**\n * Gets a list of media clusters from the backend and performs reachability checks on all the clusters\n * @param {string} trigger - explains the reason for starting reachability\n * @returns {Promise<ReachabilityResults>} reachability results\n * @public\n * @memberof Reachability\n */\n public async gatherReachability(trigger: string): Promise<ReachabilityResults> {\n // Fetch clusters and measure latency\n try {\n this.lastTrigger = trigger;\n\n // kick off ip version detection. We don't await it, as we don't want to waste time\n // and if it fails, that's ok we can still carry on\n // @ts-ignore\n this.webex.internal.device.ipNetworkDetector.detect(true);\n\n const {clusters} = await this.getClusters('startup');\n\n this.reachabilityDefer = new Defer();\n\n // Perform Reachability Check\n await this.performReachabilityChecks(clusters);\n\n return this.reachabilityDefer.promise;\n } catch (error) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachability --> Error:`, error);\n\n return {};\n }\n }\n\n /**\n * Gets the last join cookie we got from Orpheus\n *\n * @returns {Promise<Object>} join cookie\n */\n async getJoinCookie() {\n // @ts-ignore\n const joinCookieRaw = await this.webex.boundedStorage\n .get(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie)\n .catch(() => {});\n\n let joinCookie;\n\n if (joinCookieRaw) {\n try {\n joinCookie = JSON.parse(joinCookieRaw);\n } catch (e) {\n LoggerProxy.logger.error(\n `MeetingRequest#constructor --> Error in parsing join cookie data: ${e}`\n );\n }\n }\n\n return joinCookie;\n }\n\n /**\n * Returns the reachability report that needs to be attached to the ROAP messages\n * that we send to the backend.\n *\n * @returns {Promise<Object>}\n */\n async getReachabilityReport(): Promise<\n | {\n joinCookie: any;\n reachability?: ReachabilityReportV1;\n }\n | {\n reachability: ReachabilityReportV0;\n }\n > {\n const reachabilityResult = await this.getReachabilityResults();\n const joinCookie = await this.getJoinCookie();\n\n // Orpheus API version 0\n if (!this.orpheusApiVersion) {\n return {\n reachability: reachabilityResult,\n };\n }\n\n // Orpheus API version 1\n return {\n reachability: {\n version: 1,\n result: {\n usedDiscoveryOptions: {\n 'early-call-min-clusters': this.minRequiredClusters,\n },\n metrics: {\n 'total-duration-ms': this.totalDuration,\n },\n tests: reachabilityResult,\n },\n },\n joinCookie,\n };\n }\n\n /**\n * This method is called when we don't succeed in reaching the minimum number of clusters\n * required by Orpheus. It sends the results to Orpheus and gets a new list that it tries to reach again.\n * @returns {Promise<ReachabilityResults>} reachability results\n * @public\n * @memberof Reachability\n */\n public async gatherReachabilityFallback(): Promise<void> {\n try {\n const reachabilityReport = await this.getReachabilityReport();\n\n const {clusters} = await this.getClusters('early-call/no-min-reached', reachabilityReport);\n\n // stop all previous reachability checks that might still be going on in the background\n this.abortCurrentChecks();\n\n // Perform Reachability Check\n await this.performReachabilityChecks(clusters);\n } catch (error) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachabilityFallback --> Error:`, error);\n }\n }\n\n /**\n * Stops all reachability checks that are in progress\n * @public\n * @memberof Reachability\n * @returns {void}\n */\n public stopReachability() {\n // overallTimer is always there only if there is reachability in progress\n if (this.overallTimer) {\n LoggerProxy.logger.log(\n 'Reachability:index#stopReachability --> stopping reachability checks'\n );\n this.abortCurrentChecks();\n this.emit(\n {\n file: 'reachability',\n function: 'stopReachability',\n },\n 'reachability:stopped',\n {}\n );\n this.sendMetric(true);\n this.resolveReachabilityPromise();\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 'Reachability:index#getReachabilityResults --> Error parsing reachability data: ',\n e\n );\n }\n\n return results;\n }\n\n /**\n * fetches reachability data and checks for cluster reachability\n * @returns {boolean}\n * @public\n * @memberof Reachability\n */\n async isAnyPublicClusterReachable() {\n let reachable = false;\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);\n\n reachable = Object.values(reachabilityResults).some(\n (result) =>\n !result.isVideoMesh &&\n (result.udp?.result === 'reachable' || result.tcp?.result === 'reachable')\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Reachability:index#isAnyPublicClusterReachable --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return reachable;\n }\n\n /**\n * Returns true only if ALL protocols (UDP, TCP and TLS) have been tested and none\n * of the media clusters where reachable with any of the protocols. This is done\n * irrespective of the config, so for example:\n * if config.meetings.experimental.enableTlsReachability === false,\n * it will return false, because TLS reachability won't be tested,\n * so we can't say for sure that media backend is unreachable over TLS.\n *\n * @returns {boolean}\n */\n async isWebexMediaBackendUnreachable() {\n let unreachable = false;\n\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);\n\n const protocols = {\n udp: {tested: false, reachable: undefined},\n tcp: {tested: false, reachable: undefined},\n xtls: {tested: false, reachable: undefined},\n };\n\n Object.values(reachabilityResults).forEach((result) => {\n Object.keys(protocols).forEach((protocol) => {\n if (\n result[protocol]?.result === 'reachable' ||\n result[protocol]?.result === 'unreachable'\n ) {\n protocols[protocol].tested = true;\n\n // we need at least 1 'reachable' result to mark the whole protocol as reachable\n if (result[protocol].result === 'reachable') {\n protocols[protocol].reachable = true;\n }\n }\n });\n });\n\n unreachable = Object.values(protocols).every(\n (protocol) => protocol.tested && !protocol.reachable\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Reachability:index#isWebexMediaBackendUnreachable --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return unreachable;\n }\n\n /**\n * Get list of all unreachable clusters\n * @returns {array} Unreachable clusters\n * @private\n * @memberof Reachability\n */\n private getUnreachableClusters(): Array<{name: string; protocol: string}> {\n const unreachableList = [];\n\n Object.entries(this.clusterReachability).forEach(([key, clusterReachability]) => {\n const result = clusterReachability.getResult();\n\n if (result.udp.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'udp'});\n }\n if (result.tcp.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'tcp'});\n }\n if (result.xtls.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'xtls'});\n }\n });\n\n return unreachableList;\n }\n\n /**\n * Gets the number of reachable clusters from last run reachability check\n * @returns {number} reachable clusters count\n * @private\n * @memberof Reachability\n */\n private getNumberOfReachableClusters(): number {\n let count = 0;\n\n Object.entries(this.clusterReachability).forEach(([key, clusterReachability]) => {\n const result = clusterReachability.getResult();\n\n if (\n result.udp.result === 'reachable' ||\n result.tcp.result === 'reachable' ||\n result.xtls.result === 'reachable'\n ) {\n count += 1;\n }\n });\n\n return count;\n }\n\n /**\n * Make a log of unreachable clusters.\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private logUnreachableClusters() {\n const list = this.getUnreachableClusters();\n\n list.forEach(({name, protocol}) => {\n LoggerProxy.logger.log(\n `Reachability:index#logUnreachableClusters --> failed to reach ${name} over ${protocol}`\n );\n });\n }\n\n /**\n * Returns true if we've obtained all the reachability results for all the public clusters\n * In other words, it means that all public clusters are reachable over each protocol,\n * because we only get a \"result\" if we managed to reach a cluster\n *\n * @returns {boolean}\n */\n private areAllPublicClusterResultsReady() {\n return isEqual(this.expectedResultsCount.public, this.resultsCount.public);\n }\n\n /**\n * Returns true if we've obtained all the reachability results for all the clusters\n *\n * @returns {boolean}\n */\n private areAllResultsReady() {\n return isEqual(this.expectedResultsCount, this.resultsCount);\n }\n\n /**\n * Resolves the promise returned by gatherReachability() method\n * @param {boolean} checkMinRequiredClusters - if true, it will check if we have reached the minimum required clusters and do a fallback if needed\n * @returns {void}\n */\n private resolveReachabilityPromise(checkMinRequiredClusters = true) {\n this.totalDuration = performance.now() - this.startTime;\n\n this.clearTimer('vmnTimer');\n this.clearTimer('publicCloudTimer');\n\n this.logUnreachableClusters();\n this.reachabilityDefer?.resolve();\n\n if (checkMinRequiredClusters) {\n const numReachableClusters = this.getNumberOfReachableClusters();\n if (this.minRequiredClusters && numReachableClusters < this.minRequiredClusters) {\n LoggerProxy.logger.log(\n `Reachability:index#resolveReachabilityPromise --> minRequiredClusters not reached (${numReachableClusters} < ${this.minRequiredClusters}), doing reachability fallback`\n );\n this.gatherReachabilityFallback();\n }\n }\n }\n\n /**\n * Aborts all cluster reachability checks that are in progress\n *\n * @returns {void}\n */\n private abortClusterReachability() {\n Object.values(this.clusterReachability).forEach((clusterReachability) => {\n clusterReachability.abort();\n });\n }\n\n /**\n * Helper function for calculating min/max/average values of latency\n *\n * @param {Array<any>} results\n * @param {string} protocol\n * @param {boolean} isVideoMesh\n * @returns {{min:number, max: number, average: number}}\n */\n protected getStatistics(\n results: Array<ClusterReachabilityResult & {isVideoMesh: boolean}>,\n protocol: 'udp' | 'tcp' | 'xtls',\n isVideoMesh: boolean\n ) {\n const values = results\n .filter((result) => result.isVideoMesh === isVideoMesh)\n .filter((result) => result[protocol].result === 'reachable')\n .map((result) => result[protocol].latencyInMilliseconds);\n\n if (values.length === 0) {\n return {\n min: -1,\n max: -1,\n average: -1,\n };\n }\n\n return {\n min: Math.min(...values),\n max: Math.max(...values),\n average: mean(values),\n };\n }\n\n /**\n * Sends a metric with all the statistics about how long reachability took\n *\n * @param {boolean} aborted true if the reachability checks were aborted\n * @returns {void}\n */\n protected async sendMetric(aborted = false) {\n const results = [];\n\n Object.values(this.clusterReachability).forEach((clusterReachability) => {\n results.push({\n ...clusterReachability.getResult(),\n isVideoMesh: clusterReachability.isVideoMesh,\n });\n });\n\n const stats = {\n aborted,\n vmn: {\n udp: this.getStatistics(results, 'udp', true),\n },\n public: {\n udp: this.getStatistics(results, 'udp', false),\n tcp: this.getStatistics(results, 'tcp', false),\n xtls: this.getStatistics(results, 'xtls', false),\n },\n ipver: {\n // @ts-ignore\n firstIpV4: this.webex.internal.device.ipNetworkDetector.firstIpV4,\n // @ts-ignore\n firstIpV6: this.webex.internal.device.ipNetworkDetector.firstIpV6,\n // @ts-ignore\n firstMdns: this.webex.internal.device.ipNetworkDetector.firstMdns,\n // @ts-ignore\n totalTime: this.webex.internal.device.ipNetworkDetector.totalTime,\n },\n trigger: this.lastTrigger,\n };\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.REACHABILITY_COMPLETED,\n Metrics.prepareMetricFields(stats)\n );\n }\n\n /**\n * Starts all the timers used for various timeouts\n *\n * @returns {void}\n */\n private startTimers() {\n this.vmnTimer = setTimeout(() => {\n this.vmnTimer = undefined;\n // if we are only missing VMN results, then we don't want to wait for them any longer\n // as they are likely to fail if users are not on corporate network\n if (this.areAllPublicClusterResultsReady()) {\n LoggerProxy.logger.log(\n 'Reachability:index#startTimers --> Reachability checks timed out (VMN timeout)'\n );\n\n this.resolveReachabilityPromise();\n }\n }, VIDEO_MESH_TIMEOUT * 1000);\n\n this.publicCloudTimer = setTimeout(() => {\n this.publicCloudTimer = undefined;\n\n LoggerProxy.logger.log(\n `Reachability:index#startTimers --> Reachability checks timed out (${DEFAULT_TIMEOUT}s)`\n );\n\n // check against minimum required clusters, do a new call if we don't have enough\n\n // resolve the promise, so that the client won't be blocked waiting on meetings.register() for too long\n this.resolveReachabilityPromise();\n }, DEFAULT_TIMEOUT * 1000);\n\n this.overallTimer = setTimeout(() => {\n this.overallTimer = undefined;\n this.abortClusterReachability();\n this.emit(\n {\n file: 'reachability',\n function: 'overallTimer timeout',\n },\n 'reachability:done',\n {}\n );\n this.sendMetric();\n\n LoggerProxy.logger.log(\n `Reachability:index#startTimers --> Reachability checks fully timed out (${OVERALL_TIMEOUT}s)`\n );\n }, OVERALL_TIMEOUT * 1000);\n }\n\n /**\n * Stores given reachability results in local storage\n *\n * @param {ReachabilityResults} results\n * @returns {Promise<void>}\n */\n private async storeResults(results: ReachabilityResults) {\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageResult,\n JSON.stringify(results)\n );\n }\n\n /**\n * Resets all the internal counters that keep track of the results\n *\n * @returns {void}\n */\n private resetResultCounters() {\n this.expectedResultsCount.videoMesh.udp = 0;\n this.expectedResultsCount.public.udp = 0;\n this.expectedResultsCount.public.tcp = 0;\n this.expectedResultsCount.public.xtls = 0;\n\n this.resultsCount.videoMesh.udp = 0;\n this.resultsCount.public.udp = 0;\n this.resultsCount.public.tcp = 0;\n this.resultsCount.public.xtls = 0;\n }\n\n /**\n * Clears the timer\n *\n * @param {string} timer name of the timer to clear\n * @returns {void}\n */\n private clearTimer(timer: string) {\n if (this[timer]) {\n clearTimeout(this[timer]);\n this[timer] = undefined;\n }\n }\n\n /**\n * Aborts current checks that are in progress\n *\n * @returns {void}\n */\n private abortCurrentChecks() {\n this.clearTimer('vmnTimer');\n this.clearTimer('publicCloudTimer');\n this.clearTimer('overallTimer');\n\n this.abortClusterReachability();\n }\n\n /**\n * Performs reachability checks for all clusters\n * @param {ClusterList} clusterList\n * @returns {Promise<void>} promise that's resolved as soon as the checks are started\n */\n private async performReachabilityChecks(clusterList: ClusterList) {\n const results: ReachabilityResults = {};\n\n this.clusterReachability = {};\n\n this.startTime = performance.now();\n\n LoggerProxy.logger.log(\n `Reachability:index#performReachabilityChecks --> doing UDP${\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTcpReachability ? ',TCP' : ''\n }${\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTlsReachability ? ',TLS' : ''\n } reachability checks`\n );\n\n this.resetResultCounters();\n\n // sanitize the urls in the clusterList\n Object.keys(clusterList).forEach((key) => {\n const cluster = clusterList[key];\n\n // Linus doesn't support TCP reachability checks on video mesh nodes\n const includeTcpReachability =\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTcpReachability && !cluster.isVideoMesh;\n\n if (!includeTcpReachability) {\n cluster.tcp = [];\n }\n\n // Linus doesn't support xTLS reachability checks on video mesh nodes\n const includeTlsReachability =\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTlsReachability && !cluster.isVideoMesh;\n\n if (!includeTlsReachability) {\n cluster.xtls = [];\n }\n\n // initialize the result for this cluster\n results[key] = {\n udp: {result: cluster.udp.length > 0 ? 'unreachable' : 'untested'},\n tcp: {result: cluster.tcp.length > 0 ? 'unreachable' : 'untested'},\n xtls: {result: cluster.xtls.length > 0 ? 'unreachable' : 'untested'},\n isVideoMesh: cluster.isVideoMesh,\n };\n\n // update expected results counters to include this cluster\n this.expectedResultsCount[cluster.isVideoMesh ? 'videoMesh' : 'public'].udp +=\n cluster.udp.length;\n if (!cluster.isVideoMesh) {\n this.expectedResultsCount.public.tcp += cluster.tcp.length;\n this.expectedResultsCount.public.xtls += cluster.xtls.length;\n }\n });\n\n const isFirstResult = {\n udp: true,\n tcp: true,\n xtls: true,\n };\n\n // save the initialized results (in case we don't get any \"resultReady\" events at all)\n await this.storeResults(results);\n\n if (!clusterList || !Object.keys(clusterList).length) {\n // nothing to do, finish immediately\n this.resolveReachabilityPromise(false);\n\n this.emit(\n {\n file: 'reachability',\n function: 'performReachabilityChecks',\n },\n 'reachability:done',\n {}\n );\n\n return;\n }\n\n this.startTimers();\n\n // now start the reachability on all the clusters\n Object.keys(clusterList).forEach((key) => {\n const cluster = clusterList[key];\n\n this.clusterReachability[key] = new ClusterReachability(key, cluster);\n this.clusterReachability[key].on(Events.resultReady, async (data: ResultEventData) => {\n const {protocol, result, clientMediaIPs, latencyInMilliseconds} = data;\n\n if (isFirstResult[protocol]) {\n this.emit(\n {\n file: 'reachability',\n function: 'resultReady event handler',\n },\n 'reachability:firstResultAvailable',\n {\n protocol,\n }\n );\n isFirstResult[protocol] = false;\n }\n this.resultsCount[cluster.isVideoMesh ? 'videoMesh' : 'public'][protocol] += 1;\n\n const areAllResultsReady = this.areAllResultsReady();\n\n results[key][protocol].result = result;\n results[key][protocol].clientMediaIPs = clientMediaIPs;\n results[key][protocol].latencyInMilliseconds = latencyInMilliseconds;\n\n await this.storeResults(results);\n\n if (areAllResultsReady) {\n this.clearTimer('overallTimer');\n this.emit(\n {\n file: 'reachability',\n function: 'performReachabilityChecks',\n },\n 'reachability:done',\n {}\n );\n this.sendMetric();\n\n LoggerProxy.logger.log(\n `Reachability:index#gatherReachability --> Reachability checks fully completed`\n );\n this.resolveReachabilityPromise();\n }\n });\n\n // clientMediaIps can be updated independently from the results, so we need to listen for them too\n this.clusterReachability[key].on(\n Events.clientMediaIpsUpdated,\n async (data: ClientMediaIpsUpdatedEventData) => {\n results[key][data.protocol].clientMediaIPs = data.clientMediaIPs;\n\n await this.storeResults(results);\n }\n );\n\n this.clusterReachability[key].start(); // not awaiting on purpose\n });\n }\n\n /**\n * Returns the clientMediaPreferences object that needs to be sent to the backend\n * when joining a meeting\n *\n * @param {boolean} isMultistream\n * @param {IP_VERSION} ipver\n * @returns {Object}\n */\n async getClientMediaPreferences(\n isMultistream: boolean,\n ipver?: IP_VERSION\n ): Promise<ClientMediaPreferences> {\n // if 0 or undefined, we assume version 0 and don't send any reachability in clientMediaPreferences\n if (!this.orpheusApiVersion) {\n return {\n ipver,\n joinCookie: await this.getJoinCookie(),\n preferTranscoding: !isMultistream,\n };\n }\n\n // must be version 1\n\n // for version 1, the reachability report goes into clientMediaPreferences (and it contains joinCookie)\n const reachabilityReport = (await this.getReachabilityReport()) as {\n joinCookie: any;\n reachability?: ReachabilityReportV1;\n };\n\n return {\n ipver,\n preferTranscoding: !isMultistream,\n ...reachabilityReport,\n };\n }\n\n /**\n * Returns the reachability report that needs to be attached to the ROAP messages\n * that we send to the backend.\n * It may return undefined, if reachability is not needed to be attached to ROAP messages (that's the case for v1 or Orpheus API)\n *\n * @returns {Promise<ReachabilityReportV0>} object that needs to be attached to Roap messages\n */\n async getReachabilityReportToAttachToRoap(): Promise<ReachabilityReportV0 | undefined> {\n // version 0\n if (!this.orpheusApiVersion) {\n return this.getReachabilityResults();\n }\n\n // version 1\n\n // for version 1 we don't attach anything to Roap messages, reachability report is sent inside clientMediaPreferences\n return undefined;\n }\n}\n"],"mappings":"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"}
@@ -99,6 +99,13 @@ export default class Reachability extends EventsScope {
99
99
  * @memberof Reachability
100
100
  */
101
101
  gatherReachabilityFallback(): Promise<void>;
102
+ /**
103
+ * Stops all reachability checks that are in progress
104
+ * @public
105
+ * @memberof Reachability
106
+ * @returns {void}
107
+ */
108
+ stopReachability(): void;
102
109
  /**
103
110
  * Returns statistics about last reachability results. The returned value is an object
104
111
  * with a flat list of properties so that it can be easily sent with metrics
@@ -201,9 +208,10 @@ export default class Reachability extends EventsScope {
201
208
  /**
202
209
  * Sends a metric with all the statistics about how long reachability took
203
210
  *
211
+ * @param {boolean} aborted true if the reachability checks were aborted
204
212
  * @returns {void}
205
213
  */
206
- protected sendMetric(): Promise<void>;
214
+ protected sendMetric(aborted?: boolean): Promise<void>;
207
215
  /**
208
216
  * Starts all the timers used for various timeouts
209
217
  *
@@ -458,7 +458,7 @@ var Webinar = _webexCore.WebexPlugin.extend({
458
458
  }, _callee7);
459
459
  }))();
460
460
  },
461
- version: "3.7.0-next.58"
461
+ version: "3.7.0-next.59"
462
462
  });
463
463
  var _default = exports.default = Webinar;
464
464
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -43,7 +43,7 @@
43
43
  "@webex/eslint-config-legacy": "0.0.0",
44
44
  "@webex/jest-config-legacy": "0.0.0",
45
45
  "@webex/legacy-tools": "0.0.0",
46
- "@webex/plugin-meetings": "3.7.0-next.58",
46
+ "@webex/plugin-meetings": "3.7.0-next.59",
47
47
  "@webex/plugin-rooms": "3.7.0-next.22",
48
48
  "@webex/test-helper-chai": "3.7.0-next.16",
49
49
  "@webex/test-helper-mocha": "3.7.0-next.16",
@@ -71,7 +71,7 @@
71
71
  "@webex/internal-plugin-metrics": "3.7.0-next.16",
72
72
  "@webex/internal-plugin-support": "3.7.0-next.23",
73
73
  "@webex/internal-plugin-user": "3.7.0-next.16",
74
- "@webex/internal-plugin-voicea": "3.7.0-next.58",
74
+ "@webex/internal-plugin-voicea": "3.7.0-next.59",
75
75
  "@webex/media-helpers": "3.7.0-next.22",
76
76
  "@webex/plugin-people": "3.7.0-next.20",
77
77
  "@webex/plugin-rooms": "3.7.0-next.22",
@@ -92,5 +92,5 @@
92
92
  "//": [
93
93
  "TODO: upgrade jwt-decode when moving to node 18"
94
94
  ],
95
- "version": "3.7.0-next.58"
95
+ "version": "3.7.0-next.59"
96
96
  }
@@ -6707,6 +6707,9 @@ export default class Meeting extends StatelessWebexPlugin {
6707
6707
  new RtcMetrics(this.webex, {meetingId: this.id}, this.correlationId)
6708
6708
  : undefined;
6709
6709
 
6710
+ // ongoing reachability checks slow down new media connections especially on Firefox, so we stop them
6711
+ this.getWebexObject().meetings.reachability.stopReachability();
6712
+
6710
6713
  const mc = Media.createMediaConnection(
6711
6714
  this.isMultistream,
6712
6715
  this.getMediaConnectionDebugId(),
@@ -259,6 +259,32 @@ export default class Reachability extends EventsScope {
259
259
  }
260
260
  }
261
261
 
262
+ /**
263
+ * Stops all reachability checks that are in progress
264
+ * @public
265
+ * @memberof Reachability
266
+ * @returns {void}
267
+ */
268
+ public stopReachability() {
269
+ // overallTimer is always there only if there is reachability in progress
270
+ if (this.overallTimer) {
271
+ LoggerProxy.logger.log(
272
+ 'Reachability:index#stopReachability --> stopping reachability checks'
273
+ );
274
+ this.abortCurrentChecks();
275
+ this.emit(
276
+ {
277
+ file: 'reachability',
278
+ function: 'stopReachability',
279
+ },
280
+ 'reachability:stopped',
281
+ {}
282
+ );
283
+ this.sendMetric(true);
284
+ this.resolveReachabilityPromise();
285
+ }
286
+ }
287
+
262
288
  /**
263
289
  * Returns statistics about last reachability results. The returned value is an object
264
290
  * with a flat list of properties so that it can be easily sent with metrics
@@ -637,9 +663,10 @@ export default class Reachability extends EventsScope {
637
663
  /**
638
664
  * Sends a metric with all the statistics about how long reachability took
639
665
  *
666
+ * @param {boolean} aborted true if the reachability checks were aborted
640
667
  * @returns {void}
641
668
  */
642
- protected async sendMetric() {
669
+ protected async sendMetric(aborted = false) {
643
670
  const results = [];
644
671
 
645
672
  Object.values(this.clusterReachability).forEach((clusterReachability) => {
@@ -650,6 +677,7 @@ export default class Reachability extends EventsScope {
650
677
  });
651
678
 
652
679
  const stats = {
680
+ aborted,
653
681
  vmn: {
654
682
  udp: this.getStatistics(results, 'udp', true),
655
683
  },
@@ -247,6 +247,7 @@ describe('plugin-meetings', () => {
247
247
  isAnyPublicClusterReachable: sinon.stub().resolves(true),
248
248
  getReachabilityResults: sinon.stub().resolves(undefined),
249
249
  getReachabilityMetrics: sinon.stub().resolves({}),
250
+ stopReachability: sinon.stub(),
250
251
  };
251
252
  webex.internal.llm.on = sinon.stub();
252
253
  webex.internal.newMetrics.callDiagnosticLatencies = new CallDiagnosticLatencies(
@@ -2096,6 +2097,7 @@ describe('plugin-meetings', () => {
2096
2097
  someReachabilityMetric1: 'some value1',
2097
2098
  someReachabilityMetric2: 'some value2',
2098
2099
  }),
2100
+ stopReachability: sinon.stub(),
2099
2101
  };
2100
2102
 
2101
2103
  const forceRtcMetricsSend = sinon.stub().resolves();
@@ -2515,6 +2517,7 @@ describe('plugin-meetings', () => {
2515
2517
  assert.calledOnce(meeting.setMercuryListener);
2516
2518
  assert.calledOnce(fakeMediaConnection.initiateOffer);
2517
2519
  assert.equal(meeting.allowMediaInLobby, allowMediaInLobby);
2520
+ assert.calledOnce(webex.meetings.reachability.stopReachability);
2518
2521
  };
2519
2522
 
2520
2523
  it('should attach the media and return promise', async () => {
@@ -2710,6 +2713,7 @@ describe('plugin-meetings', () => {
2710
2713
  webex.meetings.reachability = {
2711
2714
  isWebexMediaBackendUnreachable: sinon.stub().resolves(false),
2712
2715
  getReachabilityMetrics: sinon.stub().resolves(),
2716
+ stopReachability: sinon.stub(),
2713
2717
  };
2714
2718
  const MOCK_CLIENT_ERROR_CODE = 2004;
2715
2719
  const generateClientErrorCodeForIceFailureStub = sinon
@@ -2918,6 +2922,7 @@ describe('plugin-meetings', () => {
2918
2922
  .onCall(2)
2919
2923
  .resolves(false),
2920
2924
  getReachabilityMetrics: sinon.stub().resolves({}),
2925
+ stopReachability: sinon.stub(),
2921
2926
  };
2922
2927
  const getErrorPayloadForClientErrorCodeStub =
2923
2928
  (webex.internal.newMetrics.callDiagnosticMetrics.getErrorPayloadForClientErrorCode =
@@ -3212,6 +3217,7 @@ describe('plugin-meetings', () => {
3212
3217
  someReachabilityMetric1: 'some value1',
3213
3218
  someReachabilityMetric2: 'some value2',
3214
3219
  }),
3220
+ stopReachability: sinon.stub(),
3215
3221
  };
3216
3222
  meeting.iceCandidatesCount = 3;
3217
3223
  meeting.iceCandidateErrors.set('701_error', 3);
@@ -3716,6 +3722,7 @@ describe('plugin-meetings', () => {
3716
3722
 
3717
3723
  webex.meetings.reachability = {
3718
3724
  isWebexMediaBackendUnreachable: sinon.stub().resolves(unreachable || false),
3725
+ stopReachability: sinon.stub(),
3719
3726
  };
3720
3727
 
3721
3728
  const generateClientErrorCodeForIceFailureStub = sinon