@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.
- package/dist/config.js +1 -1
- package/dist/config.js.map +1 -1
- package/dist/constants.js +2 -1
- package/dist/constants.js.map +1 -1
- package/dist/locus-info/index.js +24 -0
- package/dist/locus-info/index.js.map +1 -1
- package/dist/locus-info/parser.js +1 -0
- package/dist/locus-info/parser.js.map +1 -1
- package/dist/media/properties.js.map +1 -1
- package/dist/meeting/index.js +405 -352
- package/dist/meeting/index.js.map +1 -1
- package/dist/meeting/muteState.js +13 -0
- package/dist/meeting/muteState.js.map +1 -1
- package/dist/meeting/request.js +0 -27
- package/dist/meeting/request.js.map +1 -1
- package/dist/meeting/util.js +0 -56
- package/dist/meeting/util.js.map +1 -1
- package/dist/meeting-info/meeting-info-v2.js +2 -0
- package/dist/meeting-info/meeting-info-v2.js.map +1 -1
- package/dist/meetings/index.js +27 -17
- package/dist/meetings/index.js.map +1 -1
- package/dist/meetings/request.js +14 -12
- package/dist/meetings/request.js.map +1 -1
- package/dist/member/util.js +3 -1
- package/dist/member/util.js.map +1 -1
- package/dist/members/request.js +3 -1
- package/dist/members/request.js.map +1 -1
- package/dist/reachability/index.js +4 -4
- package/dist/reachability/index.js.map +1 -1
- package/dist/reactions/reactions.type.js +1 -0
- package/dist/reactions/reactions.type.js.map +1 -1
- package/dist/recording-controller/enums.js +17 -0
- package/dist/recording-controller/enums.js.map +1 -0
- package/dist/recording-controller/index.js +343 -0
- package/dist/recording-controller/index.js.map +1 -0
- package/dist/recording-controller/util.js +63 -0
- package/dist/recording-controller/util.js.map +1 -0
- package/dist/roap/index.js +16 -10
- package/dist/roap/index.js.map +1 -1
- package/dist/roap/turnDiscovery.js +6 -4
- package/dist/roap/turnDiscovery.js.map +1 -1
- package/dist/statsAnalyzer/mqaUtil.js +18 -6
- package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
- package/package.json +23 -18
- package/src/config.ts +1 -1
- package/src/constants.ts +1 -0
- package/src/locus-info/index.ts +24 -0
- package/src/locus-info/parser.ts +1 -0
- package/src/media/properties.ts +1 -1
- package/src/meeting/index.ts +121 -70
- package/src/meeting/muteState.ts +11 -0
- package/src/meeting/request.ts +0 -31
- package/src/meeting/util.ts +0 -60
- package/src/meeting-info/meeting-info-v2.ts +2 -0
- package/src/meetings/index.ts +8 -3
- package/src/meetings/request.ts +1 -1
- package/src/member/util.ts +2 -1
- package/src/members/request.ts +1 -0
- package/src/reachability/index.ts +2 -1
- package/src/reactions/reactions.type.ts +2 -1
- package/src/recording-controller/enums.ts +8 -0
- package/src/recording-controller/index.ts +315 -0
- package/src/recording-controller/util.ts +58 -0
- package/src/roap/index.ts +8 -8
- package/src/roap/turnDiscovery.ts +5 -5
- package/src/statsAnalyzer/mqaUtil.ts +6 -0
- package/test/integration/spec/journey.js +1 -1
- package/test/integration/spec/space-meeting.js +1 -1
- package/test/integration/spec/transcription.js +1 -1
- package/test/unit/spec/meeting/index.js +33 -6
- package/test/unit/spec/meeting/muteState.js +11 -0
- package/test/unit/spec/meeting/utils.js +0 -127
- package/test/unit/spec/recording-controller/index.js +231 -0
- package/test/unit/spec/recording-controller/util.js +102 -0
- package/test/unit/spec/roap/index.ts +10 -5
- package/test/unit/spec/roap/turnDiscovery.ts +13 -8
- 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"}
|
package/dist/roap/index.js
CHANGED
|
@@ -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:
|
|
96
|
-
videoMuted:
|
|
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.
|
|
227
|
-
videoMuted: meeting.
|
|
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
|
|
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:
|
|
275
|
-
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
|
|
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.
|
|
346
|
-
videoMuted: meeting.
|
|
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,
|
package/dist/roap/index.js.map
CHANGED
|
@@ -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.
|
|
153
|
-
videoMuted: meeting.
|
|
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.
|
|
187
|
-
videoMuted: meeting.
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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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"}
|