@flashphoner/websdk 2.0.262 → 2.0.264

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.
@@ -11619,6 +11619,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11619
11619
  metricsBatch: null,
11620
11620
  timer: null,
11621
11621
  batchCount: 0,
11622
+ timerBusy: false,
11622
11623
  start: function () {
11623
11624
  var _start = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
11624
11625
  var error;
@@ -11701,7 +11702,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11701
11702
  _context2.n = 1;
11702
11703
  break;
11703
11704
  }
11704
- statCollector.logger.error(LOG_PREFIX, "Can't update WebRTC metrics sending: no parameters passed");
11705
+ statCollector.logger.error(LOG_PREFIX + "-" + statCollector.id, "Can't update WebRTC metrics sending: no parameters passed");
11705
11706
  return _context2.a(2);
11706
11707
  case 1:
11707
11708
  if (!(description.types || description.compression)) {
@@ -11761,14 +11762,26 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11761
11762
  }(),
11762
11763
  updateHeaders: function () {
11763
11764
  var _updateHeaders = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
11764
- var stats;
11765
+ var stats,
11766
+ currentHeaders,
11767
+ headersChanged,
11768
+ newMetrics,
11769
+ _args3 = arguments;
11765
11770
  return _regenerator().w(function (_context3) {
11766
11771
  while (1) switch (_context3.n) {
11767
11772
  case 0:
11773
+ stats = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : null;
11774
+ currentHeaders = "";
11775
+ headersChanged = false;
11776
+ if (stats) {
11777
+ _context3.n = 2;
11778
+ break;
11779
+ }
11768
11780
  _context3.n = 1;
11769
11781
  return statCollector.mediaConnection.getWebRTCStats();
11770
11782
  case 1:
11771
11783
  stats = _context3.v;
11784
+ case 2:
11772
11785
  Object.keys(statCollector.description.types).forEach(function (type) {
11773
11786
  var typeDescriptor = statCollector.description.types[type];
11774
11787
  var metricsString = "";
@@ -11781,11 +11794,11 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11781
11794
  }
11782
11795
  if (stats[type]) {
11783
11796
  stats[type].forEach(function (report) {
11784
- statCollector.logger.debug(LOG_PREFIX, type + " report: " + JSON.stringify(report));
11797
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, type + " report: " + JSON.stringify(report));
11785
11798
  if (contentFilters) {
11786
11799
  var filtersMatched = true;
11787
11800
  for (var filter in contentFilters) {
11788
- statCollector.logger.debug(LOG_PREFIX, type + " filter by " + filter + ": " + JSON.stringify(contentFilters[filter]));
11801
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, type + " filter by " + filter + ": " + JSON.stringify(contentFilters[filter]));
11789
11802
  var filterMatched = false;
11790
11803
  if (report[filter]) {
11791
11804
  var _iterator = _createForOfIteratorHelper(contentFilters[filter]),
@@ -11793,7 +11806,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11793
11806
  try {
11794
11807
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
11795
11808
  var value = _step.value;
11796
- statCollector.logger.debug(LOG_PREFIX, filter + ": " + value + " <> " + report[filter]);
11809
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, filter + ": " + value + " <> " + report[filter]);
11797
11810
  if (report[filter] === value) {
11798
11811
  filterMatched = true;
11799
11812
  break;
@@ -11811,18 +11824,30 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11811
11824
  }
11812
11825
  }
11813
11826
  if (filtersMatched) {
11814
- statCollector.addHeaders(report, metricsString);
11827
+ currentHeaders = statCollector.addHeaders(currentHeaders, report, metricsString);
11815
11828
  }
11816
11829
  } else {
11817
- statCollector.addHeaders(report, metricsString);
11830
+ currentHeaders = statCollector.addHeaders(currentHeaders, report, metricsString);
11818
11831
  }
11819
11832
  });
11820
11833
  } else {
11821
- statCollector.logger.warn(LOG_PREFIX, "No report type found in RTC stats: '" + type + "'");
11834
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, "No report type found in RTC stats: '" + type + "'");
11822
11835
  }
11823
11836
  });
11824
- case 2:
11825
- return _context3.a(2);
11837
+ if (currentHeaders !== statCollector.headers) {
11838
+ headersChanged = true;
11839
+ newMetrics = [];
11840
+ currentHeaders.split(",").forEach(function (header) {
11841
+ if (statCollector.headers.indexOf(header) === -1) {
11842
+ newMetrics.push(header);
11843
+ }
11844
+ });
11845
+ if (newMetrics.length) {
11846
+ statCollector.logger.info(LOG_PREFIX + "-" + statCollector.id, "RTC metrics to be collected: " + newMetrics.toString());
11847
+ }
11848
+ statCollector.headers = currentHeaders;
11849
+ }
11850
+ return _context3.a(2, headersChanged);
11826
11851
  }
11827
11852
  }, _callee3);
11828
11853
  }));
@@ -11831,24 +11856,20 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11831
11856
  }
11832
11857
  return updateHeaders;
11833
11858
  }(),
11834
- addHeaders: function addHeaders(report, metricsString) {
11859
+ addHeaders: function addHeaders(currentHeaders, report, metricsString) {
11835
11860
  if (metricsString) {
11836
11861
  var metrics = metricsString.split(",");
11837
11862
  metrics.forEach(function (metric) {
11838
- var metricFound = false;
11839
11863
  for (var _i = 0, _Object$keys = Object.keys(report); _i < _Object$keys.length; _i++) {
11840
11864
  var key = _Object$keys[_i];
11841
11865
  if (metric === key) {
11842
- statCollector.headers = util.addFieldToCsvString(statCollector.headers, report.type + "." + report.id + "." + metric, ",");
11843
- metricFound = true;
11866
+ currentHeaders = util.addFieldToCsvString(currentHeaders, report.type + "." + report.id + "." + metric, ",");
11844
11867
  break;
11845
11868
  }
11846
11869
  }
11847
- if (!metricFound) {
11848
- statCollector.logger.warn(LOG_PREFIX, "No metric found in RTC stats report '" + report.type + "': '" + metric + "'");
11849
- }
11850
11870
  });
11851
11871
  }
11872
+ return currentHeaders;
11852
11873
  },
11853
11874
  updateCompression: function () {
11854
11875
  var _updateCompression = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {
@@ -11901,7 +11922,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11901
11922
  case 2:
11902
11923
  _context5.p = 2;
11903
11924
  _t2 = _context5.v;
11904
- statCollector.logger.warn(LOG_PREFIX, "Can't compress metrics data using " + compression + ": " + _t2);
11925
+ statCollector.logger.warn(LOG_PREFIX + "-" + statCollector.id, "Can't compress metrics data using " + compression + ": " + _t2);
11905
11926
  statCollector.compression = "none";
11906
11927
  case 3:
11907
11928
  return _context5.a(2);
@@ -11922,7 +11943,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11922
11943
  statCollector.send("webRTCMetricsClientDescription", data);
11923
11944
  },
11924
11945
  send: function send(message, data) {
11925
- statCollector.logger.debug(LOG_PREFIX, data);
11946
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, data);
11926
11947
  if (statCollector.wsConnection.readyState === WebSocket.OPEN) {
11927
11948
  statCollector.wsConnection.send(JSON.stringify({
11928
11949
  message: message,
@@ -11945,22 +11966,24 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11945
11966
  },
11946
11967
  collectMetrics: function () {
11947
11968
  var _collectMetrics = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6() {
11948
- var stats, metrics;
11969
+ var stats, metrics, lostMetrics, headersUpdated;
11949
11970
  return _regenerator().w(function (_context6) {
11950
11971
  while (1) switch (_context6.n) {
11951
11972
  case 0:
11952
- if (!statCollector.timer) {
11953
- _context6.n = 2;
11973
+ if (!(statCollector.timer && !statCollector.timerBusy)) {
11974
+ _context6.n = 6;
11954
11975
  break;
11955
11976
  }
11977
+ // Unfortunately there are no real atomics in JS unless SharedArrayBuffer is used
11978
+ // So we guard the timer callback with a dumb boolean
11979
+ statCollector.timerBusy = true;
11956
11980
  _context6.n = 1;
11957
11981
  return statCollector.mediaConnection.getWebRTCStats();
11958
11982
  case 1:
11959
11983
  stats = _context6.v;
11960
- if (!statCollector.metricsBatch) {
11961
- statCollector.metricsBatch = [];
11962
- }
11984
+ statCollector.startNewBatch();
11963
11985
  metrics = [];
11986
+ lostMetrics = [];
11964
11987
  statCollector.headers.split(",").forEach(function (header) {
11965
11988
  var components = header.split(".");
11966
11989
  var descriptor = {
@@ -11968,7 +11991,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11968
11991
  id: components[1],
11969
11992
  name: components[2]
11970
11993
  };
11971
- var value = "undefined";
11994
+ var value = null;
11972
11995
  if (stats[descriptor.type]) {
11973
11996
  var _iterator2 = _createForOfIteratorHelper(stats[descriptor.type]),
11974
11997
  _step2;
@@ -11986,17 +12009,46 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11986
12009
  _iterator2.f();
11987
12010
  }
11988
12011
  }
11989
- metrics.push(value);
12012
+ if (value === null) {
12013
+ lostMetrics.push(descriptor);
12014
+ } else {
12015
+ metrics.push(value);
12016
+ }
11990
12017
  });
12018
+ // Metrics list may change if some metrics are added or some metrics are lost #WCS-4627
12019
+ _context6.n = 2;
12020
+ return statCollector.updateHeaders(stats);
12021
+ case 2:
12022
+ headersUpdated = _context6.v;
12023
+ if (!lostMetrics.length) {
12024
+ _context6.n = 4;
12025
+ break;
12026
+ }
12027
+ statCollector.logger.info(LOG_PREFIX + "-" + statCollector.id, "Missing metrics: " + JSON.stringify(lostMetrics));
12028
+ // Send metrics already collected and start a new batch with current metrics array to send them later #WCS-4627
12029
+ _context6.n = 3;
12030
+ return statCollector.sendMetrics();
12031
+ case 3:
12032
+ statCollector.startNewBatch(metrics);
12033
+ _context6.n = 5;
12034
+ break;
12035
+ case 4:
11991
12036
  statCollector.metricsBatch.push(metrics);
11992
12037
  statCollector.batchCount--;
11993
- if (!(statCollector.batchCount === 0)) {
11994
- _context6.n = 2;
12038
+ if (!(statCollector.batchCount === 0 || headersUpdated)) {
12039
+ _context6.n = 5;
11995
12040
  break;
11996
12041
  }
11997
- _context6.n = 2;
12042
+ _context6.n = 5;
11998
12043
  return statCollector.sendMetrics();
11999
- case 2:
12044
+ case 5:
12045
+ // Check if metrics list changed and send a new headers if needed #WCS-4619
12046
+ if (headersUpdated) {
12047
+ statCollector.logger.info(LOG_PREFIX + "-" + statCollector.id, "RTC metrics list has changed, sending a new metrics description");
12048
+ statCollector.sendHeaders();
12049
+ }
12050
+ statCollector.timerBusy = false;
12051
+ case 6:
12000
12052
  return _context6.a(2);
12001
12053
  }
12002
12054
  }, _callee6);
@@ -12013,7 +12065,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12013
12065
  while (1) switch (_context7.p = _context7.n) {
12014
12066
  case 0:
12015
12067
  metricsToSend = [];
12016
- for (i = 0; i < statCollector.metricsBatch.length; i++) {
12068
+ for (i = 0; statCollector.metricsBatch && i < statCollector.metricsBatch.length; i++) {
12017
12069
  metricsString = "";
12018
12070
  for (j = 0; j < statCollector.metricsBatch[i].length; j++) {
12019
12071
  valueString = valueToString(statCollector.metricsBatch[i][j]);
@@ -12047,7 +12099,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12047
12099
  case 3:
12048
12100
  _context7.p = 3;
12049
12101
  _t3 = _context7.v;
12050
- statCollector.logger.warn(LOG_PREFIX, "Can't send metrics data using" + statCollector.compression + ": " + _t3);
12102
+ statCollector.logger.warn(LOG_PREFIX + "-" + statCollector.id, "Can't send metrics data using" + statCollector.compression + ": " + _t3);
12051
12103
  metricsData = null;
12052
12104
  case 4:
12053
12105
  _context7.n = 6;
@@ -12062,8 +12114,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12062
12114
  };
12063
12115
  statCollector.send("webRTCMetricsBatch", data);
12064
12116
  }
12065
- statCollector.metricsBatch = null;
12066
- statCollector.batchCount = statCollector.description.batchSize;
12117
+ statCollector.cleanBatch();
12067
12118
  case 7:
12068
12119
  return _context7.a(2);
12069
12120
  }
@@ -12073,7 +12124,21 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12073
12124
  return _sendMetrics.apply(this, arguments);
12074
12125
  }
12075
12126
  return sendMetrics;
12076
- }()
12127
+ }(),
12128
+ startNewBatch: function startNewBatch(metrics) {
12129
+ if (!statCollector.metricsBatch) {
12130
+ statCollector.metricsBatch = [];
12131
+ if (metrics) {
12132
+ statCollector.metricsBatch.push(metrics);
12133
+ }
12134
+ }
12135
+ },
12136
+ cleanBatch: function cleanBatch() {
12137
+ if (statCollector.metricsBatch) {
12138
+ statCollector.metricsBatch = null;
12139
+ statCollector.batchCount = statCollector.description.batchSize;
12140
+ }
12141
+ }
12077
12142
  };
12078
12143
  return statCollector;
12079
12144
  };