@flashphoner/websdk 2.0.260 → 2.0.261

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.
@@ -7632,6 +7632,12 @@ var ERROR_INFO = Object.freeze({
7632
7632
  * @memberOf Flashphoner.constants.ERROR_INFO
7633
7633
  */
7634
7634
  CAN_NOT_SET_RESOLUTION: 'Cannot switch a published stream resolution',
7635
+ /**
7636
+ * Error if cannot get peer connection stats
7637
+ * @event CAN_NOT_GET_STATS
7638
+ * @memberOf Flashphoner.constants.ERROR_INFO
7639
+ */
7640
+ CAN_NOT_GET_STATS: 'Cannot get PeerConnection stats',
7635
7641
  /**
7636
7642
  * Local browser error detected
7637
7643
  * @event LOCAL_ERROR
@@ -7831,6 +7837,12 @@ module.exports = {
7831
7837
  },{}],40:[function(require,module,exports){
7832
7838
  'use strict';
7833
7839
 
7840
+ function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
7841
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
7842
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
7843
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
7844
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
7845
+ function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
7834
7846
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
7835
7847
  function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
7836
7848
  function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
@@ -7842,6 +7854,7 @@ var constants = require("./constants");
7842
7854
  var util = require('./util');
7843
7855
  var LoggerObject = require('./util').logger;
7844
7856
  var clientInfo = require('./client-info');
7857
+ var StatsCollector = require('./stats-collector');
7845
7858
  var _Promise = require('promise-polyfill');
7846
7859
  var KalmanFilter = require('kalmanjs');
7847
7860
  var browserDetails = require('webrtc-adapter')["default"].browserDetails;
@@ -8385,6 +8398,9 @@ var createSession = function createSession(options) {
8385
8398
  //callbacks added using session.on()
8386
8399
  var callbacks = {};
8387
8400
  var wsConnection;
8401
+
8402
+ // WebRTC metrics sending description
8403
+ var webRTCMetricsServerDescription;
8388
8404
  if (lbUrl) {
8389
8405
  requestURL(lbUrl);
8390
8406
  } else {
@@ -8487,6 +8503,7 @@ var createSession = function createSession(options) {
8487
8503
  case 'getUserData':
8488
8504
  authToken = obj.authToken;
8489
8505
  cConfig = obj;
8506
+ webRTCMetricsServerDescription = obj.webRTCMetricsServerDescription;
8490
8507
  onSessionStatusChange(SESSION_STATUS.ESTABLISHED, obj);
8491
8508
  break;
8492
8509
  case 'setRemoteSDP':
@@ -8591,6 +8608,37 @@ var createSession = function createSession(options) {
8591
8608
  streamRefreshHandlers[obj.mediaSessionId](obj);
8592
8609
  }
8593
8610
  break;
8611
+ case "webRTCMetricsDescriptionUpdate":
8612
+ if (obj.ids) {
8613
+ obj.ids.forEach(function (id) {
8614
+ if (streamRefreshHandlers[id]) {
8615
+ streamRefreshHandlers[id](obj);
8616
+ }
8617
+ });
8618
+ } else {
8619
+ if (obj.compression) {
8620
+ webRTCMetricsServerDescription.compression = obj.compression;
8621
+ }
8622
+ if (obj.batchSize) {
8623
+ webRTCMetricsServerDescription.batchSize = obj.batchSize;
8624
+ }
8625
+ if (obj.sampling) {
8626
+ webRTCMetricsServerDescription.sampling = obj.sampling;
8627
+ }
8628
+ if (obj.types) {
8629
+ webRTCMetricsServerDescription.types = obj.types;
8630
+ }
8631
+ if (obj.collect) {
8632
+ webRTCMetricsServerDescription.collect = obj.collect;
8633
+ }
8634
+ for (var _i = 0, _Object$entries = Object.entries(streamRefreshHandlers); _i < _Object$entries.length; _i++) {
8635
+ var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2),
8636
+ _id = _Object$entries$_i[0],
8637
+ handler = _Object$entries$_i[1];
8638
+ handler(obj);
8639
+ }
8640
+ }
8641
+ break;
8594
8642
  default:
8595
8643
  logger.info(LOG_PREFIX, "Unknown server message " + data.message);
8596
8644
  }
@@ -8602,10 +8650,12 @@ var createSession = function createSession(options) {
8602
8650
 
8603
8651
  //WebSocket send helper
8604
8652
  function send(message, data) {
8605
- wsConnection.send(JSON.stringify({
8606
- message: message,
8607
- data: [data]
8608
- }));
8653
+ if (wsConnection.readyState === WebSocket.OPEN) {
8654
+ wsConnection.send(JSON.stringify({
8655
+ message: message,
8656
+ data: [data]
8657
+ }));
8658
+ }
8609
8659
  }
8610
8660
 
8611
8661
  //Session status update helper
@@ -9636,6 +9686,7 @@ var createSession = function createSession(options) {
9636
9686
  var videoState_;
9637
9687
  var connectionQuality;
9638
9688
  var videoBytes = 0;
9689
+ var statsCollector = null;
9639
9690
 
9640
9691
  /**
9641
9692
  * Represents media stream.
@@ -9668,7 +9719,7 @@ var createSession = function createSession(options) {
9668
9719
  mediaConnection.setRemoteSdp(_sdp).then(function () {});
9669
9720
  return;
9670
9721
  }
9671
- if (streamInfo.available != undefined) {
9722
+ if (streamInfo.available !== undefined) {
9672
9723
  for (var i = 0; i < availableCallbacks.length; i++) {
9673
9724
  info_ = streamInfo.reason;
9674
9725
  if (streamInfo.available == "true") {
@@ -9714,10 +9765,28 @@ var createSession = function createSession(options) {
9714
9765
  if (mediaConnection) {
9715
9766
  mediaConnection.close(cacheLocalResources);
9716
9767
  }
9768
+ if (statsCollector) {
9769
+ statsCollector.stop();
9770
+ statsCollector = null;
9771
+ }
9717
9772
  }
9718
9773
  if (record_ && typeof streamInfo.recordName !== 'undefined') {
9719
9774
  recordFileName = streamInfo.recordName;
9720
9775
  }
9776
+
9777
+ // Set up metrics collection
9778
+ if (event === STREAM_STATUS.PUBLISHING || event === STREAM_STATUS.PLAYING) {
9779
+ if (webRTCMetricsServerDescription && !statsCollector) {
9780
+ statsCollector = StatsCollector.StreamStatsCollector(webRTCMetricsServerDescription, id_, mediaConnection, wsConnection, logger);
9781
+ statsCollector.start();
9782
+ }
9783
+ }
9784
+
9785
+ // Pause or resume metrics collection
9786
+ if (!streamInfo.status && streamInfo.collect !== undefined && statsCollector) {
9787
+ statsCollector.update(streamInfo);
9788
+ }
9789
+
9721
9790
  //fire stream event
9722
9791
  if (callbacks[event]) {
9723
9792
  callbacks[event](stream);
@@ -10951,7 +11020,7 @@ module.exports = {
10951
11020
  Browser: util.Browser
10952
11021
  };
10953
11022
 
10954
- },{"./client-info":38,"./constants":39,"./media-source-media-provider":1,"./temasys-media-provider":1,"./util":42,"./webrtc-media-provider":43,"./websocket-media-provider":1,"kalmanjs":2,"promise-polyfill":4,"uuid":8,"webrtc-adapter":23}],41:[function(require,module,exports){
11023
+ },{"./client-info":38,"./constants":39,"./media-source-media-provider":1,"./stats-collector":42,"./temasys-media-provider":1,"./util":43,"./webrtc-media-provider":44,"./websocket-media-provider":1,"kalmanjs":2,"promise-polyfill":4,"uuid":8,"webrtc-adapter":23}],41:[function(require,module,exports){
10955
11024
  'use strict';
10956
11025
 
10957
11026
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
@@ -11523,9 +11592,531 @@ module.exports = {
11523
11592
  sdk: Flashphoner
11524
11593
  };
11525
11594
 
11526
- },{"./constants":39,"./flashphoner-core":40,"./util":42,"promise-polyfill":4,"uuid":8}],42:[function(require,module,exports){
11595
+ },{"./constants":39,"./flashphoner-core":40,"./util":43,"promise-polyfill":4,"uuid":8}],42:[function(require,module,exports){
11596
+ 'use strict';
11597
+
11598
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
11599
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
11600
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
11601
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
11602
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
11603
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
11604
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
11605
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
11606
+ var util = require('./util');
11607
+ var LOG_PREFIX = "stats-collector";
11608
+
11609
+ // Collect and send WebRTC statistics periodically
11610
+ var StreamStatsCollector = function StreamStatsCollector(description, id, mediaConnection, wsConnection, logger) {
11611
+ var statCollector = {
11612
+ description: description,
11613
+ id: id,
11614
+ mediaConnection: mediaConnection,
11615
+ wsConnection: wsConnection,
11616
+ logger: getLogger(logger),
11617
+ headers: "",
11618
+ compression: "none",
11619
+ metricsBatch: null,
11620
+ timer: null,
11621
+ batchCount: 0,
11622
+ start: function () {
11623
+ var _start = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee() {
11624
+ var error;
11625
+ return _regenerator().w(function (_context) {
11626
+ while (1) switch (_context.n) {
11627
+ case 0:
11628
+ error = "Can't collect WebRTC stats to send: ";
11629
+ if (statCollector.description.types) {
11630
+ _context.n = 1;
11631
+ break;
11632
+ }
11633
+ throw new Error(error + "no report types defined");
11634
+ case 1:
11635
+ if (statCollector.description.sampling) {
11636
+ _context.n = 2;
11637
+ break;
11638
+ }
11639
+ throw new Error(error + "no sampling interval defined");
11640
+ case 2:
11641
+ if (statCollector.description.batchSize) {
11642
+ _context.n = 3;
11643
+ break;
11644
+ }
11645
+ throw new Error(error + "no metrics batch size defined");
11646
+ case 3:
11647
+ if (statCollector.mediaConnection) {
11648
+ _context.n = 4;
11649
+ break;
11650
+ }
11651
+ throw new Error(error + "no media connection available");
11652
+ case 4:
11653
+ if (statCollector.wsConnection) {
11654
+ _context.n = 5;
11655
+ break;
11656
+ }
11657
+ throw new Error(error + "no websocket connection available");
11658
+ case 5:
11659
+ _context.n = 6;
11660
+ return statCollector.updateHeaders();
11661
+ case 6:
11662
+ _context.n = 7;
11663
+ return statCollector.updateCompression();
11664
+ case 7:
11665
+ statCollector.sendHeaders();
11666
+ if (statCollector.description.collect === "on") {
11667
+ statCollector.collect(true);
11668
+ }
11669
+ case 8:
11670
+ return _context.a(2);
11671
+ }
11672
+ }, _callee);
11673
+ }));
11674
+ function start() {
11675
+ return _start.apply(this, arguments);
11676
+ }
11677
+ return start;
11678
+ }(),
11679
+ collect: function collect(enable) {
11680
+ if (enable) {
11681
+ statCollector.startTimer();
11682
+ } else {
11683
+ statCollector.stopTimer();
11684
+ }
11685
+ },
11686
+ stop: function stop() {
11687
+ statCollector.stopTimer();
11688
+ statCollector.headers = "";
11689
+ },
11690
+ update: function () {
11691
+ var _update = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(description) {
11692
+ var _t;
11693
+ return _regenerator().w(function (_context2) {
11694
+ while (1) switch (_context2.n) {
11695
+ case 0:
11696
+ if (description) {
11697
+ _context2.n = 1;
11698
+ break;
11699
+ }
11700
+ if (!statCollector.logger) {
11701
+ _context2.n = 1;
11702
+ break;
11703
+ }
11704
+ statCollector.logger.error(LOG_PREFIX, "Can't update WebRTC metrics sending: no parameters passed");
11705
+ return _context2.a(2);
11706
+ case 1:
11707
+ if (!(description.types || description.compression)) {
11708
+ _context2.n = 4;
11709
+ break;
11710
+ }
11711
+ statCollector.stop();
11712
+ if (!description.types) {
11713
+ _context2.n = 2;
11714
+ break;
11715
+ }
11716
+ statCollector.description.types = description.types;
11717
+ _context2.n = 2;
11718
+ return statCollector.updateHeaders();
11719
+ case 2:
11720
+ if (!description.compression) {
11721
+ _context2.n = 3;
11722
+ break;
11723
+ }
11724
+ statCollector.description.compression = description.compression;
11725
+ _context2.n = 3;
11726
+ return statCollector.updateCompression();
11727
+ case 3:
11728
+ statCollector.sendHeaders();
11729
+ _context2.n = 5;
11730
+ break;
11731
+ case 4:
11732
+ statCollector.collect(false);
11733
+ case 5:
11734
+ if (description.batchSize) {
11735
+ statCollector.description.batchSize = description.batchSize;
11736
+ }
11737
+ if (description.sampling) {
11738
+ statCollector.description.sampling = description.sampling;
11739
+ }
11740
+ if (description.collect) {
11741
+ statCollector.description.collect = description.collect;
11742
+ }
11743
+ _t = statCollector.description.collect;
11744
+ _context2.n = _t === "on" ? 6 : _t === "off" ? 7 : 8;
11745
+ break;
11746
+ case 6:
11747
+ statCollector.collect(true);
11748
+ return _context2.a(3, 8);
11749
+ case 7:
11750
+ statCollector.collect(false);
11751
+ return _context2.a(3, 8);
11752
+ case 8:
11753
+ return _context2.a(2);
11754
+ }
11755
+ }, _callee2);
11756
+ }));
11757
+ function update(_x) {
11758
+ return _update.apply(this, arguments);
11759
+ }
11760
+ return update;
11761
+ }(),
11762
+ updateHeaders: function () {
11763
+ var _updateHeaders = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee3() {
11764
+ var stats;
11765
+ return _regenerator().w(function (_context3) {
11766
+ while (1) switch (_context3.n) {
11767
+ case 0:
11768
+ _context3.n = 1;
11769
+ return statCollector.mediaConnection.getWebRTCStats();
11770
+ case 1:
11771
+ stats = _context3.v;
11772
+ Object.keys(statCollector.description.types).forEach(function (type) {
11773
+ var typeDescriptor = statCollector.description.types[type];
11774
+ var metricsString = "";
11775
+ var contentFilters = null;
11776
+ if (typeDescriptor.metrics) {
11777
+ metricsString = typeDescriptor.metrics;
11778
+ }
11779
+ if (typeDescriptor.contains) {
11780
+ contentFilters = typeDescriptor.contains;
11781
+ }
11782
+ if (stats[type]) {
11783
+ stats[type].forEach(function (report) {
11784
+ statCollector.logger.debug(LOG_PREFIX, type + " report: " + JSON.stringify(report));
11785
+ if (contentFilters) {
11786
+ var filtersMatched = true;
11787
+ for (var filter in contentFilters) {
11788
+ statCollector.logger.debug(LOG_PREFIX, type + " filter by " + filter + ": " + JSON.stringify(contentFilters[filter]));
11789
+ var filterMatched = false;
11790
+ if (report[filter]) {
11791
+ var _iterator = _createForOfIteratorHelper(contentFilters[filter]),
11792
+ _step;
11793
+ try {
11794
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
11795
+ var value = _step.value;
11796
+ statCollector.logger.debug(LOG_PREFIX, filter + ": " + value + " <> " + report[filter]);
11797
+ if (report[filter] === value) {
11798
+ filterMatched = true;
11799
+ break;
11800
+ }
11801
+ }
11802
+ } catch (err) {
11803
+ _iterator.e(err);
11804
+ } finally {
11805
+ _iterator.f();
11806
+ }
11807
+ }
11808
+ filtersMatched = filtersMatched && filterMatched;
11809
+ if (!filterMatched) {
11810
+ break;
11811
+ }
11812
+ }
11813
+ if (filtersMatched) {
11814
+ statCollector.addHeaders(report, metricsString);
11815
+ }
11816
+ } else {
11817
+ statCollector.addHeaders(report, metricsString);
11818
+ }
11819
+ });
11820
+ } else {
11821
+ statCollector.logger.warn(LOG_PREFIX, "No report type found in RTC stats: '" + type + "'");
11822
+ }
11823
+ });
11824
+ case 2:
11825
+ return _context3.a(2);
11826
+ }
11827
+ }, _callee3);
11828
+ }));
11829
+ function updateHeaders() {
11830
+ return _updateHeaders.apply(this, arguments);
11831
+ }
11832
+ return updateHeaders;
11833
+ }(),
11834
+ addHeaders: function addHeaders(report, metricsString) {
11835
+ if (metricsString) {
11836
+ var metrics = metricsString.split(",");
11837
+ metrics.forEach(function (metric) {
11838
+ var metricFound = false;
11839
+ for (var _i = 0, _Object$keys = Object.keys(report); _i < _Object$keys.length; _i++) {
11840
+ var key = _Object$keys[_i];
11841
+ if (metric === key) {
11842
+ statCollector.headers = util.addFieldToCsvString(statCollector.headers, report.type + "." + report.id + "." + metric, ",");
11843
+ metricFound = true;
11844
+ break;
11845
+ }
11846
+ }
11847
+ if (!metricFound) {
11848
+ statCollector.logger.warn(LOG_PREFIX, "No metric found in RTC stats report '" + report.type + "': '" + metric + "'");
11849
+ }
11850
+ });
11851
+ }
11852
+ },
11853
+ updateCompression: function () {
11854
+ var _updateCompression = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee4() {
11855
+ return _regenerator().w(function (_context4) {
11856
+ while (1) switch (_context4.n) {
11857
+ case 0:
11858
+ if (!statCollector.description.compression) {
11859
+ _context4.n = 3;
11860
+ break;
11861
+ }
11862
+ if (!(statCollector.description.compression.indexOf("gzip") >= 0)) {
11863
+ _context4.n = 2;
11864
+ break;
11865
+ }
11866
+ _context4.n = 1;
11867
+ return statCollector.checkForCompression("gzip");
11868
+ case 1:
11869
+ _context4.n = 3;
11870
+ break;
11871
+ case 2:
11872
+ if (!(statCollector.description.compression.indexOf("deflate") >= 0)) {
11873
+ _context4.n = 3;
11874
+ break;
11875
+ }
11876
+ _context4.n = 3;
11877
+ return statCollector.checkForCompression("deflate");
11878
+ case 3:
11879
+ return _context4.a(2);
11880
+ }
11881
+ }, _callee4);
11882
+ }));
11883
+ function updateCompression() {
11884
+ return _updateCompression.apply(this, arguments);
11885
+ }
11886
+ return updateCompression;
11887
+ }(),
11888
+ checkForCompression: function () {
11889
+ var _checkForCompression = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee5(compression) {
11890
+ var _t2;
11891
+ return _regenerator().w(function (_context5) {
11892
+ while (1) switch (_context5.p = _context5.n) {
11893
+ case 0:
11894
+ _context5.p = 0;
11895
+ _context5.n = 1;
11896
+ return util.compress(compression, "test", false);
11897
+ case 1:
11898
+ statCollector.compression = compression;
11899
+ _context5.n = 3;
11900
+ break;
11901
+ case 2:
11902
+ _context5.p = 2;
11903
+ _t2 = _context5.v;
11904
+ statCollector.logger.warn(LOG_PREFIX, "Can't compress metrics data using " + compression + ": " + _t2);
11905
+ statCollector.compression = "none";
11906
+ case 3:
11907
+ return _context5.a(2);
11908
+ }
11909
+ }, _callee5, null, [[0, 2]]);
11910
+ }));
11911
+ function checkForCompression(_x2) {
11912
+ return _checkForCompression.apply(this, arguments);
11913
+ }
11914
+ return checkForCompression;
11915
+ }(),
11916
+ sendHeaders: function sendHeaders() {
11917
+ var data = {
11918
+ mediaSessionId: statCollector.id,
11919
+ compression: statCollector.compression,
11920
+ headers: statCollector.headers
11921
+ };
11922
+ statCollector.send("webRTCMetricsClientDescription", data);
11923
+ },
11924
+ send: function send(message, data) {
11925
+ statCollector.logger.debug(LOG_PREFIX, data);
11926
+ if (statCollector.wsConnection.readyState === WebSocket.OPEN) {
11927
+ statCollector.wsConnection.send(JSON.stringify({
11928
+ message: message,
11929
+ data: [data]
11930
+ }));
11931
+ }
11932
+ },
11933
+ startTimer: function startTimer() {
11934
+ if (!statCollector.timer && statCollector.headers) {
11935
+ statCollector.batchCount = statCollector.description.batchSize;
11936
+ statCollector.timer = setInterval(statCollector.collectMetrics, statCollector.description.sampling);
11937
+ }
11938
+ },
11939
+ stopTimer: function stopTimer() {
11940
+ if (statCollector.timer) {
11941
+ clearInterval(statCollector.timer);
11942
+ statCollector.timer = null;
11943
+ statCollector.metricsBatch = null;
11944
+ }
11945
+ },
11946
+ collectMetrics: function () {
11947
+ var _collectMetrics = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee6() {
11948
+ var stats, metrics;
11949
+ return _regenerator().w(function (_context6) {
11950
+ while (1) switch (_context6.n) {
11951
+ case 0:
11952
+ if (!statCollector.timer) {
11953
+ _context6.n = 2;
11954
+ break;
11955
+ }
11956
+ _context6.n = 1;
11957
+ return statCollector.mediaConnection.getWebRTCStats();
11958
+ case 1:
11959
+ stats = _context6.v;
11960
+ if (!statCollector.metricsBatch) {
11961
+ statCollector.metricsBatch = [];
11962
+ }
11963
+ metrics = [];
11964
+ statCollector.headers.split(",").forEach(function (header) {
11965
+ var components = header.split(".");
11966
+ var descriptor = {
11967
+ type: components[0],
11968
+ id: components[1],
11969
+ name: components[2]
11970
+ };
11971
+ var value = "undefined";
11972
+ if (stats[descriptor.type]) {
11973
+ var _iterator2 = _createForOfIteratorHelper(stats[descriptor.type]),
11974
+ _step2;
11975
+ try {
11976
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
11977
+ var report = _step2.value;
11978
+ if (report.id === descriptor.id) {
11979
+ value = report[descriptor.name];
11980
+ break;
11981
+ }
11982
+ }
11983
+ } catch (err) {
11984
+ _iterator2.e(err);
11985
+ } finally {
11986
+ _iterator2.f();
11987
+ }
11988
+ }
11989
+ metrics.push(value);
11990
+ });
11991
+ statCollector.metricsBatch.push(metrics);
11992
+ statCollector.batchCount--;
11993
+ if (!(statCollector.batchCount === 0)) {
11994
+ _context6.n = 2;
11995
+ break;
11996
+ }
11997
+ _context6.n = 2;
11998
+ return statCollector.sendMetrics();
11999
+ case 2:
12000
+ return _context6.a(2);
12001
+ }
12002
+ }, _callee6);
12003
+ }));
12004
+ function collectMetrics() {
12005
+ return _collectMetrics.apply(this, arguments);
12006
+ }
12007
+ return collectMetrics;
12008
+ }(),
12009
+ sendMetrics: function () {
12010
+ var _sendMetrics = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee7() {
12011
+ var previous, metricsToSend, metricsData, i, metricsString, j, valueString, previousString, separator, data, _t3;
12012
+ return _regenerator().w(function (_context7) {
12013
+ while (1) switch (_context7.p = _context7.n) {
12014
+ case 0:
12015
+ metricsToSend = [];
12016
+ for (i = 0; i < statCollector.metricsBatch.length; i++) {
12017
+ metricsString = "";
12018
+ for (j = 0; j < statCollector.metricsBatch[i].length; j++) {
12019
+ valueString = valueToString(statCollector.metricsBatch[i][j]);
12020
+ previousString = "";
12021
+ separator = ";";
12022
+ if (previous) {
12023
+ previousString = valueToString(previous[j]);
12024
+ }
12025
+ if (valueString === previousString) {
12026
+ valueString = "";
12027
+ }
12028
+ metricsString = util.addFieldToCsvString(metricsString, valueString, separator);
12029
+ }
12030
+ previous = statCollector.metricsBatch[i];
12031
+ metricsToSend.push(metricsString);
12032
+ }
12033
+ if (!(statCollector.compression !== "none")) {
12034
+ _context7.n = 5;
12035
+ break;
12036
+ }
12037
+ _context7.p = 1;
12038
+ _context7.n = 2;
12039
+ return util.compress(statCollector.compression, JSON.stringify(metricsToSend), true);
12040
+ case 2:
12041
+ metricsData = _context7.v;
12042
+ _context7.n = 4;
12043
+ break;
12044
+ case 3:
12045
+ _context7.p = 3;
12046
+ _t3 = _context7.v;
12047
+ statCollector.logger.warn(LOG_PREFIX, "Can't send metrics data using" + statCollector.compression + ": " + _t3);
12048
+ metricsData = null;
12049
+ case 4:
12050
+ _context7.n = 6;
12051
+ break;
12052
+ case 5:
12053
+ metricsData = metricsToSend;
12054
+ case 6:
12055
+ if (metricsData) {
12056
+ data = {
12057
+ mediaSessionId: statCollector.id,
12058
+ metrics: metricsData
12059
+ };
12060
+ statCollector.send("webRTCMetricsBatch", data);
12061
+ }
12062
+ statCollector.metricsBatch = null;
12063
+ statCollector.batchCount = statCollector.description.batchSize;
12064
+ case 7:
12065
+ return _context7.a(2);
12066
+ }
12067
+ }, _callee7, null, [[1, 3]]);
12068
+ }));
12069
+ function sendMetrics() {
12070
+ return _sendMetrics.apply(this, arguments);
12071
+ }
12072
+ return sendMetrics;
12073
+ }()
12074
+ };
12075
+ return statCollector;
12076
+ };
12077
+
12078
+ // Helper function to stringify a value
12079
+ var valueToString = function valueToString(value) {
12080
+ var valueString = "undefined";
12081
+ if (_typeof(value) === "object") {
12082
+ valueString = JSON.stringify(value);
12083
+ } else {
12084
+ valueString = value.toString();
12085
+ }
12086
+ return valueString;
12087
+ };
12088
+
12089
+ // Helper function to get logger object
12090
+ var getLogger = function getLogger(logger) {
12091
+ if (logger) {
12092
+ if (logger.info !== undefined && logger.warn !== undefined && logger.error !== undefined && logger.debug !== undefined) {
12093
+ return logger;
12094
+ }
12095
+ }
12096
+ return {
12097
+ info: function info() {},
12098
+ warn: function warn() {},
12099
+ error: function error() {},
12100
+ debug: function debug() {}
12101
+ };
12102
+ };
12103
+ module.exports = {
12104
+ StreamStatsCollector: StreamStatsCollector
12105
+ };
12106
+
12107
+ },{"./util":43}],43:[function(require,module,exports){
11527
12108
  'use strict';
11528
12109
 
12110
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
12111
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
12112
+ function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
12113
+ function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
12114
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
12115
+ function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
12116
+ function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
12117
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
12118
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
12119
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
11529
12120
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
11530
12121
  var isEmptyObject = function isEmptyObject(obj) {
11531
12122
  for (var name in obj) {
@@ -12005,6 +12596,70 @@ var setPublishingBitrate = function setPublishingBitrate(sdp, mediaConnection, m
12005
12596
  }
12006
12597
  return sdp;
12007
12598
  };
12599
+ var addFieldToCsvString = function addFieldToCsvString(csvString, field, separator) {
12600
+ if (field !== "" && field.indexOf(separator) >= 0) {
12601
+ field = '"' + field + '"';
12602
+ }
12603
+ if (csvString === "" && field !== "") {
12604
+ csvString = field;
12605
+ } else {
12606
+ csvString = csvString + separator + field;
12607
+ }
12608
+ return csvString;
12609
+ };
12610
+ var compress = /*#__PURE__*/function () {
12611
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(compression, data, base64) {
12612
+ var stream, compressedReadableStream, compressedResponse, blob, buffer, compressedBase64;
12613
+ return _regenerator().w(function (_context) {
12614
+ while (1) switch (_context.n) {
12615
+ case 0:
12616
+ if (!(typeof CompressionStream === "undefined")) {
12617
+ _context.n = 1;
12618
+ break;
12619
+ }
12620
+ throw new Error("Compression is not available");
12621
+ case 1:
12622
+ if (typeof data == "string") {
12623
+ stream = new Blob([data], {
12624
+ type: 'text/plain'
12625
+ }).stream();
12626
+ } else {
12627
+ // Assume blog
12628
+ stream = data.stream();
12629
+ }
12630
+
12631
+ // gzip stream
12632
+ compressedReadableStream = stream.pipeThrough(new CompressionStream(compression)); // create Response
12633
+ _context.n = 2;
12634
+ return new Response(compressedReadableStream);
12635
+ case 2:
12636
+ compressedResponse = _context.v;
12637
+ _context.n = 3;
12638
+ return compressedResponse.blob();
12639
+ case 3:
12640
+ blob = _context.v;
12641
+ if (!base64) {
12642
+ _context.n = 5;
12643
+ break;
12644
+ }
12645
+ _context.n = 4;
12646
+ return blob.arrayBuffer();
12647
+ case 4:
12648
+ buffer = _context.v;
12649
+ // convert ArrayBuffer to base64 encoded string
12650
+ compressedBase64 = btoa(String.fromCharCode.apply(String, _toConsumableArray(new Uint8Array(buffer))));
12651
+ return _context.a(2, compressedBase64);
12652
+ case 5:
12653
+ return _context.a(2, blob);
12654
+ case 6:
12655
+ return _context.a(2);
12656
+ }
12657
+ }, _callee);
12658
+ }));
12659
+ return function compress(_x, _x2, _x3) {
12660
+ return _ref.apply(this, arguments);
12661
+ };
12662
+ }();
12008
12663
  module.exports = {
12009
12664
  isEmptyObject: isEmptyObject,
12010
12665
  copyObjectToArray: copyObjectToArray,
@@ -12016,22 +12671,24 @@ module.exports = {
12016
12671
  stripCodecs: stripCodecs,
12017
12672
  getCurrentCodecAndSampleRate: getCurrentCodecAndSampleRate,
12018
12673
  isPromise: isPromise,
12019
- setPublishingBitrate: setPublishingBitrate
12674
+ setPublishingBitrate: setPublishingBitrate,
12675
+ addFieldToCsvString: addFieldToCsvString,
12676
+ compress: compress
12020
12677
  };
12021
12678
 
12022
- },{}],43:[function(require,module,exports){
12679
+ },{}],44:[function(require,module,exports){
12023
12680
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
12024
12681
  function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
12025
- function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
12026
- function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
12027
- function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
12028
- function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
12029
12682
  function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
12030
12683
  function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
12031
12684
  function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
12032
12685
  function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
12033
12686
  function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
12034
12687
  function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
12688
+ function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
12689
+ function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
12690
+ function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
12691
+ function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
12035
12692
  -'use strict';
12036
12693
  var browserDetails = require('webrtc-adapter')["default"].browserDetails;
12037
12694
  var _require = require('uuid'),
@@ -12476,67 +13133,70 @@ var createConnection = function createConnection(options) {
12476
13133
  }
12477
13134
  return true;
12478
13135
  };
12479
- var getStat = function getStat(callbackFn, nativeStats) {
12480
- var browser = browserDetails.browser;
12481
- var result = {
12482
- outboundStream: {},
12483
- inboundStream: {},
12484
- otherStats: []
12485
- };
12486
- if (connection && validBrowsers.includes(browser)) {
12487
- if (nativeStats) {
12488
- return connection.getStats(null);
12489
- } else {
12490
- connection.getStats(null).then(function (stat) {
12491
- if (stat) {
12492
- stat.forEach(function (report) {
12493
- if (!report.isRemote) {
12494
- var mediaType = "";
12495
- if (report.type === 'outbound-rtp') {
12496
- mediaType = getReportMediaType(report);
12497
- fillStatObject(result.outboundStream, report, mediaType);
12498
- if (mediaType === 'video') {
12499
- getVideoSize(result.outboundStream[mediaType], report);
13136
+ var getStat = /*#__PURE__*/function () {
13137
+ var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(callbackFn, nativeStats) {
13138
+ var result, rawStat;
13139
+ return _regenerator().w(function (_context) {
13140
+ while (1) switch (_context.n) {
13141
+ case 0:
13142
+ result = {
13143
+ outboundStream: {},
13144
+ inboundStream: {},
13145
+ otherStats: []
13146
+ };
13147
+ _context.n = 1;
13148
+ return getWebRTCStats();
13149
+ case 1:
13150
+ rawStat = _context.v;
13151
+ if (nativeStats) {
13152
+ callbackFn(rawStat);
13153
+ } else {
13154
+ if (rawStat["candidate-pair"]) {
13155
+ rawStat["candidate-pair"].forEach(function (report) {
13156
+ if (report.state === 'succeeded' && report.nominated) {
13157
+ if (report.availableIncomingBitrate) {
13158
+ result.otherStats.availableIncomingBitrate = report.availableIncomingBitrate;
13159
+ } else if (localVideo && report.availableOutgoingBitrate) {
13160
+ // availableOutgoingBitrate is defined for incoming stream too #WCS-4175
13161
+ result.otherStats.availableOutgoingBitrate = report.availableOutgoingBitrate;
13162
+ }
12500
13163
  }
12501
- } else if (report.type === 'inbound-rtp') {
12502
- mediaType = getReportMediaType(report);
12503
- fillStatObject(result.inboundStream, report, mediaType);
12504
- if (mediaType === 'video') {
12505
- getVideoSize(result.inboundStream[mediaType], report);
13164
+ });
13165
+ }
13166
+ if (rawStat["outbound-rtp"]) {
13167
+ rawStat["outbound-rtp"].forEach(function (report) {
13168
+ fillStatObject(result.outboundStream, report, report.kind);
13169
+ if (report.kind === "video") {
13170
+ getVideoSize(result.outboundStream[report.kind], report.type, report);
12506
13171
  }
12507
- } else if (report.type === 'candidate-pair' && report.state === 'succeeded' && report.nominated) {
12508
- if (report.availableIncomingBitrate) {
12509
- result.otherStats.availableIncomingBitrate = report.availableIncomingBitrate;
12510
- } else if (localVideo && report.availableOutgoingBitrate) {
12511
- // availableOutgoingBitrate is defined for incoming stream too #WCS-4175
12512
- result.otherStats.availableOutgoingBitrate = report.availableOutgoingBitrate;
13172
+ });
13173
+ }
13174
+ if (rawStat["inbound-rtp"]) {
13175
+ rawStat["inbound-rtp"].forEach(function (report) {
13176
+ fillStatObject(result.inboundStream, report, report.kind);
13177
+ if (report.kind === "video") {
13178
+ getVideoSize(result.inboundStream["video"], report.type, report);
12513
13179
  }
12514
- }
13180
+ });
12515
13181
  }
12516
- });
12517
- }
12518
- callbackFn(result);
12519
- });
12520
- }
12521
- }
12522
- };
12523
- var getReportMediaType = function getReportMediaType(report) {
12524
- // Since Safari 17 report.mediaType is undefined #WCS-3922
12525
- if (report.mediaType !== undefined) {
12526
- return report.mediaType;
12527
- } else if (report.kind !== undefined) {
12528
- return report.kind;
12529
- }
12530
- logger.warn(LOG_PREFIX, "No media type provided in WebRTC statistics");
12531
- return "media";
12532
- };
12533
- var getVideoSize = function getVideoSize(obj, report) {
13182
+ callbackFn(result);
13183
+ }
13184
+ case 2:
13185
+ return _context.a(2);
13186
+ }
13187
+ }, _callee);
13188
+ }));
13189
+ return function getStat(_x, _x2) {
13190
+ return _ref.apply(this, arguments);
13191
+ };
13192
+ }();
13193
+ var getVideoSize = function getVideoSize(obj, type, report) {
12534
13194
  var videoSize = {};
12535
- if (report.type == 'outbound-rtp') {
13195
+ if (type === 'outbound-rtp') {
12536
13196
  if (localVideo !== undefined && localVideo != null) {
12537
13197
  videoSize = localVideo.srcObject.getVideoTracks()[0].getSettings();
12538
13198
  }
12539
- } else if (report.type == 'inbound-rtp') {
13199
+ } else if (type === 'inbound-rtp') {
12540
13200
  if (remoteVideo !== undefined && remoteVideo != null) {
12541
13201
  videoSize.width = remoteVideo.videoWidth;
12542
13202
  videoSize.height = remoteVideo.videoHeight;
@@ -12939,25 +13599,25 @@ var createConnection = function createConnection(options) {
12939
13599
  return zoom;
12940
13600
  };
12941
13601
  var setZoom = /*#__PURE__*/function () {
12942
- var _ref = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee(value) {
13602
+ var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(value) {
12943
13603
  var _localVideo$srcObject3, _localVideo$srcObject4, track;
12944
- return _regenerator().w(function (_context) {
12945
- while (1) switch (_context.n) {
13604
+ return _regenerator().w(function (_context2) {
13605
+ while (1) switch (_context2.n) {
12946
13606
  case 0:
12947
13607
  if (!zoom) {
12948
- _context.n = 6;
13608
+ _context2.n = 6;
12949
13609
  break;
12950
13610
  }
12951
13611
  if (!(value >= zoom.min && value <= zoom.max)) {
12952
- _context.n = 4;
13612
+ _context2.n = 4;
12953
13613
  break;
12954
13614
  }
12955
13615
  if (!(localVideo && localVideo.srcObject)) {
12956
- _context.n = 2;
13616
+ _context2.n = 2;
12957
13617
  break;
12958
13618
  }
12959
13619
  _localVideo$srcObject3 = localVideo.srcObject.getVideoTracks(), _localVideo$srcObject4 = _slicedToArray(_localVideo$srcObject3, 1), track = _localVideo$srcObject4[0];
12960
- _context.n = 1;
13620
+ _context2.n = 1;
12961
13621
  return track.applyConstraints({
12962
13622
  advanced: [{
12963
13623
  zoom: value
@@ -12965,27 +13625,27 @@ var createConnection = function createConnection(options) {
12965
13625
  });
12966
13626
  case 1:
12967
13627
  zoom.value = value;
12968
- _context.n = 3;
13628
+ _context2.n = 3;
12969
13629
  break;
12970
13630
  case 2:
12971
13631
  logger.warn(LOG_PREFIX, "Can't set zoom value: no local video");
12972
13632
  case 3:
12973
- _context.n = 5;
13633
+ _context2.n = 5;
12974
13634
  break;
12975
13635
  case 4:
12976
13636
  logger.info(LOG_PREFIX, "Zoom value " + value + "is out of range: " + zoom.min + "-" + zoom.max);
12977
13637
  case 5:
12978
- _context.n = 7;
13638
+ _context2.n = 7;
12979
13639
  break;
12980
13640
  case 6:
12981
13641
  logger.info(LOG_PREFIX, "Zoom is not supported or zoom capabilities unknown yet");
12982
13642
  case 7:
12983
- return _context.a(2);
13643
+ return _context2.a(2);
12984
13644
  }
12985
- }, _callee);
13645
+ }, _callee2);
12986
13646
  }));
12987
- return function setZoom(_x) {
12988
- return _ref.apply(this, arguments);
13647
+ return function setZoom(_x3) {
13648
+ return _ref2.apply(this, arguments);
12989
13649
  };
12990
13650
  }();
12991
13651
  var getZoom = function getZoom() {
@@ -12994,6 +13654,32 @@ var createConnection = function createConnection(options) {
12994
13654
  }
12995
13655
  return -1;
12996
13656
  };
13657
+ var getWebRTCStats = function getWebRTCStats() {
13658
+ return new Promise(function (resolve, reject) {
13659
+ var browser = browserDetails.browser;
13660
+ if (connection && validBrowsers.includes(browser)) {
13661
+ connection.getStats(null).then(function (stats) {
13662
+ var statObject = {};
13663
+ if (stats) {
13664
+ stats.forEach(function (report) {
13665
+ if (report) {
13666
+ if (statObject[report.type] === undefined) {
13667
+ statObject[report.type] = [];
13668
+ }
13669
+ statObject[report.type].push(report);
13670
+ }
13671
+ });
13672
+ }
13673
+ resolve(statObject);
13674
+ })["catch"](function (reason) {
13675
+ logger.error(LOG_PREFIX, reason);
13676
+ reject(reason);
13677
+ });
13678
+ } else {
13679
+ reject(constants.ERROR_INFO.CAN_NOT_GET_STATS);
13680
+ }
13681
+ });
13682
+ };
12997
13683
  var exports = {};
12998
13684
  exports.state = state;
12999
13685
  exports.createOffer = createOffer;
@@ -13026,6 +13712,7 @@ var createConnection = function createConnection(options) {
13026
13712
  exports.getZoomCapabilities = getZoomCapabilities;
13027
13713
  exports.setZoom = setZoom;
13028
13714
  exports.getZoom = getZoom;
13715
+ exports.getWebRTCStats = getWebRTCStats;
13029
13716
  connections[id] = exports;
13030
13717
  resolve(exports);
13031
13718
  });
@@ -13799,5 +14486,5 @@ module.exports = {
13799
14486
  getVideoElement: getVideoElement
13800
14487
  };
13801
14488
 
13802
- },{"./constants":39,"./util":42,"uuid":8,"webrtc-adapter":23}]},{},[41])(41)
14489
+ },{"./constants":39,"./util":43,"uuid":8,"webrtc-adapter":23}]},{},[41])(41)
13803
14490
  });