@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.
@@ -11047,6 +11047,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11047
11047
  metricsBatch: null,
11048
11048
  timer: null,
11049
11049
  batchCount: 0,
11050
+ timerBusy: false,
11050
11051
  start: function () {
11051
11052
  var _start = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
11052
11053
  var error;
@@ -11129,7 +11130,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11129
11130
  _context2.n = 1;
11130
11131
  break;
11131
11132
  }
11132
- statCollector.logger.error(LOG_PREFIX, "Can't update WebRTC metrics sending: no parameters passed");
11133
+ statCollector.logger.error(LOG_PREFIX + "-" + statCollector.id, "Can't update WebRTC metrics sending: no parameters passed");
11133
11134
  return _context2.a(2);
11134
11135
  case 1:
11135
11136
  if (!(description.types || description.compression)) {
@@ -11189,14 +11190,26 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11189
11190
  }(),
11190
11191
  updateHeaders: function () {
11191
11192
  var _updateHeaders = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
11192
- var stats;
11193
+ var stats,
11194
+ currentHeaders,
11195
+ headersChanged,
11196
+ newMetrics,
11197
+ _args3 = arguments;
11193
11198
  return _regenerator().w(function (_context3) {
11194
11199
  while (1) switch (_context3.n) {
11195
11200
  case 0:
11201
+ stats = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : null;
11202
+ currentHeaders = "";
11203
+ headersChanged = false;
11204
+ if (stats) {
11205
+ _context3.n = 2;
11206
+ break;
11207
+ }
11196
11208
  _context3.n = 1;
11197
11209
  return statCollector.mediaConnection.getWebRTCStats();
11198
11210
  case 1:
11199
11211
  stats = _context3.v;
11212
+ case 2:
11200
11213
  Object.keys(statCollector.description.types).forEach(function (type) {
11201
11214
  var typeDescriptor = statCollector.description.types[type];
11202
11215
  var metricsString = "";
@@ -11209,11 +11222,11 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11209
11222
  }
11210
11223
  if (stats[type]) {
11211
11224
  stats[type].forEach(function (report) {
11212
- statCollector.logger.debug(LOG_PREFIX, type + " report: " + JSON.stringify(report));
11225
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, type + " report: " + JSON.stringify(report));
11213
11226
  if (contentFilters) {
11214
11227
  var filtersMatched = true;
11215
11228
  for (var filter in contentFilters) {
11216
- statCollector.logger.debug(LOG_PREFIX, type + " filter by " + filter + ": " + JSON.stringify(contentFilters[filter]));
11229
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, type + " filter by " + filter + ": " + JSON.stringify(contentFilters[filter]));
11217
11230
  var filterMatched = false;
11218
11231
  if (report[filter]) {
11219
11232
  var _iterator = _createForOfIteratorHelper(contentFilters[filter]),
@@ -11221,7 +11234,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11221
11234
  try {
11222
11235
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
11223
11236
  var value = _step.value;
11224
- statCollector.logger.debug(LOG_PREFIX, filter + ": " + value + " <> " + report[filter]);
11237
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, filter + ": " + value + " <> " + report[filter]);
11225
11238
  if (report[filter] === value) {
11226
11239
  filterMatched = true;
11227
11240
  break;
@@ -11239,18 +11252,30 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11239
11252
  }
11240
11253
  }
11241
11254
  if (filtersMatched) {
11242
- statCollector.addHeaders(report, metricsString);
11255
+ currentHeaders = statCollector.addHeaders(currentHeaders, report, metricsString);
11243
11256
  }
11244
11257
  } else {
11245
- statCollector.addHeaders(report, metricsString);
11258
+ currentHeaders = statCollector.addHeaders(currentHeaders, report, metricsString);
11246
11259
  }
11247
11260
  });
11248
11261
  } else {
11249
- statCollector.logger.warn(LOG_PREFIX, "No report type found in RTC stats: '" + type + "'");
11262
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, "No report type found in RTC stats: '" + type + "'");
11250
11263
  }
11251
11264
  });
11252
- case 2:
11253
- return _context3.a(2);
11265
+ if (currentHeaders !== statCollector.headers) {
11266
+ headersChanged = true;
11267
+ newMetrics = [];
11268
+ currentHeaders.split(",").forEach(function (header) {
11269
+ if (statCollector.headers.indexOf(header) === -1) {
11270
+ newMetrics.push(header);
11271
+ }
11272
+ });
11273
+ if (newMetrics.length) {
11274
+ statCollector.logger.info(LOG_PREFIX + "-" + statCollector.id, "RTC metrics to be collected: " + newMetrics.toString());
11275
+ }
11276
+ statCollector.headers = currentHeaders;
11277
+ }
11278
+ return _context3.a(2, headersChanged);
11254
11279
  }
11255
11280
  }, _callee3);
11256
11281
  }));
@@ -11259,24 +11284,20 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11259
11284
  }
11260
11285
  return updateHeaders;
11261
11286
  }(),
11262
- addHeaders: function addHeaders(report, metricsString) {
11287
+ addHeaders: function addHeaders(currentHeaders, report, metricsString) {
11263
11288
  if (metricsString) {
11264
11289
  var metrics = metricsString.split(",");
11265
11290
  metrics.forEach(function (metric) {
11266
- var metricFound = false;
11267
11291
  for (var _i = 0, _Object$keys = Object.keys(report); _i < _Object$keys.length; _i++) {
11268
11292
  var key = _Object$keys[_i];
11269
11293
  if (metric === key) {
11270
- statCollector.headers = util.addFieldToCsvString(statCollector.headers, report.type + "." + report.id + "." + metric, ",");
11271
- metricFound = true;
11294
+ currentHeaders = util.addFieldToCsvString(currentHeaders, report.type + "." + report.id + "." + metric, ",");
11272
11295
  break;
11273
11296
  }
11274
11297
  }
11275
- if (!metricFound) {
11276
- statCollector.logger.warn(LOG_PREFIX, "No metric found in RTC stats report '" + report.type + "': '" + metric + "'");
11277
- }
11278
11298
  });
11279
11299
  }
11300
+ return currentHeaders;
11280
11301
  },
11281
11302
  updateCompression: function () {
11282
11303
  var _updateCompression = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {
@@ -11329,7 +11350,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11329
11350
  case 2:
11330
11351
  _context5.p = 2;
11331
11352
  _t2 = _context5.v;
11332
- statCollector.logger.warn(LOG_PREFIX, "Can't compress metrics data using " + compression + ": " + _t2);
11353
+ statCollector.logger.warn(LOG_PREFIX + "-" + statCollector.id, "Can't compress metrics data using " + compression + ": " + _t2);
11333
11354
  statCollector.compression = "none";
11334
11355
  case 3:
11335
11356
  return _context5.a(2);
@@ -11350,7 +11371,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11350
11371
  statCollector.send("webRTCMetricsClientDescription", data);
11351
11372
  },
11352
11373
  send: function send(message, data) {
11353
- statCollector.logger.debug(LOG_PREFIX, data);
11374
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, data);
11354
11375
  if (statCollector.wsConnection.readyState === WebSocket.OPEN) {
11355
11376
  statCollector.wsConnection.send(JSON.stringify({
11356
11377
  message: message,
@@ -11373,22 +11394,24 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11373
11394
  },
11374
11395
  collectMetrics: function () {
11375
11396
  var _collectMetrics = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6() {
11376
- var stats, metrics;
11397
+ var stats, metrics, lostMetrics, headersUpdated;
11377
11398
  return _regenerator().w(function (_context6) {
11378
11399
  while (1) switch (_context6.n) {
11379
11400
  case 0:
11380
- if (!statCollector.timer) {
11381
- _context6.n = 2;
11401
+ if (!(statCollector.timer && !statCollector.timerBusy)) {
11402
+ _context6.n = 6;
11382
11403
  break;
11383
11404
  }
11405
+ // Unfortunately there are no real atomics in JS unless SharedArrayBuffer is used
11406
+ // So we guard the timer callback with a dumb boolean
11407
+ statCollector.timerBusy = true;
11384
11408
  _context6.n = 1;
11385
11409
  return statCollector.mediaConnection.getWebRTCStats();
11386
11410
  case 1:
11387
11411
  stats = _context6.v;
11388
- if (!statCollector.metricsBatch) {
11389
- statCollector.metricsBatch = [];
11390
- }
11412
+ statCollector.startNewBatch();
11391
11413
  metrics = [];
11414
+ lostMetrics = [];
11392
11415
  statCollector.headers.split(",").forEach(function (header) {
11393
11416
  var components = header.split(".");
11394
11417
  var descriptor = {
@@ -11396,7 +11419,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11396
11419
  id: components[1],
11397
11420
  name: components[2]
11398
11421
  };
11399
- var value = "undefined";
11422
+ var value = null;
11400
11423
  if (stats[descriptor.type]) {
11401
11424
  var _iterator2 = _createForOfIteratorHelper(stats[descriptor.type]),
11402
11425
  _step2;
@@ -11414,17 +11437,46 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11414
11437
  _iterator2.f();
11415
11438
  }
11416
11439
  }
11417
- metrics.push(value);
11440
+ if (value === null) {
11441
+ lostMetrics.push(descriptor);
11442
+ } else {
11443
+ metrics.push(value);
11444
+ }
11418
11445
  });
11446
+ // Metrics list may change if some metrics are added or some metrics are lost #WCS-4627
11447
+ _context6.n = 2;
11448
+ return statCollector.updateHeaders(stats);
11449
+ case 2:
11450
+ headersUpdated = _context6.v;
11451
+ if (!lostMetrics.length) {
11452
+ _context6.n = 4;
11453
+ break;
11454
+ }
11455
+ statCollector.logger.info(LOG_PREFIX + "-" + statCollector.id, "Missing metrics: " + JSON.stringify(lostMetrics));
11456
+ // Send metrics already collected and start a new batch with current metrics array to send them later #WCS-4627
11457
+ _context6.n = 3;
11458
+ return statCollector.sendMetrics();
11459
+ case 3:
11460
+ statCollector.startNewBatch(metrics);
11461
+ _context6.n = 5;
11462
+ break;
11463
+ case 4:
11419
11464
  statCollector.metricsBatch.push(metrics);
11420
11465
  statCollector.batchCount--;
11421
- if (!(statCollector.batchCount === 0)) {
11422
- _context6.n = 2;
11466
+ if (!(statCollector.batchCount === 0 || headersUpdated)) {
11467
+ _context6.n = 5;
11423
11468
  break;
11424
11469
  }
11425
- _context6.n = 2;
11470
+ _context6.n = 5;
11426
11471
  return statCollector.sendMetrics();
11427
- case 2:
11472
+ case 5:
11473
+ // Check if metrics list changed and send a new headers if needed #WCS-4619
11474
+ if (headersUpdated) {
11475
+ statCollector.logger.info(LOG_PREFIX + "-" + statCollector.id, "RTC metrics list has changed, sending a new metrics description");
11476
+ statCollector.sendHeaders();
11477
+ }
11478
+ statCollector.timerBusy = false;
11479
+ case 6:
11428
11480
  return _context6.a(2);
11429
11481
  }
11430
11482
  }, _callee6);
@@ -11441,7 +11493,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11441
11493
  while (1) switch (_context7.p = _context7.n) {
11442
11494
  case 0:
11443
11495
  metricsToSend = [];
11444
- for (i = 0; i < statCollector.metricsBatch.length; i++) {
11496
+ for (i = 0; statCollector.metricsBatch && i < statCollector.metricsBatch.length; i++) {
11445
11497
  metricsString = "";
11446
11498
  for (j = 0; j < statCollector.metricsBatch[i].length; j++) {
11447
11499
  valueString = valueToString(statCollector.metricsBatch[i][j]);
@@ -11475,7 +11527,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11475
11527
  case 3:
11476
11528
  _context7.p = 3;
11477
11529
  _t3 = _context7.v;
11478
- statCollector.logger.warn(LOG_PREFIX, "Can't send metrics data using" + statCollector.compression + ": " + _t3);
11530
+ statCollector.logger.warn(LOG_PREFIX + "-" + statCollector.id, "Can't send metrics data using" + statCollector.compression + ": " + _t3);
11479
11531
  metricsData = null;
11480
11532
  case 4:
11481
11533
  _context7.n = 6;
@@ -11490,8 +11542,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11490
11542
  };
11491
11543
  statCollector.send("webRTCMetricsBatch", data);
11492
11544
  }
11493
- statCollector.metricsBatch = null;
11494
- statCollector.batchCount = statCollector.description.batchSize;
11545
+ statCollector.cleanBatch();
11495
11546
  case 7:
11496
11547
  return _context7.a(2);
11497
11548
  }
@@ -11501,7 +11552,21 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11501
11552
  return _sendMetrics.apply(this, arguments);
11502
11553
  }
11503
11554
  return sendMetrics;
11504
- }()
11555
+ }(),
11556
+ startNewBatch: function startNewBatch(metrics) {
11557
+ if (!statCollector.metricsBatch) {
11558
+ statCollector.metricsBatch = [];
11559
+ if (metrics) {
11560
+ statCollector.metricsBatch.push(metrics);
11561
+ }
11562
+ }
11563
+ },
11564
+ cleanBatch: function cleanBatch() {
11565
+ if (statCollector.metricsBatch) {
11566
+ statCollector.metricsBatch = null;
11567
+ statCollector.batchCount = statCollector.description.batchSize;
11568
+ }
11569
+ }
11505
11570
  };
11506
11571
  return statCollector;
11507
11572
  };