@webex/plugin-meetings 3.0.0-beta.22 → 3.0.0-beta.23

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.
@@ -7,6 +7,7 @@ _Object$defineProperty(exports, "__esModule", {
7
7
  value: true
8
8
  });
9
9
  exports.StatsAnalyzer = exports.EVENTS = void 0;
10
+ var _keys = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/object/keys"));
10
11
  var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
11
12
  var _stringify = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/json/stringify"));
12
13
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/classCallCheck"));
@@ -20,7 +21,7 @@ var _cloneDeep2 = _interopRequireDefault(require("lodash/cloneDeep"));
20
21
  var _internalMediaCore = require("@webex/internal-media-core");
21
22
  var _eventsScope = _interopRequireDefault(require("../common/events/events-scope"));
22
23
  var _constants = require("../constants");
23
- var _config = _interopRequireDefault(require("../mediaQualityMetrics/config"));
24
+ var _config = require("../mediaQualityMetrics/config");
24
25
  var _loggerProxy = _interopRequireDefault(require("../common/logs/logger-proxy"));
25
26
  var _global = _interopRequireDefault(require("./global"));
26
27
  var _mqaUtil = require("./mqaUtil");
@@ -33,6 +34,21 @@ var EVENTS = {
33
34
  REMOTE_MEDIA_STARTED: 'REMOTE_MEDIA_STARTED',
34
35
  REMOTE_MEDIA_STOPPED: 'REMOTE_MEDIA_STOPPED'
35
36
  };
37
+ exports.EVENTS = EVENTS;
38
+ var emptySender = {
39
+ trackLabel: '',
40
+ maxPacketLossRatio: 0,
41
+ availableBandwidth: 0,
42
+ bytesSent: 0,
43
+ meanRemoteJitter: [],
44
+ meanRoundTripTime: []
45
+ };
46
+ var emptyReceiver = {
47
+ availableBandwidth: 0,
48
+ bytesReceived: 0,
49
+ meanRtpJitter: [],
50
+ meanRoundTripTime: []
51
+ };
36
52
 
37
53
  /**
38
54
  * Stats Analyzer class that will emit events based on detected quality
@@ -41,7 +57,6 @@ var EVENTS = {
41
57
  * @class StatsAnalyzer
42
58
  * @extends {EventsScope}
43
59
  */
44
- exports.EVENTS = EVENTS;
45
60
  var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
46
61
  (0, _inherits2.default)(StatsAnalyzer, _EventsScope);
47
62
  var _super = _createSuper(StatsAnalyzer);
@@ -64,7 +79,6 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
64
79
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "lastEmittedStartStopEvent", void 0);
65
80
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "lastMqaDataSent", void 0);
66
81
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "lastStatsResults", void 0);
67
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "localMQEStats", void 0);
68
82
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "meetingMediaStatus", void 0);
69
83
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mqaInterval", void 0);
70
84
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "mqaSentCount", void 0);
@@ -82,6 +96,9 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
82
96
  if (previousValue === undefined) previousValue = 0;
83
97
  // eslint-disable-next-line no-param-reassign
84
98
  if (currentValue === undefined) currentValue = 0;
99
+ if (!_this.lastEmittedStartStopEvent[mediaType]) {
100
+ _this.lastEmittedStartStopEvent[mediaType] = {};
101
+ }
85
102
  var lastEmittedEvent = isLocal ? _this.lastEmittedStartStopEvent[mediaType].local : _this.lastEmittedStartStopEvent[mediaType].remote;
86
103
  var newEvent;
87
104
  if (currentValue - previousValue > 0) {
@@ -163,141 +180,31 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
163
180
  _this.networkQualityMonitor = networkQualityMonitor;
164
181
  _this.correlationId = config.correlationId;
165
182
  _this.mqaSentCount = -1;
166
- _this.lastMqaDataSent = {
167
- resolutions: {
168
- video: {
169
- send: {},
170
- recv: {}
171
- },
172
- audio: {
173
- send: {},
174
- recv: {}
175
- },
176
- share: {
177
- send: {},
178
- recv: {}
179
- }
180
- },
181
- video: {
182
- send: {},
183
- recv: {}
184
- },
185
- audio: {
186
- send: {},
187
- recv: {}
188
- },
189
- share: {
190
- send: {},
191
- recv: {}
192
- }
193
- };
194
- _this.localMQEStats = {
195
- audio: {
196
- RX: {
197
- packetsLost: [],
198
- jitter: [],
199
- latency: [],
200
- bitRate: []
201
- },
202
- TX: {
203
- packetsLost: [],
204
- jitter: [],
205
- latency: [],
206
- bitRate: []
207
- }
208
- },
209
- video: {
210
- RX: {
211
- packetsLost: [],
212
- jitter: [],
213
- latency: [],
214
- bitRate: [],
215
- frameRate: [],
216
- resolutionWidth: [],
217
- resolutionHeight: [],
218
- requestedKeyFrame: [],
219
- receivedKeyFrame: []
220
- },
221
- TX: {
222
- packetsLost: [],
223
- jitter: [],
224
- latency: [],
225
- bitRate: [],
226
- frameRate: [],
227
- resolutionWidth: [],
228
- resolutionHeight: [],
229
- requestedKeyFrame: [],
230
- receivedKeyFrame: []
231
- }
232
- }
233
- };
234
- _this.lastEmittedStartStopEvent = {
235
- audio: {
236
- local: undefined,
237
- remote: undefined
238
- },
239
- video: {
240
- local: undefined,
241
- remote: undefined
242
- },
243
- share: {
244
- local: undefined,
245
- remote: undefined
246
- }
247
- };
183
+ _this.lastMqaDataSent = {};
184
+ _this.lastEmittedStartStopEvent = {};
248
185
  return _this;
249
186
  }
187
+
188
+ /**
189
+ * Resets cumulative stats arrays.
190
+ *
191
+ * @public
192
+ * @memberof StatsAnalyzer
193
+ * @returns {void}
194
+ */
250
195
  (0, _createClass2.default)(StatsAnalyzer, [{
251
- key: "populateResults",
252
- value: function populateResults(lastMqa) {
253
- // Audio
254
-
255
- this.localMQEStats.audio.RX.packetsLost.push(lastMqa.audioReceive[0].common.mediaHopByHopLost);
256
- this.localMQEStats.audio.RX.jitter.push(lastMqa.audioReceive[0].streams[0].common.rtpJitter);
257
- this.localMQEStats.audio.RX.latency.push(lastMqa.audioReceive[0].common.roundTripTime);
258
- this.localMQEStats.audio.RX.bitRate.push(lastMqa.audioReceive[0].streams[0].common.receivedBitrate);
259
- this.localMQEStats.audio.TX.packetsLost.push(lastMqa.audioTransmit[0].common.remoteLossRate);
260
- this.localMQEStats.audio.TX.jitter.push(lastMqa.audioTransmit[0].common.remoteJitter);
261
- this.localMQEStats.audio.TX.latency.push(lastMqa.audioTransmit[0].common.roundTripTime);
262
- this.localMQEStats.audio.TX.bitRate.push(lastMqa.audioTransmit[0].streams[0].common.transmittedBitrate);
263
-
264
- // Video
265
-
266
- this.localMQEStats.video.RX.packetsLost.push(lastMqa.videoReceive[0].common.mediaHopByHopLost);
267
- this.localMQEStats.video.RX.jitter.push(lastMqa.videoReceive[0].streams[0].common.rtpJitter);
268
- this.localMQEStats.video.RX.latency.push(lastMqa.videoReceive[0].streams[0].common.roundTripTime);
269
- this.localMQEStats.video.RX.bitRate.push(lastMqa.videoReceive[0].streams[0].common.receivedBitrate);
270
- this.localMQEStats.video.RX.frameRate.push(lastMqa.videoReceive[0].streams[0].common.receivedFrameRate);
271
- this.localMQEStats.video.RX.resolutionWidth.push(lastMqa.videoReceive[0].streams[0].receivedWidth);
272
- this.localMQEStats.video.RX.resolutionHeight.push(lastMqa.videoReceive[0].streams[0].receivedHeight);
273
- this.localMQEStats.video.RX.requestedKeyFrame.push();
274
- this.localMQEStats.video.RX.receivedKeyFrame.push();
275
- this.localMQEStats.video.TX.packetsLost.push(lastMqa.videoTransmit[0].common.remoteLossRate);
276
- this.localMQEStats.video.TX.jitter.push(lastMqa.videoTransmit[0].common.remoteJitter);
277
- this.localMQEStats.video.TX.latency.push(lastMqa.videoTransmit[0].common.roundTripTime);
278
- this.localMQEStats.video.TX.bitRate.push(lastMqa.videoTransmit[0].streams[0].common.transmittedBitrate);
279
- this.localMQEStats.video.TX.frameRate.push(lastMqa.videoTransmit[0].streams[0].common.transmittedFrameRate);
280
- this.localMQEStats.video.TX.resolutionWidth.push(lastMqa.videoTransmit[0].streams[0].transmittedWidth);
281
- this.localMQEStats.video.TX.resolutionHeight.push(lastMqa.videoTransmit[0].streams[0].transmittedHeight);
282
- this.localMQEStats.video.TX.requestedKeyFrame.push(lastMqa.videoTransmit[0].streams[0].requestedKeyFrames);
283
- this.localMQEStats.video.TX.receivedKeyFrame.push();
284
- }
285
- }, {
286
196
  key: "resetStatsResults",
287
197
  value: function resetStatsResults() {
288
- this.statsResults.audio.send.meanRemoteJitter = [];
289
- this.statsResults.video.send.meanRemoteJitter = [];
290
- this.statsResults.share.send.meanRemoteJitter = [];
291
- this.statsResults.audio.recv.meanRtpJitter = [];
292
-
293
- // TODO: currently no values are present
294
- this.statsResults.video.recv.meanRtpJitter = [];
295
- this.statsResults.share.recv.meanRtpJitter = [];
296
-
297
- // Reset the roundTripTime
298
- this.statsResults.audio.send.meanRoundTripTime = [];
299
- this.statsResults.video.send.meanRoundTripTime = [];
300
- this.statsResults.share.send.meanRoundTripTime = [];
198
+ var _this2 = this;
199
+ (0, _keys.default)(this.statsResults).forEach(function (mediaType) {
200
+ if (mediaType.includes('recv')) {
201
+ _this2.statsResults[mediaType].recv.meanRtpJitter = [];
202
+ }
203
+ if (mediaType.includes('send')) {
204
+ _this2.statsResults[mediaType].send.meanRemoteJitter = [];
205
+ _this2.statsResults[mediaType].send.meanRoundTripTime = [];
206
+ }
207
+ });
301
208
  }
302
209
 
303
210
  /**
@@ -324,80 +231,80 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
324
231
  }, {
325
232
  key: "sendMqaData",
326
233
  value: function sendMqaData() {
327
- var audioReceiver = _config.default.intervals[0].audioReceive[0];
328
- var audioSender = _config.default.intervals[0].audioTransmit[0];
329
- var videoReceiver = _config.default.intervals[0].videoReceive[0];
330
- var videoSender = _config.default.intervals[0].videoTransmit[0];
331
- var shareSender = _config.default.intervals[0].videoTransmit[1];
332
- var shareReceiver = _config.default.intervals[0].videoReceive[1];
333
- (0, _mqaUtil.getAudioSenderMqa)({
334
- audioSender: audioSender,
335
- statsResults: this.statsResults,
336
- lastMqaDataSent: this.lastMqaDataSent
337
- });
338
- (0, _mqaUtil.getAudioReceiverMqa)({
339
- audioReceiver: audioReceiver,
340
- statsResults: this.statsResults,
341
- lastMqaDataSent: this.lastMqaDataSent
342
- });
343
- (0, _mqaUtil.getVideoReceiverMqa)({
344
- videoReceiver: videoReceiver,
345
- statsResults: this.statsResults,
346
- lastMqaDataSent: this.lastMqaDataSent
347
- });
348
- (0, _mqaUtil.getVideoSenderMqa)({
349
- videoSender: videoSender,
350
- statsResults: this.statsResults,
351
- lastMqaDataSent: this.lastMqaDataSent
352
- });
353
-
354
- // Capture mqa for share scenario
355
-
356
- (0, _mqaUtil.getVideoSenderMqa)({
357
- videoSender: shareSender,
358
- statsResults: this.statsResults,
359
- lastMqaDataSent: this.lastMqaDataSent,
360
- isShareStream: true
361
- });
362
- (0, _mqaUtil.getVideoReceiverMqa)({
363
- videoReceiver: shareReceiver,
364
- statsResults: this.statsResults,
365
- lastMqaDataSent: this.lastMqaDataSent,
366
- isShareStream: true
234
+ var _this3 = this;
235
+ var newMqa = (0, _cloneDeep2.default)(_config.emptyMqaInterval);
236
+ (0, _keys.default)(this.statsResults).forEach(function (mediaType) {
237
+ if (mediaType.includes('audio-send') || mediaType.includes('audio-share-send')) {
238
+ var audioSender = (0, _cloneDeep2.default)(_config.emptyAudioTransmit);
239
+ (0, _mqaUtil.getAudioSenderMqa)({
240
+ audioSender: audioSender,
241
+ statsResults: _this3.statsResults,
242
+ lastMqaDataSent: _this3.lastMqaDataSent,
243
+ mediaType: mediaType
244
+ });
245
+ newMqa.audioTransmit.push(audioSender);
246
+ } else if (mediaType.includes('audio-recv') || mediaType.includes('audio-share-recv')) {
247
+ var audioReceiver = (0, _cloneDeep2.default)(_config.emptyAudioReceive);
248
+ (0, _mqaUtil.getAudioReceiverMqa)({
249
+ audioReceiver: audioReceiver,
250
+ statsResults: _this3.statsResults,
251
+ lastMqaDataSent: _this3.lastMqaDataSent,
252
+ mediaType: mediaType
253
+ });
254
+ newMqa.audioReceive.push(audioReceiver);
255
+ } else if (mediaType.includes('video-send') || mediaType.includes('video-share-send')) {
256
+ var videoSender = (0, _cloneDeep2.default)(_config.emptyVideoTransmit);
257
+ (0, _mqaUtil.getVideoSenderMqa)({
258
+ videoSender: videoSender,
259
+ statsResults: _this3.statsResults,
260
+ lastMqaDataSent: _this3.lastMqaDataSent,
261
+ mediaType: mediaType
262
+ });
263
+ newMqa.videoTransmit.push(videoSender);
264
+ } else if (mediaType.includes('video-recv') || mediaType.includes('video-share-recv')) {
265
+ var videoReceiver = (0, _cloneDeep2.default)(_config.emptyVideoReceive);
266
+ (0, _mqaUtil.getVideoReceiverMqa)({
267
+ videoReceiver: videoReceiver,
268
+ statsResults: _this3.statsResults,
269
+ lastMqaDataSent: _this3.lastMqaDataSent,
270
+ mediaType: mediaType
271
+ });
272
+ newMqa.videoReceive.push(videoReceiver);
273
+ }
367
274
  });
368
- _config.default.intervals[0].intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress[0];
275
+ newMqa.intervalMetadata.peerReflexiveIP = this.statsResults.connectionType.local.ipAddress[0];
369
276
 
370
277
  // Adding peripheral information
371
- _config.default.intervals[0].intervalMetadata.peripherals = [];
372
- _config.default.intervals[0].intervalMetadata.peripherals.push({
278
+ newMqa.intervalMetadata.peripherals = [];
279
+ newMqa.intervalMetadata.peripherals.push({
373
280
  information: _constants._UNKNOWN_,
374
281
  name: _constants.MEDIA_DEVICES.SPEAKER
375
282
  });
376
- _config.default.intervals[0].intervalMetadata.peripherals.push({
377
- information: this.statsResults[_constants.STATS.AUDIO_CORRELATE][_constants.STATS.SEND_DIRECTION].trackLabel || _constants._UNKNOWN_,
378
- name: _constants.MEDIA_DEVICES.MICROPHONE
379
- });
380
- _config.default.intervals[0].intervalMetadata.peripherals.push({
381
- information: this.statsResults[_constants.STATS.VIDEO_CORRELATE][_constants.STATS.SEND_DIRECTION].trackLabel || _constants._UNKNOWN_,
382
- name: _constants.MEDIA_DEVICES.CAMERA
383
- });
384
-
385
- // @ts-ignore
386
- _config.default.networkType = this.statsResults.connectionType.local.networkType;
283
+ if (this.statsResults['audio-send']) {
284
+ var _this$statsResults$au;
285
+ newMqa.intervalMetadata.peripherals.push({
286
+ information: (_this$statsResults$au = this.statsResults['audio-send']) === null || _this$statsResults$au === void 0 ? void 0 : _this$statsResults$au.trackLabel,
287
+ name: _constants.MEDIA_DEVICES.MICROPHONE
288
+ });
289
+ }
290
+ if (this.statsResults['video-send']) {
291
+ var _this$statsResults$vi;
292
+ newMqa.intervalMetadata.peripherals.push({
293
+ information: (_this$statsResults$vi = this.statsResults['video-send']) === null || _this$statsResults$vi === void 0 ? void 0 : _this$statsResults$vi.trackLabel,
294
+ name: _constants.MEDIA_DEVICES.CAMERA
295
+ });
296
+ }
297
+ newMqa.networkType = this.statsResults.connectionType.local.networkType;
387
298
  this.mqaSentCount += 1;
388
- _config.default.intervals[0].intervalNumber = this.mqaSentCount;
389
-
390
- // DO Deep copy, for some reason it takes the reference all the time rather then old value set
391
- this.lastMqaDataSent = (0, _cloneDeep2.default)(this.statsResults);
392
- this.populateResults(_config.default.intervals[0]);
299
+ newMqa.intervalNumber = this.mqaSentCount;
393
300
  this.resetStatsResults();
394
301
  this.emit({
395
302
  file: 'statsAnalyzer',
396
303
  function: 'sendMqaData'
397
304
  }, EVENTS.MEDIA_QUALITY, {
398
- data: _config.default.intervals[0],
305
+ data: newMqa,
399
306
  // @ts-ignore
400
- networkType: _config.default.networkType
307
+ networkType: newMqa.networkType
401
308
  });
402
309
  }
403
310
 
@@ -426,18 +333,18 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
426
333
  }, {
427
334
  key: "startAnalyzer",
428
335
  value: function startAnalyzer(mediaConnection) {
429
- var _this2 = this;
336
+ var _this4 = this;
430
337
  if (!this.statsStarted) {
431
338
  this.statsStarted = true;
432
339
  this.mediaConnection = mediaConnection;
433
340
  return this.getStatsAndParse().then(function () {
434
- _this2.statsInterval = setInterval(function () {
435
- _this2.getStatsAndParse();
436
- }, _this2.config.analyzerInterval);
341
+ _this4.statsInterval = setInterval(function () {
342
+ _this4.getStatsAndParse();
343
+ }, _this4.config.analyzerInterval);
437
344
  // Trigger initial fetch
438
- _this2.sendMqaData();
439
- _this2.mqaInterval = setInterval(function () {
440
- _this2.sendMqaData();
345
+ _this4.sendMqaData();
346
+ _this4.mqaInterval = setInterval(function () {
347
+ _this4.sendMqaData();
441
348
  }, _constants.MQA_INTEVAL);
442
349
  });
443
350
  }
@@ -454,7 +361,7 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
454
361
  }, {
455
362
  key: "stopAnalyzer",
456
363
  value: function stopAnalyzer() {
457
- var _this3 = this;
364
+ var _this5 = this;
458
365
  var sendOneLastMqa = this.mqaInterval && this.statsInterval;
459
366
  if (this.statsInterval) {
460
367
  clearInterval(this.statsInterval);
@@ -466,8 +373,8 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
466
373
  }
467
374
  if (sendOneLastMqa) {
468
375
  return this.getStatsAndParse().then(function () {
469
- _this3.sendMqaData();
470
- _this3.mediaConnection = null;
376
+ _this5.sendMqaData();
377
+ _this5.mediaConnection = null;
471
378
  });
472
379
  }
473
380
  this.mediaConnection = null;
@@ -490,6 +397,32 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
490
397
  if (!getStatsResult) {
491
398
  return;
492
399
  }
400
+
401
+ // Generate empty stats results
402
+ if (!this.statsResults[type]) {
403
+ this.statsResults[type] = {};
404
+ }
405
+ if (isSender && !this.statsResults[type].send) {
406
+ this.statsResults[type].send = (0, _cloneDeep2.default)(emptySender);
407
+ } else if (!isSender && !this.statsResults[type].recv) {
408
+ this.statsResults[type].recv = (0, _cloneDeep2.default)(emptyReceiver);
409
+ }
410
+ if (!this.statsResults.resolutions[type]) {
411
+ this.statsResults.resolutions[type] = {};
412
+ }
413
+ if (isSender && !this.statsResults.resolutions[type].send) {
414
+ this.statsResults.resolutions[type].send = (0, _cloneDeep2.default)(emptySender);
415
+ } else if (!isSender && !this.statsResults.resolutions[type].recv) {
416
+ this.statsResults.resolutions[type].recv = (0, _cloneDeep2.default)(emptyReceiver);
417
+ }
418
+ if (!this.statsResults.internal[type]) {
419
+ this.statsResults.internal[type] = {};
420
+ }
421
+ if (isSender && !this.statsResults.internal[type].send) {
422
+ this.statsResults.internal[type].send = (0, _cloneDeep2.default)(emptySender);
423
+ } else if (!isSender && !this.statsResults.internal[type].recv) {
424
+ this.statsResults.internal[type].recv = (0, _cloneDeep2.default)(emptyReceiver);
425
+ }
493
426
  switch (getStatsResult.type) {
494
427
  case 'outbound-rtp':
495
428
  this.processOutboundRTPResult(getStatsResult, type);
@@ -524,21 +457,26 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
524
457
  /**
525
458
  * Filters the get stats results for types
526
459
  * @private
527
- * @param {Array} getStatsResults
460
+ * @param {Array} statsItem
528
461
  * @param {String} type
529
462
  * @param {boolean} isSender
530
463
  * @returns {void}
531
464
  */
532
465
  }, {
533
466
  key: "filterAndParseGetStatsResults",
534
- value: function filterAndParseGetStatsResults(getStatsResults, type, isSender) {
535
- var _this4 = this;
467
+ value: function filterAndParseGetStatsResults(statsItem, type, isSender) {
468
+ var _this6 = this;
536
469
  var types = _constants.DEFAULT_GET_STATS_FILTER.types;
537
- getStatsResults.forEach(function (result) {
470
+ statsItem.report.forEach(function (result) {
538
471
  if (types.includes(result.type)) {
539
- _this4.parseGetStatsResult(result, type, isSender);
472
+ _this6.parseGetStatsResult(result, type, isSender);
540
473
  }
541
474
  });
475
+ if (this.statsResults[type]) {
476
+ this.statsResults[type].direction = statsItem.currentDirection;
477
+ this.statsResults[type].trackLabel = statsItem.localTrackLabel;
478
+ this.statsResults[type].csi = statsItem.csi;
479
+ }
542
480
  }
543
481
 
544
482
  /**
@@ -553,7 +491,7 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
553
491
  if (!result) {
554
492
  return;
555
493
  }
556
- if (type === _constants.STATS.AUDIO_CORRELATE) {
494
+ if (type.includes('audio-send')) {
557
495
  this.statsResults[type].send.audioLevel = result.audioLevel;
558
496
  this.statsResults[type].send.totalAudioEnergy = result.totalAudioEnergy;
559
497
  }
@@ -584,106 +522,145 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
584
522
  * @returns {void}
585
523
  */
586
524
  function compareLastStatsResult() {
525
+ var _this7 = this;
587
526
  if (this.lastStatsResults !== null && this.meetingMediaStatus) {
588
- // compare audio stats sent
589
- var mediaType = _constants.STATS.AUDIO_CORRELATE;
590
- var currentStats = null;
591
- var previousStats = null;
592
- if (this.meetingMediaStatus.expected.sendAudio) {
593
- currentStats = this.statsResults[mediaType].send;
594
- previousStats = this.lastStatsResults[mediaType].send;
527
+ var getCurrentStatsTotals = function getCurrentStatsTotals(keyPrefix, value) {
528
+ return (0, _keys.default)(_this7.statsResults).filter(function (key) {
529
+ return key.startsWith(keyPrefix);
530
+ }).reduce(function (prev, cur) {
531
+ return prev + (_this7.statsResults[cur].recv[value] || 0);
532
+ }, 0);
533
+ };
534
+ var getPreviousStatsTotals = function getPreviousStatsTotals(keyPrefix, value) {
535
+ return (0, _keys.default)(_this7.statsResults).filter(function (key) {
536
+ return key.startsWith(keyPrefix);
537
+ }).reduce(function (prev, cur) {
538
+ return prev + (_this7.lastStatsResults[cur].recv[value] || 0);
539
+ }, 0);
540
+ };
541
+ var getCurrentResolutionsStatsTotals = function getCurrentResolutionsStatsTotals(keyPrefix, value) {
542
+ return (0, _keys.default)(_this7.statsResults).filter(function (key) {
543
+ return key.startsWith(keyPrefix);
544
+ }).reduce(function (prev, cur) {
545
+ return prev + (_this7.statsResults.resolutions[cur].recv[value] || 0);
546
+ }, 0);
547
+ };
548
+ var getPreviousResolutionsStatsTotals = function getPreviousResolutionsStatsTotals(keyPrefix, value) {
549
+ return (0, _keys.default)(_this7.statsResults).filter(function (key) {
550
+ return key.startsWith(keyPrefix);
551
+ }).reduce(function (prev, cur) {
552
+ return prev + (_this7.lastStatsResults.resolutions[cur].recv[value] || 0);
553
+ }, 0);
554
+ };
555
+ if (this.meetingMediaStatus.expected.sendAudio && this.lastStatsResults['audio-send']) {
556
+ // compare audio stats sent
557
+ // NOTE: relies on there being only one sender.
558
+ var currentStats = this.statsResults['audio-send'].send;
559
+ var previousStats = this.lastStatsResults['audio-send'].send;
595
560
  if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
596
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " RTP packets sent"));
561
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets sent");
597
562
  } else {
598
563
  if (currentStats.totalAudioEnergy === previousStats.totalAudioEnergy || currentStats.totalAudioEnergy === 0) {
599
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " Energy present"));
564
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio Energy present");
600
565
  }
601
566
  if (currentStats.audioLevel === 0) {
602
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> ".concat(mediaType, " level is 0 for the user"));
567
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> audio level is 0 for the user");
603
568
  }
604
569
  }
605
- this.emitStartStopEvents(mediaType, previousStats.totalPacketsSent, currentStats.totalPacketsSent, true);
570
+ this.emitStartStopEvents('audio', previousStats.totalPacketsSent, currentStats.totalPacketsSent, true);
606
571
  }
607
572
  if (this.meetingMediaStatus.expected.receiveAudio) {
608
573
  // compare audio stats received
609
- currentStats = this.statsResults[mediaType].recv;
610
- previousStats = this.lastStatsResults[mediaType].recv;
611
- if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsReceived === 0) {
612
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " RTP packets received"));
613
- } else if (currentStats.totalSamplesReceived === previousStats.totalSamplesReceived || currentStats.totalSamplesReceived === 0) {
614
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " samples received"));
574
+ var currentPacketsReceived = getCurrentStatsTotals('audio-recv', 'totalPacketsReceived');
575
+ var previousPacketsReceived = getPreviousStatsTotals('audio-recv', 'totalPacketsReceived');
576
+ var currentSamplesReceived = getCurrentStatsTotals('audio-recv', 'totalSamplesReceived');
577
+ var previousSamplesReceived = getPreviousStatsTotals('audio-recv', 'totalSamplesReceived');
578
+ if (currentPacketsReceived === previousPacketsReceived || currentPacketsReceived === 0) {
579
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio RTP packets received");
580
+ } else if (currentSamplesReceived === previousSamplesReceived || currentSamplesReceived === 0) {
581
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No audio samples received");
615
582
  }
616
- this.emitStartStopEvents(mediaType, previousStats.totalPacketsReceived, currentStats.totalPacketsReceived, false);
583
+ this.emitStartStopEvents('audio', previousPacketsReceived, currentPacketsReceived, false);
617
584
  }
618
- mediaType = _constants.STATS.VIDEO_CORRELATE;
619
- if (this.meetingMediaStatus.expected.sendVideo) {
585
+ if (this.meetingMediaStatus.expected.sendVideo && this.lastStatsResults['video-send']) {
620
586
  // compare video stats sent
621
- currentStats = this.statsResults[mediaType].send;
622
- previousStats = this.lastStatsResults[mediaType].send;
623
- if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
624
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " RTP packets sent"));
587
+ var _currentStats = this.statsResults['video-send'].send;
588
+ var _previousStats = this.lastStatsResults['video-send'].send;
589
+ if (_currentStats.totalPacketsSent === _previousStats.totalPacketsSent || _currentStats.totalPacketsSent === 0) {
590
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets sent");
625
591
  } else {
626
- if (currentStats.framesEncoded === previousStats.framesEncoded || currentStats.framesEncoded === 0) {
627
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " Frames Encoded"));
592
+ if (_currentStats.framesEncoded === _previousStats.framesEncoded || _currentStats.framesEncoded === 0) {
593
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video Frames Encoded");
628
594
  }
629
- if (this.statsResults.resolutions[mediaType].send.framesSent === this.lastStatsResults.resolutions[mediaType].send.framesSent || this.statsResults.resolutions[mediaType].send.framesSent === 0) {
630
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " Frames sent"));
595
+ if (this.statsResults.resolutions['video-send'].send.framesSent === this.lastStatsResults.resolutions['video-send'].send.framesSent || this.statsResults.resolutions['video-send'].send.framesSent === 0) {
596
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video Frames sent");
631
597
  }
632
598
  }
633
- this.emitStartStopEvents(mediaType, previousStats.framesSent, currentStats.framesSent, true);
599
+ this.emitStartStopEvents('video', _previousStats.framesSent, _currentStats.framesSent, true);
634
600
  }
635
601
  if (this.meetingMediaStatus.expected.receiveVideo) {
636
- // compare video stats reveived
637
-
638
- currentStats = this.statsResults[mediaType].recv;
639
- previousStats = this.lastStatsResults[mediaType].recv;
640
- if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsReceived === 0) {
641
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " RTP packets received"));
602
+ // compare video stats received
603
+ var _currentPacketsReceived = getCurrentStatsTotals('video-recv', 'totalPacketsReceived');
604
+ var _previousPacketsReceived = getPreviousStatsTotals('video-recv', 'totalPacketsReceived');
605
+ var currentFramesReceived = getCurrentResolutionsStatsTotals('video-recv', 'framesReceived');
606
+ var previousFramesReceived = getPreviousResolutionsStatsTotals('video-recv', 'framesReceived');
607
+ var currentFramesDecoded = getCurrentStatsTotals('video-recv', 'framesDecoded');
608
+ var previousFramesDecoded = getPreviousStatsTotals('video-recv', 'framesDecoded');
609
+ var currentFramesDropped = getCurrentResolutionsStatsTotals('video-recv', 'framesDropped');
610
+ var previousFramesDropped = getPreviousResolutionsStatsTotals('video-recv', 'framesDropped');
611
+ if (_currentPacketsReceived === _previousPacketsReceived || _currentPacketsReceived === 0) {
612
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video RTP packets received");
642
613
  } else {
643
- if (this.statsResults.resolutions[mediaType].recv.framesReceived === this.lastStatsResults.resolutions[mediaType].recv.framesReceived || this.statsResults.resolutions[mediaType].recv.framesReceived === 0) {
644
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " frames received"));
614
+ if (currentFramesReceived === previousFramesReceived || currentFramesReceived === 0) {
615
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video frames received");
645
616
  }
646
- if (this.statsResults[mediaType].recv.framesDecoded === this.lastStatsResults[mediaType].recv.framesDecoded || this.statsResults.resolutions[mediaType].send.framesDecoded === 0) {
647
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " frames decoded"));
617
+ if (currentFramesDecoded === previousFramesDecoded || currentFramesDecoded === 0) {
618
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No video frames decoded");
648
619
  }
649
- if (this.statsResults.resolutions[mediaType].recv.framesDropped - this.lastStatsResults.resolutions[mediaType].recv.framesDropped > 10) {
650
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> ".concat(mediaType, " frames are getting dropped"));
620
+ if (currentFramesDropped - previousFramesDropped > 10) {
621
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> video frames are getting dropped");
651
622
  }
652
623
  }
653
- this.emitStartStopEvents(mediaType, previousStats.framesDecoded, currentStats.framesDecoded, false);
624
+ this.emitStartStopEvents('video', previousFramesDecoded, currentFramesDecoded, false);
654
625
  }
655
- mediaType = _constants.STATS.SHARE_CORRELATE;
656
- if (this.meetingMediaStatus.expected.sendShare) {
626
+ if (this.meetingMediaStatus.expected.sendShare && this.lastStatsResults['video-share-send']) {
657
627
  // compare share stats sent
658
628
 
659
- currentStats = this.statsResults[mediaType].send;
660
- previousStats = this.lastStatsResults[mediaType].send;
661
- if (currentStats.totalPacketsSent === previousStats.totalPacketsSent || currentStats.totalPacketsSent === 0) {
662
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " RTP packets sent"));
629
+ var _currentStats2 = this.statsResults['video-share-send'].send;
630
+ var _previousStats2 = this.lastStatsResults['video-share-send'].send;
631
+ if (_currentStats2.totalPacketsSent === _previousStats2.totalPacketsSent || _currentStats2.totalPacketsSent === 0) {
632
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets sent");
663
633
  } else {
664
- if (currentStats.framesEncoded === previousStats.framesEncoded || currentStats.framesEncoded === 0) {
665
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " frames getting encoded"));
634
+ if (_currentStats2.framesEncoded === _previousStats2.framesEncoded || _currentStats2.framesEncoded === 0) {
635
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames getting encoded");
666
636
  }
667
- if (this.statsResults.resolutions[mediaType].send.framesSent === this.lastStatsResults.resolutions[mediaType].send.framesSent || this.statsResults.resolutions[mediaType].send.framesSent === 0) {
668
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " frames sent"));
637
+ if (this.statsResults.resolutions['video-share-send'].send.framesSent === this.lastStatsResults.resolutions['video-share-send'].send.framesSent || this.statsResults.resolutions['video-share-send'].send.framesSent === 0) {
638
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames sent");
669
639
  }
670
640
  }
671
-
641
+ }
642
+ if (this.meetingMediaStatus.expected.sendShare) {
672
643
  // TODO:need to check receive share value
673
- // compare share stats reveived
674
- currentStats = this.statsResults[mediaType].recv;
675
- previousStats = this.lastStatsResults[mediaType].recv;
676
- if (currentStats.totalPacketsReceived === previousStats.totalPacketsReceived || currentStats.totalPacketsSent === 0) {
677
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " RTP packets received"));
644
+ // compare share stats received
645
+ var _currentPacketsReceived2 = getCurrentStatsTotals('video-share-recv', 'totalPacketsReceived');
646
+ var _previousPacketsReceived2 = getPreviousStatsTotals('video-share-recv', 'totalPacketsReceived');
647
+ var _currentFramesReceived = getCurrentResolutionsStatsTotals('video-share-recv', 'framesReceived');
648
+ var _previousFramesReceived = getPreviousResolutionsStatsTotals('video-share-recv', 'framesReceived');
649
+ var _currentFramesDecoded = getCurrentStatsTotals('video-share-recv', 'framesDecoded');
650
+ var _previousFramesDecoded = getPreviousStatsTotals('video-share-recv', 'framesDecoded');
651
+ var _currentFramesDropped = getCurrentResolutionsStatsTotals('video-share-recv', 'framesDropped');
652
+ var _previousFramesDropped = getPreviousResolutionsStatsTotals('video-share-recv', 'framesDropped');
653
+ if (_currentPacketsReceived2 === _previousPacketsReceived2 || _currentPacketsReceived2 === 0) {
654
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share RTP packets received");
678
655
  } else {
679
- if (this.statsResults.resolutions[mediaType].recv.framesReceived === this.lastStatsResults.resolutions[mediaType].recv.framesReceived || this.statsResults.resolutions[mediaType].recv.framesReceived === 0) {
680
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " frames received"));
656
+ if (_currentFramesReceived === _previousFramesReceived || _currentFramesReceived === 0) {
657
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames received");
681
658
  }
682
- if (this.statsResults[mediaType].recv.framesDecoded === this.lastStatsResults[mediaType].recv.framesDecoded || this.statsResults.resolutions[mediaType].send.framesDecoded === 0) {
683
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No ".concat(mediaType, " frames decoded"));
659
+ if (_currentFramesDecoded === _previousFramesDecoded || _currentFramesDecoded === 0) {
660
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> No share frames decoded");
684
661
  }
685
- if (this.statsResults.resolutions[mediaType].recv.framesDropped - this.lastStatsResults.resolutions[mediaType].recv.framesDropped > 10) {
686
- _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> ".concat(mediaType, " frames are getting dropped"));
662
+ if (_currentFramesDropped - _previousFramesDropped > 10) {
663
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#compareLastStatsResult --> share frames are getting dropped");
687
664
  }
688
665
  }
689
666
 
@@ -704,7 +681,7 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
704
681
  }, {
705
682
  key: "getStatsAndParse",
706
683
  value: function getStatsAndParse() {
707
- var _this5 = this;
684
+ var _this8 = this;
708
685
  if (!this.mediaConnection) {
709
686
  return _promise.default.resolve();
710
687
  }
@@ -714,24 +691,47 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
714
691
  }
715
692
  _loggerProxy.default.logger.trace('StatsAnalyzer:index#getStatsAndParse --> Collecting Stats');
716
693
  return this.mediaConnection.getTransceiverStats().then(function (transceiverStats) {
717
- _this5.filterAndParseGetStatsResults(transceiverStats.video.sender, _constants.STATS.VIDEO_CORRELATE, true);
718
- _this5.filterAndParseGetStatsResults(transceiverStats.video.receiver, _constants.STATS.VIDEO_CORRELATE, false);
719
- _this5.filterAndParseGetStatsResults(transceiverStats.audio.sender, _constants.STATS.AUDIO_CORRELATE, true);
720
- _this5.filterAndParseGetStatsResults(transceiverStats.audio.receiver, _constants.STATS.AUDIO_CORRELATE, false);
721
- _this5.filterAndParseGetStatsResults(transceiverStats.screenShareVideo.sender, _constants.STATS.SHARE_CORRELATE, true);
722
- _this5.filterAndParseGetStatsResults(transceiverStats.screenShareVideo.receiver, _constants.STATS.SHARE_CORRELATE, false);
723
-
724
- // updates the current direction of media
725
- _this5.statsResults[_constants.STATS.AUDIO_CORRELATE].direction = transceiverStats.audio.currentDirection;
726
- _this5.statsResults[_constants.STATS.VIDEO_CORRELATE].direction = transceiverStats.video.currentDirection;
727
- _this5.statsResults[_constants.STATS.SHARE_CORRELATE].direction = transceiverStats.screenShareVideo.currentDirection;
728
- _this5.statsResults[_constants.STATS.AUDIO_CORRELATE][_constants.STATS.SEND_DIRECTION].trackLabel = transceiverStats.audio.localTrackLabel;
729
- _this5.statsResults[_constants.STATS.VIDEO_CORRELATE][_constants.STATS.SEND_DIRECTION].trackLabel = transceiverStats.video.localTrackLabel;
730
- _this5.compareLastStatsResult();
694
+ transceiverStats.video.receivers.forEach(function (receiver, i) {
695
+ return _this8.filterAndParseGetStatsResults(receiver, "video-recv-".concat(i), false);
696
+ });
697
+ transceiverStats.audio.receivers.forEach(function (receiver, i) {
698
+ return _this8.filterAndParseGetStatsResults(receiver, "audio-recv-".concat(i), false);
699
+ });
700
+ transceiverStats.screenShareVideo.receivers.forEach(function (receiver, i) {
701
+ return _this8.filterAndParseGetStatsResults(receiver, "video-share-recv-".concat(i), false);
702
+ });
703
+ transceiverStats.screenShareAudio.receivers.forEach(function (receiver, i) {
704
+ return _this8.filterAndParseGetStatsResults(receiver, "audio-share-recv-".concat(i), false);
705
+ });
706
+ transceiverStats.video.senders.forEach(function (sender, i) {
707
+ if (i > 0) {
708
+ throw new Error('Stats Analyzer does not support multiple senders.');
709
+ }
710
+ _this8.filterAndParseGetStatsResults(sender, 'video-send', true);
711
+ });
712
+ transceiverStats.audio.senders.forEach(function (sender, i) {
713
+ if (i > 0) {
714
+ throw new Error('Stats Analyzer does not support multiple senders.');
715
+ }
716
+ _this8.filterAndParseGetStatsResults(sender, 'audio-send', true);
717
+ });
718
+ transceiverStats.screenShareVideo.senders.forEach(function (sender, i) {
719
+ if (i > 0) {
720
+ throw new Error('Stats Analyzer does not support multiple senders.');
721
+ }
722
+ _this8.filterAndParseGetStatsResults(sender, 'video-share-send', true);
723
+ });
724
+ transceiverStats.screenShareAudio.senders.forEach(function (sender, i) {
725
+ if (i > 0) {
726
+ throw new Error('Stats Analyzer does not support multiple senders.');
727
+ }
728
+ _this8.filterAndParseGetStatsResults(sender, 'audio-share-send', true);
729
+ });
730
+ _this8.compareLastStatsResult();
731
731
 
732
732
  // Save the last results to compare with the current
733
733
  // DO Deep copy, for some reason it takes the reference all the time rather then old value set
734
- _this5.lastStatsResults = JSON.parse((0, _stringify.default)(_this5.statsResults));
734
+ _this8.lastStatsResults = JSON.parse((0, _stringify.default)(_this8.statsResults));
735
735
  _loggerProxy.default.logger.trace('StatsAnalyzer:index#getStatsAndParse --> Finished Collecting Stats');
736
736
  });
737
737
  }
@@ -740,13 +740,12 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
740
740
  * Processes OutboundRTP stats result and stores
741
741
  * @private
742
742
  * @param {*} result
743
- * @param {*} type
743
+ * @param {*} mediaType
744
744
  * @returns {void}
745
745
  */
746
746
  }, {
747
747
  key: "processOutboundRTPResult",
748
- value: function processOutboundRTPResult(result, type) {
749
- var mediaType = type || _constants.STATS.AUDIO_CORRELATE;
748
+ value: function processOutboundRTPResult(result, mediaType) {
750
749
  var sendrecvType = _constants.STATS.SEND_DIRECTION;
751
750
  if (result.bytesSent) {
752
751
  var kilobytes = 0;
@@ -796,13 +795,12 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
796
795
  * Processes InboundRTP stats result and stores
797
796
  * @private
798
797
  * @param {*} result
799
- * @param {*} type
798
+ * @param {*} mediaType
800
799
  * @returns {void}
801
800
  */
802
801
  }, {
803
802
  key: "processInboundRTPResult",
804
- value: function processInboundRTPResult(result, type) {
805
- var mediaType = type || _constants.STATS.AUDIO_CORRELATE;
803
+ value: function processInboundRTPResult(result, mediaType) {
806
804
  var sendrecvType = _constants.STATS.RECEIVE_DIRECTION;
807
805
  if (result.bytesReceived) {
808
806
  var kilobytes = 0;
@@ -901,7 +899,6 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
901
899
  if (!result || result.type !== 'track') {
902
900
  return;
903
901
  }
904
- if (result.type !== 'track') return;
905
902
  var sendrecvType = result.remoteSource === true ? _constants.STATS.RECEIVE_DIRECTION : _constants.STATS.SEND_DIRECTION;
906
903
  if (result.frameWidth && result.frameHeight) {
907
904
  this.statsResults.resolutions[mediaType][sendrecvType].width = result.frameWidth;
@@ -914,7 +911,7 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
914
911
  this.statsResults.resolutions[mediaType][sendrecvType].framesDecoded = result.framesDecoded;
915
912
  this.statsResults.resolutions[mediaType][sendrecvType].framesDropped = result.framesDropped;
916
913
  }
917
- if (result.trackIdentifier && mediaType !== _constants.STATS.AUDIO_CORRELATE) {
914
+ if (result.trackIdentifier && !mediaType.includes('audio')) {
918
915
  this.statsResults.resolutions[mediaType][sendrecvType].trackIdentifier = result.trackIdentifier;
919
916
  var jitterBufferDelay = result && result.jitterBufferDelay;
920
917
  var jitterBufferEmittedCount = result && result.jitterBufferEmittedCount;
@@ -937,7 +934,8 @@ var StatsAnalyzer = /*#__PURE__*/function (_EventsScope) {
937
934
  }, {
938
935
  key: "compareSentAndReceived",
939
936
  value: function compareSentAndReceived(result, type) {
940
- if (!type) {
937
+ // Don't compare on transceivers without a sender.
938
+ if (!type || !this.statsResults.internal[type].send) {
941
939
  return;
942
940
  }
943
941
  var mediaType = type;