@byteplus/veplayer-plugin 2.10.0-rc.2 → 2.10.1

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.
@@ -581,6 +581,60 @@
581
581
  function _nonIterableRest() {
582
582
  throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
583
583
  }
584
+ function _createForOfIteratorHelper$1(o, allowArrayLike) {
585
+ var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
586
+ if (!it) {
587
+ if (Array.isArray(o) || (it = _unsupportedIterableToArray$2(o)) || allowArrayLike && o && typeof o.length === "number") {
588
+ if (it)
589
+ o = it;
590
+ var i = 0;
591
+ var F = function() {
592
+ };
593
+ return {
594
+ s: F,
595
+ n: function() {
596
+ if (i >= o.length)
597
+ return {
598
+ done: true
599
+ };
600
+ return {
601
+ done: false,
602
+ value: o[i++]
603
+ };
604
+ },
605
+ e: function(e) {
606
+ throw e;
607
+ },
608
+ f: F
609
+ };
610
+ }
611
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
612
+ }
613
+ var normalCompletion = true, didErr = false, err;
614
+ return {
615
+ s: function() {
616
+ it = it.call(o);
617
+ },
618
+ n: function() {
619
+ var step = it.next();
620
+ normalCompletion = step.done;
621
+ return step;
622
+ },
623
+ e: function(e) {
624
+ didErr = true;
625
+ err = e;
626
+ },
627
+ f: function() {
628
+ try {
629
+ if (!normalCompletion && it.return != null)
630
+ it.return();
631
+ } finally {
632
+ if (didErr)
633
+ throw err;
634
+ }
635
+ }
636
+ };
637
+ }
584
638
  function _toPrimitive$3(input, hint) {
585
639
  if (typeof input !== "object" || input === null)
586
640
  return input;
@@ -4296,10 +4350,28 @@
4296
4350
  }]);
4297
4351
  return NetLoader2;
4298
4352
  }(EventEmitter);
4299
- var EXTEND_EVENTS = {
4300
- RTC_STATE_CHANGE: "core.rtcstatechange",
4301
- RTC_NETWORK: "core.rtcnetwork"
4302
- };
4353
+ var EXTEND_EVENTS = /* @__PURE__ */ function(EXTEND_EVENTS2) {
4354
+ EXTEND_EVENTS2["RTC_STATE_CHANGE"] = "core.rtcstatechange";
4355
+ EXTEND_EVENTS2["RTC_NETWORK"] = "core.rtcnetwork";
4356
+ EXTEND_EVENTS2["RTC_FIRST_FRAME"] = "core.rtcfirstframe";
4357
+ return EXTEND_EVENTS2;
4358
+ }(EXTEND_EVENTS || {});
4359
+ var RTC_FIRST_FRAME_STATE = /* @__PURE__ */ function(RTC_FIRST_FRAME_STATE2) {
4360
+ RTC_FIRST_FRAME_STATE2["LOAD_START"] = "start_load";
4361
+ RTC_FIRST_FRAME_STATE2["OFFER_SDP_READY"] = "offer_sdp_ready";
4362
+ RTC_FIRST_FRAME_STATE2["ANSWER_SDP_RECV"] = "answer_sdp_recv";
4363
+ RTC_FIRST_FRAME_STATE2["ANSWER_SDP_READY"] = "answer_sdp_ready";
4364
+ RTC_FIRST_FRAME_STATE2["ICE_CONNECTED"] = "ice_connected";
4365
+ RTC_FIRST_FRAME_STATE2["DTLS_CONNECTED"] = "dtls_connected";
4366
+ RTC_FIRST_FRAME_STATE2["PEER_CONNECTED"] = "peer_connected";
4367
+ RTC_FIRST_FRAME_STATE2["FIRST_PACKET_RECV"] = "first_packet_recv";
4368
+ RTC_FIRST_FRAME_STATE2["FIRST_FRAME_RECV"] = "first_frame_recv";
4369
+ RTC_FIRST_FRAME_STATE2["FIRST_FRAME_DECODED"] = "first_frame_decoded";
4370
+ RTC_FIRST_FRAME_STATE2["VIDEO_PLAYING"] = "video_playing";
4371
+ RTC_FIRST_FRAME_STATE2["VIDEO_CANPLAY"] = "video_canplay";
4372
+ RTC_FIRST_FRAME_STATE2["VIDEO_LOADEDDATA"] = "video_loadeddata";
4373
+ return RTC_FIRST_FRAME_STATE2;
4374
+ }(RTC_FIRST_FRAME_STATE || {});
4303
4375
  var lib = {};
4304
4376
  var parser$1 = {};
4305
4377
  var grammar$2 = { exports: {} };
@@ -4993,29 +5065,29 @@
4993
5065
  enableOriginSdpLogger: false,
4994
5066
  checkStatsErrorDelay: 5e3,
4995
5067
  connectionStateChangeTimeout: 5e3,
4996
- enableNetworkQuality: false,
5068
+ enableNetworkQuality: true,
4997
5069
  hackCreateOfferIssue: false,
4998
5070
  progressiveSetDelay: false,
4999
5071
  networkQuality: {
5000
5072
  networkQos: {
5001
5073
  1: {
5002
- "maxRtt": 250,
5003
- "maxLoss": 0.15
5074
+ maxRtt: 250,
5075
+ maxLoss: 0.15
5004
5076
  },
5005
5077
  2: {
5006
- "maxRtt": 500,
5007
- "maxLoss": 0.3,
5008
- "minRetransmittedRate": 0.2
5078
+ maxRtt: 500,
5079
+ maxLoss: 0.3,
5080
+ minRetransmittedRate: 0.2
5009
5081
  },
5010
5082
  3: {
5011
- "maxRtt": 750,
5012
- "maxLoss": 0.45,
5013
- "minRetransmittedRate": 0.35
5083
+ maxRtt: 750,
5084
+ maxLoss: 0.45,
5085
+ minRetransmittedRate: 0.35
5014
5086
  },
5015
5087
  4: {
5016
- "maxRtt": 1e3,
5017
- "maxLoss": 0.6,
5018
- "minRetransmittedRate": 0.5
5088
+ maxRtt: 1e3,
5089
+ maxLoss: 0.6,
5090
+ minRetransmittedRate: 0.5
5019
5091
  }
5020
5092
  },
5021
5093
  networkQoe: {
@@ -5036,19 +5108,19 @@
5036
5108
  }, adaptiveJitterBuffer),
5037
5109
  networkStrategy: {
5038
5110
  1: {
5039
- "jitterBuffer": null
5111
+ jitterBuffer: null
5040
5112
  },
5041
5113
  2: {
5042
- "jitterBuffer": 1.5
5114
+ jitterBuffer: 1.5
5043
5115
  },
5044
5116
  3: {
5045
- "jitterBuffer": 2
5117
+ jitterBuffer: 2
5046
5118
  },
5047
5119
  4: {
5048
- "jitterBuffer": 3
5120
+ jitterBuffer: 3
5049
5121
  },
5050
5122
  5: {
5051
- "jitterBuffer": 3
5123
+ jitterBuffer: 3
5052
5124
  }
5053
5125
  }
5054
5126
  }, opts);
@@ -5079,14 +5151,36 @@
5079
5151
  };
5080
5152
  });
5081
5153
  }
5082
- function getStats(pc) {
5083
- return new Promise(function(resolve) {
5084
- var _pc$getStats;
5085
- (_pc$getStats = pc.getStats(null)) === null || _pc$getStats === void 0 ? void 0 : _pc$getStats.then(function(report) {
5086
- resolve(_getStats(report));
5087
- });
5088
- }).catch(function() {
5089
- });
5154
+ function getStats(_x) {
5155
+ return _getStats2.apply(this, arguments);
5156
+ }
5157
+ function _getStats2() {
5158
+ _getStats2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee2(pc) {
5159
+ return _regeneratorRuntime$1().wrap(function _callee2$(_context2) {
5160
+ while (1)
5161
+ switch (_context2.prev = _context2.next) {
5162
+ case 0:
5163
+ if (pc) {
5164
+ _context2.next = 2;
5165
+ break;
5166
+ }
5167
+ return _context2.abrupt("return", []);
5168
+ case 2:
5169
+ return _context2.abrupt("return", new Promise(function(resolve) {
5170
+ var _pc$getStats;
5171
+ (_pc$getStats = pc.getStats(null)) === null || _pc$getStats === void 0 ? void 0 : _pc$getStats.then(function(report) {
5172
+ resolve(_getStats(report));
5173
+ });
5174
+ }).catch(function() {
5175
+ return [];
5176
+ }));
5177
+ case 3:
5178
+ case "end":
5179
+ return _context2.stop();
5180
+ }
5181
+ }, _callee2);
5182
+ }));
5183
+ return _getStats2.apply(this, arguments);
5090
5184
  }
5091
5185
  function getStatsSnapshoot(stats) {
5092
5186
  var _v$inboundRtp, _v$codec, _v$codec2, _v$codec3, _v$inboundRtp4, _v$inboundRtp5, _v$inboundRtp6, _v$inboundRtp7, _v$inboundRtp8, _v$inboundRtp9, _v$inboundRtp10, _v$inboundRtp11, _v$inboundRtp$framesR, _v$inboundRtp12, _v$track, _v$inboundRtp13, _v$inboundRtp14, _v$inboundRtp15, _v$inboundRtp16, _v$inboundRtp17, _v$inboundRtp18, _a$codec, _a$codec2, _a$codec3, _a$inboundRtp, _a$inboundRtp2, _a$inboundRtp3, _a$inboundRtp4, _a$inboundRtp5, _a$inboundRtp6, _a$inboundRtp7, _a$inboundRtp8;
@@ -5156,22 +5250,23 @@
5156
5250
  }
5157
5251
  var QUEUE_SIZE = 5;
5158
5252
  var NetworkEvaluate = /* @__PURE__ */ function() {
5159
- function NetworkEvaluate2(pc, interval) {
5253
+ function NetworkEvaluate2(pc) {
5160
5254
  var _this = this;
5255
+ var interval = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 1e3;
5161
5256
  _classCallCheck$3(this, NetworkEvaluate2);
5162
- _defineProperty$2(this, "_pc", null);
5163
- _defineProperty$2(this, "_lastVideoStats", null);
5164
- _defineProperty$2(this, "_lastRemoteVideoStats", null);
5165
- _defineProperty$2(this, "_timer", 0);
5166
- _defineProperty$2(this, "_timerInterval", 0);
5167
- _defineProperty$2(this, "_speedQueue", []);
5168
- _defineProperty$2(this, "_lostRateQueue", []);
5169
- _defineProperty$2(this, "_receivedRateQueue", []);
5170
- _defineProperty$2(this, "_currentSpeed", -1);
5171
- _defineProperty$2(this, "_currentLostRate", -1);
5172
- _defineProperty$2(this, "_currentReceivedRate", -1);
5173
- _defineProperty$2(this, "_evaluate", /* @__PURE__ */ _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee() {
5174
- var snapshoot, _snapshoot$video, nowBytes, nowPkgLost, nowPkg, _this$_lastVideoStats, preBytes, prePkgLost, prePkg, lost, pkgReceived, nowReceived, preReceived, _snapshoot$videoRemot, nowRemoteSent, preRemoteSent;
5257
+ this._pc = null;
5258
+ this._lastVideoStats = null;
5259
+ this._lastRemoteVideoStats = null;
5260
+ this._timer = 0;
5261
+ this._timerInterval = 0;
5262
+ this._speedQueue = [];
5263
+ this._lostRateQueue = [];
5264
+ this._receivedRateQueue = [];
5265
+ this._currentSpeed = -1;
5266
+ this._currentLostRate = -1;
5267
+ this._currentReceivedRate = -1;
5268
+ this._evaluate = /* @__PURE__ */ _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee() {
5269
+ var snapshoot, _snapshoot$video, nowBytes, nowPkgLost, nowPkg, _this$_lastVideoStats, preBytes, prePkgLost, prePkg, lost, pkgReceived, _ref2, _ref2$bytesReceived, nowReceived, _ref3, _ref3$bytesReceived, preReceived, _snapshoot$videoRemot, nowRemoteSent, preRemoteSent;
5175
5270
  return _regeneratorRuntime$1().wrap(function _callee$(_context) {
5176
5271
  while (1)
5177
5272
  switch (_context.prev = _context.next) {
@@ -5196,8 +5291,8 @@
5196
5291
  }
5197
5292
  }
5198
5293
  if (_this._lastRemoteVideoStats && snapshoot !== null && snapshoot !== void 0 && snapshoot.videoRemote) {
5199
- nowReceived = snapshoot.video.bytesReceived;
5200
- preReceived = _this._lastVideoStats.bytesReceived;
5294
+ _ref2 = snapshoot.video || {}, _ref2$bytesReceived = _ref2.bytesReceived, nowReceived = _ref2$bytesReceived === void 0 ? 0 : _ref2$bytesReceived;
5295
+ _ref3 = _this._lastVideoStats || {}, _ref3$bytesReceived = _ref3.bytesReceived, preReceived = _ref3$bytesReceived === void 0 ? 0 : _ref3$bytesReceived;
5201
5296
  _snapshoot$videoRemot = snapshoot === null || snapshoot === void 0 ? void 0 : snapshoot.videoRemote, nowRemoteSent = _snapshoot$videoRemot.bytesSent;
5202
5297
  preRemoteSent = _this._lastRemoteVideoStats.bytesSent;
5203
5298
  if (preRemoteSent && nowRemoteSent && nowRemoteSent - preRemoteSent > 0) {
@@ -5216,7 +5311,7 @@
5216
5311
  return _context.stop();
5217
5312
  }
5218
5313
  }, _callee, null, [[0, 10]]);
5219
- })));
5314
+ }));
5220
5315
  this._pc = pc;
5221
5316
  this._timerInterval = interval;
5222
5317
  this.start(interval);
@@ -5331,6 +5426,9 @@
5331
5426
  return pc.createOffer().then(function(offer) {
5332
5427
  var _sdpJson$media, _sdpJson$media2, _vMedia$rtp, _aMedia$rtp;
5333
5428
  logger.log(offer.sdp);
5429
+ if (!offer.sdp) {
5430
+ return Promise.reject("createOffer no sdp");
5431
+ }
5334
5432
  var sdpJson = lib.parse(offer.sdp);
5335
5433
  var vMedia = (_sdpJson$media = sdpJson.media) === null || _sdpJson$media === void 0 ? void 0 : _sdpJson$media.filter(function(x) {
5336
5434
  return x.type === "video";
@@ -5518,7 +5616,7 @@
5518
5616
  var RTCDataView = /* @__PURE__ */ function() {
5519
5617
  function RTCDataView2(buffer) {
5520
5618
  _classCallCheck$3(this, RTCDataView2);
5521
- _defineProperty$2(this, "_position", 0);
5619
+ this._position = 0;
5522
5620
  this._dataview = new DataView(buffer);
5523
5621
  }
5524
5622
  _createClass$3(RTCDataView2, [{
@@ -5920,7 +6018,7 @@
5920
6018
  transformer.readable.pipeThrough(transform).pipeTo(event.transformer.writable);
5921
6019
  });
5922
6020
  }
5923
- var encodedJs = "IWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBlPXtnZXROQUxVbml0czpmdW5jdGlvbih0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdO2lmKHQubGVuZ3RoLXQucG9zaXRpb248NClyZXR1cm5bXTt2YXIgcj10LnBvc2l0aW9uO3JldHVybiAxPT09dC5nZXRJbnQzMihyKXx8MD09PXQuZ2V0SW50MTYocikmJjE9PT10LmdldEludDgocisyKT9lLmdldEFubmV4Yk5hbHModCxuKTplLmdldEF2Y2NOYWxzKHQsbil9LGdldEFubmV4Yk5hbHM6ZnVuY3Rpb24odCxuKXtmb3IodmFyIHI9W10saT1lLmdldEhlYWRlclBvc2l0aW9uQW5uZXhCKHQpLGE9aS5wb3Msbz1hO2E8dC5sZW5ndGgtNDspe3ZhciB1PW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKGEsYStpLmhlYWRlckxlbmd0aCkpO2kucG9zPT09dC5wb3NpdGlvbiYmdC5za2lwKGkuaGVhZGVyTGVuZ3RoKSxvPShpPWUuZ2V0SGVhZGVyUG9zaXRpb25Bbm5leEIodCkpLnBvczt2YXIgcz17aGVhZGVyOnUsYm9keTpuZXcgVWludDhBcnJheSh0LmJ1ZmZlci5zbGljZShhK3UuYnl0ZUxlbmd0aCxvKSksdHlwZTotMX07bj9lLmFuYWx5c2VIMjY1TmFsKHMpOmUuYW5hbHlzZU5hbChzKSwocy50eXBlPD05fHxuJiZzLnR5cGU8PTQwKSYmMCE9PXMudHlwZSYmci5wdXNoKHMpLHQuc2tpcChvLXQucG9zaXRpb24pLGE9b31yZXR1cm4gcn0sZ2V0QXZjY05hbHM6ZnVuY3Rpb24odCxuKXtmb3IodmFyIHI9W107dC5wb3NpdGlvbjx0Lmxlbmd0aC00Oyl7dmFyIGk9dC5nZXRJbnQzMih0LnBvc2l0aW9uKTtpZighKHQubGVuZ3RoLXQucG9zaXRpb24+PWkpKWJyZWFrO3ZhciBhPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKHQucG9zaXRpb24sdC5wb3NpdGlvbis0KSk7dC5za2lwKDQpO3ZhciBvPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKHQucG9zaXRpb24sdC5wb3NpdGlvbitpKSk7dC5za2lwKGkpO3ZhciB1PXtoZWFkZXI6YSxib2R5Om8sdHlwZTotMX07bj9lLmFuYWx5c2VIMjY1TmFsKHUpOmUuYW5hbHlzZU5hbCh1KSx1LnR5cGU8PTkmJjAhPT11LnR5cGUmJnIucHVzaCh1KX1yZXR1cm4gcn0sYW5hbHlzZU5hbDpmdW5jdGlvbihlKXt2YXIgdD0zMSZlLmJvZHlbMF07c3dpdGNoKGUudHlwZT10LHQpe2Nhc2UgMTplLm5kcj0hMDticmVhaztjYXNlIDU6ZS5pZHI9ITA7YnJlYWs7Y2FzZSA2OmUuc2VpPSEwO2JyZWFrO2Nhc2UgNzplLnNwcz0hMDticmVhaztjYXNlIDg6ZS5wcHM9ITB9fSxhbmFseXNlSDI2NU5hbDpmdW5jdGlvbihlKXt2YXIgdD0oMTI2JmUuYm9keVswXSk+PjE7c3dpdGNoKGUudHlwZT10LHQpe2Nhc2UgMzk6Y2FzZSA0MDplLnNlaT0hMH19LGdldEhlYWRlclBvc2l0aW9uQW5uZXhCOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLnBvc2l0aW9uLG49MCxyPWUubGVuZ3RoOzMhPT1uJiY0IT09biYmdDxyLTQ7KTA9PT1lLmdldEludDE2KHQpPzE9PT1lLmdldEludDE2KHQrMik/bj00OjE9PT1lLmdldEludDgodCsyKT9uPTM6dCsrOnQrKztyZXR1cm4gdD09PXItNCYmKDA9PT1lLmdldEludDE2KHQpPzE9PT1lLmdldEludDE2KHQrMik/bj00OnQ9cjoodCsrLDA9PT1lLmdldEludDE2KHQpJiYxPT09ZS5nZXRJbnQ4KHQpP249Mzp0PXIpKSx7cG9zOnQsaGVhZGVyTGVuZ3RoOm59fSxpc0gyNjVWaWRlb0ZyYW1lOmZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuKChudWxsPT09KHQ9ZS5nZXRNZXRhZGF0YSl8fHZvaWQgMD09PXR8fG51bGw9PT0obj10LmNhbGwoZSkpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLm1pbWVUeXBlKXx8IiIpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoImgyNjUiKX19O2Z1bmN0aW9uIHQoZSl7cmV0dXJuKHQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9KShlKX1mdW5jdGlvbiBuKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPXRbbl07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITEsaS5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGkmJihpLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyKGkua2V5KSxpKX19ZnVuY3Rpb24gcihlKXt2YXIgdD1mdW5jdGlvbihlLHQpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuIGU7dmFyIG49ZVtTeW1ib2wudG9QcmltaXRpdmVdO2lmKHZvaWQgMCE9PW4pe3ZhciByPW4uY2FsbChlLHR8fCJkZWZhdWx0Iik7aWYoIm9iamVjdCIhPXR5cGVvZiByKXJldHVybiByO3Rocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIil9cmV0dXJuKCJzdHJpbmciPT09dD9TdHJpbmc6TnVtYmVyKShlKX0oZSwic3RyaW5nIik7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0P3Q6U3RyaW5nKHQpfXZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXt2YXIgbixpLGE7IWZ1bmN0aW9uKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsZSksbj10aGlzLGE9MCwoaT1yKGk9Il9wb3NpdGlvbiIpKWluIG4/T2JqZWN0LmRlZmluZVByb3BlcnR5KG4saSx7dmFsdWU6YSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOm5baV09YSx0aGlzLl9kYXRhdmlldz1uZXcgRGF0YVZpZXcodCl9dmFyIHQsaSxhO3JldHVybiB0PWUsYT1be2tleToicmVhZEJ5dGUiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtzd2l0Y2godCl7Y2FzZSAxOnI9bj9lLmdldEludDgoZS5wb3NpdGlvbik6ZS5nZXRVaW50OChlLnBvc2l0aW9uKTticmVhaztjYXNlIDI6cj1uP2UuZ2V0SW50MTYoZS5wb3NpdGlvbik6ZS5nZXRVaW50MTYoZS5wb3NpdGlvbik7YnJlYWs7Y2FzZSAzOmlmKG4pdGhyb3cgbmV3IEVycm9yKCJub3Qgc3VwcG9ydGVkIGZvciByZWFkQnl0ZSAzIik7cj1lLmdldFVpbnQ4KGUucG9zaXRpb24pPDwxNixyfD1lLmdldFVpbnQ4KGUucG9zaXRpb24rMSk8PDgscnw9ZS5nZXRVaW50OChlLnBvc2l0aW9uKzIpO2JyZWFrO2Nhc2UgNDpyPW4/ZS5nZXRJbnQzMihlLnBvc2l0aW9uKTplLmdldFVpbnQzMihlLnBvc2l0aW9uKTticmVhaztjYXNlIDg6aWYobil0aHJvdyBuZXcgRXJyb3IoIm5vdCBzdXBwb3J0ZWQgZm9yIHJlYWRCb2R5IDgiKTtyPWUuZ2V0VWludDMyKGUucG9zaXRpb24pPDwzMixyfD1lLmdldFVpbnQzMihlLnBvc2l0aW9uKzQpO2JyZWFrO2RlZmF1bHQ6cj0iIn1yZXR1cm4gZS5wb3NpdGlvbis9dCxyfX1dLChpPVt7a2V5OiJsZW5ndGgiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RofX0se2tleToiYnVmZmVyIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YXZpZXcuYnVmZmVyfX0se2tleToicG9zaXRpb24iLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3NpdGlvbn0sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX3Bvc2l0aW9uPWV9fSx7a2V5OiJiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnBvc2l0aW9uLT1lfX0se2tleToiZ2V0VWludDgiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9kYXRhdmlldy5nZXRVaW50OChlKX19LHtrZXk6ImdldEludDgiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9kYXRhdmlldy5nZXRJbnQ4KGUpfX0se2tleToiZ2V0SW50MTYiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9kYXRhdmlldy5nZXRJbnQxNihlKX19LHtrZXk6ImdldFVpbnQxNiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2RhdGF2aWV3LmdldFVpbnQxNihlKX19LHtrZXk6ImdldFVpbnQzMiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2RhdGF2aWV3LmdldFVpbnQzMihlKX19LHtrZXk6ImdldEludDMyIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZGF0YXZpZXcuZ2V0SW50MzIoZSl9fSx7a2V5OiJza2lwIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIG49TWF0aC5mbG9vcih0LzQpLHI9dCU0LGk9MDtpPG47aSsrKWUucmVhZEJ5dGUodGhpcyw0KTtyPjAmJmUucmVhZEJ5dGUodGhpcyxyKX19LHtrZXk6InJlYWRVaW50OCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDEpfX0se2tleToicmVhZFVpbnQxNiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDIpfX0se2tleToicmVhZFVpbnQyNCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDMpfX0se2tleToicmVhZFVpbnQzMiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDQpfX0se2tleToicmVhZFVpbnQ2NCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDgpfX0se2tleToicmVhZEludDgiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGUucmVhZEJ5dGUodGhpcywxLCEwKX19LHtrZXk6InJlYWRJbnQxNiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDIsITApfX0se2tleToicmVhZEludDMyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBlLnJlYWRCeXRlKHRoaXMsNCwhMCl9fSx7a2V5OiJ3cml0ZVVpbnQzMiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBVaW50OEFycmF5KFtlPj4+MjQmMjU1LGU+Pj4xNiYyNTUsZT4+PjgmMjU1LDI1NSZlXSl9fV0pJiZuKHQucHJvdG90eXBlLGkpLGEmJm4odCxhKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlfSgpO2Z1bmN0aW9uIGEoZSxuKXtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bltyXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMSxpLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gaSYmKGkud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLChhPWkua2V5LG89dm9pZCAwLG89ZnVuY3Rpb24oZSxuKXtpZigib2JqZWN0IiE9PXQoZSl8fG51bGw9PT1lKXJldHVybiBlO3ZhciByPWVbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZih2b2lkIDAhPT1yKXt2YXIgaT1yLmNhbGwoZSxufHwiZGVmYXVsdCIpO2lmKCJvYmplY3QiIT09dChpKSlyZXR1cm4gaTt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PW4/U3RyaW5nOk51bWJlcikoZSl9KGEsInN0cmluZyIpLCJzeW1ib2wiPT09dChvKT9vOlN0cmluZyhvKSksaSl9dmFyIGEsb31mdW5jdGlvbiBvKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO3JldHVybihlW3RdPDwyND4+PjApKyhlW3QrMV08PDE2KSsoZVt0KzJdPDw4KSsoZVt0KzNdfHwwKX12YXIgdT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXshZnVuY3Rpb24oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxlKX12YXIgdCxuLHI7cmV0dXJuIHQ9ZSxyPVt7a2V5OiJwYXJzZUFubmV4QiIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ieXRlTGVuZ3RoLTEsbj0wO2Rve2lmKDAhPT1lW3RdKWJyZWFrO24rKyx0LS19d2hpbGUodD4wKTtuPj0zJiYoZT1lLnN1YmFycmF5KDAsdCsxKSk7Zm9yKHZhciByPWUubGVuZ3RoLGk9MixhPTA7bnVsbCE9PWVbaV0mJnZvaWQgMCE9PWVbaV0mJjEhPT1lW2ldOylpKys7aWYoKGE9MisgKytpKT49cilyZXR1cm5bXTtmb3IodmFyIG89W107YTxyOylzd2l0Y2goZVthXSl7Y2FzZSAwOmlmKDAhPT1lW2EtMV0pe2ErPTI7YnJlYWt9aWYoMCE9PWVbYS0yXSl7YSsrO2JyZWFrfWlmKGE8ci0xJiYxIT09ZVthKzFdKXthKys7YnJlYWt9aSE9PWEtMiYmby5wdXNoKGUuc3ViYXJyYXkoaSxhLTIpKTtkb3thKyt9d2hpbGUoMSE9PWVbYV0mJmE8cik7YT0oaT1hKzEpKzI7YnJlYWs7Y2FzZSAxOmlmKDAhPT1lW2EtMV18fDAhPT1lW2EtMl0pe2ErPTM7YnJlYWt9aSE9PWEtMiYmby5wdXNoKGUuc3ViYXJyYXkoaSxhLTIpKSxhPShpPWErMSkrMjticmVhaztkZWZhdWx0OmErPTN9cmV0dXJuIGk8ciYmby5wdXNoKGUuc3ViYXJyYXkoaSkpLG99fSx7a2V5OiJwYXJzZUF2Y0MiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTo0O2lmKCEoZS5sZW5ndGg8NCkpe2Zvcih2YXIgbixyPWUubGVuZ3RoLGk9W10sYT0wO2ErdDxyOylpZihuPW8oZSxhKSwzPT09dCYmKG4+Pj49OCksYSs9dCxuKXtpZihhK24+cilicmVhaztpLnB1c2goZS5zdWJhcnJheShhLGErbikpLGErPW59cmV0dXJuIGl9fX0se2tleToicGFyc2VTRUkiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWUubGVuZ3RoLHI9dD8yOjEsaT0wLGE9MCxvPSIiOzI1NT09PWVbcl07KWkrPTI1NSxyKys7Zm9yKGkrPWVbcisrXTsyNTU9PT1lW3JdOylhKz0yNTUscisrO2lmKGErPWVbcisrXSw1PT09aSYmbj5yKzE2KWZvcih2YXIgdT0wO3U8MTY7dSsrKW8rPWVbcl0udG9TdHJpbmcoMTYpLHIrKztyZXR1cm57cGF5bG9hZDplLnN1YmFycmF5KHIscithKSx0eXBlOmksc2l6ZTphLHV1aWQ6b319fSx7a2V5OiJyZW1vdmVFUEIiLHZhbHVlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmJ5dGVMZW5ndGgsbj1bXSxyPTE7cjx0LTI7KTA9PT1lW3JdJiYwPT09ZVtyKzFdJiYzPT09ZVtyKzJdPyhuLnB1c2gocisyKSxyKz0yKTpyKys7aWYoIW4ubGVuZ3RoKXJldHVybiBlO3ZhciBpPXQtbi5sZW5ndGgsYT1uZXcgVWludDhBcnJheShpKSxvPTA7Zm9yKHI9MDtyPGk7bysrLHIrKylvPT09blswXSYmKG8rKyxuLnNoaWZ0KCkpLGFbcl09ZVtvXTtyZXR1cm4gYX19XSwobj1udWxsKSYmYSh0LnByb3RvdHlwZSxuKSxyJiZhKHQsciksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksZX0oKTsidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJiJEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZSI9PT1zZWxmLmNvbnN0cnVjdG9yLm5hbWUmJnNlbGYuYWRkRXZlbnRMaXN0ZW5lcigicnRjdHJhbnNmb3JtIiwoZnVuY3Rpb24odCl7dmFyIG4scj10LnRyYW5zZm9ybWVyLGE9ci5vcHRpb25zLnBvcnQsbz0obj1mdW5jdGlvbihlKXthLnBvc3RNZXNzYWdlKGUpfSxuZXcgVHJhbnNmb3JtU3RyZWFtKHt0cmFuc2Zvcm06ZnVuY3Rpb24odCxyKXt2YXIgYT1lLmlzSDI2NVZpZGVvRnJhbWUodCk7ZS5nZXROQUxVbml0cyhuZXcgaSh0LmRhdGEpLGEpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKGUuc2VpKXt2YXIgdD11LnBhcnNlU0VJKHUucmVtb3ZlRVBCKGUuYm9keSksITEpO3QmJm4oe2RhdGE6dCxzZWk6e2NvZGU6dC50eXBlLGNvbnRlbnQ6dC5wYXlsb2FkfX0pfX0pKSxyLmVucXVldWUodCl9fSkpO3IucmVhZGFibGUucGlwZVRocm91Z2gobykucGlwZVRvKHQudHJhbnNmb3JtZXIud3JpdGFibGUpfSkpfSgpOwo=";
6021
+ var encodedJs = "IWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBlPXtnZXROQUxVbml0czpmdW5jdGlvbih0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdO2lmKHQubGVuZ3RoLXQucG9zaXRpb248NClyZXR1cm5bXTt2YXIgcj10LnBvc2l0aW9uO3JldHVybiAxPT09dC5nZXRJbnQzMihyKXx8MD09PXQuZ2V0SW50MTYocikmJjE9PT10LmdldEludDgocisyKT9lLmdldEFubmV4Yk5hbHModCxuKTplLmdldEF2Y2NOYWxzKHQsbil9LGdldEFubmV4Yk5hbHM6ZnVuY3Rpb24odCxuKXtmb3IodmFyIHI9W10saT1lLmdldEhlYWRlclBvc2l0aW9uQW5uZXhCKHQpLGE9aS5wb3Msbz1hO2E8dC5sZW5ndGgtNDspe3ZhciB1PW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKGEsYStpLmhlYWRlckxlbmd0aCkpO2kucG9zPT09dC5wb3NpdGlvbiYmdC5za2lwKGkuaGVhZGVyTGVuZ3RoKSxvPShpPWUuZ2V0SGVhZGVyUG9zaXRpb25Bbm5leEIodCkpLnBvczt2YXIgcz17aGVhZGVyOnUsYm9keTpuZXcgVWludDhBcnJheSh0LmJ1ZmZlci5zbGljZShhK3UuYnl0ZUxlbmd0aCxvKSksdHlwZTotMX07bj9lLmFuYWx5c2VIMjY1TmFsKHMpOmUuYW5hbHlzZU5hbChzKSwocy50eXBlPD05fHxuJiZzLnR5cGU8PTQwKSYmMCE9PXMudHlwZSYmci5wdXNoKHMpLHQuc2tpcChvLXQucG9zaXRpb24pLGE9b31yZXR1cm4gcn0sZ2V0QXZjY05hbHM6ZnVuY3Rpb24odCxuKXtmb3IodmFyIHI9W107dC5wb3NpdGlvbjx0Lmxlbmd0aC00Oyl7dmFyIGk9dC5nZXRJbnQzMih0LnBvc2l0aW9uKTtpZighKHQubGVuZ3RoLXQucG9zaXRpb24+PWkpKWJyZWFrO3ZhciBhPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKHQucG9zaXRpb24sdC5wb3NpdGlvbis0KSk7dC5za2lwKDQpO3ZhciBvPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKHQucG9zaXRpb24sdC5wb3NpdGlvbitpKSk7dC5za2lwKGkpO3ZhciB1PXtoZWFkZXI6YSxib2R5Om8sdHlwZTotMX07bj9lLmFuYWx5c2VIMjY1TmFsKHUpOmUuYW5hbHlzZU5hbCh1KSx1LnR5cGU8PTkmJjAhPT11LnR5cGUmJnIucHVzaCh1KX1yZXR1cm4gcn0sYW5hbHlzZU5hbDpmdW5jdGlvbihlKXt2YXIgdD0zMSZlLmJvZHlbMF07c3dpdGNoKGUudHlwZT10LHQpe2Nhc2UgMTplLm5kcj0hMDticmVhaztjYXNlIDU6ZS5pZHI9ITA7YnJlYWs7Y2FzZSA2OmUuc2VpPSEwO2JyZWFrO2Nhc2UgNzplLnNwcz0hMDticmVhaztjYXNlIDg6ZS5wcHM9ITB9fSxhbmFseXNlSDI2NU5hbDpmdW5jdGlvbihlKXt2YXIgdD0oMTI2JmUuYm9keVswXSk+PjE7c3dpdGNoKGUudHlwZT10LHQpe2Nhc2UgMzk6Y2FzZSA0MDplLnNlaT0hMH19LGdldEhlYWRlclBvc2l0aW9uQW5uZXhCOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLnBvc2l0aW9uLG49MCxyPWUubGVuZ3RoOzMhPT1uJiY0IT09biYmdDxyLTQ7KTA9PT1lLmdldEludDE2KHQpPzE9PT1lLmdldEludDE2KHQrMik/bj00OjE9PT1lLmdldEludDgodCsyKT9uPTM6dCsrOnQrKztyZXR1cm4gdD09PXItNCYmKDA9PT1lLmdldEludDE2KHQpPzE9PT1lLmdldEludDE2KHQrMik/bj00OnQ9cjoodCsrLDA9PT1lLmdldEludDE2KHQpJiYxPT09ZS5nZXRJbnQ4KHQpP249Mzp0PXIpKSx7cG9zOnQsaGVhZGVyTGVuZ3RoOm59fSxpc0gyNjVWaWRlb0ZyYW1lOmZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuKChudWxsPT09KHQ9ZS5nZXRNZXRhZGF0YSl8fHZvaWQgMD09PXR8fG51bGw9PT0obj10LmNhbGwoZSkpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLm1pbWVUeXBlKXx8IiIpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoImgyNjUiKX19O2Z1bmN0aW9uIHQoZSl7cmV0dXJuKHQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9KShlKX1mdW5jdGlvbiBuKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwoaT1yLmtleSxhPXZvaWQgMCwic3ltYm9sIj09dHlwZW9mKGE9ZnVuY3Rpb24oZSx0KXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiBlO3ZhciBuPWVbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZih2b2lkIDAhPT1uKXt2YXIgcj1uLmNhbGwoZSx0fHwiZGVmYXVsdCIpO2lmKCJvYmplY3QiIT10eXBlb2YgcilyZXR1cm4gcjt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PXQ/U3RyaW5nOk51bWJlcikoZSl9KGksInN0cmluZyIpKT9hOlN0cmluZyhhKSkscil9dmFyIGksYX12YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7IWZ1bmN0aW9uKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsZSksdGhpcy5fcG9zaXRpb249MCx0aGlzLl9kYXRhdmlldz1uZXcgRGF0YVZpZXcodCl9dmFyIHQscixpO3JldHVybiB0PWUsaT1be2tleToicmVhZEJ5dGUiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtzd2l0Y2godCl7Y2FzZSAxOnI9bj9lLmdldEludDgoZS5wb3NpdGlvbik6ZS5nZXRVaW50OChlLnBvc2l0aW9uKTticmVhaztjYXNlIDI6cj1uP2UuZ2V0SW50MTYoZS5wb3NpdGlvbik6ZS5nZXRVaW50MTYoZS5wb3NpdGlvbik7YnJlYWs7Y2FzZSAzOmlmKG4pdGhyb3cgbmV3IEVycm9yKCJub3Qgc3VwcG9ydGVkIGZvciByZWFkQnl0ZSAzIik7cj1lLmdldFVpbnQ4KGUucG9zaXRpb24pPDwxNixyfD1lLmdldFVpbnQ4KGUucG9zaXRpb24rMSk8PDgscnw9ZS5nZXRVaW50OChlLnBvc2l0aW9uKzIpO2JyZWFrO2Nhc2UgNDpyPW4/ZS5nZXRJbnQzMihlLnBvc2l0aW9uKTplLmdldFVpbnQzMihlLnBvc2l0aW9uKTticmVhaztjYXNlIDg6aWYobil0aHJvdyBuZXcgRXJyb3IoIm5vdCBzdXBwb3J0ZWQgZm9yIHJlYWRCb2R5IDgiKTtyPWUuZ2V0VWludDMyKGUucG9zaXRpb24pPDwzMixyfD1lLmdldFVpbnQzMihlLnBvc2l0aW9uKzQpO2JyZWFrO2RlZmF1bHQ6cj0iIn1yZXR1cm4gZS5wb3NpdGlvbis9dCxyfX1dLChyPVt7a2V5OiJsZW5ndGgiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RofX0se2tleToiYnVmZmVyIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YXZpZXcuYnVmZmVyfX0se2tleToicG9zaXRpb24iLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3NpdGlvbn0sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX3Bvc2l0aW9uPWV9fSx7a2V5OiJiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnBvc2l0aW9uLT1lfX0se2tleToiZ2V0VWludDgiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9kYXRhdmlldy5nZXRVaW50OChlKX19LHtrZXk6ImdldEludDgiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9kYXRhdmlldy5nZXRJbnQ4KGUpfX0se2tleToiZ2V0SW50MTYiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9kYXRhdmlldy5nZXRJbnQxNihlKX19LHtrZXk6ImdldFVpbnQxNiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2RhdGF2aWV3LmdldFVpbnQxNihlKX19LHtrZXk6ImdldFVpbnQzMiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2RhdGF2aWV3LmdldFVpbnQzMihlKX19LHtrZXk6ImdldEludDMyIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZGF0YXZpZXcuZ2V0SW50MzIoZSl9fSx7a2V5OiJza2lwIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIG49TWF0aC5mbG9vcih0LzQpLHI9dCU0LGk9MDtpPG47aSsrKWUucmVhZEJ5dGUodGhpcyw0KTtyPjAmJmUucmVhZEJ5dGUodGhpcyxyKX19LHtrZXk6InJlYWRVaW50OCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDEpfX0se2tleToicmVhZFVpbnQxNiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDIpfX0se2tleToicmVhZFVpbnQyNCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDMpfX0se2tleToicmVhZFVpbnQzMiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDQpfX0se2tleToicmVhZFVpbnQ2NCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDgpfX0se2tleToicmVhZEludDgiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGUucmVhZEJ5dGUodGhpcywxLCEwKX19LHtrZXk6InJlYWRJbnQxNiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDIsITApfX0se2tleToicmVhZEludDMyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBlLnJlYWRCeXRlKHRoaXMsNCwhMCl9fSx7a2V5OiJ3cml0ZVVpbnQzMiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBVaW50OEFycmF5KFtlPj4+MjQmMjU1LGU+Pj4xNiYyNTUsZT4+PjgmMjU1LDI1NSZlXSl9fV0pJiZuKHQucHJvdG90eXBlLHIpLGkmJm4odCxpKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlfSgpO2Z1bmN0aW9uIGkoZSxuKXtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bltyXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMSxpLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gaSYmKGkud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLChhPWkua2V5LG89dm9pZCAwLG89ZnVuY3Rpb24oZSxuKXtpZigib2JqZWN0IiE9PXQoZSl8fG51bGw9PT1lKXJldHVybiBlO3ZhciByPWVbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZih2b2lkIDAhPT1yKXt2YXIgaT1yLmNhbGwoZSxufHwiZGVmYXVsdCIpO2lmKCJvYmplY3QiIT09dChpKSlyZXR1cm4gaTt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PW4/U3RyaW5nOk51bWJlcikoZSl9KGEsInN0cmluZyIpLCJzeW1ib2wiPT09dChvKT9vOlN0cmluZyhvKSksaSl9dmFyIGEsb31mdW5jdGlvbiBhKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO3JldHVybihlW3RdPDwyND4+PjApKyhlW3QrMV08PDE2KSsoZVt0KzJdPDw4KSsoZVt0KzNdfHwwKX12YXIgbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXshZnVuY3Rpb24oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxlKX12YXIgdCxuLHI7cmV0dXJuIHQ9ZSxyPVt7a2V5OiJwYXJzZUFubmV4QiIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ieXRlTGVuZ3RoLTEsbj0wO2Rve2lmKDAhPT1lW3RdKWJyZWFrO24rKyx0LS19d2hpbGUodD4wKTtuPj0zJiYoZT1lLnN1YmFycmF5KDAsdCsxKSk7Zm9yKHZhciByPWUubGVuZ3RoLGk9MixhPTA7bnVsbCE9PWVbaV0mJnZvaWQgMCE9PWVbaV0mJjEhPT1lW2ldOylpKys7aWYoKGE9MisgKytpKT49cilyZXR1cm5bXTtmb3IodmFyIG89W107YTxyOylzd2l0Y2goZVthXSl7Y2FzZSAwOmlmKDAhPT1lW2EtMV0pe2ErPTI7YnJlYWt9aWYoMCE9PWVbYS0yXSl7YSsrO2JyZWFrfWlmKGE8ci0xJiYxIT09ZVthKzFdKXthKys7YnJlYWt9aSE9PWEtMiYmby5wdXNoKGUuc3ViYXJyYXkoaSxhLTIpKTtkb3thKyt9d2hpbGUoMSE9PWVbYV0mJmE8cik7YT0oaT1hKzEpKzI7YnJlYWs7Y2FzZSAxOmlmKDAhPT1lW2EtMV18fDAhPT1lW2EtMl0pe2ErPTM7YnJlYWt9aSE9PWEtMiYmby5wdXNoKGUuc3ViYXJyYXkoaSxhLTIpKSxhPShpPWErMSkrMjticmVhaztkZWZhdWx0OmErPTN9cmV0dXJuIGk8ciYmby5wdXNoKGUuc3ViYXJyYXkoaSkpLG99fSx7a2V5OiJwYXJzZUF2Y0MiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTo0O2lmKCEoZS5sZW5ndGg8NCkpe2Zvcih2YXIgbixyPWUubGVuZ3RoLGk9W10sbz0wO28rdDxyOylpZihuPWEoZSxvKSwzPT09dCYmKG4+Pj49OCksbys9dCxuKXtpZihvK24+cilicmVhaztpLnB1c2goZS5zdWJhcnJheShvLG8rbikpLG8rPW59cmV0dXJuIGl9fX0se2tleToicGFyc2VTRUkiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWUubGVuZ3RoLHI9dD8yOjEsaT0wLGE9MCxvPSIiOzI1NT09PWVbcl07KWkrPTI1NSxyKys7Zm9yKGkrPWVbcisrXTsyNTU9PT1lW3JdOylhKz0yNTUscisrO2lmKGErPWVbcisrXSw1PT09aSYmbj5yKzE2KWZvcih2YXIgdT0wO3U8MTY7dSsrKW8rPWVbcl0udG9TdHJpbmcoMTYpLHIrKztyZXR1cm57cGF5bG9hZDplLnN1YmFycmF5KHIscithKSx0eXBlOmksc2l6ZTphLHV1aWQ6b319fSx7a2V5OiJyZW1vdmVFUEIiLHZhbHVlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmJ5dGVMZW5ndGgsbj1bXSxyPTE7cjx0LTI7KTA9PT1lW3JdJiYwPT09ZVtyKzFdJiYzPT09ZVtyKzJdPyhuLnB1c2gocisyKSxyKz0yKTpyKys7aWYoIW4ubGVuZ3RoKXJldHVybiBlO3ZhciBpPXQtbi5sZW5ndGgsYT1uZXcgVWludDhBcnJheShpKSxvPTA7Zm9yKHI9MDtyPGk7bysrLHIrKylvPT09blswXSYmKG8rKyxuLnNoaWZ0KCkpLGFbcl09ZVtvXTtyZXR1cm4gYX19XSwobj1udWxsKSYmaSh0LnByb3RvdHlwZSxuKSxyJiZpKHQsciksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksZX0oKTsidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJiJEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZSI9PT1zZWxmLmNvbnN0cnVjdG9yLm5hbWUmJnNlbGYuYWRkRXZlbnRMaXN0ZW5lcigicnRjdHJhbnNmb3JtIiwoZnVuY3Rpb24odCl7dmFyIG4saT10LnRyYW5zZm9ybWVyLGE9aS5vcHRpb25zLnBvcnQsdT0obj1mdW5jdGlvbihlKXthLnBvc3RNZXNzYWdlKGUpfSxuZXcgVHJhbnNmb3JtU3RyZWFtKHt0cmFuc2Zvcm06ZnVuY3Rpb24odCxpKXt2YXIgYT1lLmlzSDI2NVZpZGVvRnJhbWUodCk7ZS5nZXROQUxVbml0cyhuZXcgcih0LmRhdGEpLGEpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKGUuc2VpKXt2YXIgdD1vLnBhcnNlU0VJKG8ucmVtb3ZlRVBCKGUuYm9keSksITEpO3QmJm4oe2RhdGE6dCxzZWk6e2NvZGU6dC50eXBlLGNvbnRlbnQ6dC5wYXlsb2FkfX0pfX0pKSxpLmVucXVldWUodCl9fSkpO2kucmVhZGFibGUucGlwZVRocm91Z2godSkucGlwZVRvKHQudHJhbnNmb3JtZXIud3JpdGFibGUpfSkpfSgpOwo=";
5924
6022
  var blob = typeof window !== "undefined" && window.Blob && new Blob([atob(encodedJs)], {
5925
6023
  type: "text/javascript;charset=utf-8"
5926
6024
  });
@@ -5934,21 +6032,19 @@
5934
6032
  objURL && (window.URL || window.webkitURL).revokeObjectURL(objURL);
5935
6033
  }
5936
6034
  }
5937
- var AudioStallObserver = /* @__PURE__ */ function() {
5938
- function AudioStallObserver2() {
5939
- _classCallCheck$3(this, AudioStallObserver2);
5940
- _defineProperty$2(this, "_audioStallTimer", null);
5941
- _defineProperty$2(this, "_preSample", null);
5942
- _defineProperty$2(this, "_isStallInPreReportEnd", false);
5943
- _defineProperty$2(this, "_stallList", []);
5944
- _defineProperty$2(this, "_audioTransceiver", null);
5945
- }
5946
- _createClass$3(AudioStallObserver2, [{
6035
+ var _AudioStallObserver = /* @__PURE__ */ function() {
6036
+ function _AudioStallObserver2() {
6037
+ _classCallCheck$3(this, _AudioStallObserver2);
6038
+ this._isStallInPreReportEnd = false;
6039
+ this._stallList = [];
6040
+ this._audioTransceiver = null;
6041
+ }
6042
+ _createClass$3(_AudioStallObserver2, [{
5947
6043
  key: "start",
5948
6044
  value: function start(transceiver) {
5949
6045
  this.stop();
5950
6046
  this._audioTransceiver = transceiver;
5951
- if (AudioStallObserver2.interval >= 100) {
6047
+ if (_AudioStallObserver2.interval >= 100) {
5952
6048
  this._startStallCountInterval();
5953
6049
  }
5954
6050
  }
@@ -5958,7 +6054,7 @@
5958
6054
  this._stallList = [];
5959
6055
  if (this._audioStallTimer) {
5960
6056
  clearTimeout(this._audioStallTimer);
5961
- this._audioStallTimer = null;
6057
+ delete this._audioStallTimer;
5962
6058
  }
5963
6059
  }
5964
6060
  }, {
@@ -6024,12 +6120,12 @@
6024
6120
  switch (_context2.prev = _context2.next) {
6025
6121
  case 0:
6026
6122
  clearTimeout(_this._audioStallTimer);
6027
- _this._audioStallTimer = null;
6123
+ delete _this._audioStallTimer;
6028
6124
  _context2.next = 4;
6029
6125
  return _this._audioStallCount();
6030
6126
  case 4:
6031
6127
  if (!_this._audioStallTimer) {
6032
- _this._audioStallTimer = setTimeout(loop, AudioStallObserver2.interval);
6128
+ _this._audioStallTimer = setTimeout(loop, _AudioStallObserver2.interval);
6033
6129
  }
6034
6130
  case 5:
6035
6131
  case "end":
@@ -6041,7 +6137,7 @@
6041
6137
  return _ref.apply(this, arguments);
6042
6138
  };
6043
6139
  }();
6044
- this._audioStallTimer = setTimeout(loop, AudioStallObserver2.interval);
6140
+ this._audioStallTimer = setTimeout(loop, _AudioStallObserver2.interval);
6045
6141
  }
6046
6142
  }, {
6047
6143
  key: "_audioStallCount",
@@ -6052,7 +6148,7 @@
6052
6148
  while (1)
6053
6149
  switch (_context3.prev = _context3.next) {
6054
6150
  case 0:
6055
- if (!(this._preSample && Date.now() - this._preSample.ts < AudioStallObserver2.interval * 0.5)) {
6151
+ if (!(this._preSample && Date.now() - this._preSample.ts < _AudioStallObserver2.interval * 0.5)) {
6056
6152
  _context3.next = 2;
6057
6153
  break;
6058
6154
  }
@@ -6106,7 +6202,7 @@
6106
6202
  _inboundRTP3 = inboundRTP, concealedSamples = _inboundRTP3.concealedSamples, totalSamplesReceived = _inboundRTP3.totalSamplesReceived;
6107
6203
  interval_concealed_samples = concealedSamples - this._preSample.concealedSamples;
6108
6204
  interval_samples_received = totalSamplesReceived - this._preSample.totalSamplesReceived;
6109
- is_stall = interval_concealed_samples >= 0 && interval_samples_received >= 0 && interval_concealed_samples >= AudioStallObserver2.ratio * interval_samples_received;
6205
+ is_stall = interval_concealed_samples >= 0 && interval_samples_received >= 0 && interval_concealed_samples >= _AudioStallObserver2.ratio * interval_samples_received;
6110
6206
  this._stallList.push({
6111
6207
  concealed: interval_concealed_samples,
6112
6208
  received: interval_samples_received,
@@ -6134,10 +6230,11 @@
6134
6230
  return _audioStallCount;
6135
6231
  }()
6136
6232
  }]);
6137
- return AudioStallObserver2;
6233
+ return _AudioStallObserver2;
6138
6234
  }();
6139
- _defineProperty$2(AudioStallObserver, "interval", 100);
6140
- _defineProperty$2(AudioStallObserver, "ratio", 0.6);
6235
+ var AudioStallObserver = _AudioStallObserver;
6236
+ AudioStallObserver.interval = 100;
6237
+ AudioStallObserver.ratio = 0.6;
6141
6238
  var computeStallInfo = function computeStallInfo2(list, times, isStallInPreEnd) {
6142
6239
  var _list$;
6143
6240
  var res = {
@@ -6206,13 +6303,22 @@
6206
6303
  function VideoStallObserver2() {
6207
6304
  var _this = this;
6208
6305
  _classCallCheck$3(this, VideoStallObserver2);
6209
- _defineProperty$2(this, "_handleVisibilityChange", function() {
6306
+ this._videoInWaiting100ms = false;
6307
+ this._videoInWaiting500ms = false;
6308
+ this._pauseStart = 0;
6309
+ this._pauseDuration = 0;
6310
+ this._stallTimeThreshold = {
6311
+ stall500ms: isSafari() || isFirefox() ? 550 : 500,
6312
+ stall100ms: 100
6313
+ };
6314
+ this._support100msStall = checkVideoFrameCallback();
6315
+ this._handleVisibilityChange = function() {
6210
6316
  if (document.visibilityState === "hidden") {
6211
6317
  _this._framePause();
6212
6318
  }
6213
- });
6214
- _defineProperty$2(this, "_framePause", function() {
6215
- if (_this._prePts) {
6319
+ };
6320
+ this._framePause = function() {
6321
+ if (_this._prePts && _this._stallList) {
6216
6322
  var current = performance.now();
6217
6323
  var delta = current - _this._prePts;
6218
6324
  _this._stallList.push({
@@ -6221,23 +6327,7 @@
6221
6327
  });
6222
6328
  _this._prePts = void 0;
6223
6329
  }
6224
- });
6225
- this._removeHandler = void 0;
6226
- this._remotePlayPauseHandler = void 0;
6227
- this._prePts = void 0;
6228
- this._stallList = void 0;
6229
- this._videoInWaiting100ms = false;
6230
- this._videoInWaiting500ms = false;
6231
- this._isPaused = void 0;
6232
- this._pauseStart = 0;
6233
- this._pauseDuration = 0;
6234
- this._requestVideoFrameCallbackTimer = void 0;
6235
- this._player = void 0;
6236
- this._stallTimeThreshold = {
6237
- stall500ms: isSafari() || isFirefox() ? 550 : 500,
6238
- stall100ms: 100
6239
6330
  };
6240
- this._support100msStall = checkVideoFrameCallback();
6241
6331
  }
6242
6332
  _createClass$3(VideoStallObserver2, [{
6243
6333
  key: "start",
@@ -6275,7 +6365,7 @@
6275
6365
  player.removeEventListener("play", handlePlay);
6276
6366
  };
6277
6367
  document.addEventListener("visibilitychange", this._handleVisibilityChange);
6278
- document.addEventListener("pagehide", this._framePause());
6368
+ window.addEventListener("pagehide", this._framePause);
6279
6369
  }
6280
6370
  }, {
6281
6371
  key: "stop",
@@ -6294,7 +6384,7 @@
6294
6384
  this._videoInWaiting100ms = false;
6295
6385
  this._videoInWaiting500ms = false;
6296
6386
  document.removeEventListener("visibilitychange", this._handleVisibilityChange);
6297
- document.removeEventListener("pagehide", this._framePause());
6387
+ window.removeEventListener("pagehide", this._framePause);
6298
6388
  }
6299
6389
  }, {
6300
6390
  key: "destroy",
@@ -6363,7 +6453,7 @@
6363
6453
  }
6364
6454
  var _stallInfo$stall = stallInfo.stall, stallDuration500ms = _stallInfo$stall.stallDuration500ms, stallDuration100ms = _stallInfo$stall.stallDuration100ms;
6365
6455
  stallInfo.stall.stallRate500ms = Math.min(Number((stallDuration500ms / interval).toFixed(4)), 1);
6366
- if (this._support100msStall) {
6456
+ if (this._support100msStall && stallDuration100ms) {
6367
6457
  stallInfo.stall.stallRate100ms = Math.min(Number((stallDuration100ms / interval).toFixed(4)), 1);
6368
6458
  } else {
6369
6459
  delete stallInfo.stall.stallRate100ms;
@@ -6529,7 +6619,7 @@
6529
6619
  receivedSampleRate: diffNumber(oldStats, newStats, "totalSamplesReceived") / statsInterval,
6530
6620
  concealedSamples: Math.round(diffNumber(oldStats, newStats, "concealedSamples")),
6531
6621
  concealmentEvent: Math.round(diffNumber(oldStats, newStats, "concealmentEvents")),
6532
- e2eDelay: Math.round(newStats.rtt + jitterBufferDelay)
6622
+ e2eDelay: Math.round((newStats.rtt || 0) + jitterBufferDelay)
6533
6623
  };
6534
6624
  }
6535
6625
  function getRecvVideoStats(_x2) {
@@ -6600,8 +6690,12 @@
6600
6690
  var nackCount = diffNumber(oldStats, newStats, "nackCount");
6601
6691
  var packetsReceived = diffNumber(oldStats, newStats, "packetsReceived");
6602
6692
  var jitterBufferDelay = Math.round(diffNumber(oldStats, newStats, "jitterBufferDelay") / diffNumber(oldStats, newStats, "jitterBufferEmittedCount") * 1e3);
6693
+ var newResolution = (newStats.width || 0) * (newStats.height || 0);
6694
+ var oldResolution = (oldStats.width || 0) * (oldStats.height || 0);
6695
+ var abrState = newResolution === 0 || oldResolution === 0 ? "none" : newResolution > oldResolution ? "upgrade" : newResolution < oldResolution ? "degrade" : "none";
6603
6696
  return {
6604
6697
  statsInterval,
6698
+ abrState,
6605
6699
  width: newStats.width || 0,
6606
6700
  height: newStats.height || 0,
6607
6701
  estimatedPlayoutTimestamp: newStats.estimatedPlayoutTimestamp,
@@ -6620,7 +6714,7 @@
6620
6714
  firCount: diffNumber(oldStats, newStats, "firCount"),
6621
6715
  nackCount,
6622
6716
  pliCount: diffNumber(oldStats, newStats, "pliCount"),
6623
- e2eDelay: Math.round(newStats.rtt + jitterBufferDelay),
6717
+ e2eDelay: Math.round((newStats.rtt || 0) + jitterBufferDelay),
6624
6718
  retransmittedRate: +(nackCount / (packetsReceived + packetsLostDiff)).toFixed(2)
6625
6719
  };
6626
6720
  }
@@ -6653,11 +6747,11 @@
6653
6747
  DOWN: 6
6654
6748
  };
6655
6749
  var NetworkQuality = /* @__PURE__ */ function() {
6656
- function NetworkQuality2(peer, networkQualityParams) {
6750
+ function NetworkQuality2(_peer, _networkQualityParams) {
6657
6751
  _classCallCheck$3(this, NetworkQuality2);
6658
- _defineProperty$2(this, "_preDownlinkStats", []);
6659
- this._peer = peer;
6660
- this._networkQualityParams = networkQualityParams;
6752
+ this._peer = _peer;
6753
+ this._networkQualityParams = _networkQualityParams;
6754
+ this._preDownlinkStats = [];
6661
6755
  }
6662
6756
  _createClass$3(NetworkQuality2, [{
6663
6757
  key: "getDownlinkQuality",
@@ -6712,11 +6806,11 @@
6712
6806
  } else {
6713
6807
  quality = QosLevel.VBAD;
6714
6808
  }
6715
- if (retransmittedRate > qosQualityParams[QosLevel.BAD].minRetransmittedRate) {
6809
+ if (retransmittedRate > (qosQualityParams[QosLevel.BAD].minRetransmittedRate || 0.5)) {
6716
6810
  quality = Math.max(quality, QosLevel.BAD);
6717
- } else if (retransmittedRate > qosQualityParams[QosLevel.POOR].minRetransmittedRate) {
6811
+ } else if (retransmittedRate > (qosQualityParams[QosLevel.POOR].minRetransmittedRate || 0.35)) {
6718
6812
  quality = Math.max(quality, QosLevel.POOR);
6719
- } else if (retransmittedRate > qosQualityParams[QosLevel.GOOD].minRetransmittedRate) {
6813
+ } else if (retransmittedRate > (qosQualityParams[QosLevel.GOOD].minRetransmittedRate || 0.2)) {
6720
6814
  quality = Math.max(quality, QosLevel.GOOD);
6721
6815
  }
6722
6816
  return quality;
@@ -6757,6 +6851,249 @@
6757
6851
  }]);
6758
6852
  return NetworkQuality2;
6759
6853
  }();
6854
+ var FIRST_FRAME_STATE_ORDER = [RTC_FIRST_FRAME_STATE.LOAD_START, RTC_FIRST_FRAME_STATE.OFFER_SDP_READY, RTC_FIRST_FRAME_STATE.ANSWER_SDP_RECV, RTC_FIRST_FRAME_STATE.ANSWER_SDP_READY, RTC_FIRST_FRAME_STATE.ICE_CONNECTED, RTC_FIRST_FRAME_STATE.DTLS_CONNECTED, RTC_FIRST_FRAME_STATE.PEER_CONNECTED, RTC_FIRST_FRAME_STATE.FIRST_PACKET_RECV, RTC_FIRST_FRAME_STATE.FIRST_FRAME_RECV, RTC_FIRST_FRAME_STATE.FIRST_FRAME_DECODED, RTC_FIRST_FRAME_STATE.VIDEO_LOADEDDATA, RTC_FIRST_FRAME_STATE.VIDEO_CANPLAY, RTC_FIRST_FRAME_STATE.VIDEO_PLAYING];
6855
+ var FirstFrameObserver = /* @__PURE__ */ function() {
6856
+ function FirstFrameObserver2(_emitFirstFrameState) {
6857
+ var _this = this;
6858
+ _classCallCheck$3(this, FirstFrameObserver2);
6859
+ this._emitFirstFrameState = _emitFirstFrameState;
6860
+ this._startConnectTs = 0;
6861
+ this._firstVideoFrameInterval = null;
6862
+ this._preState = null;
6863
+ this._state = {};
6864
+ this._pc = null;
6865
+ this._video = null;
6866
+ this._videoTransceiver = null;
6867
+ this._extraInfo = {
6868
+ is_preload: false
6869
+ };
6870
+ this._handleConnectionStateChange = function() {
6871
+ var _this$_pc;
6872
+ if (((_this$_pc = _this._pc) === null || _this$_pc === void 0 ? void 0 : _this$_pc.connectionState) === "connected" && _this._videoTransceiver) {
6873
+ _this.changeFirstFrameState(RTC_FIRST_FRAME_STATE.PEER_CONNECTED);
6874
+ _this._watchForFirstVideoFrameRecv(_this._videoTransceiver);
6875
+ }
6876
+ };
6877
+ this._handleICEConnectionStateChange = function() {
6878
+ var _this$_pc2;
6879
+ if (((_this$_pc2 = _this._pc) === null || _this$_pc2 === void 0 ? void 0 : _this$_pc2.iceConnectionState) === "connected") {
6880
+ _this.changeFirstFrameState(RTC_FIRST_FRAME_STATE.ICE_CONNECTED);
6881
+ }
6882
+ };
6883
+ this._handlePlaying = function() {
6884
+ _this.changeFirstFrameState(RTC_FIRST_FRAME_STATE.VIDEO_PLAYING);
6885
+ _this.reset();
6886
+ };
6887
+ this._handleCanplay = function() {
6888
+ _this.changeFirstFrameState(RTC_FIRST_FRAME_STATE.VIDEO_CANPLAY);
6889
+ };
6890
+ this._handleLoadeddata = function() {
6891
+ _this.changeFirstFrameState(RTC_FIRST_FRAME_STATE.VIDEO_LOADEDDATA);
6892
+ };
6893
+ this._handleError = function() {
6894
+ _this.reset();
6895
+ };
6896
+ }
6897
+ _createClass$3(FirstFrameObserver2, [{
6898
+ key: "start",
6899
+ value: function start() {
6900
+ this.reset();
6901
+ this._startConnectTs = Date.now();
6902
+ this.changeFirstFrameState(RTC_FIRST_FRAME_STATE.LOAD_START);
6903
+ }
6904
+ }, {
6905
+ key: "changeFirstFrameState",
6906
+ value: function changeFirstFrameState(state) {
6907
+ var _ref, _this2 = this;
6908
+ var preIdx = (_ref = this._preState && FIRST_FRAME_STATE_ORDER.indexOf(this._preState)) !== null && _ref !== void 0 ? _ref : -1;
6909
+ var curIdx = FIRST_FRAME_STATE_ORDER.indexOf(state);
6910
+ var elapsed = Date.now() - this._startConnectTs;
6911
+ if (curIdx > preIdx) {
6912
+ FIRST_FRAME_STATE_ORDER.slice(preIdx + 1, curIdx + 1).forEach(function(s) {
6913
+ _this2._state[s] = elapsed;
6914
+ });
6915
+ this._preState = state;
6916
+ }
6917
+ }
6918
+ }, {
6919
+ key: "setIsPreload",
6920
+ value: function setIsPreload(isPreload) {
6921
+ this._extraInfo.is_preload = isPreload;
6922
+ }
6923
+ }, {
6924
+ key: "setFailureReason",
6925
+ value: function setFailureReason(reason) {
6926
+ this._extraInfo.failure_reason = reason;
6927
+ }
6928
+ }, {
6929
+ key: "bindEvents",
6930
+ value: function bindEvents(pc, videoTransceiver, video) {
6931
+ var _this3 = this;
6932
+ this._pc = pc;
6933
+ this._video = video;
6934
+ this._videoTransceiver = videoTransceiver;
6935
+ pc.addEventListener("connectionstatechange", this._handleConnectionStateChange);
6936
+ pc.addEventListener("iceconnectionstatechange", this._handleICEConnectionStateChange);
6937
+ var _ref2 = (videoTransceiver === null || videoTransceiver === void 0 ? void 0 : videoTransceiver.receiver) || {}, transport = _ref2.transport;
6938
+ if (transport) {
6939
+ transport.onstatechange = function() {
6940
+ transport.state === "connected" && _this3.changeFirstFrameState(RTC_FIRST_FRAME_STATE.DTLS_CONNECTED);
6941
+ };
6942
+ }
6943
+ video === null || video === void 0 ? void 0 : video.addEventListener("playing", this._handlePlaying);
6944
+ video === null || video === void 0 ? void 0 : video.addEventListener("canplay", this._handleCanplay);
6945
+ video === null || video === void 0 ? void 0 : video.addEventListener("loadeddata", this._handleLoadeddata);
6946
+ video === null || video === void 0 ? void 0 : video.addEventListener("error", this._handleError);
6947
+ }
6948
+ }, {
6949
+ key: "_watchForFirstVideoFrameRecv",
6950
+ value: function _watchForFirstVideoFrameRecv(videoTransceiver) {
6951
+ var _this4 = this;
6952
+ var hasPacketsReceived = false;
6953
+ var hasFrameReceived = false;
6954
+ var hasFrameDecoded = false;
6955
+ this._cancelWatchForFirstVideoFrameRecv();
6956
+ this._firstVideoFrameInterval = window.setInterval(/* @__PURE__ */ _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee() {
6957
+ var receiver, reports, inboundRtpStats;
6958
+ return _regeneratorRuntime$1().wrap(function _callee$(_context) {
6959
+ while (1)
6960
+ switch (_context.prev = _context.next) {
6961
+ case 0:
6962
+ receiver = videoTransceiver.receiver;
6963
+ _context.next = 3;
6964
+ return receiver.getStats();
6965
+ case 3:
6966
+ reports = _context.sent;
6967
+ reports.forEach(function(report) {
6968
+ if (report.type === "inbound-rtp") {
6969
+ inboundRtpStats = report;
6970
+ }
6971
+ });
6972
+ if (!hasPacketsReceived && inboundRtpStats.packetsReceived > 0) {
6973
+ hasPacketsReceived = true;
6974
+ _this4.changeFirstFrameState(RTC_FIRST_FRAME_STATE.FIRST_PACKET_RECV);
6975
+ }
6976
+ if (!hasFrameReceived && inboundRtpStats.framesReceived > 0) {
6977
+ hasFrameReceived = true;
6978
+ _this4.changeFirstFrameState(RTC_FIRST_FRAME_STATE.FIRST_FRAME_RECV);
6979
+ }
6980
+ if (!hasFrameDecoded && inboundRtpStats.framesDecoded > 0) {
6981
+ hasFrameDecoded = true;
6982
+ _this4.changeFirstFrameState(RTC_FIRST_FRAME_STATE.FIRST_FRAME_DECODED);
6983
+ _this4._cancelWatchForFirstVideoFrameRecv();
6984
+ }
6985
+ case 8:
6986
+ case "end":
6987
+ return _context.stop();
6988
+ }
6989
+ }, _callee);
6990
+ })), 200);
6991
+ }
6992
+ }, {
6993
+ key: "_cancelWatchForFirstVideoFrameRecv",
6994
+ value: function _cancelWatchForFirstVideoFrameRecv() {
6995
+ if (this._firstVideoFrameInterval) {
6996
+ window.clearInterval(this._firstVideoFrameInterval);
6997
+ this._firstVideoFrameInterval = null;
6998
+ }
6999
+ }
7000
+ }, {
7001
+ key: "_getTransportInfo",
7002
+ value: function() {
7003
+ var _getTransportInfo2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee2() {
7004
+ var _this$_videoTransceiv, _this$_videoTransceiv2;
7005
+ var reports, candidatePairStats, localCandidateStats, remoteCandidateStats;
7006
+ return _regeneratorRuntime$1().wrap(function _callee2$(_context2) {
7007
+ while (1)
7008
+ switch (_context2.prev = _context2.next) {
7009
+ case 0:
7010
+ _context2.next = 2;
7011
+ return (_this$_videoTransceiv = this._videoTransceiver) === null || _this$_videoTransceiv === void 0 ? void 0 : (_this$_videoTransceiv2 = _this$_videoTransceiv.receiver) === null || _this$_videoTransceiv2 === void 0 ? void 0 : _this$_videoTransceiv2.getStats();
7012
+ case 2:
7013
+ reports = _context2.sent;
7014
+ reports === null || reports === void 0 ? void 0 : reports.forEach(function(report) {
7015
+ if (report.type === "candidate-pair") {
7016
+ candidatePairStats = report;
7017
+ localCandidateStats = reports.get(report.localCandidateId);
7018
+ remoteCandidateStats = reports.get(report.remoteCandidateId);
7019
+ }
7020
+ });
7021
+ if (remoteCandidateStats) {
7022
+ this._extraInfo.remote_ip = remoteCandidateStats.ip || remoteCandidateStats.address;
7023
+ this._extraInfo.remote_port = remoteCandidateStats.port;
7024
+ this._extraInfo.remote_candidate_type = remoteCandidateStats.candidateType;
7025
+ this._extraInfo.protocol = remoteCandidateStats.protocol;
7026
+ }
7027
+ if (localCandidateStats) {
7028
+ this._extraInfo.local_ip = localCandidateStats.ip || localCandidateStats.address;
7029
+ this._extraInfo.local_port = localCandidateStats.port;
7030
+ this._extraInfo.local_candidate_type = localCandidateStats.candidateType;
7031
+ }
7032
+ if (candidatePairStats) {
7033
+ this._extraInfo.rtt = candidatePairStats.currentRoundTripTime;
7034
+ this._extraInfo.stun_requests_sent = candidatePairStats.requestsSent;
7035
+ this._extraInfo.stun_requests_received = candidatePairStats.requestsReceived;
7036
+ this._extraInfo.stun_responses_sent = candidatePairStats.responsesSent;
7037
+ this._extraInfo.stun_responses_received = candidatePairStats.responsesReceived;
7038
+ }
7039
+ case 7:
7040
+ case "end":
7041
+ return _context2.stop();
7042
+ }
7043
+ }, _callee2, this);
7044
+ }));
7045
+ function _getTransportInfo() {
7046
+ return _getTransportInfo2.apply(this, arguments);
7047
+ }
7048
+ return _getTransportInfo;
7049
+ }()
7050
+ }, {
7051
+ key: "reset",
7052
+ value: function() {
7053
+ var _reset = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee3() {
7054
+ var _this$_video, _this$_video2, _this$_video3, _this$_video4, _this$_pc3, _this$_pc4;
7055
+ return _regeneratorRuntime$1().wrap(function _callee3$(_context3) {
7056
+ while (1)
7057
+ switch (_context3.prev = _context3.next) {
7058
+ case 0:
7059
+ if (!(Object.keys(this._state).length > 0)) {
7060
+ _context3.next = 4;
7061
+ break;
7062
+ }
7063
+ _context3.next = 3;
7064
+ return this._getTransportInfo();
7065
+ case 3:
7066
+ this._emitFirstFrameState(this._state, this._extraInfo);
7067
+ case 4:
7068
+ this._preState = null;
7069
+ this._extraInfo = {
7070
+ is_preload: false
7071
+ };
7072
+ this._state = {};
7073
+ (_this$_video = this._video) === null || _this$_video === void 0 ? void 0 : _this$_video.removeEventListener("playing", this._handlePlaying);
7074
+ (_this$_video2 = this._video) === null || _this$_video2 === void 0 ? void 0 : _this$_video2.removeEventListener("canplay", this._handleCanplay);
7075
+ (_this$_video3 = this._video) === null || _this$_video3 === void 0 ? void 0 : _this$_video3.removeEventListener("loadeddata", this._handleLoadeddata);
7076
+ (_this$_video4 = this._video) === null || _this$_video4 === void 0 ? void 0 : _this$_video4.removeEventListener("error", this._handleError);
7077
+ (_this$_pc3 = this._pc) === null || _this$_pc3 === void 0 ? void 0 : _this$_pc3.removeEventListener("connectionstatechange", this._handleConnectionStateChange);
7078
+ (_this$_pc4 = this._pc) === null || _this$_pc4 === void 0 ? void 0 : _this$_pc4.removeEventListener("iceconnectionstatechange", this._handleICEConnectionStateChange);
7079
+ this._cancelWatchForFirstVideoFrameRecv();
7080
+ this._pc = null;
7081
+ this._video = null;
7082
+ this._videoTransceiver = null;
7083
+ case 17:
7084
+ case "end":
7085
+ return _context3.stop();
7086
+ }
7087
+ }, _callee3, this);
7088
+ }));
7089
+ function reset() {
7090
+ return _reset.apply(this, arguments);
7091
+ }
7092
+ return reset;
7093
+ }()
7094
+ }]);
7095
+ return FirstFrameObserver2;
7096
+ }();
6760
7097
  function changeNumberInRange(source, min, max, delta) {
6761
7098
  var target = source + delta;
6762
7099
  if (target > max) {
@@ -6767,6 +7104,59 @@
6767
7104
  function isHarmonyOS() {
6768
7105
  return /(HarmonyOS|OpenHarmony|ArkWeb)/i.test(navigator.userAgent);
6769
7106
  }
7107
+ function compareURL(url1, url2) {
7108
+ var queryKeys = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : [];
7109
+ if (typeof url1 !== "string" || typeof url2 !== "string") {
7110
+ return false;
7111
+ }
7112
+ if (!url1.includes("://")) {
7113
+ url1 = window.location.protocol + "//" + url1;
7114
+ }
7115
+ if (!url2.includes("://")) {
7116
+ url2 = window.location.protocol + "//" + url2;
7117
+ }
7118
+ var url1Obj;
7119
+ var url2Obj;
7120
+ try {
7121
+ url1Obj = new URL(url1);
7122
+ url2Obj = new URL(url2);
7123
+ } catch (e) {
7124
+ return false;
7125
+ }
7126
+ if (url1Obj.host + url1Obj.pathname !== url2Obj.host + url2Obj.pathname) {
7127
+ return false;
7128
+ }
7129
+ var _iterator = _createForOfIteratorHelper$1(queryKeys), _step;
7130
+ try {
7131
+ for (_iterator.s(); !(_step = _iterator.n()).done; ) {
7132
+ var key = _step.value;
7133
+ if (url1Obj.searchParams.get(key) !== url2Obj.searchParams.get(key)) {
7134
+ return false;
7135
+ }
7136
+ }
7137
+ } catch (err) {
7138
+ _iterator.e(err);
7139
+ } finally {
7140
+ _iterator.f();
7141
+ }
7142
+ return true;
7143
+ }
7144
+ function addUrlParams(url, params) {
7145
+ if (!params || Object.keys(params).length === 0) {
7146
+ return url;
7147
+ }
7148
+ var urlParams = url.includes("?") ? new URLSearchParams(url.split("?")[1]) : new URLSearchParams();
7149
+ Object.keys(params).forEach(function(key) {
7150
+ urlParams.set(key, params[key]);
7151
+ });
7152
+ return url.split("?")[0] + "?" + urlParams.toString();
7153
+ }
7154
+ function isHeyTapBrowser() {
7155
+ return /(HeyTapBrowser)/i.test(navigator.userAgent);
7156
+ }
7157
+ function isVivoBrowser() {
7158
+ return /(VivoBrowser)/i.test(navigator.userAgent);
7159
+ }
6770
7160
  var logger = new Logger("rts");
6771
7161
  var Rts = /* @__PURE__ */ function(_EventEmitter) {
6772
7162
  _inherits$1(Rts2, _EventEmitter);
@@ -6775,31 +7165,28 @@
6775
7165
  var _this;
6776
7166
  _classCallCheck$3(this, Rts2);
6777
7167
  _this = _super.call(this);
6778
- _defineProperty$2(_assertThisInitialized$1(_this), "_url", "");
6779
- _defineProperty$2(_assertThisInitialized$1(_this), "_pc", null);
6780
- _defineProperty$2(_assertThisInitialized$1(_this), "_audioTransceicer", null);
6781
- _defineProperty$2(_assertThisInitialized$1(_this), "_videoTransceicer", null);
6782
- _defineProperty$2(_assertThisInitialized$1(_this), "_mediaStream", null);
6783
- _defineProperty$2(_assertThisInitialized$1(_this), "_lastMediaStream", null);
6784
- _defineProperty$2(_assertThisInitialized$1(_this), "_media", null);
6785
- _defineProperty$2(_assertThisInitialized$1(_this), "_player", null);
6786
- _defineProperty$2(_assertThisInitialized$1(_this), "_opts", null);
6787
- _defineProperty$2(_assertThisInitialized$1(_this), "_loader", null);
6788
- _defineProperty$2(_assertThisInitialized$1(_this), "_networkEvaluate", null);
6789
- _defineProperty$2(_assertThisInitialized$1(_this), "_retry", 0);
6790
- _defineProperty$2(_assertThisInitialized$1(_this), "_waitingTimer", 0);
6791
- _defineProperty$2(_assertThisInitialized$1(_this), "_rctConnectStartTs", 0);
6792
- _defineProperty$2(_assertThisInitialized$1(_this), "_isReplacing", false);
6793
- _defineProperty$2(_assertThisInitialized$1(_this), "_checkStatsErrorTimer", null);
6794
- _defineProperty$2(_assertThisInitialized$1(_this), "_audioStallObserver", null);
6795
- _defineProperty$2(_assertThisInitialized$1(_this), "_videoStallObserver", null);
6796
- _defineProperty$2(_assertThisInitialized$1(_this), "_networkQuality", null);
6797
- _defineProperty$2(_assertThisInitialized$1(_this), "_preAudioStats", null);
6798
- _defineProperty$2(_assertThisInitialized$1(_this), "_preVideoStats", null);
6799
- _defineProperty$2(_assertThisInitialized$1(_this), "_rtcReportTimer", 0);
6800
- _defineProperty$2(_assertThisInitialized$1(_this), "_networkQualityResult", []);
6801
- _defineProperty$2(_assertThisInitialized$1(_this), "_peerStateTimer", null);
6802
- _defineProperty$2(_assertThisInitialized$1(_this), "_checkStatsError", /* @__PURE__ */ _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee2() {
7168
+ _this._url = "";
7169
+ _this._pc = null;
7170
+ _this._audioTransceicer = null;
7171
+ _this._videoTransceicer = null;
7172
+ _this._mediaStream = null;
7173
+ _this._lastMediaStream = null;
7174
+ _this._loader = null;
7175
+ _this._networkEvaluate = null;
7176
+ _this._retry = 0;
7177
+ _this._player = null;
7178
+ _this._waitingTimer = 0;
7179
+ _this._rctConnectStartTs = 0;
7180
+ _this._isReplacing = false;
7181
+ _this._firstFrameObserver = new FirstFrameObserver(_this._emitFirstFrameState.bind(_assertThisInitialized$1(_this)));
7182
+ _this._audio = null;
7183
+ _this._video = null;
7184
+ _this._preAudioStats = null;
7185
+ _this._preVideoStats = null;
7186
+ _this._rtcReportTimer = null;
7187
+ _this._networkQualityResult = [];
7188
+ _this._videoJitterBufferDelay = 0;
7189
+ _this._checkStatsError = /* @__PURE__ */ _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee2() {
6803
7190
  return _regeneratorRuntime$1().wrap(function _callee2$(_context2) {
6804
7191
  while (1)
6805
7192
  switch (_context2.prev = _context2.next) {
@@ -6840,12 +7227,16 @@
6840
7227
  return _context2.stop();
6841
7228
  }
6842
7229
  }, _callee2);
6843
- })));
6844
- _defineProperty$2(_assertThisInitialized$1(_this), "_onTrack", function(e) {
7230
+ }));
7231
+ _this._onTrack = function(e) {
6845
7232
  logger.log("addTrack: ", e.track, e.streams);
6846
- _this["_".concat(e.track.kind)] = e.track;
6847
- });
6848
- _defineProperty$2(_assertThisInitialized$1(_this), "_mockWaitingByTimeupdate", function() {
7233
+ if (e.track.kind === "audio") {
7234
+ _this._audio = e.track;
7235
+ } else {
7236
+ _this._video = e.track;
7237
+ }
7238
+ };
7239
+ _this._mockWaitingByTimeupdate = function() {
6849
7240
  var _this$_pc, _this$_pc2;
6850
7241
  if (!(((_this$_pc = _this._pc) === null || _this$_pc === void 0 ? void 0 : _this$_pc.connectionState) === "connected" || ((_this$_pc2 = _this._pc) === null || _this$_pc2 === void 0 ? void 0 : _this$_pc2.iceConnectionState) === "connected"))
6851
7242
  return;
@@ -6856,8 +7247,8 @@
6856
7247
  return;
6857
7248
  _this.emit("waiting");
6858
7249
  }, _this._opts.stallInterval);
6859
- });
6860
- _defineProperty$2(_assertThisInitialized$1(_this), "_onLoadedData", function() {
7250
+ };
7251
+ _this._onLoadedData = function() {
6861
7252
  logger.log("loadeddata emit");
6862
7253
  _this.getStatsSnapshoot().then(function(snap) {
6863
7254
  _this.emit(EVENT.METADATA_PARSED, {
@@ -6871,19 +7262,15 @@
6871
7262
  meta: snap.audio
6872
7263
  });
6873
7264
  });
6874
- });
6875
- _defineProperty$2(_assertThisInitialized$1(_this), "_setDelay", function(delayHint) {
7265
+ };
7266
+ _this._setDelay = function(delayHint) {
6876
7267
  if (_this._opts.progressiveSetDelay) {
6877
7268
  _this._startSetDelayLoop(delayHint);
6878
7269
  } else {
6879
7270
  var _this$_audioTransceic2;
6880
- var key = [
6881
- "playoutDelayHint",
6882
- "jitterBufferDelayHint",
6883
- "jitterBufferTarget"
6884
- ].find(function(key2) {
7271
+ var key = ["playoutDelayHint", "jitterBufferDelayHint", "jitterBufferTarget"].find(function(key2) {
6885
7272
  var _this$_audioTransceic, _this$_videoTransceic;
6886
- return key2 in ((_this$_audioTransceic = _this._audioTransceicer) === null || _this$_audioTransceic === void 0 ? void 0 : _this$_audioTransceic.receiver) && key2 in ((_this$_videoTransceic = _this._videoTransceicer) === null || _this$_videoTransceic === void 0 ? void 0 : _this$_videoTransceic.receiver);
7273
+ return key2 in (((_this$_audioTransceic = _this._audioTransceicer) === null || _this$_audioTransceic === void 0 ? void 0 : _this$_audioTransceic.receiver) || {}) && key2 in (((_this$_videoTransceic = _this._videoTransceicer) === null || _this$_videoTransceic === void 0 ? void 0 : _this$_videoTransceic.receiver) || {});
6887
7274
  });
6888
7275
  if (!key)
6889
7276
  return;
@@ -6893,24 +7280,19 @@
6893
7280
  _this._audioTransceicer.receiver[key] = delayHint;
6894
7281
  _this._videoTransceicer.receiver[key] = delayHint;
6895
7282
  }
6896
- });
6897
- _defineProperty$2(_assertThisInitialized$1(_this), "_targetDelayHint", null);
6898
- _defineProperty$2(_assertThisInitialized$1(_this), "_setDelayTimer", null);
6899
- _defineProperty$2(_assertThisInitialized$1(_this), "_setDelayError", null);
6900
- _defineProperty$2(_assertThisInitialized$1(_this), "_startSetDelayLoop", /* @__PURE__ */ function() {
7283
+ };
7284
+ _this._targetDelayHint = null;
7285
+ _this._setDelayError = null;
7286
+ _this._startSetDelayLoop = /* @__PURE__ */ function() {
6901
7287
  var _ref3 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee4(delayHint) {
6902
7288
  var key, preAudioStats, preVideoStats, _this$_opts$adaptiveJ, loopInterval, maxAvSyncDelay, maxJitterBufferDiff, maxStep, avDiffTooMuchCount;
6903
7289
  return _regeneratorRuntime$1().wrap(function _callee4$(_context4) {
6904
7290
  while (1)
6905
7291
  switch (_context4.prev = _context4.next) {
6906
7292
  case 0:
6907
- key = [
6908
- "playoutDelayHint",
6909
- "jitterBufferDelayHint",
6910
- "jitterBufferTarget"
6911
- ].find(function(key2) {
7293
+ key = ["playoutDelayHint", "jitterBufferDelayHint", "jitterBufferTarget"].find(function(key2) {
6912
7294
  var _this$_audioTransceic3, _this$_videoTransceic2;
6913
- return key2 in ((_this$_audioTransceic3 = _this._audioTransceicer) === null || _this$_audioTransceic3 === void 0 ? void 0 : _this$_audioTransceic3.receiver) && key2 in ((_this$_videoTransceic2 = _this._videoTransceicer) === null || _this$_videoTransceic2 === void 0 ? void 0 : _this$_videoTransceic2.receiver);
7295
+ return key2 in (((_this$_audioTransceic3 = _this._audioTransceicer) === null || _this$_audioTransceic3 === void 0 ? void 0 : _this$_audioTransceic3.receiver) || {}) && key2 in (((_this$_videoTransceic2 = _this._videoTransceicer) === null || _this$_videoTransceic2 === void 0 ? void 0 : _this$_videoTransceic2.receiver) || {});
6914
7296
  });
6915
7297
  if (key) {
6916
7298
  _context4.next = 3;
@@ -6925,13 +7307,14 @@
6925
7307
  }
6926
7308
  return _context4.abrupt("return");
6927
7309
  case 6:
7310
+ logger.log("_startSetDelayLoop()", "invoked, delayHint: ".concat(delayHint));
6928
7311
  _this._targetDelayHint = delayHint;
6929
7312
  if (!_this._setDelayTimer) {
6930
- _context4.next = 9;
7313
+ _context4.next = 10;
6931
7314
  break;
6932
7315
  }
6933
7316
  return _context4.abrupt("return");
6934
- case 9:
7317
+ case 10:
6935
7318
  preAudioStats = null;
6936
7319
  preVideoStats = null;
6937
7320
  _this$_opts$adaptiveJ = _this._opts.adaptiveJitterBuffer, loopInterval = _this$_opts$adaptiveJ.loopInterval, maxAvSyncDelay = _this$_opts$adaptiveJ.maxAvSyncDelay, maxJitterBufferDiff = _this$_opts$adaptiveJ.maxJitterBufferDiff, maxStep = _this$_opts$adaptiveJ.maxStep;
@@ -6958,7 +7341,7 @@
6958
7341
  }
6959
7342
  return _context3.abrupt("return");
6960
7343
  case 8:
6961
- targetDelayMs = _this._targetDelayHint * 1e3;
7344
+ targetDelayMs = (_this._targetDelayHint || 0) * 1e3;
6962
7345
  currentTargetDelayMs = currentTargetDelay * 1e3;
6963
7346
  _context3.next = 12;
6964
7347
  return Promise.all([getRecvAudioStats(_this._audioTransceicer.receiver.getStats()), getRecvVideoStats(_this._videoTransceicer.receiver.getStats())]);
@@ -6987,7 +7370,7 @@
6987
7370
  break;
6988
7371
  }
6989
7372
  if (avDiffTooMuchCount++ > 8 && currentVideoDelay > currentAudioDelay) {
6990
- _this._audioTransceicer.receiver[key] = Math.min(currentVideoDelay / 1e3, _this._targetDelayHint);
7373
+ _this._audioTransceicer.receiver[key] = Math.min(currentVideoDelay / 1e3, _this._targetDelayHint || 0);
6991
7374
  avDiffTooMuchCount = 0;
6992
7375
  }
6993
7376
  logger.log("av_jb_diff(".concat(currentAudioDelay - currentVideoDelay, "=").concat(currentAudioDelay, "-").concat(currentVideoDelay, ") or av_sync_diff(").concat(av_sync_diff, ") too much, skip setting"));
@@ -7022,7 +7405,7 @@
7022
7405
  }
7023
7406
  }, _callee3, null, [[0, 40]]);
7024
7407
  })), loopInterval);
7025
- case 14:
7408
+ case 15:
7026
7409
  case "end":
7027
7410
  return _context4.stop();
7028
7411
  }
@@ -7031,26 +7414,31 @@
7031
7414
  return function(_x) {
7032
7415
  return _ref3.apply(this, arguments);
7033
7416
  };
7034
- }());
7035
- _defineProperty$2(_assertThisInitialized$1(_this), "_getDelay", function() {
7417
+ }();
7418
+ _this._getDelay = function() {
7036
7419
  try {
7420
+ var _this$_audioTransceic6;
7037
7421
  var key = ["playoutDelayHint", "jitterBufferDelayHint", "jitterBufferTarget"].find(function(key2) {
7038
- return key2 in _this._videoTransceicer.receiver && key2 in _this._audioTransceicer.receiver;
7422
+ var _this$_videoTransceic4, _this$_audioTransceic5;
7423
+ return key2 in (((_this$_videoTransceic4 = _this._videoTransceicer) === null || _this$_videoTransceic4 === void 0 ? void 0 : _this$_videoTransceic4.receiver) || {}) && key2 in (((_this$_audioTransceic5 = _this._audioTransceicer) === null || _this$_audioTransceic5 === void 0 ? void 0 : _this$_audioTransceic5.receiver) || {});
7039
7424
  });
7040
- return _this._audioTransceicer.receiver[key];
7425
+ if (!key)
7426
+ return;
7427
+ return (_this$_audioTransceic6 = _this._audioTransceicer) === null || _this$_audioTransceic6 === void 0 ? void 0 : _this$_audioTransceic6.receiver[key];
7041
7428
  } catch (error) {
7042
7429
  logger.error("get delay error");
7043
7430
  }
7044
- });
7045
- _defineProperty$2(_assertThisInitialized$1(_this), "_onLoaderRetry", function(error, retryTime) {
7431
+ };
7432
+ _this._onLoaderRetry = function(error, retryTime) {
7433
+ console.log(error, "retryTime", retryTime);
7046
7434
  _this.emit(EVENT.LOAD_RETRY, {
7047
7435
  error: StreamingError.network(error),
7048
7436
  retryTime
7049
7437
  });
7050
- });
7438
+ };
7051
7439
  _this._opts = getOption(opts);
7052
7440
  _this._media = _this._opts.media;
7053
- _this._player = _this._opts.player;
7441
+ _this._player = _this._opts.player || null;
7054
7442
  _this._loader = new NetLoader(_objectSpread2$2(_objectSpread2$2({}, opts.fetchOptions), {}, {
7055
7443
  responseType: "json",
7056
7444
  method: "POST",
@@ -7060,9 +7448,12 @@
7060
7448
  onRetryError: _this._onLoaderRetry,
7061
7449
  logger
7062
7450
  }));
7063
- _this._retry = _this._opts.retryCount;
7451
+ _this._retry = _this._opts.retryCount || 0;
7452
+ _this._preloadPromise = _this._opts.preloadPromise;
7064
7453
  _this._bindMediaEvent();
7454
+ logger.log("constructor()", opts);
7065
7455
  _this._changeVolumeInHarmonyWorkaround();
7456
+ _this._mutedBeforePlayingWorkaround();
7066
7457
  if (_this._opts.mediaStream && _this._opts.seamlesslyReload) {
7067
7458
  _this._lastMediaStream = _this._opts.mediaStream;
7068
7459
  }
@@ -7083,6 +7474,11 @@
7083
7474
  get: function get() {
7084
7475
  return this._video;
7085
7476
  }
7477
+ }, {
7478
+ key: "getJitterBufferDelay",
7479
+ value: function getJitterBufferDelay() {
7480
+ return this._videoJitterBufferDelay;
7481
+ }
7086
7482
  }, {
7087
7483
  key: "loader",
7088
7484
  get: function get() {
@@ -7096,9 +7492,24 @@
7096
7492
  }
7097
7493
  }, {
7098
7494
  key: "getStats",
7099
- value: function getStats$1() {
7100
- return getStats(this._pc);
7101
- }
7495
+ value: function() {
7496
+ var _getStats22 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee5() {
7497
+ return _regeneratorRuntime$1().wrap(function _callee5$(_context5) {
7498
+ while (1)
7499
+ switch (_context5.prev = _context5.next) {
7500
+ case 0:
7501
+ return _context5.abrupt("return", getStats(this._pc));
7502
+ case 1:
7503
+ case "end":
7504
+ return _context5.stop();
7505
+ }
7506
+ }, _callee5, this);
7507
+ }));
7508
+ function getStats$1() {
7509
+ return _getStats22.apply(this, arguments);
7510
+ }
7511
+ return getStats$1;
7512
+ }()
7102
7513
  }, {
7103
7514
  key: "getStatsSnapshoot",
7104
7515
  value: function getStatsSnapshoot$1() {
@@ -7109,49 +7520,104 @@
7109
7520
  }, {
7110
7521
  key: "load",
7111
7522
  value: function() {
7112
- var _load = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee5(url) {
7523
+ var _load = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee6(url) {
7113
7524
  var _this2 = this;
7114
- var encodedTransformSupported, lastPc;
7115
- return _regeneratorRuntime$1().wrap(function _callee5$(_context5) {
7525
+ var lastPc, answerSdp, errorStr, preloadPromise, info, encodedTransformSupported;
7526
+ return _regeneratorRuntime$1().wrap(function _callee6$(_context6) {
7116
7527
  while (1)
7117
- switch (_context5.prev = _context5.next) {
7528
+ switch (_context6.prev = _context6.next) {
7118
7529
  case 0:
7530
+ logger.log("load()", 'invoked, url: "'.concat(url, '"'));
7119
7531
  this._disconnect();
7120
7532
  this._url = url;
7121
- this._retry = this._opts.retryCount;
7533
+ lastPc = this._pc;
7122
7534
  if (!this._opts.hackCreateOfferIssue) {
7123
- _context5.next = 6;
7535
+ _context6.next = 7;
7124
7536
  break;
7125
7537
  }
7126
- _context5.next = 6;
7538
+ _context6.next = 7;
7127
7539
  return this._createEmptyPeer();
7128
- case 6:
7129
- encodedTransformSupported = isLegacyEncodedTransformSupported();
7130
- _context5.prev = 7;
7131
- lastPc = this._pc;
7132
- if (lastPc) {
7133
- lastPc.close();
7540
+ case 7:
7541
+ _context6.prev = 7;
7542
+ this._firstFrameObserver.start();
7543
+ if (!this._preloadPromise) {
7544
+ _context6.next = 39;
7545
+ break;
7546
+ }
7547
+ logger.log("load()", "in preload process...");
7548
+ _context6.prev = 11;
7549
+ this._firstFrameObserver.setIsPreload(true);
7550
+ if (compareURL(this._url, this._preloadPromise.url, ["tabr_start_bitrate"])) {
7551
+ _context6.next = 17;
7552
+ break;
7134
7553
  }
7554
+ errorStr = "preload url not match, current url: ".concat(this._url, ", preload url: ").concat(this._preloadPromise.url);
7555
+ delete this._preloadPromise;
7556
+ throw new Error(errorStr);
7557
+ case 17:
7558
+ preloadPromise = this._preloadPromise.promise;
7559
+ delete this._preloadPromise;
7560
+ _context6.next = 21;
7561
+ return preloadPromise;
7562
+ case 21:
7563
+ info = _context6.sent;
7564
+ if (!(info.pc.signalingState !== "have-local-offer")) {
7565
+ _context6.next = 24;
7566
+ break;
7567
+ }
7568
+ throw new Error('pc.signalingState not equal "have-local-offer", current state is '.concat(info.pc.signalingState));
7569
+ case 24:
7570
+ this._pc = info.pc;
7571
+ answerSdp = info.answerSdp;
7572
+ this._videoTransceicer = info.videoTransceiver;
7573
+ this._audioTransceicer = info.audioTransceiver;
7574
+ if (this._opts.enableSei) {
7575
+ this.initVideoEncodedTransform();
7576
+ this.initAudioEncodedTransform();
7577
+ }
7578
+ _context6.next = 37;
7579
+ break;
7580
+ case 31:
7581
+ _context6.prev = 31;
7582
+ _context6.t0 = _context6["catch"](11);
7583
+ logger.warn("load()", "preload failed, ".concat(_context6.t0.message || _context6.t0.toString()));
7584
+ this._firstFrameObserver.setFailureReason(_context6.t0.message || _context6.t0.toString());
7585
+ this.load(url);
7586
+ return _context6.abrupt("return");
7587
+ case 37:
7588
+ _context6.next = 45;
7589
+ break;
7590
+ case 39:
7591
+ encodedTransformSupported = isLegacyEncodedTransformSupported();
7592
+ logger.log("load()", "isLegacyEncodedTransformSupported: ".concat(encodedTransformSupported));
7135
7593
  this._pc = new RTCPeerConnection({
7136
7594
  encodedInsertableStreams: encodedTransformSupported && this._opts.enableSei ? true : void 0
7137
7595
  });
7138
- this._bindRTCEvents();
7139
- _context5.next = 14;
7140
- return this._connect(url);
7141
- case 14:
7142
- _context5.next = 19;
7596
+ _context6.next = 44;
7597
+ return this._getAnswerSdp(this._pc);
7598
+ case 44:
7599
+ answerSdp = _context6.sent;
7600
+ case 45:
7601
+ this._bindRTCEvents(this._pc);
7602
+ _context6.next = 48;
7603
+ return this._handleAnswerSdp(this._pc, answerSdp);
7604
+ case 48:
7605
+ if (lastPc) {
7606
+ lastPc.close();
7607
+ }
7608
+ _context6.next = 54;
7143
7609
  break;
7144
- case 16:
7145
- _context5.prev = 16;
7146
- _context5.t0 = _context5["catch"](7);
7610
+ case 51:
7611
+ _context6.prev = 51;
7612
+ _context6.t1 = _context6["catch"](7);
7147
7613
  setTimeout(function() {
7148
- return _this2._emitError(StreamingError.create(ERR.OTHER, null, _context5.t0));
7614
+ return _this2._emitError(StreamingError.create(ERR.OTHER, null, _context6.t1));
7149
7615
  });
7150
- case 19:
7616
+ case 54:
7151
7617
  case "end":
7152
- return _context5.stop();
7618
+ return _context6.stop();
7153
7619
  }
7154
- }, _callee5, this, [[7, 16]]);
7620
+ }, _callee6, this, [[7, 51], [11, 31]]);
7155
7621
  }));
7156
7622
  function load(_x2) {
7157
7623
  return _load.apply(this, arguments);
@@ -7161,13 +7627,13 @@
7161
7627
  }, {
7162
7628
  key: "switchURL",
7163
7629
  value: function switchURL(url) {
7630
+ logger.log("switchURL()", 'invoked, url: "'.concat(url, '"'));
7164
7631
  this.load(url || this._url);
7165
7632
  }
7166
7633
  }, {
7167
7634
  key: "_bindRTCEvents",
7168
- value: function _bindRTCEvents() {
7635
+ value: function _bindRTCEvents(pc) {
7169
7636
  var _this3 = this;
7170
- var pc = this._pc;
7171
7637
  pc.addEventListener("track", this._onTrack);
7172
7638
  pc.addEventListener("connectionstatechange", function() {
7173
7639
  logger.warn("onconnectionstatechange:", pc.connectionState);
@@ -7205,7 +7671,7 @@
7205
7671
  value: function _handleMediaStream() {
7206
7672
  var _this4 = this;
7207
7673
  if (this._lastMediaStream) {
7208
- var _this$_player$play;
7674
+ var _this$_player2, _this$_player3, _this$_player3$play;
7209
7675
  var videoTrack = this._lastMediaStream.getVideoTracks()[0];
7210
7676
  var audioTrack = this._lastMediaStream.getAudioTracks()[0];
7211
7677
  if (videoTrack) {
@@ -7218,20 +7684,15 @@
7218
7684
  this._audio && this._mediaStream.addTrack(this._audio);
7219
7685
  this._video && this._mediaStream.addTrack(this._video);
7220
7686
  this._isReplacing = true;
7221
- this._player.pause();
7222
- (_this$_player$play = this._player.play()) === null || _this$_player$play === void 0 ? void 0 : _this$_player$play.finally(function() {
7687
+ (_this$_player2 = this._player) === null || _this$_player2 === void 0 ? void 0 : _this$_player2.pause();
7688
+ (_this$_player3 = this._player) === null || _this$_player3 === void 0 ? void 0 : (_this$_player3$play = _this$_player3.play()) === null || _this$_player3$play === void 0 ? void 0 : _this$_player3$play.finally(function() {
7223
7689
  _this4._isReplacing = false;
7224
7690
  });
7225
7691
  } else {
7226
7692
  this._mediaStream = new MediaStream();
7227
7693
  this._audio && this._mediaStream.addTrack(this._audio);
7228
7694
  this._video && this._mediaStream.addTrack(this._video);
7229
- this._media.srcObject = this._mediaStream;
7230
- var req = this._player.play();
7231
- if (req && req.catch) {
7232
- req.catch(function(e) {
7233
- });
7234
- }
7695
+ this._media && (this._media.srcObject = this._mediaStream);
7235
7696
  }
7236
7697
  }
7237
7698
  }, {
@@ -7285,21 +7746,22 @@
7285
7746
  }, {
7286
7747
  key: "_bindMediaEvent",
7287
7748
  value: function _bindMediaEvent() {
7288
- this._media.addEventListener("timeupdate", this._mockWaitingByTimeupdate);
7289
- this._media.addEventListener("loadeddata", this._onLoadedData);
7749
+ var _this$_media, _this$_media2;
7750
+ (_this$_media = this._media) === null || _this$_media === void 0 ? void 0 : _this$_media.addEventListener("timeupdate", this._mockWaitingByTimeupdate);
7751
+ (_this$_media2 = this._media) === null || _this$_media2 === void 0 ? void 0 : _this$_media2.addEventListener("loadeddata", this._onLoadedData);
7290
7752
  }
7291
7753
  }, {
7292
- key: "_connect",
7754
+ key: "_getAnswerSdp",
7293
7755
  value: function() {
7294
- var _connect2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee6() {
7295
- var pc, offer, parsed, finnalUrl, _this$_opts, _answer$remoteSdp, _this$_opts2, _answer$remoteSdp2, _parsed$media, parseSession, sessionId, reqStart, res, answer, err, _parsed;
7296
- return _regeneratorRuntime$1().wrap(function _callee6$(_context6) {
7756
+ var _getAnswerSdp2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee7(pc) {
7757
+ var offer, answerSdp, parsed, finnalUrl, _this$_opts, _this$_loader, _this$_opts2, _parsed$media, parseSession, sessionId, reqStart, res, answer, err;
7758
+ return _regeneratorRuntime$1().wrap(function _callee7$(_context7) {
7297
7759
  while (1)
7298
- switch (_context6.prev = _context6.next) {
7760
+ switch (_context7.prev = _context7.next) {
7299
7761
  case 0:
7300
- pc = this._pc;
7762
+ logger.log("_getAnswerSdp()");
7301
7763
  if (!pc.addTransceiver) {
7302
- _context6.next = 11;
7764
+ _context7.next = 11;
7303
7765
  break;
7304
7766
  }
7305
7767
  this._audioTransceicer = pc.addTransceiver("audio", {
@@ -7308,32 +7770,37 @@
7308
7770
  this._videoTransceicer = pc.addTransceiver("video", {
7309
7771
  direction: "recvonly"
7310
7772
  });
7311
- this._setDelay(this._opts.delayHint);
7773
+ this._setDelay(this._opts.delayHint || null);
7312
7774
  if (this._opts.enableSei) {
7313
7775
  this.initVideoEncodedTransform();
7314
7776
  this.initAudioEncodedTransform();
7315
7777
  }
7316
- _context6.next = 8;
7778
+ _context7.next = 8;
7317
7779
  return pc.createOffer();
7318
7780
  case 8:
7319
- offer = _context6.sent;
7320
- _context6.next = 14;
7781
+ offer = _context7.sent;
7782
+ _context7.next = 14;
7321
7783
  break;
7322
7784
  case 11:
7323
- _context6.next = 13;
7785
+ _context7.next = 13;
7324
7786
  return pc.createOffer({
7325
7787
  iceRestart: true,
7326
7788
  offerToReceiveAudio: true,
7327
7789
  offerToReceiveVideo: true
7328
7790
  });
7329
7791
  case 13:
7330
- offer = _context6.sent;
7792
+ offer = _context7.sent;
7331
7793
  case 14:
7332
7794
  if (this._opts.hackCreateOfferIssue) {
7333
7795
  this._createEmptyPeer();
7334
7796
  }
7335
- logger.log("local offer");
7336
- logger.log(offer.sdp);
7797
+ logger.log("local offer", offer);
7798
+ if (offer.sdp) {
7799
+ _context7.next = 18;
7800
+ break;
7801
+ }
7802
+ throw new Error("create offer failed");
7803
+ case 18:
7337
7804
  parsed = lib.parse(offer.sdp);
7338
7805
  parsed.media.filter(function(x) {
7339
7806
  return x.type === "audio";
@@ -7354,62 +7821,71 @@
7354
7821
  type: "nack"
7355
7822
  });
7356
7823
  });
7824
+ parsed.media.filter(function(x) {
7825
+ return x.type === "video";
7826
+ }).forEach(function(x) {
7827
+ x.fmtp.forEach(function(x2) {
7828
+ if (x2.config.indexOf("profile-level-id") !== -1) {
7829
+ x2.config = "".concat(x2.config, ";sps-pps-idr-in-keyframe=1");
7830
+ }
7831
+ });
7832
+ });
7357
7833
  offer.sdp = lib.write(parsed);
7358
- logger.log("local offer modified:\n", offer.sdp);
7359
- _context6.next = 23;
7834
+ logger.log("local offer modified:\n", offer);
7835
+ _context7.next = 25;
7360
7836
  return pc.setLocalDescription(offer);
7361
- case 23:
7837
+ case 25:
7362
7838
  finnalUrl = this._url;
7363
- _context6.prev = 24;
7839
+ _context7.prev = 26;
7364
7840
  if (this._opts.preProcessUrl) {
7365
7841
  finnalUrl = this._opts.preProcessUrl(finnalUrl).url;
7366
7842
  }
7367
- this._loader.finnalUrl = finnalUrl;
7843
+ finnalUrl = addUrlParams(finnalUrl, this._opts.urlParams);
7844
+ this._loader && (this._loader.finnalUrl = finnalUrl);
7368
7845
  parseSession = /_?session_id=([^&$]+)/.exec(finnalUrl);
7369
7846
  sessionId = parseSession ? parseSession[1] : Date.now() + "666";
7847
+ this._firstFrameObserver.changeFirstFrameState(RTC_FIRST_FRAME_STATE.OFFER_SDP_READY);
7370
7848
  this.emit(EVENT.LOAD_START, {
7371
7849
  url: finnalUrl,
7372
7850
  offersdp: (_this$_opts = this._opts) !== null && _this$_opts !== void 0 && _this$_opts.enableOriginSdpLogger ? offer.sdp : void 0,
7373
7851
  sessionId
7374
7852
  });
7375
7853
  reqStart = Date.now();
7376
- _context6.next = 33;
7377
- return this._loader.load(finnalUrl, {
7854
+ _context7.next = 37;
7855
+ return (_this$_loader = this._loader) === null || _this$_loader === void 0 ? void 0 : _this$_loader.load(finnalUrl, {
7378
7856
  body: JSON.stringify({
7379
7857
  sessionId,
7380
7858
  version: "1.0-html",
7381
7859
  localSdp: offer
7382
7860
  })
7383
7861
  });
7384
- case 33:
7385
- res = _context6.sent;
7862
+ case 37:
7863
+ res = _context7.sent;
7386
7864
  this.emit(EVENT.LOAD_RESPONSE_HEADERS, {
7387
7865
  headers: res.response.headers
7388
7866
  });
7389
7867
  answer = res === null || res === void 0 ? void 0 : res.data;
7390
7868
  if (!((answer === null || answer === void 0 ? void 0 : answer.code) === 404 || (answer === null || answer === void 0 ? void 0 : answer.code) === 403)) {
7391
- _context6.next = 41;
7869
+ _context7.next = 45;
7392
7870
  break;
7393
7871
  }
7394
7872
  err = StreamingError.create(answer.code === 404 ? ERR.NETWORK_NOTFOUND : ERR.NETWORK_FORBIDDEN, null, answer);
7395
7873
  err.errorType = ERR.NETWORK;
7396
7874
  this._emitError(err);
7397
- return _context6.abrupt("return");
7398
- case 41:
7875
+ return _context7.abrupt("return");
7876
+ case 45:
7399
7877
  if (!((answer === null || answer === void 0 ? void 0 : answer.code) !== 200)) {
7400
- _context6.next = 43;
7878
+ _context7.next = 47;
7401
7879
  break;
7402
7880
  }
7403
7881
  throw new Error("code: ".concat(answer === null || answer === void 0 ? void 0 : answer.code, ", message:").concat(answer === null || answer === void 0 ? void 0 : answer.message));
7404
- case 43:
7405
- logger.log("answer:");
7406
- logger.log((_answer$remoteSdp = answer.remoteSdp) === null || _answer$remoteSdp === void 0 ? void 0 : _answer$remoteSdp.sdp);
7407
- _parsed = lib.parse(answer.remoteSdp.sdp);
7882
+ case 47:
7883
+ answerSdp = res.data.remoteSdp.sdp;
7408
7884
  this.emit(EVENT.LOAD_COMPLETE, {
7409
7885
  url: finnalUrl,
7410
7886
  elapsed: Date.now() - reqStart,
7411
- answersdp: (_this$_opts2 = this._opts) !== null && _this$_opts2 !== void 0 && _this$_opts2.enableOriginSdpLogger ? answer === null || answer === void 0 ? void 0 : (_answer$remoteSdp2 = answer.remoteSdp) === null || _answer$remoteSdp2 === void 0 ? void 0 : _answer$remoteSdp2.sdp : void 0,
7412
- parsedSdp: _parsed === null || _parsed === void 0 ? void 0 : (_parsed$media = _parsed.media) === null || _parsed$media === void 0 ? void 0 : _parsed$media.map(function(media) {
7887
+ answersdp: (_this$_opts2 = this._opts) !== null && _this$_opts2 !== void 0 && _this$_opts2.enableOriginSdpLogger ? answerSdp : void 0,
7888
+ parsedSdp: parsed === null || parsed === void 0 ? void 0 : (_parsed$media = parsed.media) === null || _parsed$media === void 0 ? void 0 : _parsed$media.map(function(media) {
7413
7889
  return {
7414
7890
  candidates: media.candidates,
7415
7891
  rtp: media.rtp,
@@ -7417,9 +7893,50 @@
7417
7893
  };
7418
7894
  })
7419
7895
  });
7420
- _parsed.media.forEach(function(x) {
7896
+ _context7.next = 54;
7897
+ break;
7898
+ case 51:
7899
+ _context7.prev = 51;
7900
+ _context7.t0 = _context7["catch"](26);
7901
+ this._emitError(StreamingError.network(_context7.t0));
7902
+ case 54:
7903
+ return _context7.abrupt("return", answerSdp);
7904
+ case 55:
7905
+ case "end":
7906
+ return _context7.stop();
7907
+ }
7908
+ }, _callee7, this, [[26, 51]]);
7909
+ }));
7910
+ function _getAnswerSdp(_x3) {
7911
+ return _getAnswerSdp2.apply(this, arguments);
7912
+ }
7913
+ return _getAnswerSdp;
7914
+ }()
7915
+ }, {
7916
+ key: "_handleAnswerSdp",
7917
+ value: function() {
7918
+ var _handleAnswerSdp2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee8(pc, answerSdp) {
7919
+ var parsed, answer;
7920
+ return _regeneratorRuntime$1().wrap(function _callee8$(_context8) {
7921
+ while (1)
7922
+ switch (_context8.prev = _context8.next) {
7923
+ case 0:
7924
+ logger.log("_handleAnswerSdp()", "invoked, answerSdp:", {
7925
+ answerSdp
7926
+ });
7927
+ if (answerSdp) {
7928
+ _context8.next = 3;
7929
+ break;
7930
+ }
7931
+ return _context8.abrupt("return");
7932
+ case 3:
7933
+ this._firstFrameObserver.changeFirstFrameState(RTC_FIRST_FRAME_STATE.ANSWER_SDP_RECV);
7934
+ parsed = lib.parse(answerSdp);
7935
+ parsed.media.forEach(function(x) {
7421
7936
  var _x$ssrcs, _x$ssrcs$find;
7422
- x.fingerprint.hash = x.fingerprint.hash.toUpperCase();
7937
+ if (x.fingerprint) {
7938
+ x.fingerprint.hash = x.fingerprint.hash.toUpperCase();
7939
+ }
7423
7940
  var msid = (_x$ssrcs = x.ssrcs) === null || _x$ssrcs === void 0 ? void 0 : (_x$ssrcs$find = _x$ssrcs.find(function(s) {
7424
7941
  return s.attribute === "msid";
7425
7942
  })) === null || _x$ssrcs$find === void 0 ? void 0 : _x$ssrcs$find.value;
@@ -7427,42 +7944,43 @@
7427
7944
  x.msid = msid;
7428
7945
  }
7429
7946
  });
7430
- answer.remoteSdp.sdp = lib.write(_parsed);
7431
- logger.log("answer modified:\n", answer.remoteSdp.sdp);
7947
+ answer = lib.write(parsed);
7948
+ logger.log("answer modified:\n", {
7949
+ answer
7950
+ });
7432
7951
  this._rctConnectStartTs = Date.now();
7433
7952
  if (!(pc.signalingState === "closed")) {
7434
- _context6.next = 53;
7953
+ _context8.next = 11;
7435
7954
  break;
7436
7955
  }
7437
- return _context6.abrupt("return");
7438
- case 53:
7439
- _context6.next = 55;
7440
- return pc.setRemoteDescription(answer.remoteSdp);
7441
- case 55:
7956
+ return _context8.abrupt("return");
7957
+ case 11:
7958
+ _context8.next = 13;
7959
+ return pc.setRemoteDescription({
7960
+ type: "answer",
7961
+ sdp: answer
7962
+ });
7963
+ case 13:
7964
+ this._firstFrameObserver.changeFirstFrameState(RTC_FIRST_FRAME_STATE.ANSWER_SDP_READY);
7442
7965
  this._networkEvaluate = new NetworkEvaluate(pc, this._opts.networkEvaluateInterval);
7443
7966
  this._listenPeerStateTimeout();
7444
- _context6.next = 62;
7445
- break;
7446
- case 59:
7447
- _context6.prev = 59;
7448
- _context6.t0 = _context6["catch"](24);
7449
- this._emitError(StreamingError.network(_context6.t0));
7450
- case 62:
7967
+ this._firstFrameObserver.bindEvents(pc, this._videoTransceicer, this._media);
7968
+ case 17:
7451
7969
  case "end":
7452
- return _context6.stop();
7970
+ return _context8.stop();
7453
7971
  }
7454
- }, _callee6, this, [[24, 59]]);
7972
+ }, _callee8, this);
7455
7973
  }));
7456
- function _connect() {
7457
- return _connect2.apply(this, arguments);
7974
+ function _handleAnswerSdp(_x4, _x5) {
7975
+ return _handleAnswerSdp2.apply(this, arguments);
7458
7976
  }
7459
- return _connect;
7977
+ return _handleAnswerSdp;
7460
7978
  }()
7461
7979
  }, {
7462
7980
  key: "_listenPeerStateTimeout",
7463
7981
  value: function _listenPeerStateTimeout() {
7464
7982
  var _this6 = this;
7465
- this._peerStateTimer && this._clearPeerStateTimeout();
7983
+ this._clearPeerStateTimeout();
7466
7984
  if (this._opts.connectionStateChangeTimeout) {
7467
7985
  this._peerStateTimer = setTimeout(function() {
7468
7986
  _this6._emitError(StreamingError.create(ERR.MEDIA, ERR.SUB_TYPES.MEDIA_ERR_SRC_NOT_SUPPORTED, {
@@ -7474,128 +7992,148 @@
7474
7992
  }, {
7475
7993
  key: "_clearPeerStateTimeout",
7476
7994
  value: function _clearPeerStateTimeout() {
7477
- clearTimeout(this._peerStateTimer);
7478
- this._peerStateTimer = null;
7995
+ if (this._peerStateTimer) {
7996
+ clearTimeout(this._peerStateTimer);
7997
+ delete this._peerStateTimer;
7998
+ }
7479
7999
  }
7480
8000
  }, {
7481
8001
  key: "_startRtcReport",
7482
8002
  value: function _startRtcReport() {
7483
8003
  var _this7 = this;
7484
8004
  this._stopRtcReport();
7485
- this._rtcReportTimer = setInterval(/* @__PURE__ */ _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee7() {
7486
- var _this7$_audioTranscei, _this7$_videoTranscei;
7487
- var _yield$Promise$all3, _yield$Promise$all4, curAudioStats, curVideoStats, _this7$_audioStallObs, _this7$_videoStallObs, _this7$_networkQualit, _this7$_networkQualit2, audioStats, videoStats, audioStallInfo, videoStallInfo, _ref6, _ref7, quality, qualityInfo, av_sync_diff;
7488
- return _regeneratorRuntime$1().wrap(function _callee7$(_context7) {
7489
- while (1)
7490
- switch (_context7.prev = _context7.next) {
7491
- case 0:
7492
- if (!(!((_this7$_audioTranscei = _this7._audioTransceicer) !== null && _this7$_audioTranscei !== void 0 && _this7$_audioTranscei.receiver) || !((_this7$_videoTranscei = _this7._videoTransceicer) !== null && _this7$_videoTranscei !== void 0 && _this7$_videoTranscei.receiver))) {
7493
- _context7.next = 4;
7494
- break;
7495
- }
7496
- _this7._preAudioStats = null;
7497
- _this7._preVideoStats = null;
7498
- return _context7.abrupt("return");
7499
- case 4:
7500
- if (!_this7._audioStallObserver && _this7._audioTransceicer) {
7501
- _this7._audioStallObserver = new AudioStallObserver();
7502
- _this7._audioStallObserver.start(_this7._audioTransceicer);
7503
- }
7504
- if (!_this7._videoStallObserver && _this7._video) {
7505
- _this7._videoStallObserver = new VideoStallObserver();
7506
- _this7._videoStallObserver.start(_this7._media);
7507
- }
7508
- if (!_this7._networkQuality && _this7._opts.enableNetworkQuality) {
7509
- _this7._networkQuality = new NetworkQuality(_this7._pc, _this7._opts.networkQuality);
7510
- }
7511
- _context7.next = 9;
7512
- return Promise.all([getRecvAudioStats(_this7._audioTransceicer.receiver.getStats()), getRecvVideoStats(_this7._videoTransceicer.receiver.getStats())]);
7513
- case 9:
7514
- _yield$Promise$all3 = _context7.sent;
7515
- _yield$Promise$all4 = _slicedToArray(_yield$Promise$all3, 2);
7516
- curAudioStats = _yield$Promise$all4[0];
7517
- curVideoStats = _yield$Promise$all4[1];
7518
- if (!(_this7._preAudioStats && _this7._preVideoStats)) {
7519
- _context7.next = 26;
7520
- break;
7521
- }
7522
- audioStats = diffRecvAudioStats(_this7._preAudioStats, curAudioStats);
7523
- videoStats = diffRecvVideoStats(_this7._preVideoStats, curVideoStats);
7524
- _context7.next = 18;
7525
- return (_this7$_audioStallObs = _this7._audioStallObserver) === null || _this7$_audioStallObs === void 0 ? void 0 : _this7$_audioStallObs.getAudioStallInfo();
7526
- case 18:
7527
- audioStallInfo = _context7.sent;
7528
- _context7.next = 21;
7529
- return (_this7$_videoStallObs = _this7._videoStallObserver) === null || _this7$_videoStallObs === void 0 ? void 0 : _this7$_videoStallObs.getStallInfo({
7530
- interval: videoStats.statsInterval,
7531
- frameRateReceived: videoStats.frameRateReceived,
7532
- frameRateDecoded: videoStats.frameRateDecoded,
7533
- bitrate: videoStats.receivedKBitrate
7534
- });
7535
- case 21:
7536
- videoStallInfo = _context7.sent;
7537
- _ref6 = (_this7$_networkQualit = (_this7$_networkQualit2 = _this7._networkQuality) === null || _this7$_networkQualit2 === void 0 ? void 0 : _this7$_networkQualit2.getDownlinkQuality(_objectSpread2$2(_objectSpread2$2({}, audioStats), {}, {
7538
- stallDuration: audioStallInfo.stallDuration
7539
- }), _objectSpread2$2(_objectSpread2$2({}, videoStats), {}, {
7540
- stallDuration: videoStallInfo.stall.stallDuration100ms || videoStallInfo.stall.stallDuration500ms
7541
- }))) !== null && _this7$_networkQualit !== void 0 ? _this7$_networkQualit : [], _ref7 = _slicedToArray(_ref6, 2), quality = _ref7[0], qualityInfo = _ref7[1];
7542
- if (_this7._opts.enableAdaptiveJitterBuffer) {
7543
- _this7._handleJitterBuffer(qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.qualityQos, _this7._opts.adaptiveJitterBuffer, _this7._opts.networkStrategy);
7544
- }
7545
- if (videoStats.estimatedPlayoutTimestamp && audioStats.estimatedPlayoutTimestamp) {
7546
- av_sync_diff = videoStats.estimatedPlayoutTimestamp - audioStats.estimatedPlayoutTimestamp;
7547
- }
7548
- _this7.emit(EXTEND_EVENTS.RTC_NETWORK, {
7549
- interval: videoStats.statsInterval,
7550
- network_quality: quality,
7551
- audio_stall_duration: audioStallInfo.stallDuration,
7552
- audio_stall_count: audioStallInfo.stallCount,
7553
- audio_stall_time_per_100sec: audioStallInfo.stallDuration / audioStats.statsInterval * 100,
7554
- audio_stall_count_per_100sec: audioStallInfo.stallCount / audioStats.statsInterval * 100 * 1e3,
7555
- video_stall_duration: videoStallInfo.stall.stallDuration500ms,
7556
- video_stall_count: videoStallInfo.stall.stallCount500ms,
7557
- video_stall_duration_100ms: videoStallInfo.stall.stallDuration100ms,
7558
- video_stall_count_100ms: videoStallInfo.stall.stallCount100ms,
7559
- video_stall_time_per_100sec: videoStallInfo.stall.stallDuration500ms / videoStats.statsInterval * 100,
7560
- video_stall_count_per_100sec: videoStallInfo.stall.stallCount500ms / videoStats.statsInterval * 100 * 1e3,
7561
- rtt: videoStats.rtt,
7562
- video_jb_delay: videoStats.jitterBufferDelay,
7563
- audio_jb_delay: audioStats.jitterBufferDelay,
7564
- audio_lost_rate: audioStats.audioLossRate,
7565
- video_lost_rate: videoStats.videoLossRate,
7566
- video_retransmitted_rate: videoStats.retransmittedRate,
7567
- quality_audio_level: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.audioLevel,
7568
- quality_video_level: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.videoLevel,
7569
- quality_audio_qos: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.audioQos,
7570
- quality_video_qos: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.videoQos,
7571
- quality_qos: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.qualityQos,
7572
- quality_audio_qoe: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.audioQoe,
7573
- quality_video_qoe: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.videoQoe,
7574
- current_delay: _this7._getDelay(),
7575
- visibility_state: document.visibilityState,
7576
- target_delay: _this7._targetDelayHint,
7577
- av_sync_diff,
7578
- set_delay_error: _this7._setDelayError || null
7579
- });
7580
- case 26:
7581
- _this7._preAudioStats = curAudioStats;
7582
- _this7._preVideoStats = curVideoStats;
7583
- _this7.set_delay_error = null;
7584
- case 29:
7585
- case "end":
7586
- return _context7.stop();
7587
- }
7588
- }, _callee7);
7589
- })), 2e3);
8005
+ var report = /* @__PURE__ */ function() {
8006
+ var _ref5 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee9() {
8007
+ var _this7$_audioTranscei, _this7$_videoTranscei;
8008
+ var _yield$Promise$all3, _yield$Promise$all4, curAudioStats, curVideoStats, _this7$_audioStallObs, _this7$_videoStallObs, _this7$_networkQualit, _this7$_networkQualit2, _this7$_media, _this7$_media2, audioStats, videoStats, audioStallInfo, videoStallInfo, _ref6, _ref7, quality, qualityInfo, av_sync_diff;
8009
+ return _regeneratorRuntime$1().wrap(function _callee9$(_context9) {
8010
+ while (1)
8011
+ switch (_context9.prev = _context9.next) {
8012
+ case 0:
8013
+ if (!(!((_this7$_audioTranscei = _this7._audioTransceicer) !== null && _this7$_audioTranscei !== void 0 && _this7$_audioTranscei.receiver) || !((_this7$_videoTranscei = _this7._videoTransceicer) !== null && _this7$_videoTranscei !== void 0 && _this7$_videoTranscei.receiver))) {
8014
+ _context9.next = 4;
8015
+ break;
8016
+ }
8017
+ _this7._preAudioStats = null;
8018
+ _this7._preVideoStats = null;
8019
+ return _context9.abrupt("return");
8020
+ case 4:
8021
+ if (!_this7._audioStallObserver && _this7._audioTransceicer) {
8022
+ _this7._audioStallObserver = new AudioStallObserver();
8023
+ _this7._audioStallObserver.start(_this7._audioTransceicer);
8024
+ }
8025
+ if (!_this7._videoStallObserver && _this7._video && _this7._media) {
8026
+ _this7._videoStallObserver = new VideoStallObserver();
8027
+ _this7._videoStallObserver.start(_this7._media);
8028
+ }
8029
+ if (_this7._pc && !_this7._networkQuality && _this7._opts.enableNetworkQuality && _this7._opts.networkQuality) {
8030
+ _this7._networkQuality = new NetworkQuality(_this7._pc, _this7._opts.networkQuality);
8031
+ }
8032
+ _context9.next = 9;
8033
+ return Promise.all([getRecvAudioStats(_this7._audioTransceicer.receiver.getStats()), getRecvVideoStats(_this7._videoTransceicer.receiver.getStats())]);
8034
+ case 9:
8035
+ _yield$Promise$all3 = _context9.sent;
8036
+ _yield$Promise$all4 = _slicedToArray(_yield$Promise$all3, 2);
8037
+ curAudioStats = _yield$Promise$all4[0];
8038
+ curVideoStats = _yield$Promise$all4[1];
8039
+ if (!(_this7._preAudioStats && _this7._preVideoStats)) {
8040
+ _context9.next = 27;
8041
+ break;
8042
+ }
8043
+ audioStats = diffRecvAudioStats(_this7._preAudioStats, curAudioStats);
8044
+ videoStats = diffRecvVideoStats(_this7._preVideoStats, curVideoStats);
8045
+ _this7._videoJitterBufferDelay = videoStats.jitterBufferDelay;
8046
+ _context9.next = 19;
8047
+ return (_this7$_audioStallObs = _this7._audioStallObserver) === null || _this7$_audioStallObs === void 0 ? void 0 : _this7$_audioStallObs.getAudioStallInfo();
8048
+ case 19:
8049
+ audioStallInfo = _context9.sent;
8050
+ _context9.next = 22;
8051
+ return (_this7$_videoStallObs = _this7._videoStallObserver) === null || _this7$_videoStallObs === void 0 ? void 0 : _this7$_videoStallObs.getStallInfo({
8052
+ interval: videoStats.statsInterval,
8053
+ frameRateReceived: videoStats.receivedFrameRate,
8054
+ frameRateDecoded: videoStats.decoderOutputFrameRate,
8055
+ bitrate: videoStats.receivedKBitrate
8056
+ });
8057
+ case 22:
8058
+ videoStallInfo = _context9.sent;
8059
+ _ref6 = (_this7$_networkQualit = (_this7$_networkQualit2 = _this7._networkQuality) === null || _this7$_networkQualit2 === void 0 ? void 0 : _this7$_networkQualit2.getDownlinkQuality(_objectSpread2$2(_objectSpread2$2({}, audioStats), {}, {
8060
+ stallDuration: (audioStallInfo === null || audioStallInfo === void 0 ? void 0 : audioStallInfo.stallDuration) || 0
8061
+ }), _objectSpread2$2(_objectSpread2$2({}, videoStats), {}, {
8062
+ stallDuration: (videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallDuration100ms) || (videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallDuration500ms) || 0
8063
+ }))) !== null && _this7$_networkQualit !== void 0 ? _this7$_networkQualit : [], _ref7 = _slicedToArray(_ref6, 2), quality = _ref7[0], qualityInfo = _ref7[1];
8064
+ if (_this7._opts.enableAdaptiveJitterBuffer) {
8065
+ _this7._handleJitterBuffer(qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.qualityQos, _this7._opts.adaptiveJitterBuffer, _this7._opts.networkStrategy);
8066
+ }
8067
+ if (videoStats.estimatedPlayoutTimestamp && audioStats.estimatedPlayoutTimestamp) {
8068
+ av_sync_diff = videoStats.estimatedPlayoutTimestamp - audioStats.estimatedPlayoutTimestamp;
8069
+ }
8070
+ _this7.emit(EXTEND_EVENTS.RTC_NETWORK, {
8071
+ interval: videoStats.statsInterval,
8072
+ network_quality: quality,
8073
+ audio_stall_duration: audioStallInfo === null || audioStallInfo === void 0 ? void 0 : audioStallInfo.stallDuration,
8074
+ audio_stall_count: audioStallInfo === null || audioStallInfo === void 0 ? void 0 : audioStallInfo.stallCount,
8075
+ audio_stall_time_per_100sec: ((audioStallInfo === null || audioStallInfo === void 0 ? void 0 : audioStallInfo.stallDuration) || 0) / audioStats.statsInterval * 100,
8076
+ audio_stall_count_per_100sec: ((audioStallInfo === null || audioStallInfo === void 0 ? void 0 : audioStallInfo.stallCount) || 0) / audioStats.statsInterval * 100 * 1e3,
8077
+ video_stall_duration: videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallDuration500ms,
8078
+ video_stall_count: videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallCount500ms,
8079
+ video_stall_duration_100ms: videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallDuration100ms,
8080
+ video_stall_count_100ms: videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallCount100ms,
8081
+ video_stall_time_per_100sec: ((videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallDuration500ms) || 0) / videoStats.statsInterval * 100,
8082
+ video_stall_count_per_100sec: ((videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallCount500ms) || 0) / videoStats.statsInterval * 100 * 1e3,
8083
+ rtt: videoStats.rtt,
8084
+ video_jb_delay: videoStats.jitterBufferDelay,
8085
+ audio_jb_delay: audioStats.jitterBufferDelay,
8086
+ audio_lost_rate: audioStats.audioLossRate,
8087
+ video_lost_rate: videoStats.videoLossRate,
8088
+ video_retransmitted_rate: videoStats.retransmittedRate,
8089
+ quality_audio_level: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.audioLevel,
8090
+ quality_video_level: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.videoLevel,
8091
+ quality_audio_qos: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.audioQos,
8092
+ quality_video_qos: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.videoQos,
8093
+ quality_qos: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.qualityQos,
8094
+ quality_audio_qoe: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.audioQoe,
8095
+ quality_video_qoe: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.videoQoe,
8096
+ current_delay: _this7._getDelay(),
8097
+ visibility_state: document.visibilityState,
8098
+ target_delay: _this7._targetDelayHint,
8099
+ av_sync_diff,
8100
+ set_delay_error: _this7._setDelayError || null,
8101
+ video_width: ((_this7$_media = _this7._media) === null || _this7$_media === void 0 ? void 0 : _this7$_media.videoWidth) || 0,
8102
+ video_height: ((_this7$_media2 = _this7._media) === null || _this7$_media2 === void 0 ? void 0 : _this7$_media2.videoHeight) || 0,
8103
+ abr_state: videoStats.abrState || "none"
8104
+ });
8105
+ case 27:
8106
+ _this7._preAudioStats = curAudioStats;
8107
+ _this7._preVideoStats = curVideoStats;
8108
+ _this7._setDelayError = null;
8109
+ case 30:
8110
+ case "end":
8111
+ return _context9.stop();
8112
+ }
8113
+ }, _callee9);
8114
+ }));
8115
+ return function report2() {
8116
+ return _ref5.apply(this, arguments);
8117
+ };
8118
+ }();
8119
+ this._rtcReportTimer = setInterval(function() {
8120
+ return report();
8121
+ }, 2e3);
8122
+ report();
7590
8123
  }
7591
8124
  }, {
7592
8125
  key: "_handleJitterBuffer",
7593
8126
  value: function _handleJitterBuffer(quality, adaptiveJitterBuffer, networkStrategy) {
8127
+ if (!adaptiveJitterBuffer || !networkStrategy) {
8128
+ return;
8129
+ }
7594
8130
  this._networkQualityResult.push(quality);
7595
8131
  if (this._networkQualityResult.length > adaptiveJitterBuffer.networkWindow) {
7596
8132
  this._networkQualityResult.shift();
7597
8133
  }
7598
- var validNetworkQualityResult = this._networkQualityResult.filter(Boolean);
8134
+ var validNetworkQualityResult = this._networkQualityResult.filter(function(v) {
8135
+ return typeof v === "number";
8136
+ });
7599
8137
  if (validNetworkQualityResult.length === adaptiveJitterBuffer.networkWindow) {
7600
8138
  var _networkStrategy$aver;
7601
8139
  var averageQuality;
@@ -7623,9 +8161,9 @@
7623
8161
  (_this$_audioStallObse = this._audioStallObserver) === null || _this$_audioStallObse === void 0 ? void 0 : _this$_audioStallObse.destroy();
7624
8162
  (_this$_videoStallObse = this._videoStallObserver) === null || _this$_videoStallObse === void 0 ? void 0 : _this$_videoStallObse.destroy();
7625
8163
  (_this$_networkQuality = this._networkQuality) === null || _this$_networkQuality === void 0 ? void 0 : _this$_networkQuality.destroy();
7626
- this._audioStallObserver = null;
7627
- this._videoStallObserver = null;
7628
- this._networkQuality = null;
8164
+ delete this._audioStallObserver;
8165
+ delete this._videoStallObserver;
8166
+ delete this._networkQuality;
7629
8167
  this._preAudioStats = null;
7630
8168
  this._preVideoStats = null;
7631
8169
  if (this._rtcReportTimer) {
@@ -7633,23 +8171,38 @@
7633
8171
  this._rtcReportTimer = 0;
7634
8172
  }
7635
8173
  }
8174
+ }, {
8175
+ key: "_clearDelay",
8176
+ value: function _clearDelay() {
8177
+ if (this._setDelayTimer) {
8178
+ clearInterval(this._setDelayTimer);
8179
+ delete this._setDelayTimer;
8180
+ }
8181
+ this._targetDelayHint = null;
8182
+ this._setDelayError = null;
8183
+ }
7636
8184
  }, {
7637
8185
  key: "_disconnect",
7638
8186
  value: function _disconnect() {
7639
- var _this$_loader, _this$_networkEvaluat2;
7640
- (_this$_loader = this._loader) === null || _this$_loader === void 0 ? void 0 : _this$_loader.cancel();
8187
+ var _this$_loader2, _this$_networkEvaluat2;
8188
+ this._clearDelay();
8189
+ (_this$_loader2 = this._loader) === null || _this$_loader2 === void 0 ? void 0 : _this$_loader2.cancel();
7641
8190
  (_this$_networkEvaluat2 = this._networkEvaluate) === null || _this$_networkEvaluat2 === void 0 ? void 0 : _this$_networkEvaluat2.destroy();
7642
8191
  this._stopRtcReport();
7643
8192
  clearTimeout(this._checkStatsErrorTimer);
7644
8193
  this._clearPeerStateTimeout();
8194
+ this._firstFrameObserver.reset();
7645
8195
  this._audioTransceicer = null;
7646
8196
  this._videoTransceicer = null;
7647
8197
  this._mediaStream = null;
7648
- this._networkEvaluate = null;
7649
8198
  }
7650
8199
  }, {
7651
8200
  key: "_emitError",
7652
8201
  value: function _emitError(error) {
8202
+ var _error$originError;
8203
+ this._clearDelay();
8204
+ this._firstFrameObserver.setFailureReason((error === null || error === void 0 ? void 0 : (_error$originError = error.originError) === null || _error$originError === void 0 ? void 0 : _error$originError.message) || (error === null || error === void 0 ? void 0 : error.originError) || error);
8205
+ this._firstFrameObserver.reset();
7653
8206
  this.emit(EVENT.ERROR, error);
7654
8207
  clearTimeout(this._checkStatsErrorTimer);
7655
8208
  this._clearPeerStateTimeout();
@@ -7664,29 +8217,35 @@
7664
8217
  }, {
7665
8218
  key: "_createEmptyPeer",
7666
8219
  value: function() {
7667
- var _createEmptyPeer2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee8() {
8220
+ var _createEmptyPeer2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee10() {
7668
8221
  var pc;
7669
- return _regeneratorRuntime$1().wrap(function _callee8$(_context8) {
8222
+ return _regeneratorRuntime$1().wrap(function _callee10$(_context10) {
7670
8223
  while (1)
7671
- switch (_context8.prev = _context8.next) {
8224
+ switch (_context10.prev = _context10.next) {
7672
8225
  case 0:
7673
8226
  pc = new RTCPeerConnection();
7674
- _context8.next = 3;
8227
+ _context10.next = 3;
7675
8228
  return pc.createOffer();
7676
8229
  case 3:
7677
8230
  pc.close();
7678
- pc = null;
7679
- case 5:
8231
+ case 4:
7680
8232
  case "end":
7681
- return _context8.stop();
8233
+ return _context10.stop();
7682
8234
  }
7683
- }, _callee8);
8235
+ }, _callee10);
7684
8236
  }));
7685
8237
  function _createEmptyPeer() {
7686
8238
  return _createEmptyPeer2.apply(this, arguments);
7687
8239
  }
7688
8240
  return _createEmptyPeer;
7689
8241
  }()
8242
+ }, {
8243
+ key: "_emitFirstFrameState",
8244
+ value: function _emitFirstFrameState(info, extra) {
8245
+ this.emit(EXTEND_EVENTS.RTC_FIRST_FRAME, _objectSpread2$2(_objectSpread2$2(_objectSpread2$2({}, info), extra), {}, {
8246
+ initOptionsIncludePreload: !!this._opts.preloadPromise
8247
+ }));
8248
+ }
7690
8249
  }, {
7691
8250
  key: "_changeVolumeInHarmonyWorkaround",
7692
8251
  value: function _changeVolumeInHarmonyWorkaround() {
@@ -7700,7 +8259,8 @@
7700
8259
  enumerable: true,
7701
8260
  get: originalDescriptor.get,
7702
8261
  set: function set(val) {
7703
- originalDescriptor.set.call(this, val);
8262
+ var _originalDescriptor$s;
8263
+ (_originalDescriptor$s = originalDescriptor.set) === null || _originalDescriptor$s === void 0 ? void 0 : _originalDescriptor$s.call(this, val);
7704
8264
  var _changeNumberInRange = changeNumberInRange(this.volume, 0, 1, 0.01), _changeNumberInRange2 = _slicedToArray(_changeNumberInRange, 2), sourceVolume = _changeNumberInRange2[0], targetVolume = _changeNumberInRange2[1];
7705
8265
  this.volume = targetVolume;
7706
8266
  this.volume = sourceVolume;
@@ -7716,14 +8276,47 @@
7716
8276
  }
7717
8277
  }
7718
8278
  }
8279
+ }, {
8280
+ key: "_mutedBeforePlayingWorkaround",
8281
+ value: function _mutedBeforePlayingWorkaround() {
8282
+ var _this9 = this;
8283
+ if (isHeyTapBrowser() || isVivoBrowser()) {
8284
+ var originalDescriptor = Object.getOwnPropertyDescriptor(HTMLMediaElement.prototype, "muted");
8285
+ if (this._media && originalDescriptor) {
8286
+ logger.log("apply muted workaround for vivo & oppo");
8287
+ var originalMuted = this._media.muted;
8288
+ this._media.muted = true;
8289
+ Object.defineProperty(this._media, "muted", {
8290
+ configurable: true,
8291
+ enumerable: true,
8292
+ get: function get() {
8293
+ return originalMuted;
8294
+ },
8295
+ set: function set(val) {
8296
+ logger.log("muted workaround. set muted =", val);
8297
+ originalMuted = val;
8298
+ }
8299
+ });
8300
+ var revertMutedProxy = function revertMutedProxy2() {
8301
+ logger.log("revert muted workaround. muted:", originalMuted);
8302
+ if (_this9._media) {
8303
+ Object.defineProperty(_this9._media, "muted", originalDescriptor);
8304
+ _this9._media.muted = originalMuted;
8305
+ _this9._media.removeEventListener("playing", revertMutedProxy2);
8306
+ }
8307
+ };
8308
+ this._media.addEventListener("playing", revertMutedProxy);
8309
+ }
8310
+ }
8311
+ }
7719
8312
  }, {
7720
8313
  key: "destroy",
7721
8314
  value: function destroy(keepClearMediaStream) {
7722
- var _this$_revertVolumeWo, _this$_media;
8315
+ var _this$_revertVolumeWo, _this$_media3;
7723
8316
  this._disconnect();
7724
8317
  (_this$_revertVolumeWo = this._revertVolumeWorkaround) === null || _this$_revertVolumeWo === void 0 ? void 0 : _this$_revertVolumeWo.call(this);
7725
8318
  delete this._revertVolumeWorkaround;
7726
- (_this$_media = this._media) === null || _this$_media === void 0 ? void 0 : _this$_media.removeEventListener("timeupdate", this._mockWaitingByTimeupdate);
8319
+ (_this$_media3 = this._media) === null || _this$_media3 === void 0 ? void 0 : _this$_media3.removeEventListener("timeupdate", this._mockWaitingByTimeupdate);
7727
8320
  if (this._media && !keepClearMediaStream) {
7728
8321
  this._media.srcObject = null;
7729
8322
  }
@@ -7734,7 +8327,6 @@
7734
8327
  this._media = null;
7735
8328
  this._player = null;
7736
8329
  this._pc = null;
7737
- this._opts = null;
7738
8330
  }
7739
8331
  }], [{
7740
8332
  key: "enableLogger",
@@ -7763,15 +8355,11 @@
7763
8355
  function RtsPlugin2() {
7764
8356
  var _this;
7765
8357
  _classCallCheck$3(this, RtsPlugin2);
7766
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
7767
- args[_key] = arguments[_key];
7768
- }
7769
- _this = _super.call.apply(_super, [this].concat(args));
7770
- _defineProperty$2(_assertThisInitialized$1(_this), "_rts", null);
7771
- _defineProperty$2(_assertThisInitialized$1(_this), "_mediaStream", null);
7772
- _defineProperty$2(_assertThisInitialized$1(_this), "_disconnectTimer", void 0);
7773
- _defineProperty$2(_assertThisInitialized$1(_this), "_rtsOpts", null);
7774
- _defineProperty$2(_assertThisInitialized$1(_this), "_onPause", function() {
8358
+ _this = _super.apply(this, arguments);
8359
+ _this._rts = null;
8360
+ _this._rtsOpts = null;
8361
+ _this._mediaStream = null;
8362
+ _this._onPause = function() {
7775
8363
  if (_this._disconnectTimer) {
7776
8364
  return;
7777
8365
  }
@@ -7779,8 +8367,8 @@
7779
8367
  _this._closeAfterPause();
7780
8368
  _this._clearDisconnectTimer();
7781
8369
  }, _this.config.disconnectTime * 1e3);
7782
- });
7783
- _defineProperty$2(_assertThisInitialized$1(_this), "_reInit", function() {
8370
+ };
8371
+ _this._reInit = function() {
7784
8372
  var _this$_rts;
7785
8373
  _this._clearDisconnectTimer();
7786
8374
  if ((_this$_rts = _this._rts) !== null && _this$_rts !== void 0 && _this$_rts._pc) {
@@ -7788,8 +8376,8 @@
7788
8376
  }
7789
8377
  _this._init();
7790
8378
  _this._bindRtsEvents();
7791
- });
7792
- _defineProperty$2(_assertThisInitialized$1(_this), "_init", function() {
8379
+ };
8380
+ _this._init = function() {
7793
8381
  var _this$_rts2;
7794
8382
  (_this$_rts2 = _this._rts) === null || _this$_rts2 === void 0 ? void 0 : _this$_rts2.destroy();
7795
8383
  var config = _this.player.config;
@@ -7808,8 +8396,8 @@
7808
8396
  }
7809
8397
  }, rtsOpts));
7810
8398
  _this._rts.load(config.url);
7811
- });
7812
- _defineProperty$2(_assertThisInitialized$1(_this), "_onSwitchURL", function(url) {
8399
+ };
8400
+ _this._onSwitchURL = function(url) {
7813
8401
  if (url) {
7814
8402
  _this.player.config.url = url;
7815
8403
  }
@@ -7818,14 +8406,14 @@
7818
8406
  } else {
7819
8407
  _this._reInit();
7820
8408
  }
7821
- });
7822
- _defineProperty$2(_assertThisInitialized$1(_this), "destroy", function() {
8409
+ };
8410
+ _this.destroy = function() {
7823
8411
  var _this$_rts3;
7824
8412
  _this.player.switchURL = _this._originSwitchFn;
7825
8413
  _this._clearDisconnectTimer();
7826
8414
  (_this$_rts3 = _this._rts) === null || _this$_rts3 === void 0 ? void 0 : _this$_rts3.destroy();
7827
8415
  _this._rts = null;
7828
- });
8416
+ };
7829
8417
  return _this;
7830
8418
  }
7831
8419
  _createClass$3(RtsPlugin2, [{
@@ -7835,32 +8423,38 @@
7835
8423
  return (_this$_rts4 = this._rts) === null || _this$_rts4 === void 0 ? void 0 : _this$_rts4.pc;
7836
8424
  }
7837
8425
  }, {
7838
- key: "videoTrack",
8426
+ key: "jitterBufferDelay",
7839
8427
  get: function get() {
7840
8428
  var _this$_rts5;
7841
- return (_this$_rts5 = this._rts) === null || _this$_rts5 === void 0 ? void 0 : _this$_rts5.videoTack;
8429
+ return ((_this$_rts5 = this._rts) === null || _this$_rts5 === void 0 ? void 0 : _this$_rts5.getJitterBufferDelay()) || 0;
7842
8430
  }
7843
8431
  }, {
7844
- key: "audioTrack",
8432
+ key: "loader",
7845
8433
  get: function get() {
7846
8434
  var _this$_rts6;
7847
- return (_this$_rts6 = this._rts) === null || _this$_rts6 === void 0 ? void 0 : _this$_rts6.audioTrack;
8435
+ return (_this$_rts6 = this._rts) === null || _this$_rts6 === void 0 ? void 0 : _this$_rts6.loader;
7848
8436
  }
7849
8437
  }, {
7850
- key: "core",
8438
+ key: "videoTrack",
7851
8439
  get: function get() {
7852
- return this._rts;
8440
+ var _this$_rts7;
8441
+ return (_this$_rts7 = this._rts) === null || _this$_rts7 === void 0 ? void 0 : _this$_rts7.videoTack;
7853
8442
  }
7854
8443
  }, {
7855
- key: "loader",
8444
+ key: "audioTrack",
7856
8445
  get: function get() {
7857
- var _this$_rts7;
7858
- return (_this$_rts7 = this._rts) === null || _this$_rts7 === void 0 ? void 0 : _this$_rts7.loader;
8446
+ var _this$_rts8;
8447
+ return (_this$_rts8 = this._rts) === null || _this$_rts8 === void 0 ? void 0 : _this$_rts8.audioTrack;
8448
+ }
8449
+ }, {
8450
+ key: "core",
8451
+ get: function get() {
8452
+ return this._rts;
7859
8453
  }
7860
8454
  }, {
7861
8455
  key: "version",
7862
8456
  get: function get() {
7863
- return "0.2.1-alpha.47";
8457
+ return "0.2.1-alpha.51";
7864
8458
  }
7865
8459
  }, {
7866
8460
  key: "beforePlayerInit",
@@ -7868,7 +8462,8 @@
7868
8462
  var _this$player2, _this$player$config, _this$player$config$r, _this2 = this;
7869
8463
  this._init();
7870
8464
  if (!this._originSwitchFn) {
7871
- this._originSwitchFn = this.player.switchURL.bind(this.player);
8465
+ var _this$player$switchUR;
8466
+ this._originSwitchFn = (_this$player$switchUR = this.player.switchURL) === null || _this$player$switchUR === void 0 ? void 0 : _this$player$switchUR.bind(this.player);
7872
8467
  }
7873
8468
  this.player.switchURL = this._onSwitchURL;
7874
8469
  (_this$player2 = this.player) === null || _this$player2 === void 0 ? void 0 : _this$player2.useHooks("replay", this._onSwitchURL);
@@ -7910,26 +8505,26 @@
7910
8505
  }, {
7911
8506
  key: "getStats",
7912
8507
  value: function getStats2() {
7913
- var _this$_rts8;
7914
- return (_this$_rts8 = this._rts) === null || _this$_rts8 === void 0 ? void 0 : _this$_rts8.getStats();
8508
+ var _this$_rts9;
8509
+ return (_this$_rts9 = this._rts) === null || _this$_rts9 === void 0 ? void 0 : _this$_rts9.getStats();
7915
8510
  }
7916
8511
  }, {
7917
8512
  key: "getStatsSnapshoot",
7918
8513
  value: function getStatsSnapshoot2() {
7919
- var _this$_rts9;
7920
- return (_this$_rts9 = this._rts) === null || _this$_rts9 === void 0 ? void 0 : _this$_rts9.getStatsSnapshoot();
8514
+ var _this$_rts10;
8515
+ return (_this$_rts10 = this._rts) === null || _this$_rts10 === void 0 ? void 0 : _this$_rts10.getStatsSnapshoot();
7921
8516
  }
7922
8517
  }, {
7923
8518
  key: "getNetWorkInfo",
7924
8519
  value: function getNetWorkInfo() {
7925
- var _this$_rts10;
7926
- return (_this$_rts10 = this._rts) === null || _this$_rts10 === void 0 ? void 0 : _this$_rts10.networkStats;
8520
+ var _this$_rts11;
8521
+ return (_this$_rts11 = this._rts) === null || _this$_rts11 === void 0 ? void 0 : _this$_rts11.networkStats;
7927
8522
  }
7928
8523
  }, {
7929
8524
  key: "setDelay",
7930
8525
  value: function setDelay(delayHint) {
7931
- var _this$_rts11;
7932
- (_this$_rts11 = this._rts) === null || _this$_rts11 === void 0 ? void 0 : _this$_rts11._setDelay(delayHint);
8526
+ var _this$_rts12;
8527
+ (_this$_rts12 = this._rts) === null || _this$_rts12 === void 0 ? void 0 : _this$_rts12._setDelay(delayHint);
7933
8528
  }
7934
8529
  }, {
7935
8530
  key: "_clearDisconnectTimer",
@@ -7940,15 +8535,15 @@
7940
8535
  }, {
7941
8536
  key: "_closeAfterPause",
7942
8537
  value: function _closeAfterPause() {
7943
- var _this$_rts12, _this$config, _this$_rts14;
7944
- if (!((_this$_rts12 = this._rts) !== null && _this$_rts12 !== void 0 && _this$_rts12._pc)) {
8538
+ var _this$_rts13, _this$config, _this$_rts15;
8539
+ if (!((_this$_rts13 = this._rts) !== null && _this$_rts13 !== void 0 && _this$_rts13._pc)) {
7945
8540
  return;
7946
8541
  }
7947
8542
  if ((_this$config = this.config) !== null && _this$config !== void 0 && _this$config.seamlesslyReload) {
7948
- var _this$_rts13;
7949
- this._mediaStream = (_this$_rts13 = this._rts) === null || _this$_rts13 === void 0 ? void 0 : _this$_rts13._mediaStream;
8543
+ var _this$_rts14;
8544
+ this._mediaStream = (_this$_rts14 = this._rts) === null || _this$_rts14 === void 0 ? void 0 : _this$_rts14._mediaStream;
7950
8545
  }
7951
- (_this$_rts14 = this._rts) === null || _this$_rts14 === void 0 ? void 0 : _this$_rts14.destroy(true);
8546
+ (_this$_rts15 = this._rts) === null || _this$_rts15 === void 0 ? void 0 : _this$_rts15.destroy(true);
7952
8547
  this._rts = null;
7953
8548
  }
7954
8549
  }, {
@@ -7964,16 +8559,17 @@
7964
8559
  this._transCoreEvent(EVENT.SEI);
7965
8560
  this._transCoreEvent(EXTEND_EVENTS.RTC_STATE_CHANGE);
7966
8561
  this._transCoreEvent(EXTEND_EVENTS.RTC_NETWORK);
8562
+ this._transCoreEvent(EXTEND_EVENTS.RTC_FIRST_FRAME);
7967
8563
  }
7968
8564
  }, {
7969
8565
  key: "_transErrorEvent",
7970
8566
  value: function _transErrorEvent() {
7971
- var _this3 = this;
7972
- this._rts.on(EVENT.ERROR, function(err) {
8567
+ var _this$_rts16, _this3 = this, _this$_rts17;
8568
+ (_this$_rts16 = this._rts) === null || _this$_rts16 === void 0 ? void 0 : _this$_rts16.on(EVENT.ERROR, function(err) {
7973
8569
  if (!_this3.player)
7974
8570
  return;
7975
8571
  var e = new Errors(_this3.player, err);
7976
- var _this3$_rtsOpts = _this3._rtsOpts, backupConstruct = _this3$_rtsOpts.backupConstruct, backupURL = _this3$_rtsOpts.backupURL;
8572
+ var _ref = _this3._rtsOpts || {}, backupConstruct = _ref.backupConstruct, backupURL = _ref.backupURL;
7977
8573
  if (backupURL) {
7978
8574
  var _player$video;
7979
8575
  var player = _this3.player;
@@ -8009,7 +8605,7 @@
8009
8605
  }
8010
8606
  _this3.player.emit(ERROR, e);
8011
8607
  });
8012
- this._rts.on("waiting", function() {
8608
+ (_this$_rts17 = this._rts) === null || _this$_rts17 === void 0 ? void 0 : _this$_rts17.on("waiting", function() {
8013
8609
  var _this3$player;
8014
8610
  (_this3$player = _this3.player) === null || _this3$player === void 0 ? void 0 : _this3$player.emit("waiting");
8015
8611
  });
@@ -8017,8 +8613,8 @@
8017
8613
  }, {
8018
8614
  key: "_transCoreEvent",
8019
8615
  value: function _transCoreEvent(eventName) {
8020
- var _this4 = this;
8021
- this._rts.on(eventName, function(e) {
8616
+ var _this$_rts18, _this4 = this;
8617
+ (_this$_rts18 = this._rts) === null || _this$_rts18 === void 0 ? void 0 : _this$_rts18.on(eventName, function(e) {
8022
8618
  if (_this4.player) {
8023
8619
  _this4.player.emit("core_event", _objectSpread2$2(_objectSpread2$2({}, e), {}, {
8024
8620
  eventName
@@ -8056,7 +8652,8 @@
8056
8652
  case 3:
8057
8653
  res = _context.sent;
8058
8654
  hasH264 = (_res$video = res.video) === null || _res$video === void 0 ? void 0 : _res$video.filter(function(x) {
8059
- return x.codec === "H264" && (!targetProfileLevel || x.config.indexOf(targetProfileLevel) !== -1);
8655
+ var _x$config;
8656
+ return x.codec === "H264" && (!targetProfileLevel || ((_x$config = x.config) === null || _x$config === void 0 ? void 0 : _x$config.indexOf(targetProfileLevel)) !== -1);
8060
8657
  }).length;
8061
8658
  if (hasH264) {
8062
8659
  _context.next = 10;
@@ -8067,7 +8664,8 @@
8067
8664
  case 8:
8068
8665
  res1 = _context.sent;
8069
8666
  hasH264 = (_res1$video = res1.video) === null || _res1$video === void 0 ? void 0 : _res1$video.filter(function(x) {
8070
- return x.codec === "H264" && (!targetProfileLevel || x.config.indexOf(targetProfileLevel) !== -1);
8667
+ var _x$config2;
8668
+ return x.codec === "H264" && (!targetProfileLevel || ((_x$config2 = x.config) === null || _x$config2 === void 0 ? void 0 : _x$config2.indexOf(targetProfileLevel)) !== -1);
8071
8669
  }).length;
8072
8670
  case 10:
8073
8671
  return _context.abrupt("return", !!hasH264);