@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.
Files changed (152) hide show
  1. package/dist/common/browser-detection.d.ts +9 -0
  2. package/dist/common/browser-detection.js +2 -2
  3. package/dist/common/browser-detection.js.map +1 -1
  4. package/dist/common/collection.d.ts +48 -0
  5. package/dist/common/collection.js +2 -2
  6. package/dist/common/collection.js.map +1 -1
  7. package/dist/common/config.d.ts +2 -0
  8. package/dist/common/errors/captcha-error.d.ts +15 -0
  9. package/dist/common/errors/intent-to-join.d.ts +16 -0
  10. package/dist/common/errors/join-meeting.d.ts +17 -0
  11. package/dist/common/errors/media.d.ts +15 -0
  12. package/dist/common/errors/parameter.d.ts +15 -0
  13. package/dist/common/errors/password-error.d.ts +15 -0
  14. package/dist/common/errors/permission.d.ts +14 -0
  15. package/dist/common/errors/reconnection-in-progress.d.ts +9 -0
  16. package/dist/common/errors/reconnection.d.ts +15 -0
  17. package/dist/common/errors/stats.d.ts +15 -0
  18. package/dist/common/errors/webex-errors.d.ts +81 -0
  19. package/dist/common/errors/webex-meetings-error.d.ts +20 -0
  20. package/dist/common/events/events-scope.d.ts +17 -0
  21. package/dist/common/events/events.d.ts +12 -0
  22. package/dist/common/events/trigger-proxy.d.ts +2 -0
  23. package/dist/common/events/util.d.ts +2 -0
  24. package/dist/common/logs/logger-config.d.ts +2 -0
  25. package/dist/common/logs/logger-proxy.d.ts +2 -0
  26. package/dist/common/logs/request.d.ts +34 -0
  27. package/dist/common/queue.d.ts +32 -0
  28. package/dist/config.d.ts +73 -0
  29. package/dist/config.js +2 -2
  30. package/dist/config.js.map +1 -1
  31. package/dist/constants.d.ts +926 -0
  32. package/dist/constants.js +2 -0
  33. package/dist/constants.js.map +1 -1
  34. package/dist/controls-options-manager/constants.d.ts +4 -0
  35. package/dist/controls-options-manager/enums.d.ts +5 -0
  36. package/dist/controls-options-manager/index.d.ts +120 -0
  37. package/dist/controls-options-manager/index.js +2 -2
  38. package/dist/controls-options-manager/index.js.map +1 -1
  39. package/dist/controls-options-manager/util.d.ts +7 -0
  40. package/dist/index.d.ts +4 -0
  41. package/dist/locus-info/controlsUtils.d.ts +2 -0
  42. package/dist/locus-info/controlsUtils.js +6 -6
  43. package/dist/locus-info/controlsUtils.js.map +1 -1
  44. package/dist/locus-info/embeddedAppsUtils.d.ts +2 -0
  45. package/dist/locus-info/fullState.d.ts +2 -0
  46. package/dist/locus-info/hostUtils.d.ts +2 -0
  47. package/dist/locus-info/index.d.ts +269 -0
  48. package/dist/locus-info/index.js +18 -18
  49. package/dist/locus-info/index.js.map +1 -1
  50. package/dist/locus-info/infoUtils.d.ts +2 -0
  51. package/dist/locus-info/mediaSharesUtils.d.ts +2 -0
  52. package/dist/locus-info/parser.d.ts +212 -0
  53. package/dist/locus-info/parser.js +2 -2
  54. package/dist/locus-info/parser.js.map +1 -1
  55. package/dist/locus-info/selfUtils.d.ts +2 -0
  56. package/dist/media/index.d.ts +32 -0
  57. package/dist/media/properties.d.ts +108 -0
  58. package/dist/media/util.d.ts +2 -0
  59. package/dist/mediaQualityMetrics/config.d.ts +233 -0
  60. package/dist/meeting/effectsState.d.ts +42 -0
  61. package/dist/meeting/in-meeting-actions.d.ts +79 -0
  62. package/dist/meeting/index.d.ts +1622 -0
  63. package/dist/meeting/index.js +51 -28
  64. package/dist/meeting/index.js.map +1 -1
  65. package/dist/meeting/muteState.d.ts +116 -0
  66. package/dist/meeting/request.d.ts +255 -0
  67. package/dist/meeting/request.js +2 -2
  68. package/dist/meeting/request.js.map +1 -1
  69. package/dist/meeting/state.d.ts +9 -0
  70. package/dist/meeting/util.d.ts +2 -0
  71. package/dist/meeting/util.js +4 -4
  72. package/dist/meeting/util.js.map +1 -1
  73. package/dist/meeting-info/collection.d.ts +20 -0
  74. package/dist/meeting-info/collection.js +2 -2
  75. package/dist/meeting-info/collection.js.map +1 -1
  76. package/dist/meeting-info/index.d.ts +57 -0
  77. package/dist/meeting-info/meeting-info-v2.d.ts +93 -0
  78. package/dist/meeting-info/request.d.ts +22 -0
  79. package/dist/meeting-info/util.d.ts +2 -0
  80. package/dist/meeting-info/utilv2.d.ts +2 -0
  81. package/dist/meetings/collection.d.ts +23 -0
  82. package/dist/meetings/collection.js +2 -2
  83. package/dist/meetings/collection.js.map +1 -1
  84. package/dist/meetings/index.d.ts +296 -0
  85. package/dist/meetings/request.d.ts +27 -0
  86. package/dist/meetings/util.d.ts +18 -0
  87. package/dist/member/index.d.ts +147 -0
  88. package/dist/member/member.types.d.ts +11 -0
  89. package/dist/member/util.d.ts +2 -0
  90. package/dist/members/collection.d.ts +24 -0
  91. package/dist/members/index.d.ts +298 -0
  92. package/dist/members/index.js +2 -2
  93. package/dist/members/index.js.map +1 -1
  94. package/dist/members/request.d.ts +50 -0
  95. package/dist/members/util.d.ts +2 -0
  96. package/dist/metrics/config.d.ts +169 -0
  97. package/dist/metrics/constants.d.ts +59 -0
  98. package/dist/metrics/constants.js +2 -0
  99. package/dist/metrics/constants.js.map +1 -1
  100. package/dist/metrics/index.d.ts +152 -0
  101. package/dist/metrics/index.js +2 -2
  102. package/dist/metrics/index.js.map +1 -1
  103. package/dist/networkQualityMonitor/index.d.ts +70 -0
  104. package/dist/peer-connection-manager/index.d.ts +6 -0
  105. package/dist/peer-connection-manager/util.d.ts +6 -0
  106. package/dist/personal-meeting-room/index.d.ts +47 -0
  107. package/dist/personal-meeting-room/request.d.ts +14 -0
  108. package/dist/personal-meeting-room/util.d.ts +2 -0
  109. package/dist/reachability/index.d.ts +139 -0
  110. package/dist/reachability/index.js +2 -9
  111. package/dist/reachability/index.js.map +1 -1
  112. package/dist/reachability/request.d.ts +35 -0
  113. package/dist/reactions/reactions.d.ts +4 -0
  114. package/dist/reactions/reactions.type.d.ts +32 -0
  115. package/dist/reconnection-manager/index.d.ts +112 -0
  116. package/dist/recording-controller/enums.d.ts +7 -0
  117. package/dist/recording-controller/index.d.ts +193 -0
  118. package/dist/recording-controller/util.d.ts +13 -0
  119. package/dist/roap/collection.d.ts +10 -0
  120. package/dist/roap/handler.d.ts +47 -0
  121. package/dist/roap/index.d.ts +116 -0
  122. package/dist/roap/index.js +13 -12
  123. package/dist/roap/index.js.map +1 -1
  124. package/dist/roap/request.d.ts +35 -0
  125. package/dist/roap/state.d.ts +9 -0
  126. package/dist/roap/turnDiscovery.d.ts +81 -0
  127. package/dist/roap/turnDiscovery.js +130 -44
  128. package/dist/roap/turnDiscovery.js.map +1 -1
  129. package/dist/roap/util.d.ts +2 -0
  130. package/dist/statsAnalyzer/global.d.ts +118 -0
  131. package/dist/statsAnalyzer/global.js +4 -12
  132. package/dist/statsAnalyzer/global.js.map +1 -1
  133. package/dist/statsAnalyzer/index.d.ts +193 -0
  134. package/dist/statsAnalyzer/index.js +56 -14
  135. package/dist/statsAnalyzer/index.js.map +1 -1
  136. package/dist/statsAnalyzer/mqaUtil.d.ts +22 -0
  137. package/dist/statsAnalyzer/mqaUtil.js +15 -15
  138. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  139. package/dist/transcription/index.d.ts +64 -0
  140. package/package.json +21 -22
  141. package/src/config.ts +2 -2
  142. package/src/constants.ts +2 -0
  143. package/src/meeting/index.ts +35 -0
  144. package/src/metrics/constants.ts +2 -0
  145. package/src/roap/index.ts +14 -10
  146. package/src/roap/turnDiscovery.ts +48 -20
  147. package/src/statsAnalyzer/global.ts +2 -10
  148. package/src/statsAnalyzer/index.ts +80 -17
  149. package/test/unit/spec/meeting/index.js +77 -6
  150. package/test/unit/spec/roap/index.ts +84 -80
  151. package/test/unit/spec/roap/turnDiscovery.ts +21 -0
  152. 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 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
- });
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
- // @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
- });
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 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
- }
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,2 @@
1
+ declare const RoapUtil: any;
2
+ export default RoapUtil;
@@ -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 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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"}
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
+ }