@webex/plugin-meetings 2.59.5 → 2.59.6-next.2
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.js +2 -2
- package/dist/common/browser-detection.js.map +1 -1
- package/dist/common/collection.js +2 -2
- package/dist/common/collection.js.map +1 -1
- package/dist/config.js +2 -2
- package/dist/config.js.map +1 -1
- package/dist/constants.js +0 -2
- package/dist/constants.js.map +1 -1
- package/dist/controls-options-manager/index.js +2 -2
- package/dist/controls-options-manager/index.js.map +1 -1
- package/dist/locus-info/controlsUtils.js +6 -6
- package/dist/locus-info/controlsUtils.js.map +1 -1
- package/dist/locus-info/index.js +18 -18
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/parser.js +2 -2
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/meeting/index.js +173 -167
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/request.js +2 -2
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +4 -4
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/collection.js +2 -2
- package/dist/meeting-info/collection.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +7 -1
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meetings/collection.js +2 -2
- package/dist/meetings/collection.js.map +1 -1
- package/dist/members/index.js +2 -2
- package/dist/members/index.js.map +1 -1
- package/dist/metrics/constants.js +0 -2
- package/dist/metrics/constants.js.map +1 -1
- package/dist/metrics/index.js +2 -2
- package/dist/metrics/index.js.map +1 -1
- package/dist/reachability/index.js +9 -2
- package/dist/reachability/index.js.map +1 -1
- package/dist/roap/index.js +12 -13
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/turnDiscovery.js +44 -130
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/global.js +12 -4
- package/dist/statsAnalyzer/global.js.map +1 -1
- package/dist/statsAnalyzer/index.js +14 -56
- package/dist/statsAnalyzer/index.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +15 -15
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/package.json +22 -21
- package/src/config.ts +2 -2
- package/src/constants.ts +0 -2
- package/src/meeting/index.ts +23 -47
- package/src/meeting-info/meeting-info-v2.ts +1 -1
- package/src/metrics/constants.ts +0 -2
- package/src/roap/index.ts +10 -14
- package/src/roap/turnDiscovery.ts +20 -48
- package/src/statsAnalyzer/global.ts +10 -2
- package/src/statsAnalyzer/index.ts +17 -80
- package/test/unit/spec/meeting/index.js +53 -83
- package/test/unit/spec/meeting-info/meetinginfov2.js +1 -1
- package/test/unit/spec/roap/index.ts +80 -84
- package/test/unit/spec/roap/turnDiscovery.ts +0 -21
- package/test/unit/spec/stats-analyzer/index.js +0 -151
- package/dist/common/browser-detection.d.ts +0 -9
- package/dist/common/collection.d.ts +0 -48
- package/dist/common/config.d.ts +0 -2
- package/dist/common/errors/captcha-error.d.ts +0 -15
- package/dist/common/errors/intent-to-join.d.ts +0 -16
- package/dist/common/errors/join-meeting.d.ts +0 -17
- package/dist/common/errors/media.d.ts +0 -15
- package/dist/common/errors/parameter.d.ts +0 -15
- package/dist/common/errors/password-error.d.ts +0 -15
- package/dist/common/errors/permission.d.ts +0 -14
- package/dist/common/errors/reconnection-in-progress.d.ts +0 -9
- package/dist/common/errors/reconnection.d.ts +0 -15
- package/dist/common/errors/stats.d.ts +0 -15
- package/dist/common/errors/webex-errors.d.ts +0 -81
- package/dist/common/errors/webex-meetings-error.d.ts +0 -20
- package/dist/common/events/events-scope.d.ts +0 -17
- package/dist/common/events/events.d.ts +0 -12
- package/dist/common/events/trigger-proxy.d.ts +0 -2
- package/dist/common/events/util.d.ts +0 -2
- package/dist/common/logs/logger-config.d.ts +0 -2
- package/dist/common/logs/logger-proxy.d.ts +0 -2
- package/dist/common/logs/request.d.ts +0 -34
- package/dist/common/queue.d.ts +0 -32
- package/dist/config.d.ts +0 -73
- package/dist/constants.d.ts +0 -926
- package/dist/controls-options-manager/constants.d.ts +0 -4
- package/dist/controls-options-manager/enums.d.ts +0 -5
- package/dist/controls-options-manager/index.d.ts +0 -120
- package/dist/controls-options-manager/util.d.ts +0 -7
- package/dist/index.d.ts +0 -4
- package/dist/locus-info/controlsUtils.d.ts +0 -2
- package/dist/locus-info/embeddedAppsUtils.d.ts +0 -2
- package/dist/locus-info/fullState.d.ts +0 -2
- package/dist/locus-info/hostUtils.d.ts +0 -2
- package/dist/locus-info/index.d.ts +0 -269
- package/dist/locus-info/infoUtils.d.ts +0 -2
- package/dist/locus-info/mediaSharesUtils.d.ts +0 -2
- package/dist/locus-info/parser.d.ts +0 -212
- package/dist/locus-info/selfUtils.d.ts +0 -2
- package/dist/media/index.d.ts +0 -32
- package/dist/media/properties.d.ts +0 -108
- package/dist/media/util.d.ts +0 -2
- package/dist/mediaQualityMetrics/config.d.ts +0 -233
- package/dist/meeting/effectsState.d.ts +0 -42
- package/dist/meeting/in-meeting-actions.d.ts +0 -79
- package/dist/meeting/index.d.ts +0 -1621
- package/dist/meeting/muteState.d.ts +0 -116
- package/dist/meeting/request.d.ts +0 -255
- package/dist/meeting/state.d.ts +0 -9
- package/dist/meeting/util.d.ts +0 -2
- package/dist/meeting-info/collection.d.ts +0 -20
- package/dist/meeting-info/index.d.ts +0 -57
- package/dist/meeting-info/meeting-info-v2.d.ts +0 -93
- package/dist/meeting-info/request.d.ts +0 -22
- package/dist/meeting-info/util.d.ts +0 -2
- package/dist/meeting-info/utilv2.d.ts +0 -2
- package/dist/meetings/collection.d.ts +0 -23
- package/dist/meetings/index.d.ts +0 -296
- package/dist/meetings/request.d.ts +0 -27
- package/dist/meetings/util.d.ts +0 -18
- package/dist/member/index.d.ts +0 -147
- package/dist/member/member.types.d.ts +0 -11
- package/dist/member/util.d.ts +0 -2
- package/dist/members/collection.d.ts +0 -24
- package/dist/members/index.d.ts +0 -298
- package/dist/members/request.d.ts +0 -50
- package/dist/members/util.d.ts +0 -2
- package/dist/metrics/config.d.ts +0 -169
- package/dist/metrics/constants.d.ts +0 -59
- package/dist/metrics/index.d.ts +0 -152
- package/dist/networkQualityMonitor/index.d.ts +0 -70
- package/dist/peer-connection-manager/index.d.ts +0 -6
- package/dist/peer-connection-manager/util.d.ts +0 -6
- package/dist/personal-meeting-room/index.d.ts +0 -47
- package/dist/personal-meeting-room/request.d.ts +0 -14
- package/dist/personal-meeting-room/util.d.ts +0 -2
- package/dist/reachability/index.d.ts +0 -139
- package/dist/reachability/request.d.ts +0 -35
- package/dist/reactions/reactions.d.ts +0 -4
- package/dist/reactions/reactions.type.d.ts +0 -32
- package/dist/reconnection-manager/index.d.ts +0 -112
- package/dist/recording-controller/enums.d.ts +0 -7
- package/dist/recording-controller/index.d.ts +0 -193
- package/dist/recording-controller/util.d.ts +0 -13
- package/dist/roap/collection.d.ts +0 -10
- package/dist/roap/handler.d.ts +0 -47
- package/dist/roap/index.d.ts +0 -116
- package/dist/roap/request.d.ts +0 -35
- package/dist/roap/state.d.ts +0 -9
- package/dist/roap/turnDiscovery.d.ts +0 -81
- package/dist/roap/util.d.ts +0 -2
- package/dist/statsAnalyzer/global.d.ts +0 -118
- package/dist/statsAnalyzer/index.d.ts +0 -193
- package/dist/statsAnalyzer/mqaUtil.d.ts +0 -22
- package/dist/transcription/index.d.ts +0 -64
|
@@ -6,10 +6,8 @@ _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"));
|
|
10
9
|
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
|
|
11
10
|
var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
|
|
12
|
-
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/asyncToGenerator"));
|
|
13
11
|
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
|
|
14
12
|
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/createClass"));
|
|
15
13
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
@@ -208,136 +206,52 @@ var TurnDiscovery = /*#__PURE__*/function () {
|
|
|
208
206
|
*/
|
|
209
207
|
}, {
|
|
210
208
|
key: "doTurnDiscovery",
|
|
211
|
-
value: function () {
|
|
212
|
-
var
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
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);
|
|
264
|
-
}
|
|
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);
|
|
209
|
+
value: function doTurnDiscovery(meeting, isReconnecting) {
|
|
210
|
+
var _this2 = this;
|
|
211
|
+
// @ts-ignore - fix type
|
|
212
|
+
var isAnyClusterReachable = meeting.webex.meetings.reachability.isAnyClusterReachable();
|
|
213
|
+
if (isAnyClusterReachable) {
|
|
214
|
+
_loggerProxy.default.logger.info('Roap:turnDiscovery#doTurnDiscovery --> reachability has not failed, skipping TURN discovery');
|
|
215
|
+
return _promise.default.resolve({
|
|
216
|
+
turnServerInfo: undefined,
|
|
217
|
+
turnDiscoverySkippedReason: 'reachability'
|
|
218
|
+
});
|
|
308
219
|
}
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
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);
|
|
220
|
+
|
|
221
|
+
// @ts-ignore - fix type
|
|
222
|
+
if (!meeting.config.experimental.enableTurnDiscovery) {
|
|
223
|
+
_loggerProxy.default.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery disabled in config, skipping it');
|
|
224
|
+
return _promise.default.resolve({
|
|
225
|
+
turnServerInfo: undefined,
|
|
226
|
+
turnDiscoverySkippedReason: 'config'
|
|
227
|
+
});
|
|
338
228
|
}
|
|
339
|
-
return
|
|
340
|
-
|
|
229
|
+
return this.sendRoapTurnDiscoveryRequest(meeting, isReconnecting).then(function () {
|
|
230
|
+
return _this2.waitForTurnDiscoveryResponse();
|
|
231
|
+
}).then(function () {
|
|
232
|
+
return _this2.sendRoapOK(meeting);
|
|
233
|
+
}).then(function () {
|
|
234
|
+
_this2.defer = undefined;
|
|
235
|
+
_loggerProxy.default.logger.info('Roap:turnDiscovery#doTurnDiscovery --> TURN discovery completed');
|
|
236
|
+
return {
|
|
237
|
+
turnServerInfo: _this2.turnInfo,
|
|
238
|
+
turnDiscoverySkippedReason: undefined
|
|
239
|
+
};
|
|
240
|
+
}).catch(function (e) {
|
|
241
|
+
// we catch any errors and resolve with no turn information so that the normal call join flow can continue without TURN
|
|
242
|
+
_loggerProxy.default.logger.info("Roap:turnDiscovery#doTurnDiscovery --> TURN discovery failed, continuing without TURN: ".concat(e));
|
|
243
|
+
_metrics.default.sendBehavioralMetric(_constants.default.TURN_DISCOVERY_FAILURE, {
|
|
244
|
+
correlation_id: meeting.correlationId,
|
|
245
|
+
locus_id: meeting.locusUrl.split('/').pop(),
|
|
246
|
+
reason: e.message,
|
|
247
|
+
stack: e.stack
|
|
248
|
+
});
|
|
249
|
+
return _promise.default.resolve({
|
|
250
|
+
turnServerInfo: undefined,
|
|
251
|
+
turnDiscoverySkippedReason: undefined
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
}
|
|
341
255
|
}]);
|
|
342
256
|
return TurnDiscovery;
|
|
343
257
|
}();
|
|
@@ -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","_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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"}
|
|
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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"}
|
|
@@ -82,11 +82,20 @@ 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
|
+
},
|
|
85
95
|
video: {
|
|
86
96
|
send: {
|
|
87
97
|
width: 0,
|
|
88
|
-
height: 0
|
|
89
|
-
framesSent: 0
|
|
98
|
+
height: 0
|
|
90
99
|
},
|
|
91
100
|
recv: {
|
|
92
101
|
width: 0,
|
|
@@ -96,8 +105,7 @@ var STATS_DEFAULT = {
|
|
|
96
105
|
share: {
|
|
97
106
|
send: {
|
|
98
107
|
width: 0,
|
|
99
|
-
height: 0
|
|
100
|
-
framesSent: 0
|
|
108
|
+
height: 0
|
|
101
109
|
},
|
|
102
110
|
recv: {
|
|
103
111
|
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","
|
|
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 audio: {\n send: {\n width: 0,\n height: 0,\n },\n recv: {\n width: 0,\n height: 0,\n },\n },\n video: {\n send: {\n width: 0,\n height: 0,\n },\n recv: {\n width: 0,\n height: 0,\n },\n },\n share: {\n send: {\n width: 0,\n height: 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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"}
|
|
@@ -16,7 +16,7 @@ var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/
|
|
|
16
16
|
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/possibleConstructorReturn"));
|
|
17
17
|
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/getPrototypeOf"));
|
|
18
18
|
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/defineProperty"));
|
|
19
|
-
var
|
|
19
|
+
var _lodash = require("lodash");
|
|
20
20
|
var _eventsScope = _interopRequireDefault(require("../common/events/events-scope"));
|
|
21
21
|
var _constants = require("../constants");
|
|
22
22
|
var _config = _interopRequireDefault(require("../mediaQualityMetrics/config"));
|
|
@@ -27,8 +27,6 @@ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflec
|
|
|
27
27
|
function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !_Reflect$construct) return false; if (_Reflect$construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(_Reflect$construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
|
|
28
28
|
var EVENTS = {
|
|
29
29
|
MEDIA_QUALITY: 'MEDIA_QUALITY',
|
|
30
|
-
NO_FRAMES_SENT: 'NO_FRAMES_SENT',
|
|
31
|
-
NO_VIDEO_ENCODED: 'NO_VIDEO_ENCODED',
|
|
32
30
|
LOCAL_MEDIA_STARTED: 'LOCAL_MEDIA_STARTED',
|
|
33
31
|
LOCAL_MEDIA_STOPPED: 'LOCAL_MEDIA_STOPPED',
|
|
34
32
|
REMOTE_MEDIA_STARTED: 'REMOTE_MEDIA_STARTED',
|
|
@@ -101,7 +99,7 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
101
99
|
var newEvent;
|
|
102
100
|
if (currentValue - previousValue > 0) {
|
|
103
101
|
newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STARTED : EVENTS.REMOTE_MEDIA_STARTED;
|
|
104
|
-
} else if (currentValue === previousValue && currentValue
|
|
102
|
+
} else if (currentValue === previousValue && currentValue > 0) {
|
|
105
103
|
newEvent = isLocal ? EVENTS.LOCAL_MEDIA_STOPPED : EVENTS.REMOTE_MEDIA_STOPPED;
|
|
106
104
|
}
|
|
107
105
|
if (newEvent && lastEmittedEvent !== newEvent) {
|
|
@@ -414,7 +412,7 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
414
412
|
_config.default.intervals[0].intervalNumber = this.mqaSentCount;
|
|
415
413
|
|
|
416
414
|
// DO Deep copy, for some reason it takes the reference all the time rather then old value set
|
|
417
|
-
this.lastMqaDataSent = (0,
|
|
415
|
+
this.lastMqaDataSent = (0, _lodash.cloneDeep)(this.statsResults);
|
|
418
416
|
this.populateResults(_config.default.intervals[0]);
|
|
419
417
|
this.resetStatsResults();
|
|
420
418
|
this.emit({
|
|
@@ -522,6 +520,9 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
522
520
|
case 'inbound-rtp':
|
|
523
521
|
this.processInboundRTPResult(getStatsResult, type);
|
|
524
522
|
break;
|
|
523
|
+
case 'track':
|
|
524
|
+
this.processTrackResult(getStatsResult, type);
|
|
525
|
+
break;
|
|
525
526
|
case 'remote-inbound-rtp':
|
|
526
527
|
case 'remote-outbound-rtp':
|
|
527
528
|
// @ts-ignore
|
|
@@ -629,32 +630,13 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
629
630
|
previousStats = this.lastStatsResults[mediaType].send;
|
|
630
631
|
if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
|
|
631
632
|
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " RTP packets sent"));
|
|
632
|
-
} else
|
|
633
|
+
} else {
|
|
633
634
|
if (currentStats.framesEncoded === previousStats.framesEncoded || currentStats.framesEncoded === 0) {
|
|
634
|
-
this.lastEmittedStartStopEvent[mediaType].local = EVENTS.NO_VIDEO_ENCODED;
|
|
635
635
|
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " Frames Encoded"));
|
|
636
|
-
this.emit({
|
|
637
|
-
file: 'statsAnalyzer',
|
|
638
|
-
function: 'compareLastStatsResult'
|
|
639
|
-
}, EVENTS.NO_VIDEO_ENCODED, {
|
|
640
|
-
mediaType: mediaType
|
|
641
|
-
});
|
|
642
636
|
}
|
|
643
637
|
if (this.statsResults.resolutions[mediaType].send.framesSent === this.lastStatsResults.resolutions[mediaType].send.framesSent || this.statsResults.resolutions[mediaType].send.framesSent === 0) {
|
|
644
638
|
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " Frames sent"));
|
|
645
639
|
}
|
|
646
|
-
|
|
647
|
-
// Video is encoded but frames are not sent
|
|
648
|
-
if (currentStats.framesEncoded !== previousStats.framesEncoded && (currentStats.framesSent === previousStats.framesSent || currentStats.framesSent === 0)) {
|
|
649
|
-
this.lastEmittedStartStopEvent[mediaType].local = EVENTS.NO_FRAMES_SENT;
|
|
650
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " frames sent even though frames are encoded"));
|
|
651
|
-
this.emit({
|
|
652
|
-
file: 'statsAnalyzer',
|
|
653
|
-
function: 'compareLastStatsResult'
|
|
654
|
-
}, EVENTS.NO_FRAMES_SENT, {
|
|
655
|
-
mediaType: mediaType
|
|
656
|
-
});
|
|
657
|
-
}
|
|
658
640
|
}
|
|
659
641
|
this.emitStartStopEvents(mediaType, previousStats.framesSent, currentStats.framesSent, true);
|
|
660
642
|
}
|
|
@@ -686,32 +668,13 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
686
668
|
previousStats = this.lastStatsResults[mediaType].send;
|
|
687
669
|
if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
|
|
688
670
|
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " RTP packets sent"));
|
|
689
|
-
} else
|
|
671
|
+
} else {
|
|
690
672
|
if (currentStats.framesEncoded === previousStats.framesEncoded || currentStats.framesEncoded === 0) {
|
|
691
|
-
this.lastEmittedStartStopEvent[mediaType].local = EVENTS.NO_VIDEO_ENCODED;
|
|
692
673
|
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " frames getting encoded"));
|
|
693
|
-
this.emit({
|
|
694
|
-
file: 'statsAnalyzer',
|
|
695
|
-
function: 'compareLastStatsResult'
|
|
696
|
-
}, EVENTS.NO_VIDEO_ENCODED, {
|
|
697
|
-
mediaType: mediaType
|
|
698
|
-
});
|
|
699
674
|
}
|
|
700
675
|
if (this.statsResults.resolutions[mediaType].send.framesSent === this.lastStatsResults.resolutions[mediaType].send.framesSent || this.statsResults.resolutions[mediaType].send.framesSent === 0) {
|
|
701
676
|
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " frames sent"));
|
|
702
677
|
}
|
|
703
|
-
|
|
704
|
-
// Share video is encoded but frames are not sent
|
|
705
|
-
if (currentStats.framesEncoded !== previousStats.framesEncoded && (currentStats.framesSent === previousStats.framesSent || currentStats.framesSent === 0)) {
|
|
706
|
-
this.lastEmittedStartStopEvent[mediaType].local = EVENTS.NO_FRAMES_SENT;
|
|
707
|
-
_loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " Frames sent even though frames are being encoded"));
|
|
708
|
-
this.emit({
|
|
709
|
-
file: 'statsAnalyzer',
|
|
710
|
-
function: 'compareLastStatsResult'
|
|
711
|
-
}, EVENTS.NO_FRAMES_SENT, {
|
|
712
|
-
mediaType: mediaType
|
|
713
|
-
});
|
|
714
|
-
}
|
|
715
678
|
}
|
|
716
679
|
|
|
717
680
|
// TODO:need to check receive share value
|
|
@@ -798,7 +761,6 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
798
761
|
value: function processOutboundRTPResult(result, type) {
|
|
799
762
|
var mediaType = type || _constants.STATS.AUDIO_CORRELATE;
|
|
800
763
|
var sendrecvType = _constants.STATS.SEND_DIRECTION;
|
|
801
|
-
this.processTrackResult(result, type, sendrecvType);
|
|
802
764
|
if (result.bytesSent) {
|
|
803
765
|
var kilobytes = 0;
|
|
804
766
|
if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesSent) {
|
|
@@ -855,7 +817,6 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
855
817
|
value: function processInboundRTPResult(result, type) {
|
|
856
818
|
var mediaType = type || _constants.STATS.AUDIO_CORRELATE;
|
|
857
819
|
var sendrecvType = _constants.STATS.RECEIVE_DIRECTION;
|
|
858
|
-
this.processTrackResult(result, type, sendrecvType);
|
|
859
820
|
if (result.bytesReceived) {
|
|
860
821
|
var kilobytes = 0;
|
|
861
822
|
if (!this.statsResults.internal[mediaType][sendrecvType].prevBytesReceived) {
|
|
@@ -935,28 +896,25 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
|
|
|
935
896
|
* @private
|
|
936
897
|
* @param {*} result
|
|
937
898
|
* @param {*} mediaType
|
|
938
|
-
* @param {*} sendrecvType
|
|
939
899
|
* @returns {void}
|
|
940
900
|
* @memberof StatsAnalyzer
|
|
941
901
|
*/
|
|
942
|
-
function processTrackResult(result, mediaType
|
|
943
|
-
if (!result ||
|
|
944
|
-
return;
|
|
945
|
-
}
|
|
946
|
-
if (result.type !== 'inbound-rtp' && result.type !== 'outbound-rtp') {
|
|
902
|
+
function processTrackResult(result, mediaType) {
|
|
903
|
+
if (!result || result.type !== 'track') {
|
|
947
904
|
return;
|
|
948
905
|
}
|
|
906
|
+
if (result.type !== 'track') return;
|
|
907
|
+
var sendrecvType = result.remoteSource === true ? _constants.STATS.RECEIVE_DIRECTION : _constants.STATS.SEND_DIRECTION;
|
|
949
908
|
if (result.frameWidth && result.frameHeight) {
|
|
950
909
|
this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
|
|
951
910
|
this.statsResults.resolutions[mediaType][sendrecvType].height = result.frameHeight;
|
|
911
|
+
this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
|
|
912
|
+
this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;
|
|
952
913
|
}
|
|
953
914
|
if (sendrecvType === _constants.STATS.RECEIVE_DIRECTION) {
|
|
954
915
|
this.statsResults.resolutions[mediaType][sendrecvType].framesReceived = result.framesReceived;
|
|
955
916
|
this.statsResults.resolutions[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
|
|
956
917
|
this.statsResults.resolutions[mediaType][sendrecvType].framesDropped = result.framesDropped;
|
|
957
|
-
} else if (sendrecvType === _constants.STATS.SEND_DIRECTION) {
|
|
958
|
-
this.statsResults.resolutions[mediaType][sendrecvType].framesSent = result.framesSent;
|
|
959
|
-
this.statsResults.resolutions[mediaType][sendrecvType].hugeFramesSent = result.hugeFramesSent;
|
|
960
918
|
}
|
|
961
919
|
if (result.trackIdentifier && mediaType !== _constants.STATS.AUDIO_CORRELATE) {
|
|
962
920
|
this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier = result.trackIdentifier;
|