@webex/plugin-meetings 2.59.6-next.2 → 2.59.7
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/common/browser-detection.d.ts +9 -0
- package/dist/common/browser-detection.js +2 -2
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.d.ts +48 -0
- package/dist/common/collection.js +2 -2
- package/dist/common/collection.js.map +1 -1
- package/dist/common/config.d.ts +2 -0
- package/dist/common/errors/captcha-error.d.ts +15 -0
- package/dist/common/errors/intent-to-join.d.ts +16 -0
- package/dist/common/errors/join-meeting.d.ts +17 -0
- package/dist/common/errors/media.d.ts +15 -0
- package/dist/common/errors/parameter.d.ts +15 -0
- package/dist/common/errors/password-error.d.ts +15 -0
- package/dist/common/errors/permission.d.ts +14 -0
- package/dist/common/errors/reconnection-in-progress.d.ts +9 -0
- package/dist/common/errors/reconnection.d.ts +15 -0
- package/dist/common/errors/stats.d.ts +15 -0
- package/dist/common/errors/webex-errors.d.ts +81 -0
- package/dist/common/errors/webex-meetings-error.d.ts +20 -0
- package/dist/common/events/events-scope.d.ts +17 -0
- package/dist/common/events/events.d.ts +12 -0
- package/dist/common/events/trigger-proxy.d.ts +2 -0
- package/dist/common/events/util.d.ts +2 -0
- package/dist/common/logs/logger-config.d.ts +2 -0
- package/dist/common/logs/logger-proxy.d.ts +2 -0
- package/dist/common/logs/request.d.ts +34 -0
- package/dist/common/queue.d.ts +32 -0
- package/dist/config.d.ts +73 -0
- package/dist/config.js +2 -2
- package/dist/config.js.map +1 -1
- package/dist/constants.d.ts +926 -0
- package/dist/constants.js +2 -0
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/constants.d.ts +4 -0
- package/dist/controls-options-manager/enums.d.ts +5 -0
- package/dist/controls-options-manager/index.d.ts +120 -0
- package/dist/controls-options-manager/index.js +2 -2
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/controls-options-manager/util.d.ts +7 -0
- package/dist/index.d.ts +4 -0
- package/dist/locus-info/controlsUtils.d.ts +2 -0
- package/dist/locus-info/controlsUtils.js +6 -6
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/embeddedAppsUtils.d.ts +2 -0
- package/dist/locus-info/fullState.d.ts +2 -0
- package/dist/locus-info/hostUtils.d.ts +2 -0
- package/dist/locus-info/index.d.ts +269 -0
- package/dist/locus-info/index.js +18 -18
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/infoUtils.d.ts +2 -0
- package/dist/locus-info/mediaSharesUtils.d.ts +2 -0
- package/dist/locus-info/parser.d.ts +212 -0
- package/dist/locus-info/parser.js +2 -2
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/locus-info/selfUtils.d.ts +2 -0
- package/dist/media/index.d.ts +32 -0
- package/dist/media/properties.d.ts +108 -0
- package/dist/media/util.d.ts +2 -0
- package/dist/mediaQualityMetrics/config.d.ts +233 -0
- package/dist/meeting/effectsState.d.ts +42 -0
- package/dist/meeting/in-meeting-actions.d.ts +79 -0
- package/dist/meeting/index.d.ts +1622 -0
- package/dist/meeting/index.js +51 -28
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.d.ts +116 -0
- package/dist/meeting/request.d.ts +255 -0
- package/dist/meeting/request.js +2 -2
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/state.d.ts +9 -0
- package/dist/meeting/util.d.ts +2 -0
- package/dist/meeting/util.js +4 -4
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.d.ts +20 -0
- package/dist/meeting-info/collection.js +2 -2
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/index.d.ts +57 -0
- package/dist/meeting-info/meeting-info-v2.d.ts +93 -0
- package/dist/meeting-info/request.d.ts +22 -0
- package/dist/meeting-info/util.d.ts +2 -0
- package/dist/meeting-info/utilv2.d.ts +2 -0
- package/dist/meetings/collection.d.ts +23 -0
- package/dist/meetings/collection.js +2 -2
- package/dist/meetings/collection.js.map +1 -1
- package/dist/meetings/index.d.ts +296 -0
- package/dist/meetings/request.d.ts +27 -0
- package/dist/meetings/util.d.ts +18 -0
- package/dist/member/index.d.ts +147 -0
- package/dist/member/member.types.d.ts +11 -0
- package/dist/member/util.d.ts +2 -0
- package/dist/members/collection.d.ts +24 -0
- package/dist/members/index.d.ts +298 -0
- package/dist/members/index.js +2 -2
- package/dist/members/index.js.map +1 -1
- package/dist/members/request.d.ts +50 -0
- package/dist/members/util.d.ts +2 -0
- package/dist/metrics/config.d.ts +169 -0
- package/dist/metrics/constants.d.ts +59 -0
- package/dist/metrics/constants.js +2 -0
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.d.ts +152 -0
- package/dist/metrics/index.js +2 -2
- package/dist/metrics/index.js.map +1 -1
- package/dist/networkQualityMonitor/index.d.ts +70 -0
- package/dist/peer-connection-manager/index.d.ts +6 -0
- package/dist/peer-connection-manager/util.d.ts +6 -0
- package/dist/personal-meeting-room/index.d.ts +47 -0
- package/dist/personal-meeting-room/request.d.ts +14 -0
- package/dist/personal-meeting-room/util.d.ts +2 -0
- package/dist/reachability/index.d.ts +139 -0
- package/dist/reachability/index.js +2 -9
- package/dist/reachability/index.js.map +1 -1
- package/dist/reachability/request.d.ts +35 -0
- package/dist/reactions/reactions.d.ts +4 -0
- package/dist/reactions/reactions.type.d.ts +32 -0
- package/dist/reconnection-manager/index.d.ts +112 -0
- package/dist/recording-controller/enums.d.ts +7 -0
- package/dist/recording-controller/index.d.ts +193 -0
- package/dist/recording-controller/util.d.ts +13 -0
- package/dist/roap/collection.d.ts +10 -0
- package/dist/roap/handler.d.ts +47 -0
- package/dist/roap/index.d.ts +116 -0
- package/dist/roap/index.js +13 -12
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/request.d.ts +35 -0
- package/dist/roap/state.d.ts +9 -0
- package/dist/roap/turnDiscovery.d.ts +81 -0
- package/dist/roap/turnDiscovery.js +130 -44
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/roap/util.d.ts +2 -0
- package/dist/statsAnalyzer/global.d.ts +118 -0
- package/dist/statsAnalyzer/global.js +4 -12
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.d.ts +193 -0
- package/dist/statsAnalyzer/index.js +56 -14
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.d.ts +22 -0
- package/dist/statsAnalyzer/mqaUtil.js +15 -15
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/dist/transcription/index.d.ts +64 -0
- package/package.json +21 -22
- package/src/config.ts +2 -2
- package/src/constants.ts +2 -0
- package/src/meeting/index.ts +35 -0
- package/src/metrics/constants.ts +2 -0
- package/src/roap/index.ts +14 -10
- package/src/roap/turnDiscovery.ts +48 -20
- package/src/statsAnalyzer/global.ts +2 -10
- package/src/statsAnalyzer/index.ts +80 -17
- package/test/unit/spec/meeting/index.js +77 -6
- package/test/unit/spec/roap/index.ts +84 -80
- package/test/unit/spec/roap/turnDiscovery.ts +21 -0
- package/test/unit/spec/stats-analyzer/index.js +151 -0
|
@@ -6,8 +6,10 @@ _Object$defineProperty(exports, "__esModule", {
|
|
|
6
6
|
value: true
|
|
7
7
|
});
|
|
8
8
|
exports.default = void 0;
|
|
9
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime-corejs2/regenerator"));
|
|
9
10
|
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
|
|
10
11
|
var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
|
|
12
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
|
|
11
13
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
|
|
12
14
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
|
|
13
15
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
@@ -206,52 +208,136 @@ var TurnDiscovery = /*#__PURE__*/function () {
|
|
|
206
208
|
*/
|
|
207
209
|
}, {
|
|
208
210
|
key: "doTurnDiscovery",
|
|
209
|
-
value: function
|
|
210
|
-
var
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
211
|
+
value: function () {
|
|
212
|
+
var _doTurnDiscovery = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(meeting, isReconnecting) {
|
|
213
|
+
var _this2 = this;
|
|
214
|
+
var turnDiscoverySkippedReason;
|
|
215
|
+
return _regenerator.default.wrap(function _callee$(_context) {
|
|
216
|
+
while (1) switch (_context.prev = _context.next) {
|
|
217
|
+
case 0:
|
|
218
|
+
_context.next = 2;
|
|
219
|
+
return this.getSkipReason(meeting);
|
|
220
|
+
case 2:
|
|
221
|
+
turnDiscoverySkippedReason = _context.sent;
|
|
222
|
+
if (!turnDiscoverySkippedReason) {
|
|
223
|
+
_context.next = 5;
|
|
224
|
+
break;
|
|
225
|
+
}
|
|
226
|
+
return _context.abrupt("return", {
|
|
227
|
+
turnServerInfo: undefined,
|
|
228
|
+
turnDiscoverySkippedReason: turnDiscoverySkippedReason
|
|
229
|
+
});
|
|
230
|
+
case 5:
|
|
231
|
+
return _context.abrupt("return", this.sendRoapTurnDiscoveryRequest(meeting, isReconnecting).then(function () {
|
|
232
|
+
return _this2.waitForTurnDiscoveryResponse();
|
|
233
|
+
}).then(function () {
|
|
234
|
+
return _this2.sendRoapOK(meeting);
|
|
235
|
+
}).then(function () {
|
|
236
|
+
_this2.defer = undefined;
|
|
237
|
+
_loggerProxy.default.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');
|
|
238
|
+
return {
|
|
239
|
+
turnServerInfo: _this2.turnInfo,
|
|
240
|
+
turnDiscoverySkippedReason: undefined
|
|
241
|
+
};
|
|
242
|
+
}).catch(function (e) {
|
|
243
|
+
// we catch any errors and resolve with no turn information so that the normal call join flow can continue without TURN
|
|
244
|
+
_loggerProxy.default.logger.info("Roap:turnDiscovery#doTurnDiscovery --> TURN discovery failed, continuing without TURN: ".concat(e));
|
|
245
|
+
_metrics.default.sendBehavioralMetric(_constants.default.TURN_DISCOVERY_FAILURE, {
|
|
246
|
+
correlation_id: meeting.correlationId,
|
|
247
|
+
locus_id: meeting.locusUrl.split('/').pop(),
|
|
248
|
+
reason: e.message,
|
|
249
|
+
stack: e.stack
|
|
250
|
+
});
|
|
251
|
+
return _promise.default.resolve({
|
|
252
|
+
turnServerInfo: undefined,
|
|
253
|
+
turnDiscoverySkippedReason: undefined
|
|
254
|
+
});
|
|
255
|
+
}));
|
|
256
|
+
case 6:
|
|
257
|
+
case "end":
|
|
258
|
+
return _context.stop();
|
|
259
|
+
}
|
|
260
|
+
}, _callee, this);
|
|
261
|
+
}));
|
|
262
|
+
function doTurnDiscovery(_x, _x2) {
|
|
263
|
+
return _doTurnDiscovery.apply(this, arguments);
|
|
219
264
|
}
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
265
|
+
return doTurnDiscovery;
|
|
266
|
+
}()
|
|
267
|
+
/**
|
|
268
|
+
* Gets the reason why reachability is skipped.
|
|
269
|
+
*
|
|
270
|
+
* @param {Meeting} meeting
|
|
271
|
+
* @returns {Promise<string>} Promise with empty string if reachability is not skipped or a reason if it is skipped
|
|
272
|
+
*/
|
|
273
|
+
}, {
|
|
274
|
+
key: "getSkipReason",
|
|
275
|
+
value: function () {
|
|
276
|
+
var _getSkipReason = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(meeting) {
|
|
277
|
+
var isAnyClusterReachable;
|
|
278
|
+
return _regenerator.default.wrap(function _callee2$(_context2) {
|
|
279
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
280
|
+
case 0:
|
|
281
|
+
_context2.next = 2;
|
|
282
|
+
return meeting.webex.meetings.reachability.isAnyClusterReachable();
|
|
283
|
+
case 2:
|
|
284
|
+
isAnyClusterReachable = _context2.sent;
|
|
285
|
+
if (!isAnyClusterReachable) {
|
|
286
|
+
_context2.next = 6;
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
_loggerProxy.default.logger.info('Roap:turnDiscovery#getSkipReason --> reachability has not failed, skipping TURN discovery');
|
|
290
|
+
return _context2.abrupt("return", 'reachability');
|
|
291
|
+
case 6:
|
|
292
|
+
if (meeting.config.experimental.enableTurnDiscovery) {
|
|
293
|
+
_context2.next = 9;
|
|
294
|
+
break;
|
|
295
|
+
}
|
|
296
|
+
_loggerProxy.default.logger.info('Roap:turnDiscovery#getSkipReason --> TURN discovery disabled in config, skipping it');
|
|
297
|
+
return _context2.abrupt("return", 'config');
|
|
298
|
+
case 9:
|
|
299
|
+
return _context2.abrupt("return", '');
|
|
300
|
+
case 10:
|
|
301
|
+
case "end":
|
|
302
|
+
return _context2.stop();
|
|
303
|
+
}
|
|
304
|
+
}, _callee2);
|
|
305
|
+
}));
|
|
306
|
+
function getSkipReason(_x3) {
|
|
307
|
+
return _getSkipReason.apply(this, arguments);
|
|
228
308
|
}
|
|
229
|
-
return
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
309
|
+
return getSkipReason;
|
|
310
|
+
}()
|
|
311
|
+
/**
|
|
312
|
+
* Checks if TURN discovery is skipped.
|
|
313
|
+
*
|
|
314
|
+
* @param {Meeting} meeting
|
|
315
|
+
* @returns {Boolean} true if TURN discovery is being skipped, false if it is being done
|
|
316
|
+
*/
|
|
317
|
+
}, {
|
|
318
|
+
key: "isSkipped",
|
|
319
|
+
value: function () {
|
|
320
|
+
var _isSkipped = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(meeting) {
|
|
321
|
+
var skipReason;
|
|
322
|
+
return _regenerator.default.wrap(function _callee3$(_context3) {
|
|
323
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
324
|
+
case 0:
|
|
325
|
+
_context3.next = 2;
|
|
326
|
+
return this.getSkipReason(meeting);
|
|
327
|
+
case 2:
|
|
328
|
+
skipReason = _context3.sent;
|
|
329
|
+
return _context3.abrupt("return", !!skipReason);
|
|
330
|
+
case 4:
|
|
331
|
+
case "end":
|
|
332
|
+
return _context3.stop();
|
|
333
|
+
}
|
|
334
|
+
}, _callee3, this);
|
|
335
|
+
}));
|
|
336
|
+
function isSkipped(_x4) {
|
|
337
|
+
return _isSkipped.apply(this, arguments);
|
|
338
|
+
}
|
|
339
|
+
return isSkipped;
|
|
340
|
+
}()
|
|
255
341
|
}]);
|
|
256
342
|
return TurnDiscovery;
|
|
257
343
|
}();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_common","require","_metrics","_interopRequireDefault","_constants","_loggerProxy","_constants2","TURN_DISCOVERY_TIMEOUT","TurnDiscovery","roapRequest","_classCallCheck2","default","_defineProperty2","turnInfo","url","username","password","_createClass2","key","value","waitForTurnDiscoveryResponse","defer","LoggerProxy","logger","warn","_promise","reject","Error","responseTimer","setTimeout","concat","info","promise","handleTurnDiscoveryResponse","roapMessage","_this","headers","expectedHeaders","headerName","field","foundHeaders","forEach","receivedHeader","expectedHeader","startsWith","substring","length","clearTimeout","undefined","_stringify","resolve","sendRoapTurnDiscoveryRequest","meeting","isReconnecting","_meeting$audio","_meeting$video","seq","roapSeq","Defer","messageType","ROAP","ROAP_TYPES","TURN_DISCOVERY_REQUEST","version","ROAP_VERSION","sendRoap","correlationId","locusSelfUrl","selfUrl","mediaId","audioMuted","audio","isLocallyMuted","videoMuted","video","meetingId","id","then","_ref","mediaConnections","setRoapSeq","updateMediaConnections","sendRoapOK","_meeting$audio2","_meeting$video2","OK","doTurnDiscovery","_this2","isAnyClusterReachable","webex","meetings","reachability","turnServerInfo","turnDiscoverySkippedReason","config","experimental","enableTurnDiscovery","catch","e","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","TURN_DISCOVERY_FAILURE","correlation_id","locus_id","locusUrl","split","pop","reason","message","stack","exports"],"sources":["turnDiscovery.ts"],"sourcesContent":["// @ts-ignore - Types not available for @webex/common\nimport {Defer} from '@webex/common';\n\nimport Metrics from '../metrics';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {ROAP} from '../constants';\n\nimport RoapRequest from './request';\nimport Meeting from '../meeting';\n\nconst TURN_DISCOVERY_TIMEOUT = 10; // in seconds\n\n/**\n * Handles the process of finding out TURN server information from Linus.\n * This is achieved by sending a TURN_DISCOVERY_REQUEST.\n */\nexport default class TurnDiscovery {\n private roapRequest: RoapRequest;\n\n private defer?: Defer; // used for waiting for the response\n\n private turnInfo: {\n url: string;\n username: string;\n password: string;\n };\n\n private responseTimer?: ReturnType<typeof setTimeout>;\n\n /**\n * Constructor\n *\n * @param {RoapRequest} roapRequest\n */\n constructor(roapRequest: RoapRequest) {\n this.roapRequest = roapRequest;\n this.turnInfo = {\n url: '',\n username: '',\n password: '',\n };\n }\n\n /**\n * waits for TURN_DISCOVERY_RESPONSE message to arrive\n *\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private waitForTurnDiscoveryResponse() {\n if (!this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> TURN discovery is not in progress'\n );\n\n return Promise.reject(\n new Error('waitForTurnDiscoveryResponse() called before sendRoapTurnDiscoveryRequest()')\n );\n }\n\n const {defer} = this;\n\n this.responseTimer = setTimeout(() => {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#waitForTurnDiscoveryResponse --> timeout! no response arrived within ${TURN_DISCOVERY_TIMEOUT} seconds`\n );\n\n defer.reject(new Error('Timed out waiting for TURN_DISCOVERY_RESPONSE'));\n }, TURN_DISCOVERY_TIMEOUT * 1000);\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> waiting for TURN_DISCOVERY_RESPONSE...'\n );\n\n return defer.promise;\n }\n\n /**\n * handles TURN_DISCOVERY_RESPONSE roap message\n *\n * @param {Object} roapMessage\n * @returns {void}\n * @public\n * @memberof Roap\n */\n public handleTurnDiscoveryResponse(roapMessage: object) {\n // @ts-ignore - Fix missing type\n const {headers} = roapMessage;\n\n if (!this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#handleTurnDiscoveryResponse --> unexpected TURN discovery response'\n );\n\n return;\n }\n\n const expectedHeaders = [\n {headerName: 'x-cisco-turn-url', field: 'url'},\n {headerName: 'x-cisco-turn-username', field: 'username'},\n {headerName: 'x-cisco-turn-password', field: 'password'},\n ];\n\n let foundHeaders = 0;\n\n headers?.forEach((receivedHeader) => {\n // check if it matches any of our expected headers\n expectedHeaders.forEach((expectedHeader) => {\n if (receivedHeader.startsWith(`${expectedHeader.headerName}=`)) {\n this.turnInfo[expectedHeader.field] = receivedHeader.substring(\n expectedHeader.headerName.length + 1\n );\n foundHeaders += 1;\n }\n });\n });\n\n clearTimeout(this.responseTimer);\n this.responseTimer = undefined;\n\n if (foundHeaders !== expectedHeaders.length) {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> missing some headers, received: ${JSON.stringify(\n headers\n )}`\n );\n this.defer.reject(\n new Error(`TURN_DISCOVERY_RESPONSE missing some headers: ${JSON.stringify(headers)}`)\n );\n } else {\n LoggerProxy.logger.info(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> received a valid response, url=${this.turnInfo.url}`\n );\n this.defer.resolve();\n }\n }\n\n /**\n * sends the TURN_DISCOVERY_REQUEST roap request\n *\n * @param {Meeting} meeting\n * @param {Boolean} isReconnecting\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private sendRoapTurnDiscoveryRequest(meeting: Meeting, isReconnecting: boolean) {\n const seq = meeting.roapSeq + 1;\n\n if (this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> already in progress'\n );\n\n return Promise.resolve();\n }\n\n this.defer = new Defer();\n\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,\n version: ROAP.ROAP_VERSION,\n seq,\n };\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> sending TURN_DISCOVERY_REQUEST'\n );\n\n return this.roapRequest\n .sendRoap({\n roapMessage,\n correlationId: meeting.correlationId,\n // @ts-ignore - Fix missing type\n locusSelfUrl: meeting.selfUrl,\n // @ts-ignore - Fix missing type\n mediaId: isReconnecting ? '' : meeting.mediaId,\n audioMuted: meeting.audio?.isLocallyMuted(),\n videoMuted: meeting.video?.isLocallyMuted(),\n meetingId: meeting.id,\n })\n .then(({mediaConnections}) => {\n meeting.setRoapSeq(seq);\n\n if (mediaConnections) {\n meeting.updateMediaConnections(mediaConnections);\n }\n });\n }\n\n /**\n * Sends the OK message that server expects to receive\n * after it sends us TURN_DISCOVERY_RESPONSE\n *\n * @param {Meeting} meeting\n * @returns {Promise}\n */\n sendRoapOK(meeting: Meeting) {\n LoggerProxy.logger.info('Roap:turnDiscovery#sendRoapOK --> sending OK');\n\n return this.roapRequest.sendRoap({\n roapMessage: {\n messageType: ROAP.ROAP_TYPES.OK,\n version: ROAP.ROAP_VERSION,\n seq: meeting.roapSeq,\n },\n // @ts-ignore - fix type\n locusSelfUrl: meeting.selfUrl,\n // @ts-ignore - fix type\n mediaId: meeting.mediaId,\n correlationId: meeting.correlationId,\n audioMuted: meeting.audio?.isLocallyMuted(),\n videoMuted: meeting.video?.isLocallyMuted(),\n meetingId: meeting.id,\n });\n }\n\n /**\n * Retrieves TURN server information from the backend by doing\n * a roap message exchange:\n * client server\n * | -----TURN_DISCOVERY_REQUEST-----> |\n * | <----TURN_DISCOVERY_RESPONSE----- |\n * | --------------OK----------------> |\n *\n * @param {Meeting} meeting\n * @param {Boolean} isReconnecting should be set to true if this is a new\n * media connection just after a reconnection\n * @returns {Promise}\n */\n doTurnDiscovery(meeting: Meeting, isReconnecting?: boolean) {\n // @ts-ignore - fix type\n const isAnyClusterReachable = meeting.webex.meetings.reachability.isAnyClusterReachable();\n\n if (isAnyClusterReachable) {\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#doTurnDiscovery --> reachability has not failed, skipping TURN discovery'\n );\n\n return Promise.resolve({\n turnServerInfo: undefined,\n turnDiscoverySkippedReason: 'reachability',\n });\n }\n\n // @ts-ignore - fix type\n if (!meeting.config.experimental.enableTurnDiscovery) {\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#doTurnDiscovery --> TURN discovery disabled in config, skipping it'\n );\n\n return Promise.resolve({turnServerInfo: undefined, turnDiscoverySkippedReason: 'config'});\n }\n\n return this.sendRoapTurnDiscoveryRequest(meeting, isReconnecting)\n .then(() => this.waitForTurnDiscoveryResponse())\n .then(() => this.sendRoapOK(meeting))\n .then(() => {\n this.defer = undefined;\n\n LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');\n\n return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};\n })\n .catch((e) => {\n // we catch any errors and resolve with no turn information so that the normal call join flow can continue without TURN\n LoggerProxy.logger.info(\n `Roap:turnDiscovery#doTurnDiscovery --> TURN discovery failed, continuing without TURN: ${e}`\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_FAILURE, {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusUrl.split('/').pop(),\n reason: e.message,\n stack: e.stack,\n });\n\n return Promise.resolve({turnServerInfo: undefined, turnDiscoverySkippedReason: undefined});\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"names":["_common","require","_metrics","_interopRequireDefault","_constants","_loggerProxy","_constants2","TURN_DISCOVERY_TIMEOUT","TurnDiscovery","roapRequest","_classCallCheck2","default","_defineProperty2","turnInfo","url","username","password","_createClass2","key","value","waitForTurnDiscoveryResponse","defer","LoggerProxy","logger","warn","_promise","reject","Error","responseTimer","setTimeout","concat","info","promise","handleTurnDiscoveryResponse","roapMessage","_this","headers","expectedHeaders","headerName","field","foundHeaders","forEach","receivedHeader","expectedHeader","startsWith","substring","length","clearTimeout","undefined","_stringify","resolve","sendRoapTurnDiscoveryRequest","meeting","isReconnecting","_meeting$audio","_meeting$video","seq","roapSeq","Defer","messageType","ROAP","ROAP_TYPES","TURN_DISCOVERY_REQUEST","version","ROAP_VERSION","sendRoap","correlationId","locusSelfUrl","selfUrl","mediaId","audioMuted","audio","isLocallyMuted","videoMuted","video","meetingId","id","then","_ref","mediaConnections","setRoapSeq","updateMediaConnections","sendRoapOK","_meeting$audio2","_meeting$video2","OK","_doTurnDiscovery","_asyncToGenerator2","_regenerator","mark","_callee","_this2","turnDiscoverySkippedReason","wrap","_callee$","_context","prev","next","getSkipReason","sent","abrupt","turnServerInfo","catch","e","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","TURN_DISCOVERY_FAILURE","correlation_id","locus_id","locusUrl","split","pop","reason","message","stack","stop","doTurnDiscovery","_x","_x2","apply","arguments","_getSkipReason","_callee2","isAnyClusterReachable","_callee2$","_context2","webex","meetings","reachability","config","experimental","enableTurnDiscovery","_x3","_isSkipped","_callee3","skipReason","_callee3$","_context3","isSkipped","_x4","exports"],"sources":["turnDiscovery.ts"],"sourcesContent":["// @ts-ignore - Types not available for @webex/common\nimport {Defer} from '@webex/common';\n\nimport Metrics from '../metrics';\nimport BEHAVIORAL_METRICS from '../metrics/constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport {ROAP} from '../constants';\n\nimport RoapRequest from './request';\nimport Meeting from '../meeting';\n\nconst TURN_DISCOVERY_TIMEOUT = 10; // in seconds\n\n/**\n * Handles the process of finding out TURN server information from Linus.\n * This is achieved by sending a TURN_DISCOVERY_REQUEST.\n */\nexport default class TurnDiscovery {\n private roapRequest: RoapRequest;\n\n private defer?: Defer; // used for waiting for the response\n\n private turnInfo: {\n url: string;\n username: string;\n password: string;\n };\n\n private responseTimer?: ReturnType<typeof setTimeout>;\n\n /**\n * Constructor\n *\n * @param {RoapRequest} roapRequest\n */\n constructor(roapRequest: RoapRequest) {\n this.roapRequest = roapRequest;\n this.turnInfo = {\n url: '',\n username: '',\n password: '',\n };\n }\n\n /**\n * waits for TURN_DISCOVERY_RESPONSE message to arrive\n *\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private waitForTurnDiscoveryResponse() {\n if (!this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> TURN discovery is not in progress'\n );\n\n return Promise.reject(\n new Error('waitForTurnDiscoveryResponse() called before sendRoapTurnDiscoveryRequest()')\n );\n }\n\n const {defer} = this;\n\n this.responseTimer = setTimeout(() => {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#waitForTurnDiscoveryResponse --> timeout! no response arrived within ${TURN_DISCOVERY_TIMEOUT} seconds`\n );\n\n defer.reject(new Error('Timed out waiting for TURN_DISCOVERY_RESPONSE'));\n }, TURN_DISCOVERY_TIMEOUT * 1000);\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#waitForTurnDiscoveryResponse --> waiting for TURN_DISCOVERY_RESPONSE...'\n );\n\n return defer.promise;\n }\n\n /**\n * handles TURN_DISCOVERY_RESPONSE roap message\n *\n * @param {Object} roapMessage\n * @returns {void}\n * @public\n * @memberof Roap\n */\n public handleTurnDiscoveryResponse(roapMessage: object) {\n // @ts-ignore - Fix missing type\n const {headers} = roapMessage;\n\n if (!this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#handleTurnDiscoveryResponse --> unexpected TURN discovery response'\n );\n\n return;\n }\n\n const expectedHeaders = [\n {headerName: 'x-cisco-turn-url', field: 'url'},\n {headerName: 'x-cisco-turn-username', field: 'username'},\n {headerName: 'x-cisco-turn-password', field: 'password'},\n ];\n\n let foundHeaders = 0;\n\n headers?.forEach((receivedHeader) => {\n // check if it matches any of our expected headers\n expectedHeaders.forEach((expectedHeader) => {\n if (receivedHeader.startsWith(`${expectedHeader.headerName}=`)) {\n this.turnInfo[expectedHeader.field] = receivedHeader.substring(\n expectedHeader.headerName.length + 1\n );\n foundHeaders += 1;\n }\n });\n });\n\n clearTimeout(this.responseTimer);\n this.responseTimer = undefined;\n\n if (foundHeaders !== expectedHeaders.length) {\n LoggerProxy.logger.warn(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> missing some headers, received: ${JSON.stringify(\n headers\n )}`\n );\n this.defer.reject(\n new Error(`TURN_DISCOVERY_RESPONSE missing some headers: ${JSON.stringify(headers)}`)\n );\n } else {\n LoggerProxy.logger.info(\n `Roap:turnDiscovery#handleTurnDiscoveryResponse --> received a valid response, url=${this.turnInfo.url}`\n );\n this.defer.resolve();\n }\n }\n\n /**\n * sends the TURN_DISCOVERY_REQUEST roap request\n *\n * @param {Meeting} meeting\n * @param {Boolean} isReconnecting\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private sendRoapTurnDiscoveryRequest(meeting: Meeting, isReconnecting: boolean) {\n const seq = meeting.roapSeq + 1;\n\n if (this.defer) {\n LoggerProxy.logger.warn(\n 'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> already in progress'\n );\n\n return Promise.resolve();\n }\n\n this.defer = new Defer();\n\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.TURN_DISCOVERY_REQUEST,\n version: ROAP.ROAP_VERSION,\n seq,\n };\n\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> sending TURN_DISCOVERY_REQUEST'\n );\n\n return this.roapRequest\n .sendRoap({\n roapMessage,\n correlationId: meeting.correlationId,\n // @ts-ignore - Fix missing type\n locusSelfUrl: meeting.selfUrl,\n // @ts-ignore - Fix missing type\n mediaId: isReconnecting ? '' : meeting.mediaId,\n audioMuted: meeting.audio?.isLocallyMuted(),\n videoMuted: meeting.video?.isLocallyMuted(),\n meetingId: meeting.id,\n })\n .then(({mediaConnections}) => {\n meeting.setRoapSeq(seq);\n\n if (mediaConnections) {\n meeting.updateMediaConnections(mediaConnections);\n }\n });\n }\n\n /**\n * Sends the OK message that server expects to receive\n * after it sends us TURN_DISCOVERY_RESPONSE\n *\n * @param {Meeting} meeting\n * @returns {Promise}\n */\n sendRoapOK(meeting: Meeting) {\n LoggerProxy.logger.info('Roap:turnDiscovery#sendRoapOK --> sending OK');\n\n return this.roapRequest.sendRoap({\n roapMessage: {\n messageType: ROAP.ROAP_TYPES.OK,\n version: ROAP.ROAP_VERSION,\n seq: meeting.roapSeq,\n },\n // @ts-ignore - fix type\n locusSelfUrl: meeting.selfUrl,\n // @ts-ignore - fix type\n mediaId: meeting.mediaId,\n correlationId: meeting.correlationId,\n audioMuted: meeting.audio?.isLocallyMuted(),\n videoMuted: meeting.video?.isLocallyMuted(),\n meetingId: meeting.id,\n });\n }\n\n /**\n * Retrieves TURN server information from the backend by doing\n * a roap message exchange:\n * client server\n * | -----TURN_DISCOVERY_REQUEST-----> |\n * | <----TURN_DISCOVERY_RESPONSE----- |\n * | --------------OK----------------> |\n *\n * @param {Meeting} meeting\n * @param {Boolean} isReconnecting should be set to true if this is a new\n * media connection just after a reconnection\n * @returns {Promise}\n */\n async doTurnDiscovery(meeting: Meeting, isReconnecting?: boolean) {\n const turnDiscoverySkippedReason = await this.getSkipReason(meeting);\n\n if (turnDiscoverySkippedReason) {\n return {\n turnServerInfo: undefined,\n turnDiscoverySkippedReason,\n };\n }\n\n return this.sendRoapTurnDiscoveryRequest(meeting, isReconnecting)\n .then(() => this.waitForTurnDiscoveryResponse())\n .then(() => this.sendRoapOK(meeting))\n .then(() => {\n this.defer = undefined;\n\n LoggerProxy.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');\n\n return {turnServerInfo: this.turnInfo, turnDiscoverySkippedReason: undefined};\n })\n .catch((e) => {\n // we catch any errors and resolve with no turn information so that the normal call join flow can continue without TURN\n LoggerProxy.logger.info(\n `Roap:turnDiscovery#doTurnDiscovery --> TURN discovery failed, continuing without TURN: ${e}`\n );\n\n Metrics.sendBehavioralMetric(BEHAVIORAL_METRICS.TURN_DISCOVERY_FAILURE, {\n correlation_id: meeting.correlationId,\n locus_id: meeting.locusUrl.split('/').pop(),\n reason: e.message,\n stack: e.stack,\n });\n\n return Promise.resolve({turnServerInfo: undefined, turnDiscoverySkippedReason: undefined});\n });\n }\n\n /**\n * Gets the reason why reachability is skipped.\n *\n * @param {Meeting} meeting\n * @returns {Promise<string>} Promise with empty string if reachability is not skipped or a reason if it is skipped\n */\n private async getSkipReason(meeting: Meeting): Promise<string> {\n // @ts-ignore - fix type\n const isAnyClusterReachable = await meeting.webex.meetings.reachability.isAnyClusterReachable();\n\n if (isAnyClusterReachable) {\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#getSkipReason --> reachability has not failed, skipping TURN discovery'\n );\n\n return 'reachability';\n }\n\n // @ts-ignore - fix type\n if (!meeting.config.experimental.enableTurnDiscovery) {\n LoggerProxy.logger.info(\n 'Roap:turnDiscovery#getSkipReason --> TURN discovery disabled in config, skipping it'\n );\n\n return 'config';\n }\n\n return '';\n }\n\n /**\n * Checks if TURN discovery is skipped.\n *\n * @param {Meeting} meeting\n * @returns {Boolean} true if TURN discovery is being skipped, false if it is being done\n */\n async isSkipped(meeting) {\n const skipReason = await this.getSkipReason(meeting);\n\n return !!skipReason;\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
declare const STATS_DEFAULT: {
|
|
2
|
+
encryption: string;
|
|
3
|
+
audio: {
|
|
4
|
+
send: {
|
|
5
|
+
maxPacketLossRatio: number;
|
|
6
|
+
availableBandwidth: number;
|
|
7
|
+
bytesSent: number;
|
|
8
|
+
meanRemoteJitter: any[];
|
|
9
|
+
meanRoundTripTime: any[];
|
|
10
|
+
};
|
|
11
|
+
recv: {
|
|
12
|
+
availableBandwidth: number;
|
|
13
|
+
bytesReceived: number;
|
|
14
|
+
meanRtpJitter: any[];
|
|
15
|
+
meanRoundTripTime: any[];
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
video: {
|
|
19
|
+
send: {
|
|
20
|
+
maxPacketLossRatio: number;
|
|
21
|
+
availableBandwidth: number;
|
|
22
|
+
meanRemoteJitter: any[];
|
|
23
|
+
meanRoundTripTime: any[];
|
|
24
|
+
};
|
|
25
|
+
recv: {
|
|
26
|
+
availableBandwidth: number;
|
|
27
|
+
totalPacketsLost: number;
|
|
28
|
+
meanRtpJitter: any[];
|
|
29
|
+
meanRoundTripTime: any[];
|
|
30
|
+
};
|
|
31
|
+
latency: number;
|
|
32
|
+
packetsLost: number;
|
|
33
|
+
};
|
|
34
|
+
share: {
|
|
35
|
+
send: {
|
|
36
|
+
maxPacketLossRatio: number;
|
|
37
|
+
availableBandwidth: number;
|
|
38
|
+
totalPacketsLost: number;
|
|
39
|
+
meanRemoteJitter: any[];
|
|
40
|
+
meanRoundTripTime: any[];
|
|
41
|
+
};
|
|
42
|
+
recv: {
|
|
43
|
+
availableBandwidth: number;
|
|
44
|
+
meanRtpJitter: any[];
|
|
45
|
+
meanRoundTripTime: any[];
|
|
46
|
+
};
|
|
47
|
+
latency: number;
|
|
48
|
+
packetsLost: number;
|
|
49
|
+
};
|
|
50
|
+
bandwidth: {
|
|
51
|
+
systemBandwidth: number;
|
|
52
|
+
sentPerSecond: number;
|
|
53
|
+
encodedPerSecond: number;
|
|
54
|
+
helper: {
|
|
55
|
+
audioBytesSent: number;
|
|
56
|
+
videoBytestSent: number;
|
|
57
|
+
};
|
|
58
|
+
speed: number;
|
|
59
|
+
};
|
|
60
|
+
results: {};
|
|
61
|
+
connectionType: {
|
|
62
|
+
systemNetworkType: string;
|
|
63
|
+
systemIpAddress: string;
|
|
64
|
+
local: {
|
|
65
|
+
candidateType: any[];
|
|
66
|
+
transport: any[];
|
|
67
|
+
ipAddress: any[];
|
|
68
|
+
networkType: any[];
|
|
69
|
+
};
|
|
70
|
+
remote: {
|
|
71
|
+
candidateType: any[];
|
|
72
|
+
transport: any[];
|
|
73
|
+
ipAddress: any[];
|
|
74
|
+
networkType: any[];
|
|
75
|
+
};
|
|
76
|
+
};
|
|
77
|
+
resolutions: {
|
|
78
|
+
video: {
|
|
79
|
+
send: {
|
|
80
|
+
width: number;
|
|
81
|
+
height: number;
|
|
82
|
+
framesSent: number;
|
|
83
|
+
};
|
|
84
|
+
recv: {
|
|
85
|
+
width: number;
|
|
86
|
+
height: number;
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
share: {
|
|
90
|
+
send: {
|
|
91
|
+
width: number;
|
|
92
|
+
height: number;
|
|
93
|
+
framesSent: number;
|
|
94
|
+
};
|
|
95
|
+
recv: {
|
|
96
|
+
width: number;
|
|
97
|
+
height: number;
|
|
98
|
+
};
|
|
99
|
+
};
|
|
100
|
+
};
|
|
101
|
+
internal: {
|
|
102
|
+
audio: {
|
|
103
|
+
send: {};
|
|
104
|
+
recv: {};
|
|
105
|
+
};
|
|
106
|
+
video: {
|
|
107
|
+
send: {};
|
|
108
|
+
recv: {};
|
|
109
|
+
};
|
|
110
|
+
share: {
|
|
111
|
+
send: {};
|
|
112
|
+
recv: {};
|
|
113
|
+
};
|
|
114
|
+
remote: {};
|
|
115
|
+
candidates: {};
|
|
116
|
+
};
|
|
117
|
+
};
|
|
118
|
+
export default STATS_DEFAULT;
|
|
@@ -82,20 +82,11 @@ var STATS_DEFAULT = {
|
|
|
82
82
|
}
|
|
83
83
|
},
|
|
84
84
|
resolutions: {
|
|
85
|
-
audio: {
|
|
86
|
-
send: {
|
|
87
|
-
width: 0,
|
|
88
|
-
height: 0
|
|
89
|
-
},
|
|
90
|
-
recv: {
|
|
91
|
-
width: 0,
|
|
92
|
-
height: 0
|
|
93
|
-
}
|
|
94
|
-
},
|
|
95
85
|
video: {
|
|
96
86
|
send: {
|
|
97
87
|
width: 0,
|
|
98
|
-
height: 0
|
|
88
|
+
height: 0,
|
|
89
|
+
framesSent: 0
|
|
99
90
|
},
|
|
100
91
|
recv: {
|
|
101
92
|
width: 0,
|
|
@@ -105,7 +96,8 @@ var STATS_DEFAULT = {
|
|
|
105
96
|
share: {
|
|
106
97
|
send: {
|
|
107
98
|
width: 0,
|
|
108
|
-
height: 0
|
|
99
|
+
height: 0,
|
|
100
|
+
framesSent: 0
|
|
109
101
|
},
|
|
110
102
|
recv: {
|
|
111
103
|
width: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["STATS_DEFAULT","encryption","audio","send","maxPacketLossRatio","availableBandwidth","bytesSent","meanRemoteJitter","meanRoundTripTime","recv","bytesReceived","meanRtpJitter","video","totalPacketsLost","latency","packetsLost","share","bandwidth","systemBandwidth","sentPerSecond","encodedPerSecond","helper","audioBytesSent","videoBytestSent","speed","results","connectionType","systemNetworkType","systemIpAddress","local","candidateType","transport","ipAddress","networkType","remote","resolutions","width","height","internal","candidates","_default","exports","default"],"sources":["global.ts"],"sourcesContent":["const STATS_DEFAULT = {\n encryption: 'sha-256',\n audio: {\n send: {\n maxPacketLossRatio: 0,\n availableBandwidth: 0,\n bytesSent: 0,\n meanRemoteJitter: [],\n meanRoundTripTime: [],\n },\n recv: {\n availableBandwidth: 0,\n bytesReceived: 0,\n meanRtpJitter: [],\n meanRoundTripTime: [],\n },\n },\n video: {\n send: {\n maxPacketLossRatio: 0,\n availableBandwidth: 0,\n meanRemoteJitter: [],\n meanRoundTripTime: [],\n },\n recv: {\n availableBandwidth: 0,\n totalPacketsLost: 0,\n meanRtpJitter: [],\n meanRoundTripTime: [],\n },\n latency: 0,\n packetsLost: 0,\n },\n share: {\n send: {\n maxPacketLossRatio: 0,\n availableBandwidth: 0,\n totalPacketsLost: 0,\n meanRemoteJitter: [],\n meanRoundTripTime: [],\n },\n recv: {\n availableBandwidth: 0,\n meanRtpJitter: [],\n meanRoundTripTime: [],\n },\n\n latency: 0,\n packetsLost: 0,\n },\n bandwidth: {\n systemBandwidth: 0,\n sentPerSecond: 0,\n encodedPerSecond: 0,\n helper: {\n audioBytesSent: 0,\n videoBytestSent: 0,\n },\n speed: 0,\n },\n results: {},\n connectionType: {\n systemNetworkType: 'unknown',\n systemIpAddress: '0.0.0.0',\n local: {\n candidateType: [],\n transport: [],\n ipAddress: [],\n networkType: [],\n },\n remote: {\n candidateType: [],\n transport: [],\n ipAddress: [],\n networkType: [],\n },\n },\n resolutions: {\n
|
|
1
|
+
{"version":3,"names":["STATS_DEFAULT","encryption","audio","send","maxPacketLossRatio","availableBandwidth","bytesSent","meanRemoteJitter","meanRoundTripTime","recv","bytesReceived","meanRtpJitter","video","totalPacketsLost","latency","packetsLost","share","bandwidth","systemBandwidth","sentPerSecond","encodedPerSecond","helper","audioBytesSent","videoBytestSent","speed","results","connectionType","systemNetworkType","systemIpAddress","local","candidateType","transport","ipAddress","networkType","remote","resolutions","width","height","framesSent","internal","candidates","_default","exports","default"],"sources":["global.ts"],"sourcesContent":["const STATS_DEFAULT = {\n encryption: 'sha-256',\n audio: {\n send: {\n maxPacketLossRatio: 0,\n availableBandwidth: 0,\n bytesSent: 0,\n meanRemoteJitter: [],\n meanRoundTripTime: [],\n },\n recv: {\n availableBandwidth: 0,\n bytesReceived: 0,\n meanRtpJitter: [],\n meanRoundTripTime: [],\n },\n },\n video: {\n send: {\n maxPacketLossRatio: 0,\n availableBandwidth: 0,\n meanRemoteJitter: [],\n meanRoundTripTime: [],\n },\n recv: {\n availableBandwidth: 0,\n totalPacketsLost: 0,\n meanRtpJitter: [],\n meanRoundTripTime: [],\n },\n latency: 0,\n packetsLost: 0,\n },\n share: {\n send: {\n maxPacketLossRatio: 0,\n availableBandwidth: 0,\n totalPacketsLost: 0,\n meanRemoteJitter: [],\n meanRoundTripTime: [],\n },\n recv: {\n availableBandwidth: 0,\n meanRtpJitter: [],\n meanRoundTripTime: [],\n },\n\n latency: 0,\n packetsLost: 0,\n },\n bandwidth: {\n systemBandwidth: 0,\n sentPerSecond: 0,\n encodedPerSecond: 0,\n helper: {\n audioBytesSent: 0,\n videoBytestSent: 0,\n },\n speed: 0,\n },\n results: {},\n connectionType: {\n systemNetworkType: 'unknown',\n systemIpAddress: '0.0.0.0',\n local: {\n candidateType: [],\n transport: [],\n ipAddress: [],\n networkType: [],\n },\n remote: {\n candidateType: [],\n transport: [],\n ipAddress: [],\n networkType: [],\n },\n },\n resolutions: {\n video: {\n send: {\n width: 0,\n height: 0,\n framesSent: 0,\n },\n recv: {\n width: 0,\n height: 0,\n },\n },\n share: {\n send: {\n width: 0,\n height: 0,\n framesSent: 0,\n },\n recv: {\n width: 0,\n height: 0,\n },\n },\n },\n internal: {\n audio: {\n send: {},\n recv: {},\n },\n video: {\n send: {},\n recv: {},\n },\n share: {\n send: {},\n recv: {},\n },\n remote: {},\n candidates: {},\n },\n};\n\nexport default STATS_DEFAULT;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import EventsScope from '../common/events/events-scope';
|
|
3
|
+
export declare const EVENTS: {
|
|
4
|
+
MEDIA_QUALITY: string;
|
|
5
|
+
NO_FRAMES_SENT: string;
|
|
6
|
+
NO_VIDEO_ENCODED: string;
|
|
7
|
+
LOCAL_MEDIA_STARTED: string;
|
|
8
|
+
LOCAL_MEDIA_STOPPED: string;
|
|
9
|
+
REMOTE_MEDIA_STARTED: string;
|
|
10
|
+
REMOTE_MEDIA_STOPPED: string;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Stats Analyzer class that will emit events based on detected quality
|
|
14
|
+
*
|
|
15
|
+
* @export
|
|
16
|
+
* @class StatsAnalyzer
|
|
17
|
+
* @extends {EventsScope}
|
|
18
|
+
*/
|
|
19
|
+
export declare class StatsAnalyzer extends EventsScope {
|
|
20
|
+
config: any;
|
|
21
|
+
correlationId: any;
|
|
22
|
+
lastEmittedStartStopEvent: any;
|
|
23
|
+
lastMqaDataSent: any;
|
|
24
|
+
lastStatsResults: any;
|
|
25
|
+
localMQEStats: any;
|
|
26
|
+
meetingMediaStatus: any;
|
|
27
|
+
mqaInterval: NodeJS.Timeout;
|
|
28
|
+
mqaSentCount: any;
|
|
29
|
+
networkQualityMonitor: any;
|
|
30
|
+
peerConnection: any;
|
|
31
|
+
statsInterval: NodeJS.Timeout;
|
|
32
|
+
statsResults: any;
|
|
33
|
+
statsStarted: any;
|
|
34
|
+
/**
|
|
35
|
+
* Creates a new instance of StatsAnalyzer
|
|
36
|
+
* @constructor
|
|
37
|
+
* @public
|
|
38
|
+
* @param {Object} config SDK Configuration Object
|
|
39
|
+
* @param {Object} networkQualityMonitor class for assessing network characteristics (jitter, packetLoss, latency)
|
|
40
|
+
* @param {Object} statsResults Default properties for stats
|
|
41
|
+
*/
|
|
42
|
+
constructor(config: any, networkQualityMonitor?: object, statsResults?: object);
|
|
43
|
+
populateResults(lastMqa: any): void;
|
|
44
|
+
resetStatsResults(): void;
|
|
45
|
+
/**
|
|
46
|
+
* sets mediaStatus status for analyzing metrics
|
|
47
|
+
*
|
|
48
|
+
* @public
|
|
49
|
+
* @param {Object} status for the audio and video
|
|
50
|
+
* @memberof StatsAnalyzer
|
|
51
|
+
* @returns {void}
|
|
52
|
+
*/
|
|
53
|
+
updateMediaStatus(status: object): void;
|
|
54
|
+
/**
|
|
55
|
+
* captures MQA data from peerconnection
|
|
56
|
+
*
|
|
57
|
+
* @public
|
|
58
|
+
* @memberof StatsAnalyzer
|
|
59
|
+
* @returns {void}
|
|
60
|
+
*/
|
|
61
|
+
sendMqaData(): void;
|
|
62
|
+
/**
|
|
63
|
+
* updated the peerconnection when changed
|
|
64
|
+
*
|
|
65
|
+
* @private
|
|
66
|
+
* @memberof updatePeerconnection
|
|
67
|
+
* @param {PeerConnection} peerConnection
|
|
68
|
+
* @returns {void}
|
|
69
|
+
*/
|
|
70
|
+
updatePeerconnection(peerConnection: any): void;
|
|
71
|
+
/**
|
|
72
|
+
* Starts the stats analyzer on interval
|
|
73
|
+
*
|
|
74
|
+
* @public
|
|
75
|
+
* @memberof StatsAnalyzer
|
|
76
|
+
* @param {PeerConnection} peerConnection
|
|
77
|
+
* @returns {Promise}
|
|
78
|
+
*/
|
|
79
|
+
startAnalyzer(peerConnection: any): Promise<void>;
|
|
80
|
+
/**
|
|
81
|
+
* Cleans up the analyzer when done
|
|
82
|
+
*
|
|
83
|
+
* @public
|
|
84
|
+
* @memberof StatsAnalyzer
|
|
85
|
+
* @returns {void}
|
|
86
|
+
*/
|
|
87
|
+
stopAnalyzer(): Promise<void>;
|
|
88
|
+
/**
|
|
89
|
+
* Parse a single result of get stats
|
|
90
|
+
*
|
|
91
|
+
* @private
|
|
92
|
+
* @param {*} getStatsResult
|
|
93
|
+
* @param {String} type
|
|
94
|
+
* @param {boolean} isSender
|
|
95
|
+
* @returns {void}
|
|
96
|
+
* @memberof StatsAnalyzer
|
|
97
|
+
*/
|
|
98
|
+
private parseGetStatsResult;
|
|
99
|
+
/**
|
|
100
|
+
* Filters the get stats results for types
|
|
101
|
+
* @private
|
|
102
|
+
* @param {Array} getStatsResults
|
|
103
|
+
* @param {String} type
|
|
104
|
+
* @param {boolean} isSender
|
|
105
|
+
* @returns {void}
|
|
106
|
+
*/
|
|
107
|
+
private filterAndParseGetStatsResults;
|
|
108
|
+
/**
|
|
109
|
+
* parse the audio
|
|
110
|
+
* @param {String} result
|
|
111
|
+
* @param {boolean} type
|
|
112
|
+
* @returns {void}
|
|
113
|
+
*/
|
|
114
|
+
parseAudioSource(result: any, type: any): void;
|
|
115
|
+
/**
|
|
116
|
+
* emits started/stopped events for local/remote media by checking
|
|
117
|
+
* if given values are increasing or not. The previousValue, currentValue
|
|
118
|
+
* params can be any numerical value like number of receive packets or
|
|
119
|
+
* decoded frames, etc.
|
|
120
|
+
*
|
|
121
|
+
* @private
|
|
122
|
+
* @param {string} mediaType
|
|
123
|
+
* @param {number} previousValue - value to compare
|
|
124
|
+
* @param {number} currentValue - value to compare (must be same type of value as previousValue)
|
|
125
|
+
* @param {boolean} isLocal - true if stats are for local media being sent out, false for remote media being received
|
|
126
|
+
* @memberof StatsAnalyzer
|
|
127
|
+
* @returns {void}
|
|
128
|
+
*/
|
|
129
|
+
emitStartStopEvents: (mediaType: string, previousValue: number, currentValue: number, isLocal: boolean) => void;
|
|
130
|
+
/**
|
|
131
|
+
* compares current and previous stats to check if packets are not sent
|
|
132
|
+
*
|
|
133
|
+
* @private
|
|
134
|
+
* @memberof StatsAnalyzer
|
|
135
|
+
* @returns {void}
|
|
136
|
+
*/
|
|
137
|
+
private compareLastStatsResult;
|
|
138
|
+
/**
|
|
139
|
+
* Does a `getStats` on all the transceivers and parses the results
|
|
140
|
+
*
|
|
141
|
+
* @private
|
|
142
|
+
* @memberof StatsAnalyzer
|
|
143
|
+
* @returns {Promise}
|
|
144
|
+
*/
|
|
145
|
+
private getStatsAndParse;
|
|
146
|
+
/**
|
|
147
|
+
* Processes OutboundRTP stats result and stores
|
|
148
|
+
* @private
|
|
149
|
+
* @param {*} result
|
|
150
|
+
* @param {*} type
|
|
151
|
+
* @returns {void}
|
|
152
|
+
*/
|
|
153
|
+
private processOutboundRTPResult;
|
|
154
|
+
/**
|
|
155
|
+
* Processes InboundRTP stats result and stores
|
|
156
|
+
* @private
|
|
157
|
+
* @param {*} result
|
|
158
|
+
* @param {*} type
|
|
159
|
+
* @returns {void}
|
|
160
|
+
*/
|
|
161
|
+
private processInboundRTPResult;
|
|
162
|
+
/**
|
|
163
|
+
* Processes remote and local candidate result and stores
|
|
164
|
+
* @private
|
|
165
|
+
* @param {*} result
|
|
166
|
+
* @param {*} type
|
|
167
|
+
* @param {boolean} isSender
|
|
168
|
+
* @param {boolean} isRemote
|
|
169
|
+
*
|
|
170
|
+
* @returns {void}
|
|
171
|
+
*/
|
|
172
|
+
parseCandidate: (result: any, type: any, isSender: boolean, isRemote: boolean) => void;
|
|
173
|
+
/**
|
|
174
|
+
* Process Track results
|
|
175
|
+
*
|
|
176
|
+
* @private
|
|
177
|
+
* @param {*} result
|
|
178
|
+
* @param {*} mediaType
|
|
179
|
+
* @param {*} sendrecvType
|
|
180
|
+
* @returns {void}
|
|
181
|
+
* @memberof StatsAnalyzer
|
|
182
|
+
*/
|
|
183
|
+
private processTrackResult;
|
|
184
|
+
/**
|
|
185
|
+
*
|
|
186
|
+
* @private
|
|
187
|
+
* @param {*} result
|
|
188
|
+
* @param {*} type
|
|
189
|
+
* @returns {void}
|
|
190
|
+
* @memberof StatsAnalyzer
|
|
191
|
+
*/
|
|
192
|
+
private compareSentAndReceived;
|
|
193
|
+
}
|