@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.
@@ -11057,6 +11057,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11057
11057
  metricsBatch: null,
11058
11058
  timer: null,
11059
11059
  batchCount: 0,
11060
+ timerBusy: false,
11060
11061
  start: function () {
11061
11062
  var _start = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
11062
11063
  var error;
@@ -11139,7 +11140,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11139
11140
  _context2.n = 1;
11140
11141
  break;
11141
11142
  }
11142
- statCollector.logger.error(LOG_PREFIX, "Can't update WebRTC metrics sending: no parameters passed");
11143
+ statCollector.logger.error(LOG_PREFIX + "-" + statCollector.id, "Can't update WebRTC metrics sending: no parameters passed");
11143
11144
  return _context2.a(2);
11144
11145
  case 1:
11145
11146
  if (!(description.types || description.compression)) {
@@ -11199,14 +11200,26 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11199
11200
  }(),
11200
11201
  updateHeaders: function () {
11201
11202
  var _updateHeaders = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
11202
- var stats;
11203
+ var stats,
11204
+ currentHeaders,
11205
+ headersChanged,
11206
+ newMetrics,
11207
+ _args3 = arguments;
11203
11208
  return _regenerator().w(function (_context3) {
11204
11209
  while (1) switch (_context3.n) {
11205
11210
  case 0:
11211
+ stats = _args3.length > 0 && _args3[0] !== undefined ? _args3[0] : null;
11212
+ currentHeaders = "";
11213
+ headersChanged = false;
11214
+ if (stats) {
11215
+ _context3.n = 2;
11216
+ break;
11217
+ }
11206
11218
  _context3.n = 1;
11207
11219
  return statCollector.mediaConnection.getWebRTCStats();
11208
11220
  case 1:
11209
11221
  stats = _context3.v;
11222
+ case 2:
11210
11223
  Object.keys(statCollector.description.types).forEach(function (type) {
11211
11224
  var typeDescriptor = statCollector.description.types[type];
11212
11225
  var metricsString = "";
@@ -11219,11 +11232,11 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11219
11232
  }
11220
11233
  if (stats[type]) {
11221
11234
  stats[type].forEach(function (report) {
11222
- statCollector.logger.debug(LOG_PREFIX, type + " report: " + JSON.stringify(report));
11235
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, type + " report: " + JSON.stringify(report));
11223
11236
  if (contentFilters) {
11224
11237
  var filtersMatched = true;
11225
11238
  for (var filter in contentFilters) {
11226
- statCollector.logger.debug(LOG_PREFIX, type + " filter by " + filter + ": " + JSON.stringify(contentFilters[filter]));
11239
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, type + " filter by " + filter + ": " + JSON.stringify(contentFilters[filter]));
11227
11240
  var filterMatched = false;
11228
11241
  if (report[filter]) {
11229
11242
  var _iterator = _createForOfIteratorHelper(contentFilters[filter]),
@@ -11231,7 +11244,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11231
11244
  try {
11232
11245
  for (_iterator.s(); !(_step = _iterator.n()).done;) {
11233
11246
  var value = _step.value;
11234
- statCollector.logger.debug(LOG_PREFIX, filter + ": " + value + " <> " + report[filter]);
11247
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, filter + ": " + value + " <> " + report[filter]);
11235
11248
  if (report[filter] === value) {
11236
11249
  filterMatched = true;
11237
11250
  break;
@@ -11249,18 +11262,30 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11249
11262
  }
11250
11263
  }
11251
11264
  if (filtersMatched) {
11252
- statCollector.addHeaders(report, metricsString);
11265
+ currentHeaders = statCollector.addHeaders(currentHeaders, report, metricsString);
11253
11266
  }
11254
11267
  } else {
11255
- statCollector.addHeaders(report, metricsString);
11268
+ currentHeaders = statCollector.addHeaders(currentHeaders, report, metricsString);
11256
11269
  }
11257
11270
  });
11258
11271
  } else {
11259
- statCollector.logger.warn(LOG_PREFIX, "No report type found in RTC stats: '" + type + "'");
11272
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, "No report type found in RTC stats: '" + type + "'");
11260
11273
  }
11261
11274
  });
11262
- case 2:
11263
- return _context3.a(2);
11275
+ if (currentHeaders !== statCollector.headers) {
11276
+ headersChanged = true;
11277
+ newMetrics = [];
11278
+ currentHeaders.split(",").forEach(function (header) {
11279
+ if (statCollector.headers.indexOf(header) === -1) {
11280
+ newMetrics.push(header);
11281
+ }
11282
+ });
11283
+ if (newMetrics.length) {
11284
+ statCollector.logger.info(LOG_PREFIX + "-" + statCollector.id, "RTC metrics to be collected: " + newMetrics.toString());
11285
+ }
11286
+ statCollector.headers = currentHeaders;
11287
+ }
11288
+ return _context3.a(2, headersChanged);
11264
11289
  }
11265
11290
  }, _callee3);
11266
11291
  }));
@@ -11269,24 +11294,20 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11269
11294
  }
11270
11295
  return updateHeaders;
11271
11296
  }(),
11272
- addHeaders: function addHeaders(report, metricsString) {
11297
+ addHeaders: function addHeaders(currentHeaders, report, metricsString) {
11273
11298
  if (metricsString) {
11274
11299
  var metrics = metricsString.split(",");
11275
11300
  metrics.forEach(function (metric) {
11276
- var metricFound = false;
11277
11301
  for (var _i = 0, _Object$keys = Object.keys(report); _i < _Object$keys.length; _i++) {
11278
11302
  var key = _Object$keys[_i];
11279
11303
  if (metric === key) {
11280
- statCollector.headers = util.addFieldToCsvString(statCollector.headers, report.type + "." + report.id + "." + metric, ",");
11281
- metricFound = true;
11304
+ currentHeaders = util.addFieldToCsvString(currentHeaders, report.type + "." + report.id + "." + metric, ",");
11282
11305
  break;
11283
11306
  }
11284
11307
  }
11285
- if (!metricFound) {
11286
- statCollector.logger.warn(LOG_PREFIX, "No metric found in RTC stats report '" + report.type + "': '" + metric + "'");
11287
- }
11288
11308
  });
11289
11309
  }
11310
+ return currentHeaders;
11290
11311
  },
11291
11312
  updateCompression: function () {
11292
11313
  var _updateCompression = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {
@@ -11339,7 +11360,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11339
11360
  case 2:
11340
11361
  _context5.p = 2;
11341
11362
  _t2 = _context5.v;
11342
- statCollector.logger.warn(LOG_PREFIX, "Can't compress metrics data using " + compression + ": " + _t2);
11363
+ statCollector.logger.warn(LOG_PREFIX + "-" + statCollector.id, "Can't compress metrics data using " + compression + ": " + _t2);
11343
11364
  statCollector.compression = "none";
11344
11365
  case 3:
11345
11366
  return _context5.a(2);
@@ -11360,7 +11381,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11360
11381
  statCollector.send("webRTCMetricsClientDescription", data);
11361
11382
  },
11362
11383
  send: function send(message, data) {
11363
- statCollector.logger.debug(LOG_PREFIX, data);
11384
+ statCollector.logger.debug(LOG_PREFIX + "-" + statCollector.id, data);
11364
11385
  if (statCollector.wsConnection.readyState === WebSocket.OPEN) {
11365
11386
  statCollector.wsConnection.send(JSON.stringify({
11366
11387
  message: message,
@@ -11383,22 +11404,24 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11383
11404
  },
11384
11405
  collectMetrics: function () {
11385
11406
  var _collectMetrics = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6() {
11386
- var stats, metrics;
11407
+ var stats, metrics, lostMetrics, headersUpdated;
11387
11408
  return _regenerator().w(function (_context6) {
11388
11409
  while (1) switch (_context6.n) {
11389
11410
  case 0:
11390
- if (!statCollector.timer) {
11391
- _context6.n = 2;
11411
+ if (!(statCollector.timer && !statCollector.timerBusy)) {
11412
+ _context6.n = 6;
11392
11413
  break;
11393
11414
  }
11415
+ // Unfortunately there are no real atomics in JS unless SharedArrayBuffer is used
11416
+ // So we guard the timer callback with a dumb boolean
11417
+ statCollector.timerBusy = true;
11394
11418
  _context6.n = 1;
11395
11419
  return statCollector.mediaConnection.getWebRTCStats();
11396
11420
  case 1:
11397
11421
  stats = _context6.v;
11398
- if (!statCollector.metricsBatch) {
11399
- statCollector.metricsBatch = [];
11400
- }
11422
+ statCollector.startNewBatch();
11401
11423
  metrics = [];
11424
+ lostMetrics = [];
11402
11425
  statCollector.headers.split(",").forEach(function (header) {
11403
11426
  var components = header.split(".");
11404
11427
  var descriptor = {
@@ -11406,7 +11429,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11406
11429
  id: components[1],
11407
11430
  name: components[2]
11408
11431
  };
11409
- var value = "undefined";
11432
+ var value = null;
11410
11433
  if (stats[descriptor.type]) {
11411
11434
  var _iterator2 = _createForOfIteratorHelper(stats[descriptor.type]),
11412
11435
  _step2;
@@ -11424,17 +11447,46 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11424
11447
  _iterator2.f();
11425
11448
  }
11426
11449
  }
11427
- metrics.push(value);
11450
+ if (value === null) {
11451
+ lostMetrics.push(descriptor);
11452
+ } else {
11453
+ metrics.push(value);
11454
+ }
11428
11455
  });
11456
+ // Metrics list may change if some metrics are added or some metrics are lost #WCS-4627
11457
+ _context6.n = 2;
11458
+ return statCollector.updateHeaders(stats);
11459
+ case 2:
11460
+ headersUpdated = _context6.v;
11461
+ if (!lostMetrics.length) {
11462
+ _context6.n = 4;
11463
+ break;
11464
+ }
11465
+ statCollector.logger.info(LOG_PREFIX + "-" + statCollector.id, "Missing metrics: " + JSON.stringify(lostMetrics));
11466
+ // Send metrics already collected and start a new batch with current metrics array to send them later #WCS-4627
11467
+ _context6.n = 3;
11468
+ return statCollector.sendMetrics();
11469
+ case 3:
11470
+ statCollector.startNewBatch(metrics);
11471
+ _context6.n = 5;
11472
+ break;
11473
+ case 4:
11429
11474
  statCollector.metricsBatch.push(metrics);
11430
11475
  statCollector.batchCount--;
11431
- if (!(statCollector.batchCount === 0)) {
11432
- _context6.n = 2;
11476
+ if (!(statCollector.batchCount === 0 || headersUpdated)) {
11477
+ _context6.n = 5;
11433
11478
  break;
11434
11479
  }
11435
- _context6.n = 2;
11480
+ _context6.n = 5;
11436
11481
  return statCollector.sendMetrics();
11437
- case 2:
11482
+ case 5:
11483
+ // Check if metrics list changed and send a new headers if needed #WCS-4619
11484
+ if (headersUpdated) {
11485
+ statCollector.logger.info(LOG_PREFIX + "-" + statCollector.id, "RTC metrics list has changed, sending a new metrics description");
11486
+ statCollector.sendHeaders();
11487
+ }
11488
+ statCollector.timerBusy = false;
11489
+ case 6:
11438
11490
  return _context6.a(2);
11439
11491
  }
11440
11492
  }, _callee6);
@@ -11451,7 +11503,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11451
11503
  while (1) switch (_context7.p = _context7.n) {
11452
11504
  case 0:
11453
11505
  metricsToSend = [];
11454
- for (i = 0; i < statCollector.metricsBatch.length; i++) {
11506
+ for (i = 0; statCollector.metricsBatch && i < statCollector.metricsBatch.length; i++) {
11455
11507
  metricsString = "";
11456
11508
  for (j = 0; j < statCollector.metricsBatch[i].length; j++) {
11457
11509
  valueString = valueToString(statCollector.metricsBatch[i][j]);
@@ -11485,7 +11537,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11485
11537
  case 3:
11486
11538
  _context7.p = 3;
11487
11539
  _t3 = _context7.v;
11488
- statCollector.logger.warn(LOG_PREFIX, "Can't send metrics data using" + statCollector.compression + ": " + _t3);
11540
+ statCollector.logger.warn(LOG_PREFIX + "-" + statCollector.id, "Can't send metrics data using" + statCollector.compression + ": " + _t3);
11489
11541
  metricsData = null;
11490
11542
  case 4:
11491
11543
  _context7.n = 6;
@@ -11500,8 +11552,7 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11500
11552
  };
11501
11553
  statCollector.send("webRTCMetricsBatch", data);
11502
11554
  }
11503
- statCollector.metricsBatch = null;
11504
- statCollector.batchCount = statCollector.description.batchSize;
11555
+ statCollector.cleanBatch();
11505
11556
  case 7:
11506
11557
  return _context7.a(2);
11507
11558
  }
@@ -11511,7 +11562,21 @@ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaC
11511
11562
  return _sendMetrics.apply(this, arguments);
11512
11563
  }
11513
11564
  return sendMetrics;
11514
- }()
11565
+ }(),
11566
+ startNewBatch: function startNewBatch(metrics) {
11567
+ if (!statCollector.metricsBatch) {
11568
+ statCollector.metricsBatch = [];
11569
+ if (metrics) {
11570
+ statCollector.metricsBatch.push(metrics);
11571
+ }
11572
+ }
11573
+ },
11574
+ cleanBatch: function cleanBatch() {
11575
+ if (statCollector.metricsBatch) {
11576
+ statCollector.metricsBatch = null;
11577
+ statCollector.batchCount = statCollector.description.batchSize;
11578
+ }
11579
+ }
11515
11580
  };
11516
11581
  return statCollector;
11517
11582
  };