@flashphoner/websdk 2.0.261 → 2.0.263

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.
@@ -12946,6 +12946,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12946
12946
  metricsBatch: null,
12947
12947
  timer: null,
12948
12948
  batchCount: 0,
12949
+ timerBusy: false,
12949
12950
  start: function () {
12950
12951
  var _start = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
12951
12952
  var error;
@@ -13028,7 +13029,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
13028
13029
  _context2.n = 1;
13029
13030
  break;
13030
13031
  }
13031
- statCollector.logger.error(LOG_PREFIX, "Can't update WebRTC metrics sending: no parameters passed");
13032
+ statCollector.logger.error(LOG_PREFIX + "-" + statCollector.id, "Can't update WebRTC metrics sending: no parameters passed");
13032
13033
  return _context2.a(2);
13033
13034
  case 1:
13034
13035
  if (!(description.types || description.compression)) {
@@ -13088,14 +13089,26 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
13088
13089
  }(),
13089
13090
  updateHeaders: function () {
13090
13091
  var _updateHeaders = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
13091
- var stats;
13092
+ var stats,
13093
+ currentHeaders,
13094
+ headersChanged,
13095
+ newMetrics,
13096
+ _args3 = arguments;
13092
13097
  return _regenerator().w(function (_context3) {
13093
13098
  while (1) switch (_context3.n) {
13094
13099
  case 0:
13100
+ stats = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : null;
13101
+ currentHeaders = "";
13102
+ headersChanged = false;
13103
+ if (stats) {
13104
+ _context3.n = 2;
13105
+ break;
13106
+ }
13095
13107
  _context3.n = 1;
13096
13108
  return statCollector.mediaConnection.getWebRTCStats();
13097
13109
  case 1:
13098
13110
  stats = _context3.v;
13111
+ case 2:
13099
13112
  Object.keys(statCollector.description.types).forEach(function (type) {
13100
13113
  var typeDescriptor = statCollector.description.types[type];
13101
13114
  var metricsString = "";
@@ -13108,11 +13121,11 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
13108
13121
  }
13109
13122
  if (stats[type]) {
13110
13123
  stats[type].forEach(function (report) {
13111
- statCollector.logger.debug(LOG_PREFIX, type + " report: " + JSON.stringify(report));
13124
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, type + " report: " + JSON.stringify(report));
13112
13125
  if (contentFilters) {
13113
13126
  var filtersMatched = true;
13114
13127
  for (var filter in contentFilters) {
13115
- statCollector.logger.debug(LOG_PREFIX, type + " filter by " + filter + ": " + JSON.stringify(contentFilters[filter]));
13128
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, type + " filter by " + filter + ": " + JSON.stringify(contentFilters[filter]));
13116
13129
  var filterMatched = false;
13117
13130
  if (report[filter]) {
13118
13131
  var _iterator = _createForOfIteratorHelper(contentFilters[filter]),
@@ -13120,7 +13133,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
13120
13133
  try {
13121
13134
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
13122
13135
  var value = _step.value;
13123
- statCollector.logger.debug(LOG_PREFIX, filter + ": " + value + " <> " + report[filter]);
13136
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, filter + ": " + value + " <> " + report[filter]);
13124
13137
  if (report[filter] === value) {
13125
13138
  filterMatched = true;
13126
13139
  break;
@@ -13138,18 +13151,30 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
13138
13151
  }
13139
13152
  }
13140
13153
  if (filtersMatched) {
13141
- statCollector.addHeaders(report, metricsString);
13154
+ currentHeaders = statCollector.addHeaders(currentHeaders, report, metricsString);
13142
13155
  }
13143
13156
  } else {
13144
- statCollector.addHeaders(report, metricsString);
13157
+ currentHeaders = statCollector.addHeaders(currentHeaders, report, metricsString);
13145
13158
  }
13146
13159
  });
13147
13160
  } else {
13148
- statCollector.logger.warn(LOG_PREFIX, "No report type found in RTC stats: '" + type + "'");
13161
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, "No report type found in RTC stats: '" + type + "'");
13149
13162
  }
13150
13163
  });
13151
- case 2:
13152
- return _context3.a(2);
13164
+ if (currentHeaders !== statCollector.headers) {
13165
+ headersChanged = true;
13166
+ newMetrics = [];
13167
+ currentHeaders.split(",").forEach(function (header) {
13168
+ if (statCollector.headers.indexOf(header) === -1) {
13169
+ newMetrics.push(header);
13170
+ }
13171
+ });
13172
+ if (newMetrics.length) {
13173
+ statCollector.logger.info(LOG_PREFIX + "-" + statCollector.id, "RTC metrics to be collected: " + newMetrics.toString());
13174
+ }
13175
+ statCollector.headers = currentHeaders;
13176
+ }
13177
+ return _context3.a(2, headersChanged);
13153
13178
  }
13154
13179
  }, _callee3);
13155
13180
  }));
@@ -13158,24 +13183,20 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
13158
13183
  }
13159
13184
  return updateHeaders;
13160
13185
  }(),
13161
- addHeaders: function addHeaders(report, metricsString) {
13186
+ addHeaders: function addHeaders(currentHeaders, report, metricsString) {
13162
13187
  if (metricsString) {
13163
13188
  var metrics = metricsString.split(",");
13164
13189
  metrics.forEach(function (metric) {
13165
- var metricFound = false;
13166
13190
  for (var _i = 0, _Object$keys = Object.keys(report); _i < _Object$keys.length; _i++) {
13167
13191
  var key = _Object$keys[_i];
13168
13192
  if (metric === key) {
13169
- statCollector.headers = util.addFieldToCsvString(statCollector.headers, report.type + "." + report.id + "." + metric, ",");
13170
- metricFound = true;
13193
+ currentHeaders = util.addFieldToCsvString(currentHeaders, report.type + "." + report.id + "." + metric, ",");
13171
13194
  break;
13172
13195
  }
13173
13196
  }
13174
- if (!metricFound) {
13175
- statCollector.logger.warn(LOG_PREFIX, "No metric found in RTC stats report '" + report.type + "': '" + metric + "'");
13176
- }
13177
13197
  });
13178
13198
  }
13199
+ return currentHeaders;
13179
13200
  },
13180
13201
  updateCompression: function () {
13181
13202
  var _updateCompression = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {
@@ -13228,7 +13249,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
13228
13249
  case 2:
13229
13250
  _context5.p = 2;
13230
13251
  _t2 = _context5.v;
13231
- statCollector.logger.warn(LOG_PREFIX, "Can't compress metrics data using " + compression + ": " + _t2);
13252
+ statCollector.logger.warn(LOG_PREFIX + "-" + statCollector.id, "Can't compress metrics data using " + compression + ": " + _t2);
13232
13253
  statCollector.compression = "none";
13233
13254
  case 3:
13234
13255
  return _context5.a(2);
@@ -13249,7 +13270,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
13249
13270
  statCollector.send("webRTCMetricsClientDescription", data);
13250
13271
  },
13251
13272
  send: function send(message, data) {
13252
- statCollector.logger.debug(LOG_PREFIX, data);
13273
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, data);
13253
13274
  if (statCollector.wsConnection.readyState === WebSocket.OPEN) {
13254
13275
  statCollector.wsConnection.send(JSON.stringify({
13255
13276
  message: message,
@@ -13272,14 +13293,17 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
13272
13293
  },
13273
13294
  collectMetrics: function () {
13274
13295
  var _collectMetrics = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6() {
13275
- var stats, metrics;
13296
+ var stats, metrics, lostMetrics;
13276
13297
  return _regenerator().w(function (_context6) {
13277
13298
  while (1) switch (_context6.n) {
13278
13299
  case 0:
13279
- if (!statCollector.timer) {
13280
- _context6.n = 2;
13300
+ if (!(statCollector.timer && !statCollector.timerBusy)) {
13301
+ _context6.n = 6;
13281
13302
  break;
13282
13303
  }
13304
+ // Unfortunately there are no real atomics in JS unless SharedArrayBuffer is used
13305
+ // So we guard the timer callback with a dumb boolean
13306
+ statCollector.timerBusy = true;
13283
13307
  _context6.n = 1;
13284
13308
  return statCollector.mediaConnection.getWebRTCStats();
13285
13309
  case 1:
@@ -13288,6 +13312,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
13288
13312
  statCollector.metricsBatch = [];
13289
13313
  }
13290
13314
  metrics = [];
13315
+ lostMetrics = [];
13291
13316
  statCollector.headers.split(",").forEach(function (header) {
13292
13317
  var components = header.split(".");
13293
13318
  var descriptor = {
@@ -13295,7 +13320,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
13295
13320
  id: components[1],
13296
13321
  name: components[2]
13297
13322
  };
13298
- var value = "undefined";
13323
+ var value = "NO";
13299
13324
  if (stats[descriptor.type]) {
13300
13325
  var _iterator2 = _createForOfIteratorHelper(stats[descriptor.type]),
13301
13326
  _step2;
@@ -13314,7 +13339,13 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
13314
13339
  }
13315
13340
  }
13316
13341
  metrics.push(value);
13342
+ if (value == "NO") {
13343
+ lostMetrics.push(descriptor);
13344
+ }
13317
13345
  });
13346
+ if (lostMetrics.length) {
13347
+ statCollector.logger.info(LOG_PREFIX + "-" + statCollector.id, "Missing metrics: " + JSON.stringify(lostMetrics));
13348
+ }
13318
13349
  statCollector.metricsBatch.push(metrics);
13319
13350
  statCollector.batchCount--;
13320
13351
  if (!(statCollector.batchCount === 0)) {
@@ -13324,6 +13355,21 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
13324
13355
  _context6.n = 2;
13325
13356
  return statCollector.sendMetrics();
13326
13357
  case 2:
13358
+ _context6.n = 3;
13359
+ return statCollector.updateHeaders(stats);
13360
+ case 3:
13361
+ if (!_context6.v) {
13362
+ _context6.n = 5;
13363
+ break;
13364
+ }
13365
+ statCollector.logger.info(LOG_PREFIX + "-" + statCollector.id, "RTC metrics list has changed, sending a new metrics description");
13366
+ _context6.n = 4;
13367
+ return statCollector.sendMetrics();
13368
+ case 4:
13369
+ statCollector.sendHeaders();
13370
+ case 5:
13371
+ statCollector.timerBusy = false;
13372
+ case 6:
13327
13373
  return _context6.a(2);
13328
13374
  }
13329
13375
  }, _callee6);
@@ -13335,7 +13381,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
13335
13381
  }(),
13336
13382
  sendMetrics: function () {
13337
13383
  var _sendMetrics = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee7() {
13338
- var previous, metricsToSend, metricsData, i, metricsString, j, valueString, previousString, separator, data, _t3;
13384
+ var previous, metricsToSend, metricsData, i, metricsString, j, valueString, previousString, delimiter, data, _t3;
13339
13385
  return _regenerator().w(function (_context7) {
13340
13386
  while (1) switch (_context7.p = _context7.n) {
13341
13387
  case 0:
@@ -13345,14 +13391,17 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
13345
13391
  for (j = 0; j < statCollector.metricsBatch[i].length; j++) {
13346
13392
  valueString = valueToString(statCollector.metricsBatch[i][j]);
13347
13393
  previousString = "";
13348
- separator = ";";
13394
+ delimiter = ";";
13349
13395
  if (previous) {
13350
13396
  previousString = valueToString(previous[j]);
13351
13397
  }
13352
13398
  if (valueString === previousString) {
13353
13399
  valueString = "";
13354
13400
  }
13355
- metricsString = util.addFieldToCsvString(metricsString, valueString, separator);
13401
+ metricsString = util.addFieldToCsvString(metricsString, valueString, delimiter);
13402
+ if (j > 0 && metricsString === "") {
13403
+ metricsString = delimiter;
13404
+ }
13356
13405
  }
13357
13406
  previous = statCollector.metricsBatch[i];
13358
13407
  metricsToSend.push(metricsString);
@@ -13371,7 +13420,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
13371
13420
  case 3:
13372
13421
  _context7.p = 3;
13373
13422
  _t3 = _context7.v;
13374
- statCollector.logger.warn(LOG_PREFIX, "Can't send metrics data using" + statCollector.compression + ": " + _t3);
13423
+ statCollector.logger.warn(LOG_PREFIX + "-" + statCollector.id, "Can't send metrics data using" + statCollector.compression + ": " + _t3);
13375
13424
  metricsData = null;
13376
13425
  case 4:
13377
13426
  _context7.n = 6;
@@ -14497,14 +14546,14 @@ var setPublishingBitrate = function setPublishingBitrate(sdp, mediaConnection, m
14497
14546
  }
14498
14547
  return sdp;
14499
14548
  };
14500
- var addFieldToCsvString = function addFieldToCsvString(csvString, field, separator) {
14501
- if (field !== "" && field.indexOf(separator) >= 0) {
14549
+ var addFieldToCsvString = function addFieldToCsvString(csvString, field, delimiter) {
14550
+ if (field !== "" && field.indexOf(delimiter) >= 0) {
14502
14551
  field = '"' + field + '"';
14503
14552
  }
14504
- if (csvString === "" && field !== "") {
14553
+ if (csvString === "") {
14505
14554
  csvString = field;
14506
14555
  } else {
14507
- csvString = csvString + separator + field;
14556
+ csvString = csvString + delimiter + field;
14508
14557
  }
14509
14558
  return csvString;
14510
14559
  };
@@ -19701,6 +19701,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
19701
19701
  metricsBatch: null,
19702
19702
  timer: null,
19703
19703
  batchCount: 0,
19704
+ timerBusy: false,
19704
19705
  start: function () {
19705
19706
  var _start = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
19706
19707
  var error;
@@ -19783,7 +19784,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
19783
19784
  _context2.n = 1;
19784
19785
  break;
19785
19786
  }
19786
- statCollector.logger.error(LOG_PREFIX, "Can't update WebRTC metrics sending: no parameters passed");
19787
+ statCollector.logger.error(LOG_PREFIX + "-" + statCollector.id, "Can't update WebRTC metrics sending: no parameters passed");
19787
19788
  return _context2.a(2);
19788
19789
  case 1:
19789
19790
  if (!(description.types || description.compression)) {
@@ -19843,14 +19844,26 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
19843
19844
  }(),
19844
19845
  updateHeaders: function () {
19845
19846
  var _updateHeaders = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
19846
- var stats;
19847
+ var stats,
19848
+ currentHeaders,
19849
+ headersChanged,
19850
+ newMetrics,
19851
+ _args3 = arguments;
19847
19852
  return _regenerator().w(function (_context3) {
19848
19853
  while (1) switch (_context3.n) {
19849
19854
  case 0:
19855
+ stats = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : null;
19856
+ currentHeaders = "";
19857
+ headersChanged = false;
19858
+ if (stats) {
19859
+ _context3.n = 2;
19860
+ break;
19861
+ }
19850
19862
  _context3.n = 1;
19851
19863
  return statCollector.mediaConnection.getWebRTCStats();
19852
19864
  case 1:
19853
19865
  stats = _context3.v;
19866
+ case 2:
19854
19867
  Object.keys(statCollector.description.types).forEach(function (type) {
19855
19868
  var typeDescriptor = statCollector.description.types[type];
19856
19869
  var metricsString = "";
@@ -19863,11 +19876,11 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
19863
19876
  }
19864
19877
  if (stats[type]) {
19865
19878
  stats[type].forEach(function (report) {
19866
- statCollector.logger.debug(LOG_PREFIX, type + " report: " + JSON.stringify(report));
19879
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, type + " report: " + JSON.stringify(report));
19867
19880
  if (contentFilters) {
19868
19881
  var filtersMatched = true;
19869
19882
  for (var filter in contentFilters) {
19870
- statCollector.logger.debug(LOG_PREFIX, type + " filter by " + filter + ": " + JSON.stringify(contentFilters[filter]));
19883
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, type + " filter by " + filter + ": " + JSON.stringify(contentFilters[filter]));
19871
19884
  var filterMatched = false;
19872
19885
  if (report[filter]) {
19873
19886
  var _iterator = _createForOfIteratorHelper(contentFilters[filter]),
@@ -19875,7 +19888,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
19875
19888
  try {
19876
19889
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
19877
19890
  var value = _step.value;
19878
- statCollector.logger.debug(LOG_PREFIX, filter + ": " + value + " <> " + report[filter]);
19891
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, filter + ": " + value + " <> " + report[filter]);
19879
19892
  if (report[filter] === value) {
19880
19893
  filterMatched = true;
19881
19894
  break;
@@ -19893,18 +19906,30 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
19893
19906
  }
19894
19907
  }
19895
19908
  if (filtersMatched) {
19896
- statCollector.addHeaders(report, metricsString);
19909
+ currentHeaders = statCollector.addHeaders(currentHeaders, report, metricsString);
19897
19910
  }
19898
19911
  } else {
19899
- statCollector.addHeaders(report, metricsString);
19912
+ currentHeaders = statCollector.addHeaders(currentHeaders, report, metricsString);
19900
19913
  }
19901
19914
  });
19902
19915
  } else {
19903
- statCollector.logger.warn(LOG_PREFIX, "No report type found in RTC stats: '" + type + "'");
19916
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, "No report type found in RTC stats: '" + type + "'");
19904
19917
  }
19905
19918
  });
19906
- case 2:
19907
- return _context3.a(2);
19919
+ if (currentHeaders !== statCollector.headers) {
19920
+ headersChanged = true;
19921
+ newMetrics = [];
19922
+ currentHeaders.split(",").forEach(function (header) {
19923
+ if (statCollector.headers.indexOf(header) === -1) {
19924
+ newMetrics.push(header);
19925
+ }
19926
+ });
19927
+ if (newMetrics.length) {
19928
+ statCollector.logger.info(LOG_PREFIX + "-" + statCollector.id, "RTC metrics to be collected: " + newMetrics.toString());
19929
+ }
19930
+ statCollector.headers = currentHeaders;
19931
+ }
19932
+ return _context3.a(2, headersChanged);
19908
19933
  }
19909
19934
  }, _callee3);
19910
19935
  }));
@@ -19913,24 +19938,20 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
19913
19938
  }
19914
19939
  return updateHeaders;
19915
19940
  }(),
19916
- addHeaders: function addHeaders(report, metricsString) {
19941
+ addHeaders: function addHeaders(currentHeaders, report, metricsString) {
19917
19942
  if (metricsString) {
19918
19943
  var metrics = metricsString.split(",");
19919
19944
  metrics.forEach(function (metric) {
19920
- var metricFound = false;
19921
19945
  for (var _i = 0, _Object$keys = Object.keys(report); _i < _Object$keys.length; _i++) {
19922
19946
  var key = _Object$keys[_i];
19923
19947
  if (metric === key) {
19924
- statCollector.headers = util.addFieldToCsvString(statCollector.headers, report.type + "." + report.id + "." + metric, ",");
19925
- metricFound = true;
19948
+ currentHeaders = util.addFieldToCsvString(currentHeaders, report.type + "." + report.id + "." + metric, ",");
19926
19949
  break;
19927
19950
  }
19928
19951
  }
19929
- if (!metricFound) {
19930
- statCollector.logger.warn(LOG_PREFIX, "No metric found in RTC stats report '" + report.type + "': '" + metric + "'");
19931
- }
19932
19952
  });
19933
19953
  }
19954
+ return currentHeaders;
19934
19955
  },
19935
19956
  updateCompression: function () {
19936
19957
  var _updateCompression = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {
@@ -19983,7 +20004,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
19983
20004
  case 2:
19984
20005
  _context5.p = 2;
19985
20006
  _t2 = _context5.v;
19986
- statCollector.logger.warn(LOG_PREFIX, "Can't compress metrics data using " + compression + ": " + _t2);
20007
+ statCollector.logger.warn(LOG_PREFIX + "-" + statCollector.id, "Can't compress metrics data using " + compression + ": " + _t2);
19987
20008
  statCollector.compression = "none";
19988
20009
  case 3:
19989
20010
  return _context5.a(2);
@@ -20004,7 +20025,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
20004
20025
  statCollector.send("webRTCMetricsClientDescription", data);
20005
20026
  },
20006
20027
  send: function send(message, data) {
20007
- statCollector.logger.debug(LOG_PREFIX, data);
20028
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, data);
20008
20029
  if (statCollector.wsConnection.readyState === WebSocket.OPEN) {
20009
20030
  statCollector.wsConnection.send(JSON.stringify({
20010
20031
  message: message,
@@ -20027,14 +20048,17 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
20027
20048
  },
20028
20049
  collectMetrics: function () {
20029
20050
  var _collectMetrics = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6() {
20030
- var stats, metrics;
20051
+ var stats, metrics, lostMetrics;
20031
20052
  return _regenerator().w(function (_context6) {
20032
20053
  while (1) switch (_context6.n) {
20033
20054
  case 0:
20034
- if (!statCollector.timer) {
20035
- _context6.n = 2;
20055
+ if (!(statCollector.timer && !statCollector.timerBusy)) {
20056
+ _context6.n = 6;
20036
20057
  break;
20037
20058
  }
20059
+ // Unfortunately there are no real atomics in JS unless SharedArrayBuffer is used
20060
+ // So we guard the timer callback with a dumb boolean
20061
+ statCollector.timerBusy = true;
20038
20062
  _context6.n = 1;
20039
20063
  return statCollector.mediaConnection.getWebRTCStats();
20040
20064
  case 1:
@@ -20043,6 +20067,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
20043
20067
  statCollector.metricsBatch = [];
20044
20068
  }
20045
20069
  metrics = [];
20070
+ lostMetrics = [];
20046
20071
  statCollector.headers.split(",").forEach(function (header) {
20047
20072
  var components = header.split(".");
20048
20073
  var descriptor = {
@@ -20050,7 +20075,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
20050
20075
  id: components[1],
20051
20076
  name: components[2]
20052
20077
  };
20053
- var value = "undefined";
20078
+ var value = "NO";
20054
20079
  if (stats[descriptor.type]) {
20055
20080
  var _iterator2 = _createForOfIteratorHelper(stats[descriptor.type]),
20056
20081
  _step2;
@@ -20069,7 +20094,13 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
20069
20094
  }
20070
20095
  }
20071
20096
  metrics.push(value);
20097
+ if (value == "NO") {
20098
+ lostMetrics.push(descriptor);
20099
+ }
20072
20100
  });
20101
+ if (lostMetrics.length) {
20102
+ statCollector.logger.info(LOG_PREFIX + "-" + statCollector.id, "Missing metrics: " + JSON.stringify(lostMetrics));
20103
+ }
20073
20104
  statCollector.metricsBatch.push(metrics);
20074
20105
  statCollector.batchCount--;
20075
20106
  if (!(statCollector.batchCount === 0)) {
@@ -20079,6 +20110,21 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
20079
20110
  _context6.n = 2;
20080
20111
  return statCollector.sendMetrics();
20081
20112
  case 2:
20113
+ _context6.n = 3;
20114
+ return statCollector.updateHeaders(stats);
20115
+ case 3:
20116
+ if (!_context6.v) {
20117
+ _context6.n = 5;
20118
+ break;
20119
+ }
20120
+ statCollector.logger.info(LOG_PREFIX + "-" + statCollector.id, "RTC metrics list has changed, sending a new metrics description");
20121
+ _context6.n = 4;
20122
+ return statCollector.sendMetrics();
20123
+ case 4:
20124
+ statCollector.sendHeaders();
20125
+ case 5:
20126
+ statCollector.timerBusy = false;
20127
+ case 6:
20082
20128
  return _context6.a(2);
20083
20129
  }
20084
20130
  }, _callee6);
@@ -20090,7 +20136,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
20090
20136
  }(),
20091
20137
  sendMetrics: function () {
20092
20138
  var _sendMetrics = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee7() {
20093
- var previous, metricsToSend, metricsData, i, metricsString, j, valueString, previousString, separator, data, _t3;
20139
+ var previous, metricsToSend, metricsData, i, metricsString, j, valueString, previousString, delimiter, data, _t3;
20094
20140
  return _regenerator().w(function (_context7) {
20095
20141
  while (1) switch (_context7.p = _context7.n) {
20096
20142
  case 0:
@@ -20100,14 +20146,17 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
20100
20146
  for (j = 0; j < statCollector.metricsBatch[i].length; j++) {
20101
20147
  valueString = valueToString(statCollector.metricsBatch[i][j]);
20102
20148
  previousString = "";
20103
- separator = ";";
20149
+ delimiter = ";";
20104
20150
  if (previous) {
20105
20151
  previousString = valueToString(previous[j]);
20106
20152
  }
20107
20153
  if (valueString === previousString) {
20108
20154
  valueString = "";
20109
20155
  }
20110
- metricsString = util.addFieldToCsvString(metricsString, valueString, separator);
20156
+ metricsString = util.addFieldToCsvString(metricsString, valueString, delimiter);
20157
+ if (j > 0 && metricsString === "") {
20158
+ metricsString = delimiter;
20159
+ }
20111
20160
  }
20112
20161
  previous = statCollector.metricsBatch[i];
20113
20162
  metricsToSend.push(metricsString);
@@ -20126,7 +20175,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
20126
20175
  case 3:
20127
20176
  _context7.p = 3;
20128
20177
  _t3 = _context7.v;
20129
- statCollector.logger.warn(LOG_PREFIX, "Can't send metrics data using" + statCollector.compression + ": " + _t3);
20178
+ statCollector.logger.warn(LOG_PREFIX + "-" + statCollector.id, "Can't send metrics data using" + statCollector.compression + ": " + _t3);
20130
20179
  metricsData = null;
20131
20180
  case 4:
20132
20181
  _context7.n = 6;
@@ -21252,14 +21301,14 @@ var setPublishingBitrate = function setPublishingBitrate(sdp, mediaConnection, m
21252
21301
  }
21253
21302
  return sdp;
21254
21303
  };
21255
- var addFieldToCsvString = function addFieldToCsvString(csvString, field, separator) {
21256
- if (field !== "" && field.indexOf(separator) >= 0) {
21304
+ var addFieldToCsvString = function addFieldToCsvString(csvString, field, delimiter) {
21305
+ if (field !== "" && field.indexOf(delimiter) >= 0) {
21257
21306
  field = '"' + field + '"';
21258
21307
  }
21259
- if (csvString === "" && field !== "") {
21308
+ if (csvString === "") {
21260
21309
  csvString = field;
21261
21310
  } else {
21262
- csvString = csvString + separator + field;
21311
+ csvString = csvString + delimiter + field;
21263
21312
  }
21264
21313
  return csvString;
21265
21314
  };