@webex/plugin-meetings 2.29.2 → 2.29.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/reachability/index.js +17 -13
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.js +16 -7
- package/dist/reachability/request.js.map +1 -1
- package/package.json +5 -5
- package/src/reachability/index.js +12 -8
- package/src/reachability/{request.js → request.ts} +23 -6
- package/test/unit/spec/reachability/request.ts +84 -0
|
@@ -38,10 +38,13 @@ var _constants = require("../constants");
|
|
|
38
38
|
|
|
39
39
|
var _request = _interopRequireDefault(require("./request"));
|
|
40
40
|
|
|
41
|
+
var DEFAULT_TIMEOUT = 3000;
|
|
42
|
+
var VIDEO_MESH_TIMEOUT = 1000;
|
|
41
43
|
/**
|
|
42
44
|
* @class Reachability
|
|
43
45
|
* @export
|
|
44
46
|
*/
|
|
47
|
+
|
|
45
48
|
var Reachability = /*#__PURE__*/function () {
|
|
46
49
|
/**
|
|
47
50
|
* Creates an instance of Reachability.
|
|
@@ -119,22 +122,25 @@ var Reachability = /*#__PURE__*/function () {
|
|
|
119
122
|
case 13:
|
|
120
123
|
results = _context.sent;
|
|
121
124
|
window.localStorage.setItem(_constants.REACHABILITY.localStorage, (0, _stringify.default)(results));
|
|
125
|
+
|
|
126
|
+
_loggerProxy.default.logger.log('Reachability:index#gatherReachability --> Reachability checks completed');
|
|
127
|
+
|
|
122
128
|
return _context.abrupt("return", results);
|
|
123
129
|
|
|
124
|
-
case
|
|
125
|
-
_context.prev =
|
|
130
|
+
case 19:
|
|
131
|
+
_context.prev = 19;
|
|
126
132
|
_context.t0 = _context["catch"](7);
|
|
127
133
|
|
|
128
134
|
_loggerProxy.default.logger.error("Reachability:index#gatherReachability --> Error in calling getClusters(): ".concat(_context.t0));
|
|
129
135
|
|
|
130
136
|
return _context.abrupt("return", {});
|
|
131
137
|
|
|
132
|
-
case
|
|
138
|
+
case 23:
|
|
133
139
|
case "end":
|
|
134
140
|
return _context.stop();
|
|
135
141
|
}
|
|
136
142
|
}
|
|
137
|
-
}, _callee, this, [[7,
|
|
143
|
+
}, _callee, this, [[7, 19]]);
|
|
138
144
|
}));
|
|
139
145
|
|
|
140
146
|
function gatherReachability() {
|
|
@@ -186,7 +192,7 @@ var Reachability = /*#__PURE__*/function () {
|
|
|
186
192
|
peerConnection.key = key;
|
|
187
193
|
return peerConnection;
|
|
188
194
|
} catch (peerConnectionError) {
|
|
189
|
-
_loggerProxy.default.logger.log("Reachability:index#
|
|
195
|
+
_loggerProxy.default.logger.log("Reachability:index#createPeerConnection --> Error creating peerConnection: ".concat(peerConnectionError));
|
|
190
196
|
|
|
191
197
|
return null;
|
|
192
198
|
}
|
|
@@ -242,7 +248,7 @@ var Reachability = /*#__PURE__*/function () {
|
|
|
242
248
|
description = _context2.sent;
|
|
243
249
|
peerConnection.begin = (0, _now.default)();
|
|
244
250
|
peerConnection.setLocalDescription(description);
|
|
245
|
-
return _context2.abrupt("return", _this.iceGatheringState(peerConnection).catch(function (iceGatheringStateError) {
|
|
251
|
+
return _context2.abrupt("return", _this.iceGatheringState(peerConnection, cluster.isVideoMesh ? VIDEO_MESH_TIMEOUT : DEFAULT_TIMEOUT).catch(function (iceGatheringStateError) {
|
|
246
252
|
_loggerProxy.default.logger.log("Reachability:index#getLocalSDPForClusters --> Error in getLocalSDP : ".concat(iceGatheringStateError));
|
|
247
253
|
}));
|
|
248
254
|
|
|
@@ -344,16 +350,16 @@ var Reachability = /*#__PURE__*/function () {
|
|
|
344
350
|
* speed.
|
|
345
351
|
* @private
|
|
346
352
|
* @param {RTCPeerConnection} peerConnection
|
|
353
|
+
* @param {number} timeout
|
|
347
354
|
* @returns {Promise}
|
|
348
355
|
*/
|
|
349
356
|
|
|
350
357
|
}, {
|
|
351
358
|
key: "iceGatheringState",
|
|
352
|
-
value: function iceGatheringState(peerConnection) {
|
|
359
|
+
value: function iceGatheringState(peerConnection, timeout) {
|
|
353
360
|
var _this4 = this;
|
|
354
361
|
|
|
355
362
|
var ELAPSED = 'elapsed';
|
|
356
|
-
var waitTime = 5e3;
|
|
357
363
|
return new _promise.default(function (resolve) {
|
|
358
364
|
var peerConnectionProxy = new window.Proxy(peerConnection, {
|
|
359
365
|
get: function get(target, property) {
|
|
@@ -387,14 +393,12 @@ var Reachability = /*#__PURE__*/function () {
|
|
|
387
393
|
|
|
388
394
|
|
|
389
395
|
window.setTimeout(function () {
|
|
390
|
-
var CLOSED =
|
|
391
|
-
CONNECTION_STATE: _constants.CONNECTION_STATE
|
|
392
|
-
}; // Close any open peerConnections
|
|
396
|
+
var CLOSED = _constants.CONNECTION_STATE.CLOSED; // Close any open peerConnections
|
|
393
397
|
|
|
394
398
|
if (peerConnectionProxy.connectionState !== CLOSED) {
|
|
395
399
|
_this4.setLatencyAndClose(peerConnectionProxy, null);
|
|
396
400
|
}
|
|
397
|
-
},
|
|
401
|
+
}, timeout);
|
|
398
402
|
});
|
|
399
403
|
}
|
|
400
404
|
/**
|
|
@@ -409,7 +413,7 @@ var Reachability = /*#__PURE__*/function () {
|
|
|
409
413
|
value: function logUnreachableClusters() {
|
|
410
414
|
var list = this.getUnreachablClusters();
|
|
411
415
|
list.forEach(function (cluster) {
|
|
412
|
-
_loggerProxy.default.logger.log("Reachability:index#
|
|
416
|
+
_loggerProxy.default.logger.log("Reachability:index#logUnreachableClusters --> No ice candidate for ".concat(cluster, "."));
|
|
413
417
|
});
|
|
414
418
|
}
|
|
415
419
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["Reachability","webex","reachabilityRequest","ReachabilityRequest","clusterLatencyResults","setup","window","localStorage","removeItem","REACHABILITY","LoggerProxy","logger","error","getClusters","clusters","performReachabilityCheck","results","setItem","cluster","iceServers","udp","tcp","map","url","username","credential","urls","iceCandidatePoolSize","iceTransportPolicy","key","config","peerConnection","RTCPeerConnection","peerConnectionError","log","startTime","begin","clusterList","buildPeerConnectionConfig","createPeerConnection","createOffer","offerToReceiveAudio","description","setLocalDescription","iceGatheringState","catch","iceGatheringStateError","all","then","parseIceResultsToReachabilityResults","reachabilityLatencyResults","logUnreachableClusters","unreachableList","forEach","unreachable","reachable","push","onicegatheringstatechange","COMPLETE","ICE_GATHERING_STATE","iceConnectionState","elapsed","getElapsedTime","setLatencyAndClose","onicecandidate","e","SERVER_REFLEXIVE","candidate","String","type","toLowerCase","ELAPSED","waitTime","resolve","peerConnectionProxy","Proxy","get","target","property","targetMember","bind","set","value","clusterId","Reflect","handleIceGatheringStateChange","handleOnIceCandidate","setTimeout","CLOSED","CONNECTION_STATE","connectionState","list","getUnreachablClusters","iceResults","reachabilityMap","latencyResult","latencyInMilliseconds","toString","length","getLocalSDPForClusters","localSDPData","REACHABLE","UNREACHABLE","resultKey","intialState","close"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable class-methods-use-this */\n/* globals window */\nimport _ from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {\n ICE_GATHERING_STATE,\n CONNECTION_STATE,\n REACHABILITY\n} from '../constants';\n\nimport ReachabilityRequest from './request';\n\n/**\n * @class Reachability\n * @export\n */\nexport default class Reachability {\n /**\n * Creates an instance of Reachability.\n * @param {object} webex\n * @memberof Reachability\n */\n constructor(webex) {\n this.webex = webex;\n\n /**\n * internal request object for the server\n * @instance\n * @type {Array}\n * @private\n * @memberof Reachability\n */\n this.reachabilityRequest = new ReachabilityRequest(this.webex);\n\n /**\n * internal object of clusters latency results\n * @instance\n * @type {object}\n * @private\n * @memberof Reachability\n */\n this.clusterLatencyResults = {};\n }\n\n\n /**\n * fetches reachability data\n * @returns {Object} reachability data\n * @public\n * @async\n * @memberof Reachability\n */\n async gatherReachability() {\n this.setup();\n\n // Remove stored reachability results to ensure no stale data\n if (window?.localStorage?.removeItem) {\n window.localStorage.removeItem(REACHABILITY.localStorage);\n }\n else {\n LoggerProxy.logger.error('Reachability:index#gatherReachability --> Error in accessing LocalStorage.');\n\n return {};\n }\n\n // Fetch clusters and measure latency\n try {\n const clusters = await this.reachabilityRequest.getClusters();\n\n // Perform Reachability Check\n const results = await this.performReachabilityCheck(clusters);\n\n window.localStorage.setItem(REACHABILITY.localStorage, JSON.stringify(results));\n\n return results;\n }\n catch (getClusterError) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachability --> Error in calling getClusters(): ${getClusterError}`);\n\n return {};\n }\n }\n\n\n /**\n * Generate peerConnection config settings\n * @param {object} cluster\n * @returns {object} peerConnectionConfig\n * @private\n * @memberof Reachability\n */\n buildPeerConnectionConfig(cluster) {\n const iceServers = _.uniq([\n ...cluster.udp,\n ...cluster.tcp\n ]).map((url) => ({\n username: '',\n credential: '',\n urls: [url]\n }));\n\n return {\n iceServers: [\n ...iceServers\n ],\n iceCandidatePoolSize: '0',\n iceTransportPolicy: 'all'\n };\n }\n\n\n /**\n * Creates an RTCPeerConnection\n * @param {object} cluster\n * @returns {RTCPeerConnection} peerConnection\n * @private\n * @memberof Reachability\n */\n createPeerConnection(cluster) {\n const {key, config} = cluster;\n\n try {\n const peerConnection = new window.RTCPeerConnection(config);\n\n peerConnection.key = key;\n\n return peerConnection;\n }\n catch (peerConnectionError) {\n LoggerProxy.logger.log(`Reachability:index#getLocalSDPForClusters --> Error creating peerConnection: ${peerConnectionError}`);\n\n return null;\n }\n }\n\n\n /**\n * Gets total elapsed time\n * @param {RTCPeerConnection} peerConnection\n * @returns {Number} Milliseconds\n * @private\n * @memberof Reachability\n */\n getElapsedTime(peerConnection) {\n const startTime = peerConnection.begin;\n\n delete peerConnection.begin;\n\n return Date.now() - startTime;\n }\n\n\n /**\n * creates offer and generates localSDP\n * @param {object} clusterList cluster List\n * @returns {Promise} Reachability latency results\n * @private\n * @memberof Reachability\n */\n getLocalSDPForClusters(clusterList) {\n let clusters = [...Object.keys(clusterList)];\n\n clusters = clusters.map(async (key) => {\n const cluster = clusterList[key];\n const config = this.buildPeerConnectionConfig(cluster);\n const peerConnection = this.createPeerConnection({key, config});\n const description = await peerConnection.createOffer({offerToReceiveAudio: true});\n\n peerConnection.begin = Date.now();\n peerConnection.setLocalDescription(description);\n\n return this.iceGatheringState(peerConnection)\n .catch((iceGatheringStateError) => {\n LoggerProxy.logger.log(`Reachability:index#getLocalSDPForClusters --> Error in getLocalSDP : ${iceGatheringStateError}`);\n });\n });\n\n return Promise.all(clusters)\n .then(this.parseIceResultsToReachabilityResults)\n .then((reachabilityLatencyResults) => {\n this.logUnreachableClusters();\n\n // return results\n return reachabilityLatencyResults;\n });\n }\n\n\n /**\n * Get list of all unreachable clusters\n * @returns {array} Unreachable clusters\n * @private\n * @memberof Reachability\n */\n getUnreachablClusters() {\n const unreachableList = [];\n const clusters = this.clusterLatencyResults;\n\n Object.keys(clusters).forEach((key) => {\n const cluster = clusters[key];\n\n if (cluster.unreachable && !cluster.reachable) {\n unreachableList.push(key);\n }\n });\n\n return unreachableList;\n }\n\n\n /**\n * Attach an event handler for the icegatheringstatechange\n * event and measure latency.\n * @param {RTCPeerConnection} peerConnection\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n handleIceGatheringStateChange(peerConnection) {\n peerConnection.onicegatheringstatechange = () => {\n const {COMPLETE} = ICE_GATHERING_STATE;\n\n if (peerConnection.iceConnectionState === COMPLETE) {\n const elapsed = this.getElapsedTime(peerConnection);\n\n LoggerProxy.logger.log(`Reachability:index#onIceGatheringStateChange --> Successfully pinged ${peerConnection.key}:`, elapsed);\n this.setLatencyAndClose(peerConnection, elapsed);\n }\n };\n }\n\n\n /**\n * Attach an event handler for the icecandidate\n * event and measure latency.\n * @param {RTCPeerConnection} peerConnection\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n handleOnIceCandidate(peerConnection) {\n peerConnection.onicecandidate = (e) => {\n const SERVER_REFLEXIVE = 'srflx';\n\n if (e.candidate && String(e.candidate.type).toLowerCase() === SERVER_REFLEXIVE) {\n const elapsed = this.getElapsedTime(peerConnection);\n\n LoggerProxy.logger.log(`Reachability:index#onIceCandidate --> Successfully pinged ${peerConnection.key}:`, elapsed);\n this.setLatencyAndClose(peerConnection, elapsed);\n }\n };\n }\n\n\n /**\n * An event handler on an RTCPeerConnection when the state of the ICE\n * candidate gathering process changes. Used to measure connection\n * speed.\n * @private\n * @param {RTCPeerConnection} peerConnection\n * @returns {Promise}\n */\n iceGatheringState(peerConnection) {\n const ELAPSED = 'elapsed';\n const waitTime = 5e3;\n\n return new Promise((resolve) => {\n const peerConnectionProxy = new window.Proxy(peerConnection, {\n get(target, property) {\n const targetMember = target[property];\n\n if (typeof (targetMember) === 'function') {\n return targetMember.bind(target);\n }\n\n return targetMember;\n },\n set: (target, property, value) => {\n // only intercept elapsed property\n if (property === ELAPSED) {\n resolve({clusterId: peerConnection.key, elapsed: value});\n\n return true;\n }\n\n // pass thru\n return window.Reflect.set(target, property, value);\n }\n });\n\n // Using peerConnection proxy so handle functions below\n // won't be coupled to our promise implementation\n this.handleIceGatheringStateChange(peerConnectionProxy);\n this.handleOnIceCandidate(peerConnectionProxy);\n\n // Set maximum timeout\n window.setTimeout(() => {\n const CLOSED = {CONNECTION_STATE};\n\n // Close any open peerConnections\n if (peerConnectionProxy.connectionState !== CLOSED) {\n this.setLatencyAndClose(peerConnectionProxy, null);\n }\n }, waitTime);\n });\n }\n\n\n /**\n * Make a log of unreachable clusters.\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n logUnreachableClusters() {\n const list = this.getUnreachablClusters();\n\n list.forEach((cluster) => {\n LoggerProxy.logger.log(`Reachability:index#getLocalSDPForClusters --> No ice candidate for ${cluster}.`);\n });\n }\n\n\n /**\n * Calculates time to establish connection\n * @param {array} iceResults iceResults\n * @returns {object} reachabilityMap\n * @private\n * @memberof Reachability\n */\n parseIceResultsToReachabilityResults(iceResults) {\n const reachabilityMap = {};\n\n iceResults.forEach(({clusterId, elapsed}) => {\n let latencyResult;\n\n if (elapsed === null) {\n latencyResult = {reachable: 'false'};\n }\n else {\n latencyResult = {\n reachable: 'true',\n latencyInMilliseconds: (elapsed).toString()\n };\n }\n\n reachabilityMap[clusterId] = {\n udp: latencyResult,\n tcp: latencyResult\n };\n });\n\n return reachabilityMap;\n }\n\n\n /**\n * fetches reachability data\n * @param {object} clusterList\n * @returns {Promise<localSDPData>} reachability check results\n * @private\n * @memberof Reachability\n */\n performReachabilityCheck(clusterList) {\n if (!clusterList || !Object.keys(clusterList).length) {\n return Promise.resolve({});\n }\n\n return new Promise((resolve) => {\n this.getLocalSDPForClusters(clusterList)\n .then((localSDPData) => {\n if (!localSDPData || !Object.keys(localSDPData).length) {\n // TODO: handle the error condition properly and try retry\n LoggerProxy.logger.log('Reachability:index#performReachabilityCheck --> Local SDP is empty or has missing elements..returning');\n resolve({});\n }\n else {\n resolve(localSDPData);\n }\n })\n .catch((error) => {\n LoggerProxy.logger.error(`Reachability:index#performReachabilityCheck --> Error in getLocalSDPForClusters: ${error}`);\n resolve({});\n });\n });\n }\n\n\n /**\n * Records latency and closes the peerConnection\n * @param {RTCPeerConnection} peerConnection\n * @param {number} elapsed Latency in milliseconds\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n setLatencyAndClose(peerConnection, elapsed) {\n const REACHABLE = 'reachable';\n const UNREACHABLE = 'unreachable';\n const {CLOSED} = CONNECTION_STATE;\n const {key} = peerConnection;\n const resultKey = elapsed === null ? UNREACHABLE : REACHABLE;\n const intialState = {[REACHABLE]: 0, [UNREACHABLE]: 0};\n\n if (peerConnection.connectionState === CLOSED) {\n LoggerProxy.logger.log(`Reachability:index#setLatencyAndClose --> Attempting to set latency of ${elapsed} on closed peerConnection.`);\n\n return;\n }\n\n this.clusterLatencyResults[key] = this.clusterLatencyResults[key] || intialState;\n this.clusterLatencyResults[key][resultKey] += 1;\n\n // Set to null in case this fired from\n // an event other than onIceCandidate\n peerConnection.onicecandidate = null;\n peerConnection.close();\n peerConnection.elapsed = elapsed;\n }\n\n\n /**\n * utility function\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n setup() {\n this.clusterLatencyResults = {};\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["DEFAULT_TIMEOUT","VIDEO_MESH_TIMEOUT","Reachability","webex","reachabilityRequest","ReachabilityRequest","clusterLatencyResults","setup","window","localStorage","removeItem","REACHABILITY","LoggerProxy","logger","error","getClusters","clusters","performReachabilityCheck","results","setItem","log","cluster","iceServers","udp","tcp","map","url","username","credential","urls","iceCandidatePoolSize","iceTransportPolicy","key","config","peerConnection","RTCPeerConnection","peerConnectionError","startTime","begin","clusterList","buildPeerConnectionConfig","createPeerConnection","createOffer","offerToReceiveAudio","description","setLocalDescription","iceGatheringState","isVideoMesh","catch","iceGatheringStateError","all","then","parseIceResultsToReachabilityResults","reachabilityLatencyResults","logUnreachableClusters","unreachableList","forEach","unreachable","reachable","push","onicegatheringstatechange","COMPLETE","ICE_GATHERING_STATE","iceConnectionState","elapsed","getElapsedTime","setLatencyAndClose","onicecandidate","e","SERVER_REFLEXIVE","candidate","String","type","toLowerCase","timeout","ELAPSED","resolve","peerConnectionProxy","Proxy","get","target","property","targetMember","bind","set","value","clusterId","Reflect","handleIceGatheringStateChange","handleOnIceCandidate","setTimeout","CLOSED","CONNECTION_STATE","connectionState","list","getUnreachablClusters","iceResults","reachabilityMap","latencyResult","latencyInMilliseconds","toString","length","getLocalSDPForClusters","localSDPData","REACHABLE","UNREACHABLE","resultKey","intialState","close"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint-disable class-methods-use-this */\n/* globals window */\nimport _ from 'lodash';\n\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {\n ICE_GATHERING_STATE,\n CONNECTION_STATE,\n REACHABILITY\n} from '../constants';\n\nimport ReachabilityRequest from './request';\n\nconst DEFAULT_TIMEOUT = 3000;\nconst VIDEO_MESH_TIMEOUT = 1000;\n\n/**\n * @class Reachability\n * @export\n */\nexport default class Reachability {\n /**\n * Creates an instance of Reachability.\n * @param {object} webex\n * @memberof Reachability\n */\n constructor(webex) {\n this.webex = webex;\n\n /**\n * internal request object for the server\n * @instance\n * @type {Array}\n * @private\n * @memberof Reachability\n */\n this.reachabilityRequest = new ReachabilityRequest(this.webex);\n\n /**\n * internal object of clusters latency results\n * @instance\n * @type {object}\n * @private\n * @memberof Reachability\n */\n this.clusterLatencyResults = {};\n }\n\n\n /**\n * fetches reachability data\n * @returns {Object} reachability data\n * @public\n * @async\n * @memberof Reachability\n */\n async gatherReachability() {\n this.setup();\n\n // Remove stored reachability results to ensure no stale data\n if (window?.localStorage?.removeItem) {\n window.localStorage.removeItem(REACHABILITY.localStorage);\n }\n else {\n LoggerProxy.logger.error('Reachability:index#gatherReachability --> Error in accessing LocalStorage.');\n\n return {};\n }\n\n // Fetch clusters and measure latency\n try {\n const clusters = await this.reachabilityRequest.getClusters();\n\n // Perform Reachability Check\n const results = await this.performReachabilityCheck(clusters);\n\n window.localStorage.setItem(REACHABILITY.localStorage, JSON.stringify(results));\n\n LoggerProxy.logger.log('Reachability:index#gatherReachability --> Reachability checks completed');\n\n return results;\n }\n catch (getClusterError) {\n LoggerProxy.logger.error(`Reachability:index#gatherReachability --> Error in calling getClusters(): ${getClusterError}`);\n\n return {};\n }\n }\n\n\n /**\n * Generate peerConnection config settings\n * @param {object} cluster\n * @returns {object} peerConnectionConfig\n * @private\n * @memberof Reachability\n */\n buildPeerConnectionConfig(cluster) {\n const iceServers = _.uniq([\n ...cluster.udp,\n ...cluster.tcp\n ]).map((url) => ({\n username: '',\n credential: '',\n urls: [url]\n }));\n\n return {\n iceServers: [\n ...iceServers\n ],\n iceCandidatePoolSize: '0',\n iceTransportPolicy: 'all'\n };\n }\n\n\n /**\n * Creates an RTCPeerConnection\n * @param {object} cluster\n * @returns {RTCPeerConnection} peerConnection\n * @private\n * @memberof Reachability\n */\n createPeerConnection(cluster) {\n const {key, config} = cluster;\n\n try {\n const peerConnection = new window.RTCPeerConnection(config);\n\n peerConnection.key = key;\n\n return peerConnection;\n }\n catch (peerConnectionError) {\n LoggerProxy.logger.log(`Reachability:index#createPeerConnection --> Error creating peerConnection: ${peerConnectionError}`);\n\n return null;\n }\n }\n\n\n /**\n * Gets total elapsed time\n * @param {RTCPeerConnection} peerConnection\n * @returns {Number} Milliseconds\n * @private\n * @memberof Reachability\n */\n getElapsedTime(peerConnection) {\n const startTime = peerConnection.begin;\n\n delete peerConnection.begin;\n\n return Date.now() - startTime;\n }\n\n\n /**\n * creates offer and generates localSDP\n * @param {object} clusterList cluster List\n * @returns {Promise} Reachability latency results\n * @private\n * @memberof Reachability\n */\n getLocalSDPForClusters(clusterList) {\n let clusters = [...Object.keys(clusterList)];\n\n clusters = clusters.map(async (key) => {\n const cluster = clusterList[key];\n const config = this.buildPeerConnectionConfig(cluster);\n const peerConnection = this.createPeerConnection({key, config});\n const description = await peerConnection.createOffer({offerToReceiveAudio: true});\n\n peerConnection.begin = Date.now();\n peerConnection.setLocalDescription(description);\n\n return this.iceGatheringState(peerConnection, cluster.isVideoMesh ? VIDEO_MESH_TIMEOUT : DEFAULT_TIMEOUT)\n .catch((iceGatheringStateError) => {\n LoggerProxy.logger.log(`Reachability:index#getLocalSDPForClusters --> Error in getLocalSDP : ${iceGatheringStateError}`);\n });\n });\n\n return Promise.all(clusters)\n .then(this.parseIceResultsToReachabilityResults)\n .then((reachabilityLatencyResults) => {\n this.logUnreachableClusters();\n\n // return results\n return reachabilityLatencyResults;\n });\n }\n\n\n /**\n * Get list of all unreachable clusters\n * @returns {array} Unreachable clusters\n * @private\n * @memberof Reachability\n */\n getUnreachablClusters() {\n const unreachableList = [];\n const clusters = this.clusterLatencyResults;\n\n Object.keys(clusters).forEach((key) => {\n const cluster = clusters[key];\n\n if (cluster.unreachable && !cluster.reachable) {\n unreachableList.push(key);\n }\n });\n\n return unreachableList;\n }\n\n\n /**\n * Attach an event handler for the icegatheringstatechange\n * event and measure latency.\n * @param {RTCPeerConnection} peerConnection\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n handleIceGatheringStateChange(peerConnection) {\n peerConnection.onicegatheringstatechange = () => {\n const {COMPLETE} = ICE_GATHERING_STATE;\n\n if (peerConnection.iceConnectionState === COMPLETE) {\n const elapsed = this.getElapsedTime(peerConnection);\n\n LoggerProxy.logger.log(`Reachability:index#onIceGatheringStateChange --> Successfully pinged ${peerConnection.key}:`, elapsed);\n this.setLatencyAndClose(peerConnection, elapsed);\n }\n };\n }\n\n\n /**\n * Attach an event handler for the icecandidate\n * event and measure latency.\n * @param {RTCPeerConnection} peerConnection\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n handleOnIceCandidate(peerConnection) {\n peerConnection.onicecandidate = (e) => {\n const SERVER_REFLEXIVE = 'srflx';\n\n if (e.candidate && String(e.candidate.type).toLowerCase() === SERVER_REFLEXIVE) {\n const elapsed = this.getElapsedTime(peerConnection);\n\n LoggerProxy.logger.log(`Reachability:index#onIceCandidate --> Successfully pinged ${peerConnection.key}:`, elapsed);\n this.setLatencyAndClose(peerConnection, elapsed);\n }\n };\n }\n\n /**\n * An event handler on an RTCPeerConnection when the state of the ICE\n * candidate gathering process changes. Used to measure connection\n * speed.\n * @private\n * @param {RTCPeerConnection} peerConnection\n * @param {number} timeout\n * @returns {Promise}\n */\n iceGatheringState(peerConnection, timeout) {\n const ELAPSED = 'elapsed';\n\n return new Promise((resolve) => {\n const peerConnectionProxy = new window.Proxy(peerConnection, {\n get(target, property) {\n const targetMember = target[property];\n\n if (typeof (targetMember) === 'function') {\n return targetMember.bind(target);\n }\n\n return targetMember;\n },\n set: (target, property, value) => {\n // only intercept elapsed property\n if (property === ELAPSED) {\n resolve({clusterId: peerConnection.key, elapsed: value});\n\n return true;\n }\n\n // pass thru\n return window.Reflect.set(target, property, value);\n }\n });\n\n // Using peerConnection proxy so handle functions below\n // won't be coupled to our promise implementation\n this.handleIceGatheringStateChange(peerConnectionProxy);\n this.handleOnIceCandidate(peerConnectionProxy);\n\n // Set maximum timeout\n window.setTimeout(() => {\n const {CLOSED} = CONNECTION_STATE;\n\n // Close any open peerConnections\n if (peerConnectionProxy.connectionState !== CLOSED) {\n this.setLatencyAndClose(peerConnectionProxy, null);\n }\n }, timeout);\n });\n }\n\n\n /**\n * Make a log of unreachable clusters.\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n logUnreachableClusters() {\n const list = this.getUnreachablClusters();\n\n list.forEach((cluster) => {\n LoggerProxy.logger.log(`Reachability:index#logUnreachableClusters --> No ice candidate for ${cluster}.`);\n });\n }\n\n\n /**\n * Calculates time to establish connection\n * @param {array} iceResults iceResults\n * @returns {object} reachabilityMap\n * @private\n * @memberof Reachability\n */\n parseIceResultsToReachabilityResults(iceResults) {\n const reachabilityMap = {};\n\n iceResults.forEach(({clusterId, elapsed}) => {\n let latencyResult;\n\n if (elapsed === null) {\n latencyResult = {reachable: 'false'};\n }\n else {\n latencyResult = {\n reachable: 'true',\n latencyInMilliseconds: (elapsed).toString()\n };\n }\n\n reachabilityMap[clusterId] = {\n udp: latencyResult,\n tcp: latencyResult\n };\n });\n\n return reachabilityMap;\n }\n\n\n /**\n * fetches reachability data\n * @param {object} clusterList\n * @returns {Promise<localSDPData>} reachability check results\n * @private\n * @memberof Reachability\n */\n performReachabilityCheck(clusterList) {\n if (!clusterList || !Object.keys(clusterList).length) {\n return Promise.resolve({});\n }\n\n return new Promise((resolve) => {\n this.getLocalSDPForClusters(clusterList)\n .then((localSDPData) => {\n if (!localSDPData || !Object.keys(localSDPData).length) {\n // TODO: handle the error condition properly and try retry\n LoggerProxy.logger.log('Reachability:index#performReachabilityCheck --> Local SDP is empty or has missing elements..returning');\n resolve({});\n }\n else {\n resolve(localSDPData);\n }\n })\n .catch((error) => {\n LoggerProxy.logger.error(`Reachability:index#performReachabilityCheck --> Error in getLocalSDPForClusters: ${error}`);\n resolve({});\n });\n });\n }\n\n\n /**\n * Records latency and closes the peerConnection\n * @param {RTCPeerConnection} peerConnection\n * @param {number} elapsed Latency in milliseconds\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n setLatencyAndClose(peerConnection, elapsed) {\n const REACHABLE = 'reachable';\n const UNREACHABLE = 'unreachable';\n const {CLOSED} = CONNECTION_STATE;\n const {key} = peerConnection;\n const resultKey = elapsed === null ? UNREACHABLE : REACHABLE;\n const intialState = {[REACHABLE]: 0, [UNREACHABLE]: 0};\n\n if (peerConnection.connectionState === CLOSED) {\n LoggerProxy.logger.log(`Reachability:index#setLatencyAndClose --> Attempting to set latency of ${elapsed} on closed peerConnection.`);\n\n return;\n }\n\n this.clusterLatencyResults[key] = this.clusterLatencyResults[key] || intialState;\n this.clusterLatencyResults[key][resultKey] += 1;\n\n // Set to null in case this fired from\n // an event other than onIceCandidate\n peerConnection.onicecandidate = null;\n peerConnection.close();\n peerConnection.elapsed = elapsed;\n }\n\n\n /**\n * utility function\n * @returns {undefined}\n * @private\n * @memberof Reachability\n */\n setup() {\n this.clusterLatencyResults = {};\n }\n}\n"],"mappings":"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"}
|
|
@@ -10,6 +10,8 @@ _Object$defineProperty(exports, "__esModule", {
|
|
|
10
10
|
|
|
11
11
|
exports.default = void 0;
|
|
12
12
|
|
|
13
|
+
var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
|
|
14
|
+
|
|
13
15
|
var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
|
|
14
16
|
|
|
15
17
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
|
|
@@ -23,18 +25,18 @@ var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy")
|
|
|
23
25
|
var _constants = require("../constants");
|
|
24
26
|
|
|
25
27
|
/**
|
|
26
|
-
* @class
|
|
28
|
+
* @class ReachabilityRequest
|
|
27
29
|
*/
|
|
28
|
-
var
|
|
30
|
+
var ReachabilityRequest = /*#__PURE__*/(0, _createClass2.default)(
|
|
29
31
|
/**
|
|
30
|
-
* Creates an instance of
|
|
32
|
+
* Creates an instance of ReachabilityRequest.
|
|
31
33
|
* @param {object} webex
|
|
32
|
-
* @memberof
|
|
34
|
+
* @memberof ReachabilityRequest
|
|
33
35
|
*/
|
|
34
|
-
function
|
|
36
|
+
function ReachabilityRequest(webex) {
|
|
35
37
|
var _this = this;
|
|
36
38
|
|
|
37
|
-
(0, _classCallCheck2.default)(this,
|
|
39
|
+
(0, _classCallCheck2.default)(this, ReachabilityRequest);
|
|
38
40
|
(0, _defineProperty2.default)(this, "getClusters", function () {
|
|
39
41
|
return _this.webex.request({
|
|
40
42
|
method: _constants.HTTP_VERBS.GET,
|
|
@@ -43,6 +45,11 @@ function RechabilityRequest(webex) {
|
|
|
43
45
|
resource: _constants.RESOURCE.CLUSTERS
|
|
44
46
|
}).then(function (res) {
|
|
45
47
|
var clusters = res.body.clusters;
|
|
48
|
+
(0, _keys.default)(clusters).forEach(function (key) {
|
|
49
|
+
var _res$body$clusterClas, _res$body$clusterClas2;
|
|
50
|
+
|
|
51
|
+
clusters[key].isVideoMesh = (_res$body$clusterClas = res.body.clusterClasses) === null || _res$body$clusterClas === void 0 ? void 0 : (_res$body$clusterClas2 = _res$body$clusterClas.hybridMedia) === null || _res$body$clusterClas2 === void 0 ? void 0 : _res$body$clusterClas2.includes(key);
|
|
52
|
+
});
|
|
46
53
|
|
|
47
54
|
_loggerProxy.default.logger.log("Reachability:request#getClusters --> get clusters successful:".concat((0, _stringify.default)(clusters)));
|
|
48
55
|
|
|
@@ -68,9 +75,11 @@ function RechabilityRequest(webex) {
|
|
|
68
75
|
}
|
|
69
76
|
/**
|
|
70
77
|
* gets the cluster information
|
|
78
|
+
*
|
|
79
|
+
* @param {boolean} includeVideoMesh whether to include the video mesh clusters in the result or not
|
|
71
80
|
* @returns {Promise}
|
|
72
81
|
*/
|
|
73
82
|
);
|
|
74
|
-
var _default =
|
|
83
|
+
var _default = ReachabilityRequest;
|
|
75
84
|
exports.default = _default;
|
|
76
85
|
//# sourceMappingURL=request.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["ReachabilityRequest","webex","request","method","HTTP_VERBS","GET","shouldRefreshAccessToken","api","API","CALLIOPEDISCOVERY","resource","RESOURCE","CLUSTERS","then","res","clusters","body","forEach","key","isVideoMesh","clusterClasses","hybridMedia","includes","LoggerProxy","logger","log","localSDPList","POST","REACHABILITY","offers"],"sources":["request.ts"],"sourcesContent":["import LoggerProxy from '../common/logs/logger-proxy';\nimport {\n HTTP_VERBS,\n RESOURCE,\n API\n} from '../constants';\n\nexport interface ClusterNode {\n isVideoMesh: boolean;\n udp: Array<string>;\n tcp: Array<string>;\n xtls: Array<string>;\n}\n\nexport type ClusterList = {\n [key:string]: ClusterNode;\n}\n\n/**\n * @class ReachabilityRequest\n */\nclass ReachabilityRequest {\n /**\n * Creates an instance of ReachabilityRequest.\n * @param {object} webex\n * @memberof ReachabilityRequest\n */\n constructor(webex) {\n this.webex = webex;\n }\n\n /**\n * gets the cluster information\n *\n * @param {boolean} includeVideoMesh whether to include the video mesh clusters in the result or not\n * @returns {Promise}\n */\n getClusters = (): Promise<ClusterList> => this.webex.request({\n method: HTTP_VERBS.GET,\n shouldRefreshAccessToken: false,\n api: API.CALLIOPEDISCOVERY,\n resource: RESOURCE.CLUSTERS\n })\n .then((res) => {\n const {clusters} = res.body;\n\n Object.keys(clusters).forEach((key) => {\n clusters[key].isVideoMesh = res.body.clusterClasses?.hybridMedia?.includes(key);\n });\n\n LoggerProxy.logger.log(`Reachability:request#getClusters --> get clusters successful:${JSON.stringify(clusters)}`);\n\n return clusters;\n });\n\n /**\n * gets remote SDP For Clusters\n * @param {Object} localSDPList localSDPs for the cluster\n * @returns {Object}\n */\n remoteSDPForClusters = (localSDPList) => this.webex.request({\n method: HTTP_VERBS.POST,\n shouldRefreshAccessToken: false,\n api: API.CALLIOPEDISCOVERY,\n resource: RESOURCE.REACHABILITY,\n body: {offers: localSDPList}\n })\n .then((res) => {\n LoggerProxy.logger.log('Reachability:request#remoteSDPForClusters --> Remote SDPs got succcessfully');\n\n return res.body;\n });\n}\n\nexport default ReachabilityRequest;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;;AACA;;AAiBA;AACA;AACA;IACMA,mB;AACJ;AACF;AACA;AACA;AACA;AACE,6BAAYC,KAAZ,EAAmB;EAAA;;EAAA;EAAA,mDAUL;IAAA,OAA4B,KAAI,CAACA,KAAL,CAAWC,OAAX,CAAmB;MAC3DC,MAAM,EAAEC,qBAAA,CAAWC,GADwC;MAE3DC,wBAAwB,EAAE,KAFiC;MAG3DC,GAAG,EAAEC,cAAA,CAAIC,iBAHkD;MAI3DC,QAAQ,EAAEC,mBAAA,CAASC;IAJwC,CAAnB,EAMvCC,IANuC,CAMlC,UAACC,GAAD,EAAS;MACb,IAAOC,QAAP,GAAmBD,GAAG,CAACE,IAAvB,CAAOD,QAAP;MAEA,mBAAYA,QAAZ,EAAsBE,OAAtB,CAA8B,UAACC,GAAD,EAAS;QAAA;;QACrCH,QAAQ,CAACG,GAAD,CAAR,CAAcC,WAAd,4BAA4BL,GAAG,CAACE,IAAJ,CAASI,cAArC,oFAA4B,sBAAyBC,WAArD,2DAA4B,uBAAsCC,QAAtC,CAA+CJ,GAA/C,CAA5B;MACD,CAFD;;MAIAK,oBAAA,CAAYC,MAAZ,CAAmBC,GAAnB,wEAAuF,wBAAeV,QAAf,CAAvF;;MAEA,OAAOA,QAAP;IACD,CAhBuC,CAA5B;EAAA,CAVK;EAAA,4DAiCI,UAACW,YAAD;IAAA,OAAkB,KAAI,CAACzB,KAAL,CAAWC,OAAX,CAAmB;MAC1DC,MAAM,EAAEC,qBAAA,CAAWuB,IADuC;MAE1DrB,wBAAwB,EAAE,KAFgC;MAG1DC,GAAG,EAAEC,cAAA,CAAIC,iBAHiD;MAI1DC,QAAQ,EAAEC,mBAAA,CAASiB,YAJuC;MAK1DZ,IAAI,EAAE;QAACa,MAAM,EAAEH;MAAT;IALoD,CAAnB,EAOtCb,IAPsC,CAOjC,UAACC,GAAD,EAAS;MACbS,oBAAA,CAAYC,MAAZ,CAAmBC,GAAnB,CAAuB,6EAAvB;;MAEA,OAAOX,GAAG,CAACE,IAAX;IACD,CAXsC,CAAlB;EAAA,CAjCJ;EACjB,KAAKf,KAAL,GAAaA,KAAb;AACD;AAED;AACF;AACA;AACA;AACA;AACA;;eAsCeD,mB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/plugin-meetings",
|
|
3
|
-
"version": "2.29.
|
|
3
|
+
"version": "2.29.3",
|
|
4
4
|
"description": "",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"contributors": [
|
|
@@ -24,15 +24,15 @@
|
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"@babel/runtime-corejs2": "^7.14.8",
|
|
27
|
-
"@webex/webex-core": "2.29.
|
|
28
|
-
"@webex/internal-plugin-mercury": "2.29.
|
|
29
|
-
"@webex/internal-plugin-conversation": "2.29.
|
|
27
|
+
"@webex/webex-core": "2.29.3",
|
|
28
|
+
"@webex/internal-plugin-mercury": "2.29.3",
|
|
29
|
+
"@webex/internal-plugin-conversation": "2.29.3",
|
|
30
30
|
"webrtc-adapter": "^7.7.0",
|
|
31
31
|
"lodash": "^4.17.21",
|
|
32
32
|
"uuid": "^3.3.2",
|
|
33
33
|
"global": "^4.4.0",
|
|
34
34
|
"ip-anonymize": "^0.1.0",
|
|
35
|
-
"@webex/common": "2.29.
|
|
35
|
+
"@webex/common": "2.29.3",
|
|
36
36
|
"bowser": "^2.11.0",
|
|
37
37
|
"sdp-transform": "^2.12.0",
|
|
38
38
|
"btoa": "^1.2.1",
|
|
@@ -15,6 +15,9 @@ import {
|
|
|
15
15
|
|
|
16
16
|
import ReachabilityRequest from './request';
|
|
17
17
|
|
|
18
|
+
const DEFAULT_TIMEOUT = 3000;
|
|
19
|
+
const VIDEO_MESH_TIMEOUT = 1000;
|
|
20
|
+
|
|
18
21
|
/**
|
|
19
22
|
* @class Reachability
|
|
20
23
|
* @export
|
|
@@ -77,6 +80,8 @@ export default class Reachability {
|
|
|
77
80
|
|
|
78
81
|
window.localStorage.setItem(REACHABILITY.localStorage, JSON.stringify(results));
|
|
79
82
|
|
|
83
|
+
LoggerProxy.logger.log('Reachability:index#gatherReachability --> Reachability checks completed');
|
|
84
|
+
|
|
80
85
|
return results;
|
|
81
86
|
}
|
|
82
87
|
catch (getClusterError) {
|
|
@@ -132,7 +137,7 @@ export default class Reachability {
|
|
|
132
137
|
return peerConnection;
|
|
133
138
|
}
|
|
134
139
|
catch (peerConnectionError) {
|
|
135
|
-
LoggerProxy.logger.log(`Reachability:index#
|
|
140
|
+
LoggerProxy.logger.log(`Reachability:index#createPeerConnection --> Error creating peerConnection: ${peerConnectionError}`);
|
|
136
141
|
|
|
137
142
|
return null;
|
|
138
143
|
}
|
|
@@ -174,7 +179,7 @@ export default class Reachability {
|
|
|
174
179
|
peerConnection.begin = Date.now();
|
|
175
180
|
peerConnection.setLocalDescription(description);
|
|
176
181
|
|
|
177
|
-
return this.iceGatheringState(peerConnection)
|
|
182
|
+
return this.iceGatheringState(peerConnection, cluster.isVideoMesh ? VIDEO_MESH_TIMEOUT : DEFAULT_TIMEOUT)
|
|
178
183
|
.catch((iceGatheringStateError) => {
|
|
179
184
|
LoggerProxy.logger.log(`Reachability:index#getLocalSDPForClusters --> Error in getLocalSDP : ${iceGatheringStateError}`);
|
|
180
185
|
});
|
|
@@ -256,18 +261,17 @@ export default class Reachability {
|
|
|
256
261
|
};
|
|
257
262
|
}
|
|
258
263
|
|
|
259
|
-
|
|
260
264
|
/**
|
|
261
265
|
* An event handler on an RTCPeerConnection when the state of the ICE
|
|
262
266
|
* candidate gathering process changes. Used to measure connection
|
|
263
267
|
* speed.
|
|
264
268
|
* @private
|
|
265
269
|
* @param {RTCPeerConnection} peerConnection
|
|
270
|
+
* @param {number} timeout
|
|
266
271
|
* @returns {Promise}
|
|
267
272
|
*/
|
|
268
|
-
iceGatheringState(peerConnection) {
|
|
273
|
+
iceGatheringState(peerConnection, timeout) {
|
|
269
274
|
const ELAPSED = 'elapsed';
|
|
270
|
-
const waitTime = 5e3;
|
|
271
275
|
|
|
272
276
|
return new Promise((resolve) => {
|
|
273
277
|
const peerConnectionProxy = new window.Proxy(peerConnection, {
|
|
@@ -300,13 +304,13 @@ export default class Reachability {
|
|
|
300
304
|
|
|
301
305
|
// Set maximum timeout
|
|
302
306
|
window.setTimeout(() => {
|
|
303
|
-
const CLOSED =
|
|
307
|
+
const {CLOSED} = CONNECTION_STATE;
|
|
304
308
|
|
|
305
309
|
// Close any open peerConnections
|
|
306
310
|
if (peerConnectionProxy.connectionState !== CLOSED) {
|
|
307
311
|
this.setLatencyAndClose(peerConnectionProxy, null);
|
|
308
312
|
}
|
|
309
|
-
},
|
|
313
|
+
}, timeout);
|
|
310
314
|
});
|
|
311
315
|
}
|
|
312
316
|
|
|
@@ -321,7 +325,7 @@ export default class Reachability {
|
|
|
321
325
|
const list = this.getUnreachablClusters();
|
|
322
326
|
|
|
323
327
|
list.forEach((cluster) => {
|
|
324
|
-
LoggerProxy.logger.log(`Reachability:index#
|
|
328
|
+
LoggerProxy.logger.log(`Reachability:index#logUnreachableClusters --> No ice candidate for ${cluster}.`);
|
|
325
329
|
});
|
|
326
330
|
}
|
|
327
331
|
|
|
@@ -5,14 +5,25 @@ import {
|
|
|
5
5
|
API
|
|
6
6
|
} from '../constants';
|
|
7
7
|
|
|
8
|
+
export interface ClusterNode {
|
|
9
|
+
isVideoMesh: boolean;
|
|
10
|
+
udp: Array<string>;
|
|
11
|
+
tcp: Array<string>;
|
|
12
|
+
xtls: Array<string>;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export type ClusterList = {
|
|
16
|
+
[key:string]: ClusterNode;
|
|
17
|
+
}
|
|
18
|
+
|
|
8
19
|
/**
|
|
9
|
-
* @class
|
|
20
|
+
* @class ReachabilityRequest
|
|
10
21
|
*/
|
|
11
|
-
class
|
|
22
|
+
class ReachabilityRequest {
|
|
12
23
|
/**
|
|
13
|
-
* Creates an instance of
|
|
24
|
+
* Creates an instance of ReachabilityRequest.
|
|
14
25
|
* @param {object} webex
|
|
15
|
-
* @memberof
|
|
26
|
+
* @memberof ReachabilityRequest
|
|
16
27
|
*/
|
|
17
28
|
constructor(webex) {
|
|
18
29
|
this.webex = webex;
|
|
@@ -20,9 +31,11 @@ class RechabilityRequest {
|
|
|
20
31
|
|
|
21
32
|
/**
|
|
22
33
|
* gets the cluster information
|
|
34
|
+
*
|
|
35
|
+
* @param {boolean} includeVideoMesh whether to include the video mesh clusters in the result or not
|
|
23
36
|
* @returns {Promise}
|
|
24
37
|
*/
|
|
25
|
-
getClusters = () => this.webex.request({
|
|
38
|
+
getClusters = (): Promise<ClusterList> => this.webex.request({
|
|
26
39
|
method: HTTP_VERBS.GET,
|
|
27
40
|
shouldRefreshAccessToken: false,
|
|
28
41
|
api: API.CALLIOPEDISCOVERY,
|
|
@@ -31,6 +44,10 @@ class RechabilityRequest {
|
|
|
31
44
|
.then((res) => {
|
|
32
45
|
const {clusters} = res.body;
|
|
33
46
|
|
|
47
|
+
Object.keys(clusters).forEach((key) => {
|
|
48
|
+
clusters[key].isVideoMesh = res.body.clusterClasses?.hybridMedia?.includes(key);
|
|
49
|
+
});
|
|
50
|
+
|
|
34
51
|
LoggerProxy.logger.log(`Reachability:request#getClusters --> get clusters successful:${JSON.stringify(clusters)}`);
|
|
35
52
|
|
|
36
53
|
return clusters;
|
|
@@ -55,4 +72,4 @@ class RechabilityRequest {
|
|
|
55
72
|
});
|
|
56
73
|
}
|
|
57
74
|
|
|
58
|
-
export default
|
|
75
|
+
export default ReachabilityRequest;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
|
|
2
|
+
import {assert} from '@webex/test-helper-chai';
|
|
3
|
+
import sinon from 'sinon';
|
|
4
|
+
import ReachabilityRequest from '@webex/plugin-meetings/src/reachability/request';
|
|
5
|
+
|
|
6
|
+
describe('ReachabilityRequest', () => {
|
|
7
|
+
let webex;
|
|
8
|
+
let reachabilityRequest;
|
|
9
|
+
|
|
10
|
+
const VIDEO_MESH_NODE_0 = '111-222-333-some-vmn';
|
|
11
|
+
const VIDEO_MESH_NODE_1 = '444-555-666-some-vmn';
|
|
12
|
+
|
|
13
|
+
const CLOUD_NODE_0 = 'some-public-node-1.somewhere';
|
|
14
|
+
const CLOUD_NODE_1 = 'some-public-node-2.somewhere';
|
|
15
|
+
|
|
16
|
+
const vmnClusterUrls = [{
|
|
17
|
+
tcp: ['some vmn node 0 tcp url', 'another vmn node 0 tcp url'],
|
|
18
|
+
udp: ['some vmn node 0 udp url', 'another vmn node 0 udp url']
|
|
19
|
+
}, {
|
|
20
|
+
tcp: ['some vmn node 1 tcp url', 'another vmn node 1 tcp url'],
|
|
21
|
+
udp: ['some vmn node 1 udp url', 'another vmn node 1 udp url']
|
|
22
|
+
}
|
|
23
|
+
];
|
|
24
|
+
|
|
25
|
+
const cloudClusterUrls = [{
|
|
26
|
+
tcp: ['some public node 0 tcp url', 'another public node 0 tcp url'],
|
|
27
|
+
udp: ['some public node 0 udp url', 'another public node 0 udp url']
|
|
28
|
+
}, {
|
|
29
|
+
tcp: ['some public node 1 tcp url', 'another public node 1 tcp url'],
|
|
30
|
+
udp: ['some public node 1 udp url', 'another public node 1 udp url']
|
|
31
|
+
}
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
beforeEach(() => {
|
|
35
|
+
webex = {
|
|
36
|
+
request: sinon.stub()
|
|
37
|
+
};
|
|
38
|
+
reachabilityRequest = new ReachabilityRequest(webex);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
describe('getClusters', () => {
|
|
42
|
+
beforeEach(() => {
|
|
43
|
+
webex.request = sinon.fake.resolves({
|
|
44
|
+
body: {
|
|
45
|
+
clusterClasses: {
|
|
46
|
+
ocpCloud: [],
|
|
47
|
+
publicCloud: [],
|
|
48
|
+
hybridMedia: [VIDEO_MESH_NODE_0, VIDEO_MESH_NODE_1]
|
|
49
|
+
},
|
|
50
|
+
clusters: {
|
|
51
|
+
[VIDEO_MESH_NODE_0]: vmnClusterUrls[0],
|
|
52
|
+
[VIDEO_MESH_NODE_1]: vmnClusterUrls[1],
|
|
53
|
+
[CLOUD_NODE_0]: cloudClusterUrls[0],
|
|
54
|
+
[CLOUD_NODE_1]: cloudClusterUrls[1],
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it('marks video mesh clusters correctly', async () => {
|
|
61
|
+
const clusters = await reachabilityRequest.getClusters(false);
|
|
62
|
+
|
|
63
|
+
assert.deepEqual(clusters, {
|
|
64
|
+
[VIDEO_MESH_NODE_0]: {
|
|
65
|
+
...vmnClusterUrls[0],
|
|
66
|
+
isVideoMesh: true,
|
|
67
|
+
},
|
|
68
|
+
[VIDEO_MESH_NODE_1]: {
|
|
69
|
+
...vmnClusterUrls[1],
|
|
70
|
+
isVideoMesh: true,
|
|
71
|
+
},
|
|
72
|
+
[CLOUD_NODE_0]: {
|
|
73
|
+
...cloudClusterUrls[0],
|
|
74
|
+
isVideoMesh: false,
|
|
75
|
+
},
|
|
76
|
+
[CLOUD_NODE_1]: {
|
|
77
|
+
...cloudClusterUrls[1],
|
|
78
|
+
isVideoMesh: false,
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
|