@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.
@@ -1,4 +1,4 @@
1
- Web SDK - 2.0.261
1
+ Web SDK - 2.0.263
2
2
 
3
3
  [Download builds](https://docs.flashphoner.com/display/WEBSDK2EN/Web+SDK+release+notes)
4
4
 
@@ -11885,6 +11885,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11885
11885
  metricsBatch: null,
11886
11886
  timer: null,
11887
11887
  batchCount: 0,
11888
+ timerBusy: false,
11888
11889
  start: function () {
11889
11890
  var _start = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
11890
11891
  var error;
@@ -11967,7 +11968,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11967
11968
  _context2.n = 1;
11968
11969
  break;
11969
11970
  }
11970
- statCollector.logger.error(LOG_PREFIX, "Can't update WebRTC metrics sending: no parameters passed");
11971
+ statCollector.logger.error(LOG_PREFIX + "-" + statCollector.id, "Can't update WebRTC metrics sending: no parameters passed");
11971
11972
  return _context2.a(2);
11972
11973
  case 1:
11973
11974
  if (!(description.types || description.compression)) {
@@ -12027,14 +12028,26 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12027
12028
  }(),
12028
12029
  updateHeaders: function () {
12029
12030
  var _updateHeaders = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
12030
- var stats;
12031
+ var stats,
12032
+ currentHeaders,
12033
+ headersChanged,
12034
+ newMetrics,
12035
+ _args3 = arguments;
12031
12036
  return _regenerator().w(function (_context3) {
12032
12037
  while (1) switch (_context3.n) {
12033
12038
  case 0:
12039
+ stats = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : null;
12040
+ currentHeaders = "";
12041
+ headersChanged = false;
12042
+ if (stats) {
12043
+ _context3.n = 2;
12044
+ break;
12045
+ }
12034
12046
  _context3.n = 1;
12035
12047
  return statCollector.mediaConnection.getWebRTCStats();
12036
12048
  case 1:
12037
12049
  stats = _context3.v;
12050
+ case 2:
12038
12051
  Object.keys(statCollector.description.types).forEach(function (type) {
12039
12052
  var typeDescriptor = statCollector.description.types[type];
12040
12053
  var metricsString = "";
@@ -12047,11 +12060,11 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12047
12060
  }
12048
12061
  if (stats[type]) {
12049
12062
  stats[type].forEach(function (report) {
12050
- statCollector.logger.debug(LOG_PREFIX, type + " report: " + JSON.stringify(report));
12063
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, type + " report: " + JSON.stringify(report));
12051
12064
  if (contentFilters) {
12052
12065
  var filtersMatched = true;
12053
12066
  for (var filter in contentFilters) {
12054
- statCollector.logger.debug(LOG_PREFIX, type + " filter by " + filter + ": " + JSON.stringify(contentFilters[filter]));
12067
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, type + " filter by " + filter + ": " + JSON.stringify(contentFilters[filter]));
12055
12068
  var filterMatched = false;
12056
12069
  if (report[filter]) {
12057
12070
  var _iterator = _createForOfIteratorHelper(contentFilters[filter]),
@@ -12059,7 +12072,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12059
12072
  try {
12060
12073
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
12061
12074
  var value = _step.value;
12062
- statCollector.logger.debug(LOG_PREFIX, filter + ": " + value + " <> " + report[filter]);
12075
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, filter + ": " + value + " <> " + report[filter]);
12063
12076
  if (report[filter] === value) {
12064
12077
  filterMatched = true;
12065
12078
  break;
@@ -12077,18 +12090,30 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12077
12090
  }
12078
12091
  }
12079
12092
  if (filtersMatched) {
12080
- statCollector.addHeaders(report, metricsString);
12093
+ currentHeaders = statCollector.addHeaders(currentHeaders, report, metricsString);
12081
12094
  }
12082
12095
  } else {
12083
- statCollector.addHeaders(report, metricsString);
12096
+ currentHeaders = statCollector.addHeaders(currentHeaders, report, metricsString);
12084
12097
  }
12085
12098
  });
12086
12099
  } else {
12087
- statCollector.logger.warn(LOG_PREFIX, "No report type found in RTC stats: '" + type + "'");
12100
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, "No report type found in RTC stats: '" + type + "'");
12088
12101
  }
12089
12102
  });
12090
- case 2:
12091
- return _context3.a(2);
12103
+ if (currentHeaders !== statCollector.headers) {
12104
+ headersChanged = true;
12105
+ newMetrics = [];
12106
+ currentHeaders.split(",").forEach(function (header) {
12107
+ if (statCollector.headers.indexOf(header) === -1) {
12108
+ newMetrics.push(header);
12109
+ }
12110
+ });
12111
+ if (newMetrics.length) {
12112
+ statCollector.logger.info(LOG_PREFIX + "-" + statCollector.id, "RTC metrics to be collected: " + newMetrics.toString());
12113
+ }
12114
+ statCollector.headers = currentHeaders;
12115
+ }
12116
+ return _context3.a(2, headersChanged);
12092
12117
  }
12093
12118
  }, _callee3);
12094
12119
  }));
@@ -12097,24 +12122,20 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12097
12122
  }
12098
12123
  return updateHeaders;
12099
12124
  }(),
12100
- addHeaders: function addHeaders(report, metricsString) {
12125
+ addHeaders: function addHeaders(currentHeaders, report, metricsString) {
12101
12126
  if (metricsString) {
12102
12127
  var metrics = metricsString.split(",");
12103
12128
  metrics.forEach(function (metric) {
12104
- var metricFound = false;
12105
12129
  for (var _i = 0, _Object$keys = Object.keys(report); _i < _Object$keys.length; _i++) {
12106
12130
  var key = _Object$keys[_i];
12107
12131
  if (metric === key) {
12108
- statCollector.headers = util.addFieldToCsvString(statCollector.headers, report.type + "." + report.id + "." + metric, ",");
12109
- metricFound = true;
12132
+ currentHeaders = util.addFieldToCsvString(currentHeaders, report.type + "." + report.id + "." + metric, ",");
12110
12133
  break;
12111
12134
  }
12112
12135
  }
12113
- if (!metricFound) {
12114
- statCollector.logger.warn(LOG_PREFIX, "No metric found in RTC stats report '" + report.type + "': '" + metric + "'");
12115
- }
12116
12136
  });
12117
12137
  }
12138
+ return currentHeaders;
12118
12139
  },
12119
12140
  updateCompression: function () {
12120
12141
  var _updateCompression = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {
@@ -12167,7 +12188,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12167
12188
  case 2:
12168
12189
  _context5.p = 2;
12169
12190
  _t2 = _context5.v;
12170
- statCollector.logger.warn(LOG_PREFIX, "Can't compress metrics data using " + compression + ": " + _t2);
12191
+ statCollector.logger.warn(LOG_PREFIX + "-" + statCollector.id, "Can't compress metrics data using " + compression + ": " + _t2);
12171
12192
  statCollector.compression = "none";
12172
12193
  case 3:
12173
12194
  return _context5.a(2);
@@ -12188,7 +12209,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12188
12209
  statCollector.send("webRTCMetricsClientDescription", data);
12189
12210
  },
12190
12211
  send: function send(message, data) {
12191
- statCollector.logger.debug(LOG_PREFIX, data);
12212
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, data);
12192
12213
  if (statCollector.wsConnection.readyState === WebSocket.OPEN) {
12193
12214
  statCollector.wsConnection.send(JSON.stringify({
12194
12215
  message: message,
@@ -12211,14 +12232,17 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12211
12232
  },
12212
12233
  collectMetrics: function () {
12213
12234
  var _collectMetrics = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6() {
12214
- var stats, metrics;
12235
+ var stats, metrics, lostMetrics;
12215
12236
  return _regenerator().w(function (_context6) {
12216
12237
  while (1) switch (_context6.n) {
12217
12238
  case 0:
12218
- if (!statCollector.timer) {
12219
- _context6.n = 2;
12239
+ if (!(statCollector.timer && !statCollector.timerBusy)) {
12240
+ _context6.n = 6;
12220
12241
  break;
12221
12242
  }
12243
+ // Unfortunately there are no real atomics in JS unless SharedArrayBuffer is used
12244
+ // So we guard the timer callback with a dumb boolean
12245
+ statCollector.timerBusy = true;
12222
12246
  _context6.n = 1;
12223
12247
  return statCollector.mediaConnection.getWebRTCStats();
12224
12248
  case 1:
@@ -12227,6 +12251,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12227
12251
  statCollector.metricsBatch = [];
12228
12252
  }
12229
12253
  metrics = [];
12254
+ lostMetrics = [];
12230
12255
  statCollector.headers.split(",").forEach(function (header) {
12231
12256
  var components = header.split(".");
12232
12257
  var descriptor = {
@@ -12234,7 +12259,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12234
12259
  id: components[1],
12235
12260
  name: components[2]
12236
12261
  };
12237
- var value = "undefined";
12262
+ var value = "NO";
12238
12263
  if (stats[descriptor.type]) {
12239
12264
  var _iterator2 = _createForOfIteratorHelper(stats[descriptor.type]),
12240
12265
  _step2;
@@ -12253,7 +12278,13 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12253
12278
  }
12254
12279
  }
12255
12280
  metrics.push(value);
12281
+ if (value == "NO") {
12282
+ lostMetrics.push(descriptor);
12283
+ }
12256
12284
  });
12285
+ if (lostMetrics.length) {
12286
+ statCollector.logger.info(LOG_PREFIX + "-" + statCollector.id, "Missing metrics: " + JSON.stringify(lostMetrics));
12287
+ }
12257
12288
  statCollector.metricsBatch.push(metrics);
12258
12289
  statCollector.batchCount--;
12259
12290
  if (!(statCollector.batchCount === 0)) {
@@ -12263,6 +12294,21 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12263
12294
  _context6.n = 2;
12264
12295
  return statCollector.sendMetrics();
12265
12296
  case 2:
12297
+ _context6.n = 3;
12298
+ return statCollector.updateHeaders(stats);
12299
+ case 3:
12300
+ if (!_context6.v) {
12301
+ _context6.n = 5;
12302
+ break;
12303
+ }
12304
+ statCollector.logger.info(LOG_PREFIX + "-" + statCollector.id, "RTC metrics list has changed, sending a new metrics description");
12305
+ _context6.n = 4;
12306
+ return statCollector.sendMetrics();
12307
+ case 4:
12308
+ statCollector.sendHeaders();
12309
+ case 5:
12310
+ statCollector.timerBusy = false;
12311
+ case 6:
12266
12312
  return _context6.a(2);
12267
12313
  }
12268
12314
  }, _callee6);
@@ -12274,7 +12320,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12274
12320
  }(),
12275
12321
  sendMetrics: function () {
12276
12322
  var _sendMetrics = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee7() {
12277
- var previous, metricsToSend, metricsData, i, metricsString, j, valueString, previousString, separator, data, _t3;
12323
+ var previous, metricsToSend, metricsData, i, metricsString, j, valueString, previousString, delimiter, data, _t3;
12278
12324
  return _regenerator().w(function (_context7) {
12279
12325
  while (1) switch (_context7.p = _context7.n) {
12280
12326
  case 0:
@@ -12284,14 +12330,17 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12284
12330
  for (j = 0; j < statCollector.metricsBatch[i].length; j++) {
12285
12331
  valueString = valueToString(statCollector.metricsBatch[i][j]);
12286
12332
  previousString = "";
12287
- separator = ";";
12333
+ delimiter = ";";
12288
12334
  if (previous) {
12289
12335
  previousString = valueToString(previous[j]);
12290
12336
  }
12291
12337
  if (valueString === previousString) {
12292
12338
  valueString = "";
12293
12339
  }
12294
- metricsString = util.addFieldToCsvString(metricsString, valueString, separator);
12340
+ metricsString = util.addFieldToCsvString(metricsString, valueString, delimiter);
12341
+ if (j > 0 && metricsString === "") {
12342
+ metricsString = delimiter;
12343
+ }
12295
12344
  }
12296
12345
  previous = statCollector.metricsBatch[i];
12297
12346
  metricsToSend.push(metricsString);
@@ -12310,7 +12359,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12310
12359
  case 3:
12311
12360
  _context7.p = 3;
12312
12361
  _t3 = _context7.v;
12313
- statCollector.logger.warn(LOG_PREFIX, "Can't send metrics data using" + statCollector.compression + ": " + _t3);
12362
+ statCollector.logger.warn(LOG_PREFIX + "-" + statCollector.id, "Can't send metrics data using" + statCollector.compression + ": " + _t3);
12314
12363
  metricsData = null;
12315
12364
  case 4:
12316
12365
  _context7.n = 6;
@@ -12862,14 +12911,14 @@ var setPublishingBitrate = function setPublishingBitrate(sdp, mediaConnection, m
12862
12911
  }
12863
12912
  return sdp;
12864
12913
  };
12865
- var addFieldToCsvString = function addFieldToCsvString(csvString, field, separator) {
12866
- if (field !== "" && field.indexOf(separator) >= 0) {
12914
+ var addFieldToCsvString = function addFieldToCsvString(csvString, field, delimiter) {
12915
+ if (field !== "" && field.indexOf(delimiter) >= 0) {
12867
12916
  field = '"' + field + '"';
12868
12917
  }
12869
- if (csvString === "" && field !== "") {
12918
+ if (csvString === "") {
12870
12919
  csvString = field;
12871
12920
  } else {
12872
- csvString = csvString + separator + field;
12921
+ csvString = csvString + delimiter + field;
12873
12922
  }
12874
12923
  return csvString;
12875
12924
  };