@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.
@@ -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,22 +12232,24 @@ 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, headersUpdated;
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:
12225
12249
  stats = _context6.v;
12226
- if (!statCollector.metricsBatch) {
12227
- statCollector.metricsBatch = [];
12228
- }
12250
+ statCollector.startNewBatch();
12229
12251
  metrics = [];
12252
+ lostMetrics = [];
12230
12253
  statCollector.headers.split(",").forEach(function (header) {
12231
12254
  var components = header.split(".");
12232
12255
  var descriptor = {
@@ -12234,7 +12257,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12234
12257
  id: components[1],
12235
12258
  name: components[2]
12236
12259
  };
12237
- var value = "undefined";
12260
+ var value = null;
12238
12261
  if (stats[descriptor.type]) {
12239
12262
  var _iterator2 = _createForOfIteratorHelper(stats[descriptor.type]),
12240
12263
  _step2;
@@ -12252,17 +12275,46 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12252
12275
  _iterator2.f();
12253
12276
  }
12254
12277
  }
12255
- metrics.push(value);
12278
+ if (value === null) {
12279
+ lostMetrics.push(descriptor);
12280
+ } else {
12281
+ metrics.push(value);
12282
+ }
12256
12283
  });
12284
+ // Metrics list may change if some metrics are added or some metrics are lost #WCS-4627
12285
+ _context6.n = 2;
12286
+ return statCollector.updateHeaders(stats);
12287
+ case 2:
12288
+ headersUpdated = _context6.v;
12289
+ if (!lostMetrics.length) {
12290
+ _context6.n = 4;
12291
+ break;
12292
+ }
12293
+ statCollector.logger.info(LOG_PREFIX + "-" + statCollector.id, "Missing metrics: " + JSON.stringify(lostMetrics));
12294
+ // Send metrics already collected and start a new batch with current metrics array to send them later #WCS-4627
12295
+ _context6.n = 3;
12296
+ return statCollector.sendMetrics();
12297
+ case 3:
12298
+ statCollector.startNewBatch(metrics);
12299
+ _context6.n = 5;
12300
+ break;
12301
+ case 4:
12257
12302
  statCollector.metricsBatch.push(metrics);
12258
12303
  statCollector.batchCount--;
12259
- if (!(statCollector.batchCount === 0)) {
12260
- _context6.n = 2;
12304
+ if (!(statCollector.batchCount === 0 || headersUpdated)) {
12305
+ _context6.n = 5;
12261
12306
  break;
12262
12307
  }
12263
- _context6.n = 2;
12308
+ _context6.n = 5;
12264
12309
  return statCollector.sendMetrics();
12265
- case 2:
12310
+ case 5:
12311
+ // Check if metrics list changed and send a new headers if needed #WCS-4619
12312
+ if (headersUpdated) {
12313
+ statCollector.logger.info(LOG_PREFIX + "-" + statCollector.id, "RTC metrics list has changed, sending a new metrics description");
12314
+ statCollector.sendHeaders();
12315
+ }
12316
+ statCollector.timerBusy = false;
12317
+ case 6:
12266
12318
  return _context6.a(2);
12267
12319
  }
12268
12320
  }, _callee6);
@@ -12279,7 +12331,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12279
12331
  while (1) switch (_context7.p = _context7.n) {
12280
12332
  case 0:
12281
12333
  metricsToSend = [];
12282
- for (i = 0; i < statCollector.metricsBatch.length; i++) {
12334
+ for (i = 0; statCollector.metricsBatch && i < statCollector.metricsBatch.length; i++) {
12283
12335
  metricsString = "";
12284
12336
  for (j = 0; j < statCollector.metricsBatch[i].length; j++) {
12285
12337
  valueString = valueToString(statCollector.metricsBatch[i][j]);
@@ -12313,7 +12365,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12313
12365
  case 3:
12314
12366
  _context7.p = 3;
12315
12367
  _t3 = _context7.v;
12316
- statCollector.logger.warn(LOG_PREFIX, "Can't send metrics data using" + statCollector.compression + ": " + _t3);
12368
+ statCollector.logger.warn(LOG_PREFIX + "-" + statCollector.id, "Can't send metrics data using" + statCollector.compression + ": " + _t3);
12317
12369
  metricsData = null;
12318
12370
  case 4:
12319
12371
  _context7.n = 6;
@@ -12328,8 +12380,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12328
12380
  };
12329
12381
  statCollector.send("webRTCMetricsBatch", data);
12330
12382
  }
12331
- statCollector.metricsBatch = null;
12332
- statCollector.batchCount = statCollector.description.batchSize;
12383
+ statCollector.cleanBatch();
12333
12384
  case 7:
12334
12385
  return _context7.a(2);
12335
12386
  }
@@ -12339,7 +12390,21 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
12339
12390
  return _sendMetrics.apply(this, arguments);
12340
12391
  }
12341
12392
  return sendMetrics;
12342
- }()
12393
+ }(),
12394
+ startNewBatch: function startNewBatch(metrics) {
12395
+ if (!statCollector.metricsBatch) {
12396
+ statCollector.metricsBatch = [];
12397
+ if (metrics) {
12398
+ statCollector.metricsBatch.push(metrics);
12399
+ }
12400
+ }
12401
+ },
12402
+ cleanBatch: function cleanBatch() {
12403
+ if (statCollector.metricsBatch) {
12404
+ statCollector.metricsBatch = null;
12405
+ statCollector.batchCount = statCollector.description.batchSize;
12406
+ }
12407
+ }
12343
12408
  };
12344
12409
  return statCollector;
12345
12410
  };