@byteplus/veplayer-plugin 2.10.0 → 2.10.2-rc.0

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;
@@ -1703,6 +1757,7 @@
1703
1757
  var PLAY = "play";
1704
1758
  var PAUSE = "pause";
1705
1759
  var ERROR = "error";
1760
+ var CANPLAY = "canplay";
1706
1761
  var DESTROY = "destroy";
1707
1762
  var URL_CHANGE = "urlchange";
1708
1763
  function callHandler(obj, handler, next) {
@@ -2131,6 +2186,37 @@
2131
2186
  }]);
2132
2187
  return BasePlugin2;
2133
2188
  }();
2189
+ var STATE_CLASS = {
2190
+ DEFAULT: "xgplayer",
2191
+ DEFAULT_SKIN: "xgplayer-skin-default",
2192
+ ENTER: "xgplayer-is-enter",
2193
+ PAUSED: "xgplayer-pause",
2194
+ PLAYING: "xgplayer-playing",
2195
+ ENDED: "xgplayer-ended",
2196
+ CANPLAY: "xgplayer-canplay",
2197
+ LOADING: "xgplayer-isloading",
2198
+ ERROR: "xgplayer-is-error",
2199
+ REPLAY: "xgplayer-replay",
2200
+ NO_START: "xgplayer-nostart",
2201
+ ACTIVE: "xgplayer-active",
2202
+ INACTIVE: "xgplayer-inactive",
2203
+ FULLSCREEN: "xgplayer-is-fullscreen",
2204
+ CSS_FULLSCREEN: "xgplayer-is-cssfullscreen",
2205
+ ROTATE_FULLSCREEN: "xgplayer-rotate-fullscreen",
2206
+ PARENT_ROTATE_FULLSCREEN: "xgplayer-rotate-parent",
2207
+ PARENT_FULLSCREEN: "xgplayer-fullscreen-parent",
2208
+ INNER_FULLSCREEN: "xgplayer-fullscreen-inner",
2209
+ NO_CONTROLS: "no-controls",
2210
+ FLEX_CONTROLS: "flex-controls",
2211
+ CONTROLS_FOLLOW: "controls-follow",
2212
+ CONTROLS_AUTOHIDE: "controls-autohide",
2213
+ TOP_BAR_AUTOHIDE: "top-bar-autohide",
2214
+ NOT_ALLOW_AUTOPLAY: "not-allow-autoplay",
2215
+ SEEKING: "seeking",
2216
+ PC: "xgplayer-pc",
2217
+ MOBILE: "xgplayer-mobile",
2218
+ MINI: "xgplayer-mini"
2219
+ };
2134
2220
  function ownKeys(object, enumerableOnly) {
2135
2221
  var keys = Object.keys(object);
2136
2222
  if (Object.getOwnPropertySymbols) {
@@ -4296,10 +4382,28 @@
4296
4382
  }]);
4297
4383
  return NetLoader2;
4298
4384
  }(EventEmitter);
4299
- var EXTEND_EVENTS = {
4300
- RTC_STATE_CHANGE: "core.rtcstatechange",
4301
- RTC_NETWORK: "core.rtcnetwork"
4302
- };
4385
+ var EXTEND_EVENTS = /* @__PURE__ */ function(EXTEND_EVENTS2) {
4386
+ EXTEND_EVENTS2["RTC_STATE_CHANGE"] = "core.rtcstatechange";
4387
+ EXTEND_EVENTS2["RTC_NETWORK"] = "core.rtcnetwork";
4388
+ EXTEND_EVENTS2["RTC_FIRST_FRAME"] = "core.rtcfirstframe";
4389
+ return EXTEND_EVENTS2;
4390
+ }(EXTEND_EVENTS || {});
4391
+ var RTC_FIRST_FRAME_STATE = /* @__PURE__ */ function(RTC_FIRST_FRAME_STATE2) {
4392
+ RTC_FIRST_FRAME_STATE2["LOAD_START"] = "start_load";
4393
+ RTC_FIRST_FRAME_STATE2["OFFER_SDP_READY"] = "offer_sdp_ready";
4394
+ RTC_FIRST_FRAME_STATE2["ANSWER_SDP_RECV"] = "answer_sdp_recv";
4395
+ RTC_FIRST_FRAME_STATE2["ANSWER_SDP_READY"] = "answer_sdp_ready";
4396
+ RTC_FIRST_FRAME_STATE2["ICE_CONNECTED"] = "ice_connected";
4397
+ RTC_FIRST_FRAME_STATE2["DTLS_CONNECTED"] = "dtls_connected";
4398
+ RTC_FIRST_FRAME_STATE2["PEER_CONNECTED"] = "peer_connected";
4399
+ RTC_FIRST_FRAME_STATE2["FIRST_PACKET_RECV"] = "first_packet_recv";
4400
+ RTC_FIRST_FRAME_STATE2["FIRST_FRAME_RECV"] = "first_frame_recv";
4401
+ RTC_FIRST_FRAME_STATE2["FIRST_FRAME_DECODED"] = "first_frame_decoded";
4402
+ RTC_FIRST_FRAME_STATE2["VIDEO_PLAYING"] = "video_playing";
4403
+ RTC_FIRST_FRAME_STATE2["VIDEO_CANPLAY"] = "video_canplay";
4404
+ RTC_FIRST_FRAME_STATE2["VIDEO_LOADEDDATA"] = "video_loadeddata";
4405
+ return RTC_FIRST_FRAME_STATE2;
4406
+ }(RTC_FIRST_FRAME_STATE || {});
4303
4407
  var lib = {};
4304
4408
  var parser$1 = {};
4305
4409
  var grammar$2 = { exports: {} };
@@ -4993,29 +5097,29 @@
4993
5097
  enableOriginSdpLogger: false,
4994
5098
  checkStatsErrorDelay: 5e3,
4995
5099
  connectionStateChangeTimeout: 5e3,
4996
- enableNetworkQuality: false,
5100
+ enableNetworkQuality: true,
4997
5101
  hackCreateOfferIssue: false,
4998
5102
  progressiveSetDelay: false,
4999
5103
  networkQuality: {
5000
5104
  networkQos: {
5001
5105
  1: {
5002
- "maxRtt": 250,
5003
- "maxLoss": 0.15
5106
+ maxRtt: 250,
5107
+ maxLoss: 0.15
5004
5108
  },
5005
5109
  2: {
5006
- "maxRtt": 500,
5007
- "maxLoss": 0.3,
5008
- "minRetransmittedRate": 0.2
5110
+ maxRtt: 500,
5111
+ maxLoss: 0.3,
5112
+ minRetransmittedRate: 0.2
5009
5113
  },
5010
5114
  3: {
5011
- "maxRtt": 750,
5012
- "maxLoss": 0.45,
5013
- "minRetransmittedRate": 0.35
5115
+ maxRtt: 750,
5116
+ maxLoss: 0.45,
5117
+ minRetransmittedRate: 0.35
5014
5118
  },
5015
5119
  4: {
5016
- "maxRtt": 1e3,
5017
- "maxLoss": 0.6,
5018
- "minRetransmittedRate": 0.5
5120
+ maxRtt: 1e3,
5121
+ maxLoss: 0.6,
5122
+ minRetransmittedRate: 0.5
5019
5123
  }
5020
5124
  },
5021
5125
  networkQoe: {
@@ -5036,19 +5140,19 @@
5036
5140
  }, adaptiveJitterBuffer),
5037
5141
  networkStrategy: {
5038
5142
  1: {
5039
- "jitterBuffer": null
5143
+ jitterBuffer: null
5040
5144
  },
5041
5145
  2: {
5042
- "jitterBuffer": 1.5
5146
+ jitterBuffer: 1.5
5043
5147
  },
5044
5148
  3: {
5045
- "jitterBuffer": 2
5149
+ jitterBuffer: 2
5046
5150
  },
5047
5151
  4: {
5048
- "jitterBuffer": 3
5152
+ jitterBuffer: 3
5049
5153
  },
5050
5154
  5: {
5051
- "jitterBuffer": 3
5155
+ jitterBuffer: 3
5052
5156
  }
5053
5157
  }
5054
5158
  }, opts);
@@ -5079,14 +5183,36 @@
5079
5183
  };
5080
5184
  });
5081
5185
  }
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
- });
5186
+ function getStats(_x) {
5187
+ return _getStats2.apply(this, arguments);
5188
+ }
5189
+ function _getStats2() {
5190
+ _getStats2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee2(pc) {
5191
+ return _regeneratorRuntime$1().wrap(function _callee2$(_context2) {
5192
+ while (1)
5193
+ switch (_context2.prev = _context2.next) {
5194
+ case 0:
5195
+ if (pc) {
5196
+ _context2.next = 2;
5197
+ break;
5198
+ }
5199
+ return _context2.abrupt("return", []);
5200
+ case 2:
5201
+ return _context2.abrupt("return", new Promise(function(resolve) {
5202
+ var _pc$getStats;
5203
+ (_pc$getStats = pc.getStats(null)) === null || _pc$getStats === void 0 ? void 0 : _pc$getStats.then(function(report) {
5204
+ resolve(_getStats(report));
5205
+ });
5206
+ }).catch(function() {
5207
+ return [];
5208
+ }));
5209
+ case 3:
5210
+ case "end":
5211
+ return _context2.stop();
5212
+ }
5213
+ }, _callee2);
5214
+ }));
5215
+ return _getStats2.apply(this, arguments);
5090
5216
  }
5091
5217
  function getStatsSnapshoot(stats) {
5092
5218
  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 +5282,23 @@
5156
5282
  }
5157
5283
  var QUEUE_SIZE = 5;
5158
5284
  var NetworkEvaluate = /* @__PURE__ */ function() {
5159
- function NetworkEvaluate2(pc, interval) {
5285
+ function NetworkEvaluate2(pc) {
5160
5286
  var _this = this;
5287
+ var interval = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 1e3;
5161
5288
  _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;
5289
+ this._pc = null;
5290
+ this._lastVideoStats = null;
5291
+ this._lastRemoteVideoStats = null;
5292
+ this._timer = 0;
5293
+ this._timerInterval = 0;
5294
+ this._speedQueue = [];
5295
+ this._lostRateQueue = [];
5296
+ this._receivedRateQueue = [];
5297
+ this._currentSpeed = -1;
5298
+ this._currentLostRate = -1;
5299
+ this._currentReceivedRate = -1;
5300
+ this._evaluate = /* @__PURE__ */ _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee() {
5301
+ 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
5302
  return _regeneratorRuntime$1().wrap(function _callee$(_context) {
5176
5303
  while (1)
5177
5304
  switch (_context.prev = _context.next) {
@@ -5196,8 +5323,8 @@
5196
5323
  }
5197
5324
  }
5198
5325
  if (_this._lastRemoteVideoStats && snapshoot !== null && snapshoot !== void 0 && snapshoot.videoRemote) {
5199
- nowReceived = snapshoot.video.bytesReceived;
5200
- preReceived = _this._lastVideoStats.bytesReceived;
5326
+ _ref2 = snapshoot.video || {}, _ref2$bytesReceived = _ref2.bytesReceived, nowReceived = _ref2$bytesReceived === void 0 ? 0 : _ref2$bytesReceived;
5327
+ _ref3 = _this._lastVideoStats || {}, _ref3$bytesReceived = _ref3.bytesReceived, preReceived = _ref3$bytesReceived === void 0 ? 0 : _ref3$bytesReceived;
5201
5328
  _snapshoot$videoRemot = snapshoot === null || snapshoot === void 0 ? void 0 : snapshoot.videoRemote, nowRemoteSent = _snapshoot$videoRemot.bytesSent;
5202
5329
  preRemoteSent = _this._lastRemoteVideoStats.bytesSent;
5203
5330
  if (preRemoteSent && nowRemoteSent && nowRemoteSent - preRemoteSent > 0) {
@@ -5216,7 +5343,7 @@
5216
5343
  return _context.stop();
5217
5344
  }
5218
5345
  }, _callee, null, [[0, 10]]);
5219
- })));
5346
+ }));
5220
5347
  this._pc = pc;
5221
5348
  this._timerInterval = interval;
5222
5349
  this.start(interval);
@@ -5331,6 +5458,9 @@
5331
5458
  return pc.createOffer().then(function(offer) {
5332
5459
  var _sdpJson$media, _sdpJson$media2, _vMedia$rtp, _aMedia$rtp;
5333
5460
  logger.log(offer.sdp);
5461
+ if (!offer.sdp) {
5462
+ return Promise.reject("createOffer no sdp");
5463
+ }
5334
5464
  var sdpJson = lib.parse(offer.sdp);
5335
5465
  var vMedia = (_sdpJson$media = sdpJson.media) === null || _sdpJson$media === void 0 ? void 0 : _sdpJson$media.filter(function(x) {
5336
5466
  return x.type === "video";
@@ -5518,7 +5648,7 @@
5518
5648
  var RTCDataView = /* @__PURE__ */ function() {
5519
5649
  function RTCDataView2(buffer) {
5520
5650
  _classCallCheck$3(this, RTCDataView2);
5521
- _defineProperty$2(this, "_position", 0);
5651
+ this._position = 0;
5522
5652
  this._dataview = new DataView(buffer);
5523
5653
  }
5524
5654
  _createClass$3(RTCDataView2, [{
@@ -5920,7 +6050,7 @@
5920
6050
  transformer.readable.pipeThrough(transform).pipeTo(event.transformer.writable);
5921
6051
  });
5922
6052
  }
5923
- var encodedJs = "IWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBlPXtnZXROQUxVbml0czpmdW5jdGlvbih0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdO2lmKHQubGVuZ3RoLXQucG9zaXRpb248NClyZXR1cm5bXTt2YXIgcj10LnBvc2l0aW9uO3JldHVybiAxPT09dC5nZXRJbnQzMihyKXx8MD09PXQuZ2V0SW50MTYocikmJjE9PT10LmdldEludDgocisyKT9lLmdldEFubmV4Yk5hbHModCxuKTplLmdldEF2Y2NOYWxzKHQsbil9LGdldEFubmV4Yk5hbHM6ZnVuY3Rpb24odCxuKXtmb3IodmFyIHI9W10saT1lLmdldEhlYWRlclBvc2l0aW9uQW5uZXhCKHQpLGE9aS5wb3Msbz1hO2E8dC5sZW5ndGgtNDspe3ZhciB1PW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKGEsYStpLmhlYWRlckxlbmd0aCkpO2kucG9zPT09dC5wb3NpdGlvbiYmdC5za2lwKGkuaGVhZGVyTGVuZ3RoKSxvPShpPWUuZ2V0SGVhZGVyUG9zaXRpb25Bbm5leEIodCkpLnBvczt2YXIgcz17aGVhZGVyOnUsYm9keTpuZXcgVWludDhBcnJheSh0LmJ1ZmZlci5zbGljZShhK3UuYnl0ZUxlbmd0aCxvKSksdHlwZTotMX07bj9lLmFuYWx5c2VIMjY1TmFsKHMpOmUuYW5hbHlzZU5hbChzKSwocy50eXBlPD05fHxuJiZzLnR5cGU8PTQwKSYmMCE9PXMudHlwZSYmci5wdXNoKHMpLHQuc2tpcChvLXQucG9zaXRpb24pLGE9b31yZXR1cm4gcn0sZ2V0QXZjY05hbHM6ZnVuY3Rpb24odCxuKXtmb3IodmFyIHI9W107dC5wb3NpdGlvbjx0Lmxlbmd0aC00Oyl7dmFyIGk9dC5nZXRJbnQzMih0LnBvc2l0aW9uKTtpZighKHQubGVuZ3RoLXQucG9zaXRpb24+PWkpKWJyZWFrO3ZhciBhPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKHQucG9zaXRpb24sdC5wb3NpdGlvbis0KSk7dC5za2lwKDQpO3ZhciBvPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKHQucG9zaXRpb24sdC5wb3NpdGlvbitpKSk7dC5za2lwKGkpO3ZhciB1PXtoZWFkZXI6YSxib2R5Om8sdHlwZTotMX07bj9lLmFuYWx5c2VIMjY1TmFsKHUpOmUuYW5hbHlzZU5hbCh1KSx1LnR5cGU8PTkmJjAhPT11LnR5cGUmJnIucHVzaCh1KX1yZXR1cm4gcn0sYW5hbHlzZU5hbDpmdW5jdGlvbihlKXt2YXIgdD0zMSZlLmJvZHlbMF07c3dpdGNoKGUudHlwZT10LHQpe2Nhc2UgMTplLm5kcj0hMDticmVhaztjYXNlIDU6ZS5pZHI9ITA7YnJlYWs7Y2FzZSA2OmUuc2VpPSEwO2JyZWFrO2Nhc2UgNzplLnNwcz0hMDticmVhaztjYXNlIDg6ZS5wcHM9ITB9fSxhbmFseXNlSDI2NU5hbDpmdW5jdGlvbihlKXt2YXIgdD0oMTI2JmUuYm9keVswXSk+PjE7c3dpdGNoKGUudHlwZT10LHQpe2Nhc2UgMzk6Y2FzZSA0MDplLnNlaT0hMH19LGdldEhlYWRlclBvc2l0aW9uQW5uZXhCOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLnBvc2l0aW9uLG49MCxyPWUubGVuZ3RoOzMhPT1uJiY0IT09biYmdDxyLTQ7KTA9PT1lLmdldEludDE2KHQpPzE9PT1lLmdldEludDE2KHQrMik/bj00OjE9PT1lLmdldEludDgodCsyKT9uPTM6dCsrOnQrKztyZXR1cm4gdD09PXItNCYmKDA9PT1lLmdldEludDE2KHQpPzE9PT1lLmdldEludDE2KHQrMik/bj00OnQ9cjoodCsrLDA9PT1lLmdldEludDE2KHQpJiYxPT09ZS5nZXRJbnQ4KHQpP249Mzp0PXIpKSx7cG9zOnQsaGVhZGVyTGVuZ3RoOm59fSxpc0gyNjVWaWRlb0ZyYW1lOmZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuKChudWxsPT09KHQ9ZS5nZXRNZXRhZGF0YSl8fHZvaWQgMD09PXR8fG51bGw9PT0obj10LmNhbGwoZSkpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLm1pbWVUeXBlKXx8IiIpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoImgyNjUiKX19O2Z1bmN0aW9uIHQoZSl7cmV0dXJuKHQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9KShlKX1mdW5jdGlvbiBuKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPXRbbl07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITEsaS5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGkmJihpLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyKGkua2V5KSxpKX19ZnVuY3Rpb24gcihlKXt2YXIgdD1mdW5jdGlvbihlLHQpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuIGU7dmFyIG49ZVtTeW1ib2wudG9QcmltaXRpdmVdO2lmKHZvaWQgMCE9PW4pe3ZhciByPW4uY2FsbChlLHR8fCJkZWZhdWx0Iik7aWYoIm9iamVjdCIhPXR5cGVvZiByKXJldHVybiByO3Rocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIil9cmV0dXJuKCJzdHJpbmciPT09dD9TdHJpbmc6TnVtYmVyKShlKX0oZSwic3RyaW5nIik7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0P3Q6U3RyaW5nKHQpfXZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXt2YXIgbixpLGE7IWZ1bmN0aW9uKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsZSksbj10aGlzLGE9MCwoaT1yKGk9Il9wb3NpdGlvbiIpKWluIG4/T2JqZWN0LmRlZmluZVByb3BlcnR5KG4saSx7dmFsdWU6YSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOm5baV09YSx0aGlzLl9kYXRhdmlldz1uZXcgRGF0YVZpZXcodCl9dmFyIHQsaSxhO3JldHVybiB0PWUsYT1be2tleToicmVhZEJ5dGUiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtzd2l0Y2godCl7Y2FzZSAxOnI9bj9lLmdldEludDgoZS5wb3NpdGlvbik6ZS5nZXRVaW50OChlLnBvc2l0aW9uKTticmVhaztjYXNlIDI6cj1uP2UuZ2V0SW50MTYoZS5wb3NpdGlvbik6ZS5nZXRVaW50MTYoZS5wb3NpdGlvbik7YnJlYWs7Y2FzZSAzOmlmKG4pdGhyb3cgbmV3IEVycm9yKCJub3Qgc3VwcG9ydGVkIGZvciByZWFkQnl0ZSAzIik7cj1lLmdldFVpbnQ4KGUucG9zaXRpb24pPDwxNixyfD1lLmdldFVpbnQ4KGUucG9zaXRpb24rMSk8PDgscnw9ZS5nZXRVaW50OChlLnBvc2l0aW9uKzIpO2JyZWFrO2Nhc2UgNDpyPW4/ZS5nZXRJbnQzMihlLnBvc2l0aW9uKTplLmdldFVpbnQzMihlLnBvc2l0aW9uKTticmVhaztjYXNlIDg6aWYobil0aHJvdyBuZXcgRXJyb3IoIm5vdCBzdXBwb3J0ZWQgZm9yIHJlYWRCb2R5IDgiKTtyPWUuZ2V0VWludDMyKGUucG9zaXRpb24pPDwzMixyfD1lLmdldFVpbnQzMihlLnBvc2l0aW9uKzQpO2JyZWFrO2RlZmF1bHQ6cj0iIn1yZXR1cm4gZS5wb3NpdGlvbis9dCxyfX1dLChpPVt7a2V5OiJsZW5ndGgiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RofX0se2tleToiYnVmZmVyIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YXZpZXcuYnVmZmVyfX0se2tleToicG9zaXRpb24iLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3NpdGlvbn0sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX3Bvc2l0aW9uPWV9fSx7a2V5OiJiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnBvc2l0aW9uLT1lfX0se2tleToiZ2V0VWludDgiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9kYXRhdmlldy5nZXRVaW50OChlKX19LHtrZXk6ImdldEludDgiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9kYXRhdmlldy5nZXRJbnQ4KGUpfX0se2tleToiZ2V0SW50MTYiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9kYXRhdmlldy5nZXRJbnQxNihlKX19LHtrZXk6ImdldFVpbnQxNiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2RhdGF2aWV3LmdldFVpbnQxNihlKX19LHtrZXk6ImdldFVpbnQzMiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2RhdGF2aWV3LmdldFVpbnQzMihlKX19LHtrZXk6ImdldEludDMyIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZGF0YXZpZXcuZ2V0SW50MzIoZSl9fSx7a2V5OiJza2lwIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIG49TWF0aC5mbG9vcih0LzQpLHI9dCU0LGk9MDtpPG47aSsrKWUucmVhZEJ5dGUodGhpcyw0KTtyPjAmJmUucmVhZEJ5dGUodGhpcyxyKX19LHtrZXk6InJlYWRVaW50OCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDEpfX0se2tleToicmVhZFVpbnQxNiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDIpfX0se2tleToicmVhZFVpbnQyNCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDMpfX0se2tleToicmVhZFVpbnQzMiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDQpfX0se2tleToicmVhZFVpbnQ2NCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDgpfX0se2tleToicmVhZEludDgiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGUucmVhZEJ5dGUodGhpcywxLCEwKX19LHtrZXk6InJlYWRJbnQxNiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDIsITApfX0se2tleToicmVhZEludDMyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBlLnJlYWRCeXRlKHRoaXMsNCwhMCl9fSx7a2V5OiJ3cml0ZVVpbnQzMiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBVaW50OEFycmF5KFtlPj4+MjQmMjU1LGU+Pj4xNiYyNTUsZT4+PjgmMjU1LDI1NSZlXSl9fV0pJiZuKHQucHJvdG90eXBlLGkpLGEmJm4odCxhKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlfSgpO2Z1bmN0aW9uIGEoZSxuKXtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bltyXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMSxpLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gaSYmKGkud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLChhPWkua2V5LG89dm9pZCAwLG89ZnVuY3Rpb24oZSxuKXtpZigib2JqZWN0IiE9PXQoZSl8fG51bGw9PT1lKXJldHVybiBlO3ZhciByPWVbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZih2b2lkIDAhPT1yKXt2YXIgaT1yLmNhbGwoZSxufHwiZGVmYXVsdCIpO2lmKCJvYmplY3QiIT09dChpKSlyZXR1cm4gaTt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PW4/U3RyaW5nOk51bWJlcikoZSl9KGEsInN0cmluZyIpLCJzeW1ib2wiPT09dChvKT9vOlN0cmluZyhvKSksaSl9dmFyIGEsb31mdW5jdGlvbiBvKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO3JldHVybihlW3RdPDwyND4+PjApKyhlW3QrMV08PDE2KSsoZVt0KzJdPDw4KSsoZVt0KzNdfHwwKX12YXIgdT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXshZnVuY3Rpb24oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxlKX12YXIgdCxuLHI7cmV0dXJuIHQ9ZSxyPVt7a2V5OiJwYXJzZUFubmV4QiIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ieXRlTGVuZ3RoLTEsbj0wO2Rve2lmKDAhPT1lW3RdKWJyZWFrO24rKyx0LS19d2hpbGUodD4wKTtuPj0zJiYoZT1lLnN1YmFycmF5KDAsdCsxKSk7Zm9yKHZhciByPWUubGVuZ3RoLGk9MixhPTA7bnVsbCE9PWVbaV0mJnZvaWQgMCE9PWVbaV0mJjEhPT1lW2ldOylpKys7aWYoKGE9MisgKytpKT49cilyZXR1cm5bXTtmb3IodmFyIG89W107YTxyOylzd2l0Y2goZVthXSl7Y2FzZSAwOmlmKDAhPT1lW2EtMV0pe2ErPTI7YnJlYWt9aWYoMCE9PWVbYS0yXSl7YSsrO2JyZWFrfWlmKGE8ci0xJiYxIT09ZVthKzFdKXthKys7YnJlYWt9aSE9PWEtMiYmby5wdXNoKGUuc3ViYXJyYXkoaSxhLTIpKTtkb3thKyt9d2hpbGUoMSE9PWVbYV0mJmE8cik7YT0oaT1hKzEpKzI7YnJlYWs7Y2FzZSAxOmlmKDAhPT1lW2EtMV18fDAhPT1lW2EtMl0pe2ErPTM7YnJlYWt9aSE9PWEtMiYmby5wdXNoKGUuc3ViYXJyYXkoaSxhLTIpKSxhPShpPWErMSkrMjticmVhaztkZWZhdWx0OmErPTN9cmV0dXJuIGk8ciYmby5wdXNoKGUuc3ViYXJyYXkoaSkpLG99fSx7a2V5OiJwYXJzZUF2Y0MiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTo0O2lmKCEoZS5sZW5ndGg8NCkpe2Zvcih2YXIgbixyPWUubGVuZ3RoLGk9W10sYT0wO2ErdDxyOylpZihuPW8oZSxhKSwzPT09dCYmKG4+Pj49OCksYSs9dCxuKXtpZihhK24+cilicmVhaztpLnB1c2goZS5zdWJhcnJheShhLGErbikpLGErPW59cmV0dXJuIGl9fX0se2tleToicGFyc2VTRUkiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWUubGVuZ3RoLHI9dD8yOjEsaT0wLGE9MCxvPSIiOzI1NT09PWVbcl07KWkrPTI1NSxyKys7Zm9yKGkrPWVbcisrXTsyNTU9PT1lW3JdOylhKz0yNTUscisrO2lmKGErPWVbcisrXSw1PT09aSYmbj5yKzE2KWZvcih2YXIgdT0wO3U8MTY7dSsrKW8rPWVbcl0udG9TdHJpbmcoMTYpLHIrKztyZXR1cm57cGF5bG9hZDplLnN1YmFycmF5KHIscithKSx0eXBlOmksc2l6ZTphLHV1aWQ6b319fSx7a2V5OiJyZW1vdmVFUEIiLHZhbHVlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmJ5dGVMZW5ndGgsbj1bXSxyPTE7cjx0LTI7KTA9PT1lW3JdJiYwPT09ZVtyKzFdJiYzPT09ZVtyKzJdPyhuLnB1c2gocisyKSxyKz0yKTpyKys7aWYoIW4ubGVuZ3RoKXJldHVybiBlO3ZhciBpPXQtbi5sZW5ndGgsYT1uZXcgVWludDhBcnJheShpKSxvPTA7Zm9yKHI9MDtyPGk7bysrLHIrKylvPT09blswXSYmKG8rKyxuLnNoaWZ0KCkpLGFbcl09ZVtvXTtyZXR1cm4gYX19XSwobj1udWxsKSYmYSh0LnByb3RvdHlwZSxuKSxyJiZhKHQsciksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksZX0oKTsidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJiJEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZSI9PT1zZWxmLmNvbnN0cnVjdG9yLm5hbWUmJnNlbGYuYWRkRXZlbnRMaXN0ZW5lcigicnRjdHJhbnNmb3JtIiwoZnVuY3Rpb24odCl7dmFyIG4scj10LnRyYW5zZm9ybWVyLGE9ci5vcHRpb25zLnBvcnQsbz0obj1mdW5jdGlvbihlKXthLnBvc3RNZXNzYWdlKGUpfSxuZXcgVHJhbnNmb3JtU3RyZWFtKHt0cmFuc2Zvcm06ZnVuY3Rpb24odCxyKXt2YXIgYT1lLmlzSDI2NVZpZGVvRnJhbWUodCk7ZS5nZXROQUxVbml0cyhuZXcgaSh0LmRhdGEpLGEpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKGUuc2VpKXt2YXIgdD11LnBhcnNlU0VJKHUucmVtb3ZlRVBCKGUuYm9keSksITEpO3QmJm4oe2RhdGE6dCxzZWk6e2NvZGU6dC50eXBlLGNvbnRlbnQ6dC5wYXlsb2FkfX0pfX0pKSxyLmVucXVldWUodCl9fSkpO3IucmVhZGFibGUucGlwZVRocm91Z2gobykucGlwZVRvKHQudHJhbnNmb3JtZXIud3JpdGFibGUpfSkpfSgpOwo=";
6053
+ var encodedJs = "IWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBlPXtnZXROQUxVbml0czpmdW5jdGlvbih0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdO2lmKHQubGVuZ3RoLXQucG9zaXRpb248NClyZXR1cm5bXTt2YXIgcj10LnBvc2l0aW9uO3JldHVybiAxPT09dC5nZXRJbnQzMihyKXx8MD09PXQuZ2V0SW50MTYocikmJjE9PT10LmdldEludDgocisyKT9lLmdldEFubmV4Yk5hbHModCxuKTplLmdldEF2Y2NOYWxzKHQsbil9LGdldEFubmV4Yk5hbHM6ZnVuY3Rpb24odCxuKXtmb3IodmFyIHI9W10saT1lLmdldEhlYWRlclBvc2l0aW9uQW5uZXhCKHQpLGE9aS5wb3Msbz1hO2E8dC5sZW5ndGgtNDspe3ZhciB1PW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKGEsYStpLmhlYWRlckxlbmd0aCkpO2kucG9zPT09dC5wb3NpdGlvbiYmdC5za2lwKGkuaGVhZGVyTGVuZ3RoKSxvPShpPWUuZ2V0SGVhZGVyUG9zaXRpb25Bbm5leEIodCkpLnBvczt2YXIgcz17aGVhZGVyOnUsYm9keTpuZXcgVWludDhBcnJheSh0LmJ1ZmZlci5zbGljZShhK3UuYnl0ZUxlbmd0aCxvKSksdHlwZTotMX07bj9lLmFuYWx5c2VIMjY1TmFsKHMpOmUuYW5hbHlzZU5hbChzKSwocy50eXBlPD05fHxuJiZzLnR5cGU8PTQwKSYmMCE9PXMudHlwZSYmci5wdXNoKHMpLHQuc2tpcChvLXQucG9zaXRpb24pLGE9b31yZXR1cm4gcn0sZ2V0QXZjY05hbHM6ZnVuY3Rpb24odCxuKXtmb3IodmFyIHI9W107dC5wb3NpdGlvbjx0Lmxlbmd0aC00Oyl7dmFyIGk9dC5nZXRJbnQzMih0LnBvc2l0aW9uKTtpZighKHQubGVuZ3RoLXQucG9zaXRpb24+PWkpKWJyZWFrO3ZhciBhPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKHQucG9zaXRpb24sdC5wb3NpdGlvbis0KSk7dC5za2lwKDQpO3ZhciBvPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKHQucG9zaXRpb24sdC5wb3NpdGlvbitpKSk7dC5za2lwKGkpO3ZhciB1PXtoZWFkZXI6YSxib2R5Om8sdHlwZTotMX07bj9lLmFuYWx5c2VIMjY1TmFsKHUpOmUuYW5hbHlzZU5hbCh1KSx1LnR5cGU8PTkmJjAhPT11LnR5cGUmJnIucHVzaCh1KX1yZXR1cm4gcn0sYW5hbHlzZU5hbDpmdW5jdGlvbihlKXt2YXIgdD0zMSZlLmJvZHlbMF07c3dpdGNoKGUudHlwZT10LHQpe2Nhc2UgMTplLm5kcj0hMDticmVhaztjYXNlIDU6ZS5pZHI9ITA7YnJlYWs7Y2FzZSA2OmUuc2VpPSEwO2JyZWFrO2Nhc2UgNzplLnNwcz0hMDticmVhaztjYXNlIDg6ZS5wcHM9ITB9fSxhbmFseXNlSDI2NU5hbDpmdW5jdGlvbihlKXt2YXIgdD0oMTI2JmUuYm9keVswXSk+PjE7c3dpdGNoKGUudHlwZT10LHQpe2Nhc2UgMzk6Y2FzZSA0MDplLnNlaT0hMH19LGdldEhlYWRlclBvc2l0aW9uQW5uZXhCOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLnBvc2l0aW9uLG49MCxyPWUubGVuZ3RoOzMhPT1uJiY0IT09biYmdDxyLTQ7KTA9PT1lLmdldEludDE2KHQpPzE9PT1lLmdldEludDE2KHQrMik/bj00OjE9PT1lLmdldEludDgodCsyKT9uPTM6dCsrOnQrKztyZXR1cm4gdD09PXItNCYmKDA9PT1lLmdldEludDE2KHQpPzE9PT1lLmdldEludDE2KHQrMik/bj00OnQ9cjoodCsrLDA9PT1lLmdldEludDE2KHQpJiYxPT09ZS5nZXRJbnQ4KHQpP249Mzp0PXIpKSx7cG9zOnQsaGVhZGVyTGVuZ3RoOm59fSxpc0gyNjVWaWRlb0ZyYW1lOmZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuKChudWxsPT09KHQ9ZS5nZXRNZXRhZGF0YSl8fHZvaWQgMD09PXR8fG51bGw9PT0obj10LmNhbGwoZSkpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLm1pbWVUeXBlKXx8IiIpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoImgyNjUiKX19O2Z1bmN0aW9uIHQoZSl7cmV0dXJuKHQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9KShlKX1mdW5jdGlvbiBuKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwoaT1yLmtleSxhPXZvaWQgMCwic3ltYm9sIj09dHlwZW9mKGE9ZnVuY3Rpb24oZSx0KXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiBlO3ZhciBuPWVbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZih2b2lkIDAhPT1uKXt2YXIgcj1uLmNhbGwoZSx0fHwiZGVmYXVsdCIpO2lmKCJvYmplY3QiIT10eXBlb2YgcilyZXR1cm4gcjt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PXQ/U3RyaW5nOk51bWJlcikoZSl9KGksInN0cmluZyIpKT9hOlN0cmluZyhhKSkscil9dmFyIGksYX12YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7IWZ1bmN0aW9uKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsZSksdGhpcy5fcG9zaXRpb249MCx0aGlzLl9kYXRhdmlldz1uZXcgRGF0YVZpZXcodCl9dmFyIHQscixpO3JldHVybiB0PWUsaT1be2tleToicmVhZEJ5dGUiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtzd2l0Y2godCl7Y2FzZSAxOnI9bj9lLmdldEludDgoZS5wb3NpdGlvbik6ZS5nZXRVaW50OChlLnBvc2l0aW9uKTticmVhaztjYXNlIDI6cj1uP2UuZ2V0SW50MTYoZS5wb3NpdGlvbik6ZS5nZXRVaW50MTYoZS5wb3NpdGlvbik7YnJlYWs7Y2FzZSAzOmlmKG4pdGhyb3cgbmV3IEVycm9yKCJub3Qgc3VwcG9ydGVkIGZvciByZWFkQnl0ZSAzIik7cj1lLmdldFVpbnQ4KGUucG9zaXRpb24pPDwxNixyfD1lLmdldFVpbnQ4KGUucG9zaXRpb24rMSk8PDgscnw9ZS5nZXRVaW50OChlLnBvc2l0aW9uKzIpO2JyZWFrO2Nhc2UgNDpyPW4/ZS5nZXRJbnQzMihlLnBvc2l0aW9uKTplLmdldFVpbnQzMihlLnBvc2l0aW9uKTticmVhaztjYXNlIDg6aWYobil0aHJvdyBuZXcgRXJyb3IoIm5vdCBzdXBwb3J0ZWQgZm9yIHJlYWRCb2R5IDgiKTtyPWUuZ2V0VWludDMyKGUucG9zaXRpb24pPDwzMixyfD1lLmdldFVpbnQzMihlLnBvc2l0aW9uKzQpO2JyZWFrO2RlZmF1bHQ6cj0iIn1yZXR1cm4gZS5wb3NpdGlvbis9dCxyfX1dLChyPVt7a2V5OiJsZW5ndGgiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RofX0se2tleToiYnVmZmVyIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YXZpZXcuYnVmZmVyfX0se2tleToicG9zaXRpb24iLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3NpdGlvbn0sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX3Bvc2l0aW9uPWV9fSx7a2V5OiJiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnBvc2l0aW9uLT1lfX0se2tleToiZ2V0VWludDgiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9kYXRhdmlldy5nZXRVaW50OChlKX19LHtrZXk6ImdldEludDgiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9kYXRhdmlldy5nZXRJbnQ4KGUpfX0se2tleToiZ2V0SW50MTYiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9kYXRhdmlldy5nZXRJbnQxNihlKX19LHtrZXk6ImdldFVpbnQxNiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2RhdGF2aWV3LmdldFVpbnQxNihlKX19LHtrZXk6ImdldFVpbnQzMiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2RhdGF2aWV3LmdldFVpbnQzMihlKX19LHtrZXk6ImdldEludDMyIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZGF0YXZpZXcuZ2V0SW50MzIoZSl9fSx7a2V5OiJza2lwIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIG49TWF0aC5mbG9vcih0LzQpLHI9dCU0LGk9MDtpPG47aSsrKWUucmVhZEJ5dGUodGhpcyw0KTtyPjAmJmUucmVhZEJ5dGUodGhpcyxyKX19LHtrZXk6InJlYWRVaW50OCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDEpfX0se2tleToicmVhZFVpbnQxNiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDIpfX0se2tleToicmVhZFVpbnQyNCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDMpfX0se2tleToicmVhZFVpbnQzMiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDQpfX0se2tleToicmVhZFVpbnQ2NCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDgpfX0se2tleToicmVhZEludDgiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGUucmVhZEJ5dGUodGhpcywxLCEwKX19LHtrZXk6InJlYWRJbnQxNiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDIsITApfX0se2tleToicmVhZEludDMyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBlLnJlYWRCeXRlKHRoaXMsNCwhMCl9fSx7a2V5OiJ3cml0ZVVpbnQzMiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBVaW50OEFycmF5KFtlPj4+MjQmMjU1LGU+Pj4xNiYyNTUsZT4+PjgmMjU1LDI1NSZlXSl9fV0pJiZuKHQucHJvdG90eXBlLHIpLGkmJm4odCxpKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlfSgpO2Z1bmN0aW9uIGkoZSxuKXtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bltyXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMSxpLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gaSYmKGkud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLChhPWkua2V5LG89dm9pZCAwLG89ZnVuY3Rpb24oZSxuKXtpZigib2JqZWN0IiE9PXQoZSl8fG51bGw9PT1lKXJldHVybiBlO3ZhciByPWVbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZih2b2lkIDAhPT1yKXt2YXIgaT1yLmNhbGwoZSxufHwiZGVmYXVsdCIpO2lmKCJvYmplY3QiIT09dChpKSlyZXR1cm4gaTt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PW4/U3RyaW5nOk51bWJlcikoZSl9KGEsInN0cmluZyIpLCJzeW1ib2wiPT09dChvKT9vOlN0cmluZyhvKSksaSl9dmFyIGEsb31mdW5jdGlvbiBhKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO3JldHVybihlW3RdPDwyND4+PjApKyhlW3QrMV08PDE2KSsoZVt0KzJdPDw4KSsoZVt0KzNdfHwwKX12YXIgbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXshZnVuY3Rpb24oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxlKX12YXIgdCxuLHI7cmV0dXJuIHQ9ZSxyPVt7a2V5OiJwYXJzZUFubmV4QiIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ieXRlTGVuZ3RoLTEsbj0wO2Rve2lmKDAhPT1lW3RdKWJyZWFrO24rKyx0LS19d2hpbGUodD4wKTtuPj0zJiYoZT1lLnN1YmFycmF5KDAsdCsxKSk7Zm9yKHZhciByPWUubGVuZ3RoLGk9MixhPTA7bnVsbCE9PWVbaV0mJnZvaWQgMCE9PWVbaV0mJjEhPT1lW2ldOylpKys7aWYoKGE9MisgKytpKT49cilyZXR1cm5bXTtmb3IodmFyIG89W107YTxyOylzd2l0Y2goZVthXSl7Y2FzZSAwOmlmKDAhPT1lW2EtMV0pe2ErPTI7YnJlYWt9aWYoMCE9PWVbYS0yXSl7YSsrO2JyZWFrfWlmKGE8ci0xJiYxIT09ZVthKzFdKXthKys7YnJlYWt9aSE9PWEtMiYmby5wdXNoKGUuc3ViYXJyYXkoaSxhLTIpKTtkb3thKyt9d2hpbGUoMSE9PWVbYV0mJmE8cik7YT0oaT1hKzEpKzI7YnJlYWs7Y2FzZSAxOmlmKDAhPT1lW2EtMV18fDAhPT1lW2EtMl0pe2ErPTM7YnJlYWt9aSE9PWEtMiYmby5wdXNoKGUuc3ViYXJyYXkoaSxhLTIpKSxhPShpPWErMSkrMjticmVhaztkZWZhdWx0OmErPTN9cmV0dXJuIGk8ciYmby5wdXNoKGUuc3ViYXJyYXkoaSkpLG99fSx7a2V5OiJwYXJzZUF2Y0MiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTo0O2lmKCEoZS5sZW5ndGg8NCkpe2Zvcih2YXIgbixyPWUubGVuZ3RoLGk9W10sbz0wO28rdDxyOylpZihuPWEoZSxvKSwzPT09dCYmKG4+Pj49OCksbys9dCxuKXtpZihvK24+cilicmVhaztpLnB1c2goZS5zdWJhcnJheShvLG8rbikpLG8rPW59cmV0dXJuIGl9fX0se2tleToicGFyc2VTRUkiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWUubGVuZ3RoLHI9dD8yOjEsaT0wLGE9MCxvPSIiOzI1NT09PWVbcl07KWkrPTI1NSxyKys7Zm9yKGkrPWVbcisrXTsyNTU9PT1lW3JdOylhKz0yNTUscisrO2lmKGErPWVbcisrXSw1PT09aSYmbj5yKzE2KWZvcih2YXIgdT0wO3U8MTY7dSsrKW8rPWVbcl0udG9TdHJpbmcoMTYpLHIrKztyZXR1cm57cGF5bG9hZDplLnN1YmFycmF5KHIscithKSx0eXBlOmksc2l6ZTphLHV1aWQ6b319fSx7a2V5OiJyZW1vdmVFUEIiLHZhbHVlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmJ5dGVMZW5ndGgsbj1bXSxyPTE7cjx0LTI7KTA9PT1lW3JdJiYwPT09ZVtyKzFdJiYzPT09ZVtyKzJdPyhuLnB1c2gocisyKSxyKz0yKTpyKys7aWYoIW4ubGVuZ3RoKXJldHVybiBlO3ZhciBpPXQtbi5sZW5ndGgsYT1uZXcgVWludDhBcnJheShpKSxvPTA7Zm9yKHI9MDtyPGk7bysrLHIrKylvPT09blswXSYmKG8rKyxuLnNoaWZ0KCkpLGFbcl09ZVtvXTtyZXR1cm4gYX19XSwobj1udWxsKSYmaSh0LnByb3RvdHlwZSxuKSxyJiZpKHQsciksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksZX0oKTsidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJiJEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZSI9PT1zZWxmLmNvbnN0cnVjdG9yLm5hbWUmJnNlbGYuYWRkRXZlbnRMaXN0ZW5lcigicnRjdHJhbnNmb3JtIiwoZnVuY3Rpb24odCl7dmFyIG4saT10LnRyYW5zZm9ybWVyLGE9aS5vcHRpb25zLnBvcnQsdT0obj1mdW5jdGlvbihlKXthLnBvc3RNZXNzYWdlKGUpfSxuZXcgVHJhbnNmb3JtU3RyZWFtKHt0cmFuc2Zvcm06ZnVuY3Rpb24odCxpKXt2YXIgYT1lLmlzSDI2NVZpZGVvRnJhbWUodCk7ZS5nZXROQUxVbml0cyhuZXcgcih0LmRhdGEpLGEpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKGUuc2VpKXt2YXIgdD1vLnBhcnNlU0VJKG8ucmVtb3ZlRVBCKGUuYm9keSksITEpO3QmJm4oe2RhdGE6dCxzZWk6e2NvZGU6dC50eXBlLGNvbnRlbnQ6dC5wYXlsb2FkfX0pfX0pKSxpLmVucXVldWUodCl9fSkpO2kucmVhZGFibGUucGlwZVRocm91Z2godSkucGlwZVRvKHQudHJhbnNmb3JtZXIud3JpdGFibGUpfSkpfSgpOwo=";
5924
6054
  var blob = typeof window !== "undefined" && window.Blob && new Blob([atob(encodedJs)], {
5925
6055
  type: "text/javascript;charset=utf-8"
5926
6056
  });
@@ -5934,21 +6064,19 @@
5934
6064
  objURL && (window.URL || window.webkitURL).revokeObjectURL(objURL);
5935
6065
  }
5936
6066
  }
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, [{
6067
+ var _AudioStallObserver = /* @__PURE__ */ function() {
6068
+ function _AudioStallObserver2() {
6069
+ _classCallCheck$3(this, _AudioStallObserver2);
6070
+ this._isStallInPreReportEnd = false;
6071
+ this._stallList = [];
6072
+ this._audioTransceiver = null;
6073
+ }
6074
+ _createClass$3(_AudioStallObserver2, [{
5947
6075
  key: "start",
5948
6076
  value: function start(transceiver) {
5949
6077
  this.stop();
5950
6078
  this._audioTransceiver = transceiver;
5951
- if (AudioStallObserver2.interval >= 100) {
6079
+ if (_AudioStallObserver2.interval >= 100) {
5952
6080
  this._startStallCountInterval();
5953
6081
  }
5954
6082
  }
@@ -5958,7 +6086,7 @@
5958
6086
  this._stallList = [];
5959
6087
  if (this._audioStallTimer) {
5960
6088
  clearTimeout(this._audioStallTimer);
5961
- this._audioStallTimer = null;
6089
+ delete this._audioStallTimer;
5962
6090
  }
5963
6091
  }
5964
6092
  }, {
@@ -6024,12 +6152,12 @@
6024
6152
  switch (_context2.prev = _context2.next) {
6025
6153
  case 0:
6026
6154
  clearTimeout(_this._audioStallTimer);
6027
- _this._audioStallTimer = null;
6155
+ delete _this._audioStallTimer;
6028
6156
  _context2.next = 4;
6029
6157
  return _this._audioStallCount();
6030
6158
  case 4:
6031
6159
  if (!_this._audioStallTimer) {
6032
- _this._audioStallTimer = setTimeout(loop, AudioStallObserver2.interval);
6160
+ _this._audioStallTimer = setTimeout(loop, _AudioStallObserver2.interval);
6033
6161
  }
6034
6162
  case 5:
6035
6163
  case "end":
@@ -6041,7 +6169,7 @@
6041
6169
  return _ref.apply(this, arguments);
6042
6170
  };
6043
6171
  }();
6044
- this._audioStallTimer = setTimeout(loop, AudioStallObserver2.interval);
6172
+ this._audioStallTimer = setTimeout(loop, _AudioStallObserver2.interval);
6045
6173
  }
6046
6174
  }, {
6047
6175
  key: "_audioStallCount",
@@ -6052,7 +6180,7 @@
6052
6180
  while (1)
6053
6181
  switch (_context3.prev = _context3.next) {
6054
6182
  case 0:
6055
- if (!(this._preSample && Date.now() - this._preSample.ts < AudioStallObserver2.interval * 0.5)) {
6183
+ if (!(this._preSample && Date.now() - this._preSample.ts < _AudioStallObserver2.interval * 0.5)) {
6056
6184
  _context3.next = 2;
6057
6185
  break;
6058
6186
  }
@@ -6106,7 +6234,7 @@
6106
6234
  _inboundRTP3 = inboundRTP, concealedSamples = _inboundRTP3.concealedSamples, totalSamplesReceived = _inboundRTP3.totalSamplesReceived;
6107
6235
  interval_concealed_samples = concealedSamples - this._preSample.concealedSamples;
6108
6236
  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;
6237
+ is_stall = interval_concealed_samples >= 0 && interval_samples_received >= 0 && interval_concealed_samples >= _AudioStallObserver2.ratio * interval_samples_received;
6110
6238
  this._stallList.push({
6111
6239
  concealed: interval_concealed_samples,
6112
6240
  received: interval_samples_received,
@@ -6134,10 +6262,11 @@
6134
6262
  return _audioStallCount;
6135
6263
  }()
6136
6264
  }]);
6137
- return AudioStallObserver2;
6265
+ return _AudioStallObserver2;
6138
6266
  }();
6139
- _defineProperty$2(AudioStallObserver, "interval", 100);
6140
- _defineProperty$2(AudioStallObserver, "ratio", 0.6);
6267
+ var AudioStallObserver = _AudioStallObserver;
6268
+ AudioStallObserver.interval = 100;
6269
+ AudioStallObserver.ratio = 0.6;
6141
6270
  var computeStallInfo = function computeStallInfo2(list, times, isStallInPreEnd) {
6142
6271
  var _list$;
6143
6272
  var res = {
@@ -6206,13 +6335,22 @@
6206
6335
  function VideoStallObserver2() {
6207
6336
  var _this = this;
6208
6337
  _classCallCheck$3(this, VideoStallObserver2);
6209
- _defineProperty$2(this, "_handleVisibilityChange", function() {
6338
+ this._videoInWaiting100ms = false;
6339
+ this._videoInWaiting500ms = false;
6340
+ this._pauseStart = 0;
6341
+ this._pauseDuration = 0;
6342
+ this._stallTimeThreshold = {
6343
+ stall500ms: isSafari() || isFirefox() ? 550 : 500,
6344
+ stall100ms: 100
6345
+ };
6346
+ this._support100msStall = checkVideoFrameCallback();
6347
+ this._handleVisibilityChange = function() {
6210
6348
  if (document.visibilityState === "hidden") {
6211
6349
  _this._framePause();
6212
6350
  }
6213
- });
6214
- _defineProperty$2(this, "_framePause", function() {
6215
- if (_this._prePts) {
6351
+ };
6352
+ this._framePause = function() {
6353
+ if (_this._prePts && _this._stallList) {
6216
6354
  var current = performance.now();
6217
6355
  var delta = current - _this._prePts;
6218
6356
  _this._stallList.push({
@@ -6221,23 +6359,7 @@
6221
6359
  });
6222
6360
  _this._prePts = void 0;
6223
6361
  }
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
6362
  };
6240
- this._support100msStall = checkVideoFrameCallback();
6241
6363
  }
6242
6364
  _createClass$3(VideoStallObserver2, [{
6243
6365
  key: "start",
@@ -6275,7 +6397,7 @@
6275
6397
  player.removeEventListener("play", handlePlay);
6276
6398
  };
6277
6399
  document.addEventListener("visibilitychange", this._handleVisibilityChange);
6278
- document.addEventListener("pagehide", this._framePause());
6400
+ window.addEventListener("pagehide", this._framePause);
6279
6401
  }
6280
6402
  }, {
6281
6403
  key: "stop",
@@ -6294,7 +6416,7 @@
6294
6416
  this._videoInWaiting100ms = false;
6295
6417
  this._videoInWaiting500ms = false;
6296
6418
  document.removeEventListener("visibilitychange", this._handleVisibilityChange);
6297
- document.removeEventListener("pagehide", this._framePause());
6419
+ window.removeEventListener("pagehide", this._framePause);
6298
6420
  }
6299
6421
  }, {
6300
6422
  key: "destroy",
@@ -6363,7 +6485,7 @@
6363
6485
  }
6364
6486
  var _stallInfo$stall = stallInfo.stall, stallDuration500ms = _stallInfo$stall.stallDuration500ms, stallDuration100ms = _stallInfo$stall.stallDuration100ms;
6365
6487
  stallInfo.stall.stallRate500ms = Math.min(Number((stallDuration500ms / interval).toFixed(4)), 1);
6366
- if (this._support100msStall) {
6488
+ if (this._support100msStall && stallDuration100ms) {
6367
6489
  stallInfo.stall.stallRate100ms = Math.min(Number((stallDuration100ms / interval).toFixed(4)), 1);
6368
6490
  } else {
6369
6491
  delete stallInfo.stall.stallRate100ms;
@@ -6529,7 +6651,7 @@
6529
6651
  receivedSampleRate: diffNumber(oldStats, newStats, "totalSamplesReceived") / statsInterval,
6530
6652
  concealedSamples: Math.round(diffNumber(oldStats, newStats, "concealedSamples")),
6531
6653
  concealmentEvent: Math.round(diffNumber(oldStats, newStats, "concealmentEvents")),
6532
- e2eDelay: Math.round(newStats.rtt + jitterBufferDelay)
6654
+ e2eDelay: Math.round((newStats.rtt || 0) + jitterBufferDelay)
6533
6655
  };
6534
6656
  }
6535
6657
  function getRecvVideoStats(_x2) {
@@ -6600,12 +6722,16 @@
6600
6722
  var nackCount = diffNumber(oldStats, newStats, "nackCount");
6601
6723
  var packetsReceived = diffNumber(oldStats, newStats, "packetsReceived");
6602
6724
  var jitterBufferDelay = Math.round(diffNumber(oldStats, newStats, "jitterBufferDelay") / diffNumber(oldStats, newStats, "jitterBufferEmittedCount") * 1e3);
6725
+ var newResolution = (newStats.width || 0) * (newStats.height || 0);
6726
+ var oldResolution = (oldStats.width || 0) * (oldStats.height || 0);
6727
+ var abrState = newResolution === 0 || oldResolution === 0 ? "none" : newResolution > oldResolution ? "upgrade" : newResolution < oldResolution ? "degrade" : "none";
6603
6728
  return {
6604
6729
  statsInterval,
6730
+ abrState,
6605
6731
  width: newStats.width || 0,
6606
6732
  height: newStats.height || 0,
6607
6733
  estimatedPlayoutTimestamp: newStats.estimatedPlayoutTimestamp,
6608
- videoLossRate: +(packetsLostDiff / (diffNumber(oldStats, newStats, "packetsReceived") + packetsLostDiff)),
6734
+ videoLossRate: +(packetsLostDiff / (diffNumber(oldStats, newStats, "packetsReceived") + packetsLostDiff)).toFixed(2),
6609
6735
  receivedKBitrate: +(diffNumber(oldStats, newStats, "bytesReceived") * 8 / statsInterval).toFixed(2),
6610
6736
  decoderOutputFrameRate: Math.round(diffNumber(oldStats, newStats, "framesDecoded") * 1e3 / statsInterval),
6611
6737
  receivedFrameRate: Math.round(diffNumber(oldStats, newStats, "framesReceived") * 1e3 / statsInterval),
@@ -6620,7 +6746,7 @@
6620
6746
  firCount: diffNumber(oldStats, newStats, "firCount"),
6621
6747
  nackCount,
6622
6748
  pliCount: diffNumber(oldStats, newStats, "pliCount"),
6623
- e2eDelay: Math.round(newStats.rtt + jitterBufferDelay),
6749
+ e2eDelay: Math.round((newStats.rtt || 0) + jitterBufferDelay),
6624
6750
  retransmittedRate: +(nackCount / (packetsReceived + packetsLostDiff)).toFixed(2)
6625
6751
  };
6626
6752
  }
@@ -6653,11 +6779,11 @@
6653
6779
  DOWN: 6
6654
6780
  };
6655
6781
  var NetworkQuality = /* @__PURE__ */ function() {
6656
- function NetworkQuality2(peer, networkQualityParams) {
6782
+ function NetworkQuality2(_peer, _networkQualityParams) {
6657
6783
  _classCallCheck$3(this, NetworkQuality2);
6658
- _defineProperty$2(this, "_preDownlinkStats", []);
6659
- this._peer = peer;
6660
- this._networkQualityParams = networkQualityParams;
6784
+ this._peer = _peer;
6785
+ this._networkQualityParams = _networkQualityParams;
6786
+ this._preDownlinkStats = [];
6661
6787
  }
6662
6788
  _createClass$3(NetworkQuality2, [{
6663
6789
  key: "getDownlinkQuality",
@@ -6712,11 +6838,11 @@
6712
6838
  } else {
6713
6839
  quality = QosLevel.VBAD;
6714
6840
  }
6715
- if (retransmittedRate > qosQualityParams[QosLevel.BAD].minRetransmittedRate) {
6841
+ if (retransmittedRate > (qosQualityParams[QosLevel.BAD].minRetransmittedRate || 0.5)) {
6716
6842
  quality = Math.max(quality, QosLevel.BAD);
6717
- } else if (retransmittedRate > qosQualityParams[QosLevel.POOR].minRetransmittedRate) {
6843
+ } else if (retransmittedRate > (qosQualityParams[QosLevel.POOR].minRetransmittedRate || 0.35)) {
6718
6844
  quality = Math.max(quality, QosLevel.POOR);
6719
- } else if (retransmittedRate > qosQualityParams[QosLevel.GOOD].minRetransmittedRate) {
6845
+ } else if (retransmittedRate > (qosQualityParams[QosLevel.GOOD].minRetransmittedRate || 0.2)) {
6720
6846
  quality = Math.max(quality, QosLevel.GOOD);
6721
6847
  }
6722
6848
  return quality;
@@ -6757,6 +6883,240 @@
6757
6883
  }]);
6758
6884
  return NetworkQuality2;
6759
6885
  }();
6886
+ 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];
6887
+ var FirstFrameObserver = /* @__PURE__ */ function() {
6888
+ function FirstFrameObserver2(_emitFirstFrameState) {
6889
+ var _this = this;
6890
+ _classCallCheck$3(this, FirstFrameObserver2);
6891
+ this._emitFirstFrameState = _emitFirstFrameState;
6892
+ this._startConnectTs = 0;
6893
+ this._firstVideoFrameInterval = null;
6894
+ this._preState = null;
6895
+ this._state = {};
6896
+ this._pc = null;
6897
+ this._video = null;
6898
+ this._videoTransceiver = null;
6899
+ this._extraInfo = {
6900
+ is_preload: false
6901
+ };
6902
+ this._handleConnectionStateChange = function() {
6903
+ var _this$_pc;
6904
+ if (((_this$_pc = _this._pc) === null || _this$_pc === void 0 ? void 0 : _this$_pc.connectionState) === "connected" && _this._videoTransceiver) {
6905
+ _this.changeFirstFrameState(RTC_FIRST_FRAME_STATE.PEER_CONNECTED);
6906
+ _this._watchForFirstVideoFrameRecv(_this._videoTransceiver);
6907
+ }
6908
+ };
6909
+ this._handleICEConnectionStateChange = function() {
6910
+ var _this$_pc2;
6911
+ if (((_this$_pc2 = _this._pc) === null || _this$_pc2 === void 0 ? void 0 : _this$_pc2.iceConnectionState) === "connected") {
6912
+ _this.changeFirstFrameState(RTC_FIRST_FRAME_STATE.ICE_CONNECTED);
6913
+ }
6914
+ };
6915
+ this._handlePlaying = function() {
6916
+ if (!_this._state[RTC_FIRST_FRAME_STATE.PEER_CONNECTED]) {
6917
+ return;
6918
+ }
6919
+ _this.changeFirstFrameState(RTC_FIRST_FRAME_STATE.VIDEO_PLAYING);
6920
+ _this.reset();
6921
+ };
6922
+ this._handleCanplay = function() {
6923
+ if (!_this._state[RTC_FIRST_FRAME_STATE.PEER_CONNECTED]) {
6924
+ return;
6925
+ }
6926
+ _this.changeFirstFrameState(RTC_FIRST_FRAME_STATE.VIDEO_CANPLAY);
6927
+ };
6928
+ this._handleLoadeddata = function() {
6929
+ if (!_this._state[RTC_FIRST_FRAME_STATE.PEER_CONNECTED]) {
6930
+ return;
6931
+ }
6932
+ _this.changeFirstFrameState(RTC_FIRST_FRAME_STATE.VIDEO_LOADEDDATA);
6933
+ };
6934
+ this._handleError = function() {
6935
+ _this.reset();
6936
+ };
6937
+ }
6938
+ _createClass$3(FirstFrameObserver2, [{
6939
+ key: "start",
6940
+ value: function start() {
6941
+ this.reset();
6942
+ this._startConnectTs = Date.now();
6943
+ this.changeFirstFrameState(RTC_FIRST_FRAME_STATE.LOAD_START);
6944
+ }
6945
+ }, {
6946
+ key: "changeFirstFrameState",
6947
+ value: function changeFirstFrameState(state) {
6948
+ var _ref, _this2 = this;
6949
+ var preIdx = (_ref = this._preState && FIRST_FRAME_STATE_ORDER.indexOf(this._preState)) !== null && _ref !== void 0 ? _ref : -1;
6950
+ var curIdx = FIRST_FRAME_STATE_ORDER.indexOf(state);
6951
+ var elapsed = Date.now() - this._startConnectTs;
6952
+ if (curIdx > preIdx) {
6953
+ FIRST_FRAME_STATE_ORDER.slice(preIdx + 1, curIdx + 1).forEach(function(s) {
6954
+ _this2._state[s] = elapsed;
6955
+ });
6956
+ this._preState = state;
6957
+ }
6958
+ }
6959
+ }, {
6960
+ key: "setIsPreload",
6961
+ value: function setIsPreload(isPreload) {
6962
+ this._extraInfo.is_preload = isPreload;
6963
+ }
6964
+ }, {
6965
+ key: "setFailureReason",
6966
+ value: function setFailureReason(reason) {
6967
+ this._extraInfo.failure_reason = reason;
6968
+ }
6969
+ }, {
6970
+ key: "bindEvents",
6971
+ value: function bindEvents(pc, videoTransceiver, video) {
6972
+ var _this3 = this;
6973
+ this._pc = pc;
6974
+ this._video = video;
6975
+ this._videoTransceiver = videoTransceiver;
6976
+ pc.addEventListener("connectionstatechange", this._handleConnectionStateChange);
6977
+ pc.addEventListener("iceconnectionstatechange", this._handleICEConnectionStateChange);
6978
+ var _ref2 = (videoTransceiver === null || videoTransceiver === void 0 ? void 0 : videoTransceiver.receiver) || {}, transport = _ref2.transport;
6979
+ if (transport) {
6980
+ transport.onstatechange = function() {
6981
+ transport.state === "connected" && _this3.changeFirstFrameState(RTC_FIRST_FRAME_STATE.DTLS_CONNECTED);
6982
+ };
6983
+ }
6984
+ video === null || video === void 0 ? void 0 : video.addEventListener("playing", this._handlePlaying);
6985
+ video === null || video === void 0 ? void 0 : video.addEventListener("canplay", this._handleCanplay);
6986
+ video === null || video === void 0 ? void 0 : video.addEventListener("loadeddata", this._handleLoadeddata);
6987
+ video === null || video === void 0 ? void 0 : video.addEventListener("error", this._handleError);
6988
+ }
6989
+ }, {
6990
+ key: "_watchForFirstVideoFrameRecv",
6991
+ value: function _watchForFirstVideoFrameRecv(videoTransceiver) {
6992
+ var _this4 = this;
6993
+ var hasPacketsReceived = false;
6994
+ var hasFrameReceived = false;
6995
+ var hasFrameDecoded = false;
6996
+ this._cancelWatchForFirstVideoFrameRecv();
6997
+ this._firstVideoFrameInterval = window.setInterval(/* @__PURE__ */ _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee() {
6998
+ var _inboundRtpStats, _inboundRtpStats2, _inboundRtpStats3;
6999
+ var receiver, reports, inboundRtpStats;
7000
+ return _regeneratorRuntime$1().wrap(function _callee$(_context) {
7001
+ while (1)
7002
+ switch (_context.prev = _context.next) {
7003
+ case 0:
7004
+ receiver = videoTransceiver.receiver;
7005
+ _context.next = 3;
7006
+ return receiver.getStats();
7007
+ case 3:
7008
+ reports = _context.sent;
7009
+ reports.forEach(function(report) {
7010
+ if (report.type === "inbound-rtp") {
7011
+ inboundRtpStats = report;
7012
+ }
7013
+ });
7014
+ if (!hasPacketsReceived && (_inboundRtpStats = inboundRtpStats) !== null && _inboundRtpStats !== void 0 && _inboundRtpStats.packetsReceived && inboundRtpStats.packetsReceived > 0) {
7015
+ hasPacketsReceived = true;
7016
+ _this4.changeFirstFrameState(RTC_FIRST_FRAME_STATE.FIRST_PACKET_RECV);
7017
+ }
7018
+ if (!hasFrameReceived && (_inboundRtpStats2 = inboundRtpStats) !== null && _inboundRtpStats2 !== void 0 && _inboundRtpStats2.framesReceived && inboundRtpStats.framesReceived > 0) {
7019
+ hasFrameReceived = true;
7020
+ _this4.changeFirstFrameState(RTC_FIRST_FRAME_STATE.FIRST_FRAME_RECV);
7021
+ }
7022
+ if (!hasFrameDecoded && (_inboundRtpStats3 = inboundRtpStats) !== null && _inboundRtpStats3 !== void 0 && _inboundRtpStats3.framesDecoded && inboundRtpStats.framesDecoded > 0) {
7023
+ hasFrameDecoded = true;
7024
+ _this4.changeFirstFrameState(RTC_FIRST_FRAME_STATE.FIRST_FRAME_DECODED);
7025
+ _this4._cancelWatchForFirstVideoFrameRecv();
7026
+ }
7027
+ case 8:
7028
+ case "end":
7029
+ return _context.stop();
7030
+ }
7031
+ }, _callee);
7032
+ })), 200);
7033
+ }
7034
+ }, {
7035
+ key: "_cancelWatchForFirstVideoFrameRecv",
7036
+ value: function _cancelWatchForFirstVideoFrameRecv() {
7037
+ if (this._firstVideoFrameInterval) {
7038
+ window.clearInterval(this._firstVideoFrameInterval);
7039
+ this._firstVideoFrameInterval = null;
7040
+ }
7041
+ }
7042
+ }, {
7043
+ key: "reset",
7044
+ value: function reset() {
7045
+ var _this5 = this, _this$_video, _this$_video2, _this$_video3, _this$_video4, _this$_pc3, _this$_pc4;
7046
+ if (Object.keys(this._state).length > 0) {
7047
+ var state = _objectSpread2$2({}, this._state);
7048
+ var extraInfo = _objectSpread2$2({}, this._extraInfo);
7049
+ getTransportInfo(this._videoTransceiver, extraInfo).then(function() {
7050
+ _this5._emitFirstFrameState(state, extraInfo);
7051
+ });
7052
+ }
7053
+ this._preState = null;
7054
+ this._extraInfo = {
7055
+ is_preload: false
7056
+ };
7057
+ this._state = {};
7058
+ (_this$_video = this._video) === null || _this$_video === void 0 ? void 0 : _this$_video.removeEventListener("playing", this._handlePlaying);
7059
+ (_this$_video2 = this._video) === null || _this$_video2 === void 0 ? void 0 : _this$_video2.removeEventListener("canplay", this._handleCanplay);
7060
+ (_this$_video3 = this._video) === null || _this$_video3 === void 0 ? void 0 : _this$_video3.removeEventListener("loadeddata", this._handleLoadeddata);
7061
+ (_this$_video4 = this._video) === null || _this$_video4 === void 0 ? void 0 : _this$_video4.removeEventListener("error", this._handleError);
7062
+ (_this$_pc3 = this._pc) === null || _this$_pc3 === void 0 ? void 0 : _this$_pc3.removeEventListener("connectionstatechange", this._handleConnectionStateChange);
7063
+ (_this$_pc4 = this._pc) === null || _this$_pc4 === void 0 ? void 0 : _this$_pc4.removeEventListener("iceconnectionstatechange", this._handleICEConnectionStateChange);
7064
+ this._cancelWatchForFirstVideoFrameRecv();
7065
+ this._pc = null;
7066
+ this._video = null;
7067
+ this._videoTransceiver = null;
7068
+ }
7069
+ }]);
7070
+ return FirstFrameObserver2;
7071
+ }();
7072
+ var getTransportInfo = /* @__PURE__ */ function() {
7073
+ var _ref4 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee2(videoTransceiver, extraInfo) {
7074
+ var _videoTransceiver$rec;
7075
+ var reports, candidatePairStats, localCandidateStats, remoteCandidateStats;
7076
+ return _regeneratorRuntime$1().wrap(function _callee2$(_context2) {
7077
+ while (1)
7078
+ switch (_context2.prev = _context2.next) {
7079
+ case 0:
7080
+ _context2.next = 2;
7081
+ return videoTransceiver === null || videoTransceiver === void 0 ? void 0 : (_videoTransceiver$rec = videoTransceiver.receiver) === null || _videoTransceiver$rec === void 0 ? void 0 : _videoTransceiver$rec.getStats().catch(function() {
7082
+ });
7083
+ case 2:
7084
+ reports = _context2.sent;
7085
+ reports === null || reports === void 0 ? void 0 : reports.forEach(function(report) {
7086
+ if (report.type === "candidate-pair") {
7087
+ candidatePairStats = report;
7088
+ localCandidateStats = reports.get(report.localCandidateId);
7089
+ remoteCandidateStats = reports.get(report.remoteCandidateId);
7090
+ }
7091
+ });
7092
+ if (remoteCandidateStats) {
7093
+ extraInfo.remote_ip = remoteCandidateStats.ip || remoteCandidateStats.address;
7094
+ extraInfo.remote_port = remoteCandidateStats.port;
7095
+ extraInfo.remote_candidate_type = remoteCandidateStats.candidateType;
7096
+ extraInfo.protocol = remoteCandidateStats.protocol;
7097
+ }
7098
+ if (localCandidateStats) {
7099
+ extraInfo.local_ip = localCandidateStats.ip || localCandidateStats.address;
7100
+ extraInfo.local_port = localCandidateStats.port;
7101
+ extraInfo.local_candidate_type = localCandidateStats.candidateType;
7102
+ }
7103
+ if (candidatePairStats) {
7104
+ extraInfo.rtt = candidatePairStats.currentRoundTripTime;
7105
+ extraInfo.stun_requests_sent = candidatePairStats.requestsSent;
7106
+ extraInfo.stun_requests_received = candidatePairStats.requestsReceived;
7107
+ extraInfo.stun_responses_sent = candidatePairStats.responsesSent;
7108
+ extraInfo.stun_responses_received = candidatePairStats.responsesReceived;
7109
+ }
7110
+ case 7:
7111
+ case "end":
7112
+ return _context2.stop();
7113
+ }
7114
+ }, _callee2);
7115
+ }));
7116
+ return function getTransportInfo2(_x, _x2) {
7117
+ return _ref4.apply(this, arguments);
7118
+ };
7119
+ }();
6760
7120
  function changeNumberInRange(source, min, max, delta) {
6761
7121
  var target = source + delta;
6762
7122
  if (target > max) {
@@ -6767,6 +7127,111 @@
6767
7127
  function isHarmonyOS() {
6768
7128
  return /(HarmonyOS|OpenHarmony|ArkWeb)/i.test(navigator.userAgent);
6769
7129
  }
7130
+ function compareURL(url1, url2) {
7131
+ var queryKeys = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : [];
7132
+ if (typeof url1 !== "string" || typeof url2 !== "string") {
7133
+ return false;
7134
+ }
7135
+ if (!url1.includes("://")) {
7136
+ url1 = window.location.protocol + "//" + url1;
7137
+ }
7138
+ if (!url2.includes("://")) {
7139
+ url2 = window.location.protocol + "//" + url2;
7140
+ }
7141
+ var url1Obj;
7142
+ var url2Obj;
7143
+ try {
7144
+ url1Obj = new URL(url1);
7145
+ url2Obj = new URL(url2);
7146
+ } catch (e) {
7147
+ return false;
7148
+ }
7149
+ if (url1Obj.host + url1Obj.pathname !== url2Obj.host + url2Obj.pathname) {
7150
+ return false;
7151
+ }
7152
+ var _iterator = _createForOfIteratorHelper$1(queryKeys), _step;
7153
+ try {
7154
+ for (_iterator.s(); !(_step = _iterator.n()).done; ) {
7155
+ var key = _step.value;
7156
+ if (url1Obj.searchParams.get(key) !== url2Obj.searchParams.get(key)) {
7157
+ return false;
7158
+ }
7159
+ }
7160
+ } catch (err) {
7161
+ _iterator.e(err);
7162
+ } finally {
7163
+ _iterator.f();
7164
+ }
7165
+ return true;
7166
+ }
7167
+ function addUrlParams(url, params) {
7168
+ if (!params || Object.keys(params).length === 0) {
7169
+ return url;
7170
+ }
7171
+ var urlParams = url.includes("?") ? new URLSearchParams(url.split("?")[1]) : new URLSearchParams();
7172
+ Object.keys(params).forEach(function(key) {
7173
+ urlParams.set(key, params[key]);
7174
+ });
7175
+ return url.split("?")[0] + "?" + urlParams.toString();
7176
+ }
7177
+ function isHeyTapBrowser() {
7178
+ return /(HeyTapBrowser)/i.test(navigator.userAgent);
7179
+ }
7180
+ function isVivoBrowser() {
7181
+ return /(VivoBrowser)/i.test(navigator.userAgent);
7182
+ }
7183
+ var VideoFrameRecvCallback = /* @__PURE__ */ function() {
7184
+ function VideoFrameRecvCallback2() {
7185
+ var _this = this;
7186
+ _classCallCheck$3(this, VideoFrameRecvCallback2);
7187
+ this._onVideoRefresh = function(_, data) {
7188
+ var _this$_domElement;
7189
+ _this._recentVideoInfo = data;
7190
+ _this._requestVideoFrameCallbackTimer = (_this$_domElement = _this._domElement) === null || _this$_domElement === void 0 ? void 0 : _this$_domElement.requestVideoFrameCallback(_this._onVideoRefresh);
7191
+ };
7192
+ }
7193
+ _createClass$3(VideoFrameRecvCallback2, [{
7194
+ key: "start",
7195
+ value: function start(domElement) {
7196
+ var _this2 = this;
7197
+ this._domElement = domElement;
7198
+ if (typeof HTMLVideoElement.prototype.requestVideoFrameCallback === "function") {
7199
+ if (domElement) {
7200
+ this._requestVideoFrameCallbackTimer = domElement.requestVideoFrameCallback(this._onVideoRefresh.bind(this));
7201
+ this._removeHandler = function() {
7202
+ _this2._requestVideoFrameCallbackTimer && (domElement === null || domElement === void 0 ? void 0 : domElement.cancelVideoFrameCallback(_this2._requestVideoFrameCallbackTimer));
7203
+ };
7204
+ }
7205
+ }
7206
+ }
7207
+ }, {
7208
+ key: "stop",
7209
+ value: function stop() {
7210
+ var _this$_removeHandler;
7211
+ delete this._recentVideoInfo;
7212
+ delete this._domElement;
7213
+ (_this$_removeHandler = this._removeHandler) === null || _this$_removeHandler === void 0 ? void 0 : _this$_removeHandler.call(this);
7214
+ delete this._removeHandler;
7215
+ }
7216
+ }, {
7217
+ key: "getRecentRenderInfo4Report",
7218
+ value: function getRecentRenderInfo4Report() {
7219
+ var _this3 = this;
7220
+ var obj = {};
7221
+ if (this._recentVideoInfo) {
7222
+ Object.keys(this._recentVideoInfo).forEach(function(k) {
7223
+ var _this3$_recentVideoIn;
7224
+ var key = k.replace(/[a-z]{1}[A-Z]{1}/g, function(e) {
7225
+ return "".concat(e[0], "_").concat(e[1].toLowerCase());
7226
+ });
7227
+ obj["video_".concat(key)] = (_this3$_recentVideoIn = _this3._recentVideoInfo) === null || _this3$_recentVideoIn === void 0 ? void 0 : _this3$_recentVideoIn[k];
7228
+ });
7229
+ }
7230
+ return obj;
7231
+ }
7232
+ }]);
7233
+ return VideoFrameRecvCallback2;
7234
+ }();
6770
7235
  var logger = new Logger("rts");
6771
7236
  var Rts = /* @__PURE__ */ function(_EventEmitter) {
6772
7237
  _inherits$1(Rts2, _EventEmitter);
@@ -6775,31 +7240,28 @@
6775
7240
  var _this;
6776
7241
  _classCallCheck$3(this, Rts2);
6777
7242
  _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() {
7243
+ _this._url = "";
7244
+ _this._pc = null;
7245
+ _this._audioTransceicer = null;
7246
+ _this._videoTransceicer = null;
7247
+ _this._mediaStream = null;
7248
+ _this._lastMediaStream = null;
7249
+ _this._loader = null;
7250
+ _this._networkEvaluate = null;
7251
+ _this._retry = 0;
7252
+ _this._player = null;
7253
+ _this._waitingTimer = 0;
7254
+ _this._rctConnectStartTs = 0;
7255
+ _this._isReplacing = false;
7256
+ _this._firstFrameObserver = new FirstFrameObserver(_this._emitFirstFrameState.bind(_assertThisInitialized$1(_this)));
7257
+ _this._audio = null;
7258
+ _this._video = null;
7259
+ _this._preAudioStats = null;
7260
+ _this._preVideoStats = null;
7261
+ _this._rtcReportTimer = null;
7262
+ _this._networkQualityResult = [];
7263
+ _this._videoJitterBufferDelay = 0;
7264
+ _this._checkStatsError = /* @__PURE__ */ _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee2() {
6803
7265
  return _regeneratorRuntime$1().wrap(function _callee2$(_context2) {
6804
7266
  while (1)
6805
7267
  switch (_context2.prev = _context2.next) {
@@ -6840,12 +7302,16 @@
6840
7302
  return _context2.stop();
6841
7303
  }
6842
7304
  }, _callee2);
6843
- })));
6844
- _defineProperty$2(_assertThisInitialized$1(_this), "_onTrack", function(e) {
7305
+ }));
7306
+ _this._onTrack = function(e) {
6845
7307
  logger.log("addTrack: ", e.track, e.streams);
6846
- _this["_".concat(e.track.kind)] = e.track;
6847
- });
6848
- _defineProperty$2(_assertThisInitialized$1(_this), "_mockWaitingByTimeupdate", function() {
7308
+ if (e.track.kind === "audio") {
7309
+ _this._audio = e.track;
7310
+ } else {
7311
+ _this._video = e.track;
7312
+ }
7313
+ };
7314
+ _this._mockWaitingByTimeupdate = function() {
6849
7315
  var _this$_pc, _this$_pc2;
6850
7316
  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
7317
  return;
@@ -6856,8 +7322,8 @@
6856
7322
  return;
6857
7323
  _this.emit("waiting");
6858
7324
  }, _this._opts.stallInterval);
6859
- });
6860
- _defineProperty$2(_assertThisInitialized$1(_this), "_onLoadedData", function() {
7325
+ };
7326
+ _this._onLoadedData = function() {
6861
7327
  logger.log("loadeddata emit");
6862
7328
  _this.getStatsSnapshoot().then(function(snap) {
6863
7329
  _this.emit(EVENT.METADATA_PARSED, {
@@ -6871,19 +7337,15 @@
6871
7337
  meta: snap.audio
6872
7338
  });
6873
7339
  });
6874
- });
6875
- _defineProperty$2(_assertThisInitialized$1(_this), "_setDelay", function(delayHint) {
7340
+ };
7341
+ _this._setDelay = function(delayHint) {
6876
7342
  if (_this._opts.progressiveSetDelay) {
6877
7343
  _this._startSetDelayLoop(delayHint);
6878
7344
  } else {
6879
7345
  var _this$_audioTransceic2;
6880
- var key = [
6881
- "playoutDelayHint",
6882
- "jitterBufferDelayHint",
6883
- "jitterBufferTarget"
6884
- ].find(function(key2) {
7346
+ var key = ["playoutDelayHint", "jitterBufferDelayHint", "jitterBufferTarget"].find(function(key2) {
6885
7347
  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);
7348
+ 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
7349
  });
6888
7350
  if (!key)
6889
7351
  return;
@@ -6893,24 +7355,19 @@
6893
7355
  _this._audioTransceicer.receiver[key] = delayHint;
6894
7356
  _this._videoTransceicer.receiver[key] = delayHint;
6895
7357
  }
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() {
7358
+ };
7359
+ _this._targetDelayHint = null;
7360
+ _this._setDelayError = null;
7361
+ _this._startSetDelayLoop = /* @__PURE__ */ function() {
6901
7362
  var _ref3 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee4(delayHint) {
6902
7363
  var key, preAudioStats, preVideoStats, _this$_opts$adaptiveJ, loopInterval, maxAvSyncDelay, maxJitterBufferDiff, maxStep, avDiffTooMuchCount;
6903
7364
  return _regeneratorRuntime$1().wrap(function _callee4$(_context4) {
6904
7365
  while (1)
6905
7366
  switch (_context4.prev = _context4.next) {
6906
7367
  case 0:
6907
- key = [
6908
- "playoutDelayHint",
6909
- "jitterBufferDelayHint",
6910
- "jitterBufferTarget"
6911
- ].find(function(key2) {
7368
+ key = ["playoutDelayHint", "jitterBufferDelayHint", "jitterBufferTarget"].find(function(key2) {
6912
7369
  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);
7370
+ 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
7371
  });
6915
7372
  if (key) {
6916
7373
  _context4.next = 3;
@@ -6925,13 +7382,14 @@
6925
7382
  }
6926
7383
  return _context4.abrupt("return");
6927
7384
  case 6:
7385
+ logger.log("_startSetDelayLoop()", "invoked, delayHint: ".concat(delayHint));
6928
7386
  _this._targetDelayHint = delayHint;
6929
7387
  if (!_this._setDelayTimer) {
6930
- _context4.next = 9;
7388
+ _context4.next = 10;
6931
7389
  break;
6932
7390
  }
6933
7391
  return _context4.abrupt("return");
6934
- case 9:
7392
+ case 10:
6935
7393
  preAudioStats = null;
6936
7394
  preVideoStats = null;
6937
7395
  _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 +7416,7 @@
6958
7416
  }
6959
7417
  return _context3.abrupt("return");
6960
7418
  case 8:
6961
- targetDelayMs = _this._targetDelayHint * 1e3;
7419
+ targetDelayMs = (_this._targetDelayHint || 0) * 1e3;
6962
7420
  currentTargetDelayMs = currentTargetDelay * 1e3;
6963
7421
  _context3.next = 12;
6964
7422
  return Promise.all([getRecvAudioStats(_this._audioTransceicer.receiver.getStats()), getRecvVideoStats(_this._videoTransceicer.receiver.getStats())]);
@@ -6987,7 +7445,7 @@
6987
7445
  break;
6988
7446
  }
6989
7447
  if (avDiffTooMuchCount++ > 8 && currentVideoDelay > currentAudioDelay) {
6990
- _this._audioTransceicer.receiver[key] = Math.min(currentVideoDelay / 1e3, _this._targetDelayHint);
7448
+ _this._audioTransceicer.receiver[key] = Math.min(currentVideoDelay / 1e3, _this._targetDelayHint || 0);
6991
7449
  avDiffTooMuchCount = 0;
6992
7450
  }
6993
7451
  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 +7480,7 @@
7022
7480
  }
7023
7481
  }, _callee3, null, [[0, 40]]);
7024
7482
  })), loopInterval);
7025
- case 14:
7483
+ case 15:
7026
7484
  case "end":
7027
7485
  return _context4.stop();
7028
7486
  }
@@ -7031,26 +7489,31 @@
7031
7489
  return function(_x) {
7032
7490
  return _ref3.apply(this, arguments);
7033
7491
  };
7034
- }());
7035
- _defineProperty$2(_assertThisInitialized$1(_this), "_getDelay", function() {
7492
+ }();
7493
+ _this._getDelay = function() {
7036
7494
  try {
7495
+ var _this$_audioTransceic6;
7037
7496
  var key = ["playoutDelayHint", "jitterBufferDelayHint", "jitterBufferTarget"].find(function(key2) {
7038
- return key2 in _this._videoTransceicer.receiver && key2 in _this._audioTransceicer.receiver;
7497
+ var _this$_videoTransceic4, _this$_audioTransceic5;
7498
+ 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
7499
  });
7040
- return _this._audioTransceicer.receiver[key];
7500
+ if (!key)
7501
+ return;
7502
+ return (_this$_audioTransceic6 = _this._audioTransceicer) === null || _this$_audioTransceic6 === void 0 ? void 0 : _this$_audioTransceic6.receiver[key];
7041
7503
  } catch (error) {
7042
7504
  logger.error("get delay error");
7043
7505
  }
7044
- });
7045
- _defineProperty$2(_assertThisInitialized$1(_this), "_onLoaderRetry", function(error, retryTime) {
7506
+ };
7507
+ _this._onLoaderRetry = function(error, retryTime) {
7508
+ console.log(error, "retryTime", retryTime);
7046
7509
  _this.emit(EVENT.LOAD_RETRY, {
7047
7510
  error: StreamingError.network(error),
7048
7511
  retryTime
7049
7512
  });
7050
- });
7513
+ };
7051
7514
  _this._opts = getOption(opts);
7052
7515
  _this._media = _this._opts.media;
7053
- _this._player = _this._opts.player;
7516
+ _this._player = _this._opts.player || null;
7054
7517
  _this._loader = new NetLoader(_objectSpread2$2(_objectSpread2$2({}, opts.fetchOptions), {}, {
7055
7518
  responseType: "json",
7056
7519
  method: "POST",
@@ -7060,9 +7523,12 @@
7060
7523
  onRetryError: _this._onLoaderRetry,
7061
7524
  logger
7062
7525
  }));
7063
- _this._retry = _this._opts.retryCount;
7526
+ _this._retry = _this._opts.retryCount || 0;
7527
+ _this._preloadPromise = _this._opts.preloadPromise;
7064
7528
  _this._bindMediaEvent();
7529
+ logger.log("constructor()", opts);
7065
7530
  _this._changeVolumeInHarmonyWorkaround();
7531
+ _this._mutedBeforePlayingWorkaround();
7066
7532
  if (_this._opts.mediaStream && _this._opts.seamlesslyReload) {
7067
7533
  _this._lastMediaStream = _this._opts.mediaStream;
7068
7534
  }
@@ -7083,6 +7549,11 @@
7083
7549
  get: function get() {
7084
7550
  return this._video;
7085
7551
  }
7552
+ }, {
7553
+ key: "getJitterBufferDelay",
7554
+ value: function getJitterBufferDelay() {
7555
+ return this._videoJitterBufferDelay;
7556
+ }
7086
7557
  }, {
7087
7558
  key: "loader",
7088
7559
  get: function get() {
@@ -7096,9 +7567,24 @@
7096
7567
  }
7097
7568
  }, {
7098
7569
  key: "getStats",
7099
- value: function getStats$1() {
7100
- return getStats(this._pc);
7101
- }
7570
+ value: function() {
7571
+ var _getStats22 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee5() {
7572
+ return _regeneratorRuntime$1().wrap(function _callee5$(_context5) {
7573
+ while (1)
7574
+ switch (_context5.prev = _context5.next) {
7575
+ case 0:
7576
+ return _context5.abrupt("return", getStats(this._pc));
7577
+ case 1:
7578
+ case "end":
7579
+ return _context5.stop();
7580
+ }
7581
+ }, _callee5, this);
7582
+ }));
7583
+ function getStats$1() {
7584
+ return _getStats22.apply(this, arguments);
7585
+ }
7586
+ return getStats$1;
7587
+ }()
7102
7588
  }, {
7103
7589
  key: "getStatsSnapshoot",
7104
7590
  value: function getStatsSnapshoot$1() {
@@ -7109,51 +7595,105 @@
7109
7595
  }, {
7110
7596
  key: "load",
7111
7597
  value: function() {
7112
- var _load = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee5(url) {
7598
+ var _load = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee6(url, failureReason) {
7113
7599
  var _this2 = this;
7114
- var encodedTransformSupported, lastPc;
7115
- return _regeneratorRuntime$1().wrap(function _callee5$(_context5) {
7600
+ var lastPc, answerSdp, errorStr, preloadPromise, info, encodedTransformSupported;
7601
+ return _regeneratorRuntime$1().wrap(function _callee6$(_context6) {
7116
7602
  while (1)
7117
- switch (_context5.prev = _context5.next) {
7603
+ switch (_context6.prev = _context6.next) {
7118
7604
  case 0:
7119
- this._disconnect();
7605
+ logger.log("load()", 'invoked, url: "'.concat(url, '"'));
7606
+ this._disconnect(failureReason || "invoke load");
7120
7607
  this._url = url;
7121
- this._retry = this._opts.retryCount;
7608
+ lastPc = this._pc;
7122
7609
  if (!this._opts.hackCreateOfferIssue) {
7123
- _context5.next = 6;
7610
+ _context6.next = 7;
7124
7611
  break;
7125
7612
  }
7126
- _context5.next = 6;
7613
+ _context6.next = 7;
7127
7614
  return this._createEmptyPeer();
7128
- case 6:
7129
- encodedTransformSupported = isLegacyEncodedTransformSupported();
7130
- _context5.prev = 7;
7131
- lastPc = this._pc;
7132
- if (lastPc) {
7133
- lastPc.close();
7615
+ case 7:
7616
+ _context6.prev = 7;
7617
+ this._firstFrameObserver.start();
7618
+ if (!this._preloadPromise) {
7619
+ _context6.next = 38;
7620
+ break;
7621
+ }
7622
+ logger.log("load()", "in preload process...");
7623
+ _context6.prev = 11;
7624
+ this._firstFrameObserver.setIsPreload(true);
7625
+ if (compareURL(this._url, this._preloadPromise.url, ["tabr_start_bitrate"])) {
7626
+ _context6.next = 17;
7627
+ break;
7628
+ }
7629
+ errorStr = "preload url not match, current url: ".concat(this._url, ", preload url: ").concat(this._preloadPromise.url);
7630
+ delete this._preloadPromise;
7631
+ throw new Error(errorStr);
7632
+ case 17:
7633
+ preloadPromise = this._preloadPromise.promise;
7634
+ delete this._preloadPromise;
7635
+ _context6.next = 21;
7636
+ return preloadPromise;
7637
+ case 21:
7638
+ info = _context6.sent;
7639
+ if (!(info.pc.signalingState !== "have-local-offer")) {
7640
+ _context6.next = 24;
7641
+ break;
7642
+ }
7643
+ throw new Error('pc.signalingState not equal "have-local-offer", current state is '.concat(info.pc.signalingState));
7644
+ case 24:
7645
+ this._pc = info.pc;
7646
+ answerSdp = info.answerSdp;
7647
+ this._videoTransceicer = info.videoTransceiver;
7648
+ this._audioTransceicer = info.audioTransceiver;
7649
+ if (this._opts.enableSei) {
7650
+ this.initVideoEncodedTransform();
7651
+ this.initAudioEncodedTransform();
7134
7652
  }
7653
+ _context6.next = 36;
7654
+ break;
7655
+ case 31:
7656
+ _context6.prev = 31;
7657
+ _context6.t0 = _context6["catch"](11);
7658
+ logger.warn("load()", "preload failed, ".concat(_context6.t0.message || _context6.t0.toString()));
7659
+ this.load(url, _context6.t0.message || _context6.t0.toString());
7660
+ return _context6.abrupt("return");
7661
+ case 36:
7662
+ _context6.next = 44;
7663
+ break;
7664
+ case 38:
7665
+ encodedTransformSupported = isLegacyEncodedTransformSupported();
7666
+ logger.log("load()", "isLegacyEncodedTransformSupported: ".concat(encodedTransformSupported));
7135
7667
  this._pc = new RTCPeerConnection({
7136
7668
  encodedInsertableStreams: encodedTransformSupported && this._opts.enableSei ? true : void 0
7137
7669
  });
7138
- this._bindRTCEvents();
7139
- _context5.next = 14;
7140
- return this._connect(url);
7141
- case 14:
7142
- _context5.next = 19;
7670
+ _context6.next = 43;
7671
+ return this._getAnswerSdp(this._pc);
7672
+ case 43:
7673
+ answerSdp = _context6.sent;
7674
+ case 44:
7675
+ this._bindRTCEvents(this._pc);
7676
+ _context6.next = 47;
7677
+ return this._handleAnswerSdp(this._pc, answerSdp);
7678
+ case 47:
7679
+ if (lastPc) {
7680
+ lastPc.close();
7681
+ }
7682
+ _context6.next = 53;
7143
7683
  break;
7144
- case 16:
7145
- _context5.prev = 16;
7146
- _context5.t0 = _context5["catch"](7);
7684
+ case 50:
7685
+ _context6.prev = 50;
7686
+ _context6.t1 = _context6["catch"](7);
7147
7687
  setTimeout(function() {
7148
- return _this2._emitError(StreamingError.create(ERR.OTHER, null, _context5.t0));
7688
+ return _this2._emitError(StreamingError.create(ERR.OTHER, null, _context6.t1));
7149
7689
  });
7150
- case 19:
7690
+ case 53:
7151
7691
  case "end":
7152
- return _context5.stop();
7692
+ return _context6.stop();
7153
7693
  }
7154
- }, _callee5, this, [[7, 16]]);
7694
+ }, _callee6, this, [[7, 50], [11, 31]]);
7155
7695
  }));
7156
- function load(_x2) {
7696
+ function load(_x2, _x3) {
7157
7697
  return _load.apply(this, arguments);
7158
7698
  }
7159
7699
  return load;
@@ -7161,13 +7701,13 @@
7161
7701
  }, {
7162
7702
  key: "switchURL",
7163
7703
  value: function switchURL(url) {
7164
- this.load(url || this._url);
7704
+ logger.log("switchURL()", 'invoked, url: "'.concat(url, '"'));
7705
+ this.load(url || this._url, "invoke switchURL");
7165
7706
  }
7166
7707
  }, {
7167
7708
  key: "_bindRTCEvents",
7168
- value: function _bindRTCEvents() {
7709
+ value: function _bindRTCEvents(pc) {
7169
7710
  var _this3 = this;
7170
- var pc = this._pc;
7171
7711
  pc.addEventListener("track", this._onTrack);
7172
7712
  pc.addEventListener("connectionstatechange", function() {
7173
7713
  logger.warn("onconnectionstatechange:", pc.connectionState);
@@ -7186,7 +7726,7 @@
7186
7726
  return;
7187
7727
  }
7188
7728
  _this3._retry--;
7189
- _this3.load(_this3._url);
7729
+ _this3.load(_this3._url, "rtc connect failed");
7190
7730
  }
7191
7731
  if (pc.connectionState === "connected") {
7192
7732
  _this3._handleMediaStream();
@@ -7205,7 +7745,7 @@
7205
7745
  value: function _handleMediaStream() {
7206
7746
  var _this4 = this;
7207
7747
  if (this._lastMediaStream) {
7208
- var _this$_player$play;
7748
+ var _this$_player2, _this$_player3, _this$_player3$play;
7209
7749
  var videoTrack = this._lastMediaStream.getVideoTracks()[0];
7210
7750
  var audioTrack = this._lastMediaStream.getAudioTracks()[0];
7211
7751
  if (videoTrack) {
@@ -7218,20 +7758,15 @@
7218
7758
  this._audio && this._mediaStream.addTrack(this._audio);
7219
7759
  this._video && this._mediaStream.addTrack(this._video);
7220
7760
  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() {
7761
+ (_this$_player2 = this._player) === null || _this$_player2 === void 0 ? void 0 : _this$_player2.pause();
7762
+ (_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
7763
  _this4._isReplacing = false;
7224
7764
  });
7225
7765
  } else {
7226
7766
  this._mediaStream = new MediaStream();
7227
7767
  this._audio && this._mediaStream.addTrack(this._audio);
7228
7768
  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
- }
7769
+ this._media && (this._media.srcObject = this._mediaStream);
7235
7770
  }
7236
7771
  }
7237
7772
  }, {
@@ -7285,21 +7820,22 @@
7285
7820
  }, {
7286
7821
  key: "_bindMediaEvent",
7287
7822
  value: function _bindMediaEvent() {
7288
- this._media.addEventListener("timeupdate", this._mockWaitingByTimeupdate);
7289
- this._media.addEventListener("loadeddata", this._onLoadedData);
7823
+ var _this$_media, _this$_media2;
7824
+ (_this$_media = this._media) === null || _this$_media === void 0 ? void 0 : _this$_media.addEventListener("timeupdate", this._mockWaitingByTimeupdate);
7825
+ (_this$_media2 = this._media) === null || _this$_media2 === void 0 ? void 0 : _this$_media2.addEventListener("loadeddata", this._onLoadedData);
7290
7826
  }
7291
7827
  }, {
7292
- key: "_connect",
7828
+ key: "_getAnswerSdp",
7293
7829
  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) {
7830
+ var _getAnswerSdp2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee7(pc) {
7831
+ var offer, answerSdp, parsed, finnalUrl, _this$_opts, _this$_loader, _this$_opts2, _parsed$media, parseSession, sessionId, reqStart, res, answer, err;
7832
+ return _regeneratorRuntime$1().wrap(function _callee7$(_context7) {
7297
7833
  while (1)
7298
- switch (_context6.prev = _context6.next) {
7834
+ switch (_context7.prev = _context7.next) {
7299
7835
  case 0:
7300
- pc = this._pc;
7836
+ logger.log("_getAnswerSdp()");
7301
7837
  if (!pc.addTransceiver) {
7302
- _context6.next = 11;
7838
+ _context7.next = 11;
7303
7839
  break;
7304
7840
  }
7305
7841
  this._audioTransceicer = pc.addTransceiver("audio", {
@@ -7308,32 +7844,37 @@
7308
7844
  this._videoTransceicer = pc.addTransceiver("video", {
7309
7845
  direction: "recvonly"
7310
7846
  });
7311
- this._setDelay(this._opts.delayHint);
7847
+ this._setDelay(this._opts.delayHint || null);
7312
7848
  if (this._opts.enableSei) {
7313
7849
  this.initVideoEncodedTransform();
7314
7850
  this.initAudioEncodedTransform();
7315
7851
  }
7316
- _context6.next = 8;
7852
+ _context7.next = 8;
7317
7853
  return pc.createOffer();
7318
7854
  case 8:
7319
- offer = _context6.sent;
7320
- _context6.next = 14;
7855
+ offer = _context7.sent;
7856
+ _context7.next = 14;
7321
7857
  break;
7322
7858
  case 11:
7323
- _context6.next = 13;
7859
+ _context7.next = 13;
7324
7860
  return pc.createOffer({
7325
7861
  iceRestart: true,
7326
7862
  offerToReceiveAudio: true,
7327
7863
  offerToReceiveVideo: true
7328
7864
  });
7329
7865
  case 13:
7330
- offer = _context6.sent;
7866
+ offer = _context7.sent;
7331
7867
  case 14:
7332
7868
  if (this._opts.hackCreateOfferIssue) {
7333
7869
  this._createEmptyPeer();
7334
7870
  }
7335
- logger.log("local offer");
7336
- logger.log(offer.sdp);
7871
+ logger.log("local offer", offer);
7872
+ if (offer.sdp) {
7873
+ _context7.next = 18;
7874
+ break;
7875
+ }
7876
+ throw new Error("create offer failed");
7877
+ case 18:
7337
7878
  parsed = lib.parse(offer.sdp);
7338
7879
  parsed.media.filter(function(x) {
7339
7880
  return x.type === "audio";
@@ -7354,62 +7895,71 @@
7354
7895
  type: "nack"
7355
7896
  });
7356
7897
  });
7898
+ parsed.media.filter(function(x) {
7899
+ return x.type === "video";
7900
+ }).forEach(function(x) {
7901
+ x.fmtp.forEach(function(x2) {
7902
+ if (x2.config.indexOf("profile-level-id") !== -1) {
7903
+ x2.config = "".concat(x2.config, ";sps-pps-idr-in-keyframe=1");
7904
+ }
7905
+ });
7906
+ });
7357
7907
  offer.sdp = lib.write(parsed);
7358
- logger.log("local offer modified:\n", offer.sdp);
7359
- _context6.next = 23;
7908
+ logger.log("local offer modified:\n", offer);
7909
+ _context7.next = 25;
7360
7910
  return pc.setLocalDescription(offer);
7361
- case 23:
7911
+ case 25:
7362
7912
  finnalUrl = this._url;
7363
- _context6.prev = 24;
7913
+ _context7.prev = 26;
7364
7914
  if (this._opts.preProcessUrl) {
7365
7915
  finnalUrl = this._opts.preProcessUrl(finnalUrl).url;
7366
7916
  }
7367
- this._loader.finnalUrl = finnalUrl;
7917
+ finnalUrl = addUrlParams(finnalUrl, this._opts.urlParams);
7918
+ this._loader && (this._loader.finnalUrl = finnalUrl);
7368
7919
  parseSession = /_?session_id=([^&$]+)/.exec(finnalUrl);
7369
7920
  sessionId = parseSession ? parseSession[1] : Date.now() + "666";
7921
+ this._firstFrameObserver.changeFirstFrameState(RTC_FIRST_FRAME_STATE.OFFER_SDP_READY);
7370
7922
  this.emit(EVENT.LOAD_START, {
7371
7923
  url: finnalUrl,
7372
7924
  offersdp: (_this$_opts = this._opts) !== null && _this$_opts !== void 0 && _this$_opts.enableOriginSdpLogger ? offer.sdp : void 0,
7373
7925
  sessionId
7374
7926
  });
7375
7927
  reqStart = Date.now();
7376
- _context6.next = 33;
7377
- return this._loader.load(finnalUrl, {
7928
+ _context7.next = 37;
7929
+ return (_this$_loader = this._loader) === null || _this$_loader === void 0 ? void 0 : _this$_loader.load(finnalUrl, {
7378
7930
  body: JSON.stringify({
7379
7931
  sessionId,
7380
7932
  version: "1.0-html",
7381
7933
  localSdp: offer
7382
7934
  })
7383
7935
  });
7384
- case 33:
7385
- res = _context6.sent;
7936
+ case 37:
7937
+ res = _context7.sent;
7386
7938
  this.emit(EVENT.LOAD_RESPONSE_HEADERS, {
7387
7939
  headers: res.response.headers
7388
7940
  });
7389
7941
  answer = res === null || res === void 0 ? void 0 : res.data;
7390
7942
  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;
7943
+ _context7.next = 45;
7392
7944
  break;
7393
7945
  }
7394
7946
  err = StreamingError.create(answer.code === 404 ? ERR.NETWORK_NOTFOUND : ERR.NETWORK_FORBIDDEN, null, answer);
7395
7947
  err.errorType = ERR.NETWORK;
7396
7948
  this._emitError(err);
7397
- return _context6.abrupt("return");
7398
- case 41:
7949
+ return _context7.abrupt("return");
7950
+ case 45:
7399
7951
  if (!((answer === null || answer === void 0 ? void 0 : answer.code) !== 200)) {
7400
- _context6.next = 43;
7952
+ _context7.next = 47;
7401
7953
  break;
7402
7954
  }
7403
7955
  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);
7956
+ case 47:
7957
+ answerSdp = res.data.remoteSdp.sdp;
7408
7958
  this.emit(EVENT.LOAD_COMPLETE, {
7409
7959
  url: finnalUrl,
7410
7960
  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) {
7961
+ answersdp: (_this$_opts2 = this._opts) !== null && _this$_opts2 !== void 0 && _this$_opts2.enableOriginSdpLogger ? answerSdp : void 0,
7962
+ 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
7963
  return {
7414
7964
  candidates: media.candidates,
7415
7965
  rtp: media.rtp,
@@ -7417,9 +7967,50 @@
7417
7967
  };
7418
7968
  })
7419
7969
  });
7420
- _parsed.media.forEach(function(x) {
7970
+ _context7.next = 54;
7971
+ break;
7972
+ case 51:
7973
+ _context7.prev = 51;
7974
+ _context7.t0 = _context7["catch"](26);
7975
+ this._emitError(StreamingError.network(_context7.t0));
7976
+ case 54:
7977
+ return _context7.abrupt("return", answerSdp);
7978
+ case 55:
7979
+ case "end":
7980
+ return _context7.stop();
7981
+ }
7982
+ }, _callee7, this, [[26, 51]]);
7983
+ }));
7984
+ function _getAnswerSdp(_x4) {
7985
+ return _getAnswerSdp2.apply(this, arguments);
7986
+ }
7987
+ return _getAnswerSdp;
7988
+ }()
7989
+ }, {
7990
+ key: "_handleAnswerSdp",
7991
+ value: function() {
7992
+ var _handleAnswerSdp2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee8(pc, answerSdp) {
7993
+ var parsed, answer;
7994
+ return _regeneratorRuntime$1().wrap(function _callee8$(_context8) {
7995
+ while (1)
7996
+ switch (_context8.prev = _context8.next) {
7997
+ case 0:
7998
+ logger.log("_handleAnswerSdp()", "invoked, answerSdp:", {
7999
+ answerSdp
8000
+ });
8001
+ if (answerSdp) {
8002
+ _context8.next = 3;
8003
+ break;
8004
+ }
8005
+ return _context8.abrupt("return");
8006
+ case 3:
8007
+ this._firstFrameObserver.changeFirstFrameState(RTC_FIRST_FRAME_STATE.ANSWER_SDP_RECV);
8008
+ parsed = lib.parse(answerSdp);
8009
+ parsed.media.forEach(function(x) {
7421
8010
  var _x$ssrcs, _x$ssrcs$find;
7422
- x.fingerprint.hash = x.fingerprint.hash.toUpperCase();
8011
+ if (x.fingerprint) {
8012
+ x.fingerprint.hash = x.fingerprint.hash.toUpperCase();
8013
+ }
7423
8014
  var msid = (_x$ssrcs = x.ssrcs) === null || _x$ssrcs === void 0 ? void 0 : (_x$ssrcs$find = _x$ssrcs.find(function(s) {
7424
8015
  return s.attribute === "msid";
7425
8016
  })) === null || _x$ssrcs$find === void 0 ? void 0 : _x$ssrcs$find.value;
@@ -7427,42 +8018,43 @@
7427
8018
  x.msid = msid;
7428
8019
  }
7429
8020
  });
7430
- answer.remoteSdp.sdp = lib.write(_parsed);
7431
- logger.log("answer modified:\n", answer.remoteSdp.sdp);
8021
+ answer = lib.write(parsed);
8022
+ logger.log("answer modified:\n", {
8023
+ answer
8024
+ });
7432
8025
  this._rctConnectStartTs = Date.now();
7433
8026
  if (!(pc.signalingState === "closed")) {
7434
- _context6.next = 53;
8027
+ _context8.next = 11;
7435
8028
  break;
7436
8029
  }
7437
- return _context6.abrupt("return");
7438
- case 53:
7439
- _context6.next = 55;
7440
- return pc.setRemoteDescription(answer.remoteSdp);
7441
- case 55:
8030
+ return _context8.abrupt("return");
8031
+ case 11:
8032
+ _context8.next = 13;
8033
+ return pc.setRemoteDescription({
8034
+ type: "answer",
8035
+ sdp: answer
8036
+ });
8037
+ case 13:
8038
+ this._firstFrameObserver.changeFirstFrameState(RTC_FIRST_FRAME_STATE.ANSWER_SDP_READY);
7442
8039
  this._networkEvaluate = new NetworkEvaluate(pc, this._opts.networkEvaluateInterval);
7443
8040
  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:
8041
+ this._firstFrameObserver.bindEvents(pc, this._videoTransceicer, this._media);
8042
+ case 17:
7451
8043
  case "end":
7452
- return _context6.stop();
8044
+ return _context8.stop();
7453
8045
  }
7454
- }, _callee6, this, [[24, 59]]);
8046
+ }, _callee8, this);
7455
8047
  }));
7456
- function _connect() {
7457
- return _connect2.apply(this, arguments);
8048
+ function _handleAnswerSdp(_x5, _x6) {
8049
+ return _handleAnswerSdp2.apply(this, arguments);
7458
8050
  }
7459
- return _connect;
8051
+ return _handleAnswerSdp;
7460
8052
  }()
7461
8053
  }, {
7462
8054
  key: "_listenPeerStateTimeout",
7463
8055
  value: function _listenPeerStateTimeout() {
7464
8056
  var _this6 = this;
7465
- this._peerStateTimer && this._clearPeerStateTimeout();
8057
+ this._clearPeerStateTimeout();
7466
8058
  if (this._opts.connectionStateChangeTimeout) {
7467
8059
  this._peerStateTimer = setTimeout(function() {
7468
8060
  _this6._emitError(StreamingError.create(ERR.MEDIA, ERR.SUB_TYPES.MEDIA_ERR_SRC_NOT_SUPPORTED, {
@@ -7474,128 +8066,162 @@
7474
8066
  }, {
7475
8067
  key: "_clearPeerStateTimeout",
7476
8068
  value: function _clearPeerStateTimeout() {
7477
- clearTimeout(this._peerStateTimer);
7478
- this._peerStateTimer = null;
8069
+ if (this._peerStateTimer) {
8070
+ clearTimeout(this._peerStateTimer);
8071
+ delete this._peerStateTimer;
8072
+ }
7479
8073
  }
7480
8074
  }, {
7481
8075
  key: "_startRtcReport",
7482
8076
  value: function _startRtcReport() {
7483
8077
  var _this7 = this;
7484
8078
  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);
8079
+ var report = /* @__PURE__ */ function() {
8080
+ var _ref5 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee9() {
8081
+ var _this7$_audioTranscei, _this7$_videoTranscei;
8082
+ var _this7$_frameRecvCall, _yield$Promise$all3, _yield$Promise$all4, curAudioStats, curVideoStats, _this7$_audioStallObs, _this7$_videoStallObs, _this7$_networkQualit, _this7$_networkQualit2, _this7$_media, _this7$_media2, _this7$_media3, _this7$_media4, _this7$_media5, _this7$_media6, _this7$_frameRecvCall2, audioStats, videoStats, audioStallInfo, videoStallInfo, _ref6, _ref7, quality, qualityInfo, av_sync_diff;
8083
+ return _regeneratorRuntime$1().wrap(function _callee9$(_context9) {
8084
+ while (1)
8085
+ switch (_context9.prev = _context9.next) {
8086
+ case 0:
8087
+ 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))) {
8088
+ _context9.next = 4;
8089
+ break;
8090
+ }
8091
+ _this7._preAudioStats = null;
8092
+ _this7._preVideoStats = null;
8093
+ return _context9.abrupt("return");
8094
+ case 4:
8095
+ if (!_this7._audioStallObserver && _this7._audioTransceicer) {
8096
+ _this7._audioStallObserver = new AudioStallObserver();
8097
+ _this7._audioStallObserver.start(_this7._audioTransceicer);
8098
+ }
8099
+ if (!_this7._videoStallObserver && _this7._video && _this7._media) {
8100
+ _this7._videoStallObserver = new VideoStallObserver();
8101
+ _this7._videoStallObserver.start(_this7._media);
8102
+ }
8103
+ if (!_this7._frameRecvCallback && _this7._media) {
8104
+ _this7._frameRecvCallback = new VideoFrameRecvCallback();
8105
+ (_this7$_frameRecvCall = _this7._frameRecvCallback) === null || _this7$_frameRecvCall === void 0 ? void 0 : _this7$_frameRecvCall.start(_this7._media);
8106
+ }
8107
+ if (_this7._pc && !_this7._networkQuality && _this7._opts.enableNetworkQuality && _this7._opts.networkQuality) {
8108
+ _this7._networkQuality = new NetworkQuality(_this7._pc, _this7._opts.networkQuality);
8109
+ }
8110
+ _context9.next = 10;
8111
+ return Promise.all([getRecvAudioStats(_this7._audioTransceicer.receiver.getStats()), getRecvVideoStats(_this7._videoTransceicer.receiver.getStats())]);
8112
+ case 10:
8113
+ _yield$Promise$all3 = _context9.sent;
8114
+ _yield$Promise$all4 = _slicedToArray(_yield$Promise$all3, 2);
8115
+ curAudioStats = _yield$Promise$all4[0];
8116
+ curVideoStats = _yield$Promise$all4[1];
8117
+ if (!(_this7._preAudioStats && _this7._preVideoStats)) {
8118
+ _context9.next = 28;
8119
+ break;
8120
+ }
8121
+ audioStats = diffRecvAudioStats(_this7._preAudioStats, curAudioStats);
8122
+ videoStats = diffRecvVideoStats(_this7._preVideoStats, curVideoStats);
8123
+ _this7._videoJitterBufferDelay = videoStats.jitterBufferDelay;
8124
+ _context9.next = 20;
8125
+ return (_this7$_audioStallObs = _this7._audioStallObserver) === null || _this7$_audioStallObs === void 0 ? void 0 : _this7$_audioStallObs.getAudioStallInfo();
8126
+ case 20:
8127
+ audioStallInfo = _context9.sent;
8128
+ _context9.next = 23;
8129
+ return (_this7$_videoStallObs = _this7._videoStallObserver) === null || _this7$_videoStallObs === void 0 ? void 0 : _this7$_videoStallObs.getStallInfo({
8130
+ interval: videoStats.statsInterval,
8131
+ frameRateReceived: videoStats.receivedFrameRate,
8132
+ frameRateDecoded: videoStats.decoderOutputFrameRate,
8133
+ bitrate: videoStats.receivedKBitrate
8134
+ });
8135
+ case 23:
8136
+ videoStallInfo = _context9.sent;
8137
+ _ref6 = (_this7$_networkQualit = (_this7$_networkQualit2 = _this7._networkQuality) === null || _this7$_networkQualit2 === void 0 ? void 0 : _this7$_networkQualit2.getDownlinkQuality(_objectSpread2$2(_objectSpread2$2({}, audioStats), {}, {
8138
+ stallDuration: (audioStallInfo === null || audioStallInfo === void 0 ? void 0 : audioStallInfo.stallDuration) || 0
8139
+ }), _objectSpread2$2(_objectSpread2$2({}, videoStats), {}, {
8140
+ stallDuration: (videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallDuration100ms) || (videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallDuration500ms) || 0
8141
+ }))) !== null && _this7$_networkQualit !== void 0 ? _this7$_networkQualit : [], _ref7 = _slicedToArray(_ref6, 2), quality = _ref7[0], qualityInfo = _ref7[1];
8142
+ if (_this7._opts.enableAdaptiveJitterBuffer) {
8143
+ _this7._handleJitterBuffer(qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.qualityQos, _this7._opts.adaptiveJitterBuffer, _this7._opts.networkStrategy);
8144
+ }
8145
+ if (videoStats.estimatedPlayoutTimestamp && audioStats.estimatedPlayoutTimestamp) {
8146
+ av_sync_diff = videoStats.estimatedPlayoutTimestamp - audioStats.estimatedPlayoutTimestamp;
8147
+ }
8148
+ _this7.emit(EXTEND_EVENTS.RTC_NETWORK, _objectSpread2$2({
8149
+ interval: videoStats.statsInterval,
8150
+ network_quality: quality,
8151
+ audio_stall_duration: audioStallInfo === null || audioStallInfo === void 0 ? void 0 : audioStallInfo.stallDuration,
8152
+ audio_stall_count: audioStallInfo === null || audioStallInfo === void 0 ? void 0 : audioStallInfo.stallCount,
8153
+ audio_stall_time_per_100sec: ((audioStallInfo === null || audioStallInfo === void 0 ? void 0 : audioStallInfo.stallDuration) || 0) / audioStats.statsInterval * 100,
8154
+ audio_stall_count_per_100sec: ((audioStallInfo === null || audioStallInfo === void 0 ? void 0 : audioStallInfo.stallCount) || 0) / audioStats.statsInterval * 100 * 1e3,
8155
+ video_stall_duration: videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallDuration500ms,
8156
+ video_stall_count: videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallCount500ms,
8157
+ video_stall_duration_100ms: videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallDuration100ms,
8158
+ video_stall_count_100ms: videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallCount100ms,
8159
+ video_stall_time_per_100sec: ((videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallDuration500ms) || 0) / videoStats.statsInterval * 100,
8160
+ video_stall_count_per_100sec: ((videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallCount500ms) || 0) / videoStats.statsInterval * 100 * 1e3,
8161
+ rtt: videoStats.rtt,
8162
+ video_jb_delay: videoStats.jitterBufferDelay,
8163
+ audio_jb_delay: audioStats.jitterBufferDelay,
8164
+ audio_lost_rate: audioStats.audioLossRate,
8165
+ video_lost_rate: videoStats.videoLossRate,
8166
+ video_retransmitted_rate: videoStats.retransmittedRate,
8167
+ quality_audio_level: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.audioLevel,
8168
+ quality_video_level: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.videoLevel,
8169
+ quality_audio_qos: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.audioQos,
8170
+ quality_video_qos: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.videoQos,
8171
+ quality_qos: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.qualityQos,
8172
+ quality_audio_qoe: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.audioQoe,
8173
+ quality_video_qoe: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.videoQoe,
8174
+ current_delay: _this7._getDelay(),
8175
+ visibility_state: document.visibilityState,
8176
+ target_delay: _this7._targetDelayHint,
8177
+ av_sync_diff,
8178
+ set_delay_error: _this7._setDelayError || null,
8179
+ video_width: ((_this7$_media = _this7._media) === null || _this7$_media === void 0 ? void 0 : _this7$_media.videoWidth) || 0,
8180
+ video_height: ((_this7$_media2 = _this7._media) === null || _this7$_media2 === void 0 ? void 0 : _this7$_media2.videoHeight) || 0,
8181
+ abr_state: videoStats.abrState || "none",
8182
+ recv_frame_rate: videoStats.receivedFrameRate,
8183
+ decode_frame_rate: videoStats.decoderOutputFrameRate,
8184
+ pli: videoStats.pliCount,
8185
+ drop_frame_rate: videoStats.framesDropped,
8186
+ audio_packets_received: audioStats.packetsReceived,
8187
+ video_packets_received: videoStats.packetsReceived,
8188
+ video_muted: (_this7$_media3 = _this7._media) === null || _this7$_media3 === void 0 ? void 0 : _this7$_media3.muted,
8189
+ video_paused: (_this7$_media4 = _this7._media) === null || _this7$_media4 === void 0 ? void 0 : _this7$_media4.paused,
8190
+ video_volume: (_this7$_media5 = _this7._media) === null || _this7$_media5 === void 0 ? void 0 : _this7$_media5.volume,
8191
+ video_current_time: (_this7$_media6 = _this7._media) === null || _this7$_media6 === void 0 ? void 0 : _this7$_media6.currentTime
8192
+ }, ((_this7$_frameRecvCall2 = _this7._frameRecvCallback) === null || _this7$_frameRecvCall2 === void 0 ? void 0 : _this7$_frameRecvCall2.getRecentRenderInfo4Report()) || {}));
8193
+ case 28:
8194
+ _this7._preAudioStats = curAudioStats;
8195
+ _this7._preVideoStats = curVideoStats;
8196
+ _this7._setDelayError = null;
8197
+ case 31:
8198
+ case "end":
8199
+ return _context9.stop();
8200
+ }
8201
+ }, _callee9);
8202
+ }));
8203
+ return function report2() {
8204
+ return _ref5.apply(this, arguments);
8205
+ };
8206
+ }();
8207
+ this._rtcReportTimer = setInterval(function() {
8208
+ return report();
8209
+ }, 2e3);
8210
+ report();
7590
8211
  }
7591
8212
  }, {
7592
8213
  key: "_handleJitterBuffer",
7593
8214
  value: function _handleJitterBuffer(quality, adaptiveJitterBuffer, networkStrategy) {
8215
+ if (!adaptiveJitterBuffer || !networkStrategy) {
8216
+ return;
8217
+ }
7594
8218
  this._networkQualityResult.push(quality);
7595
8219
  if (this._networkQualityResult.length > adaptiveJitterBuffer.networkWindow) {
7596
8220
  this._networkQualityResult.shift();
7597
8221
  }
7598
- var validNetworkQualityResult = this._networkQualityResult.filter(Boolean);
8222
+ var validNetworkQualityResult = this._networkQualityResult.filter(function(v) {
8223
+ return typeof v === "number";
8224
+ });
7599
8225
  if (validNetworkQualityResult.length === adaptiveJitterBuffer.networkWindow) {
7600
8226
  var _networkStrategy$aver;
7601
8227
  var averageQuality;
@@ -7619,13 +8245,15 @@
7619
8245
  }, {
7620
8246
  key: "_stopRtcReport",
7621
8247
  value: function _stopRtcReport() {
7622
- var _this$_audioStallObse, _this$_videoStallObse, _this$_networkQuality;
8248
+ var _this$_audioStallObse, _this$_videoStallObse, _this$_frameRecvCallb, _this$_networkQuality;
7623
8249
  (_this$_audioStallObse = this._audioStallObserver) === null || _this$_audioStallObse === void 0 ? void 0 : _this$_audioStallObse.destroy();
7624
8250
  (_this$_videoStallObse = this._videoStallObserver) === null || _this$_videoStallObse === void 0 ? void 0 : _this$_videoStallObse.destroy();
8251
+ (_this$_frameRecvCallb = this._frameRecvCallback) === null || _this$_frameRecvCallb === void 0 ? void 0 : _this$_frameRecvCallb.stop();
8252
+ delete this._frameRecvCallback;
7625
8253
  (_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;
8254
+ delete this._audioStallObserver;
8255
+ delete this._videoStallObserver;
8256
+ delete this._networkQuality;
7629
8257
  this._preAudioStats = null;
7630
8258
  this._preVideoStats = null;
7631
8259
  if (this._rtcReportTimer) {
@@ -7633,60 +8261,89 @@
7633
8261
  this._rtcReportTimer = 0;
7634
8262
  }
7635
8263
  }
8264
+ }, {
8265
+ key: "_clearDelay",
8266
+ value: function _clearDelay() {
8267
+ if (this._setDelayTimer) {
8268
+ clearInterval(this._setDelayTimer);
8269
+ delete this._setDelayTimer;
8270
+ }
8271
+ this._targetDelayHint = null;
8272
+ this._setDelayError = null;
8273
+ }
7636
8274
  }, {
7637
8275
  key: "_disconnect",
7638
- value: function _disconnect() {
7639
- var _this$_loader, _this$_networkEvaluat2;
7640
- (_this$_loader = this._loader) === null || _this$_loader === void 0 ? void 0 : _this$_loader.cancel();
8276
+ value: function _disconnect(reason) {
8277
+ var _this$_loader2, _this$_networkEvaluat2;
8278
+ this._clearDelay();
8279
+ this._clearMediaSrc();
8280
+ (_this$_loader2 = this._loader) === null || _this$_loader2 === void 0 ? void 0 : _this$_loader2.cancel();
7641
8281
  (_this$_networkEvaluat2 = this._networkEvaluate) === null || _this$_networkEvaluat2 === void 0 ? void 0 : _this$_networkEvaluat2.destroy();
7642
8282
  this._stopRtcReport();
7643
8283
  clearTimeout(this._checkStatsErrorTimer);
7644
8284
  this._clearPeerStateTimeout();
8285
+ this._firstFrameObserver.setFailureReason(reason);
8286
+ this._firstFrameObserver.reset();
7645
8287
  this._audioTransceicer = null;
7646
8288
  this._videoTransceicer = null;
7647
8289
  this._mediaStream = null;
7648
- this._networkEvaluate = null;
8290
+ }
8291
+ }, {
8292
+ key: "_clearMediaSrc",
8293
+ value: function _clearMediaSrc() {
8294
+ if (this._media) {
8295
+ this._media.srcObject = null;
8296
+ this._media.removeAttribute("src");
8297
+ }
7649
8298
  }
7650
8299
  }, {
7651
8300
  key: "_emitError",
7652
8301
  value: function _emitError(error) {
8302
+ var _error$originError;
8303
+ logger.warn(error);
8304
+ this._clearDelay();
8305
+ 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);
8306
+ this._firstFrameObserver.reset();
7653
8307
  this.emit(EVENT.ERROR, error);
7654
8308
  clearTimeout(this._checkStatsErrorTimer);
7655
8309
  this._clearPeerStateTimeout();
7656
8310
  if (this._pc) {
7657
8311
  this._pc.close();
7658
- if (this._media) {
7659
- this._media.srcObject = null;
7660
- this._media.removeAttribute("src");
7661
- }
8312
+ this._clearMediaSrc();
7662
8313
  }
7663
8314
  }
7664
8315
  }, {
7665
8316
  key: "_createEmptyPeer",
7666
8317
  value: function() {
7667
- var _createEmptyPeer2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee8() {
8318
+ var _createEmptyPeer2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee10() {
7668
8319
  var pc;
7669
- return _regeneratorRuntime$1().wrap(function _callee8$(_context8) {
8320
+ return _regeneratorRuntime$1().wrap(function _callee10$(_context10) {
7670
8321
  while (1)
7671
- switch (_context8.prev = _context8.next) {
8322
+ switch (_context10.prev = _context10.next) {
7672
8323
  case 0:
7673
8324
  pc = new RTCPeerConnection();
7674
- _context8.next = 3;
8325
+ _context10.next = 3;
7675
8326
  return pc.createOffer();
7676
8327
  case 3:
7677
8328
  pc.close();
7678
- pc = null;
7679
- case 5:
8329
+ case 4:
7680
8330
  case "end":
7681
- return _context8.stop();
8331
+ return _context10.stop();
7682
8332
  }
7683
- }, _callee8);
8333
+ }, _callee10);
7684
8334
  }));
7685
8335
  function _createEmptyPeer() {
7686
8336
  return _createEmptyPeer2.apply(this, arguments);
7687
8337
  }
7688
8338
  return _createEmptyPeer;
7689
8339
  }()
8340
+ }, {
8341
+ key: "_emitFirstFrameState",
8342
+ value: function _emitFirstFrameState(info, extra) {
8343
+ this.emit(EXTEND_EVENTS.RTC_FIRST_FRAME, _objectSpread2$2(_objectSpread2$2(_objectSpread2$2({}, info), extra), {}, {
8344
+ initOptionsIncludePreload: !!this._opts.preloadPromise
8345
+ }));
8346
+ }
7690
8347
  }, {
7691
8348
  key: "_changeVolumeInHarmonyWorkaround",
7692
8349
  value: function _changeVolumeInHarmonyWorkaround() {
@@ -7700,7 +8357,8 @@
7700
8357
  enumerable: true,
7701
8358
  get: originalDescriptor.get,
7702
8359
  set: function set(val) {
7703
- originalDescriptor.set.call(this, val);
8360
+ var _originalDescriptor$s;
8361
+ (_originalDescriptor$s = originalDescriptor.set) === null || _originalDescriptor$s === void 0 ? void 0 : _originalDescriptor$s.call(this, val);
7704
8362
  var _changeNumberInRange = changeNumberInRange(this.volume, 0, 1, 0.01), _changeNumberInRange2 = _slicedToArray(_changeNumberInRange, 2), sourceVolume = _changeNumberInRange2[0], targetVolume = _changeNumberInRange2[1];
7705
8363
  this.volume = targetVolume;
7706
8364
  this.volume = sourceVolume;
@@ -7716,14 +8374,47 @@
7716
8374
  }
7717
8375
  }
7718
8376
  }
8377
+ }, {
8378
+ key: "_mutedBeforePlayingWorkaround",
8379
+ value: function _mutedBeforePlayingWorkaround() {
8380
+ var _this9 = this;
8381
+ if (isHeyTapBrowser() || isVivoBrowser()) {
8382
+ var originalDescriptor = Object.getOwnPropertyDescriptor(HTMLMediaElement.prototype, "muted");
8383
+ if (this._media && originalDescriptor) {
8384
+ logger.log("apply muted workaround for vivo & oppo");
8385
+ var originalMuted = this._media.muted;
8386
+ this._media.muted = true;
8387
+ Object.defineProperty(this._media, "muted", {
8388
+ configurable: true,
8389
+ enumerable: true,
8390
+ get: function get() {
8391
+ return originalMuted;
8392
+ },
8393
+ set: function set(val) {
8394
+ logger.log("muted workaround. set muted =", val);
8395
+ originalMuted = val;
8396
+ }
8397
+ });
8398
+ var revertMutedProxy = function revertMutedProxy2() {
8399
+ logger.log("revert muted workaround. muted:", originalMuted);
8400
+ if (_this9._media) {
8401
+ Object.defineProperty(_this9._media, "muted", originalDescriptor);
8402
+ _this9._media.muted = originalMuted;
8403
+ _this9._media.removeEventListener("playing", revertMutedProxy2);
8404
+ }
8405
+ };
8406
+ this._media.addEventListener("playing", revertMutedProxy);
8407
+ }
8408
+ }
8409
+ }
7719
8410
  }, {
7720
8411
  key: "destroy",
7721
8412
  value: function destroy(keepClearMediaStream) {
7722
- var _this$_revertVolumeWo, _this$_media;
7723
- this._disconnect();
8413
+ var _this$_revertVolumeWo, _this$_media3;
8414
+ this._disconnect("invoke destroy");
7724
8415
  (_this$_revertVolumeWo = this._revertVolumeWorkaround) === null || _this$_revertVolumeWo === void 0 ? void 0 : _this$_revertVolumeWo.call(this);
7725
8416
  delete this._revertVolumeWorkaround;
7726
- (_this$_media = this._media) === null || _this$_media === void 0 ? void 0 : _this$_media.removeEventListener("timeupdate", this._mockWaitingByTimeupdate);
8417
+ (_this$_media3 = this._media) === null || _this$_media3 === void 0 ? void 0 : _this$_media3.removeEventListener("timeupdate", this._mockWaitingByTimeupdate);
7727
8418
  if (this._media && !keepClearMediaStream) {
7728
8419
  this._media.srcObject = null;
7729
8420
  }
@@ -7734,7 +8425,6 @@
7734
8425
  this._media = null;
7735
8426
  this._player = null;
7736
8427
  this._pc = null;
7737
- this._opts = null;
7738
8428
  }
7739
8429
  }], [{
7740
8430
  key: "enableLogger",
@@ -7763,15 +8453,11 @@
7763
8453
  function RtsPlugin2() {
7764
8454
  var _this;
7765
8455
  _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() {
8456
+ _this = _super.apply(this, arguments);
8457
+ _this._rts = null;
8458
+ _this._rtsOpts = null;
8459
+ _this._mediaStream = null;
8460
+ _this._onPause = function() {
7775
8461
  if (_this._disconnectTimer) {
7776
8462
  return;
7777
8463
  }
@@ -7779,8 +8465,8 @@
7779
8465
  _this._closeAfterPause();
7780
8466
  _this._clearDisconnectTimer();
7781
8467
  }, _this.config.disconnectTime * 1e3);
7782
- });
7783
- _defineProperty$2(_assertThisInitialized$1(_this), "_reInit", function() {
8468
+ };
8469
+ _this._reInit = function() {
7784
8470
  var _this$_rts;
7785
8471
  _this._clearDisconnectTimer();
7786
8472
  if ((_this$_rts = _this._rts) !== null && _this$_rts !== void 0 && _this$_rts._pc) {
@@ -7788,8 +8474,8 @@
7788
8474
  }
7789
8475
  _this._init();
7790
8476
  _this._bindRtsEvents();
7791
- });
7792
- _defineProperty$2(_assertThisInitialized$1(_this), "_init", function() {
8477
+ };
8478
+ _this._init = function() {
7793
8479
  var _this$_rts2;
7794
8480
  (_this$_rts2 = _this._rts) === null || _this$_rts2 === void 0 ? void 0 : _this$_rts2.destroy();
7795
8481
  var config = _this.player.config;
@@ -7808,9 +8494,11 @@
7808
8494
  }
7809
8495
  }, rtsOpts));
7810
8496
  _this._rts.load(config.url);
7811
- });
7812
- _defineProperty$2(_assertThisInitialized$1(_this), "_onSwitchURL", function(url) {
7813
- if (url) {
8497
+ };
8498
+ _this._onSwitchURL = function(url) {
8499
+ if (url.startsWith("blob:") || url === "") {
8500
+ url = _this.player.config.url;
8501
+ } else if (url) {
7814
8502
  _this.player.config.url = url;
7815
8503
  }
7816
8504
  if (_this._rts) {
@@ -7818,14 +8506,25 @@
7818
8506
  } else {
7819
8507
  _this._reInit();
7820
8508
  }
7821
- });
7822
- _defineProperty$2(_assertThisInitialized$1(_this), "destroy", function() {
8509
+ };
8510
+ _this.__retry = function() {
8511
+ _this.player.removeClass(STATE_CLASS.ERROR);
8512
+ _this.player.addClass(STATE_CLASS.LOADING);
8513
+ runHooks(_assertThisInitialized$1(_this), "retry", function() {
8514
+ _this.player.src = "";
8515
+ _this.player.once(CANPLAY, function() {
8516
+ _this.player.mediaPlay();
8517
+ });
8518
+ });
8519
+ };
8520
+ _this.destroy = function() {
7823
8521
  var _this$_rts3;
7824
8522
  _this.player.switchURL = _this._originSwitchFn;
8523
+ _this.player.retry = _this._originRetry;
7825
8524
  _this._clearDisconnectTimer();
7826
8525
  (_this$_rts3 = _this._rts) === null || _this$_rts3 === void 0 ? void 0 : _this$_rts3.destroy();
7827
8526
  _this._rts = null;
7828
- });
8527
+ };
7829
8528
  return _this;
7830
8529
  }
7831
8530
  _createClass$3(RtsPlugin2, [{
@@ -7835,32 +8534,38 @@
7835
8534
  return (_this$_rts4 = this._rts) === null || _this$_rts4 === void 0 ? void 0 : _this$_rts4.pc;
7836
8535
  }
7837
8536
  }, {
7838
- key: "videoTrack",
8537
+ key: "jitterBufferDelay",
7839
8538
  get: function get() {
7840
8539
  var _this$_rts5;
7841
- return (_this$_rts5 = this._rts) === null || _this$_rts5 === void 0 ? void 0 : _this$_rts5.videoTack;
8540
+ return ((_this$_rts5 = this._rts) === null || _this$_rts5 === void 0 ? void 0 : _this$_rts5.getJitterBufferDelay()) || 0;
7842
8541
  }
7843
8542
  }, {
7844
- key: "audioTrack",
8543
+ key: "loader",
7845
8544
  get: function get() {
7846
8545
  var _this$_rts6;
7847
- return (_this$_rts6 = this._rts) === null || _this$_rts6 === void 0 ? void 0 : _this$_rts6.audioTrack;
8546
+ return (_this$_rts6 = this._rts) === null || _this$_rts6 === void 0 ? void 0 : _this$_rts6.loader;
7848
8547
  }
7849
8548
  }, {
7850
- key: "core",
8549
+ key: "videoTrack",
7851
8550
  get: function get() {
7852
- return this._rts;
8551
+ var _this$_rts7;
8552
+ return (_this$_rts7 = this._rts) === null || _this$_rts7 === void 0 ? void 0 : _this$_rts7.videoTack;
7853
8553
  }
7854
8554
  }, {
7855
- key: "loader",
8555
+ key: "audioTrack",
7856
8556
  get: function get() {
7857
- var _this$_rts7;
7858
- return (_this$_rts7 = this._rts) === null || _this$_rts7 === void 0 ? void 0 : _this$_rts7.loader;
8557
+ var _this$_rts8;
8558
+ return (_this$_rts8 = this._rts) === null || _this$_rts8 === void 0 ? void 0 : _this$_rts8.audioTrack;
8559
+ }
8560
+ }, {
8561
+ key: "core",
8562
+ get: function get() {
8563
+ return this._rts;
7859
8564
  }
7860
8565
  }, {
7861
8566
  key: "version",
7862
8567
  get: function get() {
7863
- return "0.2.1-alpha.47";
8568
+ return "0.2.1-alpha.53";
7864
8569
  }
7865
8570
  }, {
7866
8571
  key: "beforePlayerInit",
@@ -7868,9 +8573,15 @@
7868
8573
  var _this$player2, _this$player$config, _this$player$config$r, _this2 = this;
7869
8574
  this._init();
7870
8575
  if (!this._originSwitchFn) {
7871
- this._originSwitchFn = this.player.switchURL.bind(this.player);
8576
+ var _this$player$switchUR;
8577
+ this._originSwitchFn = (_this$player$switchUR = this.player.switchURL) === null || _this$player$switchUR === void 0 ? void 0 : _this$player$switchUR.bind(this.player);
8578
+ }
8579
+ if (!this._originRetry) {
8580
+ var _this$player$retry;
8581
+ this._originRetry = (_this$player$retry = this.player.retry) === null || _this$player$retry === void 0 ? void 0 : _this$player$retry.bind(this.player);
7872
8582
  }
7873
8583
  this.player.switchURL = this._onSwitchURL;
8584
+ this.player.retry = this.__retry;
7874
8585
  (_this$player2 = this.player) === null || _this$player2 === void 0 ? void 0 : _this$player2.useHooks("replay", this._onSwitchURL);
7875
8586
  this.on(URL_CHANGE, this._onSwitchURL);
7876
8587
  this.on(DESTROY, this.destroy);
@@ -7900,6 +8611,7 @@
7900
8611
  if (!((_this2$player = _this2.player) !== null && _this2$player !== void 0 && (_this2$player$video = _this2$player.video) !== null && _this2$player$video !== void 0 && _this2$player$video.srcObject)) {
7901
8612
  _this2.player.video.srcObject = new MediaStream();
7902
8613
  }
8614
+ return "";
7903
8615
  }
7904
8616
  }
7905
8617
  }
@@ -7910,26 +8622,26 @@
7910
8622
  }, {
7911
8623
  key: "getStats",
7912
8624
  value: function getStats2() {
7913
- var _this$_rts8;
7914
- return (_this$_rts8 = this._rts) === null || _this$_rts8 === void 0 ? void 0 : _this$_rts8.getStats();
8625
+ var _this$_rts9;
8626
+ return (_this$_rts9 = this._rts) === null || _this$_rts9 === void 0 ? void 0 : _this$_rts9.getStats();
7915
8627
  }
7916
8628
  }, {
7917
8629
  key: "getStatsSnapshoot",
7918
8630
  value: function getStatsSnapshoot2() {
7919
- var _this$_rts9;
7920
- return (_this$_rts9 = this._rts) === null || _this$_rts9 === void 0 ? void 0 : _this$_rts9.getStatsSnapshoot();
8631
+ var _this$_rts10;
8632
+ return (_this$_rts10 = this._rts) === null || _this$_rts10 === void 0 ? void 0 : _this$_rts10.getStatsSnapshoot();
7921
8633
  }
7922
8634
  }, {
7923
8635
  key: "getNetWorkInfo",
7924
8636
  value: function getNetWorkInfo() {
7925
- var _this$_rts10;
7926
- return (_this$_rts10 = this._rts) === null || _this$_rts10 === void 0 ? void 0 : _this$_rts10.networkStats;
8637
+ var _this$_rts11;
8638
+ return (_this$_rts11 = this._rts) === null || _this$_rts11 === void 0 ? void 0 : _this$_rts11.networkStats;
7927
8639
  }
7928
8640
  }, {
7929
8641
  key: "setDelay",
7930
8642
  value: function setDelay(delayHint) {
7931
- var _this$_rts11;
7932
- (_this$_rts11 = this._rts) === null || _this$_rts11 === void 0 ? void 0 : _this$_rts11._setDelay(delayHint);
8643
+ var _this$_rts12;
8644
+ (_this$_rts12 = this._rts) === null || _this$_rts12 === void 0 ? void 0 : _this$_rts12._setDelay(delayHint);
7933
8645
  }
7934
8646
  }, {
7935
8647
  key: "_clearDisconnectTimer",
@@ -7940,15 +8652,15 @@
7940
8652
  }, {
7941
8653
  key: "_closeAfterPause",
7942
8654
  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)) {
8655
+ var _this$_rts13, _this$config, _this$_rts15;
8656
+ if (!((_this$_rts13 = this._rts) !== null && _this$_rts13 !== void 0 && _this$_rts13._pc)) {
7945
8657
  return;
7946
8658
  }
7947
8659
  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;
8660
+ var _this$_rts14;
8661
+ this._mediaStream = (_this$_rts14 = this._rts) === null || _this$_rts14 === void 0 ? void 0 : _this$_rts14._mediaStream;
7950
8662
  }
7951
- (_this$_rts14 = this._rts) === null || _this$_rts14 === void 0 ? void 0 : _this$_rts14.destroy(true);
8663
+ (_this$_rts15 = this._rts) === null || _this$_rts15 === void 0 ? void 0 : _this$_rts15.destroy(true);
7952
8664
  this._rts = null;
7953
8665
  }
7954
8666
  }, {
@@ -7964,16 +8676,17 @@
7964
8676
  this._transCoreEvent(EVENT.SEI);
7965
8677
  this._transCoreEvent(EXTEND_EVENTS.RTC_STATE_CHANGE);
7966
8678
  this._transCoreEvent(EXTEND_EVENTS.RTC_NETWORK);
8679
+ this._transCoreEvent(EXTEND_EVENTS.RTC_FIRST_FRAME);
7967
8680
  }
7968
8681
  }, {
7969
8682
  key: "_transErrorEvent",
7970
8683
  value: function _transErrorEvent() {
7971
- var _this3 = this;
7972
- this._rts.on(EVENT.ERROR, function(err) {
8684
+ var _this$_rts16, _this3 = this, _this$_rts17;
8685
+ (_this$_rts16 = this._rts) === null || _this$_rts16 === void 0 ? void 0 : _this$_rts16.on(EVENT.ERROR, function(err) {
7973
8686
  if (!_this3.player)
7974
8687
  return;
7975
8688
  var e = new Errors(_this3.player, err);
7976
- var _this3$_rtsOpts = _this3._rtsOpts, backupConstruct = _this3$_rtsOpts.backupConstruct, backupURL = _this3$_rtsOpts.backupURL;
8689
+ var _ref = _this3._rtsOpts || {}, backupConstruct = _ref.backupConstruct, backupURL = _ref.backupURL;
7977
8690
  if (backupURL) {
7978
8691
  var _player$video;
7979
8692
  var player = _this3.player;
@@ -7993,6 +8706,7 @@
7993
8706
  });
7994
8707
  player.unRegisterPlugin("rts");
7995
8708
  player.switchURL = _this3._originSwitchFn;
8709
+ player.retry = _this3._originRetry;
7996
8710
  _this3._rts = null;
7997
8711
  player.rts = null;
7998
8712
  if ((_player$video = player.video) !== null && _player$video !== void 0 && _player$video.srcObject) {
@@ -8009,7 +8723,7 @@
8009
8723
  }
8010
8724
  _this3.player.emit(ERROR, e);
8011
8725
  });
8012
- this._rts.on("waiting", function() {
8726
+ (_this$_rts17 = this._rts) === null || _this$_rts17 === void 0 ? void 0 : _this$_rts17.on("waiting", function() {
8013
8727
  var _this3$player;
8014
8728
  (_this3$player = _this3.player) === null || _this3$player === void 0 ? void 0 : _this3$player.emit("waiting");
8015
8729
  });
@@ -8017,8 +8731,8 @@
8017
8731
  }, {
8018
8732
  key: "_transCoreEvent",
8019
8733
  value: function _transCoreEvent(eventName) {
8020
- var _this4 = this;
8021
- this._rts.on(eventName, function(e) {
8734
+ var _this$_rts18, _this4 = this;
8735
+ (_this$_rts18 = this._rts) === null || _this$_rts18 === void 0 ? void 0 : _this$_rts18.on(eventName, function(e) {
8022
8736
  if (_this4.player) {
8023
8737
  _this4.player.emit("core_event", _objectSpread2$2(_objectSpread2$2({}, e), {}, {
8024
8738
  eventName
@@ -8056,7 +8770,8 @@
8056
8770
  case 3:
8057
8771
  res = _context.sent;
8058
8772
  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);
8773
+ var _x$config;
8774
+ return x.codec === "H264" && (!targetProfileLevel || ((_x$config = x.config) === null || _x$config === void 0 ? void 0 : _x$config.indexOf(targetProfileLevel)) !== -1);
8060
8775
  }).length;
8061
8776
  if (hasH264) {
8062
8777
  _context.next = 10;
@@ -8067,7 +8782,8 @@
8067
8782
  case 8:
8068
8783
  res1 = _context.sent;
8069
8784
  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);
8785
+ var _x$config2;
8786
+ return x.codec === "H264" && (!targetProfileLevel || ((_x$config2 = x.config) === null || _x$config2 === void 0 ? void 0 : _x$config2.indexOf(targetProfileLevel)) !== -1);
8071
8787
  }).length;
8072
8788
  case 10:
8073
8789
  return _context.abrupt("return", !!hasH264);