@webex/plugin-meetings 2.60.1-next.13 → 2.60.1-next.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/breakouts/breakout.js +1 -1
  2. package/dist/breakouts/index.js +1 -1
  3. package/dist/interpretation/index.js +1 -1
  4. package/dist/interpretation/siLanguage.js +1 -1
  5. package/dist/mediaQualityMetrics/config.d.ts +103 -99
  6. package/dist/mediaQualityMetrics/config.js +133 -129
  7. package/dist/mediaQualityMetrics/config.js.map +1 -1
  8. package/dist/meeting/index.js +4 -2
  9. package/dist/meeting/index.js.map +1 -1
  10. package/dist/meeting/request.d.ts +2 -0
  11. package/dist/meeting/request.js +4 -0
  12. package/dist/meeting/request.js.map +1 -1
  13. package/dist/meetings/index.js +19 -0
  14. package/dist/meetings/index.js.map +1 -1
  15. package/dist/meetings/util.js +1 -1
  16. package/dist/meetings/util.js.map +1 -1
  17. package/dist/metrics/constants.d.ts +2 -0
  18. package/dist/metrics/constants.js +3 -1
  19. package/dist/metrics/constants.js.map +1 -1
  20. package/dist/reachability/index.js +14 -20
  21. package/dist/reachability/index.js.map +1 -1
  22. package/dist/reconnection-manager/index.js +63 -43
  23. package/dist/reconnection-manager/index.js.map +1 -1
  24. package/dist/roap/turnDiscovery.d.ts +18 -2
  25. package/dist/roap/turnDiscovery.js +163 -69
  26. package/dist/roap/turnDiscovery.js.map +1 -1
  27. package/dist/rtcMetrics/index.d.ts +7 -0
  28. package/dist/rtcMetrics/index.js +38 -1
  29. package/dist/rtcMetrics/index.js.map +1 -1
  30. package/dist/statsAnalyzer/index.js +135 -23
  31. package/dist/statsAnalyzer/index.js.map +1 -1
  32. package/dist/statsAnalyzer/mqaUtil.d.ts +28 -4
  33. package/dist/statsAnalyzer/mqaUtil.js +278 -148
  34. package/dist/statsAnalyzer/mqaUtil.js.map +1 -1
  35. package/dist/webinar/index.js +1 -1
  36. package/package.json +21 -21
  37. package/src/mediaQualityMetrics/config.ts +107 -107
  38. package/src/meeting/index.ts +2 -0
  39. package/src/meeting/request.ts +6 -0
  40. package/src/meetings/index.ts +22 -0
  41. package/src/meetings/util.ts +1 -1
  42. package/src/metrics/constants.ts +2 -0
  43. package/src/reachability/index.ts +0 -6
  44. package/src/reconnection-manager/index.ts +18 -7
  45. package/src/roap/turnDiscovery.ts +100 -24
  46. package/src/rtcMetrics/index.ts +43 -1
  47. package/src/statsAnalyzer/index.ts +158 -24
  48. package/src/statsAnalyzer/mqaUtil.ts +302 -154
  49. package/test/unit/spec/meeting/index.js +46 -0
  50. package/test/unit/spec/meeting/request.js +2 -0
  51. package/test/unit/spec/meetings/utils.js +35 -8
  52. package/test/unit/spec/reachability/index.ts +74 -0
  53. package/test/unit/spec/reconnection-manager/index.js +36 -1
  54. package/test/unit/spec/roap/turnDiscovery.ts +326 -76
  55. package/test/unit/spec/rtcMetrics/index.ts +32 -3
  56. package/test/unit/spec/stats-analyzer/index.js +439 -1
  57. package/test/utils/webex-test-users.js +12 -4
@@ -1 +1 @@
1
- {"version":3,"names":["_internalPluginMetrics","require","_constants","_interopRequireDefault","RtcMetrics","exports","default","webex","meetingId","correlationId","_classCallCheck2","_defineProperty2","intervalId","window","setInterval","sendMetricsInQueue","bind","setTimeout","_createClass2","key","value","metricsQueue","length","sendMetrics","addMetrics","data","payload","name","map","anonymizeIp","push","closeMetrics","clearInterval","stats","JSON","parse","type","ip","CallDiagnosticUtils","anonymizeIPAddress","undefined","address","relatedAddress","_stringify","request","method","service","resource","headers","appId","RTC_METRICS","APP_ID","body","metrics","version","userId","internal","device"],"sources":["index.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\nimport {CallDiagnosticUtils} from '@webex/internal-plugin-metrics';\nimport RTC_METRICS from './constants';\n\n/**\n * Rtc Metrics\n */\nexport default class RtcMetrics {\n /**\n * Array of MetricData items to be sent to the metrics service.\n */\n metricsQueue = [];\n\n intervalId: number;\n\n webex: any;\n\n meetingId: string;\n\n correlationId: string;\n\n /**\n * Initialize the interval.\n *\n * @param {object} webex - The main `webex` object.\n * @param {string} meetingId - The meeting id.\n * @param {string} correlationId - The correlation id.\n */\n constructor(webex, meetingId, correlationId) {\n // `window` is used to prevent typescript from returning a NodeJS.Timer.\n this.intervalId = window.setInterval(this.sendMetricsInQueue.bind(this), 30 * 1000);\n this.meetingId = meetingId;\n this.webex = webex;\n this.correlationId = correlationId;\n // Send the first set of metrics at 5 seconds in the case of a user leaving the call shortly after joining.\n setTimeout(this.sendMetricsInQueue.bind(this), 5 * 1000);\n }\n\n /**\n * Check to see if the metrics queue has any items.\n *\n * @returns {void}\n */\n public sendMetricsInQueue() {\n if (this.metricsQueue.length) {\n this.sendMetrics();\n this.metricsQueue = [];\n }\n }\n\n /**\n * Add metrics items to the metrics queue.\n *\n * @param {object} data - An object with a payload array of metrics items.\n *\n * @returns {void}\n */\n addMetrics(data) {\n if (data.payload.length) {\n if (data.name === 'stats-report') {\n data.payload = data.payload.map(this.anonymizeIp);\n }\n this.metricsQueue.push(data);\n }\n }\n\n /**\n * Clear the metrics interval.\n *\n * @returns {void}\n */\n closeMetrics() {\n this.sendMetricsInQueue();\n clearInterval(this.intervalId);\n }\n\n /**\n * Anonymize IP addresses.\n *\n * @param {array} stats - An RTCStatsReport organized into an array of strings.\n * @returns {string}\n */\n anonymizeIp(stats: string): string {\n const data = JSON.parse(stats);\n // on local and remote candidates, anonymize the last 4 bits.\n if (data.type === 'local-candidate' || data.type === 'remote-candidate') {\n data.ip = CallDiagnosticUtils.anonymizeIPAddress(data.ip) || undefined;\n data.address = CallDiagnosticUtils.anonymizeIPAddress(data.address) || undefined;\n data.relatedAddress =\n CallDiagnosticUtils.anonymizeIPAddress(data.relatedAddress) || undefined;\n }\n\n return JSON.stringify(data);\n }\n\n /**\n * Send metrics to the metrics service.\n *\n * @returns {void}\n */\n private sendMetrics() {\n this.webex.request({\n method: 'POST',\n service: 'unifiedTelemetry',\n resource: 'metric/v2',\n headers: {\n type: 'webrtcMedia',\n appId: RTC_METRICS.APP_ID,\n },\n body: {\n metrics: [\n {\n type: 'webrtc',\n version: '1.0.1',\n userId: this.webex.internal.device.userId,\n meetingId: this.meetingId,\n correlationId: this.correlationId,\n data: this.metricsQueue,\n },\n ],\n },\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["_internalPluginMetrics","require","_uuid","_interopRequireDefault","_constants","parseJsonPayload","payload","JSON","parse","_","RtcMetrics","exports","default","webex","meetingId","correlationId","_classCallCheck2","_defineProperty2","intervalId","window","setInterval","sendMetricsInQueue","bind","setNewConnectionId","setTimeout","_createClass2","key","value","metricsQueue","length","sendMetrics","addMetrics","data","name","map","anonymizeIp","push","parsedPayload","e","console","error","closeMetrics","clearInterval","stats","type","ip","CallDiagnosticUtils","anonymizeIPAddress","undefined","address","relatedAddress","_stringify","connectionId","uuid","v4","request","method","service","resource","headers","appId","RTC_METRICS","APP_ID","body","metrics","version","userId","internal","device"],"sources":["index.ts"],"sourcesContent":["/* eslint-disable class-methods-use-this */\nimport {CallDiagnosticUtils} from '@webex/internal-plugin-metrics';\nimport uuid from 'uuid';\nimport RTC_METRICS from './constants';\n\nconst parseJsonPayload = (payload: any[]): any | null => {\n try {\n if (payload && payload[0]) {\n return JSON.parse(payload[0]);\n }\n\n return null;\n } catch (_) {\n return null;\n }\n};\n\n/**\n * Rtc Metrics\n */\nexport default class RtcMetrics {\n /**\n * Array of MetricData items to be sent to the metrics service.\n */\n metricsQueue = [];\n\n intervalId: number;\n\n webex: any;\n\n meetingId: string;\n\n correlationId: string;\n\n connectionId: string;\n\n /**\n * Initialize the interval.\n *\n * @param {object} webex - The main `webex` object.\n * @param {string} meetingId - The meeting id.\n * @param {string} correlationId - The correlation id.\n */\n constructor(webex, meetingId, correlationId) {\n // `window` is used to prevent typescript from returning a NodeJS.Timer.\n this.intervalId = window.setInterval(this.sendMetricsInQueue.bind(this), 30 * 1000);\n this.meetingId = meetingId;\n this.webex = webex;\n this.correlationId = correlationId;\n this.setNewConnectionId();\n // Send the first set of metrics at 5 seconds in the case of a user leaving the call shortly after joining.\n setTimeout(this.sendMetricsInQueue.bind(this), 5 * 1000);\n }\n\n /**\n * Check to see if the metrics queue has any items.\n *\n * @returns {void}\n */\n public sendMetricsInQueue() {\n if (this.metricsQueue.length) {\n this.sendMetrics();\n this.metricsQueue = [];\n }\n }\n\n /**\n * Add metrics items to the metrics queue.\n *\n * @param {object} data - An object with a payload array of metrics items.\n *\n * @returns {void}\n */\n addMetrics(data) {\n if (data.payload.length) {\n if (data.name === 'stats-report') {\n data.payload = data.payload.map(this.anonymizeIp);\n }\n\n this.metricsQueue.push(data);\n\n try {\n // If a connection fails, send the rest of the metrics in queue and get a new connection id.\n const parsedPayload = parseJsonPayload(data.payload);\n if (\n data.name === 'onconnectionstatechange' &&\n parsedPayload &&\n parsedPayload.value === 'failed'\n ) {\n this.sendMetricsInQueue();\n this.setNewConnectionId();\n }\n } catch (e) {\n console.error(e);\n }\n }\n }\n\n /**\n * Clear the metrics interval.\n *\n * @returns {void}\n */\n closeMetrics() {\n this.sendMetricsInQueue();\n clearInterval(this.intervalId);\n }\n\n /**\n * Anonymize IP addresses.\n *\n * @param {array} stats - An RTCStatsReport organized into an array of strings.\n * @returns {string}\n */\n anonymizeIp(stats: string): string {\n const data = JSON.parse(stats);\n // on local and remote candidates, anonymize the last 4 bits.\n if (data.type === 'local-candidate' || data.type === 'remote-candidate') {\n data.ip = CallDiagnosticUtils.anonymizeIPAddress(data.ip) || undefined;\n data.address = CallDiagnosticUtils.anonymizeIPAddress(data.address) || undefined;\n data.relatedAddress =\n CallDiagnosticUtils.anonymizeIPAddress(data.relatedAddress) || undefined;\n }\n\n return JSON.stringify(data);\n }\n\n /**\n * Set a new connection id.\n *\n * @returns {void}\n */\n private setNewConnectionId() {\n this.connectionId = uuid.v4();\n }\n\n /**\n * Send metrics to the metrics service.\n *\n * @returns {void}\n */\n private sendMetrics() {\n this.webex.request({\n method: 'POST',\n service: 'unifiedTelemetry',\n resource: 'metric/v2',\n headers: {\n type: 'webrtcMedia',\n appId: RTC_METRICS.APP_ID,\n },\n body: {\n metrics: [\n {\n type: 'webrtc',\n version: '1.1.0',\n userId: this.webex.internal.device.userId,\n meetingId: this.meetingId,\n correlationId: this.correlationId,\n connectionId: this.connectionId,\n data: this.metricsQueue,\n },\n ],\n },\n });\n }\n}\n"],"mappings":"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"}
@@ -295,6 +295,8 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
295
295
  value: function sendMqaData() {
296
296
  var _this3 = this;
297
297
  var newMqa = (0, _lodash.cloneDeep)(_config.emptyMqaInterval);
298
+
299
+ // Fill in empty stats items for lastMqaDataSent
298
300
  (0, _keys.default)(this.statsResults).forEach(function (mediaType) {
299
301
  if (!_this3.lastMqaDataSent[mediaType]) {
300
302
  _this3.lastMqaDataSent[mediaType] = {};
@@ -305,45 +307,155 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
305
307
  if (!_this3.lastMqaDataSent[mediaType].recv && mediaType.includes('-recv')) {
306
308
  _this3.lastMqaDataSent[mediaType].recv = {};
307
309
  }
308
- if (mediaType.includes('audio-send') || mediaType.includes('audio-share-send')) {
309
- var audioSender = (0, _lodash.cloneDeep)(_config.emptyAudioTransmit);
310
- (0, _mqaUtil.getAudioSenderMqa)({
311
- audioSender: audioSender,
310
+ });
311
+
312
+ // Create stats the first level, totals for senders and receivers
313
+ var audioSender = (0, _lodash.cloneDeep)(_config.emptyAudioTransmit);
314
+ var audioShareSender = (0, _lodash.cloneDeep)(_config.emptyAudioTransmit);
315
+ var audioReceiver = (0, _lodash.cloneDeep)(_config.emptyAudioReceive);
316
+ var audioShareReceiver = (0, _lodash.cloneDeep)(_config.emptyAudioReceive);
317
+ var videoSender = (0, _lodash.cloneDeep)(_config.emptyVideoTransmit);
318
+ var videoShareSender = (0, _lodash.cloneDeep)(_config.emptyVideoTransmit);
319
+ var videoReceiver = (0, _lodash.cloneDeep)(_config.emptyVideoReceive);
320
+ var videoShareReceiver = (0, _lodash.cloneDeep)(_config.emptyVideoReceive);
321
+ (0, _mqaUtil.getAudioSenderMqa)({
322
+ audioSender: audioSender,
323
+ statsResults: this.statsResults,
324
+ lastMqaDataSent: this.lastMqaDataSent,
325
+ baseMediaType: 'audio-send'
326
+ });
327
+ newMqa.audioTransmit.push(audioSender);
328
+ (0, _mqaUtil.getAudioSenderMqa)({
329
+ audioSender: audioShareSender,
330
+ statsResults: this.statsResults,
331
+ lastMqaDataSent: this.lastMqaDataSent,
332
+ baseMediaType: 'audio-share-send'
333
+ });
334
+ newMqa.audioTransmit.push(audioShareSender);
335
+ (0, _mqaUtil.getAudioReceiverMqa)({
336
+ audioReceiver: audioReceiver,
337
+ statsResults: this.statsResults,
338
+ lastMqaDataSent: this.lastMqaDataSent,
339
+ baseMediaType: 'audio-recv'
340
+ });
341
+ newMqa.audioReceive.push(audioReceiver);
342
+ (0, _mqaUtil.getAudioReceiverMqa)({
343
+ audioReceiver: audioShareReceiver,
344
+ statsResults: this.statsResults,
345
+ lastMqaDataSent: this.lastMqaDataSent,
346
+ baseMediaType: 'audio-share-recv'
347
+ });
348
+ newMqa.audioReceive.push(audioShareReceiver);
349
+ (0, _mqaUtil.getVideoSenderMqa)({
350
+ videoSender: videoSender,
351
+ statsResults: this.statsResults,
352
+ lastMqaDataSent: this.lastMqaDataSent,
353
+ baseMediaType: 'video-send'
354
+ });
355
+ newMqa.videoTransmit.push(videoSender);
356
+ (0, _mqaUtil.getVideoSenderMqa)({
357
+ videoSender: videoShareSender,
358
+ statsResults: this.statsResults,
359
+ lastMqaDataSent: this.lastMqaDataSent,
360
+ baseMediaType: 'video-share-send'
361
+ });
362
+ newMqa.videoTransmit.push(videoShareSender);
363
+ (0, _mqaUtil.getVideoReceiverMqa)({
364
+ videoReceiver: videoReceiver,
365
+ statsResults: this.statsResults,
366
+ lastMqaDataSent: this.lastMqaDataSent,
367
+ baseMediaType: 'video-recv'
368
+ });
369
+ newMqa.videoReceive.push(videoReceiver);
370
+ (0, _mqaUtil.getVideoReceiverMqa)({
371
+ videoReceiver: videoShareReceiver,
372
+ statsResults: this.statsResults,
373
+ lastMqaDataSent: this.lastMqaDataSent,
374
+ baseMediaType: 'video-share-recv'
375
+ });
376
+ newMqa.videoReceive.push(videoShareReceiver);
377
+
378
+ // Add stats for individual streams
379
+ (0, _keys.default)(this.statsResults).forEach(function (mediaType) {
380
+ if (mediaType.includes('audio-send')) {
381
+ var audioSenderStream = (0, _lodash.cloneDeep)(_config.emptyAudioTransmitStream);
382
+ (0, _mqaUtil.getAudioSenderStreamMqa)({
383
+ audioSenderStream: audioSenderStream,
312
384
  statsResults: _this3.statsResults,
313
385
  lastMqaDataSent: _this3.lastMqaDataSent,
314
386
  mediaType: mediaType
315
387
  });
316
- newMqa.audioTransmit.push(audioSender);
388
+ newMqa.audioTransmit[0].streams.push(audioSenderStream);
317
389
  _this3.lastMqaDataSent[mediaType].send = (0, _lodash.cloneDeep)(_this3.statsResults[mediaType].send);
318
- } else if (mediaType.includes('audio-recv') || mediaType.includes('audio-share-recv')) {
319
- var audioReceiver = (0, _lodash.cloneDeep)(_config.emptyAudioReceive);
320
- (0, _mqaUtil.getAudioReceiverMqa)({
321
- audioReceiver: audioReceiver,
390
+ } else if (mediaType.includes('audio-share-send')) {
391
+ var _audioSenderStream = (0, _lodash.cloneDeep)(_config.emptyAudioTransmitStream);
392
+ (0, _mqaUtil.getAudioSenderStreamMqa)({
393
+ audioSenderStream: _audioSenderStream,
322
394
  statsResults: _this3.statsResults,
323
395
  lastMqaDataSent: _this3.lastMqaDataSent,
324
396
  mediaType: mediaType
325
397
  });
326
- newMqa.audioReceive.push(audioReceiver);
398
+ newMqa.audioTransmit[1].streams.push(_audioSenderStream);
399
+ _this3.lastMqaDataSent[mediaType].send = (0, _lodash.cloneDeep)(_this3.statsResults[mediaType].send);
400
+ } else if (mediaType.includes('audio-recv')) {
401
+ var audioReceiverStream = (0, _lodash.cloneDeep)(_config.emptyAudioReceiveStream);
402
+ (0, _mqaUtil.getAudioReceiverStreamMqa)({
403
+ audioReceiverStream: audioReceiverStream,
404
+ statsResults: _this3.statsResults,
405
+ lastMqaDataSent: _this3.lastMqaDataSent,
406
+ mediaType: mediaType
407
+ });
408
+ newMqa.audioReceive[0].streams.push(audioReceiverStream);
409
+ _this3.lastMqaDataSent[mediaType].recv = (0, _lodash.cloneDeep)(_this3.statsResults[mediaType].recv);
410
+ } else if (mediaType.includes('audio-share-recv')) {
411
+ var _audioReceiverStream = (0, _lodash.cloneDeep)(_config.emptyAudioReceiveStream);
412
+ (0, _mqaUtil.getAudioReceiverStreamMqa)({
413
+ audioReceiverStream: _audioReceiverStream,
414
+ statsResults: _this3.statsResults,
415
+ lastMqaDataSent: _this3.lastMqaDataSent,
416
+ mediaType: mediaType
417
+ });
418
+ newMqa.audioReceive[1].streams.push(_audioReceiverStream);
327
419
  _this3.lastMqaDataSent[mediaType].recv = (0, _lodash.cloneDeep)(_this3.statsResults[mediaType].recv);
328
- } else if (mediaType.includes('video-send') || mediaType.includes('video-share-send')) {
329
- var videoSender = (0, _lodash.cloneDeep)(_config.emptyVideoTransmit);
330
- (0, _mqaUtil.getVideoSenderMqa)({
331
- videoSender: videoSender,
420
+ } else if (mediaType.includes('video-send')) {
421
+ var videoSenderStream = (0, _lodash.cloneDeep)(_config.emptyVideoTransmitStream);
422
+ (0, _mqaUtil.getVideoSenderStreamMqa)({
423
+ videoSenderStream: videoSenderStream,
424
+ statsResults: _this3.statsResults,
425
+ lastMqaDataSent: _this3.lastMqaDataSent,
426
+ mediaType: mediaType
427
+ });
428
+ newMqa.videoTransmit[0].streams.push(videoSenderStream);
429
+ _this3.lastMqaDataSent[mediaType].send = (0, _lodash.cloneDeep)(_this3.statsResults[mediaType].send);
430
+ } else if (mediaType.includes('video-share-send')) {
431
+ var _videoSenderStream = (0, _lodash.cloneDeep)(_config.emptyVideoTransmitStream);
432
+ (0, _mqaUtil.getVideoSenderStreamMqa)({
433
+ videoSenderStream: _videoSenderStream,
332
434
  statsResults: _this3.statsResults,
333
435
  lastMqaDataSent: _this3.lastMqaDataSent,
334
436
  mediaType: mediaType
335
437
  });
336
- newMqa.videoTransmit.push(videoSender);
438
+ newMqa.videoTransmit[1].streams.push(_videoSenderStream);
337
439
  _this3.lastMqaDataSent[mediaType].send = (0, _lodash.cloneDeep)(_this3.statsResults[mediaType].send);
338
- } else if (mediaType.includes('video-recv') || mediaType.includes('video-share-recv')) {
339
- var videoReceiver = (0, _lodash.cloneDeep)(_config.emptyVideoReceive);
340
- (0, _mqaUtil.getVideoReceiverMqa)({
341
- videoReceiver: videoReceiver,
440
+ } else if (mediaType.includes('video-recv')) {
441
+ var videoReceiverStream = (0, _lodash.cloneDeep)(_config.emptyVideoReceiveStream);
442
+ (0, _mqaUtil.getVideoReceiverStreamMqa)({
443
+ videoReceiverStream: videoReceiverStream,
444
+ statsResults: _this3.statsResults,
445
+ lastMqaDataSent: _this3.lastMqaDataSent,
446
+ mediaType: mediaType
447
+ });
448
+ newMqa.videoReceive[0].streams.push(videoReceiverStream);
449
+ _this3.lastMqaDataSent[mediaType].recv = (0, _lodash.cloneDeep)(_this3.statsResults[mediaType].recv);
450
+ } else if (mediaType.includes('video-share-recv')) {
451
+ var _videoReceiverStream = (0, _lodash.cloneDeep)(_config.emptyVideoReceiveStream);
452
+ (0, _mqaUtil.getVideoReceiverStreamMqa)({
453
+ videoReceiverStream: _videoReceiverStream,
342
454
  statsResults: _this3.statsResults,
343
455
  lastMqaDataSent: _this3.lastMqaDataSent,
344
456
  mediaType: mediaType
345
457
  });
346
- newMqa.videoReceive.push(videoReceiver);
458
+ newMqa.videoReceive[1].streams.push(_videoReceiverStream);
347
459
  _this3.lastMqaDataSent[mediaType].recv = (0, _lodash.cloneDeep)(_this3.statsResults[mediaType].recv);
348
460
  }
349
461
  });
@@ -509,7 +621,6 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
509
621
  this.parseCandidate(getStatsResult, type, isSender, false);
510
622
  break;
511
623
  case 'media-source':
512
- // @ts-ignore
513
624
  this.parseAudioSource(getStatsResult, type);
514
625
  break;
515
626
  default:
@@ -840,6 +951,7 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
840
951
  if (result.bytesReceived) {
841
952
  var kilobytes = 0;
842
953
  var receiveSlot = this.receiveSlotCallback(result.ssrc);
954
+ var sourceState = receiveSlot === null || receiveSlot === void 0 ? void 0 : receiveSlot.sourceState;
843
955
  var idAndCsi = receiveSlot ? "id: \"".concat(receiveSlot.id || '', "\"").concat(receiveSlot.csi ? " and csi: ".concat(receiveSlot.csi) : '') : '';
844
956
  if (result.frameWidth && result.frameHeight) {
845
957
  this.statsResults[mediaType][sendrecvType].width = result.frameWidth;
@@ -856,8 +968,8 @@ var StatsAnalyzer = exports.StatsAnalyzer = /*#__PURE__*/function (_EventsScope)
856
968
  var currentPacketsReceived = result.packetsReceived - this.statsResults[mediaType][sendrecvType].totalPacketsReceived;
857
969
  this.statsResults[mediaType][sendrecvType].totalPacketsReceived = result.packetsReceived;
858
970
  if (currentPacketsReceived === 0) {
859
- if (receiveSlot) {
860
- _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No packets received for receive slot ".concat(idAndCsi), currentPacketsReceived);
971
+ if (receiveSlot && sourceState === 'live') {
972
+ _loggerProxy.default.logger.info("StatsAnalyzer:index#processInboundRTPResult --> No packets received for receive slot ".concat(idAndCsi, ". Total packets received on slot: "), result.packetsReceived);
861
973
  }
862
974
  }
863
975