@flashphoner/websdk 2.0.259 → 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.
- package/docTemplate/README.md +1 -1
- package/examples/demo/streaming/stream-zoom/stream-zoom.css +23 -0
- package/examples/demo/streaming/stream-zoom/stream-zoom.html +59 -0
- package/examples/demo/streaming/stream-zoom/stream-zoom.js +166 -0
- package/flashphoner-no-flash.js +906 -63
- package/flashphoner-no-flash.min.js +2 -2
- package/flashphoner-no-webrtc.js +728 -9
- package/flashphoner-no-webrtc.min.js +2 -2
- package/flashphoner-no-wsplayer.js +905 -62
- package/flashphoner-no-wsplayer.min.js +2 -2
- package/flashphoner-room-api-webrtc-only.js +906 -63
- package/flashphoner-room-api-webrtc-only.min.js +1 -1
- package/flashphoner-room-api.js +616 -60
- package/flashphoner-room-api.min.js +2 -2
- package/flashphoner-temasys-flash-websocket-without-adapterjs.js +729 -10
- package/flashphoner-temasys-flash-websocket.js +729 -10
- package/flashphoner-temasys-flash-websocket.min.js +1 -1
- package/flashphoner-webrtc-only.js +905 -62
- package/flashphoner-webrtc-only.min.js +1 -1
- package/flashphoner.js +906 -63
- package/flashphoner.min.js +2 -2
- package/package.json +1 -1
- package/src/constants.d.ts +6 -0
- package/src/constants.js +6 -0
- package/src/flashphoner-core.js +105 -5
- package/src/stats-collector.js +318 -0
- package/src/util.js +61 -1
- package/src/webrtc-media-provider.js +119 -48
|
@@ -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.
|
|
8606
|
-
|
|
8607
|
-
|
|
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
|
|
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);
|
|
@@ -10526,6 +10595,65 @@ var createSession = function createSession(options) {
|
|
|
10526
10595
|
throw new Error("This function available for publishing stream only");
|
|
10527
10596
|
}
|
|
10528
10597
|
};
|
|
10598
|
+
|
|
10599
|
+
/**
|
|
10600
|
+
* Get camera zoom capabilities
|
|
10601
|
+
*
|
|
10602
|
+
* @return {Object} zoom capabilities object: max, min, step or null if zoom is not supported
|
|
10603
|
+
* @memberof Stream
|
|
10604
|
+
*/
|
|
10605
|
+
var getZoomCapabilities = function getZoomCapabilities() {
|
|
10606
|
+
if (published() && mediaConnection) {
|
|
10607
|
+
return mediaConnection.getZoomCapabilities();
|
|
10608
|
+
} else {
|
|
10609
|
+
throw new Error("This function available for publishing stream only");
|
|
10610
|
+
}
|
|
10611
|
+
};
|
|
10612
|
+
|
|
10613
|
+
/**
|
|
10614
|
+
* Get current camera zoom value if supported
|
|
10615
|
+
*
|
|
10616
|
+
* @return {number} current camera zoom value
|
|
10617
|
+
* @memberof Stream
|
|
10618
|
+
*/
|
|
10619
|
+
var getZoom = function getZoom() {
|
|
10620
|
+
if (published() && mediaConnection) {
|
|
10621
|
+
return mediaConnection.getZoom();
|
|
10622
|
+
} else {
|
|
10623
|
+
throw new Error("This function available for publishing stream only");
|
|
10624
|
+
}
|
|
10625
|
+
};
|
|
10626
|
+
|
|
10627
|
+
/**
|
|
10628
|
+
* Set camera zoom value if supported
|
|
10629
|
+
*
|
|
10630
|
+
* @param {number} desired camera zoom value
|
|
10631
|
+
* @memberof Stream
|
|
10632
|
+
*/
|
|
10633
|
+
var setZoom = /*#__PURE__*/function () {
|
|
10634
|
+
var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(value) {
|
|
10635
|
+
return _regenerator().w(function (_context2) {
|
|
10636
|
+
while (1) switch (_context2.n) {
|
|
10637
|
+
case 0:
|
|
10638
|
+
if (!(published() && mediaConnection)) {
|
|
10639
|
+
_context2.n = 2;
|
|
10640
|
+
break;
|
|
10641
|
+
}
|
|
10642
|
+
_context2.n = 1;
|
|
10643
|
+
return mediaConnection.setZoom(value);
|
|
10644
|
+
case 1:
|
|
10645
|
+
return _context2.a(2, _context2.v);
|
|
10646
|
+
case 2:
|
|
10647
|
+
throw new Error("This function available for publishing stream only");
|
|
10648
|
+
case 3:
|
|
10649
|
+
return _context2.a(2);
|
|
10650
|
+
}
|
|
10651
|
+
}, _callee2);
|
|
10652
|
+
}));
|
|
10653
|
+
return function setZoom(_x2) {
|
|
10654
|
+
return _ref2.apply(this, arguments);
|
|
10655
|
+
};
|
|
10656
|
+
}();
|
|
10529
10657
|
stream.play = play;
|
|
10530
10658
|
stream.publish = publish;
|
|
10531
10659
|
stream.stop = _stop;
|
|
@@ -10567,6 +10695,9 @@ var createSession = function createSession(options) {
|
|
|
10567
10695
|
stream.getLogger = getLogger;
|
|
10568
10696
|
stream.updateVideoSettings = updateVideoSettings;
|
|
10569
10697
|
stream.updateVideoResolution = updateVideoResolution;
|
|
10698
|
+
stream.getZoomCapabilities = getZoomCapabilities;
|
|
10699
|
+
stream.getZoom = getZoom;
|
|
10700
|
+
stream.setZoom = setZoom;
|
|
10570
10701
|
streams[id_] = stream;
|
|
10571
10702
|
return stream;
|
|
10572
10703
|
};
|
|
@@ -10889,7 +11020,7 @@ module.exports = {
|
|
|
10889
11020
|
Browser: util.Browser
|
|
10890
11021
|
};
|
|
10891
11022
|
|
|
10892
|
-
},{"./client-info":38,"./constants":39,"./media-source-media-provider":1,"./temasys-media-provider":1,"./util":
|
|
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){
|
|
10893
11024
|
'use strict';
|
|
10894
11025
|
|
|
10895
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); }
|
|
@@ -11461,9 +11592,531 @@ module.exports = {
|
|
|
11461
11592
|
sdk: Flashphoner
|
|
11462
11593
|
};
|
|
11463
11594
|
|
|
11464
|
-
},{"./constants":39,"./flashphoner-core":40,"./util":
|
|
11595
|
+
},{"./constants":39,"./flashphoner-core":40,"./util":43,"promise-polyfill":4,"uuid":8}],42:[function(require,module,exports){
|
|
11465
11596
|
'use strict';
|
|
11466
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){
|
|
12108
|
+
'use strict';
|
|
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); }); }; }
|
|
11467
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); }
|
|
11468
12121
|
var isEmptyObject = function isEmptyObject(obj) {
|
|
11469
12122
|
for (var name in obj) {
|
|
@@ -11943,6 +12596,70 @@ var setPublishingBitrate = function setPublishingBitrate(sdp, mediaConnection, m
|
|
|
11943
12596
|
}
|
|
11944
12597
|
return sdp;
|
|
11945
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
|
+
}();
|
|
11946
12663
|
module.exports = {
|
|
11947
12664
|
isEmptyObject: isEmptyObject,
|
|
11948
12665
|
copyObjectToArray: copyObjectToArray,
|
|
@@ -11954,14 +12671,24 @@ module.exports = {
|
|
|
11954
12671
|
stripCodecs: stripCodecs,
|
|
11955
12672
|
getCurrentCodecAndSampleRate: getCurrentCodecAndSampleRate,
|
|
11956
12673
|
isPromise: isPromise,
|
|
11957
|
-
setPublishingBitrate: setPublishingBitrate
|
|
12674
|
+
setPublishingBitrate: setPublishingBitrate,
|
|
12675
|
+
addFieldToCsvString: addFieldToCsvString,
|
|
12676
|
+
compress: compress
|
|
11958
12677
|
};
|
|
11959
12678
|
|
|
11960
|
-
},{}],
|
|
12679
|
+
},{}],44:[function(require,module,exports){
|
|
11961
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); }
|
|
11962
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; } } }; }
|
|
12682
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
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."); }
|
|
11963
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; } }
|
|
11964
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; }
|
|
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; } }
|
|
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); }); }; }
|
|
11965
12692
|
-'use strict';
|
|
11966
12693
|
var browserDetails = require('webrtc-adapter')["default"].browserDetails;
|
|
11967
12694
|
var _require = require('uuid'),
|
|
@@ -12031,6 +12758,8 @@ var createConnection = function createConnection(options) {
|
|
|
12031
12758
|
var useControls = options.useControls || false;
|
|
12032
12759
|
// Stream event handler to rise an event #WCS-4097
|
|
12033
12760
|
var unmuteRequiredEvent = options.unmuteRequiredEvent ? options.unmuteRequiredEvent : null;
|
|
12761
|
+
// Current video capturer zoom #WCS-4579
|
|
12762
|
+
var zoom = null;
|
|
12034
12763
|
if (bidirectional) {
|
|
12035
12764
|
localVideo = getCacheInstance(localDisplay);
|
|
12036
12765
|
if (localVideo) {
|
|
@@ -12404,67 +13133,70 @@ var createConnection = function createConnection(options) {
|
|
|
12404
13133
|
}
|
|
12405
13134
|
return true;
|
|
12406
13135
|
};
|
|
12407
|
-
var getStat = function
|
|
12408
|
-
var
|
|
12409
|
-
|
|
12410
|
-
|
|
12411
|
-
|
|
12412
|
-
|
|
12413
|
-
|
|
12414
|
-
|
|
12415
|
-
|
|
12416
|
-
|
|
12417
|
-
|
|
12418
|
-
|
|
12419
|
-
|
|
12420
|
-
|
|
12421
|
-
|
|
12422
|
-
|
|
12423
|
-
|
|
12424
|
-
|
|
12425
|
-
|
|
12426
|
-
|
|
12427
|
-
|
|
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
|
+
}
|
|
12428
13163
|
}
|
|
12429
|
-
}
|
|
12430
|
-
|
|
12431
|
-
|
|
12432
|
-
|
|
12433
|
-
|
|
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);
|
|
12434
13171
|
}
|
|
12435
|
-
}
|
|
12436
|
-
|
|
12437
|
-
|
|
12438
|
-
|
|
12439
|
-
|
|
12440
|
-
|
|
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);
|
|
12441
13179
|
}
|
|
12442
|
-
}
|
|
13180
|
+
});
|
|
12443
13181
|
}
|
|
12444
|
-
|
|
12445
|
-
|
|
12446
|
-
|
|
12447
|
-
|
|
12448
|
-
|
|
12449
|
-
|
|
12450
|
-
|
|
12451
|
-
|
|
12452
|
-
|
|
12453
|
-
|
|
12454
|
-
|
|
12455
|
-
|
|
12456
|
-
return report.kind;
|
|
12457
|
-
}
|
|
12458
|
-
logger.warn(LOG_PREFIX, "No media type provided in WebRTC statistics");
|
|
12459
|
-
return "media";
|
|
12460
|
-
};
|
|
12461
|
-
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) {
|
|
12462
13194
|
var videoSize = {};
|
|
12463
|
-
if (
|
|
13195
|
+
if (type === 'outbound-rtp') {
|
|
12464
13196
|
if (localVideo !== undefined && localVideo != null) {
|
|
12465
13197
|
videoSize = localVideo.srcObject.getVideoTracks()[0].getSettings();
|
|
12466
13198
|
}
|
|
12467
|
-
} else if (
|
|
13199
|
+
} else if (type === 'inbound-rtp') {
|
|
12468
13200
|
if (remoteVideo !== undefined && remoteVideo != null) {
|
|
12469
13201
|
videoSize.width = remoteVideo.videoWidth;
|
|
12470
13202
|
videoSize.height = remoteVideo.videoHeight;
|
|
@@ -12841,6 +13573,113 @@ var createConnection = function createConnection(options) {
|
|
|
12841
13573
|
unmuteRequiredEvent();
|
|
12842
13574
|
}
|
|
12843
13575
|
};
|
|
13576
|
+
var getZoomCapabilities = function getZoomCapabilities() {
|
|
13577
|
+
if (localVideo && localVideo.srcObject) {
|
|
13578
|
+
if (constraints.video && constraints.video.zoom) {
|
|
13579
|
+
var _localVideo$srcObject = localVideo.srcObject.getVideoTracks(),
|
|
13580
|
+
_localVideo$srcObject2 = _slicedToArray(_localVideo$srcObject, 1),
|
|
13581
|
+
track = _localVideo$srcObject2[0];
|
|
13582
|
+
var capabilities = track.getCapabilities();
|
|
13583
|
+
var settings = track.getSettings();
|
|
13584
|
+
if (!('zoom' in settings)) {
|
|
13585
|
+
logger.info(LOG_PREFIX, "Zoom is not supported by " + track.label);
|
|
13586
|
+
zoom = null;
|
|
13587
|
+
} else {
|
|
13588
|
+
zoom = {
|
|
13589
|
+
min: capabilities.zoom.min,
|
|
13590
|
+
max: capabilities.zoom.max,
|
|
13591
|
+
step: capabilities.zoom.step,
|
|
13592
|
+
value: settings.zoom
|
|
13593
|
+
};
|
|
13594
|
+
}
|
|
13595
|
+
} else {
|
|
13596
|
+
zoom = null;
|
|
13597
|
+
}
|
|
13598
|
+
}
|
|
13599
|
+
return zoom;
|
|
13600
|
+
};
|
|
13601
|
+
var setZoom = /*#__PURE__*/function () {
|
|
13602
|
+
var _ref2 = _asyncToGenerator(/*#__PURE__*/_regenerator().m(function _callee2(value) {
|
|
13603
|
+
var _localVideo$srcObject3, _localVideo$srcObject4, track;
|
|
13604
|
+
return _regenerator().w(function (_context2) {
|
|
13605
|
+
while (1) switch (_context2.n) {
|
|
13606
|
+
case 0:
|
|
13607
|
+
if (!zoom) {
|
|
13608
|
+
_context2.n = 6;
|
|
13609
|
+
break;
|
|
13610
|
+
}
|
|
13611
|
+
if (!(value >= zoom.min && value <= zoom.max)) {
|
|
13612
|
+
_context2.n = 4;
|
|
13613
|
+
break;
|
|
13614
|
+
}
|
|
13615
|
+
if (!(localVideo && localVideo.srcObject)) {
|
|
13616
|
+
_context2.n = 2;
|
|
13617
|
+
break;
|
|
13618
|
+
}
|
|
13619
|
+
_localVideo$srcObject3 = localVideo.srcObject.getVideoTracks(), _localVideo$srcObject4 = _slicedToArray(_localVideo$srcObject3, 1), track = _localVideo$srcObject4[0];
|
|
13620
|
+
_context2.n = 1;
|
|
13621
|
+
return track.applyConstraints({
|
|
13622
|
+
advanced: [{
|
|
13623
|
+
zoom: value
|
|
13624
|
+
}]
|
|
13625
|
+
});
|
|
13626
|
+
case 1:
|
|
13627
|
+
zoom.value = value;
|
|
13628
|
+
_context2.n = 3;
|
|
13629
|
+
break;
|
|
13630
|
+
case 2:
|
|
13631
|
+
logger.warn(LOG_PREFIX, "Can't set zoom value: no local video");
|
|
13632
|
+
case 3:
|
|
13633
|
+
_context2.n = 5;
|
|
13634
|
+
break;
|
|
13635
|
+
case 4:
|
|
13636
|
+
logger.info(LOG_PREFIX, "Zoom value " + value + "is out of range: " + zoom.min + "-" + zoom.max);
|
|
13637
|
+
case 5:
|
|
13638
|
+
_context2.n = 7;
|
|
13639
|
+
break;
|
|
13640
|
+
case 6:
|
|
13641
|
+
logger.info(LOG_PREFIX, "Zoom is not supported or zoom capabilities unknown yet");
|
|
13642
|
+
case 7:
|
|
13643
|
+
return _context2.a(2);
|
|
13644
|
+
}
|
|
13645
|
+
}, _callee2);
|
|
13646
|
+
}));
|
|
13647
|
+
return function setZoom(_x3) {
|
|
13648
|
+
return _ref2.apply(this, arguments);
|
|
13649
|
+
};
|
|
13650
|
+
}();
|
|
13651
|
+
var getZoom = function getZoom() {
|
|
13652
|
+
if (zoom) {
|
|
13653
|
+
return zoom.value;
|
|
13654
|
+
}
|
|
13655
|
+
return -1;
|
|
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
|
+
};
|
|
12844
13683
|
var exports = {};
|
|
12845
13684
|
exports.state = state;
|
|
12846
13685
|
exports.createOffer = createOffer;
|
|
@@ -12870,6 +13709,10 @@ var createConnection = function createConnection(options) {
|
|
|
12870
13709
|
exports.setPublishingBitrate = setPublishingBitrate;
|
|
12871
13710
|
exports.updateVideoSettings = updateVideoSettings;
|
|
12872
13711
|
exports.updateVideoResolution = updateVideoResolution;
|
|
13712
|
+
exports.getZoomCapabilities = getZoomCapabilities;
|
|
13713
|
+
exports.setZoom = setZoom;
|
|
13714
|
+
exports.getZoom = getZoom;
|
|
13715
|
+
exports.getWebRTCStats = getWebRTCStats;
|
|
12873
13716
|
connections[id] = exports;
|
|
12874
13717
|
resolve(exports);
|
|
12875
13718
|
});
|
|
@@ -13643,5 +14486,5 @@ module.exports = {
|
|
|
13643
14486
|
getVideoElement: getVideoElement
|
|
13644
14487
|
};
|
|
13645
14488
|
|
|
13646
|
-
},{"./constants":39,"./util":
|
|
14489
|
+
},{"./constants":39,"./util":43,"uuid":8,"webrtc-adapter":23}]},{},[41])(41)
|
|
13647
14490
|
});
|