@webex/plugin-meetings 2.37.2 → 2.38.1

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 (77) hide show
  1. package/dist/config.js +1 -1
  2. package/dist/config.js.map +1 -1
  3. package/dist/constants.js +2 -1
  4. package/dist/constants.js.map +1 -1
  5. package/dist/locus-info/index.js +24 -0
  6. package/dist/locus-info/index.js.map +1 -1
  7. package/dist/locus-info/parser.js +1 -0
  8. package/dist/locus-info/parser.js.map +1 -1
  9. package/dist/media/properties.js.map +1 -1
  10. package/dist/meeting/index.js +405 -352
  11. package/dist/meeting/index.js.map +1 -1
  12. package/dist/meeting/muteState.js +13 -0
  13. package/dist/meeting/muteState.js.map +1 -1
  14. package/dist/meeting/request.js +0 -27
  15. package/dist/meeting/request.js.map +1 -1
  16. package/dist/meeting/util.js +0 -56
  17. package/dist/meeting/util.js.map +1 -1
  18. package/dist/meeting-info/meeting-info-v2.js +2 -0
  19. package/dist/meeting-info/meeting-info-v2.js.map +1 -1
  20. package/dist/meetings/index.js +27 -17
  21. package/dist/meetings/index.js.map +1 -1
  22. package/dist/meetings/request.js +14 -12
  23. package/dist/meetings/request.js.map +1 -1
  24. package/dist/member/util.js +3 -1
  25. package/dist/member/util.js.map +1 -1
  26. package/dist/members/request.js +3 -1
  27. package/dist/members/request.js.map +1 -1
  28. package/dist/reachability/index.js +4 -4
  29. package/dist/reachability/index.js.map +1 -1
  30. package/dist/reactions/reactions.type.js +1 -0
  31. package/dist/reactions/reactions.type.js.map +1 -1
  32. package/dist/recording-controller/enums.js +17 -0
  33. package/dist/recording-controller/enums.js.map +1 -0
  34. package/dist/recording-controller/index.js +343 -0
  35. package/dist/recording-controller/index.js.map +1 -0
  36. package/dist/recording-controller/util.js +63 -0
  37. package/dist/recording-controller/util.js.map +1 -0
  38. package/dist/roap/index.js +16 -10
  39. package/dist/roap/index.js.map +1 -1
  40. package/dist/roap/turnDiscovery.js +6 -4
  41. package/dist/roap/turnDiscovery.js.map +1 -1
  42. package/dist/statsAnalyzer/mqaUtil.js +18 -6
  43. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  44. package/package.json +23 -18
  45. package/src/config.ts +1 -1
  46. package/src/constants.ts +1 -0
  47. package/src/locus-info/index.ts +24 -0
  48. package/src/locus-info/parser.ts +1 -0
  49. package/src/media/properties.ts +1 -1
  50. package/src/meeting/index.ts +121 -70
  51. package/src/meeting/muteState.ts +11 -0
  52. package/src/meeting/request.ts +0 -31
  53. package/src/meeting/util.ts +0 -60
  54. package/src/meeting-info/meeting-info-v2.ts +2 -0
  55. package/src/meetings/index.ts +8 -3
  56. package/src/meetings/request.ts +1 -1
  57. package/src/member/util.ts +2 -1
  58. package/src/members/request.ts +1 -0
  59. package/src/reachability/index.ts +2 -1
  60. package/src/reactions/reactions.type.ts +2 -1
  61. package/src/recording-controller/enums.ts +8 -0
  62. package/src/recording-controller/index.ts +315 -0
  63. package/src/recording-controller/util.ts +58 -0
  64. package/src/roap/index.ts +8 -8
  65. package/src/roap/turnDiscovery.ts +5 -5
  66. package/src/statsAnalyzer/mqaUtil.ts +6 -0
  67. package/test/integration/spec/journey.js +1 -1
  68. package/test/integration/spec/space-meeting.js +1 -1
  69. package/test/integration/spec/transcription.js +1 -1
  70. package/test/unit/spec/meeting/index.js +33 -6
  71. package/test/unit/spec/meeting/muteState.js +11 -0
  72. package/test/unit/spec/meeting/utils.js +0 -127
  73. package/test/unit/spec/recording-controller/index.js +231 -0
  74. package/test/unit/spec/recording-controller/util.js +102 -0
  75. package/test/unit/spec/roap/index.ts +10 -5
  76. package/test/unit/spec/roap/turnDiscovery.ts +13 -8
  77. package/tsconfig.json +6 -0
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+
3
+ var _Object$defineProperty = require("@babel/runtime-corejs2/core-js/object/define-property");
4
+ var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
5
+ _Object$defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+ var _constants = require("../constants");
10
+ var _enums = _interopRequireDefault(require("./enums"));
11
+ var canUserStart = function canUserStart(displayHints) {
12
+ return displayHints.includes(_constants.DISPLAY_HINTS.RECORDING_CONTROL_START);
13
+ };
14
+ var canUserPause = function canUserPause(displayHints) {
15
+ return displayHints.includes(_constants.DISPLAY_HINTS.RECORDING_CONTROL_PAUSE);
16
+ };
17
+ var canUserResume = function canUserResume(displayHints) {
18
+ return displayHints.includes(_constants.DISPLAY_HINTS.RECORDING_CONTROL_RESUME);
19
+ };
20
+ var canUserStop = function canUserStop(displayHints) {
21
+ return displayHints.includes(_constants.DISPLAY_HINTS.RECORDING_CONTROL_STOP);
22
+ };
23
+ var extractLocusId = function extractLocusId(url) {
24
+ return url === null || url === void 0 ? void 0 : url.split('/').pop();
25
+ };
26
+ var deriveRecordingStates = function deriveRecordingStates(action) {
27
+ var recording;
28
+ var paused;
29
+ switch (action) {
30
+ case _enums.default.Start:
31
+ recording = true;
32
+ paused = false;
33
+ break;
34
+ case _enums.default.Stop:
35
+ recording = false;
36
+ paused = false;
37
+ break;
38
+ case _enums.default.Resume:
39
+ recording = true;
40
+ paused = false;
41
+ break;
42
+ case _enums.default.Pause:
43
+ recording = true;
44
+ paused = true;
45
+ break;
46
+ default:
47
+ throw new Error("Recording state cannot be derived from invalid action: ".concat(action));
48
+ }
49
+ return {
50
+ recording: recording,
51
+ paused: paused
52
+ };
53
+ };
54
+ var _default = {
55
+ canUserStart: canUserStart,
56
+ canUserPause: canUserPause,
57
+ canUserResume: canUserResume,
58
+ canUserStop: canUserStop,
59
+ deriveRecordingStates: deriveRecordingStates,
60
+ extractLocusId: extractLocusId
61
+ };
62
+ exports.default = _default;
63
+ //# sourceMappingURL=util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["canUserStart","displayHints","includes","DISPLAY_HINTS","RECORDING_CONTROL_START","canUserPause","RECORDING_CONTROL_PAUSE","canUserResume","RECORDING_CONTROL_RESUME","canUserStop","RECORDING_CONTROL_STOP","extractLocusId","url","split","pop","deriveRecordingStates","action","recording","paused","RecordingAction","Start","Stop","Resume","Pause","Error"],"sources":["util.ts"],"sourcesContent":["import {DISPLAY_HINTS} from '../constants';\nimport RecordingAction from './enums';\n\nconst canUserStart = (displayHints: Array<string>): boolean =>\n displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_START);\n\nconst canUserPause = (displayHints: Array<string>): boolean =>\n displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_PAUSE);\n\nconst canUserResume = (displayHints: Array<string>): boolean =>\n displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_RESUME);\n\nconst canUserStop = (displayHints: Array<string>): boolean =>\n displayHints.includes(DISPLAY_HINTS.RECORDING_CONTROL_STOP);\n\nconst extractLocusId = (url: string) => {\n return url?.split('/').pop();\n};\n\nconst deriveRecordingStates = (action: RecordingAction): {recording: boolean; paused: boolean} => {\n let recording;\n let paused;\n\n switch (action) {\n case RecordingAction.Start:\n recording = true;\n paused = false;\n break;\n case RecordingAction.Stop:\n recording = false;\n paused = false;\n break;\n case RecordingAction.Resume:\n recording = true;\n paused = false;\n break;\n case RecordingAction.Pause:\n recording = true;\n paused = true;\n break;\n default:\n throw new Error(`Recording state cannot be derived from invalid action: ${action}`);\n }\n\n return {\n recording,\n paused,\n };\n};\n\nexport default {\n canUserStart,\n canUserPause,\n canUserResume,\n canUserStop,\n deriveRecordingStates,\n extractLocusId,\n};\n"],"mappings":";;;;;;;;AAAA;AACA;AAEA,IAAMA,YAAY,GAAG,SAAfA,YAAY,CAAIC,YAA2B;EAAA,OAC/CA,YAAY,CAACC,QAAQ,CAACC,wBAAa,CAACC,uBAAuB,CAAC;AAAA;AAE9D,IAAMC,YAAY,GAAG,SAAfA,YAAY,CAAIJ,YAA2B;EAAA,OAC/CA,YAAY,CAACC,QAAQ,CAACC,wBAAa,CAACG,uBAAuB,CAAC;AAAA;AAE9D,IAAMC,aAAa,GAAG,SAAhBA,aAAa,CAAIN,YAA2B;EAAA,OAChDA,YAAY,CAACC,QAAQ,CAACC,wBAAa,CAACK,wBAAwB,CAAC;AAAA;AAE/D,IAAMC,WAAW,GAAG,SAAdA,WAAW,CAAIR,YAA2B;EAAA,OAC9CA,YAAY,CAACC,QAAQ,CAACC,wBAAa,CAACO,sBAAsB,CAAC;AAAA;AAE7D,IAAMC,cAAc,GAAG,SAAjBA,cAAc,CAAIC,GAAW,EAAK;EACtC,OAAOA,GAAG,aAAHA,GAAG,uBAAHA,GAAG,CAAEC,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,EAAE;AAC9B,CAAC;AAED,IAAMC,qBAAqB,GAAG,SAAxBA,qBAAqB,CAAIC,MAAuB,EAA4C;EAChG,IAAIC,SAAS;EACb,IAAIC,MAAM;EAEV,QAAQF,MAAM;IACZ,KAAKG,cAAe,CAACC,KAAK;MACxBH,SAAS,GAAG,IAAI;MAChBC,MAAM,GAAG,KAAK;MACd;IACF,KAAKC,cAAe,CAACE,IAAI;MACvBJ,SAAS,GAAG,KAAK;MACjBC,MAAM,GAAG,KAAK;MACd;IACF,KAAKC,cAAe,CAACG,MAAM;MACzBL,SAAS,GAAG,IAAI;MAChBC,MAAM,GAAG,KAAK;MACd;IACF,KAAKC,cAAe,CAACI,KAAK;MACxBN,SAAS,GAAG,IAAI;MAChBC,MAAM,GAAG,IAAI;MACb;IACF;MACE,MAAM,IAAIM,KAAK,kEAA2DR,MAAM,EAAG;EAAC;EAGxF,OAAO;IACLC,SAAS,EAATA,SAAS;IACTC,MAAM,EAANA;EACF,CAAC;AACH,CAAC;AAAC,eAEa;EACblB,YAAY,EAAZA,YAAY;EACZK,YAAY,EAAZA,YAAY;EACZE,aAAa,EAAbA,aAAa;EACbE,WAAW,EAAXA,WAAW;EACXM,qBAAqB,EAArBA,qBAAqB;EACrBJ,cAAc,EAAdA;AACF,CAAC;AAAA"}
@@ -72,6 +72,7 @@ var Roap = /*#__PURE__*/function (_StatelessWebexPlugin) {
72
72
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "roapRequest", void 0);
73
73
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "turnDiscovery", void 0);
74
74
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "sendRoapCallRequest", function (options) {
75
+ var _meeting$audio, _meeting$video;
75
76
  var meeting = options.meeting;
76
77
  var roapMessage = {
77
78
  messageType: _constants.ROAP.ROAP_TYPES.OFFER,
@@ -92,8 +93,8 @@ var Roap = /*#__PURE__*/function (_StatelessWebexPlugin) {
92
93
  roapMessage: roapMessage,
93
94
  // eslint-disable-next-line no-warning-comments
94
95
  // TODO: check whats the need for video and audiomute
95
- audioMuted: !!meeting.isAudioMuted(),
96
- videoMuted: !!meeting.isVideoMuted()
96
+ audioMuted: (_meeting$audio = meeting.audio) === null || _meeting$audio === void 0 ? void 0 : _meeting$audio.isLocallyMuted(),
97
+ videoMuted: (_meeting$video = meeting.video) === null || _meeting$video === void 0 ? void 0 : _meeting$video.isLocallyMuted()
97
98
  }))
98
99
  // mediaId: meeting.mediaId
99
100
  }]
@@ -210,6 +211,7 @@ var Roap = /*#__PURE__*/function (_StatelessWebexPlugin) {
210
211
  value: function sendRoapOK(options) {
211
212
  var _this2 = this;
212
213
  return _promise.default.resolve().then(function () {
214
+ var _meeting$audio2, _meeting$video2;
213
215
  // @ts-ignore
214
216
  var meeting = _this2.webex.meetings.meetingCollection.getByKey('correlationId', options.correlationId);
215
217
  var roapMessage = {
@@ -223,8 +225,8 @@ var Roap = /*#__PURE__*/function (_StatelessWebexPlugin) {
223
225
  locusSelfUrl: meeting.selfUrl,
224
226
  mediaId: options.mediaId,
225
227
  correlationId: options.correlationId,
226
- audioMuted: meeting.isAudioMuted(),
227
- videoMuted: meeting.isVideoMuted(),
228
+ audioMuted: (_meeting$audio2 = meeting.audio) === null || _meeting$audio2 === void 0 ? void 0 : _meeting$audio2.isLocallyMuted(),
229
+ videoMuted: (_meeting$video2 = meeting.video) === null || _meeting$video2 === void 0 ? void 0 : _meeting$video2.isLocallyMuted(),
228
230
  meetingId: meeting.id
229
231
  }).then(function () {
230
232
  _this2.roapHandler.submit({
@@ -252,7 +254,9 @@ var Roap = /*#__PURE__*/function (_StatelessWebexPlugin) {
252
254
  }, {
253
255
  key: "sendRoapAnswer",
254
256
  value: function sendRoapAnswer(options) {
255
- var _this3 = this;
257
+ var _meeting$audio3,
258
+ _meeting$video3,
259
+ _this3 = this;
256
260
  // @ts-ignore
257
261
  var meeting = this.webex.meetings.meetingCollection.getByKey('correlationId', options.correlationId);
258
262
  var roapMessage = {
@@ -271,8 +275,8 @@ var Roap = /*#__PURE__*/function (_StatelessWebexPlugin) {
271
275
  locusSelfUrl: meeting.selfUrl,
272
276
  mediaId: options.mediaId,
273
277
  correlationId: options.correlationId,
274
- audioMuted: options.audioMuted,
275
- videoMuted: options.videoMuted,
278
+ audioMuted: (_meeting$audio3 = meeting.audio) === null || _meeting$audio3 === void 0 ? void 0 : _meeting$audio3.isLocallyMuted(),
279
+ videoMuted: (_meeting$video3 = meeting.video) === null || _meeting$video3 === void 0 ? void 0 : _meeting$video3.isLocallyMuted(),
276
280
  meetingId: meeting.id
277
281
  }).then(function () {
278
282
  meeting.setRoapSeq(options.seq);
@@ -315,7 +319,9 @@ var Roap = /*#__PURE__*/function (_StatelessWebexPlugin) {
315
319
  }, {
316
320
  key: "sendRoapMediaRequest",
317
321
  value: function sendRoapMediaRequest(options) {
318
- var _this4 = this;
322
+ var _meeting$audio4,
323
+ _meeting$video4,
324
+ _this4 = this;
319
325
  var meeting = options.meeting,
320
326
  reconnect = options.reconnect;
321
327
  var roapMessage = {
@@ -342,8 +348,8 @@ var Roap = /*#__PURE__*/function (_StatelessWebexPlugin) {
342
348
  correlationId: meeting.correlationId,
343
349
  locusSelfUrl: meeting.selfUrl,
344
350
  mediaId: sendEmptyMediaId ? '' : meeting.mediaId,
345
- audioMuted: meeting.isAudioMuted(),
346
- videoMuted: meeting.isVideoMuted(),
351
+ audioMuted: (_meeting$audio4 = meeting.audio) === null || _meeting$audio4 === void 0 ? void 0 : _meeting$audio4.isLocallyMuted(),
352
+ videoMuted: (_meeting$video4 = meeting.video) === null || _meeting$video4 === void 0 ? void 0 : _meeting$video4.isLocallyMuted(),
347
353
  meetingId: meeting.id
348
354
  }).then(function (_ref) {
349
355
  var locus = _ref.locus,
@@ -1 +1 @@
1
- {"version":3,"names":["Roap","attrs","options","meeting","roapMessage","messageType","ROAP","ROAP_TYPES","OFFER","sdps","sdp","version","ROAP_VERSION","seq","roapSeq","tieBreaker","roapHandler","submit","type","SEND_ROAP_MSG","msg","correlationId","roapBody","localMedias","localSdp","roapRequest","attachRechabilityData","audioMuted","isAudioMuted","videoMuted","isVideoMuted","MeetingUtil","joinMeetingOptions","then","locus","SEND_ROAP_MSG_SUCCESS","setRoapSeq","RoapHandler","sendRoapOK","bind","sendRoapAnswer","roapFinished","RoapRequest","lastRoapOffer","turnDiscovery","TurnDiscovery","data","message","LoggerProxy","logger","log","TURN_DISCOVERY_RESPONSE","handleTurnDiscoveryResponse","RECEIVE_ROAP_MSG","RECEIVE_CALL_LEAVE","resolve","webex","meetings","meetingCollection","getByKey","OK","sendRoap","locusSelfUrl","selfUrl","mediaId","meetingId","id","ANSWER","session","errorType","ERROR","reconnect","sendEmptyMediaId","config","experimental","enableTurnDiscovery","mediaConnections","updateMediaConnections","sequenceId","RoapCollection","onSessionSequenceFinish","mediaNegotiatedEvent","isBusy","processNextQueuedMediaUpdate","isReconnecting","doTurnDiscovery","StatelessWebexPlugin"],"sources":["index.ts"],"sourcesContent":["// @ts-ignore\nimport {StatelessWebexPlugin} from '@webex/webex-core';\n\nimport {ROAP} from '../constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport MeetingUtil from '../meeting/util';\n\nimport RoapHandler from './handler';\nimport RoapRequest from './request';\nimport RoapCollection from './collection';\nimport TurnDiscovery from './turnDiscovery';\nimport Meeting from '../meeting';\n\n/**\n * Roap options\n * @typedef {Object} RoapOptions\n * @property {String} sdp\n * @property {Meeting} meeting\n * @property {Number} roapSeq\n * @property {Boolean} reconnect\n */\n\n/**\n * @typedef {Object} SeqOptions\n * @property {String} correlationId\n * @property {String} mediaId\n * @property {Number} seq\n */\n\n/**\n * @class Roap\n * @export\n * @private\n */\nexport default class Roap extends StatelessWebexPlugin {\n attrs: any;\n lastRoapOffer: any;\n options: any;\n roapHandler: any;\n roapRequest: any;\n turnDiscovery: any;\n\n /**\n *\n * @param {Object} attrs\n * @param {Object} options\n */\n constructor(attrs: any, options: any) {\n super({}, options);\n /**\n * @instance\n * @type {Object}\n * @private\n * @memberof Roap\n */\n this.attrs = attrs;\n /**\n * @instance\n * @type {Object}\n * @private\n * @memberof Roap\n */\n this.options = options;\n /**\n * The Roap Process State Handler\n * @instance\n * @type {RoapHandler}\n * @private\n * @memberof Roap\n */\n this.roapHandler = new RoapHandler(\n this.attrs,\n this.options,\n this.sendRoapOK.bind(this),\n this.sendRoapAnswer.bind(this),\n this.roapFinished.bind(this)\n );\n /**\n * The Roap Request Server Proxy Object\n * @instance\n * @type {RoapRequest}\n * @private\n * @memberof Roap\n */\n // @ts-ignore\n this.roapRequest = new RoapRequest({}, options);\n /**\n * The last roap offer sent to server and acked\n * @instance\n * @type {Object}\n * @private\n * @memberof Roap\n */\n this.lastRoapOffer = {};\n\n this.turnDiscovery = new TurnDiscovery(this.roapRequest);\n }\n\n /**\n * Starts listening to mercury events for Roap messages\n * @param {object} data event object\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private roapEvent(data: any) {\n const msg = data.message;\n const {correlationId} = data;\n\n LoggerProxy.logger.log(\n `Roap:index#roapEvent --> Received Roap Message [${JSON.stringify(msg, null, 2)}]`\n );\n\n if (msg.messageType === ROAP.ROAP_TYPES.TURN_DISCOVERY_RESPONSE) {\n // turn discovery is not part of normal roap protocol and so we are not handling it\n // through the usual roap state machine\n this.turnDiscovery.handleTurnDiscoveryResponse(msg);\n } else {\n this.roapHandler.submit({\n type: ROAP.RECEIVE_ROAP_MSG,\n msg,\n correlationId,\n });\n }\n }\n\n /**\n *\n * @param {String} correlationId correlation id of a meeting\n * @param {Number} seq ROAP sequence number\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private stop(correlationId: string, seq: number) {\n this.roapHandler.submit({\n type: ROAP.RECEIVE_CALL_LEAVE,\n seq,\n correlationId,\n });\n\n return Promise.resolve();\n }\n\n /**\n *\n * @param {SeqOptions} options\n * @returns {null}\n * @private\n * @memberof Roap\n */\n private sendRoapOK(options: any) {\n return Promise.resolve().then(() => {\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.getByKey(\n 'correlationId',\n options.correlationId\n );\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.OK,\n version: ROAP.ROAP_VERSION,\n seq: options.seq,\n };\n\n LoggerProxy.logger.log(`Roap:index#sendRoapOK --> ROAP OK sending with seq ${options.seq}`);\n\n return this.roapRequest\n .sendRoap({\n roapMessage,\n locusSelfUrl: meeting.selfUrl,\n mediaId: options.mediaId,\n correlationId: options.correlationId,\n audioMuted: meeting.isAudioMuted(),\n videoMuted: meeting.isVideoMuted(),\n meetingId: meeting.id,\n })\n .then(() => {\n this.roapHandler.submit({\n type: ROAP.SEND_ROAP_MSG,\n msg: roapMessage,\n correlationId: options.correlationId,\n });\n LoggerProxy.logger.log(`Roap:index#sendRoapOK --> ROAP OK sent with seq ${options.seq}`);\n meeting.setRoapSeq(options.seq);\n });\n });\n }\n\n // eslint-disable-next-line no-warning-comments\n // TODO: try to merge sendRoapOk and roapAnswer\n /**\n * Sends a ROAP answer...\n * @param {SeqOptions} options\n * @param {Boolean} options.audioMuted\n * @param {Boolean} options.videoMuted\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private sendRoapAnswer(options: any) {\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.getByKey(\n 'correlationId',\n options.correlationId\n );\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.ANSWER,\n sdps: options.sdps,\n version: ROAP.ROAP_VERSION,\n seq: options.seq,\n };\n\n this.roapHandler.submit({\n type: ROAP.SEND_ROAP_MSG,\n msg: roapMessage,\n correlationId: options.correlationId,\n });\n\n return this.roapRequest\n .sendRoap({\n roapMessage,\n locusSelfUrl: meeting.selfUrl,\n mediaId: options.mediaId,\n correlationId: options.correlationId,\n audioMuted: options.audioMuted,\n videoMuted: options.videoMuted,\n meetingId: meeting.id,\n })\n .then(() => {\n meeting.setRoapSeq(options.seq);\n\n this.roapHandler.submit({\n type: ROAP.SEND_ROAP_MSG_SUCCESS,\n seq: roapMessage.seq,\n correlationId: meeting.correlationId,\n });\n });\n }\n\n /**\n * Sends a ROAP error...\n * @param {Object} session\n * @param {Object} locus\n * @param {String} errorType\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private sendRoapError(session: any, locus: object, errorType: string) {\n const msg = {\n messageType: ROAP.ROAP_TYPES.ERROR,\n version: ROAP.ROAP_VERSION,\n errorType,\n seq: session.OFFER.seq,\n };\n\n return this.roapRequest.sendRoap(msg, locus);\n }\n\n /**\n * sends a roap media request\n * @param {RoapOptions} options\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n sendRoapMediaRequest(options: any) {\n const {meeting, reconnect} = options;\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.OFFER,\n sdps: [options.sdp],\n // sdps: [options.sdp],\n version: ROAP.ROAP_VERSION,\n seq:\n typeof options.roapSeq !== 'number' && Number.isNaN(parseFloat(options.roapSeq))\n ? 0\n : options.roapSeq + 1,\n tieBreaker: 4294967294, // Math.floor(Math.random() * (2 ** 32) - 1) // TODO: Handle the roap conflict scenario\n };\n\n this.roapHandler.submit({\n type: ROAP.SEND_ROAP_MSG,\n msg: roapMessage,\n correlationId: meeting.correlationId,\n });\n\n // When reconnecting, it's important that the first roap message being sent out has empty media id.\n // Normally this is the roap offer, but when TURN discovery is enabled,\n // then this is the TURN discovery request message\n const sendEmptyMediaId = reconnect && !meeting.config.experimental.enableTurnDiscovery;\n\n return this.roapRequest\n .sendRoap({\n roapMessage,\n correlationId: meeting.correlationId,\n locusSelfUrl: meeting.selfUrl,\n mediaId: sendEmptyMediaId ? '' : meeting.mediaId,\n audioMuted: meeting.isAudioMuted(),\n videoMuted: meeting.isVideoMuted(),\n meetingId: meeting.id,\n })\n .then(({locus, mediaConnections}) => {\n this.roapHandler.submit({\n type: ROAP.SEND_ROAP_MSG_SUCCESS,\n seq: roapMessage.seq,\n correlationId: meeting.correlationId,\n });\n meeting.setRoapSeq(roapMessage.seq);\n\n if (mediaConnections) {\n meeting.updateMediaConnections(mediaConnections);\n }\n\n // eslint-disable-next-line no-warning-comments\n // TODO: we need to attach peerconenction to locus not sure if we need to pass everything here\n return locus;\n // eslint-disable-next-line no-warning-comments\n // TODO: check where to update the sequence number\n });\n }\n\n /**\n * sends a roap media request\n * @param {RoapOptions} options\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n sendRoapCallRequest = (options: any) => {\n const {meeting} = options;\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.OFFER,\n sdps: [options.sdp],\n version: ROAP.ROAP_VERSION,\n seq:\n typeof options.roapSeq !== 'number' && Number.isNaN(parseFloat(options.roapSeq))\n ? 0\n : options.roapSeq + 1,\n tieBreaker: 4294967294, // Math.floor(Math.random() * (2 ** 32) - 1) // TODO: Handle the roap conflict scenario\n };\n\n this.roapHandler.submit({\n type: ROAP.SEND_ROAP_MSG,\n msg: roapMessage,\n correlationId: meeting.correlationId,\n });\n\n const roapBody = {\n localMedias: [\n {\n localSdp: JSON.stringify(\n this.roapRequest.attachRechabilityData({\n roapMessage,\n // eslint-disable-next-line no-warning-comments\n // TODO: check whats the need for video and audiomute\n audioMuted: !!meeting.isAudioMuted(),\n videoMuted: !!meeting.isVideoMuted(),\n })\n ),\n // mediaId: meeting.mediaId\n },\n ],\n };\n\n return MeetingUtil.joinMeetingOptions(meeting, {roapMessage: roapBody}).then((locus) => {\n this.roapHandler.submit({\n type: ROAP.SEND_ROAP_MSG_SUCCESS,\n seq: roapMessage.seq,\n correlationId: meeting.correlationId,\n });\n meeting.setRoapSeq(roapMessage.seq);\n\n // eslint-disable-next-line no-warning-comments\n // TODO: we need to attach peerconenction to locus not sure if we need to pass everything here\n return locus;\n // eslint-disable-next-line no-warning-comments\n // TODO: check where to update the sequence number\n });\n };\n\n /**\n * Called when the roap sequence is finished (completed successfully or failed)\n * @param {String} correlationId id of the meeting affected\n * @param {String} sequenceId the id of the finished sequence\n * @returns {undefined}\n * @private\n * @memberof Roap\n */\n private roapFinished(correlationId: string, sequenceId: string) {\n RoapCollection.onSessionSequenceFinish(correlationId, sequenceId);\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.getByKey('correlationId', correlationId);\n\n meeting.mediaNegotiatedEvent();\n if (!RoapCollection.isBusy(correlationId)) {\n meeting.processNextQueuedMediaUpdate();\n }\n }\n\n /**\n * Performs a TURN server discovery procedure, which involves exchanging\n * some roap messages with the server. This exchange has to be done before\n * any other roap messages are sent\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 return this.turnDiscovery.doTurnDiscovery(meeting, isReconnecting);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["Roap","attrs","options","meeting","roapMessage","messageType","ROAP","ROAP_TYPES","OFFER","sdps","sdp","version","ROAP_VERSION","seq","roapSeq","tieBreaker","roapHandler","submit","type","SEND_ROAP_MSG","msg","correlationId","roapBody","localMedias","localSdp","roapRequest","attachRechabilityData","audioMuted","audio","isLocallyMuted","videoMuted","video","MeetingUtil","joinMeetingOptions","then","locus","SEND_ROAP_MSG_SUCCESS","setRoapSeq","RoapHandler","sendRoapOK","bind","sendRoapAnswer","roapFinished","RoapRequest","lastRoapOffer","turnDiscovery","TurnDiscovery","data","message","LoggerProxy","logger","log","TURN_DISCOVERY_RESPONSE","handleTurnDiscoveryResponse","RECEIVE_ROAP_MSG","RECEIVE_CALL_LEAVE","resolve","webex","meetings","meetingCollection","getByKey","OK","sendRoap","locusSelfUrl","selfUrl","mediaId","meetingId","id","ANSWER","session","errorType","ERROR","reconnect","sendEmptyMediaId","config","experimental","enableTurnDiscovery","mediaConnections","updateMediaConnections","sequenceId","RoapCollection","onSessionSequenceFinish","mediaNegotiatedEvent","isBusy","processNextQueuedMediaUpdate","isReconnecting","doTurnDiscovery","StatelessWebexPlugin"],"sources":["index.ts"],"sourcesContent":["// @ts-ignore\nimport {StatelessWebexPlugin} from '@webex/webex-core';\n\nimport {ROAP} from '../constants';\nimport LoggerProxy from '../common/logs/logger-proxy';\nimport MeetingUtil from '../meeting/util';\n\nimport RoapHandler from './handler';\nimport RoapRequest from './request';\nimport RoapCollection from './collection';\nimport TurnDiscovery from './turnDiscovery';\nimport Meeting from '../meeting';\n\n/**\n * Roap options\n * @typedef {Object} RoapOptions\n * @property {String} sdp\n * @property {Meeting} meeting\n * @property {Number} roapSeq\n * @property {Boolean} reconnect\n */\n\n/**\n * @typedef {Object} SeqOptions\n * @property {String} correlationId\n * @property {String} mediaId\n * @property {Number} seq\n */\n\n/**\n * @class Roap\n * @export\n * @private\n */\nexport default class Roap extends StatelessWebexPlugin {\n attrs: any;\n lastRoapOffer: any;\n options: any;\n roapHandler: any;\n roapRequest: any;\n turnDiscovery: any;\n\n /**\n *\n * @param {Object} attrs\n * @param {Object} options\n */\n constructor(attrs: any, options: any) {\n super({}, options);\n /**\n * @instance\n * @type {Object}\n * @private\n * @memberof Roap\n */\n this.attrs = attrs;\n /**\n * @instance\n * @type {Object}\n * @private\n * @memberof Roap\n */\n this.options = options;\n /**\n * The Roap Process State Handler\n * @instance\n * @type {RoapHandler}\n * @private\n * @memberof Roap\n */\n this.roapHandler = new RoapHandler(\n this.attrs,\n this.options,\n this.sendRoapOK.bind(this),\n this.sendRoapAnswer.bind(this),\n this.roapFinished.bind(this)\n );\n /**\n * The Roap Request Server Proxy Object\n * @instance\n * @type {RoapRequest}\n * @private\n * @memberof Roap\n */\n // @ts-ignore\n this.roapRequest = new RoapRequest({}, options);\n /**\n * The last roap offer sent to server and acked\n * @instance\n * @type {Object}\n * @private\n * @memberof Roap\n */\n this.lastRoapOffer = {};\n\n this.turnDiscovery = new TurnDiscovery(this.roapRequest);\n }\n\n /**\n * Starts listening to mercury events for Roap messages\n * @param {object} data event object\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private roapEvent(data: any) {\n const msg = data.message;\n const {correlationId} = data;\n\n LoggerProxy.logger.log(\n `Roap:index#roapEvent --> Received Roap Message [${JSON.stringify(msg, null, 2)}]`\n );\n\n if (msg.messageType === ROAP.ROAP_TYPES.TURN_DISCOVERY_RESPONSE) {\n // turn discovery is not part of normal roap protocol and so we are not handling it\n // through the usual roap state machine\n this.turnDiscovery.handleTurnDiscoveryResponse(msg);\n } else {\n this.roapHandler.submit({\n type: ROAP.RECEIVE_ROAP_MSG,\n msg,\n correlationId,\n });\n }\n }\n\n /**\n *\n * @param {String} correlationId correlation id of a meeting\n * @param {Number} seq ROAP sequence number\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private stop(correlationId: string, seq: number) {\n this.roapHandler.submit({\n type: ROAP.RECEIVE_CALL_LEAVE,\n seq,\n correlationId,\n });\n\n return Promise.resolve();\n }\n\n /**\n *\n * @param {SeqOptions} options\n * @returns {null}\n * @private\n * @memberof Roap\n */\n private sendRoapOK(options: any) {\n return Promise.resolve().then(() => {\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.getByKey(\n 'correlationId',\n options.correlationId\n );\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.OK,\n version: ROAP.ROAP_VERSION,\n seq: options.seq,\n };\n\n LoggerProxy.logger.log(`Roap:index#sendRoapOK --> ROAP OK sending with seq ${options.seq}`);\n\n return this.roapRequest\n .sendRoap({\n roapMessage,\n locusSelfUrl: meeting.selfUrl,\n mediaId: options.mediaId,\n correlationId: options.correlationId,\n audioMuted: meeting.audio?.isLocallyMuted(),\n videoMuted: meeting.video?.isLocallyMuted(),\n meetingId: meeting.id,\n })\n .then(() => {\n this.roapHandler.submit({\n type: ROAP.SEND_ROAP_MSG,\n msg: roapMessage,\n correlationId: options.correlationId,\n });\n LoggerProxy.logger.log(`Roap:index#sendRoapOK --> ROAP OK sent with seq ${options.seq}`);\n meeting.setRoapSeq(options.seq);\n });\n });\n }\n\n // eslint-disable-next-line no-warning-comments\n // TODO: try to merge sendRoapOk and roapAnswer\n /**\n * Sends a ROAP answer...\n * @param {SeqOptions} options\n * @param {Boolean} options.audioMuted\n * @param {Boolean} options.videoMuted\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private sendRoapAnswer(options: any) {\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.getByKey(\n 'correlationId',\n options.correlationId\n );\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.ANSWER,\n sdps: options.sdps,\n version: ROAP.ROAP_VERSION,\n seq: options.seq,\n };\n\n this.roapHandler.submit({\n type: ROAP.SEND_ROAP_MSG,\n msg: roapMessage,\n correlationId: options.correlationId,\n });\n\n return this.roapRequest\n .sendRoap({\n roapMessage,\n locusSelfUrl: meeting.selfUrl,\n mediaId: options.mediaId,\n correlationId: options.correlationId,\n audioMuted: meeting.audio?.isLocallyMuted(),\n videoMuted: meeting.video?.isLocallyMuted(),\n meetingId: meeting.id,\n })\n .then(() => {\n meeting.setRoapSeq(options.seq);\n\n this.roapHandler.submit({\n type: ROAP.SEND_ROAP_MSG_SUCCESS,\n seq: roapMessage.seq,\n correlationId: meeting.correlationId,\n });\n });\n }\n\n /**\n * Sends a ROAP error...\n * @param {Object} session\n * @param {Object} locus\n * @param {String} errorType\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n private sendRoapError(session: any, locus: object, errorType: string) {\n const msg = {\n messageType: ROAP.ROAP_TYPES.ERROR,\n version: ROAP.ROAP_VERSION,\n errorType,\n seq: session.OFFER.seq,\n };\n\n return this.roapRequest.sendRoap(msg, locus);\n }\n\n /**\n * sends a roap media request\n * @param {RoapOptions} options\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n sendRoapMediaRequest(options: any) {\n const {meeting, reconnect} = options;\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.OFFER,\n sdps: [options.sdp],\n // sdps: [options.sdp],\n version: ROAP.ROAP_VERSION,\n seq:\n typeof options.roapSeq !== 'number' && Number.isNaN(parseFloat(options.roapSeq))\n ? 0\n : options.roapSeq + 1,\n tieBreaker: 4294967294, // Math.floor(Math.random() * (2 ** 32) - 1) // TODO: Handle the roap conflict scenario\n };\n\n this.roapHandler.submit({\n type: ROAP.SEND_ROAP_MSG,\n msg: roapMessage,\n correlationId: meeting.correlationId,\n });\n\n // When reconnecting, it's important that the first roap message being sent out has empty media id.\n // Normally this is the roap offer, but when TURN discovery is enabled,\n // then this is the TURN discovery request message\n const sendEmptyMediaId = reconnect && !meeting.config.experimental.enableTurnDiscovery;\n\n return this.roapRequest\n .sendRoap({\n roapMessage,\n correlationId: meeting.correlationId,\n locusSelfUrl: meeting.selfUrl,\n mediaId: sendEmptyMediaId ? '' : meeting.mediaId,\n audioMuted: meeting.audio?.isLocallyMuted(),\n videoMuted: meeting.video?.isLocallyMuted(),\n meetingId: meeting.id,\n })\n .then(({locus, mediaConnections}) => {\n this.roapHandler.submit({\n type: ROAP.SEND_ROAP_MSG_SUCCESS,\n seq: roapMessage.seq,\n correlationId: meeting.correlationId,\n });\n meeting.setRoapSeq(roapMessage.seq);\n\n if (mediaConnections) {\n meeting.updateMediaConnections(mediaConnections);\n }\n\n // eslint-disable-next-line no-warning-comments\n // TODO: we need to attach peerconenction to locus not sure if we need to pass everything here\n return locus;\n // eslint-disable-next-line no-warning-comments\n // TODO: check where to update the sequence number\n });\n }\n\n /**\n * sends a roap media request\n * @param {RoapOptions} options\n * @returns {Promise}\n * @private\n * @memberof Roap\n */\n sendRoapCallRequest = (options: any) => {\n const {meeting} = options;\n const roapMessage = {\n messageType: ROAP.ROAP_TYPES.OFFER,\n sdps: [options.sdp],\n version: ROAP.ROAP_VERSION,\n seq:\n typeof options.roapSeq !== 'number' && Number.isNaN(parseFloat(options.roapSeq))\n ? 0\n : options.roapSeq + 1,\n tieBreaker: 4294967294, // Math.floor(Math.random() * (2 ** 32) - 1) // TODO: Handle the roap conflict scenario\n };\n\n this.roapHandler.submit({\n type: ROAP.SEND_ROAP_MSG,\n msg: roapMessage,\n correlationId: meeting.correlationId,\n });\n\n const roapBody = {\n localMedias: [\n {\n localSdp: JSON.stringify(\n this.roapRequest.attachRechabilityData({\n roapMessage,\n // eslint-disable-next-line no-warning-comments\n // TODO: check whats the need for video and audiomute\n audioMuted: meeting.audio?.isLocallyMuted(),\n videoMuted: meeting.video?.isLocallyMuted(),\n })\n ),\n // mediaId: meeting.mediaId\n },\n ],\n };\n\n return MeetingUtil.joinMeetingOptions(meeting, {roapMessage: roapBody}).then((locus) => {\n this.roapHandler.submit({\n type: ROAP.SEND_ROAP_MSG_SUCCESS,\n seq: roapMessage.seq,\n correlationId: meeting.correlationId,\n });\n meeting.setRoapSeq(roapMessage.seq);\n\n // eslint-disable-next-line no-warning-comments\n // TODO: we need to attach peerconenction to locus not sure if we need to pass everything here\n return locus;\n // eslint-disable-next-line no-warning-comments\n // TODO: check where to update the sequence number\n });\n };\n\n /**\n * Called when the roap sequence is finished (completed successfully or failed)\n * @param {String} correlationId id of the meeting affected\n * @param {String} sequenceId the id of the finished sequence\n * @returns {undefined}\n * @private\n * @memberof Roap\n */\n private roapFinished(correlationId: string, sequenceId: string) {\n RoapCollection.onSessionSequenceFinish(correlationId, sequenceId);\n // @ts-ignore\n const meeting = this.webex.meetings.meetingCollection.getByKey('correlationId', correlationId);\n\n meeting.mediaNegotiatedEvent();\n if (!RoapCollection.isBusy(correlationId)) {\n meeting.processNextQueuedMediaUpdate();\n }\n }\n\n /**\n * Performs a TURN server discovery procedure, which involves exchanging\n * some roap messages with the server. This exchange has to be done before\n * any other roap messages are sent\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 return this.turnDiscovery.doTurnDiscovery(meeting, isReconnecting);\n }\n}\n"],"mappings":"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"}
@@ -130,6 +130,7 @@ var TurnDiscovery = /*#__PURE__*/function () {
130
130
  }, {
131
131
  key: "sendRoapTurnDiscoveryRequest",
132
132
  value: function sendRoapTurnDiscoveryRequest(meeting, isReconnecting) {
133
+ var _meeting$audio, _meeting$video;
133
134
  var seq = meeting.roapSeq + 1;
134
135
  if (this.defer) {
135
136
  _loggerProxy.default.logger.warn('Roap:turnDiscovery#sendRoapTurnDiscoveryRequest --> already in progress');
@@ -149,8 +150,8 @@ var TurnDiscovery = /*#__PURE__*/function () {
149
150
  locusSelfUrl: meeting.selfUrl,
150
151
  // @ts-ignore - Fix missing type
151
152
  mediaId: isReconnecting ? '' : meeting.mediaId,
152
- audioMuted: meeting.isAudioMuted(),
153
- videoMuted: meeting.isVideoMuted(),
153
+ audioMuted: (_meeting$audio = meeting.audio) === null || _meeting$audio === void 0 ? void 0 : _meeting$audio.isLocallyMuted(),
154
+ videoMuted: (_meeting$video = meeting.video) === null || _meeting$video === void 0 ? void 0 : _meeting$video.isLocallyMuted(),
154
155
  meetingId: meeting.id
155
156
  }).then(function (_ref) {
156
157
  var mediaConnections = _ref.mediaConnections;
@@ -171,6 +172,7 @@ var TurnDiscovery = /*#__PURE__*/function () {
171
172
  }, {
172
173
  key: "sendRoapOK",
173
174
  value: function sendRoapOK(meeting) {
175
+ var _meeting$audio2, _meeting$video2;
174
176
  _loggerProxy.default.logger.info('Roap:turnDiscovery#sendRoapOK --> sending OK');
175
177
  return this.roapRequest.sendRoap({
176
178
  roapMessage: {
@@ -183,8 +185,8 @@ var TurnDiscovery = /*#__PURE__*/function () {
183
185
  // @ts-ignore - fix type
184
186
  mediaId: meeting.mediaId,
185
187
  correlationId: meeting.correlationId,
186
- audioMuted: meeting.isAudioMuted(),
187
- videoMuted: meeting.isVideoMuted(),
188
+ audioMuted: (_meeting$audio2 = meeting.audio) === null || _meeting$audio2 === void 0 ? void 0 : _meeting$audio2.isLocallyMuted(),
189
+ videoMuted: (_meeting$video2 = meeting.video) === null || _meeting$video2 === void 0 ? void 0 : _meeting$video2.isLocallyMuted(),
188
190
  meetingId: meeting.id
189
191
  });
190
192
  }
@@ -1 +1 @@
1
- {"version":3,"names":["TURN_DISCOVERY_TIMEOUT","TurnDiscovery","roapRequest","turnInfo","url","username","password","defer","LoggerProxy","logger","warn","reject","Error","responseTimer","setTimeout","info","promise","roapMessage","headers","expectedHeaders","headerName","field","foundHeaders","forEach","receivedHeader","expectedHeader","startsWith","substring","length","clearTimeout","undefined","resolve","meeting","isReconnecting","seq","roapSeq","Defer","messageType","ROAP","ROAP_TYPES","TURN_DISCOVERY_REQUEST","version","ROAP_VERSION","sendRoap","correlationId","locusSelfUrl","selfUrl","mediaId","audioMuted","isAudioMuted","videoMuted","isVideoMuted","meetingId","id","then","mediaConnections","setRoapSeq","updateMediaConnections","OK","isAnyClusterReachable","webex","meetings","reachability","turnServerInfo","turnDiscoverySkippedReason","config","experimental","enableTurnDiscovery","sendRoapTurnDiscoveryRequest","waitForTurnDiscoveryResponse","sendRoapOK","catch","e","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","TURN_DISCOVERY_FAILURE","correlation_id","locus_id","locusUrl","split","pop","reason","message","stack"],"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.isAudioMuted(),\n videoMuted: meeting.isVideoMuted(),\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.isAudioMuted(),\n videoMuted: meeting.isVideoMuted(),\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":["TURN_DISCOVERY_TIMEOUT","TurnDiscovery","roapRequest","turnInfo","url","username","password","defer","LoggerProxy","logger","warn","reject","Error","responseTimer","setTimeout","info","promise","roapMessage","headers","expectedHeaders","headerName","field","foundHeaders","forEach","receivedHeader","expectedHeader","startsWith","substring","length","clearTimeout","undefined","resolve","meeting","isReconnecting","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","mediaConnections","setRoapSeq","updateMediaConnections","OK","isAnyClusterReachable","webex","meetings","reachability","turnServerInfo","turnDiscoverySkippedReason","config","experimental","enableTurnDiscovery","sendRoapTurnDiscoveryRequest","waitForTurnDiscoveryResponse","sendRoapOK","catch","e","Metrics","sendBehavioralMetric","BEHAVIORAL_METRICS","TURN_DISCOVERY_FAILURE","correlation_id","locus_id","locusUrl","split","pop","reason","message","stack"],"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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"}
@@ -26,7 +26,9 @@ var getAudioReceiverMqa = function getAudioReceiverMqa(_ref) {
26
26
  audioReceiver.common.rtpHopByHopLost = statsResults[mediaType][sendrecvType].totalPacketsLost - lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost || 0;
27
27
 
28
28
  // @ts-ignore
29
- audioReceiver.streams[0].common.maxRtpJitter = (0, _max2.default)(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;
29
+ audioReceiver.streams[0].common.maxRtpJitter =
30
+ // @ts-ignore
31
+ (0, _max2.default)(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;
30
32
  audioReceiver.streams[0].common.meanRtpJitter = (0, _mean2.default)(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;
31
33
  audioReceiver.streams[0].common.rtpJitter = audioReceiver.streams[0].common.maxRtpJitter;
32
34
 
@@ -51,7 +53,9 @@ var getAudioSenderMqa = function getAudioSenderMqa(_ref2) {
51
53
  audioSender.common.transportType = statsResults.connectionType.local.transport[0];
52
54
 
53
55
  // @ts-ignore
54
- audioSender.common.maxRemoteJitter = (0, _max2.default)(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
56
+ audioSender.common.maxRemoteJitter =
57
+ // @ts-ignore
58
+ (0, _max2.default)(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
55
59
  audioSender.common.meanRemoteJitter = (0, _mean2.default)(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
56
60
  audioSender.common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsSent - lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;
57
61
  audioSender.streams[0].common.rtpPackets = audioSender.common.rtpPackets;
@@ -63,7 +67,9 @@ var getAudioSenderMqa = function getAudioSenderMqa(_ref2) {
63
67
  audioSender.common.remoteLossRate = totalpacketsLostForaMin > 0 ? totalpacketsLostForaMin * 100 / audioSender.common.rtpPackets : 0; // This is the packets sent with in last min || 0;
64
68
 
65
69
  // @ts-ignore
66
- audioSender.common.maxRoundTripTime = (0, _max2.default)(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
70
+ audioSender.common.maxRoundTripTime =
71
+ // @ts-ignore
72
+ (0, _max2.default)(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
67
73
  audioSender.common.meanRoundTripTime = (0, _mean2.default)(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
68
74
  audioSender.common.roundTripTime = audioSender.common.maxRoundTripTime;
69
75
 
@@ -101,7 +107,9 @@ var getVideoReceiverMqa = function getVideoReceiverMqa(_ref3) {
101
107
  // calculate this values
102
108
 
103
109
  // @ts-ignore
104
- videoReceiver.common.maxRemoteJitter = (0, _max2.default)(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
110
+ videoReceiver.common.maxRemoteJitter =
111
+ // @ts-ignore
112
+ (0, _max2.default)(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
105
113
  videoReceiver.common.meanRemoteJitter = (0, _mean2.default)(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
106
114
  videoReceiver.streams[0].common.rtpJitter = videoReceiver.common.maxRemoteJitter;
107
115
  // videoReceiver.streams[0].common.rtpJitter = (statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay - lastMqaDataSent.resolutions[mediaType][sendrecvType].jitterBufferDelay) / (statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount - lastMqaDataSent.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount) * 1000 || 0;
@@ -136,7 +144,9 @@ var getVideoSenderMqa = function getVideoSenderMqa(_ref4) {
136
144
  videoSender.common.transportType = statsResults.connectionType.local.transport[0];
137
145
 
138
146
  // @ts-ignore
139
- videoSender.common.maxRemoteJitter = (0, _max2.default)(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
147
+ videoSender.common.maxRemoteJitter =
148
+ // @ts-ignore
149
+ (0, _max2.default)(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
140
150
  videoSender.common.meanRemoteJitter = (0, _mean2.default)(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;
141
151
  videoSender.common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsSent - lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;
142
152
  videoSender.common.availableBitrate = statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;
@@ -146,7 +156,9 @@ var getVideoSenderMqa = function getVideoSenderMqa(_ref4) {
146
156
  videoSender.common.remoteLossRate = totalpacketsLostForaMin > 0 ? totalpacketsLostForaMin * 100 / (videoSender.common.rtpPackets + totalpacketsLostForaMin) : 0; // This is the packets sent with in last min || 0;
147
157
 
148
158
  // @ts-ignore
149
- videoSender.common.maxRoundTripTime = (0, _max2.default)(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
159
+ videoSender.common.maxRoundTripTime =
160
+ // @ts-ignore
161
+ (0, _max2.default)(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
150
162
  videoSender.common.meanRoundTripTime = (0, _mean2.default)(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;
151
163
  videoSender.common.roundTripTime = videoSender.common.maxRoundTripTime;
152
164
  videoSender.streams[0].common.rtpPackets = statsResults[mediaType][sendrecvType].totalPacketsSent - lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;
@@ -1 +1 @@
1
- {"version":3,"names":["getAudioReceiverMqa","audioReceiver","statsResults","lastMqaDataSent","mediaType","STATS","AUDIO_CORRELATE","sendrecvType","RECEIVE_DIRECTION","common","direction","transportType","connectionType","remote","transport","rtpPackets","totalPacketsReceived","streams","mediaHopByHopLost","totalPacketsLost","rtpHopByHopLost","maxRtpJitter","meanRtpJitter","rtpJitter","fecRecovered","fecPacketsReceived","fecPacketsDiscarded","rtpEndToEndLost","framesDropped","totalSamplesDecoded","renderedFrameRate","framesReceived","totalSamplesReceived","concealedFrames","concealedSamples","receivedBitrate","totalBytesReceived","rtpBitrate","getAudioSenderMqa","audioSender","SEND_DIRECTION","local","maxRemoteJitter","meanRemoteJitter","totalPacketsSent","availableBitrate","availableOutgoingBitrate","totalpacketsLostForaMin","totalPacketsLostOnReceiver","remoteLossRate","maxRoundTripTime","meanRoundTripTime","roundTripTime","totalBytesSentInaMin","totalBytesSent","transmittedBitrate","transmittedKeyFrames","totalKeyFramesEncoded","requestedKeyFrames","totalFirCount","getVideoReceiverMqa","videoReceiver","isShareStream","SHARE_CORRELATE","VIDEO_CORRELATE","totalPacketLoss","totalBytesReceivedInaMin","totalFrameReceivedInaMin","resolutions","totalFrameDecodedInaMin","framesDecoded","receivedFrameRate","receivedHeight","height","receivedWidth","width","receivedFrameSize","receivedKeyFrames","keyFramesDecoded","totalPliCount","getVideoSenderMqa","videoSender","totalFrameSentInaMin","framesSent","transmittedFrameRate","transmittedHeight","transmittedWidth","transmittedFrameSize"],"sources":["mqaUtil.ts"],"sourcesContent":["/* eslint-disable prefer-destructuring */\n\nimport {mean, max} from 'lodash';\n\nimport {STATS} from '../constants';\n\nexport const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSent}) => {\n const mediaType = STATS.AUDIO_CORRELATE;\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n audioReceiver.common.common.direction = statsResults[mediaType].direction;\n audioReceiver.common.transportType = statsResults.connectionType.remote.transport[0];\n // add rtpPacket info inside common as also for call analyzer\n audioReceiver.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsReceived -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsReceived || 0;\n // Hop by hop are numbers and not percentage so we compare on what we sent the last min\n // collect the packets received for the last min\n audioReceiver.streams[0].common.rtpPackets = audioReceiver.common.rtpPackets;\n audioReceiver.common.mediaHopByHopLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost || 0;\n audioReceiver.common.rtpHopByHopLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost || 0;\n\n // @ts-ignore\n audioReceiver.streams[0].common.maxRtpJitter =\n max(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.meanRtpJitter =\n mean(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.rtpJitter = audioReceiver.streams[0].common.maxRtpJitter;\n\n // Fec packets do come in as part of the FEC only for audio\n const fecRecovered =\n statsResults[mediaType][sendrecvType].fecPacketsReceived -\n lastMqaDataSent[mediaType][sendrecvType].fecPacketsReceived -\n (statsResults[mediaType][sendrecvType].fecPacketsDiscarded -\n lastMqaDataSent[mediaType][sendrecvType].fecPacketsDiscarded);\n\n audioReceiver.streams[0].common.rtpEndToEndLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost -\n fecRecovered || 0;\n\n audioReceiver.streams[0].common.framesDropped =\n statsResults[mediaType][sendrecvType].totalSamplesDecoded -\n lastMqaDataSent[mediaType][sendrecvType].totalSamplesDecoded || 0;\n audioReceiver.streams[0].common.renderedFrameRate =\n (audioReceiver.streams[0].common.framesDropped * 100) / 60 || 0;\n audioReceiver.streams[0].common.framesReceived =\n statsResults[mediaType][sendrecvType].totalSamplesReceived -\n lastMqaDataSent[mediaType][sendrecvType].totalSamplesReceived || 0;\n audioReceiver.streams[0].common.concealedFrames =\n statsResults[mediaType][sendrecvType].concealedSamples -\n lastMqaDataSent[mediaType][sendrecvType].concealedSamples || 0;\n audioReceiver.streams[0].common.receivedBitrate =\n ((statsResults[mediaType][sendrecvType].totalBytesReceived -\n lastMqaDataSent[mediaType][sendrecvType].totalBytesReceived) *\n 8) /\n 60 || 0;\n\n audioReceiver.common.rtpBitrate = audioReceiver.streams[0].common.receivedBitrate;\n};\n\nexport const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent}) => {\n const mediaType = STATS.AUDIO_CORRELATE;\n const sendrecvType = STATS.SEND_DIRECTION;\n\n audioSender.common.common.direction = statsResults[mediaType].direction;\n audioSender.common.transportType = statsResults.connectionType.local.transport[0];\n\n // @ts-ignore\n audioSender.common.maxRemoteJitter =\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n audioSender.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n audioSender.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;\n audioSender.streams[0].common.rtpPackets = audioSender.common.rtpPackets;\n // From candidate-pair\n audioSender.common.availableBitrate =\n statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;\n // Calculate based on how much packets lost of received compated to how to the client sent\n\n const totalpacketsLostForaMin =\n statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsLostOnReceiver;\n\n audioSender.common.remoteLossRate =\n totalpacketsLostForaMin > 0\n ? (totalpacketsLostForaMin * 100) / audioSender.common.rtpPackets\n : 0; // This is the packets sent with in last min || 0;\n\n // @ts-ignore\n audioSender.common.maxRoundTripTime =\n max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.meanRoundTripTime =\n mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.roundTripTime = audioSender.common.maxRoundTripTime;\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin =\n statsResults[mediaType][sendrecvType].totalBytesSent -\n lastMqaDataSent[mediaType][sendrecvType].totalBytesSent;\n\n audioSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin\n ? (totalBytesSentInaMin * 8) / 60\n : 0;\n audioSender.common.rtpBitrate = audioSender.streams[0].common.transmittedBitrate;\n\n audioSender.streams[0].transmittedKeyFrames =\n statsResults[mediaType][sendrecvType].totalKeyFramesEncoded -\n lastMqaDataSent[mediaType][sendrecvType].totalKeyFramesEncoded || 0;\n audioSender.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalFirCount -\n lastMqaDataSent[mediaType][sendrecvType].totalFirCount || 0;\n};\n\nexport const getVideoReceiverMqa = ({\n videoReceiver,\n statsResults,\n lastMqaDataSent,\n isShareStream = false,\n}) => {\n const mediaType = isShareStream ? STATS.SHARE_CORRELATE : STATS.VIDEO_CORRELATE;\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n videoReceiver.common.common.direction = statsResults[mediaType].direction;\n videoReceiver.common.transportType = statsResults.connectionType.remote.transport[0];\n // collect the packets received for the last min\n videoReceiver.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsReceived -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsReceived || 0;\n videoReceiver.streams[0].common.rtpPackets = videoReceiver.common.rtpPackets;\n\n const totalPacketLoss =\n statsResults[mediaType][sendrecvType].totalPacketsLost -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost || 0;\n\n // Hope by hop are numbers and not percentage so we compare on what we sent the last min\n // this is including packet lost\n videoReceiver.common.mediaHopByHopLost = totalPacketLoss;\n videoReceiver.common.rtpHopByHopLost = totalPacketLoss;\n\n // End to end packetloss is after recovery\n videoReceiver.streams[0].common.rtpEndToEndLost = totalPacketLoss;\n\n // calculate this values\n\n // @ts-ignore\n videoReceiver.common.maxRemoteJitter =\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoReceiver.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n videoReceiver.streams[0].common.rtpJitter = videoReceiver.common.maxRemoteJitter;\n // videoReceiver.streams[0].common.rtpJitter = (statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay - lastMqaDataSent.resolutions[mediaType][sendrecvType].jitterBufferDelay) / (statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount - lastMqaDataSent.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount) * 1000 || 0;\n\n // Calculate the outgoing bitrate\n const totalBytesReceivedInaMin =\n statsResults[mediaType][sendrecvType].totalBytesReceived -\n lastMqaDataSent[mediaType][sendrecvType].totalBytesReceived;\n\n videoReceiver.streams[0].common.receivedBitrate = totalBytesReceivedInaMin\n ? (totalBytesReceivedInaMin * 8) / 60\n : 0;\n videoReceiver.common.rtpBitrate = videoReceiver.streams[0].common.receivedBitrate;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameReceivedInaMin =\n statsResults.resolutions[mediaType][sendrecvType].framesReceived -\n lastMqaDataSent.resolutions[mediaType][sendrecvType].framesReceived;\n const totalFrameDecodedInaMin =\n statsResults.resolutions[mediaType][sendrecvType].framesDecoded -\n lastMqaDataSent.resolutions[mediaType][sendrecvType].framesDecoded;\n\n videoReceiver.streams[0].common.receivedFrameRate = totalFrameReceivedInaMin\n ? (totalFrameReceivedInaMin * 100) / 60\n : 0;\n videoReceiver.streams[0].common.renderedFrameRate = totalFrameDecodedInaMin\n ? (totalFrameDecodedInaMin * 100) / 60\n : 0;\n\n videoReceiver.streams[0].common.framesDropped =\n statsResults.resolutions[mediaType][sendrecvType].framesDropped -\n lastMqaDataSent.resolutions[mediaType][sendrecvType].framesDropped;\n videoReceiver.streams[0].receivedHeight =\n statsResults.resolutions[mediaType][sendrecvType].height;\n videoReceiver.streams[0].receivedWidth = statsResults.resolutions[mediaType][sendrecvType].width;\n videoReceiver.streams[0].receivedFrameSize =\n (statsResults.resolutions[mediaType][sendrecvType].height *\n statsResults.resolutions[mediaType][sendrecvType].height) /\n 256;\n\n videoReceiver.streams[0].receivedKeyFrames =\n statsResults[mediaType][sendrecvType].keyFramesDecoded -\n lastMqaDataSent[mediaType][sendrecvType].keyFramesDecoded || 0;\n videoReceiver.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalPliCount -\n lastMqaDataSent[mediaType][sendrecvType].totalPliCount || 0;\n};\n\nexport const getVideoSenderMqa = ({\n videoSender,\n statsResults,\n lastMqaDataSent,\n isShareStream = false,\n}) => {\n const mediaType = isShareStream ? STATS.SHARE_CORRELATE : STATS.VIDEO_CORRELATE;\n const sendrecvType = STATS.SEND_DIRECTION;\n\n videoSender.common.common.direction = statsResults[mediaType].direction;\n videoSender.common.transportType = statsResults.connectionType.local.transport[0];\n\n // @ts-ignore\n videoSender.common.maxRemoteJitter =\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoSender.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n videoSender.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;\n videoSender.common.availableBitrate =\n statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;\n // Calculate based on how much packets lost of received compated to how to the client sent\n\n const totalpacketsLostForaMin =\n statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsLostOnReceiver;\n\n videoSender.common.remoteLossRate =\n totalpacketsLostForaMin > 0\n ? (totalpacketsLostForaMin * 100) / (videoSender.common.rtpPackets + totalpacketsLostForaMin)\n : 0; // This is the packets sent with in last min || 0;\n\n // @ts-ignore\n videoSender.common.maxRoundTripTime =\n max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.meanRoundTripTime =\n mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.roundTripTime = videoSender.common.maxRoundTripTime;\n\n videoSender.streams[0].common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin =\n statsResults[mediaType][sendrecvType].totalBytesSent -\n lastMqaDataSent[mediaType][sendrecvType].totalBytesSent;\n\n videoSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin\n ? (totalBytesSentInaMin * 8) / 60\n : 0;\n\n videoSender.common.rtpBitrate = videoSender.streams[0].common.transmittedBitrate;\n\n videoSender.streams[0].transmittedKeyFrames =\n statsResults[mediaType][sendrecvType].totalKeyFramesEncoded -\n lastMqaDataSent[mediaType][sendrecvType].totalKeyFramesEncoded || 0;\n videoSender.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalFirCount -\n lastMqaDataSent[mediaType][sendrecvType].totalFirCount || 0;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameSentInaMin =\n statsResults.resolutions[mediaType][sendrecvType].framesSent -\n (lastMqaDataSent.resolutions[mediaType][sendrecvType].framesSent || 0);\n\n videoSender.streams[0].common.transmittedFrameRate = totalFrameSentInaMin\n ? (totalFrameSentInaMin * 100) / 60\n : 0;\n videoSender.streams[0].transmittedHeight =\n statsResults.resolutions[mediaType][sendrecvType].height;\n videoSender.streams[0].transmittedWidth = statsResults.resolutions[mediaType][sendrecvType].width;\n videoSender.streams[0].transmittedFrameSize =\n (statsResults.resolutions[mediaType][sendrecvType].height *\n statsResults.resolutions[mediaType][sendrecvType].width) /\n 254;\n};\n"],"mappings":"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"}
1
+ {"version":3,"names":["getAudioReceiverMqa","audioReceiver","statsResults","lastMqaDataSent","mediaType","STATS","AUDIO_CORRELATE","sendrecvType","RECEIVE_DIRECTION","common","direction","transportType","connectionType","remote","transport","rtpPackets","totalPacketsReceived","streams","mediaHopByHopLost","totalPacketsLost","rtpHopByHopLost","maxRtpJitter","meanRtpJitter","rtpJitter","fecRecovered","fecPacketsReceived","fecPacketsDiscarded","rtpEndToEndLost","framesDropped","totalSamplesDecoded","renderedFrameRate","framesReceived","totalSamplesReceived","concealedFrames","concealedSamples","receivedBitrate","totalBytesReceived","rtpBitrate","getAudioSenderMqa","audioSender","SEND_DIRECTION","local","maxRemoteJitter","meanRemoteJitter","totalPacketsSent","availableBitrate","availableOutgoingBitrate","totalpacketsLostForaMin","totalPacketsLostOnReceiver","remoteLossRate","maxRoundTripTime","meanRoundTripTime","roundTripTime","totalBytesSentInaMin","totalBytesSent","transmittedBitrate","transmittedKeyFrames","totalKeyFramesEncoded","requestedKeyFrames","totalFirCount","getVideoReceiverMqa","videoReceiver","isShareStream","SHARE_CORRELATE","VIDEO_CORRELATE","totalPacketLoss","totalBytesReceivedInaMin","totalFrameReceivedInaMin","resolutions","totalFrameDecodedInaMin","framesDecoded","receivedFrameRate","receivedHeight","height","receivedWidth","width","receivedFrameSize","receivedKeyFrames","keyFramesDecoded","totalPliCount","getVideoSenderMqa","videoSender","totalFrameSentInaMin","framesSent","transmittedFrameRate","transmittedHeight","transmittedWidth","transmittedFrameSize"],"sources":["mqaUtil.ts"],"sourcesContent":["/* eslint-disable prefer-destructuring */\n\nimport {mean, max} from 'lodash';\n\nimport {STATS} from '../constants';\n\nexport const getAudioReceiverMqa = ({audioReceiver, statsResults, lastMqaDataSent}) => {\n const mediaType = STATS.AUDIO_CORRELATE;\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n audioReceiver.common.common.direction = statsResults[mediaType].direction;\n audioReceiver.common.transportType = statsResults.connectionType.remote.transport[0];\n // add rtpPacket info inside common as also for call analyzer\n audioReceiver.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsReceived -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsReceived || 0;\n // Hop by hop are numbers and not percentage so we compare on what we sent the last min\n // collect the packets received for the last min\n audioReceiver.streams[0].common.rtpPackets = audioReceiver.common.rtpPackets;\n audioReceiver.common.mediaHopByHopLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost || 0;\n audioReceiver.common.rtpHopByHopLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost || 0;\n\n // @ts-ignore\n audioReceiver.streams[0].common.maxRtpJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.meanRtpJitter =\n mean(statsResults[mediaType][sendrecvType].meanRtpJitter) * 1000 || 0;\n audioReceiver.streams[0].common.rtpJitter = audioReceiver.streams[0].common.maxRtpJitter;\n\n // Fec packets do come in as part of the FEC only for audio\n const fecRecovered =\n statsResults[mediaType][sendrecvType].fecPacketsReceived -\n lastMqaDataSent[mediaType][sendrecvType].fecPacketsReceived -\n (statsResults[mediaType][sendrecvType].fecPacketsDiscarded -\n lastMqaDataSent[mediaType][sendrecvType].fecPacketsDiscarded);\n\n audioReceiver.streams[0].common.rtpEndToEndLost =\n statsResults[mediaType][sendrecvType].totalPacketsLost -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost -\n fecRecovered || 0;\n\n audioReceiver.streams[0].common.framesDropped =\n statsResults[mediaType][sendrecvType].totalSamplesDecoded -\n lastMqaDataSent[mediaType][sendrecvType].totalSamplesDecoded || 0;\n audioReceiver.streams[0].common.renderedFrameRate =\n (audioReceiver.streams[0].common.framesDropped * 100) / 60 || 0;\n audioReceiver.streams[0].common.framesReceived =\n statsResults[mediaType][sendrecvType].totalSamplesReceived -\n lastMqaDataSent[mediaType][sendrecvType].totalSamplesReceived || 0;\n audioReceiver.streams[0].common.concealedFrames =\n statsResults[mediaType][sendrecvType].concealedSamples -\n lastMqaDataSent[mediaType][sendrecvType].concealedSamples || 0;\n audioReceiver.streams[0].common.receivedBitrate =\n ((statsResults[mediaType][sendrecvType].totalBytesReceived -\n lastMqaDataSent[mediaType][sendrecvType].totalBytesReceived) *\n 8) /\n 60 || 0;\n\n audioReceiver.common.rtpBitrate = audioReceiver.streams[0].common.receivedBitrate;\n};\n\nexport const getAudioSenderMqa = ({audioSender, statsResults, lastMqaDataSent}) => {\n const mediaType = STATS.AUDIO_CORRELATE;\n const sendrecvType = STATS.SEND_DIRECTION;\n\n audioSender.common.common.direction = statsResults[mediaType].direction;\n audioSender.common.transportType = statsResults.connectionType.local.transport[0];\n\n // @ts-ignore\n audioSender.common.maxRemoteJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n audioSender.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n audioSender.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;\n audioSender.streams[0].common.rtpPackets = audioSender.common.rtpPackets;\n // From candidate-pair\n audioSender.common.availableBitrate =\n statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;\n // Calculate based on how much packets lost of received compated to how to the client sent\n\n const totalpacketsLostForaMin =\n statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsLostOnReceiver;\n\n audioSender.common.remoteLossRate =\n totalpacketsLostForaMin > 0\n ? (totalpacketsLostForaMin * 100) / audioSender.common.rtpPackets\n : 0; // This is the packets sent with in last min || 0;\n\n // @ts-ignore\n audioSender.common.maxRoundTripTime =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.meanRoundTripTime =\n mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n audioSender.common.roundTripTime = audioSender.common.maxRoundTripTime;\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin =\n statsResults[mediaType][sendrecvType].totalBytesSent -\n lastMqaDataSent[mediaType][sendrecvType].totalBytesSent;\n\n audioSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin\n ? (totalBytesSentInaMin * 8) / 60\n : 0;\n audioSender.common.rtpBitrate = audioSender.streams[0].common.transmittedBitrate;\n\n audioSender.streams[0].transmittedKeyFrames =\n statsResults[mediaType][sendrecvType].totalKeyFramesEncoded -\n lastMqaDataSent[mediaType][sendrecvType].totalKeyFramesEncoded || 0;\n audioSender.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalFirCount -\n lastMqaDataSent[mediaType][sendrecvType].totalFirCount || 0;\n};\n\nexport const getVideoReceiverMqa = ({\n videoReceiver,\n statsResults,\n lastMqaDataSent,\n isShareStream = false,\n}) => {\n const mediaType = isShareStream ? STATS.SHARE_CORRELATE : STATS.VIDEO_CORRELATE;\n const sendrecvType = STATS.RECEIVE_DIRECTION;\n\n videoReceiver.common.common.direction = statsResults[mediaType].direction;\n videoReceiver.common.transportType = statsResults.connectionType.remote.transport[0];\n // collect the packets received for the last min\n videoReceiver.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsReceived -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsReceived || 0;\n videoReceiver.streams[0].common.rtpPackets = videoReceiver.common.rtpPackets;\n\n const totalPacketLoss =\n statsResults[mediaType][sendrecvType].totalPacketsLost -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsLost || 0;\n\n // Hope by hop are numbers and not percentage so we compare on what we sent the last min\n // this is including packet lost\n videoReceiver.common.mediaHopByHopLost = totalPacketLoss;\n videoReceiver.common.rtpHopByHopLost = totalPacketLoss;\n\n // End to end packetloss is after recovery\n videoReceiver.streams[0].common.rtpEndToEndLost = totalPacketLoss;\n\n // calculate this values\n\n // @ts-ignore\n videoReceiver.common.maxRemoteJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoReceiver.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n videoReceiver.streams[0].common.rtpJitter = videoReceiver.common.maxRemoteJitter;\n // videoReceiver.streams[0].common.rtpJitter = (statsResults.resolutions[mediaType][sendrecvType].jitterBufferDelay - lastMqaDataSent.resolutions[mediaType][sendrecvType].jitterBufferDelay) / (statsResults.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount - lastMqaDataSent.resolutions[mediaType][sendrecvType].jitterBufferEmittedCount) * 1000 || 0;\n\n // Calculate the outgoing bitrate\n const totalBytesReceivedInaMin =\n statsResults[mediaType][sendrecvType].totalBytesReceived -\n lastMqaDataSent[mediaType][sendrecvType].totalBytesReceived;\n\n videoReceiver.streams[0].common.receivedBitrate = totalBytesReceivedInaMin\n ? (totalBytesReceivedInaMin * 8) / 60\n : 0;\n videoReceiver.common.rtpBitrate = videoReceiver.streams[0].common.receivedBitrate;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameReceivedInaMin =\n statsResults.resolutions[mediaType][sendrecvType].framesReceived -\n lastMqaDataSent.resolutions[mediaType][sendrecvType].framesReceived;\n const totalFrameDecodedInaMin =\n statsResults.resolutions[mediaType][sendrecvType].framesDecoded -\n lastMqaDataSent.resolutions[mediaType][sendrecvType].framesDecoded;\n\n videoReceiver.streams[0].common.receivedFrameRate = totalFrameReceivedInaMin\n ? (totalFrameReceivedInaMin * 100) / 60\n : 0;\n videoReceiver.streams[0].common.renderedFrameRate = totalFrameDecodedInaMin\n ? (totalFrameDecodedInaMin * 100) / 60\n : 0;\n\n videoReceiver.streams[0].common.framesDropped =\n statsResults.resolutions[mediaType][sendrecvType].framesDropped -\n lastMqaDataSent.resolutions[mediaType][sendrecvType].framesDropped;\n videoReceiver.streams[0].receivedHeight =\n statsResults.resolutions[mediaType][sendrecvType].height;\n videoReceiver.streams[0].receivedWidth = statsResults.resolutions[mediaType][sendrecvType].width;\n videoReceiver.streams[0].receivedFrameSize =\n (statsResults.resolutions[mediaType][sendrecvType].height *\n statsResults.resolutions[mediaType][sendrecvType].height) /\n 256;\n\n videoReceiver.streams[0].receivedKeyFrames =\n statsResults[mediaType][sendrecvType].keyFramesDecoded -\n lastMqaDataSent[mediaType][sendrecvType].keyFramesDecoded || 0;\n videoReceiver.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalPliCount -\n lastMqaDataSent[mediaType][sendrecvType].totalPliCount || 0;\n};\n\nexport const getVideoSenderMqa = ({\n videoSender,\n statsResults,\n lastMqaDataSent,\n isShareStream = false,\n}) => {\n const mediaType = isShareStream ? STATS.SHARE_CORRELATE : STATS.VIDEO_CORRELATE;\n const sendrecvType = STATS.SEND_DIRECTION;\n\n videoSender.common.common.direction = statsResults[mediaType].direction;\n videoSender.common.transportType = statsResults.connectionType.local.transport[0];\n\n // @ts-ignore\n videoSender.common.maxRemoteJitter =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n videoSender.common.meanRemoteJitter =\n mean(statsResults[mediaType][sendrecvType].meanRemoteJitter) * 1000 || 0;\n\n videoSender.common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;\n videoSender.common.availableBitrate =\n statsResults[mediaType][sendrecvType].availableOutgoingBitrate || 0;\n // Calculate based on how much packets lost of received compated to how to the client sent\n\n const totalpacketsLostForaMin =\n statsResults[mediaType][sendrecvType].totalPacketsLostOnReceiver -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsLostOnReceiver;\n\n videoSender.common.remoteLossRate =\n totalpacketsLostForaMin > 0\n ? (totalpacketsLostForaMin * 100) / (videoSender.common.rtpPackets + totalpacketsLostForaMin)\n : 0; // This is the packets sent with in last min || 0;\n\n // @ts-ignore\n videoSender.common.maxRoundTripTime =\n // @ts-ignore\n max(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.meanRoundTripTime =\n mean(statsResults[mediaType][sendrecvType].meanRoundTripTime) * 1000 || 0;\n videoSender.common.roundTripTime = videoSender.common.maxRoundTripTime;\n\n videoSender.streams[0].common.rtpPackets =\n statsResults[mediaType][sendrecvType].totalPacketsSent -\n lastMqaDataSent[mediaType][sendrecvType].totalPacketsSent || 0;\n\n // Calculate the outgoing bitrate\n const totalBytesSentInaMin =\n statsResults[mediaType][sendrecvType].totalBytesSent -\n lastMqaDataSent[mediaType][sendrecvType].totalBytesSent;\n\n videoSender.streams[0].common.transmittedBitrate = totalBytesSentInaMin\n ? (totalBytesSentInaMin * 8) / 60\n : 0;\n\n videoSender.common.rtpBitrate = videoSender.streams[0].common.transmittedBitrate;\n\n videoSender.streams[0].transmittedKeyFrames =\n statsResults[mediaType][sendrecvType].totalKeyFramesEncoded -\n lastMqaDataSent[mediaType][sendrecvType].totalKeyFramesEncoded || 0;\n videoSender.streams[0].requestedKeyFrames =\n statsResults[mediaType][sendrecvType].totalFirCount -\n lastMqaDataSent[mediaType][sendrecvType].totalFirCount || 0;\n\n // From tracks //TODO: calculate a proper one\n const totalFrameSentInaMin =\n statsResults.resolutions[mediaType][sendrecvType].framesSent -\n (lastMqaDataSent.resolutions[mediaType][sendrecvType].framesSent || 0);\n\n videoSender.streams[0].common.transmittedFrameRate = totalFrameSentInaMin\n ? (totalFrameSentInaMin * 100) / 60\n : 0;\n videoSender.streams[0].transmittedHeight =\n statsResults.resolutions[mediaType][sendrecvType].height;\n videoSender.streams[0].transmittedWidth = statsResults.resolutions[mediaType][sendrecvType].width;\n videoSender.streams[0].transmittedFrameSize =\n (statsResults.resolutions[mediaType][sendrecvType].height *\n statsResults.resolutions[mediaType][sendrecvType].width) /\n 254;\n};\n"],"mappings":"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"}