@webex/plugin-meetings 3.8.0-next.14 → 3.8.0-next.16

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.
@@ -33,6 +33,7 @@ var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy")
33
33
  var _util = _interopRequireDefault(require("../meeting/util"));
34
34
  var _constants = require("../constants");
35
35
  var _request = _interopRequireDefault(require("./request"));
36
+ var _reachability = require("./reachability.types");
36
37
  var _clusterReachability = require("./clusterReachability");
37
38
  var _eventsScope = _interopRequireDefault(require("../common/events/events-scope"));
38
39
  var _constants2 = _interopRequireDefault(require("../metrics/constants"));
@@ -96,6 +97,7 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
96
97
  });
97
98
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "startTime", undefined);
98
99
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "totalDuration", undefined);
100
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "natType", _reachability.NatType.Unknown);
99
101
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "lastTrigger", void 0);
100
102
  _this.webex = webex;
101
103
 
@@ -424,7 +426,8 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
424
426
  reachability_vmn_tcp_success: 0,
425
427
  reachability_vmn_tcp_failed: 0,
426
428
  reachability_vmn_xtls_success: 0,
427
- reachability_vmn_xtls_failed: 0
429
+ reachability_vmn_xtls_failed: 0,
430
+ natType: this.natType
428
431
  };
429
432
  updateStats = function updateStats(clusterType, result) {
430
433
  if (result.udp && result.udp.result !== 'untested') {
@@ -1026,11 +1029,11 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
1026
1029
  }, {
1027
1030
  key: "performReachabilityChecks",
1028
1031
  value: (function () {
1029
- var _performReachabilityChecks = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee14(clusterList) {
1032
+ var _performReachabilityChecks = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee15(clusterList) {
1030
1033
  var _this4 = this;
1031
1034
  var results, isFirstResult;
1032
- return _regenerator.default.wrap(function _callee14$(_context14) {
1033
- while (1) switch (_context14.prev = _context14.next) {
1035
+ return _regenerator.default.wrap(function _callee15$(_context15) {
1036
+ while (1) switch (_context15.prev = _context15.next) {
1034
1037
  case 0:
1035
1038
  results = {};
1036
1039
  this.clusterReachability = {};
@@ -1088,11 +1091,11 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
1088
1091
  tcp: true,
1089
1092
  xtls: true
1090
1093
  }; // save the initialized results (in case we don't get any "resultReady" events at all)
1091
- _context14.next = 9;
1094
+ _context15.next = 9;
1092
1095
  return this.storeResults(results);
1093
1096
  case 9:
1094
1097
  if (!(!clusterList || !(0, _keys.default)(clusterList).length)) {
1095
- _context14.next = 13;
1098
+ _context15.next = 13;
1096
1099
  break;
1097
1100
  }
1098
1101
  // nothing to do, finish immediately
@@ -1101,7 +1104,7 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
1101
1104
  file: 'reachability',
1102
1105
  function: 'performReachabilityChecks'
1103
1106
  }, 'reachability:done', {});
1104
- return _context14.abrupt("return");
1107
+ return _context15.abrupt("return");
1105
1108
  case 13:
1106
1109
  this.startTimers();
1107
1110
 
@@ -1173,13 +1176,29 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
1173
1176
  return _ref7.apply(this, arguments);
1174
1177
  };
1175
1178
  }());
1179
+ _this4.clusterReachability[key].on(_clusterReachability.Events.natTypeUpdated, /*#__PURE__*/function () {
1180
+ var _ref8 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee14(data) {
1181
+ return _regenerator.default.wrap(function _callee14$(_context14) {
1182
+ while (1) switch (_context14.prev = _context14.next) {
1183
+ case 0:
1184
+ _this4.natType = data.natType;
1185
+ case 1:
1186
+ case "end":
1187
+ return _context14.stop();
1188
+ }
1189
+ }, _callee14);
1190
+ }));
1191
+ return function (_x8) {
1192
+ return _ref8.apply(this, arguments);
1193
+ };
1194
+ }());
1176
1195
  _this4.clusterReachability[key].start(); // not awaiting on purpose
1177
1196
  });
1178
1197
  case 15:
1179
1198
  case "end":
1180
- return _context14.stop();
1199
+ return _context15.stop();
1181
1200
  }
1182
- }, _callee14, this);
1201
+ }, _callee15, this);
1183
1202
  }));
1184
1203
  function performReachabilityChecks(_x5) {
1185
1204
  return _performReachabilityChecks.apply(this, arguments);
@@ -1198,42 +1217,42 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
1198
1217
  }, {
1199
1218
  key: "getClientMediaPreferences",
1200
1219
  value: (function () {
1201
- var _getClientMediaPreferences = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee15(isMultistream, ipver) {
1220
+ var _getClientMediaPreferences = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee16(isMultistream, ipver) {
1202
1221
  var reachabilityReport;
1203
- return _regenerator.default.wrap(function _callee15$(_context15) {
1204
- while (1) switch (_context15.prev = _context15.next) {
1222
+ return _regenerator.default.wrap(function _callee16$(_context16) {
1223
+ while (1) switch (_context16.prev = _context16.next) {
1205
1224
  case 0:
1206
1225
  if (this.orpheusApiVersion) {
1207
- _context15.next = 7;
1226
+ _context16.next = 7;
1208
1227
  break;
1209
1228
  }
1210
- _context15.t0 = ipver;
1211
- _context15.next = 4;
1229
+ _context16.t0 = ipver;
1230
+ _context16.next = 4;
1212
1231
  return this.getJoinCookie();
1213
1232
  case 4:
1214
- _context15.t1 = _context15.sent;
1215
- _context15.t2 = !isMultistream;
1216
- return _context15.abrupt("return", {
1217
- ipver: _context15.t0,
1218
- joinCookie: _context15.t1,
1219
- preferTranscoding: _context15.t2
1233
+ _context16.t1 = _context16.sent;
1234
+ _context16.t2 = !isMultistream;
1235
+ return _context16.abrupt("return", {
1236
+ ipver: _context16.t0,
1237
+ joinCookie: _context16.t1,
1238
+ preferTranscoding: _context16.t2
1220
1239
  });
1221
1240
  case 7:
1222
- _context15.next = 9;
1241
+ _context16.next = 9;
1223
1242
  return this.getReachabilityReport();
1224
1243
  case 9:
1225
- reachabilityReport = _context15.sent;
1226
- return _context15.abrupt("return", _objectSpread({
1244
+ reachabilityReport = _context16.sent;
1245
+ return _context16.abrupt("return", _objectSpread({
1227
1246
  ipver: ipver,
1228
1247
  preferTranscoding: !isMultistream
1229
1248
  }, reachabilityReport));
1230
1249
  case 11:
1231
1250
  case "end":
1232
- return _context15.stop();
1251
+ return _context16.stop();
1233
1252
  }
1234
- }, _callee15, this);
1253
+ }, _callee16, this);
1235
1254
  }));
1236
- function getClientMediaPreferences(_x8, _x9) {
1255
+ function getClientMediaPreferences(_x9, _x10) {
1237
1256
  return _getClientMediaPreferences.apply(this, arguments);
1238
1257
  }
1239
1258
  return getClientMediaPreferences;
@@ -1249,22 +1268,22 @@ var Reachability = exports.default = /*#__PURE__*/function (_EventsScope) {
1249
1268
  }, {
1250
1269
  key: "getReachabilityReportToAttachToRoap",
1251
1270
  value: (function () {
1252
- var _getReachabilityReportToAttachToRoap = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee16() {
1253
- return _regenerator.default.wrap(function _callee16$(_context16) {
1254
- while (1) switch (_context16.prev = _context16.next) {
1271
+ var _getReachabilityReportToAttachToRoap = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee17() {
1272
+ return _regenerator.default.wrap(function _callee17$(_context17) {
1273
+ while (1) switch (_context17.prev = _context17.next) {
1255
1274
  case 0:
1256
1275
  if (this.orpheusApiVersion) {
1257
- _context16.next = 2;
1276
+ _context17.next = 2;
1258
1277
  break;
1259
1278
  }
1260
- return _context16.abrupt("return", this.getReachabilityResults());
1279
+ return _context17.abrupt("return", this.getReachabilityResults());
1261
1280
  case 2:
1262
- return _context16.abrupt("return", undefined);
1281
+ return _context17.abrupt("return", undefined);
1263
1282
  case 3:
1264
1283
  case "end":
1265
- return _context16.stop();
1284
+ return _context17.stop();
1266
1285
  }
1267
- }, _callee16, this);
1286
+ }, _callee17, this);
1268
1287
  }));
1269
1288
  function getReachabilityReportToAttachToRoap() {
1270
1289
  return _getReachabilityReportToAttachToRoap.apply(this, arguments);
@@ -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","config","meetings","enableReachabilityChecks","Error","lastTrigger","internal","device","ipNetworkDetector","detect","reachabilityDefer","Defer","performReachabilityChecks","promise","gatherReachability","_x3","_getJoinCookie","_callee3","joinCookieRaw","_callee3$","_context3","get","catch","JSON","parse","getJoinCookie","_getReachabilityReport","_callee4","reachabilityResult","_callee4$","_context4","getReachabilityResults","reachability","version","usedDiscoveryOptions","metrics","totalDuration","tests","getReachabilityReport","_gatherReachabilityFallback","_callee5","reachabilityReport","_yield$this$getCluste2","_callee5$","_context5","abortCurrentChecks","gatherReachabilityFallback","stopReachability","overallTimer","log","emit","file","function","sendMetric","resolveReachabilityPromise","_getReachabilityMetrics","_callee6","stats","updateStats","resultsJson","results","_callee6$","_context6","reachability_public_udp_success","reachability_public_udp_failed","reachability_public_tcp_success","reachability_public_tcp_failed","reachability_public_xtls_success","reachability_public_xtls_failed","reachability_vmn_udp_success","reachability_vmn_udp_failed","reachability_vmn_tcp_success","reachability_vmn_tcp_failed","reachability_vmn_xtls_success","reachability_vmn_xtls_failed","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","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 // @ts-ignore\n if (!this.webex.config.meetings.enableReachabilityChecks) {\n throw new Error('enableReachabilityChecks is disabled in config');\n }\n // Fetch clusters and measure latency\n try {\n this.lastTrigger = trigger;\n\n // kick off ip version detection. We don't await it, as we don't want to waste time\n // and if it fails, that's ok we can still carry on\n // @ts-ignore\n this.webex.internal.device.ipNetworkDetector.detect(true);\n\n const {clusters} = await this.getClusters('startup');\n\n this.reachabilityDefer = new Defer();\n\n // Perform Reachability Check\n await this.performReachabilityChecks(clusters);\n\n return this.reachabilityDefer.promise;\n } catch (error) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachability --> Error:`, error);\n\n return {};\n }\n }\n\n /**\n * Gets the last join cookie we got from Orpheus\n *\n * @returns {Promise<Object>} join cookie\n */\n async getJoinCookie() {\n // @ts-ignore\n const joinCookieRaw = await this.webex.boundedStorage\n .get(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie)\n .catch(() => {});\n\n let joinCookie;\n\n if (joinCookieRaw) {\n try {\n joinCookie = JSON.parse(joinCookieRaw);\n } catch (e) {\n LoggerProxy.logger.error(\n `MeetingRequest#constructor --> Error in parsing join cookie data: ${e}`\n );\n }\n }\n\n return joinCookie;\n }\n\n /**\n * Returns the reachability report that needs to be attached to the ROAP messages\n * that we send to the backend.\n *\n * @returns {Promise<Object>}\n */\n async getReachabilityReport(): Promise<\n | {\n joinCookie: any;\n reachability?: ReachabilityReportV1;\n }\n | {\n reachability: ReachabilityReportV0;\n }\n > {\n const reachabilityResult = await this.getReachabilityResults();\n const joinCookie = await this.getJoinCookie();\n\n // Orpheus API version 0\n if (!this.orpheusApiVersion) {\n return {\n reachability: reachabilityResult,\n };\n }\n\n // Orpheus API version 1\n return {\n reachability: {\n version: 1,\n result: {\n usedDiscoveryOptions: {\n 'early-call-min-clusters': this.minRequiredClusters,\n },\n metrics: {\n 'total-duration-ms': this.totalDuration,\n },\n tests: reachabilityResult,\n },\n },\n joinCookie,\n };\n }\n\n /**\n * This method is called when we don't succeed in reaching the minimum number of clusters\n * required by Orpheus. It sends the results to Orpheus and gets a new list that it tries to reach again.\n * @returns {Promise<ReachabilityResults>} reachability results\n * @public\n * @memberof Reachability\n */\n public async gatherReachabilityFallback(): Promise<void> {\n try {\n const reachabilityReport = await this.getReachabilityReport();\n\n const {clusters} = await this.getClusters('early-call/no-min-reached', reachabilityReport);\n\n // stop all previous reachability checks that might still be going on in the background\n this.abortCurrentChecks();\n\n // Perform Reachability Check\n await this.performReachabilityChecks(clusters);\n } catch (error) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachabilityFallback --> Error:`, error);\n }\n }\n\n /**\n * Stops all reachability checks that are in progress\n * @public\n * @memberof Reachability\n * @returns {void}\n */\n public stopReachability() {\n // overallTimer is always there only if there is reachability in progress\n if (this.overallTimer) {\n LoggerProxy.logger.log(\n 'Reachability:index#stopReachability --> stopping reachability checks'\n );\n this.abortCurrentChecks();\n this.emit(\n {\n file: 'reachability',\n function: 'stopReachability',\n },\n 'reachability:stopped',\n {}\n );\n this.sendMetric(true);\n this.resolveReachabilityPromise();\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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"}
1
+ {"version":3,"names":["_lodash","require","_common","_loggerProxy","_interopRequireDefault","_util","_constants","_request","_reachability","_clusterReachability","_eventsScope","_constants2","_metrics","ownKeys","e","r","t","_Object$keys2","_Object$getOwnPropertySymbols","o","filter","_Object$getOwnPropertyDescriptor","enumerable","push","apply","_objectSpread","arguments","length","Object","forEach","_defineProperty2","default","_Object$getOwnPropertyDescriptors","_Object$defineProperties","_Object$defineProperty","_createSuper","Derived","hasNativeReflectConstruct","_isNativeReflectConstruct","_createSuperInternal","Super","_getPrototypeOf2","result","NewTarget","constructor","_Reflect$construct","_possibleConstructorReturn2","Reflect","sham","Proxy","Boolean","prototype","valueOf","call","DEFAULT_TIMEOUT","VIDEO_MESH_TIMEOUT","OVERALL_TIMEOUT","Reachability","exports","_EventsScope","_inherits2","_super","webex","_this","_classCallCheck2","_assertThisInitialized2","REACHABILITY","namespace","videoMesh","udp","public","tcp","xtls","undefined","NatType","Unknown","reachabilityRequest","ReachabilityRequest","clusterReachability","_createClass2","key","value","_getClusters","_asyncToGenerator2","_regenerator","mark","_callee","trigger","previousReport","isRetry","_yield$this$reachabil","clusters","joinCookie","discoveryOptions","_args","wrap","_callee$","_context","prev","next","getClusters","MeetingUtil","getIpVersion","sent","minRequiredClusters","orpheusApiVersion","boundedStorage","put","localStorageJoinCookie","_stringify","abrupt","t0","LoggerProxy","logger","error","concat","stop","_x","_x2","_gatherReachability","_callee2","_yield$this$getCluste","_callee2$","_context2","config","meetings","enableReachabilityChecks","Error","lastTrigger","internal","device","ipNetworkDetector","detect","reachabilityDefer","Defer","performReachabilityChecks","promise","gatherReachability","_x3","_getJoinCookie","_callee3","joinCookieRaw","_callee3$","_context3","get","catch","JSON","parse","getJoinCookie","_getReachabilityReport","_callee4","reachabilityResult","_callee4$","_context4","getReachabilityResults","reachability","version","usedDiscoveryOptions","metrics","totalDuration","tests","getReachabilityReport","_gatherReachabilityFallback","_callee5","reachabilityReport","_yield$this$getCluste2","_callee5$","_context5","abortCurrentChecks","gatherReachabilityFallback","stopReachability","overallTimer","log","emit","file","function","sendMetric","resolveReachabilityPromise","_getReachabilityMetrics","_callee6","stats","updateStats","resultsJson","results","_callee6$","_context6","reachability_public_udp_success","reachability_public_udp_failed","reachability_public_tcp_success","reachability_public_tcp_failed","reachability_public_xtls_success","reachability_public_xtls_failed","reachability_vmn_udp_success","reachability_vmn_udp_failed","reachability_vmn_tcp_success","reachability_vmn_tcp_failed","reachability_vmn_xtls_success","reachability_vmn_xtls_failed","natType","clusterType","outcome","localStorageResult","_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","_callee15","clusterList","_this4","isFirstResult","_callee15$","_context15","experimental","enableTcpReachability","enableTlsReachability","cluster","includeTcpReachability","includeTlsReachability","ClusterReachability","on","Events","resultReady","_ref6","_callee12","data","clientMediaIPs","_callee12$","_context12","_x6","clientMediaIpsUpdated","_ref7","_callee13","_callee13$","_context13","_x7","natTypeUpdated","_ref8","_callee14","_callee14$","_context14","_x8","start","_x5","_getClientMediaPreferences","_callee16","isMultistream","_callee16$","_context16","t1","t2","preferTranscoding","getClientMediaPreferences","_x9","_x10","_getReachabilityReportToAttachToRoap","_callee17","_callee17$","_context17","getReachabilityReportToAttachToRoap","EventsScope"],"sources":["index.ts"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable class-methods-use-this */\nimport {isEqual, mapValues, mean} from 'lodash';\n\nimport {Defer} from '@webex/common';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport MeetingUtil from '../meeting/util';\n\nimport {IP_VERSION, REACHABILITY} from '../constants';\n\nimport ReachabilityRequest, {ClusterList} from './request';\nimport {\n ClusterReachabilityResult,\n TransportResult,\n ClientMediaPreferences,\n ReachabilityMetrics,\n ReachabilityReportV0,\n ReachabilityReportV1,\n ReachabilityResults,\n ReachabilityResultsForBackend,\n TransportResultForBackend,\n GetClustersTrigger,\n NatType,\n} from './reachability.types';\nimport {\n ClientMediaIpsUpdatedEventData,\n ClusterReachability,\n Events,\n NatTypeUpdatedEventData,\n ResultEventData,\n} from './clusterReachability';\nimport EventsScope from '../common/events/events-scope';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport Metrics from '../metrics';\n\n// timeouts in seconds\nconst DEFAULT_TIMEOUT = 3;\nconst VIDEO_MESH_TIMEOUT = 1;\nconst OVERALL_TIMEOUT = 15;\n\n/**\n * @class Reachability\n * @export\n */\nexport default class Reachability extends EventsScope {\n namespace = REACHABILITY.namespace;\n webex: object;\n reachabilityRequest: ReachabilityRequest;\n clusterReachability: {\n [key: string]: ClusterReachability;\n };\n\n minRequiredClusters?: number;\n orpheusApiVersion?: number;\n\n reachabilityDefer?: Defer;\n\n vmnTimer?: ReturnType<typeof setTimeout>;\n publicCloudTimer?: ReturnType<typeof setTimeout>;\n overallTimer?: ReturnType<typeof setTimeout>;\n\n expectedResultsCount = {videoMesh: {udp: 0}, public: {udp: 0, tcp: 0, xtls: 0}};\n resultsCount = {videoMesh: {udp: 0}, public: {udp: 0, tcp: 0, xtls: 0}};\n startTime = undefined;\n totalDuration = undefined;\n natType = NatType.Unknown;\n\n protected lastTrigger?: string;\n\n /**\n * Creates an instance of Reachability.\n * @param {object} webex\n * @memberof Reachability\n */\n constructor(webex: object) {\n super();\n this.webex = webex;\n\n /**\n * internal request object for the server\n * @instance\n * @type {Array}\n * @private\n * @memberof Reachability\n */\n this.reachabilityRequest = new ReachabilityRequest(this.webex);\n\n this.clusterReachability = {};\n }\n\n /**\n * Fetches the list of media clusters from the backend\n * @param {string} trigger - explains the reason for starting reachability, used by Orpheus\n * @param {Object} previousReport - last reachability report\n * @param {boolean} isRetry\n * @private\n * @returns {Promise<{clusters: ClusterList, joinCookie: any}>}\n */\n async getClusters(\n trigger: GetClustersTrigger,\n previousReport?: any,\n isRetry = false\n ): Promise<{\n clusters: ClusterList;\n joinCookie: any;\n }> {\n try {\n const {clusters, joinCookie, discoveryOptions} = await this.reachabilityRequest.getClusters(\n trigger,\n MeetingUtil.getIpVersion(this.webex),\n previousReport\n );\n\n this.minRequiredClusters = discoveryOptions?.['early-call-min-clusters'];\n this.orpheusApiVersion = discoveryOptions?.['report-version'];\n\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageJoinCookie,\n JSON.stringify(joinCookie)\n );\n\n return {clusters, joinCookie};\n } catch (error) {\n if (isRetry) {\n throw error;\n }\n\n LoggerProxy.logger.error(\n `Reachability:index#getClusters --> Failed with error: ${error}, retrying...`\n );\n\n return this.getClusters(trigger, previousReport, true);\n }\n }\n\n /**\n * Gets a list of media clusters from the backend and performs reachability checks on all the clusters\n * @param {string} trigger - explains the reason for starting reachability\n * @returns {Promise<ReachabilityResults>} reachability results\n * @public\n * @memberof Reachability\n */\n public async gatherReachability(trigger: string): Promise<ReachabilityResults> {\n // @ts-ignore\n if (!this.webex.config.meetings.enableReachabilityChecks) {\n throw new Error('enableReachabilityChecks is disabled in config');\n }\n // Fetch clusters and measure latency\n try {\n this.lastTrigger = trigger;\n\n // kick off ip version detection. We don't await it, as we don't want to waste time\n // and if it fails, that's ok we can still carry on\n // @ts-ignore\n this.webex.internal.device.ipNetworkDetector.detect(true);\n\n const {clusters} = await this.getClusters('startup');\n\n this.reachabilityDefer = new Defer();\n\n // Perform Reachability Check\n await this.performReachabilityChecks(clusters);\n\n return this.reachabilityDefer.promise;\n } catch (error) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachability --> Error:`, error);\n\n return {};\n }\n }\n\n /**\n * Gets the last join cookie we got from Orpheus\n *\n * @returns {Promise<Object>} join cookie\n */\n async getJoinCookie() {\n // @ts-ignore\n const joinCookieRaw = await this.webex.boundedStorage\n .get(REACHABILITY.namespace, REACHABILITY.localStorageJoinCookie)\n .catch(() => {});\n\n let joinCookie;\n\n if (joinCookieRaw) {\n try {\n joinCookie = JSON.parse(joinCookieRaw);\n } catch (e) {\n LoggerProxy.logger.error(\n `MeetingRequest#constructor --> Error in parsing join cookie data: ${e}`\n );\n }\n }\n\n return joinCookie;\n }\n\n /**\n * Returns the reachability report that needs to be attached to the ROAP messages\n * that we send to the backend.\n *\n * @returns {Promise<Object>}\n */\n async getReachabilityReport(): Promise<\n | {\n joinCookie: any;\n reachability?: ReachabilityReportV1;\n }\n | {\n reachability: ReachabilityReportV0;\n }\n > {\n const reachabilityResult = await this.getReachabilityResults();\n const joinCookie = await this.getJoinCookie();\n\n // Orpheus API version 0\n if (!this.orpheusApiVersion) {\n return {\n reachability: reachabilityResult,\n };\n }\n\n // Orpheus API version 1\n return {\n reachability: {\n version: 1,\n result: {\n usedDiscoveryOptions: {\n 'early-call-min-clusters': this.minRequiredClusters,\n },\n metrics: {\n 'total-duration-ms': this.totalDuration,\n },\n tests: reachabilityResult,\n },\n },\n joinCookie,\n };\n }\n\n /**\n * This method is called when we don't succeed in reaching the minimum number of clusters\n * required by Orpheus. It sends the results to Orpheus and gets a new list that it tries to reach again.\n * @returns {Promise<ReachabilityResults>} reachability results\n * @public\n * @memberof Reachability\n */\n public async gatherReachabilityFallback(): Promise<void> {\n try {\n const reachabilityReport = await this.getReachabilityReport();\n\n const {clusters} = await this.getClusters('early-call/no-min-reached', reachabilityReport);\n\n // stop all previous reachability checks that might still be going on in the background\n this.abortCurrentChecks();\n\n // Perform Reachability Check\n await this.performReachabilityChecks(clusters);\n } catch (error) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachabilityFallback --> Error:`, error);\n }\n }\n\n /**\n * Stops all reachability checks that are in progress\n * @public\n * @memberof Reachability\n * @returns {void}\n */\n public stopReachability() {\n // overallTimer is always there only if there is reachability in progress\n if (this.overallTimer) {\n LoggerProxy.logger.log(\n 'Reachability:index#stopReachability --> stopping reachability checks'\n );\n this.abortCurrentChecks();\n this.emit(\n {\n file: 'reachability',\n function: 'stopReachability',\n },\n 'reachability:stopped',\n {}\n );\n this.sendMetric(true);\n this.resolveReachabilityPromise();\n }\n }\n\n /**\n * Returns statistics about last reachability results. The returned value is an object\n * with a flat list of properties so that it can be easily sent with metrics\n *\n * @returns {Promise} Promise with metrics values, it never rejects/throws.\n */\n async getReachabilityMetrics(): Promise<ReachabilityMetrics> {\n const stats: ReachabilityMetrics = {\n reachability_public_udp_success: 0,\n reachability_public_udp_failed: 0,\n reachability_public_tcp_success: 0,\n reachability_public_tcp_failed: 0,\n reachability_public_xtls_success: 0,\n reachability_public_xtls_failed: 0,\n reachability_vmn_udp_success: 0,\n reachability_vmn_udp_failed: 0,\n reachability_vmn_tcp_success: 0,\n reachability_vmn_tcp_failed: 0,\n reachability_vmn_xtls_success: 0,\n reachability_vmn_xtls_failed: 0,\n natType: this.natType,\n };\n\n const updateStats = (clusterType: 'public' | 'vmn', result: ClusterReachabilityResult) => {\n if (result.udp && result.udp.result !== 'untested') {\n const outcome = result.udp.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_udp_${outcome}`] += 1;\n }\n if (result.tcp && result.tcp.result !== 'untested') {\n const outcome = result.tcp.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_tcp_${outcome}`] += 1;\n }\n if (result.xtls && result.xtls.result !== 'untested') {\n const outcome = result.xtls.result === 'reachable' ? 'success' : 'failed';\n stats[`reachability_${clusterType}_xtls_${outcome}`] += 1;\n }\n };\n\n try {\n // @ts-ignore\n const resultsJson = await this.webex.boundedStorage.get(\n REACHABILITY.namespace,\n REACHABILITY.localStorageResult\n );\n\n const results: ReachabilityResults = JSON.parse(resultsJson);\n\n Object.values(results).forEach((result) => {\n updateStats(result.isVideoMesh ? 'vmn' : 'public', result);\n });\n } catch (e) {\n // empty storage, that's ok\n LoggerProxy.logger.warn(\n 'Roap:request#getReachabilityMetrics --> Error parsing reachability data: ',\n e\n );\n }\n\n return stats;\n }\n\n /**\n * Maps our internal transport result to the format that backend expects\n * @param {TransportResult} transportResult\n * @returns {TransportResultForBackend}\n */\n private mapTransportResultToBackendDataFormat(\n transportResult: TransportResult\n ): TransportResultForBackend {\n const output: TransportResultForBackend = {};\n\n for (const [key, value] of Object.entries(transportResult)) {\n switch (key) {\n case 'result':\n switch (value) {\n case 'reachable':\n output.reachable = 'true';\n break;\n case 'unreachable':\n output.reachable = 'false';\n break;\n case 'untested':\n output.untested = 'true';\n break;\n }\n break;\n case 'latencyInMilliseconds':\n output.latencyInMilliseconds = value.toString();\n break;\n default:\n output[key] = value;\n }\n }\n\n return output;\n }\n\n /**\n * Reachability results as an object in the format that backend expects\n *\n * @returns {any} reachability results that need to be sent to the backend\n */\n async getReachabilityResults(): Promise<ReachabilityResultsForBackend | undefined> {\n let results: ReachabilityResultsForBackend;\n\n try {\n // @ts-ignore\n const resultsJson = await this.webex.boundedStorage.get(\n REACHABILITY.namespace,\n REACHABILITY.localStorageResult\n );\n\n const allClusterResults: ReachabilityResults = JSON.parse(resultsJson);\n\n results = mapValues(allClusterResults, (clusterResult) => ({\n udp: this.mapTransportResultToBackendDataFormat(clusterResult.udp || {result: 'untested'}),\n tcp: this.mapTransportResultToBackendDataFormat(clusterResult.tcp || {result: 'untested'}),\n xtls: this.mapTransportResultToBackendDataFormat(\n clusterResult.xtls || {result: 'untested'}\n ),\n }));\n } catch (e) {\n // empty storage, that's ok\n LoggerProxy.logger.warn(\n 'Reachability:index#getReachabilityResults --> Error parsing reachability data: ',\n e\n );\n }\n\n return results;\n }\n\n /**\n * fetches reachability data and checks for cluster reachability\n * @returns {boolean}\n * @public\n * @memberof Reachability\n */\n async isAnyPublicClusterReachable() {\n let reachable = false;\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);\n\n reachable = Object.values(reachabilityResults).some(\n (result) =>\n !result.isVideoMesh &&\n (result.udp?.result === 'reachable' || result.tcp?.result === 'reachable')\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Reachability:index#isAnyPublicClusterReachable --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return reachable;\n }\n\n /**\n * Returns true only if ALL protocols (UDP, TCP and TLS) have been tested and none\n * of the media clusters where reachable with any of the protocols. This is done\n * irrespective of the config, so for example:\n * if config.meetings.experimental.enableTlsReachability === false,\n * it will return false, because TLS reachability won't be tested,\n * so we can't say for sure that media backend is unreachable over TLS.\n *\n * @returns {boolean}\n */\n async isWebexMediaBackendUnreachable() {\n let unreachable = false;\n\n // @ts-ignore\n const reachabilityData = await this.webex.boundedStorage\n .get(this.namespace, REACHABILITY.localStorageResult)\n .catch(() => {});\n\n if (reachabilityData) {\n try {\n const reachabilityResults: ReachabilityResults = JSON.parse(reachabilityData);\n\n const protocols = {\n udp: {tested: false, reachable: undefined},\n tcp: {tested: false, reachable: undefined},\n xtls: {tested: false, reachable: undefined},\n };\n\n Object.values(reachabilityResults).forEach((result) => {\n Object.keys(protocols).forEach((protocol) => {\n if (\n result[protocol]?.result === 'reachable' ||\n result[protocol]?.result === 'unreachable'\n ) {\n protocols[protocol].tested = true;\n\n // we need at least 1 'reachable' result to mark the whole protocol as reachable\n if (result[protocol].result === 'reachable') {\n protocols[protocol].reachable = true;\n }\n }\n });\n });\n\n unreachable = Object.values(protocols).every(\n (protocol) => protocol.tested && !protocol.reachable\n );\n } catch (e) {\n LoggerProxy.logger.error(\n `Reachability:index#isWebexMediaBackendUnreachable --> Error in parsing reachability data: ${e}`\n );\n }\n }\n\n return unreachable;\n }\n\n /**\n * Get list of all unreachable clusters\n * @returns {array} Unreachable clusters\n * @private\n * @memberof Reachability\n */\n private getUnreachableClusters(): Array<{name: string; protocol: string}> {\n const unreachableList = [];\n\n Object.entries(this.clusterReachability).forEach(([key, clusterReachability]) => {\n const result = clusterReachability.getResult();\n\n if (result.udp.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'udp'});\n }\n if (result.tcp.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'tcp'});\n }\n if (result.xtls.result === 'unreachable') {\n unreachableList.push({name: key, protocol: 'xtls'});\n }\n });\n\n return unreachableList;\n }\n\n /**\n * Gets the number of reachable clusters from last run reachability check\n * @returns {number} reachable clusters count\n * @private\n * @memberof Reachability\n */\n private getNumberOfReachableClusters(): number {\n let count = 0;\n\n Object.entries(this.clusterReachability).forEach(([key, clusterReachability]) => {\n const result = clusterReachability.getResult();\n\n if (\n result.udp.result === 'reachable' ||\n result.tcp.result === 'reachable' ||\n result.xtls.result === 'reachable'\n ) {\n count += 1;\n }\n });\n\n return count;\n }\n\n /**\n * Make a log of unreachable clusters.\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n private logUnreachableClusters() {\n const list = this.getUnreachableClusters();\n\n list.forEach(({name, protocol}) => {\n LoggerProxy.logger.log(\n `Reachability:index#logUnreachableClusters --> failed to reach ${name} over ${protocol}`\n );\n });\n }\n\n /**\n * Returns true if we've obtained all the reachability results for all the public clusters\n * In other words, it means that all public clusters are reachable over each protocol,\n * because we only get a \"result\" if we managed to reach a cluster\n *\n * @returns {boolean}\n */\n private areAllPublicClusterResultsReady() {\n return isEqual(this.expectedResultsCount.public, this.resultsCount.public);\n }\n\n /**\n * Returns true if we've obtained all the reachability results for all the clusters\n *\n * @returns {boolean}\n */\n private areAllResultsReady() {\n return isEqual(this.expectedResultsCount, this.resultsCount);\n }\n\n /**\n * Resolves the promise returned by gatherReachability() method\n * @param {boolean} checkMinRequiredClusters - if true, it will check if we have reached the minimum required clusters and do a fallback if needed\n * @returns {void}\n */\n private resolveReachabilityPromise(checkMinRequiredClusters = true) {\n this.totalDuration = performance.now() - this.startTime;\n\n this.clearTimer('vmnTimer');\n this.clearTimer('publicCloudTimer');\n\n this.logUnreachableClusters();\n this.reachabilityDefer?.resolve();\n\n if (checkMinRequiredClusters) {\n const numReachableClusters = this.getNumberOfReachableClusters();\n if (this.minRequiredClusters && numReachableClusters < this.minRequiredClusters) {\n LoggerProxy.logger.log(\n `Reachability:index#resolveReachabilityPromise --> minRequiredClusters not reached (${numReachableClusters} < ${this.minRequiredClusters}), doing reachability fallback`\n );\n this.gatherReachabilityFallback();\n }\n }\n }\n\n /**\n * Aborts all cluster reachability checks that are in progress\n *\n * @returns {void}\n */\n private abortClusterReachability() {\n Object.values(this.clusterReachability).forEach((clusterReachability) => {\n clusterReachability.abort();\n });\n }\n\n /**\n * Helper function for calculating min/max/average values of latency\n *\n * @param {Array<any>} results\n * @param {string} protocol\n * @param {boolean} isVideoMesh\n * @returns {{min:number, max: number, average: number}}\n */\n protected getStatistics(\n results: Array<ClusterReachabilityResult & {isVideoMesh: boolean}>,\n protocol: 'udp' | 'tcp' | 'xtls',\n isVideoMesh: boolean\n ) {\n const values = results\n .filter((result) => result.isVideoMesh === isVideoMesh)\n .filter((result) => result[protocol].result === 'reachable')\n .map((result) => result[protocol].latencyInMilliseconds);\n\n if (values.length === 0) {\n return {\n min: -1,\n max: -1,\n average: -1,\n };\n }\n\n return {\n min: Math.min(...values),\n max: Math.max(...values),\n average: mean(values),\n };\n }\n\n /**\n * Sends a metric with all the statistics about how long reachability took\n *\n * @param {boolean} aborted true if the reachability checks were aborted\n * @returns {void}\n */\n protected async sendMetric(aborted = false) {\n const results = [];\n\n Object.values(this.clusterReachability).forEach((clusterReachability) => {\n results.push({\n ...clusterReachability.getResult(),\n isVideoMesh: clusterReachability.isVideoMesh,\n });\n });\n\n const stats = {\n aborted,\n vmn: {\n udp: this.getStatistics(results, 'udp', true),\n },\n public: {\n udp: this.getStatistics(results, 'udp', false),\n tcp: this.getStatistics(results, 'tcp', false),\n xtls: this.getStatistics(results, 'xtls', false),\n },\n ipver: {\n // @ts-ignore\n firstIpV4: this.webex.internal.device.ipNetworkDetector.firstIpV4,\n // @ts-ignore\n firstIpV6: this.webex.internal.device.ipNetworkDetector.firstIpV6,\n // @ts-ignore\n firstMdns: this.webex.internal.device.ipNetworkDetector.firstMdns,\n // @ts-ignore\n totalTime: this.webex.internal.device.ipNetworkDetector.totalTime,\n },\n trigger: this.lastTrigger,\n };\n Metrics.sendBehavioralMetric(\n BEHAVIORAL_METRICS.REACHABILITY_COMPLETED,\n Metrics.prepareMetricFields(stats)\n );\n }\n\n /**\n * Starts all the timers used for various timeouts\n *\n * @returns {void}\n */\n private startTimers() {\n this.vmnTimer = setTimeout(() => {\n this.vmnTimer = undefined;\n // if we are only missing VMN results, then we don't want to wait for them any longer\n // as they are likely to fail if users are not on corporate network\n if (this.areAllPublicClusterResultsReady()) {\n LoggerProxy.logger.log(\n 'Reachability:index#startTimers --> Reachability checks timed out (VMN timeout)'\n );\n\n this.resolveReachabilityPromise();\n }\n }, VIDEO_MESH_TIMEOUT * 1000);\n\n this.publicCloudTimer = setTimeout(() => {\n this.publicCloudTimer = undefined;\n\n LoggerProxy.logger.log(\n `Reachability:index#startTimers --> Reachability checks timed out (${DEFAULT_TIMEOUT}s)`\n );\n\n // check against minimum required clusters, do a new call if we don't have enough\n\n // resolve the promise, so that the client won't be blocked waiting on meetings.register() for too long\n this.resolveReachabilityPromise();\n }, DEFAULT_TIMEOUT * 1000);\n\n this.overallTimer = setTimeout(() => {\n this.overallTimer = undefined;\n this.abortClusterReachability();\n this.emit(\n {\n file: 'reachability',\n function: 'overallTimer timeout',\n },\n 'reachability:done',\n {}\n );\n this.sendMetric();\n\n LoggerProxy.logger.log(\n `Reachability:index#startTimers --> Reachability checks fully timed out (${OVERALL_TIMEOUT}s)`\n );\n }, OVERALL_TIMEOUT * 1000);\n }\n\n /**\n * Stores given reachability results in local storage\n *\n * @param {ReachabilityResults} results\n * @returns {Promise<void>}\n */\n private async storeResults(results: ReachabilityResults) {\n // @ts-ignore\n await this.webex.boundedStorage.put(\n this.namespace,\n REACHABILITY.localStorageResult,\n JSON.stringify(results)\n );\n }\n\n /**\n * Resets all the internal counters that keep track of the results\n *\n * @returns {void}\n */\n private resetResultCounters() {\n this.expectedResultsCount.videoMesh.udp = 0;\n this.expectedResultsCount.public.udp = 0;\n this.expectedResultsCount.public.tcp = 0;\n this.expectedResultsCount.public.xtls = 0;\n\n this.resultsCount.videoMesh.udp = 0;\n this.resultsCount.public.udp = 0;\n this.resultsCount.public.tcp = 0;\n this.resultsCount.public.xtls = 0;\n }\n\n /**\n * Clears the timer\n *\n * @param {string} timer name of the timer to clear\n * @returns {void}\n */\n private clearTimer(timer: string) {\n if (this[timer]) {\n clearTimeout(this[timer]);\n this[timer] = undefined;\n }\n }\n\n /**\n * Aborts current checks that are in progress\n *\n * @returns {void}\n */\n private abortCurrentChecks() {\n this.clearTimer('vmnTimer');\n this.clearTimer('publicCloudTimer');\n this.clearTimer('overallTimer');\n\n this.abortClusterReachability();\n }\n\n /**\n * Performs reachability checks for all clusters\n * @param {ClusterList} clusterList\n * @returns {Promise<void>} promise that's resolved as soon as the checks are started\n */\n private async performReachabilityChecks(clusterList: ClusterList) {\n const results: ReachabilityResults = {};\n\n this.clusterReachability = {};\n\n this.startTime = performance.now();\n\n LoggerProxy.logger.log(\n `Reachability:index#performReachabilityChecks --> doing UDP${\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTcpReachability ? ',TCP' : ''\n }${\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTlsReachability ? ',TLS' : ''\n } reachability checks`\n );\n\n this.resetResultCounters();\n\n // sanitize the urls in the clusterList\n Object.keys(clusterList).forEach((key) => {\n const cluster = clusterList[key];\n\n // Linus doesn't support TCP reachability checks on video mesh nodes\n const includeTcpReachability =\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTcpReachability && !cluster.isVideoMesh;\n\n if (!includeTcpReachability) {\n cluster.tcp = [];\n }\n\n // Linus doesn't support xTLS reachability checks on video mesh nodes\n const includeTlsReachability =\n // @ts-ignore\n this.webex.config.meetings.experimental.enableTlsReachability && !cluster.isVideoMesh;\n\n if (!includeTlsReachability) {\n cluster.xtls = [];\n }\n\n // initialize the result for this cluster\n results[key] = {\n udp: {result: cluster.udp.length > 0 ? 'unreachable' : 'untested'},\n tcp: {result: cluster.tcp.length > 0 ? 'unreachable' : 'untested'},\n xtls: {result: cluster.xtls.length > 0 ? 'unreachable' : 'untested'},\n isVideoMesh: cluster.isVideoMesh,\n };\n\n // update expected results counters to include this cluster\n this.expectedResultsCount[cluster.isVideoMesh ? 'videoMesh' : 'public'].udp +=\n cluster.udp.length;\n if (!cluster.isVideoMesh) {\n this.expectedResultsCount.public.tcp += cluster.tcp.length;\n this.expectedResultsCount.public.xtls += cluster.xtls.length;\n }\n });\n\n const isFirstResult = {\n udp: true,\n tcp: true,\n xtls: true,\n };\n\n // save the initialized results (in case we don't get any \"resultReady\" events at all)\n await this.storeResults(results);\n\n if (!clusterList || !Object.keys(clusterList).length) {\n // nothing to do, finish immediately\n this.resolveReachabilityPromise(false);\n\n this.emit(\n {\n file: 'reachability',\n function: 'performReachabilityChecks',\n },\n 'reachability:done',\n {}\n );\n\n return;\n }\n\n this.startTimers();\n\n // now start the reachability on all the clusters\n Object.keys(clusterList).forEach((key) => {\n const cluster = clusterList[key];\n\n this.clusterReachability[key] = new ClusterReachability(key, cluster);\n this.clusterReachability[key].on(Events.resultReady, async (data: ResultEventData) => {\n const {protocol, result, clientMediaIPs, latencyInMilliseconds} = data;\n\n if (isFirstResult[protocol]) {\n this.emit(\n {\n file: 'reachability',\n function: 'resultReady event handler',\n },\n 'reachability:firstResultAvailable',\n {\n protocol,\n }\n );\n isFirstResult[protocol] = false;\n }\n this.resultsCount[cluster.isVideoMesh ? 'videoMesh' : 'public'][protocol] += 1;\n\n const areAllResultsReady = this.areAllResultsReady();\n\n results[key][protocol].result = result;\n results[key][protocol].clientMediaIPs = clientMediaIPs;\n results[key][protocol].latencyInMilliseconds = latencyInMilliseconds;\n\n await this.storeResults(results);\n\n if (areAllResultsReady) {\n this.clearTimer('overallTimer');\n this.emit(\n {\n file: 'reachability',\n function: 'performReachabilityChecks',\n },\n 'reachability:done',\n {}\n );\n this.sendMetric();\n\n LoggerProxy.logger.log(\n `Reachability:index#gatherReachability --> Reachability checks fully completed`\n );\n this.resolveReachabilityPromise();\n }\n });\n\n // clientMediaIps can be updated independently from the results, so we need to listen for them too\n this.clusterReachability[key].on(\n Events.clientMediaIpsUpdated,\n async (data: ClientMediaIpsUpdatedEventData) => {\n results[key][data.protocol].clientMediaIPs = data.clientMediaIPs;\n\n await this.storeResults(results);\n }\n );\n\n this.clusterReachability[key].on(\n Events.natTypeUpdated,\n async (data: NatTypeUpdatedEventData) => {\n this.natType = data.natType;\n }\n );\n\n this.clusterReachability[key].start(); // not awaiting on purpose\n });\n }\n\n /**\n * Returns the clientMediaPreferences object that needs to be sent to the backend\n * when joining a meeting\n *\n * @param {boolean} isMultistream\n * @param {IP_VERSION} ipver\n * @returns {Object}\n */\n async getClientMediaPreferences(\n isMultistream: boolean,\n ipver?: IP_VERSION\n ): Promise<ClientMediaPreferences> {\n // if 0 or undefined, we assume version 0 and don't send any reachability in clientMediaPreferences\n if (!this.orpheusApiVersion) {\n return {\n ipver,\n joinCookie: await this.getJoinCookie(),\n preferTranscoding: !isMultistream,\n };\n }\n\n // must be version 1\n\n // for version 1, the reachability report goes into clientMediaPreferences (and it contains joinCookie)\n const reachabilityReport = (await this.getReachabilityReport()) as {\n joinCookie: any;\n reachability?: ReachabilityReportV1;\n };\n\n return {\n ipver,\n preferTranscoding: !isMultistream,\n ...reachabilityReport,\n };\n }\n\n /**\n * Returns the reachability report that needs to be attached to the ROAP messages\n * that we send to the backend.\n * It may return undefined, if reachability is not needed to be attached to ROAP messages (that's the case for v1 or Orpheus API)\n *\n * @returns {Promise<ReachabilityReportV0>} object that needs to be attached to Roap messages\n */\n async getReachabilityReportToAttachToRoap(): Promise<ReachabilityReportV0 | undefined> {\n // version 0\n if (!this.orpheusApiVersion) {\n return this.getReachabilityResults();\n }\n\n // version 1\n\n // for version 1 we don't attach anything to Roap messages, reachability report is sent inside clientMediaPreferences\n return undefined;\n }\n}\n"],"mappings":"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"}
@@ -4,4 +4,18 @@ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/defi
4
4
  _Object$defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
+ exports.NatType = void 0;
8
+ // result for a specific transport protocol (like udp or tcp)
9
+ var NatType = exports.NatType = /*#__PURE__*/function (NatType) {
10
+ NatType["Unknown"] = "unknown";
11
+ NatType["SymmetricNat"] = "symmetric-nat";
12
+ return NatType;
13
+ }({}); // reachability result for a specific media cluster
14
+ /**
15
+ * This is the type that matches what backend expects us to send to them. It is a bit weird, because
16
+ * it uses strings instead of booleans and numbers, but that's what they require.
17
+ */
18
+ // this is the type that is required by the backend when we send them reachability results
19
+ // this is the type used by Reachability class internally and stored in local storage
20
+ /* Orpheus API supports more triggers, but we don't use them yet */
7
21
  //# sourceMappingURL=reachability.types.js.map
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["reachability.types.ts"],"sourcesContent":["import {IP_VERSION} from '../constants';\n\n// result for a specific transport protocol (like udp or tcp)\nexport type TransportResult = {\n result: 'reachable' | 'unreachable' | 'untested';\n latencyInMilliseconds?: number; // amount of time it took to get the first ICE candidate\n clientMediaIPs?: string[];\n};\n\n// reachability result for a specific media cluster\nexport type ClusterReachabilityResult = {\n udp: TransportResult;\n tcp: TransportResult;\n xtls: TransportResult;\n};\n\nexport type ReachabilityMetrics = {\n reachability_public_udp_success: number;\n reachability_public_udp_failed: number;\n reachability_public_tcp_success: number;\n reachability_public_tcp_failed: number;\n reachability_public_xtls_success: number;\n reachability_public_xtls_failed: number;\n reachability_vmn_udp_success: number;\n reachability_vmn_udp_failed: number;\n reachability_vmn_tcp_success: number;\n reachability_vmn_tcp_failed: number;\n reachability_vmn_xtls_success: number;\n reachability_vmn_xtls_failed: number;\n};\n\n/**\n * This is the type that matches what backend expects us to send to them. It is a bit weird, because\n * it uses strings instead of booleans and numbers, but that's what they require.\n */\nexport type TransportResultForBackend = {\n reachable?: 'true' | 'false';\n latencyInMilliseconds?: string;\n clientMediaIPs?: string[];\n untested?: 'true';\n};\n\nexport type ReachabilityResultForBackend = {\n udp: TransportResultForBackend;\n tcp: TransportResultForBackend;\n xtls: TransportResultForBackend;\n};\n\n// this is the type that is required by the backend when we send them reachability results\nexport type ReachabilityResultsForBackend = Record<string, ReachabilityResultForBackend>;\n\n// this is the type used by Reachability class internally and stored in local storage\nexport type ReachabilityResults = Record<\n string,\n ClusterReachabilityResult & {\n isVideoMesh?: boolean;\n }\n>;\n\nexport type ReachabilityReportV0 = ReachabilityResultsForBackend;\n\nexport type ReachabilityReportV1 = {\n version: 1;\n result: {\n usedDiscoveryOptions: {\n 'early-call-min-clusters': number;\n // there are more options, but we don't support them yet\n };\n metrics: {\n 'total-duration-ms': number;\n // there are more metrics, but we don't support them yet\n };\n tests: Record<string, ReachabilityResultForBackend>;\n };\n};\n\nexport interface ClientMediaPreferences {\n ipver: IP_VERSION;\n joinCookie: any;\n preferTranscoding: boolean;\n reachability?: ReachabilityReportV1; // only present when using Orpheus API version 1\n}\n\n/* Orpheus API supports more triggers, but we don't use them yet */\nexport type GetClustersTrigger = 'startup' | 'early-call/no-min-reached';\n"],"mappings":""}
1
+ {"version":3,"names":["NatType","exports"],"sources":["reachability.types.ts"],"sourcesContent":["import {IP_VERSION} from '../constants';\n\n// result for a specific transport protocol (like udp or tcp)\nexport type TransportResult = {\n result: 'reachable' | 'unreachable' | 'untested';\n latencyInMilliseconds?: number; // amount of time it took to get the first ICE candidate\n clientMediaIPs?: string[];\n};\n\nexport enum NatType {\n Unknown = 'unknown',\n SymmetricNat = 'symmetric-nat',\n}\n\n// reachability result for a specific media cluster\nexport type ClusterReachabilityResult = {\n udp: TransportResult;\n tcp: TransportResult;\n xtls: TransportResult;\n};\n\nexport type ReachabilityMetrics = {\n reachability_public_udp_success: number;\n reachability_public_udp_failed: number;\n reachability_public_tcp_success: number;\n reachability_public_tcp_failed: number;\n reachability_public_xtls_success: number;\n reachability_public_xtls_failed: number;\n reachability_vmn_udp_success: number;\n reachability_vmn_udp_failed: number;\n reachability_vmn_tcp_success: number;\n reachability_vmn_tcp_failed: number;\n reachability_vmn_xtls_success: number;\n reachability_vmn_xtls_failed: number;\n natType: NatType;\n};\n\n/**\n * This is the type that matches what backend expects us to send to them. It is a bit weird, because\n * it uses strings instead of booleans and numbers, but that's what they require.\n */\nexport type TransportResultForBackend = {\n reachable?: 'true' | 'false';\n latencyInMilliseconds?: string;\n clientMediaIPs?: string[];\n untested?: 'true';\n};\n\nexport type ReachabilityResultForBackend = {\n udp: TransportResultForBackend;\n tcp: TransportResultForBackend;\n xtls: TransportResultForBackend;\n};\n\n// this is the type that is required by the backend when we send them reachability results\nexport type ReachabilityResultsForBackend = Record<string, ReachabilityResultForBackend>;\n\n// this is the type used by Reachability class internally and stored in local storage\nexport type ReachabilityResults = Record<\n string,\n ClusterReachabilityResult & {\n isVideoMesh?: boolean;\n }\n>;\n\nexport type ReachabilityReportV0 = ReachabilityResultsForBackend;\n\nexport type ReachabilityReportV1 = {\n version: 1;\n result: {\n usedDiscoveryOptions: {\n 'early-call-min-clusters': number;\n // there are more options, but we don't support them yet\n };\n metrics: {\n 'total-duration-ms': number;\n // there are more metrics, but we don't support them yet\n };\n tests: Record<string, ReachabilityResultForBackend>;\n };\n};\n\nexport interface ClientMediaPreferences {\n ipver: IP_VERSION;\n joinCookie: any;\n preferTranscoding: boolean;\n reachability?: ReachabilityReportV1; // only present when using Orpheus API version 1\n}\n\n/* Orpheus API supports more triggers, but we don't use them yet */\nexport type GetClustersTrigger = 'startup' | 'early-call/no-min-reached';\n"],"mappings":";;;;;;;AAEA;AAAA,IAOYA,OAAO,GAAAC,OAAA,CAAAD,OAAA,0BAAPA,OAAO;EAAPA,OAAO;EAAPA,OAAO;EAAA,OAAPA,OAAO;AAAA,OAKnB;AAuBA;AACA;AACA;AACA;AAcA;AAGA;AAgCA"}
@@ -533,6 +533,12 @@ export default class Meeting extends StatelessWebexPlugin {
533
533
  * @returns {string | undefined}
534
534
  */
535
535
  get isoLocalClientMeetingJoinTime(): string | undefined;
536
+ /**
537
+ * Setter - sets isoLocalClientMeetingJoinTime
538
+ * This will be set once on meeting join, and not updated again
539
+ * @param {string | undefined} time in ISO format
540
+ */
541
+ set isoLocalClientMeetingJoinTime(time: string | undefined);
536
542
  /**
537
543
  * Set meeting info and trigger `MEETING_INFO_AVAILABLE` event
538
544
  * @param {any} info