@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.
@@ -577,6 +577,60 @@ function _nonIterableSpread$1() {
577
577
  function _nonIterableRest() {
578
578
  throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
579
579
  }
580
+ function _createForOfIteratorHelper$1(o, allowArrayLike) {
581
+ var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
582
+ if (!it) {
583
+ if (Array.isArray(o) || (it = _unsupportedIterableToArray$2(o)) || allowArrayLike && o && typeof o.length === "number") {
584
+ if (it)
585
+ o = it;
586
+ var i = 0;
587
+ var F = function() {
588
+ };
589
+ return {
590
+ s: F,
591
+ n: function() {
592
+ if (i >= o.length)
593
+ return {
594
+ done: true
595
+ };
596
+ return {
597
+ done: false,
598
+ value: o[i++]
599
+ };
600
+ },
601
+ e: function(e) {
602
+ throw e;
603
+ },
604
+ f: F
605
+ };
606
+ }
607
+ throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
608
+ }
609
+ var normalCompletion = true, didErr = false, err;
610
+ return {
611
+ s: function() {
612
+ it = it.call(o);
613
+ },
614
+ n: function() {
615
+ var step = it.next();
616
+ normalCompletion = step.done;
617
+ return step;
618
+ },
619
+ e: function(e) {
620
+ didErr = true;
621
+ err = e;
622
+ },
623
+ f: function() {
624
+ try {
625
+ if (!normalCompletion && it.return != null)
626
+ it.return();
627
+ } finally {
628
+ if (didErr)
629
+ throw err;
630
+ }
631
+ }
632
+ };
633
+ }
580
634
  function _toPrimitive$3(input, hint) {
581
635
  if (typeof input !== "object" || input === null)
582
636
  return input;
@@ -1699,6 +1753,7 @@ var Errors = /* @__PURE__ */ _createClass$2(
1699
1753
  var PLAY = "play";
1700
1754
  var PAUSE = "pause";
1701
1755
  var ERROR = "error";
1756
+ var CANPLAY = "canplay";
1702
1757
  var DESTROY = "destroy";
1703
1758
  var URL_CHANGE = "urlchange";
1704
1759
  function callHandler(obj, handler, next) {
@@ -2127,6 +2182,37 @@ var BasePlugin = /* @__PURE__ */ function() {
2127
2182
  }]);
2128
2183
  return BasePlugin2;
2129
2184
  }();
2185
+ var STATE_CLASS = {
2186
+ DEFAULT: "xgplayer",
2187
+ DEFAULT_SKIN: "xgplayer-skin-default",
2188
+ ENTER: "xgplayer-is-enter",
2189
+ PAUSED: "xgplayer-pause",
2190
+ PLAYING: "xgplayer-playing",
2191
+ ENDED: "xgplayer-ended",
2192
+ CANPLAY: "xgplayer-canplay",
2193
+ LOADING: "xgplayer-isloading",
2194
+ ERROR: "xgplayer-is-error",
2195
+ REPLAY: "xgplayer-replay",
2196
+ NO_START: "xgplayer-nostart",
2197
+ ACTIVE: "xgplayer-active",
2198
+ INACTIVE: "xgplayer-inactive",
2199
+ FULLSCREEN: "xgplayer-is-fullscreen",
2200
+ CSS_FULLSCREEN: "xgplayer-is-cssfullscreen",
2201
+ ROTATE_FULLSCREEN: "xgplayer-rotate-fullscreen",
2202
+ PARENT_ROTATE_FULLSCREEN: "xgplayer-rotate-parent",
2203
+ PARENT_FULLSCREEN: "xgplayer-fullscreen-parent",
2204
+ INNER_FULLSCREEN: "xgplayer-fullscreen-inner",
2205
+ NO_CONTROLS: "no-controls",
2206
+ FLEX_CONTROLS: "flex-controls",
2207
+ CONTROLS_FOLLOW: "controls-follow",
2208
+ CONTROLS_AUTOHIDE: "controls-autohide",
2209
+ TOP_BAR_AUTOHIDE: "top-bar-autohide",
2210
+ NOT_ALLOW_AUTOPLAY: "not-allow-autoplay",
2211
+ SEEKING: "seeking",
2212
+ PC: "xgplayer-pc",
2213
+ MOBILE: "xgplayer-mobile",
2214
+ MINI: "xgplayer-mini"
2215
+ };
2130
2216
  function ownKeys(object, enumerableOnly) {
2131
2217
  var keys = Object.keys(object);
2132
2218
  if (Object.getOwnPropertySymbols) {
@@ -4292,10 +4378,28 @@ var NetLoader = /* @__PURE__ */ function(_EventEmitter) {
4292
4378
  }]);
4293
4379
  return NetLoader2;
4294
4380
  }(EventEmitter);
4295
- var EXTEND_EVENTS = {
4296
- RTC_STATE_CHANGE: "core.rtcstatechange",
4297
- RTC_NETWORK: "core.rtcnetwork"
4298
- };
4381
+ var EXTEND_EVENTS = /* @__PURE__ */ function(EXTEND_EVENTS2) {
4382
+ EXTEND_EVENTS2["RTC_STATE_CHANGE"] = "core.rtcstatechange";
4383
+ EXTEND_EVENTS2["RTC_NETWORK"] = "core.rtcnetwork";
4384
+ EXTEND_EVENTS2["RTC_FIRST_FRAME"] = "core.rtcfirstframe";
4385
+ return EXTEND_EVENTS2;
4386
+ }(EXTEND_EVENTS || {});
4387
+ var RTC_FIRST_FRAME_STATE = /* @__PURE__ */ function(RTC_FIRST_FRAME_STATE2) {
4388
+ RTC_FIRST_FRAME_STATE2["LOAD_START"] = "start_load";
4389
+ RTC_FIRST_FRAME_STATE2["OFFER_SDP_READY"] = "offer_sdp_ready";
4390
+ RTC_FIRST_FRAME_STATE2["ANSWER_SDP_RECV"] = "answer_sdp_recv";
4391
+ RTC_FIRST_FRAME_STATE2["ANSWER_SDP_READY"] = "answer_sdp_ready";
4392
+ RTC_FIRST_FRAME_STATE2["ICE_CONNECTED"] = "ice_connected";
4393
+ RTC_FIRST_FRAME_STATE2["DTLS_CONNECTED"] = "dtls_connected";
4394
+ RTC_FIRST_FRAME_STATE2["PEER_CONNECTED"] = "peer_connected";
4395
+ RTC_FIRST_FRAME_STATE2["FIRST_PACKET_RECV"] = "first_packet_recv";
4396
+ RTC_FIRST_FRAME_STATE2["FIRST_FRAME_RECV"] = "first_frame_recv";
4397
+ RTC_FIRST_FRAME_STATE2["FIRST_FRAME_DECODED"] = "first_frame_decoded";
4398
+ RTC_FIRST_FRAME_STATE2["VIDEO_PLAYING"] = "video_playing";
4399
+ RTC_FIRST_FRAME_STATE2["VIDEO_CANPLAY"] = "video_canplay";
4400
+ RTC_FIRST_FRAME_STATE2["VIDEO_LOADEDDATA"] = "video_loadeddata";
4401
+ return RTC_FIRST_FRAME_STATE2;
4402
+ }(RTC_FIRST_FRAME_STATE || {});
4299
4403
  var lib = {};
4300
4404
  var parser$1 = {};
4301
4405
  var grammar$2 = { exports: {} };
@@ -4989,29 +5093,29 @@ function getOption(options) {
4989
5093
  enableOriginSdpLogger: false,
4990
5094
  checkStatsErrorDelay: 5e3,
4991
5095
  connectionStateChangeTimeout: 5e3,
4992
- enableNetworkQuality: false,
5096
+ enableNetworkQuality: true,
4993
5097
  hackCreateOfferIssue: false,
4994
5098
  progressiveSetDelay: false,
4995
5099
  networkQuality: {
4996
5100
  networkQos: {
4997
5101
  1: {
4998
- "maxRtt": 250,
4999
- "maxLoss": 0.15
5102
+ maxRtt: 250,
5103
+ maxLoss: 0.15
5000
5104
  },
5001
5105
  2: {
5002
- "maxRtt": 500,
5003
- "maxLoss": 0.3,
5004
- "minRetransmittedRate": 0.2
5106
+ maxRtt: 500,
5107
+ maxLoss: 0.3,
5108
+ minRetransmittedRate: 0.2
5005
5109
  },
5006
5110
  3: {
5007
- "maxRtt": 750,
5008
- "maxLoss": 0.45,
5009
- "minRetransmittedRate": 0.35
5111
+ maxRtt: 750,
5112
+ maxLoss: 0.45,
5113
+ minRetransmittedRate: 0.35
5010
5114
  },
5011
5115
  4: {
5012
- "maxRtt": 1e3,
5013
- "maxLoss": 0.6,
5014
- "minRetransmittedRate": 0.5
5116
+ maxRtt: 1e3,
5117
+ maxLoss: 0.6,
5118
+ minRetransmittedRate: 0.5
5015
5119
  }
5016
5120
  },
5017
5121
  networkQoe: {
@@ -5032,19 +5136,19 @@ function getOption(options) {
5032
5136
  }, adaptiveJitterBuffer),
5033
5137
  networkStrategy: {
5034
5138
  1: {
5035
- "jitterBuffer": null
5139
+ jitterBuffer: null
5036
5140
  },
5037
5141
  2: {
5038
- "jitterBuffer": 1.5
5142
+ jitterBuffer: 1.5
5039
5143
  },
5040
5144
  3: {
5041
- "jitterBuffer": 2
5145
+ jitterBuffer: 2
5042
5146
  },
5043
5147
  4: {
5044
- "jitterBuffer": 3
5148
+ jitterBuffer: 3
5045
5149
  },
5046
5150
  5: {
5047
- "jitterBuffer": 3
5151
+ jitterBuffer: 3
5048
5152
  }
5049
5153
  }
5050
5154
  }, opts);
@@ -5075,14 +5179,36 @@ function _getStats(stats) {
5075
5179
  };
5076
5180
  });
5077
5181
  }
5078
- function getStats(pc) {
5079
- return new Promise(function(resolve) {
5080
- var _pc$getStats;
5081
- (_pc$getStats = pc.getStats(null)) === null || _pc$getStats === void 0 ? void 0 : _pc$getStats.then(function(report) {
5082
- resolve(_getStats(report));
5083
- });
5084
- }).catch(function() {
5085
- });
5182
+ function getStats(_x) {
5183
+ return _getStats2.apply(this, arguments);
5184
+ }
5185
+ function _getStats2() {
5186
+ _getStats2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee2(pc) {
5187
+ return _regeneratorRuntime$1().wrap(function _callee2$(_context2) {
5188
+ while (1)
5189
+ switch (_context2.prev = _context2.next) {
5190
+ case 0:
5191
+ if (pc) {
5192
+ _context2.next = 2;
5193
+ break;
5194
+ }
5195
+ return _context2.abrupt("return", []);
5196
+ case 2:
5197
+ return _context2.abrupt("return", new Promise(function(resolve) {
5198
+ var _pc$getStats;
5199
+ (_pc$getStats = pc.getStats(null)) === null || _pc$getStats === void 0 ? void 0 : _pc$getStats.then(function(report) {
5200
+ resolve(_getStats(report));
5201
+ });
5202
+ }).catch(function() {
5203
+ return [];
5204
+ }));
5205
+ case 3:
5206
+ case "end":
5207
+ return _context2.stop();
5208
+ }
5209
+ }, _callee2);
5210
+ }));
5211
+ return _getStats2.apply(this, arguments);
5086
5212
  }
5087
5213
  function getStatsSnapshoot(stats) {
5088
5214
  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;
@@ -5152,22 +5278,23 @@ function getStatsSnapshoot(stats) {
5152
5278
  }
5153
5279
  var QUEUE_SIZE = 5;
5154
5280
  var NetworkEvaluate = /* @__PURE__ */ function() {
5155
- function NetworkEvaluate2(pc, interval) {
5281
+ function NetworkEvaluate2(pc) {
5156
5282
  var _this = this;
5283
+ var interval = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 1e3;
5157
5284
  _classCallCheck$3(this, NetworkEvaluate2);
5158
- _defineProperty$2(this, "_pc", null);
5159
- _defineProperty$2(this, "_lastVideoStats", null);
5160
- _defineProperty$2(this, "_lastRemoteVideoStats", null);
5161
- _defineProperty$2(this, "_timer", 0);
5162
- _defineProperty$2(this, "_timerInterval", 0);
5163
- _defineProperty$2(this, "_speedQueue", []);
5164
- _defineProperty$2(this, "_lostRateQueue", []);
5165
- _defineProperty$2(this, "_receivedRateQueue", []);
5166
- _defineProperty$2(this, "_currentSpeed", -1);
5167
- _defineProperty$2(this, "_currentLostRate", -1);
5168
- _defineProperty$2(this, "_currentReceivedRate", -1);
5169
- _defineProperty$2(this, "_evaluate", /* @__PURE__ */ _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee() {
5170
- var snapshoot, _snapshoot$video, nowBytes, nowPkgLost, nowPkg, _this$_lastVideoStats, preBytes, prePkgLost, prePkg, lost, pkgReceived, nowReceived, preReceived, _snapshoot$videoRemot, nowRemoteSent, preRemoteSent;
5285
+ this._pc = null;
5286
+ this._lastVideoStats = null;
5287
+ this._lastRemoteVideoStats = null;
5288
+ this._timer = 0;
5289
+ this._timerInterval = 0;
5290
+ this._speedQueue = [];
5291
+ this._lostRateQueue = [];
5292
+ this._receivedRateQueue = [];
5293
+ this._currentSpeed = -1;
5294
+ this._currentLostRate = -1;
5295
+ this._currentReceivedRate = -1;
5296
+ this._evaluate = /* @__PURE__ */ _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee() {
5297
+ 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;
5171
5298
  return _regeneratorRuntime$1().wrap(function _callee$(_context) {
5172
5299
  while (1)
5173
5300
  switch (_context.prev = _context.next) {
@@ -5192,8 +5319,8 @@ var NetworkEvaluate = /* @__PURE__ */ function() {
5192
5319
  }
5193
5320
  }
5194
5321
  if (_this._lastRemoteVideoStats && snapshoot !== null && snapshoot !== void 0 && snapshoot.videoRemote) {
5195
- nowReceived = snapshoot.video.bytesReceived;
5196
- preReceived = _this._lastVideoStats.bytesReceived;
5322
+ _ref2 = snapshoot.video || {}, _ref2$bytesReceived = _ref2.bytesReceived, nowReceived = _ref2$bytesReceived === void 0 ? 0 : _ref2$bytesReceived;
5323
+ _ref3 = _this._lastVideoStats || {}, _ref3$bytesReceived = _ref3.bytesReceived, preReceived = _ref3$bytesReceived === void 0 ? 0 : _ref3$bytesReceived;
5197
5324
  _snapshoot$videoRemot = snapshoot === null || snapshoot === void 0 ? void 0 : snapshoot.videoRemote, nowRemoteSent = _snapshoot$videoRemot.bytesSent;
5198
5325
  preRemoteSent = _this._lastRemoteVideoStats.bytesSent;
5199
5326
  if (preRemoteSent && nowRemoteSent && nowRemoteSent - preRemoteSent > 0) {
@@ -5212,7 +5339,7 @@ var NetworkEvaluate = /* @__PURE__ */ function() {
5212
5339
  return _context.stop();
5213
5340
  }
5214
5341
  }, _callee, null, [[0, 10]]);
5215
- })));
5342
+ }));
5216
5343
  this._pc = pc;
5217
5344
  this._timerInterval = interval;
5218
5345
  this.start(interval);
@@ -5327,6 +5454,9 @@ function getCapacity() {
5327
5454
  return pc.createOffer().then(function(offer) {
5328
5455
  var _sdpJson$media, _sdpJson$media2, _vMedia$rtp, _aMedia$rtp;
5329
5456
  logger.log(offer.sdp);
5457
+ if (!offer.sdp) {
5458
+ return Promise.reject("createOffer no sdp");
5459
+ }
5330
5460
  var sdpJson = lib.parse(offer.sdp);
5331
5461
  var vMedia = (_sdpJson$media = sdpJson.media) === null || _sdpJson$media === void 0 ? void 0 : _sdpJson$media.filter(function(x) {
5332
5462
  return x.type === "video";
@@ -5514,7 +5644,7 @@ var Nalunit = {
5514
5644
  var RTCDataView = /* @__PURE__ */ function() {
5515
5645
  function RTCDataView2(buffer) {
5516
5646
  _classCallCheck$3(this, RTCDataView2);
5517
- _defineProperty$2(this, "_position", 0);
5647
+ this._position = 0;
5518
5648
  this._dataview = new DataView(buffer);
5519
5649
  }
5520
5650
  _createClass$3(RTCDataView2, [{
@@ -5916,7 +6046,7 @@ if (typeof self !== "undefined" && self.constructor.name === "DedicatedWorkerGlo
5916
6046
  transformer.readable.pipeThrough(transform).pipeTo(event.transformer.writable);
5917
6047
  });
5918
6048
  }
5919
- var encodedJs = "IWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBlPXtnZXROQUxVbml0czpmdW5jdGlvbih0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdO2lmKHQubGVuZ3RoLXQucG9zaXRpb248NClyZXR1cm5bXTt2YXIgcj10LnBvc2l0aW9uO3JldHVybiAxPT09dC5nZXRJbnQzMihyKXx8MD09PXQuZ2V0SW50MTYocikmJjE9PT10LmdldEludDgocisyKT9lLmdldEFubmV4Yk5hbHModCxuKTplLmdldEF2Y2NOYWxzKHQsbil9LGdldEFubmV4Yk5hbHM6ZnVuY3Rpb24odCxuKXtmb3IodmFyIHI9W10saT1lLmdldEhlYWRlclBvc2l0aW9uQW5uZXhCKHQpLGE9aS5wb3Msbz1hO2E8dC5sZW5ndGgtNDspe3ZhciB1PW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKGEsYStpLmhlYWRlckxlbmd0aCkpO2kucG9zPT09dC5wb3NpdGlvbiYmdC5za2lwKGkuaGVhZGVyTGVuZ3RoKSxvPShpPWUuZ2V0SGVhZGVyUG9zaXRpb25Bbm5leEIodCkpLnBvczt2YXIgcz17aGVhZGVyOnUsYm9keTpuZXcgVWludDhBcnJheSh0LmJ1ZmZlci5zbGljZShhK3UuYnl0ZUxlbmd0aCxvKSksdHlwZTotMX07bj9lLmFuYWx5c2VIMjY1TmFsKHMpOmUuYW5hbHlzZU5hbChzKSwocy50eXBlPD05fHxuJiZzLnR5cGU8PTQwKSYmMCE9PXMudHlwZSYmci5wdXNoKHMpLHQuc2tpcChvLXQucG9zaXRpb24pLGE9b31yZXR1cm4gcn0sZ2V0QXZjY05hbHM6ZnVuY3Rpb24odCxuKXtmb3IodmFyIHI9W107dC5wb3NpdGlvbjx0Lmxlbmd0aC00Oyl7dmFyIGk9dC5nZXRJbnQzMih0LnBvc2l0aW9uKTtpZighKHQubGVuZ3RoLXQucG9zaXRpb24+PWkpKWJyZWFrO3ZhciBhPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKHQucG9zaXRpb24sdC5wb3NpdGlvbis0KSk7dC5za2lwKDQpO3ZhciBvPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKHQucG9zaXRpb24sdC5wb3NpdGlvbitpKSk7dC5za2lwKGkpO3ZhciB1PXtoZWFkZXI6YSxib2R5Om8sdHlwZTotMX07bj9lLmFuYWx5c2VIMjY1TmFsKHUpOmUuYW5hbHlzZU5hbCh1KSx1LnR5cGU8PTkmJjAhPT11LnR5cGUmJnIucHVzaCh1KX1yZXR1cm4gcn0sYW5hbHlzZU5hbDpmdW5jdGlvbihlKXt2YXIgdD0zMSZlLmJvZHlbMF07c3dpdGNoKGUudHlwZT10LHQpe2Nhc2UgMTplLm5kcj0hMDticmVhaztjYXNlIDU6ZS5pZHI9ITA7YnJlYWs7Y2FzZSA2OmUuc2VpPSEwO2JyZWFrO2Nhc2UgNzplLnNwcz0hMDticmVhaztjYXNlIDg6ZS5wcHM9ITB9fSxhbmFseXNlSDI2NU5hbDpmdW5jdGlvbihlKXt2YXIgdD0oMTI2JmUuYm9keVswXSk+PjE7c3dpdGNoKGUudHlwZT10LHQpe2Nhc2UgMzk6Y2FzZSA0MDplLnNlaT0hMH19LGdldEhlYWRlclBvc2l0aW9uQW5uZXhCOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLnBvc2l0aW9uLG49MCxyPWUubGVuZ3RoOzMhPT1uJiY0IT09biYmdDxyLTQ7KTA9PT1lLmdldEludDE2KHQpPzE9PT1lLmdldEludDE2KHQrMik/bj00OjE9PT1lLmdldEludDgodCsyKT9uPTM6dCsrOnQrKztyZXR1cm4gdD09PXItNCYmKDA9PT1lLmdldEludDE2KHQpPzE9PT1lLmdldEludDE2KHQrMik/bj00OnQ9cjoodCsrLDA9PT1lLmdldEludDE2KHQpJiYxPT09ZS5nZXRJbnQ4KHQpP249Mzp0PXIpKSx7cG9zOnQsaGVhZGVyTGVuZ3RoOm59fSxpc0gyNjVWaWRlb0ZyYW1lOmZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuKChudWxsPT09KHQ9ZS5nZXRNZXRhZGF0YSl8fHZvaWQgMD09PXR8fG51bGw9PT0obj10LmNhbGwoZSkpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLm1pbWVUeXBlKXx8IiIpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoImgyNjUiKX19O2Z1bmN0aW9uIHQoZSl7cmV0dXJuKHQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9KShlKX1mdW5jdGlvbiBuKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBpPXRbbl07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITEsaS5jb25maWd1cmFibGU9ITAsInZhbHVlImluIGkmJihpLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyKGkua2V5KSxpKX19ZnVuY3Rpb24gcihlKXt2YXIgdD1mdW5jdGlvbihlLHQpe2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWUpcmV0dXJuIGU7dmFyIG49ZVtTeW1ib2wudG9QcmltaXRpdmVdO2lmKHZvaWQgMCE9PW4pe3ZhciByPW4uY2FsbChlLHR8fCJkZWZhdWx0Iik7aWYoIm9iamVjdCIhPXR5cGVvZiByKXJldHVybiByO3Rocm93IG5ldyBUeXBlRXJyb3IoIkBAdG9QcmltaXRpdmUgbXVzdCByZXR1cm4gYSBwcmltaXRpdmUgdmFsdWUuIil9cmV0dXJuKCJzdHJpbmciPT09dD9TdHJpbmc6TnVtYmVyKShlKX0oZSwic3RyaW5nIik7cmV0dXJuInN5bWJvbCI9PXR5cGVvZiB0P3Q6U3RyaW5nKHQpfXZhciBpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0KXt2YXIgbixpLGE7IWZ1bmN0aW9uKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsZSksbj10aGlzLGE9MCwoaT1yKGk9Il9wb3NpdGlvbiIpKWluIG4/T2JqZWN0LmRlZmluZVByb3BlcnR5KG4saSx7dmFsdWU6YSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOm5baV09YSx0aGlzLl9kYXRhdmlldz1uZXcgRGF0YVZpZXcodCl9dmFyIHQsaSxhO3JldHVybiB0PWUsYT1be2tleToicmVhZEJ5dGUiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtzd2l0Y2godCl7Y2FzZSAxOnI9bj9lLmdldEludDgoZS5wb3NpdGlvbik6ZS5nZXRVaW50OChlLnBvc2l0aW9uKTticmVhaztjYXNlIDI6cj1uP2UuZ2V0SW50MTYoZS5wb3NpdGlvbik6ZS5nZXRVaW50MTYoZS5wb3NpdGlvbik7YnJlYWs7Y2FzZSAzOmlmKG4pdGhyb3cgbmV3IEVycm9yKCJub3Qgc3VwcG9ydGVkIGZvciByZWFkQnl0ZSAzIik7cj1lLmdldFVpbnQ4KGUucG9zaXRpb24pPDwxNixyfD1lLmdldFVpbnQ4KGUucG9zaXRpb24rMSk8PDgscnw9ZS5nZXRVaW50OChlLnBvc2l0aW9uKzIpO2JyZWFrO2Nhc2UgNDpyPW4/ZS5nZXRJbnQzMihlLnBvc2l0aW9uKTplLmdldFVpbnQzMihlLnBvc2l0aW9uKTticmVhaztjYXNlIDg6aWYobil0aHJvdyBuZXcgRXJyb3IoIm5vdCBzdXBwb3J0ZWQgZm9yIHJlYWRCb2R5IDgiKTtyPWUuZ2V0VWludDMyKGUucG9zaXRpb24pPDwzMixyfD1lLmdldFVpbnQzMihlLnBvc2l0aW9uKzQpO2JyZWFrO2RlZmF1bHQ6cj0iIn1yZXR1cm4gZS5wb3NpdGlvbis9dCxyfX1dLChpPVt7a2V5OiJsZW5ndGgiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RofX0se2tleToiYnVmZmVyIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YXZpZXcuYnVmZmVyfX0se2tleToicG9zaXRpb24iLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3NpdGlvbn0sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX3Bvc2l0aW9uPWV9fSx7a2V5OiJiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnBvc2l0aW9uLT1lfX0se2tleToiZ2V0VWludDgiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9kYXRhdmlldy5nZXRVaW50OChlKX19LHtrZXk6ImdldEludDgiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9kYXRhdmlldy5nZXRJbnQ4KGUpfX0se2tleToiZ2V0SW50MTYiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9kYXRhdmlldy5nZXRJbnQxNihlKX19LHtrZXk6ImdldFVpbnQxNiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2RhdGF2aWV3LmdldFVpbnQxNihlKX19LHtrZXk6ImdldFVpbnQzMiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2RhdGF2aWV3LmdldFVpbnQzMihlKX19LHtrZXk6ImdldEludDMyIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZGF0YXZpZXcuZ2V0SW50MzIoZSl9fSx7a2V5OiJza2lwIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIG49TWF0aC5mbG9vcih0LzQpLHI9dCU0LGk9MDtpPG47aSsrKWUucmVhZEJ5dGUodGhpcyw0KTtyPjAmJmUucmVhZEJ5dGUodGhpcyxyKX19LHtrZXk6InJlYWRVaW50OCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDEpfX0se2tleToicmVhZFVpbnQxNiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDIpfX0se2tleToicmVhZFVpbnQyNCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDMpfX0se2tleToicmVhZFVpbnQzMiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDQpfX0se2tleToicmVhZFVpbnQ2NCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDgpfX0se2tleToicmVhZEludDgiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGUucmVhZEJ5dGUodGhpcywxLCEwKX19LHtrZXk6InJlYWRJbnQxNiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDIsITApfX0se2tleToicmVhZEludDMyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBlLnJlYWRCeXRlKHRoaXMsNCwhMCl9fSx7a2V5OiJ3cml0ZVVpbnQzMiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBVaW50OEFycmF5KFtlPj4+MjQmMjU1LGU+Pj4xNiYyNTUsZT4+PjgmMjU1LDI1NSZlXSl9fV0pJiZuKHQucHJvdG90eXBlLGkpLGEmJm4odCxhKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlfSgpO2Z1bmN0aW9uIGEoZSxuKXtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bltyXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMSxpLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gaSYmKGkud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLChhPWkua2V5LG89dm9pZCAwLG89ZnVuY3Rpb24oZSxuKXtpZigib2JqZWN0IiE9PXQoZSl8fG51bGw9PT1lKXJldHVybiBlO3ZhciByPWVbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZih2b2lkIDAhPT1yKXt2YXIgaT1yLmNhbGwoZSxufHwiZGVmYXVsdCIpO2lmKCJvYmplY3QiIT09dChpKSlyZXR1cm4gaTt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PW4/U3RyaW5nOk51bWJlcikoZSl9KGEsInN0cmluZyIpLCJzeW1ib2wiPT09dChvKT9vOlN0cmluZyhvKSksaSl9dmFyIGEsb31mdW5jdGlvbiBvKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO3JldHVybihlW3RdPDwyND4+PjApKyhlW3QrMV08PDE2KSsoZVt0KzJdPDw4KSsoZVt0KzNdfHwwKX12YXIgdT1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXshZnVuY3Rpb24oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxlKX12YXIgdCxuLHI7cmV0dXJuIHQ9ZSxyPVt7a2V5OiJwYXJzZUFubmV4QiIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ieXRlTGVuZ3RoLTEsbj0wO2Rve2lmKDAhPT1lW3RdKWJyZWFrO24rKyx0LS19d2hpbGUodD4wKTtuPj0zJiYoZT1lLnN1YmFycmF5KDAsdCsxKSk7Zm9yKHZhciByPWUubGVuZ3RoLGk9MixhPTA7bnVsbCE9PWVbaV0mJnZvaWQgMCE9PWVbaV0mJjEhPT1lW2ldOylpKys7aWYoKGE9MisgKytpKT49cilyZXR1cm5bXTtmb3IodmFyIG89W107YTxyOylzd2l0Y2goZVthXSl7Y2FzZSAwOmlmKDAhPT1lW2EtMV0pe2ErPTI7YnJlYWt9aWYoMCE9PWVbYS0yXSl7YSsrO2JyZWFrfWlmKGE8ci0xJiYxIT09ZVthKzFdKXthKys7YnJlYWt9aSE9PWEtMiYmby5wdXNoKGUuc3ViYXJyYXkoaSxhLTIpKTtkb3thKyt9d2hpbGUoMSE9PWVbYV0mJmE8cik7YT0oaT1hKzEpKzI7YnJlYWs7Y2FzZSAxOmlmKDAhPT1lW2EtMV18fDAhPT1lW2EtMl0pe2ErPTM7YnJlYWt9aSE9PWEtMiYmby5wdXNoKGUuc3ViYXJyYXkoaSxhLTIpKSxhPShpPWErMSkrMjticmVhaztkZWZhdWx0OmErPTN9cmV0dXJuIGk8ciYmby5wdXNoKGUuc3ViYXJyYXkoaSkpLG99fSx7a2V5OiJwYXJzZUF2Y0MiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTo0O2lmKCEoZS5sZW5ndGg8NCkpe2Zvcih2YXIgbixyPWUubGVuZ3RoLGk9W10sYT0wO2ErdDxyOylpZihuPW8oZSxhKSwzPT09dCYmKG4+Pj49OCksYSs9dCxuKXtpZihhK24+cilicmVhaztpLnB1c2goZS5zdWJhcnJheShhLGErbikpLGErPW59cmV0dXJuIGl9fX0se2tleToicGFyc2VTRUkiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWUubGVuZ3RoLHI9dD8yOjEsaT0wLGE9MCxvPSIiOzI1NT09PWVbcl07KWkrPTI1NSxyKys7Zm9yKGkrPWVbcisrXTsyNTU9PT1lW3JdOylhKz0yNTUscisrO2lmKGErPWVbcisrXSw1PT09aSYmbj5yKzE2KWZvcih2YXIgdT0wO3U8MTY7dSsrKW8rPWVbcl0udG9TdHJpbmcoMTYpLHIrKztyZXR1cm57cGF5bG9hZDplLnN1YmFycmF5KHIscithKSx0eXBlOmksc2l6ZTphLHV1aWQ6b319fSx7a2V5OiJyZW1vdmVFUEIiLHZhbHVlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmJ5dGVMZW5ndGgsbj1bXSxyPTE7cjx0LTI7KTA9PT1lW3JdJiYwPT09ZVtyKzFdJiYzPT09ZVtyKzJdPyhuLnB1c2gocisyKSxyKz0yKTpyKys7aWYoIW4ubGVuZ3RoKXJldHVybiBlO3ZhciBpPXQtbi5sZW5ndGgsYT1uZXcgVWludDhBcnJheShpKSxvPTA7Zm9yKHI9MDtyPGk7bysrLHIrKylvPT09blswXSYmKG8rKyxuLnNoaWZ0KCkpLGFbcl09ZVtvXTtyZXR1cm4gYX19XSwobj1udWxsKSYmYSh0LnByb3RvdHlwZSxuKSxyJiZhKHQsciksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksZX0oKTsidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJiJEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZSI9PT1zZWxmLmNvbnN0cnVjdG9yLm5hbWUmJnNlbGYuYWRkRXZlbnRMaXN0ZW5lcigicnRjdHJhbnNmb3JtIiwoZnVuY3Rpb24odCl7dmFyIG4scj10LnRyYW5zZm9ybWVyLGE9ci5vcHRpb25zLnBvcnQsbz0obj1mdW5jdGlvbihlKXthLnBvc3RNZXNzYWdlKGUpfSxuZXcgVHJhbnNmb3JtU3RyZWFtKHt0cmFuc2Zvcm06ZnVuY3Rpb24odCxyKXt2YXIgYT1lLmlzSDI2NVZpZGVvRnJhbWUodCk7ZS5nZXROQUxVbml0cyhuZXcgaSh0LmRhdGEpLGEpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKGUuc2VpKXt2YXIgdD11LnBhcnNlU0VJKHUucmVtb3ZlRVBCKGUuYm9keSksITEpO3QmJm4oe2RhdGE6dCxzZWk6e2NvZGU6dC50eXBlLGNvbnRlbnQ6dC5wYXlsb2FkfX0pfX0pKSxyLmVucXVldWUodCl9fSkpO3IucmVhZGFibGUucGlwZVRocm91Z2gobykucGlwZVRvKHQudHJhbnNmb3JtZXIud3JpdGFibGUpfSkpfSgpOwo=";
6049
+ var encodedJs = "IWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBlPXtnZXROQUxVbml0czpmdW5jdGlvbih0KXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdO2lmKHQubGVuZ3RoLXQucG9zaXRpb248NClyZXR1cm5bXTt2YXIgcj10LnBvc2l0aW9uO3JldHVybiAxPT09dC5nZXRJbnQzMihyKXx8MD09PXQuZ2V0SW50MTYocikmJjE9PT10LmdldEludDgocisyKT9lLmdldEFubmV4Yk5hbHModCxuKTplLmdldEF2Y2NOYWxzKHQsbil9LGdldEFubmV4Yk5hbHM6ZnVuY3Rpb24odCxuKXtmb3IodmFyIHI9W10saT1lLmdldEhlYWRlclBvc2l0aW9uQW5uZXhCKHQpLGE9aS5wb3Msbz1hO2E8dC5sZW5ndGgtNDspe3ZhciB1PW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKGEsYStpLmhlYWRlckxlbmd0aCkpO2kucG9zPT09dC5wb3NpdGlvbiYmdC5za2lwKGkuaGVhZGVyTGVuZ3RoKSxvPShpPWUuZ2V0SGVhZGVyUG9zaXRpb25Bbm5leEIodCkpLnBvczt2YXIgcz17aGVhZGVyOnUsYm9keTpuZXcgVWludDhBcnJheSh0LmJ1ZmZlci5zbGljZShhK3UuYnl0ZUxlbmd0aCxvKSksdHlwZTotMX07bj9lLmFuYWx5c2VIMjY1TmFsKHMpOmUuYW5hbHlzZU5hbChzKSwocy50eXBlPD05fHxuJiZzLnR5cGU8PTQwKSYmMCE9PXMudHlwZSYmci5wdXNoKHMpLHQuc2tpcChvLXQucG9zaXRpb24pLGE9b31yZXR1cm4gcn0sZ2V0QXZjY05hbHM6ZnVuY3Rpb24odCxuKXtmb3IodmFyIHI9W107dC5wb3NpdGlvbjx0Lmxlbmd0aC00Oyl7dmFyIGk9dC5nZXRJbnQzMih0LnBvc2l0aW9uKTtpZighKHQubGVuZ3RoLXQucG9zaXRpb24+PWkpKWJyZWFrO3ZhciBhPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKHQucG9zaXRpb24sdC5wb3NpdGlvbis0KSk7dC5za2lwKDQpO3ZhciBvPW5ldyBVaW50OEFycmF5KHQuYnVmZmVyLnNsaWNlKHQucG9zaXRpb24sdC5wb3NpdGlvbitpKSk7dC5za2lwKGkpO3ZhciB1PXtoZWFkZXI6YSxib2R5Om8sdHlwZTotMX07bj9lLmFuYWx5c2VIMjY1TmFsKHUpOmUuYW5hbHlzZU5hbCh1KSx1LnR5cGU8PTkmJjAhPT11LnR5cGUmJnIucHVzaCh1KX1yZXR1cm4gcn0sYW5hbHlzZU5hbDpmdW5jdGlvbihlKXt2YXIgdD0zMSZlLmJvZHlbMF07c3dpdGNoKGUudHlwZT10LHQpe2Nhc2UgMTplLm5kcj0hMDticmVhaztjYXNlIDU6ZS5pZHI9ITA7YnJlYWs7Y2FzZSA2OmUuc2VpPSEwO2JyZWFrO2Nhc2UgNzplLnNwcz0hMDticmVhaztjYXNlIDg6ZS5wcHM9ITB9fSxhbmFseXNlSDI2NU5hbDpmdW5jdGlvbihlKXt2YXIgdD0oMTI2JmUuYm9keVswXSk+PjE7c3dpdGNoKGUudHlwZT10LHQpe2Nhc2UgMzk6Y2FzZSA0MDplLnNlaT0hMH19LGdldEhlYWRlclBvc2l0aW9uQW5uZXhCOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLnBvc2l0aW9uLG49MCxyPWUubGVuZ3RoOzMhPT1uJiY0IT09biYmdDxyLTQ7KTA9PT1lLmdldEludDE2KHQpPzE9PT1lLmdldEludDE2KHQrMik/bj00OjE9PT1lLmdldEludDgodCsyKT9uPTM6dCsrOnQrKztyZXR1cm4gdD09PXItNCYmKDA9PT1lLmdldEludDE2KHQpPzE9PT1lLmdldEludDE2KHQrMik/bj00OnQ9cjoodCsrLDA9PT1lLmdldEludDE2KHQpJiYxPT09ZS5nZXRJbnQ4KHQpP249Mzp0PXIpKSx7cG9zOnQsaGVhZGVyTGVuZ3RoOm59fSxpc0gyNjVWaWRlb0ZyYW1lOmZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuKChudWxsPT09KHQ9ZS5nZXRNZXRhZGF0YSl8fHZvaWQgMD09PXR8fG51bGw9PT0obj10LmNhbGwoZSkpfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLm1pbWVUeXBlKXx8IiIpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoImgyNjUiKX19O2Z1bmN0aW9uIHQoZSl7cmV0dXJuKHQ9ImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmInN5bWJvbCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24oZSl7cmV0dXJuIHR5cGVvZiBlfTpmdW5jdGlvbihlKXtyZXR1cm4gZSYmImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmZS5jb25zdHJ1Y3Rvcj09PVN5bWJvbCYmZSE9PVN5bWJvbC5wcm90b3R5cGU/InN5bWJvbCI6dHlwZW9mIGV9KShlKX1mdW5jdGlvbiBuKGUsdCl7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07ci5lbnVtZXJhYmxlPXIuZW51bWVyYWJsZXx8ITEsci5jb25maWd1cmFibGU9ITAsInZhbHVlImluIHImJihyLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwoaT1yLmtleSxhPXZvaWQgMCwic3ltYm9sIj09dHlwZW9mKGE9ZnVuY3Rpb24oZSx0KXtpZigib2JqZWN0IiE9dHlwZW9mIGV8fG51bGw9PT1lKXJldHVybiBlO3ZhciBuPWVbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZih2b2lkIDAhPT1uKXt2YXIgcj1uLmNhbGwoZSx0fHwiZGVmYXVsdCIpO2lmKCJvYmplY3QiIT10eXBlb2YgcilyZXR1cm4gcjt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PXQ/U3RyaW5nOk51bWJlcikoZSl9KGksInN0cmluZyIpKT9hOlN0cmluZyhhKSkscil9dmFyIGksYX12YXIgcj1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7IWZ1bmN0aW9uKGUsdCl7aWYoIShlIGluc3RhbmNlb2YgdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIil9KHRoaXMsZSksdGhpcy5fcG9zaXRpb249MCx0aGlzLl9kYXRhdmlldz1uZXcgRGF0YVZpZXcodCl9dmFyIHQscixpO3JldHVybiB0PWUsaT1be2tleToicmVhZEJ5dGUiLHZhbHVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtzd2l0Y2godCl7Y2FzZSAxOnI9bj9lLmdldEludDgoZS5wb3NpdGlvbik6ZS5nZXRVaW50OChlLnBvc2l0aW9uKTticmVhaztjYXNlIDI6cj1uP2UuZ2V0SW50MTYoZS5wb3NpdGlvbik6ZS5nZXRVaW50MTYoZS5wb3NpdGlvbik7YnJlYWs7Y2FzZSAzOmlmKG4pdGhyb3cgbmV3IEVycm9yKCJub3Qgc3VwcG9ydGVkIGZvciByZWFkQnl0ZSAzIik7cj1lLmdldFVpbnQ4KGUucG9zaXRpb24pPDwxNixyfD1lLmdldFVpbnQ4KGUucG9zaXRpb24rMSk8PDgscnw9ZS5nZXRVaW50OChlLnBvc2l0aW9uKzIpO2JyZWFrO2Nhc2UgNDpyPW4/ZS5nZXRJbnQzMihlLnBvc2l0aW9uKTplLmdldFVpbnQzMihlLnBvc2l0aW9uKTticmVhaztjYXNlIDg6aWYobil0aHJvdyBuZXcgRXJyb3IoIm5vdCBzdXBwb3J0ZWQgZm9yIHJlYWRCb2R5IDgiKTtyPWUuZ2V0VWludDMyKGUucG9zaXRpb24pPDwzMixyfD1lLmdldFVpbnQzMihlLnBvc2l0aW9uKzQpO2JyZWFrO2RlZmF1bHQ6cj0iIn1yZXR1cm4gZS5wb3NpdGlvbis9dCxyfX1dLChyPVt7a2V5OiJsZW5ndGgiLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJ1ZmZlci5ieXRlTGVuZ3RofX0se2tleToiYnVmZmVyIixnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YXZpZXcuYnVmZmVyfX0se2tleToicG9zaXRpb24iLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wb3NpdGlvbn0sc2V0OmZ1bmN0aW9uKGUpe3RoaXMuX3Bvc2l0aW9uPWV9fSx7a2V5OiJiYWNrIix2YWx1ZTpmdW5jdGlvbihlKXt0aGlzLnBvc2l0aW9uLT1lfX0se2tleToiZ2V0VWludDgiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9kYXRhdmlldy5nZXRVaW50OChlKX19LHtrZXk6ImdldEludDgiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9kYXRhdmlldy5nZXRJbnQ4KGUpfX0se2tleToiZ2V0SW50MTYiLHZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLl9kYXRhdmlldy5nZXRJbnQxNihlKX19LHtrZXk6ImdldFVpbnQxNiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2RhdGF2aWV3LmdldFVpbnQxNihlKX19LHtrZXk6ImdldFVpbnQzMiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuX2RhdGF2aWV3LmdldFVpbnQzMihlKX19LHtrZXk6ImdldEludDMyIix2YWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5fZGF0YXZpZXcuZ2V0SW50MzIoZSl9fSx7a2V5OiJza2lwIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIG49TWF0aC5mbG9vcih0LzQpLHI9dCU0LGk9MDtpPG47aSsrKWUucmVhZEJ5dGUodGhpcyw0KTtyPjAmJmUucmVhZEJ5dGUodGhpcyxyKX19LHtrZXk6InJlYWRVaW50OCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDEpfX0se2tleToicmVhZFVpbnQxNiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDIpfX0se2tleToicmVhZFVpbnQyNCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDMpfX0se2tleToicmVhZFVpbnQzMiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDQpfX0se2tleToicmVhZFVpbnQ2NCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDgpfX0se2tleToicmVhZEludDgiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGUucmVhZEJ5dGUodGhpcywxLCEwKX19LHtrZXk6InJlYWRJbnQxNiIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gZS5yZWFkQnl0ZSh0aGlzLDIsITApfX0se2tleToicmVhZEludDMyIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBlLnJlYWRCeXRlKHRoaXMsNCwhMCl9fSx7a2V5OiJ3cml0ZVVpbnQzMiIsdmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyBVaW50OEFycmF5KFtlPj4+MjQmMjU1LGU+Pj4xNiYyNTUsZT4+PjgmMjU1LDI1NSZlXSl9fV0pJiZuKHQucHJvdG90eXBlLHIpLGkmJm4odCxpKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwicHJvdG90eXBlIix7d3JpdGFibGU6ITF9KSxlfSgpO2Z1bmN0aW9uIGkoZSxuKXtmb3IodmFyIHI9MDtyPG4ubGVuZ3RoO3IrKyl7dmFyIGk9bltyXTtpLmVudW1lcmFibGU9aS5lbnVtZXJhYmxlfHwhMSxpLmNvbmZpZ3VyYWJsZT0hMCwidmFsdWUiaW4gaSYmKGkud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLChhPWkua2V5LG89dm9pZCAwLG89ZnVuY3Rpb24oZSxuKXtpZigib2JqZWN0IiE9PXQoZSl8fG51bGw9PT1lKXJldHVybiBlO3ZhciByPWVbU3ltYm9sLnRvUHJpbWl0aXZlXTtpZih2b2lkIDAhPT1yKXt2YXIgaT1yLmNhbGwoZSxufHwiZGVmYXVsdCIpO2lmKCJvYmplY3QiIT09dChpKSlyZXR1cm4gaTt0aHJvdyBuZXcgVHlwZUVycm9yKCJAQHRvUHJpbWl0aXZlIG11c3QgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlLiIpfXJldHVybigic3RyaW5nIj09PW4/U3RyaW5nOk51bWJlcikoZSl9KGEsInN0cmluZyIpLCJzeW1ib2wiPT09dChvKT9vOlN0cmluZyhvKSksaSl9dmFyIGEsb31mdW5jdGlvbiBhKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTowO3JldHVybihlW3RdPDwyND4+PjApKyhlW3QrMV08PDE2KSsoZVt0KzJdPDw4KSsoZVt0KzNdfHwwKX12YXIgbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXshZnVuY3Rpb24oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24iKX0odGhpcyxlKX12YXIgdCxuLHI7cmV0dXJuIHQ9ZSxyPVt7a2V5OiJwYXJzZUFubmV4QiIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5ieXRlTGVuZ3RoLTEsbj0wO2Rve2lmKDAhPT1lW3RdKWJyZWFrO24rKyx0LS19d2hpbGUodD4wKTtuPj0zJiYoZT1lLnN1YmFycmF5KDAsdCsxKSk7Zm9yKHZhciByPWUubGVuZ3RoLGk9MixhPTA7bnVsbCE9PWVbaV0mJnZvaWQgMCE9PWVbaV0mJjEhPT1lW2ldOylpKys7aWYoKGE9MisgKytpKT49cilyZXR1cm5bXTtmb3IodmFyIG89W107YTxyOylzd2l0Y2goZVthXSl7Y2FzZSAwOmlmKDAhPT1lW2EtMV0pe2ErPTI7YnJlYWt9aWYoMCE9PWVbYS0yXSl7YSsrO2JyZWFrfWlmKGE8ci0xJiYxIT09ZVthKzFdKXthKys7YnJlYWt9aSE9PWEtMiYmby5wdXNoKGUuc3ViYXJyYXkoaSxhLTIpKTtkb3thKyt9d2hpbGUoMSE9PWVbYV0mJmE8cik7YT0oaT1hKzEpKzI7YnJlYWs7Y2FzZSAxOmlmKDAhPT1lW2EtMV18fDAhPT1lW2EtMl0pe2ErPTM7YnJlYWt9aSE9PWEtMiYmby5wdXNoKGUuc3ViYXJyYXkoaSxhLTIpKSxhPShpPWErMSkrMjticmVhaztkZWZhdWx0OmErPTN9cmV0dXJuIGk8ciYmby5wdXNoKGUuc3ViYXJyYXkoaSkpLG99fSx7a2V5OiJwYXJzZUF2Y0MiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTo0O2lmKCEoZS5sZW5ndGg8NCkpe2Zvcih2YXIgbixyPWUubGVuZ3RoLGk9W10sbz0wO28rdDxyOylpZihuPWEoZSxvKSwzPT09dCYmKG4+Pj49OCksbys9dCxuKXtpZihvK24+cilicmVhaztpLnB1c2goZS5zdWJhcnJheShvLG8rbikpLG8rPW59cmV0dXJuIGl9fX0se2tleToicGFyc2VTRUkiLHZhbHVlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWUubGVuZ3RoLHI9dD8yOjEsaT0wLGE9MCxvPSIiOzI1NT09PWVbcl07KWkrPTI1NSxyKys7Zm9yKGkrPWVbcisrXTsyNTU9PT1lW3JdOylhKz0yNTUscisrO2lmKGErPWVbcisrXSw1PT09aSYmbj5yKzE2KWZvcih2YXIgdT0wO3U8MTY7dSsrKW8rPWVbcl0udG9TdHJpbmcoMTYpLHIrKztyZXR1cm57cGF5bG9hZDplLnN1YmFycmF5KHIscithKSx0eXBlOmksc2l6ZTphLHV1aWQ6b319fSx7a2V5OiJyZW1vdmVFUEIiLHZhbHVlOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1lLmJ5dGVMZW5ndGgsbj1bXSxyPTE7cjx0LTI7KTA9PT1lW3JdJiYwPT09ZVtyKzFdJiYzPT09ZVtyKzJdPyhuLnB1c2gocisyKSxyKz0yKTpyKys7aWYoIW4ubGVuZ3RoKXJldHVybiBlO3ZhciBpPXQtbi5sZW5ndGgsYT1uZXcgVWludDhBcnJheShpKSxvPTA7Zm9yKHI9MDtyPGk7bysrLHIrKylvPT09blswXSYmKG8rKyxuLnNoaWZ0KCkpLGFbcl09ZVtvXTtyZXR1cm4gYX19XSwobj1udWxsKSYmaSh0LnByb3RvdHlwZSxuKSxyJiZpKHQsciksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsInByb3RvdHlwZSIse3dyaXRhYmxlOiExfSksZX0oKTsidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJiJEZWRpY2F0ZWRXb3JrZXJHbG9iYWxTY29wZSI9PT1zZWxmLmNvbnN0cnVjdG9yLm5hbWUmJnNlbGYuYWRkRXZlbnRMaXN0ZW5lcigicnRjdHJhbnNmb3JtIiwoZnVuY3Rpb24odCl7dmFyIG4saT10LnRyYW5zZm9ybWVyLGE9aS5vcHRpb25zLnBvcnQsdT0obj1mdW5jdGlvbihlKXthLnBvc3RNZXNzYWdlKGUpfSxuZXcgVHJhbnNmb3JtU3RyZWFtKHt0cmFuc2Zvcm06ZnVuY3Rpb24odCxpKXt2YXIgYT1lLmlzSDI2NVZpZGVvRnJhbWUodCk7ZS5nZXROQUxVbml0cyhuZXcgcih0LmRhdGEpLGEpLmZvckVhY2goKGZ1bmN0aW9uKGUpe2lmKGUuc2VpKXt2YXIgdD1vLnBhcnNlU0VJKG8ucmVtb3ZlRVBCKGUuYm9keSksITEpO3QmJm4oe2RhdGE6dCxzZWk6e2NvZGU6dC50eXBlLGNvbnRlbnQ6dC5wYXlsb2FkfX0pfX0pKSxpLmVucXVldWUodCl9fSkpO2kucmVhZGFibGUucGlwZVRocm91Z2godSkucGlwZVRvKHQudHJhbnNmb3JtZXIud3JpdGFibGUpfSkpfSgpOwo=";
5920
6050
  var blob = typeof window !== "undefined" && window.Blob && new Blob([atob(encodedJs)], {
5921
6051
  type: "text/javascript;charset=utf-8"
5922
6052
  });
@@ -5930,21 +6060,19 @@ function WorkerWrapper() {
5930
6060
  objURL && (window.URL || window.webkitURL).revokeObjectURL(objURL);
5931
6061
  }
5932
6062
  }
5933
- var AudioStallObserver = /* @__PURE__ */ function() {
5934
- function AudioStallObserver2() {
5935
- _classCallCheck$3(this, AudioStallObserver2);
5936
- _defineProperty$2(this, "_audioStallTimer", null);
5937
- _defineProperty$2(this, "_preSample", null);
5938
- _defineProperty$2(this, "_isStallInPreReportEnd", false);
5939
- _defineProperty$2(this, "_stallList", []);
5940
- _defineProperty$2(this, "_audioTransceiver", null);
5941
- }
5942
- _createClass$3(AudioStallObserver2, [{
6063
+ var _AudioStallObserver = /* @__PURE__ */ function() {
6064
+ function _AudioStallObserver2() {
6065
+ _classCallCheck$3(this, _AudioStallObserver2);
6066
+ this._isStallInPreReportEnd = false;
6067
+ this._stallList = [];
6068
+ this._audioTransceiver = null;
6069
+ }
6070
+ _createClass$3(_AudioStallObserver2, [{
5943
6071
  key: "start",
5944
6072
  value: function start(transceiver) {
5945
6073
  this.stop();
5946
6074
  this._audioTransceiver = transceiver;
5947
- if (AudioStallObserver2.interval >= 100) {
6075
+ if (_AudioStallObserver2.interval >= 100) {
5948
6076
  this._startStallCountInterval();
5949
6077
  }
5950
6078
  }
@@ -5954,7 +6082,7 @@ var AudioStallObserver = /* @__PURE__ */ function() {
5954
6082
  this._stallList = [];
5955
6083
  if (this._audioStallTimer) {
5956
6084
  clearTimeout(this._audioStallTimer);
5957
- this._audioStallTimer = null;
6085
+ delete this._audioStallTimer;
5958
6086
  }
5959
6087
  }
5960
6088
  }, {
@@ -6020,12 +6148,12 @@ var AudioStallObserver = /* @__PURE__ */ function() {
6020
6148
  switch (_context2.prev = _context2.next) {
6021
6149
  case 0:
6022
6150
  clearTimeout(_this._audioStallTimer);
6023
- _this._audioStallTimer = null;
6151
+ delete _this._audioStallTimer;
6024
6152
  _context2.next = 4;
6025
6153
  return _this._audioStallCount();
6026
6154
  case 4:
6027
6155
  if (!_this._audioStallTimer) {
6028
- _this._audioStallTimer = setTimeout(loop, AudioStallObserver2.interval);
6156
+ _this._audioStallTimer = setTimeout(loop, _AudioStallObserver2.interval);
6029
6157
  }
6030
6158
  case 5:
6031
6159
  case "end":
@@ -6037,7 +6165,7 @@ var AudioStallObserver = /* @__PURE__ */ function() {
6037
6165
  return _ref.apply(this, arguments);
6038
6166
  };
6039
6167
  }();
6040
- this._audioStallTimer = setTimeout(loop, AudioStallObserver2.interval);
6168
+ this._audioStallTimer = setTimeout(loop, _AudioStallObserver2.interval);
6041
6169
  }
6042
6170
  }, {
6043
6171
  key: "_audioStallCount",
@@ -6048,7 +6176,7 @@ var AudioStallObserver = /* @__PURE__ */ function() {
6048
6176
  while (1)
6049
6177
  switch (_context3.prev = _context3.next) {
6050
6178
  case 0:
6051
- if (!(this._preSample && Date.now() - this._preSample.ts < AudioStallObserver2.interval * 0.5)) {
6179
+ if (!(this._preSample && Date.now() - this._preSample.ts < _AudioStallObserver2.interval * 0.5)) {
6052
6180
  _context3.next = 2;
6053
6181
  break;
6054
6182
  }
@@ -6102,7 +6230,7 @@ var AudioStallObserver = /* @__PURE__ */ function() {
6102
6230
  _inboundRTP3 = inboundRTP, concealedSamples = _inboundRTP3.concealedSamples, totalSamplesReceived = _inboundRTP3.totalSamplesReceived;
6103
6231
  interval_concealed_samples = concealedSamples - this._preSample.concealedSamples;
6104
6232
  interval_samples_received = totalSamplesReceived - this._preSample.totalSamplesReceived;
6105
- is_stall = interval_concealed_samples >= 0 && interval_samples_received >= 0 && interval_concealed_samples >= AudioStallObserver2.ratio * interval_samples_received;
6233
+ is_stall = interval_concealed_samples >= 0 && interval_samples_received >= 0 && interval_concealed_samples >= _AudioStallObserver2.ratio * interval_samples_received;
6106
6234
  this._stallList.push({
6107
6235
  concealed: interval_concealed_samples,
6108
6236
  received: interval_samples_received,
@@ -6130,10 +6258,11 @@ var AudioStallObserver = /* @__PURE__ */ function() {
6130
6258
  return _audioStallCount;
6131
6259
  }()
6132
6260
  }]);
6133
- return AudioStallObserver2;
6261
+ return _AudioStallObserver2;
6134
6262
  }();
6135
- _defineProperty$2(AudioStallObserver, "interval", 100);
6136
- _defineProperty$2(AudioStallObserver, "ratio", 0.6);
6263
+ var AudioStallObserver = _AudioStallObserver;
6264
+ AudioStallObserver.interval = 100;
6265
+ AudioStallObserver.ratio = 0.6;
6137
6266
  var computeStallInfo = function computeStallInfo2(list, times, isStallInPreEnd) {
6138
6267
  var _list$;
6139
6268
  var res = {
@@ -6202,13 +6331,22 @@ var VideoStallObserver = /* @__PURE__ */ function() {
6202
6331
  function VideoStallObserver2() {
6203
6332
  var _this = this;
6204
6333
  _classCallCheck$3(this, VideoStallObserver2);
6205
- _defineProperty$2(this, "_handleVisibilityChange", function() {
6334
+ this._videoInWaiting100ms = false;
6335
+ this._videoInWaiting500ms = false;
6336
+ this._pauseStart = 0;
6337
+ this._pauseDuration = 0;
6338
+ this._stallTimeThreshold = {
6339
+ stall500ms: isSafari() || isFirefox() ? 550 : 500,
6340
+ stall100ms: 100
6341
+ };
6342
+ this._support100msStall = checkVideoFrameCallback();
6343
+ this._handleVisibilityChange = function() {
6206
6344
  if (document.visibilityState === "hidden") {
6207
6345
  _this._framePause();
6208
6346
  }
6209
- });
6210
- _defineProperty$2(this, "_framePause", function() {
6211
- if (_this._prePts) {
6347
+ };
6348
+ this._framePause = function() {
6349
+ if (_this._prePts && _this._stallList) {
6212
6350
  var current = performance.now();
6213
6351
  var delta = current - _this._prePts;
6214
6352
  _this._stallList.push({
@@ -6217,23 +6355,7 @@ var VideoStallObserver = /* @__PURE__ */ function() {
6217
6355
  });
6218
6356
  _this._prePts = void 0;
6219
6357
  }
6220
- });
6221
- this._removeHandler = void 0;
6222
- this._remotePlayPauseHandler = void 0;
6223
- this._prePts = void 0;
6224
- this._stallList = void 0;
6225
- this._videoInWaiting100ms = false;
6226
- this._videoInWaiting500ms = false;
6227
- this._isPaused = void 0;
6228
- this._pauseStart = 0;
6229
- this._pauseDuration = 0;
6230
- this._requestVideoFrameCallbackTimer = void 0;
6231
- this._player = void 0;
6232
- this._stallTimeThreshold = {
6233
- stall500ms: isSafari() || isFirefox() ? 550 : 500,
6234
- stall100ms: 100
6235
6358
  };
6236
- this._support100msStall = checkVideoFrameCallback();
6237
6359
  }
6238
6360
  _createClass$3(VideoStallObserver2, [{
6239
6361
  key: "start",
@@ -6271,7 +6393,7 @@ var VideoStallObserver = /* @__PURE__ */ function() {
6271
6393
  player.removeEventListener("play", handlePlay);
6272
6394
  };
6273
6395
  document.addEventListener("visibilitychange", this._handleVisibilityChange);
6274
- document.addEventListener("pagehide", this._framePause());
6396
+ window.addEventListener("pagehide", this._framePause);
6275
6397
  }
6276
6398
  }, {
6277
6399
  key: "stop",
@@ -6290,7 +6412,7 @@ var VideoStallObserver = /* @__PURE__ */ function() {
6290
6412
  this._videoInWaiting100ms = false;
6291
6413
  this._videoInWaiting500ms = false;
6292
6414
  document.removeEventListener("visibilitychange", this._handleVisibilityChange);
6293
- document.removeEventListener("pagehide", this._framePause());
6415
+ window.removeEventListener("pagehide", this._framePause);
6294
6416
  }
6295
6417
  }, {
6296
6418
  key: "destroy",
@@ -6359,7 +6481,7 @@ var VideoStallObserver = /* @__PURE__ */ function() {
6359
6481
  }
6360
6482
  var _stallInfo$stall = stallInfo.stall, stallDuration500ms = _stallInfo$stall.stallDuration500ms, stallDuration100ms = _stallInfo$stall.stallDuration100ms;
6361
6483
  stallInfo.stall.stallRate500ms = Math.min(Number((stallDuration500ms / interval).toFixed(4)), 1);
6362
- if (this._support100msStall) {
6484
+ if (this._support100msStall && stallDuration100ms) {
6363
6485
  stallInfo.stall.stallRate100ms = Math.min(Number((stallDuration100ms / interval).toFixed(4)), 1);
6364
6486
  } else {
6365
6487
  delete stallInfo.stall.stallRate100ms;
@@ -6525,7 +6647,7 @@ function diffRecvAudioStats(oldStats, newStats) {
6525
6647
  receivedSampleRate: diffNumber(oldStats, newStats, "totalSamplesReceived") / statsInterval,
6526
6648
  concealedSamples: Math.round(diffNumber(oldStats, newStats, "concealedSamples")),
6527
6649
  concealmentEvent: Math.round(diffNumber(oldStats, newStats, "concealmentEvents")),
6528
- e2eDelay: Math.round(newStats.rtt + jitterBufferDelay)
6650
+ e2eDelay: Math.round((newStats.rtt || 0) + jitterBufferDelay)
6529
6651
  };
6530
6652
  }
6531
6653
  function getRecvVideoStats(_x2) {
@@ -6596,12 +6718,16 @@ function diffRecvVideoStats(oldStats, newStats) {
6596
6718
  var nackCount = diffNumber(oldStats, newStats, "nackCount");
6597
6719
  var packetsReceived = diffNumber(oldStats, newStats, "packetsReceived");
6598
6720
  var jitterBufferDelay = Math.round(diffNumber(oldStats, newStats, "jitterBufferDelay") / diffNumber(oldStats, newStats, "jitterBufferEmittedCount") * 1e3);
6721
+ var newResolution = (newStats.width || 0) * (newStats.height || 0);
6722
+ var oldResolution = (oldStats.width || 0) * (oldStats.height || 0);
6723
+ var abrState = newResolution === 0 || oldResolution === 0 ? "none" : newResolution > oldResolution ? "upgrade" : newResolution < oldResolution ? "degrade" : "none";
6599
6724
  return {
6600
6725
  statsInterval,
6726
+ abrState,
6601
6727
  width: newStats.width || 0,
6602
6728
  height: newStats.height || 0,
6603
6729
  estimatedPlayoutTimestamp: newStats.estimatedPlayoutTimestamp,
6604
- videoLossRate: +(packetsLostDiff / (diffNumber(oldStats, newStats, "packetsReceived") + packetsLostDiff)),
6730
+ videoLossRate: +(packetsLostDiff / (diffNumber(oldStats, newStats, "packetsReceived") + packetsLostDiff)).toFixed(2),
6605
6731
  receivedKBitrate: +(diffNumber(oldStats, newStats, "bytesReceived") * 8 / statsInterval).toFixed(2),
6606
6732
  decoderOutputFrameRate: Math.round(diffNumber(oldStats, newStats, "framesDecoded") * 1e3 / statsInterval),
6607
6733
  receivedFrameRate: Math.round(diffNumber(oldStats, newStats, "framesReceived") * 1e3 / statsInterval),
@@ -6616,7 +6742,7 @@ function diffRecvVideoStats(oldStats, newStats) {
6616
6742
  firCount: diffNumber(oldStats, newStats, "firCount"),
6617
6743
  nackCount,
6618
6744
  pliCount: diffNumber(oldStats, newStats, "pliCount"),
6619
- e2eDelay: Math.round(newStats.rtt + jitterBufferDelay),
6745
+ e2eDelay: Math.round((newStats.rtt || 0) + jitterBufferDelay),
6620
6746
  retransmittedRate: +(nackCount / (packetsReceived + packetsLostDiff)).toFixed(2)
6621
6747
  };
6622
6748
  }
@@ -6649,11 +6775,11 @@ var Quality = {
6649
6775
  DOWN: 6
6650
6776
  };
6651
6777
  var NetworkQuality = /* @__PURE__ */ function() {
6652
- function NetworkQuality2(peer, networkQualityParams) {
6778
+ function NetworkQuality2(_peer, _networkQualityParams) {
6653
6779
  _classCallCheck$3(this, NetworkQuality2);
6654
- _defineProperty$2(this, "_preDownlinkStats", []);
6655
- this._peer = peer;
6656
- this._networkQualityParams = networkQualityParams;
6780
+ this._peer = _peer;
6781
+ this._networkQualityParams = _networkQualityParams;
6782
+ this._preDownlinkStats = [];
6657
6783
  }
6658
6784
  _createClass$3(NetworkQuality2, [{
6659
6785
  key: "getDownlinkQuality",
@@ -6708,11 +6834,11 @@ var NetworkQuality = /* @__PURE__ */ function() {
6708
6834
  } else {
6709
6835
  quality = QosLevel.VBAD;
6710
6836
  }
6711
- if (retransmittedRate > qosQualityParams[QosLevel.BAD].minRetransmittedRate) {
6837
+ if (retransmittedRate > (qosQualityParams[QosLevel.BAD].minRetransmittedRate || 0.5)) {
6712
6838
  quality = Math.max(quality, QosLevel.BAD);
6713
- } else if (retransmittedRate > qosQualityParams[QosLevel.POOR].minRetransmittedRate) {
6839
+ } else if (retransmittedRate > (qosQualityParams[QosLevel.POOR].minRetransmittedRate || 0.35)) {
6714
6840
  quality = Math.max(quality, QosLevel.POOR);
6715
- } else if (retransmittedRate > qosQualityParams[QosLevel.GOOD].minRetransmittedRate) {
6841
+ } else if (retransmittedRate > (qosQualityParams[QosLevel.GOOD].minRetransmittedRate || 0.2)) {
6716
6842
  quality = Math.max(quality, QosLevel.GOOD);
6717
6843
  }
6718
6844
  return quality;
@@ -6753,6 +6879,240 @@ var NetworkQuality = /* @__PURE__ */ function() {
6753
6879
  }]);
6754
6880
  return NetworkQuality2;
6755
6881
  }();
6882
+ 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];
6883
+ var FirstFrameObserver = /* @__PURE__ */ function() {
6884
+ function FirstFrameObserver2(_emitFirstFrameState) {
6885
+ var _this = this;
6886
+ _classCallCheck$3(this, FirstFrameObserver2);
6887
+ this._emitFirstFrameState = _emitFirstFrameState;
6888
+ this._startConnectTs = 0;
6889
+ this._firstVideoFrameInterval = null;
6890
+ this._preState = null;
6891
+ this._state = {};
6892
+ this._pc = null;
6893
+ this._video = null;
6894
+ this._videoTransceiver = null;
6895
+ this._extraInfo = {
6896
+ is_preload: false
6897
+ };
6898
+ this._handleConnectionStateChange = function() {
6899
+ var _this$_pc;
6900
+ if (((_this$_pc = _this._pc) === null || _this$_pc === void 0 ? void 0 : _this$_pc.connectionState) === "connected" && _this._videoTransceiver) {
6901
+ _this.changeFirstFrameState(RTC_FIRST_FRAME_STATE.PEER_CONNECTED);
6902
+ _this._watchForFirstVideoFrameRecv(_this._videoTransceiver);
6903
+ }
6904
+ };
6905
+ this._handleICEConnectionStateChange = function() {
6906
+ var _this$_pc2;
6907
+ if (((_this$_pc2 = _this._pc) === null || _this$_pc2 === void 0 ? void 0 : _this$_pc2.iceConnectionState) === "connected") {
6908
+ _this.changeFirstFrameState(RTC_FIRST_FRAME_STATE.ICE_CONNECTED);
6909
+ }
6910
+ };
6911
+ this._handlePlaying = function() {
6912
+ if (!_this._state[RTC_FIRST_FRAME_STATE.PEER_CONNECTED]) {
6913
+ return;
6914
+ }
6915
+ _this.changeFirstFrameState(RTC_FIRST_FRAME_STATE.VIDEO_PLAYING);
6916
+ _this.reset();
6917
+ };
6918
+ this._handleCanplay = function() {
6919
+ if (!_this._state[RTC_FIRST_FRAME_STATE.PEER_CONNECTED]) {
6920
+ return;
6921
+ }
6922
+ _this.changeFirstFrameState(RTC_FIRST_FRAME_STATE.VIDEO_CANPLAY);
6923
+ };
6924
+ this._handleLoadeddata = function() {
6925
+ if (!_this._state[RTC_FIRST_FRAME_STATE.PEER_CONNECTED]) {
6926
+ return;
6927
+ }
6928
+ _this.changeFirstFrameState(RTC_FIRST_FRAME_STATE.VIDEO_LOADEDDATA);
6929
+ };
6930
+ this._handleError = function() {
6931
+ _this.reset();
6932
+ };
6933
+ }
6934
+ _createClass$3(FirstFrameObserver2, [{
6935
+ key: "start",
6936
+ value: function start() {
6937
+ this.reset();
6938
+ this._startConnectTs = Date.now();
6939
+ this.changeFirstFrameState(RTC_FIRST_FRAME_STATE.LOAD_START);
6940
+ }
6941
+ }, {
6942
+ key: "changeFirstFrameState",
6943
+ value: function changeFirstFrameState(state) {
6944
+ var _ref, _this2 = this;
6945
+ var preIdx = (_ref = this._preState && FIRST_FRAME_STATE_ORDER.indexOf(this._preState)) !== null && _ref !== void 0 ? _ref : -1;
6946
+ var curIdx = FIRST_FRAME_STATE_ORDER.indexOf(state);
6947
+ var elapsed = Date.now() - this._startConnectTs;
6948
+ if (curIdx > preIdx) {
6949
+ FIRST_FRAME_STATE_ORDER.slice(preIdx + 1, curIdx + 1).forEach(function(s) {
6950
+ _this2._state[s] = elapsed;
6951
+ });
6952
+ this._preState = state;
6953
+ }
6954
+ }
6955
+ }, {
6956
+ key: "setIsPreload",
6957
+ value: function setIsPreload(isPreload) {
6958
+ this._extraInfo.is_preload = isPreload;
6959
+ }
6960
+ }, {
6961
+ key: "setFailureReason",
6962
+ value: function setFailureReason(reason) {
6963
+ this._extraInfo.failure_reason = reason;
6964
+ }
6965
+ }, {
6966
+ key: "bindEvents",
6967
+ value: function bindEvents(pc, videoTransceiver, video) {
6968
+ var _this3 = this;
6969
+ this._pc = pc;
6970
+ this._video = video;
6971
+ this._videoTransceiver = videoTransceiver;
6972
+ pc.addEventListener("connectionstatechange", this._handleConnectionStateChange);
6973
+ pc.addEventListener("iceconnectionstatechange", this._handleICEConnectionStateChange);
6974
+ var _ref2 = (videoTransceiver === null || videoTransceiver === void 0 ? void 0 : videoTransceiver.receiver) || {}, transport = _ref2.transport;
6975
+ if (transport) {
6976
+ transport.onstatechange = function() {
6977
+ transport.state === "connected" && _this3.changeFirstFrameState(RTC_FIRST_FRAME_STATE.DTLS_CONNECTED);
6978
+ };
6979
+ }
6980
+ video === null || video === void 0 ? void 0 : video.addEventListener("playing", this._handlePlaying);
6981
+ video === null || video === void 0 ? void 0 : video.addEventListener("canplay", this._handleCanplay);
6982
+ video === null || video === void 0 ? void 0 : video.addEventListener("loadeddata", this._handleLoadeddata);
6983
+ video === null || video === void 0 ? void 0 : video.addEventListener("error", this._handleError);
6984
+ }
6985
+ }, {
6986
+ key: "_watchForFirstVideoFrameRecv",
6987
+ value: function _watchForFirstVideoFrameRecv(videoTransceiver) {
6988
+ var _this4 = this;
6989
+ var hasPacketsReceived = false;
6990
+ var hasFrameReceived = false;
6991
+ var hasFrameDecoded = false;
6992
+ this._cancelWatchForFirstVideoFrameRecv();
6993
+ this._firstVideoFrameInterval = window.setInterval(/* @__PURE__ */ _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee() {
6994
+ var _inboundRtpStats, _inboundRtpStats2, _inboundRtpStats3;
6995
+ var receiver, reports, inboundRtpStats;
6996
+ return _regeneratorRuntime$1().wrap(function _callee$(_context) {
6997
+ while (1)
6998
+ switch (_context.prev = _context.next) {
6999
+ case 0:
7000
+ receiver = videoTransceiver.receiver;
7001
+ _context.next = 3;
7002
+ return receiver.getStats();
7003
+ case 3:
7004
+ reports = _context.sent;
7005
+ reports.forEach(function(report) {
7006
+ if (report.type === "inbound-rtp") {
7007
+ inboundRtpStats = report;
7008
+ }
7009
+ });
7010
+ if (!hasPacketsReceived && (_inboundRtpStats = inboundRtpStats) !== null && _inboundRtpStats !== void 0 && _inboundRtpStats.packetsReceived && inboundRtpStats.packetsReceived > 0) {
7011
+ hasPacketsReceived = true;
7012
+ _this4.changeFirstFrameState(RTC_FIRST_FRAME_STATE.FIRST_PACKET_RECV);
7013
+ }
7014
+ if (!hasFrameReceived && (_inboundRtpStats2 = inboundRtpStats) !== null && _inboundRtpStats2 !== void 0 && _inboundRtpStats2.framesReceived && inboundRtpStats.framesReceived > 0) {
7015
+ hasFrameReceived = true;
7016
+ _this4.changeFirstFrameState(RTC_FIRST_FRAME_STATE.FIRST_FRAME_RECV);
7017
+ }
7018
+ if (!hasFrameDecoded && (_inboundRtpStats3 = inboundRtpStats) !== null && _inboundRtpStats3 !== void 0 && _inboundRtpStats3.framesDecoded && inboundRtpStats.framesDecoded > 0) {
7019
+ hasFrameDecoded = true;
7020
+ _this4.changeFirstFrameState(RTC_FIRST_FRAME_STATE.FIRST_FRAME_DECODED);
7021
+ _this4._cancelWatchForFirstVideoFrameRecv();
7022
+ }
7023
+ case 8:
7024
+ case "end":
7025
+ return _context.stop();
7026
+ }
7027
+ }, _callee);
7028
+ })), 200);
7029
+ }
7030
+ }, {
7031
+ key: "_cancelWatchForFirstVideoFrameRecv",
7032
+ value: function _cancelWatchForFirstVideoFrameRecv() {
7033
+ if (this._firstVideoFrameInterval) {
7034
+ window.clearInterval(this._firstVideoFrameInterval);
7035
+ this._firstVideoFrameInterval = null;
7036
+ }
7037
+ }
7038
+ }, {
7039
+ key: "reset",
7040
+ value: function reset() {
7041
+ var _this5 = this, _this$_video, _this$_video2, _this$_video3, _this$_video4, _this$_pc3, _this$_pc4;
7042
+ if (Object.keys(this._state).length > 0) {
7043
+ var state = _objectSpread2$2({}, this._state);
7044
+ var extraInfo = _objectSpread2$2({}, this._extraInfo);
7045
+ getTransportInfo(this._videoTransceiver, extraInfo).then(function() {
7046
+ _this5._emitFirstFrameState(state, extraInfo);
7047
+ });
7048
+ }
7049
+ this._preState = null;
7050
+ this._extraInfo = {
7051
+ is_preload: false
7052
+ };
7053
+ this._state = {};
7054
+ (_this$_video = this._video) === null || _this$_video === void 0 ? void 0 : _this$_video.removeEventListener("playing", this._handlePlaying);
7055
+ (_this$_video2 = this._video) === null || _this$_video2 === void 0 ? void 0 : _this$_video2.removeEventListener("canplay", this._handleCanplay);
7056
+ (_this$_video3 = this._video) === null || _this$_video3 === void 0 ? void 0 : _this$_video3.removeEventListener("loadeddata", this._handleLoadeddata);
7057
+ (_this$_video4 = this._video) === null || _this$_video4 === void 0 ? void 0 : _this$_video4.removeEventListener("error", this._handleError);
7058
+ (_this$_pc3 = this._pc) === null || _this$_pc3 === void 0 ? void 0 : _this$_pc3.removeEventListener("connectionstatechange", this._handleConnectionStateChange);
7059
+ (_this$_pc4 = this._pc) === null || _this$_pc4 === void 0 ? void 0 : _this$_pc4.removeEventListener("iceconnectionstatechange", this._handleICEConnectionStateChange);
7060
+ this._cancelWatchForFirstVideoFrameRecv();
7061
+ this._pc = null;
7062
+ this._video = null;
7063
+ this._videoTransceiver = null;
7064
+ }
7065
+ }]);
7066
+ return FirstFrameObserver2;
7067
+ }();
7068
+ var getTransportInfo = /* @__PURE__ */ function() {
7069
+ var _ref4 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee2(videoTransceiver, extraInfo) {
7070
+ var _videoTransceiver$rec;
7071
+ var reports, candidatePairStats, localCandidateStats, remoteCandidateStats;
7072
+ return _regeneratorRuntime$1().wrap(function _callee2$(_context2) {
7073
+ while (1)
7074
+ switch (_context2.prev = _context2.next) {
7075
+ case 0:
7076
+ _context2.next = 2;
7077
+ return videoTransceiver === null || videoTransceiver === void 0 ? void 0 : (_videoTransceiver$rec = videoTransceiver.receiver) === null || _videoTransceiver$rec === void 0 ? void 0 : _videoTransceiver$rec.getStats().catch(function() {
7078
+ });
7079
+ case 2:
7080
+ reports = _context2.sent;
7081
+ reports === null || reports === void 0 ? void 0 : reports.forEach(function(report) {
7082
+ if (report.type === "candidate-pair") {
7083
+ candidatePairStats = report;
7084
+ localCandidateStats = reports.get(report.localCandidateId);
7085
+ remoteCandidateStats = reports.get(report.remoteCandidateId);
7086
+ }
7087
+ });
7088
+ if (remoteCandidateStats) {
7089
+ extraInfo.remote_ip = remoteCandidateStats.ip || remoteCandidateStats.address;
7090
+ extraInfo.remote_port = remoteCandidateStats.port;
7091
+ extraInfo.remote_candidate_type = remoteCandidateStats.candidateType;
7092
+ extraInfo.protocol = remoteCandidateStats.protocol;
7093
+ }
7094
+ if (localCandidateStats) {
7095
+ extraInfo.local_ip = localCandidateStats.ip || localCandidateStats.address;
7096
+ extraInfo.local_port = localCandidateStats.port;
7097
+ extraInfo.local_candidate_type = localCandidateStats.candidateType;
7098
+ }
7099
+ if (candidatePairStats) {
7100
+ extraInfo.rtt = candidatePairStats.currentRoundTripTime;
7101
+ extraInfo.stun_requests_sent = candidatePairStats.requestsSent;
7102
+ extraInfo.stun_requests_received = candidatePairStats.requestsReceived;
7103
+ extraInfo.stun_responses_sent = candidatePairStats.responsesSent;
7104
+ extraInfo.stun_responses_received = candidatePairStats.responsesReceived;
7105
+ }
7106
+ case 7:
7107
+ case "end":
7108
+ return _context2.stop();
7109
+ }
7110
+ }, _callee2);
7111
+ }));
7112
+ return function getTransportInfo2(_x, _x2) {
7113
+ return _ref4.apply(this, arguments);
7114
+ };
7115
+ }();
6756
7116
  function changeNumberInRange(source, min, max, delta) {
6757
7117
  var target = source + delta;
6758
7118
  if (target > max) {
@@ -6763,6 +7123,111 @@ function changeNumberInRange(source, min, max, delta) {
6763
7123
  function isHarmonyOS() {
6764
7124
  return /(HarmonyOS|OpenHarmony|ArkWeb)/i.test(navigator.userAgent);
6765
7125
  }
7126
+ function compareURL(url1, url2) {
7127
+ var queryKeys = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : [];
7128
+ if (typeof url1 !== "string" || typeof url2 !== "string") {
7129
+ return false;
7130
+ }
7131
+ if (!url1.includes("://")) {
7132
+ url1 = window.location.protocol + "//" + url1;
7133
+ }
7134
+ if (!url2.includes("://")) {
7135
+ url2 = window.location.protocol + "//" + url2;
7136
+ }
7137
+ var url1Obj;
7138
+ var url2Obj;
7139
+ try {
7140
+ url1Obj = new URL(url1);
7141
+ url2Obj = new URL(url2);
7142
+ } catch (e) {
7143
+ return false;
7144
+ }
7145
+ if (url1Obj.host + url1Obj.pathname !== url2Obj.host + url2Obj.pathname) {
7146
+ return false;
7147
+ }
7148
+ var _iterator = _createForOfIteratorHelper$1(queryKeys), _step;
7149
+ try {
7150
+ for (_iterator.s(); !(_step = _iterator.n()).done; ) {
7151
+ var key = _step.value;
7152
+ if (url1Obj.searchParams.get(key) !== url2Obj.searchParams.get(key)) {
7153
+ return false;
7154
+ }
7155
+ }
7156
+ } catch (err) {
7157
+ _iterator.e(err);
7158
+ } finally {
7159
+ _iterator.f();
7160
+ }
7161
+ return true;
7162
+ }
7163
+ function addUrlParams(url, params) {
7164
+ if (!params || Object.keys(params).length === 0) {
7165
+ return url;
7166
+ }
7167
+ var urlParams = url.includes("?") ? new URLSearchParams(url.split("?")[1]) : new URLSearchParams();
7168
+ Object.keys(params).forEach(function(key) {
7169
+ urlParams.set(key, params[key]);
7170
+ });
7171
+ return url.split("?")[0] + "?" + urlParams.toString();
7172
+ }
7173
+ function isHeyTapBrowser() {
7174
+ return /(HeyTapBrowser)/i.test(navigator.userAgent);
7175
+ }
7176
+ function isVivoBrowser() {
7177
+ return /(VivoBrowser)/i.test(navigator.userAgent);
7178
+ }
7179
+ var VideoFrameRecvCallback = /* @__PURE__ */ function() {
7180
+ function VideoFrameRecvCallback2() {
7181
+ var _this = this;
7182
+ _classCallCheck$3(this, VideoFrameRecvCallback2);
7183
+ this._onVideoRefresh = function(_, data) {
7184
+ var _this$_domElement;
7185
+ _this._recentVideoInfo = data;
7186
+ _this._requestVideoFrameCallbackTimer = (_this$_domElement = _this._domElement) === null || _this$_domElement === void 0 ? void 0 : _this$_domElement.requestVideoFrameCallback(_this._onVideoRefresh);
7187
+ };
7188
+ }
7189
+ _createClass$3(VideoFrameRecvCallback2, [{
7190
+ key: "start",
7191
+ value: function start(domElement) {
7192
+ var _this2 = this;
7193
+ this._domElement = domElement;
7194
+ if (typeof HTMLVideoElement.prototype.requestVideoFrameCallback === "function") {
7195
+ if (domElement) {
7196
+ this._requestVideoFrameCallbackTimer = domElement.requestVideoFrameCallback(this._onVideoRefresh.bind(this));
7197
+ this._removeHandler = function() {
7198
+ _this2._requestVideoFrameCallbackTimer && (domElement === null || domElement === void 0 ? void 0 : domElement.cancelVideoFrameCallback(_this2._requestVideoFrameCallbackTimer));
7199
+ };
7200
+ }
7201
+ }
7202
+ }
7203
+ }, {
7204
+ key: "stop",
7205
+ value: function stop() {
7206
+ var _this$_removeHandler;
7207
+ delete this._recentVideoInfo;
7208
+ delete this._domElement;
7209
+ (_this$_removeHandler = this._removeHandler) === null || _this$_removeHandler === void 0 ? void 0 : _this$_removeHandler.call(this);
7210
+ delete this._removeHandler;
7211
+ }
7212
+ }, {
7213
+ key: "getRecentRenderInfo4Report",
7214
+ value: function getRecentRenderInfo4Report() {
7215
+ var _this3 = this;
7216
+ var obj = {};
7217
+ if (this._recentVideoInfo) {
7218
+ Object.keys(this._recentVideoInfo).forEach(function(k) {
7219
+ var _this3$_recentVideoIn;
7220
+ var key = k.replace(/[a-z]{1}[A-Z]{1}/g, function(e) {
7221
+ return "".concat(e[0], "_").concat(e[1].toLowerCase());
7222
+ });
7223
+ obj["video_".concat(key)] = (_this3$_recentVideoIn = _this3._recentVideoInfo) === null || _this3$_recentVideoIn === void 0 ? void 0 : _this3$_recentVideoIn[k];
7224
+ });
7225
+ }
7226
+ return obj;
7227
+ }
7228
+ }]);
7229
+ return VideoFrameRecvCallback2;
7230
+ }();
6766
7231
  var logger = new Logger("rts");
6767
7232
  var Rts = /* @__PURE__ */ function(_EventEmitter) {
6768
7233
  _inherits$1(Rts2, _EventEmitter);
@@ -6771,31 +7236,28 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
6771
7236
  var _this;
6772
7237
  _classCallCheck$3(this, Rts2);
6773
7238
  _this = _super.call(this);
6774
- _defineProperty$2(_assertThisInitialized$1(_this), "_url", "");
6775
- _defineProperty$2(_assertThisInitialized$1(_this), "_pc", null);
6776
- _defineProperty$2(_assertThisInitialized$1(_this), "_audioTransceicer", null);
6777
- _defineProperty$2(_assertThisInitialized$1(_this), "_videoTransceicer", null);
6778
- _defineProperty$2(_assertThisInitialized$1(_this), "_mediaStream", null);
6779
- _defineProperty$2(_assertThisInitialized$1(_this), "_lastMediaStream", null);
6780
- _defineProperty$2(_assertThisInitialized$1(_this), "_media", null);
6781
- _defineProperty$2(_assertThisInitialized$1(_this), "_player", null);
6782
- _defineProperty$2(_assertThisInitialized$1(_this), "_opts", null);
6783
- _defineProperty$2(_assertThisInitialized$1(_this), "_loader", null);
6784
- _defineProperty$2(_assertThisInitialized$1(_this), "_networkEvaluate", null);
6785
- _defineProperty$2(_assertThisInitialized$1(_this), "_retry", 0);
6786
- _defineProperty$2(_assertThisInitialized$1(_this), "_waitingTimer", 0);
6787
- _defineProperty$2(_assertThisInitialized$1(_this), "_rctConnectStartTs", 0);
6788
- _defineProperty$2(_assertThisInitialized$1(_this), "_isReplacing", false);
6789
- _defineProperty$2(_assertThisInitialized$1(_this), "_checkStatsErrorTimer", null);
6790
- _defineProperty$2(_assertThisInitialized$1(_this), "_audioStallObserver", null);
6791
- _defineProperty$2(_assertThisInitialized$1(_this), "_videoStallObserver", null);
6792
- _defineProperty$2(_assertThisInitialized$1(_this), "_networkQuality", null);
6793
- _defineProperty$2(_assertThisInitialized$1(_this), "_preAudioStats", null);
6794
- _defineProperty$2(_assertThisInitialized$1(_this), "_preVideoStats", null);
6795
- _defineProperty$2(_assertThisInitialized$1(_this), "_rtcReportTimer", 0);
6796
- _defineProperty$2(_assertThisInitialized$1(_this), "_networkQualityResult", []);
6797
- _defineProperty$2(_assertThisInitialized$1(_this), "_peerStateTimer", null);
6798
- _defineProperty$2(_assertThisInitialized$1(_this), "_checkStatsError", /* @__PURE__ */ _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee2() {
7239
+ _this._url = "";
7240
+ _this._pc = null;
7241
+ _this._audioTransceicer = null;
7242
+ _this._videoTransceicer = null;
7243
+ _this._mediaStream = null;
7244
+ _this._lastMediaStream = null;
7245
+ _this._loader = null;
7246
+ _this._networkEvaluate = null;
7247
+ _this._retry = 0;
7248
+ _this._player = null;
7249
+ _this._waitingTimer = 0;
7250
+ _this._rctConnectStartTs = 0;
7251
+ _this._isReplacing = false;
7252
+ _this._firstFrameObserver = new FirstFrameObserver(_this._emitFirstFrameState.bind(_assertThisInitialized$1(_this)));
7253
+ _this._audio = null;
7254
+ _this._video = null;
7255
+ _this._preAudioStats = null;
7256
+ _this._preVideoStats = null;
7257
+ _this._rtcReportTimer = null;
7258
+ _this._networkQualityResult = [];
7259
+ _this._videoJitterBufferDelay = 0;
7260
+ _this._checkStatsError = /* @__PURE__ */ _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee2() {
6799
7261
  return _regeneratorRuntime$1().wrap(function _callee2$(_context2) {
6800
7262
  while (1)
6801
7263
  switch (_context2.prev = _context2.next) {
@@ -6836,12 +7298,16 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
6836
7298
  return _context2.stop();
6837
7299
  }
6838
7300
  }, _callee2);
6839
- })));
6840
- _defineProperty$2(_assertThisInitialized$1(_this), "_onTrack", function(e) {
7301
+ }));
7302
+ _this._onTrack = function(e) {
6841
7303
  logger.log("addTrack: ", e.track, e.streams);
6842
- _this["_".concat(e.track.kind)] = e.track;
6843
- });
6844
- _defineProperty$2(_assertThisInitialized$1(_this), "_mockWaitingByTimeupdate", function() {
7304
+ if (e.track.kind === "audio") {
7305
+ _this._audio = e.track;
7306
+ } else {
7307
+ _this._video = e.track;
7308
+ }
7309
+ };
7310
+ _this._mockWaitingByTimeupdate = function() {
6845
7311
  var _this$_pc, _this$_pc2;
6846
7312
  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"))
6847
7313
  return;
@@ -6852,8 +7318,8 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
6852
7318
  return;
6853
7319
  _this.emit("waiting");
6854
7320
  }, _this._opts.stallInterval);
6855
- });
6856
- _defineProperty$2(_assertThisInitialized$1(_this), "_onLoadedData", function() {
7321
+ };
7322
+ _this._onLoadedData = function() {
6857
7323
  logger.log("loadeddata emit");
6858
7324
  _this.getStatsSnapshoot().then(function(snap) {
6859
7325
  _this.emit(EVENT.METADATA_PARSED, {
@@ -6867,19 +7333,15 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
6867
7333
  meta: snap.audio
6868
7334
  });
6869
7335
  });
6870
- });
6871
- _defineProperty$2(_assertThisInitialized$1(_this), "_setDelay", function(delayHint) {
7336
+ };
7337
+ _this._setDelay = function(delayHint) {
6872
7338
  if (_this._opts.progressiveSetDelay) {
6873
7339
  _this._startSetDelayLoop(delayHint);
6874
7340
  } else {
6875
7341
  var _this$_audioTransceic2;
6876
- var key = [
6877
- "playoutDelayHint",
6878
- "jitterBufferDelayHint",
6879
- "jitterBufferTarget"
6880
- ].find(function(key2) {
7342
+ var key = ["playoutDelayHint", "jitterBufferDelayHint", "jitterBufferTarget"].find(function(key2) {
6881
7343
  var _this$_audioTransceic, _this$_videoTransceic;
6882
- 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);
7344
+ 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) || {});
6883
7345
  });
6884
7346
  if (!key)
6885
7347
  return;
@@ -6889,24 +7351,19 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
6889
7351
  _this._audioTransceicer.receiver[key] = delayHint;
6890
7352
  _this._videoTransceicer.receiver[key] = delayHint;
6891
7353
  }
6892
- });
6893
- _defineProperty$2(_assertThisInitialized$1(_this), "_targetDelayHint", null);
6894
- _defineProperty$2(_assertThisInitialized$1(_this), "_setDelayTimer", null);
6895
- _defineProperty$2(_assertThisInitialized$1(_this), "_setDelayError", null);
6896
- _defineProperty$2(_assertThisInitialized$1(_this), "_startSetDelayLoop", /* @__PURE__ */ function() {
7354
+ };
7355
+ _this._targetDelayHint = null;
7356
+ _this._setDelayError = null;
7357
+ _this._startSetDelayLoop = /* @__PURE__ */ function() {
6897
7358
  var _ref3 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee4(delayHint) {
6898
7359
  var key, preAudioStats, preVideoStats, _this$_opts$adaptiveJ, loopInterval, maxAvSyncDelay, maxJitterBufferDiff, maxStep, avDiffTooMuchCount;
6899
7360
  return _regeneratorRuntime$1().wrap(function _callee4$(_context4) {
6900
7361
  while (1)
6901
7362
  switch (_context4.prev = _context4.next) {
6902
7363
  case 0:
6903
- key = [
6904
- "playoutDelayHint",
6905
- "jitterBufferDelayHint",
6906
- "jitterBufferTarget"
6907
- ].find(function(key2) {
7364
+ key = ["playoutDelayHint", "jitterBufferDelayHint", "jitterBufferTarget"].find(function(key2) {
6908
7365
  var _this$_audioTransceic3, _this$_videoTransceic2;
6909
- 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);
7366
+ 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) || {});
6910
7367
  });
6911
7368
  if (key) {
6912
7369
  _context4.next = 3;
@@ -6921,13 +7378,14 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
6921
7378
  }
6922
7379
  return _context4.abrupt("return");
6923
7380
  case 6:
7381
+ logger.log("_startSetDelayLoop()", "invoked, delayHint: ".concat(delayHint));
6924
7382
  _this._targetDelayHint = delayHint;
6925
7383
  if (!_this._setDelayTimer) {
6926
- _context4.next = 9;
7384
+ _context4.next = 10;
6927
7385
  break;
6928
7386
  }
6929
7387
  return _context4.abrupt("return");
6930
- case 9:
7388
+ case 10:
6931
7389
  preAudioStats = null;
6932
7390
  preVideoStats = null;
6933
7391
  _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;
@@ -6954,7 +7412,7 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
6954
7412
  }
6955
7413
  return _context3.abrupt("return");
6956
7414
  case 8:
6957
- targetDelayMs = _this._targetDelayHint * 1e3;
7415
+ targetDelayMs = (_this._targetDelayHint || 0) * 1e3;
6958
7416
  currentTargetDelayMs = currentTargetDelay * 1e3;
6959
7417
  _context3.next = 12;
6960
7418
  return Promise.all([getRecvAudioStats(_this._audioTransceicer.receiver.getStats()), getRecvVideoStats(_this._videoTransceicer.receiver.getStats())]);
@@ -6983,7 +7441,7 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
6983
7441
  break;
6984
7442
  }
6985
7443
  if (avDiffTooMuchCount++ > 8 && currentVideoDelay > currentAudioDelay) {
6986
- _this._audioTransceicer.receiver[key] = Math.min(currentVideoDelay / 1e3, _this._targetDelayHint);
7444
+ _this._audioTransceicer.receiver[key] = Math.min(currentVideoDelay / 1e3, _this._targetDelayHint || 0);
6987
7445
  avDiffTooMuchCount = 0;
6988
7446
  }
6989
7447
  logger.log("av_jb_diff(".concat(currentAudioDelay - currentVideoDelay, "=").concat(currentAudioDelay, "-").concat(currentVideoDelay, ") or av_sync_diff(").concat(av_sync_diff, ") too much, skip setting"));
@@ -7018,7 +7476,7 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
7018
7476
  }
7019
7477
  }, _callee3, null, [[0, 40]]);
7020
7478
  })), loopInterval);
7021
- case 14:
7479
+ case 15:
7022
7480
  case "end":
7023
7481
  return _context4.stop();
7024
7482
  }
@@ -7027,26 +7485,31 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
7027
7485
  return function(_x) {
7028
7486
  return _ref3.apply(this, arguments);
7029
7487
  };
7030
- }());
7031
- _defineProperty$2(_assertThisInitialized$1(_this), "_getDelay", function() {
7488
+ }();
7489
+ _this._getDelay = function() {
7032
7490
  try {
7491
+ var _this$_audioTransceic6;
7033
7492
  var key = ["playoutDelayHint", "jitterBufferDelayHint", "jitterBufferTarget"].find(function(key2) {
7034
- return key2 in _this._videoTransceicer.receiver && key2 in _this._audioTransceicer.receiver;
7493
+ var _this$_videoTransceic4, _this$_audioTransceic5;
7494
+ 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) || {});
7035
7495
  });
7036
- return _this._audioTransceicer.receiver[key];
7496
+ if (!key)
7497
+ return;
7498
+ return (_this$_audioTransceic6 = _this._audioTransceicer) === null || _this$_audioTransceic6 === void 0 ? void 0 : _this$_audioTransceic6.receiver[key];
7037
7499
  } catch (error) {
7038
7500
  logger.error("get delay error");
7039
7501
  }
7040
- });
7041
- _defineProperty$2(_assertThisInitialized$1(_this), "_onLoaderRetry", function(error, retryTime) {
7502
+ };
7503
+ _this._onLoaderRetry = function(error, retryTime) {
7504
+ console.log(error, "retryTime", retryTime);
7042
7505
  _this.emit(EVENT.LOAD_RETRY, {
7043
7506
  error: StreamingError.network(error),
7044
7507
  retryTime
7045
7508
  });
7046
- });
7509
+ };
7047
7510
  _this._opts = getOption(opts);
7048
7511
  _this._media = _this._opts.media;
7049
- _this._player = _this._opts.player;
7512
+ _this._player = _this._opts.player || null;
7050
7513
  _this._loader = new NetLoader(_objectSpread2$2(_objectSpread2$2({}, opts.fetchOptions), {}, {
7051
7514
  responseType: "json",
7052
7515
  method: "POST",
@@ -7056,9 +7519,12 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
7056
7519
  onRetryError: _this._onLoaderRetry,
7057
7520
  logger
7058
7521
  }));
7059
- _this._retry = _this._opts.retryCount;
7522
+ _this._retry = _this._opts.retryCount || 0;
7523
+ _this._preloadPromise = _this._opts.preloadPromise;
7060
7524
  _this._bindMediaEvent();
7525
+ logger.log("constructor()", opts);
7061
7526
  _this._changeVolumeInHarmonyWorkaround();
7527
+ _this._mutedBeforePlayingWorkaround();
7062
7528
  if (_this._opts.mediaStream && _this._opts.seamlesslyReload) {
7063
7529
  _this._lastMediaStream = _this._opts.mediaStream;
7064
7530
  }
@@ -7079,6 +7545,11 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
7079
7545
  get: function get() {
7080
7546
  return this._video;
7081
7547
  }
7548
+ }, {
7549
+ key: "getJitterBufferDelay",
7550
+ value: function getJitterBufferDelay() {
7551
+ return this._videoJitterBufferDelay;
7552
+ }
7082
7553
  }, {
7083
7554
  key: "loader",
7084
7555
  get: function get() {
@@ -7092,9 +7563,24 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
7092
7563
  }
7093
7564
  }, {
7094
7565
  key: "getStats",
7095
- value: function getStats$1() {
7096
- return getStats(this._pc);
7097
- }
7566
+ value: function() {
7567
+ var _getStats22 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee5() {
7568
+ return _regeneratorRuntime$1().wrap(function _callee5$(_context5) {
7569
+ while (1)
7570
+ switch (_context5.prev = _context5.next) {
7571
+ case 0:
7572
+ return _context5.abrupt("return", getStats(this._pc));
7573
+ case 1:
7574
+ case "end":
7575
+ return _context5.stop();
7576
+ }
7577
+ }, _callee5, this);
7578
+ }));
7579
+ function getStats$1() {
7580
+ return _getStats22.apply(this, arguments);
7581
+ }
7582
+ return getStats$1;
7583
+ }()
7098
7584
  }, {
7099
7585
  key: "getStatsSnapshoot",
7100
7586
  value: function getStatsSnapshoot$1() {
@@ -7105,51 +7591,105 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
7105
7591
  }, {
7106
7592
  key: "load",
7107
7593
  value: function() {
7108
- var _load = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee5(url) {
7594
+ var _load = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee6(url, failureReason) {
7109
7595
  var _this2 = this;
7110
- var encodedTransformSupported, lastPc;
7111
- return _regeneratorRuntime$1().wrap(function _callee5$(_context5) {
7596
+ var lastPc, answerSdp, errorStr, preloadPromise, info, encodedTransformSupported;
7597
+ return _regeneratorRuntime$1().wrap(function _callee6$(_context6) {
7112
7598
  while (1)
7113
- switch (_context5.prev = _context5.next) {
7599
+ switch (_context6.prev = _context6.next) {
7114
7600
  case 0:
7115
- this._disconnect();
7601
+ logger.log("load()", 'invoked, url: "'.concat(url, '"'));
7602
+ this._disconnect(failureReason || "invoke load");
7116
7603
  this._url = url;
7117
- this._retry = this._opts.retryCount;
7604
+ lastPc = this._pc;
7118
7605
  if (!this._opts.hackCreateOfferIssue) {
7119
- _context5.next = 6;
7606
+ _context6.next = 7;
7120
7607
  break;
7121
7608
  }
7122
- _context5.next = 6;
7609
+ _context6.next = 7;
7123
7610
  return this._createEmptyPeer();
7124
- case 6:
7125
- encodedTransformSupported = isLegacyEncodedTransformSupported();
7126
- _context5.prev = 7;
7127
- lastPc = this._pc;
7128
- if (lastPc) {
7129
- lastPc.close();
7611
+ case 7:
7612
+ _context6.prev = 7;
7613
+ this._firstFrameObserver.start();
7614
+ if (!this._preloadPromise) {
7615
+ _context6.next = 38;
7616
+ break;
7617
+ }
7618
+ logger.log("load()", "in preload process...");
7619
+ _context6.prev = 11;
7620
+ this._firstFrameObserver.setIsPreload(true);
7621
+ if (compareURL(this._url, this._preloadPromise.url, ["tabr_start_bitrate"])) {
7622
+ _context6.next = 17;
7623
+ break;
7624
+ }
7625
+ errorStr = "preload url not match, current url: ".concat(this._url, ", preload url: ").concat(this._preloadPromise.url);
7626
+ delete this._preloadPromise;
7627
+ throw new Error(errorStr);
7628
+ case 17:
7629
+ preloadPromise = this._preloadPromise.promise;
7630
+ delete this._preloadPromise;
7631
+ _context6.next = 21;
7632
+ return preloadPromise;
7633
+ case 21:
7634
+ info = _context6.sent;
7635
+ if (!(info.pc.signalingState !== "have-local-offer")) {
7636
+ _context6.next = 24;
7637
+ break;
7638
+ }
7639
+ throw new Error('pc.signalingState not equal "have-local-offer", current state is '.concat(info.pc.signalingState));
7640
+ case 24:
7641
+ this._pc = info.pc;
7642
+ answerSdp = info.answerSdp;
7643
+ this._videoTransceicer = info.videoTransceiver;
7644
+ this._audioTransceicer = info.audioTransceiver;
7645
+ if (this._opts.enableSei) {
7646
+ this.initVideoEncodedTransform();
7647
+ this.initAudioEncodedTransform();
7130
7648
  }
7649
+ _context6.next = 36;
7650
+ break;
7651
+ case 31:
7652
+ _context6.prev = 31;
7653
+ _context6.t0 = _context6["catch"](11);
7654
+ logger.warn("load()", "preload failed, ".concat(_context6.t0.message || _context6.t0.toString()));
7655
+ this.load(url, _context6.t0.message || _context6.t0.toString());
7656
+ return _context6.abrupt("return");
7657
+ case 36:
7658
+ _context6.next = 44;
7659
+ break;
7660
+ case 38:
7661
+ encodedTransformSupported = isLegacyEncodedTransformSupported();
7662
+ logger.log("load()", "isLegacyEncodedTransformSupported: ".concat(encodedTransformSupported));
7131
7663
  this._pc = new RTCPeerConnection({
7132
7664
  encodedInsertableStreams: encodedTransformSupported && this._opts.enableSei ? true : void 0
7133
7665
  });
7134
- this._bindRTCEvents();
7135
- _context5.next = 14;
7136
- return this._connect(url);
7137
- case 14:
7138
- _context5.next = 19;
7666
+ _context6.next = 43;
7667
+ return this._getAnswerSdp(this._pc);
7668
+ case 43:
7669
+ answerSdp = _context6.sent;
7670
+ case 44:
7671
+ this._bindRTCEvents(this._pc);
7672
+ _context6.next = 47;
7673
+ return this._handleAnswerSdp(this._pc, answerSdp);
7674
+ case 47:
7675
+ if (lastPc) {
7676
+ lastPc.close();
7677
+ }
7678
+ _context6.next = 53;
7139
7679
  break;
7140
- case 16:
7141
- _context5.prev = 16;
7142
- _context5.t0 = _context5["catch"](7);
7680
+ case 50:
7681
+ _context6.prev = 50;
7682
+ _context6.t1 = _context6["catch"](7);
7143
7683
  setTimeout(function() {
7144
- return _this2._emitError(StreamingError.create(ERR.OTHER, null, _context5.t0));
7684
+ return _this2._emitError(StreamingError.create(ERR.OTHER, null, _context6.t1));
7145
7685
  });
7146
- case 19:
7686
+ case 53:
7147
7687
  case "end":
7148
- return _context5.stop();
7688
+ return _context6.stop();
7149
7689
  }
7150
- }, _callee5, this, [[7, 16]]);
7690
+ }, _callee6, this, [[7, 50], [11, 31]]);
7151
7691
  }));
7152
- function load(_x2) {
7692
+ function load(_x2, _x3) {
7153
7693
  return _load.apply(this, arguments);
7154
7694
  }
7155
7695
  return load;
@@ -7157,13 +7697,13 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
7157
7697
  }, {
7158
7698
  key: "switchURL",
7159
7699
  value: function switchURL(url) {
7160
- this.load(url || this._url);
7700
+ logger.log("switchURL()", 'invoked, url: "'.concat(url, '"'));
7701
+ this.load(url || this._url, "invoke switchURL");
7161
7702
  }
7162
7703
  }, {
7163
7704
  key: "_bindRTCEvents",
7164
- value: function _bindRTCEvents() {
7705
+ value: function _bindRTCEvents(pc) {
7165
7706
  var _this3 = this;
7166
- var pc = this._pc;
7167
7707
  pc.addEventListener("track", this._onTrack);
7168
7708
  pc.addEventListener("connectionstatechange", function() {
7169
7709
  logger.warn("onconnectionstatechange:", pc.connectionState);
@@ -7182,7 +7722,7 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
7182
7722
  return;
7183
7723
  }
7184
7724
  _this3._retry--;
7185
- _this3.load(_this3._url);
7725
+ _this3.load(_this3._url, "rtc connect failed");
7186
7726
  }
7187
7727
  if (pc.connectionState === "connected") {
7188
7728
  _this3._handleMediaStream();
@@ -7201,7 +7741,7 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
7201
7741
  value: function _handleMediaStream() {
7202
7742
  var _this4 = this;
7203
7743
  if (this._lastMediaStream) {
7204
- var _this$_player$play;
7744
+ var _this$_player2, _this$_player3, _this$_player3$play;
7205
7745
  var videoTrack = this._lastMediaStream.getVideoTracks()[0];
7206
7746
  var audioTrack = this._lastMediaStream.getAudioTracks()[0];
7207
7747
  if (videoTrack) {
@@ -7214,20 +7754,15 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
7214
7754
  this._audio && this._mediaStream.addTrack(this._audio);
7215
7755
  this._video && this._mediaStream.addTrack(this._video);
7216
7756
  this._isReplacing = true;
7217
- this._player.pause();
7218
- (_this$_player$play = this._player.play()) === null || _this$_player$play === void 0 ? void 0 : _this$_player$play.finally(function() {
7757
+ (_this$_player2 = this._player) === null || _this$_player2 === void 0 ? void 0 : _this$_player2.pause();
7758
+ (_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() {
7219
7759
  _this4._isReplacing = false;
7220
7760
  });
7221
7761
  } else {
7222
7762
  this._mediaStream = new MediaStream();
7223
7763
  this._audio && this._mediaStream.addTrack(this._audio);
7224
7764
  this._video && this._mediaStream.addTrack(this._video);
7225
- this._media.srcObject = this._mediaStream;
7226
- var req = this._player.play();
7227
- if (req && req.catch) {
7228
- req.catch(function(e) {
7229
- });
7230
- }
7765
+ this._media && (this._media.srcObject = this._mediaStream);
7231
7766
  }
7232
7767
  }
7233
7768
  }, {
@@ -7281,21 +7816,22 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
7281
7816
  }, {
7282
7817
  key: "_bindMediaEvent",
7283
7818
  value: function _bindMediaEvent() {
7284
- this._media.addEventListener("timeupdate", this._mockWaitingByTimeupdate);
7285
- this._media.addEventListener("loadeddata", this._onLoadedData);
7819
+ var _this$_media, _this$_media2;
7820
+ (_this$_media = this._media) === null || _this$_media === void 0 ? void 0 : _this$_media.addEventListener("timeupdate", this._mockWaitingByTimeupdate);
7821
+ (_this$_media2 = this._media) === null || _this$_media2 === void 0 ? void 0 : _this$_media2.addEventListener("loadeddata", this._onLoadedData);
7286
7822
  }
7287
7823
  }, {
7288
- key: "_connect",
7824
+ key: "_getAnswerSdp",
7289
7825
  value: function() {
7290
- var _connect2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee6() {
7291
- var pc, offer, parsed, finnalUrl, _this$_opts, _answer$remoteSdp, _this$_opts2, _answer$remoteSdp2, _parsed$media, parseSession, sessionId, reqStart, res, answer, err, _parsed;
7292
- return _regeneratorRuntime$1().wrap(function _callee6$(_context6) {
7826
+ var _getAnswerSdp2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee7(pc) {
7827
+ var offer, answerSdp, parsed, finnalUrl, _this$_opts, _this$_loader, _this$_opts2, _parsed$media, parseSession, sessionId, reqStart, res, answer, err;
7828
+ return _regeneratorRuntime$1().wrap(function _callee7$(_context7) {
7293
7829
  while (1)
7294
- switch (_context6.prev = _context6.next) {
7830
+ switch (_context7.prev = _context7.next) {
7295
7831
  case 0:
7296
- pc = this._pc;
7832
+ logger.log("_getAnswerSdp()");
7297
7833
  if (!pc.addTransceiver) {
7298
- _context6.next = 11;
7834
+ _context7.next = 11;
7299
7835
  break;
7300
7836
  }
7301
7837
  this._audioTransceicer = pc.addTransceiver("audio", {
@@ -7304,32 +7840,37 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
7304
7840
  this._videoTransceicer = pc.addTransceiver("video", {
7305
7841
  direction: "recvonly"
7306
7842
  });
7307
- this._setDelay(this._opts.delayHint);
7843
+ this._setDelay(this._opts.delayHint || null);
7308
7844
  if (this._opts.enableSei) {
7309
7845
  this.initVideoEncodedTransform();
7310
7846
  this.initAudioEncodedTransform();
7311
7847
  }
7312
- _context6.next = 8;
7848
+ _context7.next = 8;
7313
7849
  return pc.createOffer();
7314
7850
  case 8:
7315
- offer = _context6.sent;
7316
- _context6.next = 14;
7851
+ offer = _context7.sent;
7852
+ _context7.next = 14;
7317
7853
  break;
7318
7854
  case 11:
7319
- _context6.next = 13;
7855
+ _context7.next = 13;
7320
7856
  return pc.createOffer({
7321
7857
  iceRestart: true,
7322
7858
  offerToReceiveAudio: true,
7323
7859
  offerToReceiveVideo: true
7324
7860
  });
7325
7861
  case 13:
7326
- offer = _context6.sent;
7862
+ offer = _context7.sent;
7327
7863
  case 14:
7328
7864
  if (this._opts.hackCreateOfferIssue) {
7329
7865
  this._createEmptyPeer();
7330
7866
  }
7331
- logger.log("local offer");
7332
- logger.log(offer.sdp);
7867
+ logger.log("local offer", offer);
7868
+ if (offer.sdp) {
7869
+ _context7.next = 18;
7870
+ break;
7871
+ }
7872
+ throw new Error("create offer failed");
7873
+ case 18:
7333
7874
  parsed = lib.parse(offer.sdp);
7334
7875
  parsed.media.filter(function(x) {
7335
7876
  return x.type === "audio";
@@ -7350,62 +7891,71 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
7350
7891
  type: "nack"
7351
7892
  });
7352
7893
  });
7894
+ parsed.media.filter(function(x) {
7895
+ return x.type === "video";
7896
+ }).forEach(function(x) {
7897
+ x.fmtp.forEach(function(x2) {
7898
+ if (x2.config.indexOf("profile-level-id") !== -1) {
7899
+ x2.config = "".concat(x2.config, ";sps-pps-idr-in-keyframe=1");
7900
+ }
7901
+ });
7902
+ });
7353
7903
  offer.sdp = lib.write(parsed);
7354
- logger.log("local offer modified:\n", offer.sdp);
7355
- _context6.next = 23;
7904
+ logger.log("local offer modified:\n", offer);
7905
+ _context7.next = 25;
7356
7906
  return pc.setLocalDescription(offer);
7357
- case 23:
7907
+ case 25:
7358
7908
  finnalUrl = this._url;
7359
- _context6.prev = 24;
7909
+ _context7.prev = 26;
7360
7910
  if (this._opts.preProcessUrl) {
7361
7911
  finnalUrl = this._opts.preProcessUrl(finnalUrl).url;
7362
7912
  }
7363
- this._loader.finnalUrl = finnalUrl;
7913
+ finnalUrl = addUrlParams(finnalUrl, this._opts.urlParams);
7914
+ this._loader && (this._loader.finnalUrl = finnalUrl);
7364
7915
  parseSession = /_?session_id=([^&$]+)/.exec(finnalUrl);
7365
7916
  sessionId = parseSession ? parseSession[1] : Date.now() + "666";
7917
+ this._firstFrameObserver.changeFirstFrameState(RTC_FIRST_FRAME_STATE.OFFER_SDP_READY);
7366
7918
  this.emit(EVENT.LOAD_START, {
7367
7919
  url: finnalUrl,
7368
7920
  offersdp: (_this$_opts = this._opts) !== null && _this$_opts !== void 0 && _this$_opts.enableOriginSdpLogger ? offer.sdp : void 0,
7369
7921
  sessionId
7370
7922
  });
7371
7923
  reqStart = Date.now();
7372
- _context6.next = 33;
7373
- return this._loader.load(finnalUrl, {
7924
+ _context7.next = 37;
7925
+ return (_this$_loader = this._loader) === null || _this$_loader === void 0 ? void 0 : _this$_loader.load(finnalUrl, {
7374
7926
  body: JSON.stringify({
7375
7927
  sessionId,
7376
7928
  version: "1.0-html",
7377
7929
  localSdp: offer
7378
7930
  })
7379
7931
  });
7380
- case 33:
7381
- res = _context6.sent;
7932
+ case 37:
7933
+ res = _context7.sent;
7382
7934
  this.emit(EVENT.LOAD_RESPONSE_HEADERS, {
7383
7935
  headers: res.response.headers
7384
7936
  });
7385
7937
  answer = res === null || res === void 0 ? void 0 : res.data;
7386
7938
  if (!((answer === null || answer === void 0 ? void 0 : answer.code) === 404 || (answer === null || answer === void 0 ? void 0 : answer.code) === 403)) {
7387
- _context6.next = 41;
7939
+ _context7.next = 45;
7388
7940
  break;
7389
7941
  }
7390
7942
  err = StreamingError.create(answer.code === 404 ? ERR.NETWORK_NOTFOUND : ERR.NETWORK_FORBIDDEN, null, answer);
7391
7943
  err.errorType = ERR.NETWORK;
7392
7944
  this._emitError(err);
7393
- return _context6.abrupt("return");
7394
- case 41:
7945
+ return _context7.abrupt("return");
7946
+ case 45:
7395
7947
  if (!((answer === null || answer === void 0 ? void 0 : answer.code) !== 200)) {
7396
- _context6.next = 43;
7948
+ _context7.next = 47;
7397
7949
  break;
7398
7950
  }
7399
7951
  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));
7400
- case 43:
7401
- logger.log("answer:");
7402
- logger.log((_answer$remoteSdp = answer.remoteSdp) === null || _answer$remoteSdp === void 0 ? void 0 : _answer$remoteSdp.sdp);
7403
- _parsed = lib.parse(answer.remoteSdp.sdp);
7952
+ case 47:
7953
+ answerSdp = res.data.remoteSdp.sdp;
7404
7954
  this.emit(EVENT.LOAD_COMPLETE, {
7405
7955
  url: finnalUrl,
7406
7956
  elapsed: Date.now() - reqStart,
7407
- 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,
7408
- parsedSdp: _parsed === null || _parsed === void 0 ? void 0 : (_parsed$media = _parsed.media) === null || _parsed$media === void 0 ? void 0 : _parsed$media.map(function(media) {
7957
+ answersdp: (_this$_opts2 = this._opts) !== null && _this$_opts2 !== void 0 && _this$_opts2.enableOriginSdpLogger ? answerSdp : void 0,
7958
+ parsedSdp: parsed === null || parsed === void 0 ? void 0 : (_parsed$media = parsed.media) === null || _parsed$media === void 0 ? void 0 : _parsed$media.map(function(media) {
7409
7959
  return {
7410
7960
  candidates: media.candidates,
7411
7961
  rtp: media.rtp,
@@ -7413,9 +7963,50 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
7413
7963
  };
7414
7964
  })
7415
7965
  });
7416
- _parsed.media.forEach(function(x) {
7966
+ _context7.next = 54;
7967
+ break;
7968
+ case 51:
7969
+ _context7.prev = 51;
7970
+ _context7.t0 = _context7["catch"](26);
7971
+ this._emitError(StreamingError.network(_context7.t0));
7972
+ case 54:
7973
+ return _context7.abrupt("return", answerSdp);
7974
+ case 55:
7975
+ case "end":
7976
+ return _context7.stop();
7977
+ }
7978
+ }, _callee7, this, [[26, 51]]);
7979
+ }));
7980
+ function _getAnswerSdp(_x4) {
7981
+ return _getAnswerSdp2.apply(this, arguments);
7982
+ }
7983
+ return _getAnswerSdp;
7984
+ }()
7985
+ }, {
7986
+ key: "_handleAnswerSdp",
7987
+ value: function() {
7988
+ var _handleAnswerSdp2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee8(pc, answerSdp) {
7989
+ var parsed, answer;
7990
+ return _regeneratorRuntime$1().wrap(function _callee8$(_context8) {
7991
+ while (1)
7992
+ switch (_context8.prev = _context8.next) {
7993
+ case 0:
7994
+ logger.log("_handleAnswerSdp()", "invoked, answerSdp:", {
7995
+ answerSdp
7996
+ });
7997
+ if (answerSdp) {
7998
+ _context8.next = 3;
7999
+ break;
8000
+ }
8001
+ return _context8.abrupt("return");
8002
+ case 3:
8003
+ this._firstFrameObserver.changeFirstFrameState(RTC_FIRST_FRAME_STATE.ANSWER_SDP_RECV);
8004
+ parsed = lib.parse(answerSdp);
8005
+ parsed.media.forEach(function(x) {
7417
8006
  var _x$ssrcs, _x$ssrcs$find;
7418
- x.fingerprint.hash = x.fingerprint.hash.toUpperCase();
8007
+ if (x.fingerprint) {
8008
+ x.fingerprint.hash = x.fingerprint.hash.toUpperCase();
8009
+ }
7419
8010
  var msid = (_x$ssrcs = x.ssrcs) === null || _x$ssrcs === void 0 ? void 0 : (_x$ssrcs$find = _x$ssrcs.find(function(s) {
7420
8011
  return s.attribute === "msid";
7421
8012
  })) === null || _x$ssrcs$find === void 0 ? void 0 : _x$ssrcs$find.value;
@@ -7423,42 +8014,43 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
7423
8014
  x.msid = msid;
7424
8015
  }
7425
8016
  });
7426
- answer.remoteSdp.sdp = lib.write(_parsed);
7427
- logger.log("answer modified:\n", answer.remoteSdp.sdp);
8017
+ answer = lib.write(parsed);
8018
+ logger.log("answer modified:\n", {
8019
+ answer
8020
+ });
7428
8021
  this._rctConnectStartTs = Date.now();
7429
8022
  if (!(pc.signalingState === "closed")) {
7430
- _context6.next = 53;
8023
+ _context8.next = 11;
7431
8024
  break;
7432
8025
  }
7433
- return _context6.abrupt("return");
7434
- case 53:
7435
- _context6.next = 55;
7436
- return pc.setRemoteDescription(answer.remoteSdp);
7437
- case 55:
8026
+ return _context8.abrupt("return");
8027
+ case 11:
8028
+ _context8.next = 13;
8029
+ return pc.setRemoteDescription({
8030
+ type: "answer",
8031
+ sdp: answer
8032
+ });
8033
+ case 13:
8034
+ this._firstFrameObserver.changeFirstFrameState(RTC_FIRST_FRAME_STATE.ANSWER_SDP_READY);
7438
8035
  this._networkEvaluate = new NetworkEvaluate(pc, this._opts.networkEvaluateInterval);
7439
8036
  this._listenPeerStateTimeout();
7440
- _context6.next = 62;
7441
- break;
7442
- case 59:
7443
- _context6.prev = 59;
7444
- _context6.t0 = _context6["catch"](24);
7445
- this._emitError(StreamingError.network(_context6.t0));
7446
- case 62:
8037
+ this._firstFrameObserver.bindEvents(pc, this._videoTransceicer, this._media);
8038
+ case 17:
7447
8039
  case "end":
7448
- return _context6.stop();
8040
+ return _context8.stop();
7449
8041
  }
7450
- }, _callee6, this, [[24, 59]]);
8042
+ }, _callee8, this);
7451
8043
  }));
7452
- function _connect() {
7453
- return _connect2.apply(this, arguments);
8044
+ function _handleAnswerSdp(_x5, _x6) {
8045
+ return _handleAnswerSdp2.apply(this, arguments);
7454
8046
  }
7455
- return _connect;
8047
+ return _handleAnswerSdp;
7456
8048
  }()
7457
8049
  }, {
7458
8050
  key: "_listenPeerStateTimeout",
7459
8051
  value: function _listenPeerStateTimeout() {
7460
8052
  var _this6 = this;
7461
- this._peerStateTimer && this._clearPeerStateTimeout();
8053
+ this._clearPeerStateTimeout();
7462
8054
  if (this._opts.connectionStateChangeTimeout) {
7463
8055
  this._peerStateTimer = setTimeout(function() {
7464
8056
  _this6._emitError(StreamingError.create(ERR.MEDIA, ERR.SUB_TYPES.MEDIA_ERR_SRC_NOT_SUPPORTED, {
@@ -7470,128 +8062,162 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
7470
8062
  }, {
7471
8063
  key: "_clearPeerStateTimeout",
7472
8064
  value: function _clearPeerStateTimeout() {
7473
- clearTimeout(this._peerStateTimer);
7474
- this._peerStateTimer = null;
8065
+ if (this._peerStateTimer) {
8066
+ clearTimeout(this._peerStateTimer);
8067
+ delete this._peerStateTimer;
8068
+ }
7475
8069
  }
7476
8070
  }, {
7477
8071
  key: "_startRtcReport",
7478
8072
  value: function _startRtcReport() {
7479
8073
  var _this7 = this;
7480
8074
  this._stopRtcReport();
7481
- this._rtcReportTimer = setInterval(/* @__PURE__ */ _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee7() {
7482
- var _this7$_audioTranscei, _this7$_videoTranscei;
7483
- 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;
7484
- return _regeneratorRuntime$1().wrap(function _callee7$(_context7) {
7485
- while (1)
7486
- switch (_context7.prev = _context7.next) {
7487
- case 0:
7488
- 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))) {
7489
- _context7.next = 4;
7490
- break;
7491
- }
7492
- _this7._preAudioStats = null;
7493
- _this7._preVideoStats = null;
7494
- return _context7.abrupt("return");
7495
- case 4:
7496
- if (!_this7._audioStallObserver && _this7._audioTransceicer) {
7497
- _this7._audioStallObserver = new AudioStallObserver();
7498
- _this7._audioStallObserver.start(_this7._audioTransceicer);
7499
- }
7500
- if (!_this7._videoStallObserver && _this7._video) {
7501
- _this7._videoStallObserver = new VideoStallObserver();
7502
- _this7._videoStallObserver.start(_this7._media);
7503
- }
7504
- if (!_this7._networkQuality && _this7._opts.enableNetworkQuality) {
7505
- _this7._networkQuality = new NetworkQuality(_this7._pc, _this7._opts.networkQuality);
7506
- }
7507
- _context7.next = 9;
7508
- return Promise.all([getRecvAudioStats(_this7._audioTransceicer.receiver.getStats()), getRecvVideoStats(_this7._videoTransceicer.receiver.getStats())]);
7509
- case 9:
7510
- _yield$Promise$all3 = _context7.sent;
7511
- _yield$Promise$all4 = _slicedToArray(_yield$Promise$all3, 2);
7512
- curAudioStats = _yield$Promise$all4[0];
7513
- curVideoStats = _yield$Promise$all4[1];
7514
- if (!(_this7._preAudioStats && _this7._preVideoStats)) {
7515
- _context7.next = 26;
7516
- break;
7517
- }
7518
- audioStats = diffRecvAudioStats(_this7._preAudioStats, curAudioStats);
7519
- videoStats = diffRecvVideoStats(_this7._preVideoStats, curVideoStats);
7520
- _context7.next = 18;
7521
- return (_this7$_audioStallObs = _this7._audioStallObserver) === null || _this7$_audioStallObs === void 0 ? void 0 : _this7$_audioStallObs.getAudioStallInfo();
7522
- case 18:
7523
- audioStallInfo = _context7.sent;
7524
- _context7.next = 21;
7525
- return (_this7$_videoStallObs = _this7._videoStallObserver) === null || _this7$_videoStallObs === void 0 ? void 0 : _this7$_videoStallObs.getStallInfo({
7526
- interval: videoStats.statsInterval,
7527
- frameRateReceived: videoStats.frameRateReceived,
7528
- frameRateDecoded: videoStats.frameRateDecoded,
7529
- bitrate: videoStats.receivedKBitrate
7530
- });
7531
- case 21:
7532
- videoStallInfo = _context7.sent;
7533
- _ref6 = (_this7$_networkQualit = (_this7$_networkQualit2 = _this7._networkQuality) === null || _this7$_networkQualit2 === void 0 ? void 0 : _this7$_networkQualit2.getDownlinkQuality(_objectSpread2$2(_objectSpread2$2({}, audioStats), {}, {
7534
- stallDuration: audioStallInfo.stallDuration
7535
- }), _objectSpread2$2(_objectSpread2$2({}, videoStats), {}, {
7536
- stallDuration: videoStallInfo.stall.stallDuration100ms || videoStallInfo.stall.stallDuration500ms
7537
- }))) !== null && _this7$_networkQualit !== void 0 ? _this7$_networkQualit : [], _ref7 = _slicedToArray(_ref6, 2), quality = _ref7[0], qualityInfo = _ref7[1];
7538
- if (_this7._opts.enableAdaptiveJitterBuffer) {
7539
- _this7._handleJitterBuffer(qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.qualityQos, _this7._opts.adaptiveJitterBuffer, _this7._opts.networkStrategy);
7540
- }
7541
- if (videoStats.estimatedPlayoutTimestamp && audioStats.estimatedPlayoutTimestamp) {
7542
- av_sync_diff = videoStats.estimatedPlayoutTimestamp - audioStats.estimatedPlayoutTimestamp;
7543
- }
7544
- _this7.emit(EXTEND_EVENTS.RTC_NETWORK, {
7545
- interval: videoStats.statsInterval,
7546
- network_quality: quality,
7547
- audio_stall_duration: audioStallInfo.stallDuration,
7548
- audio_stall_count: audioStallInfo.stallCount,
7549
- audio_stall_time_per_100sec: audioStallInfo.stallDuration / audioStats.statsInterval * 100,
7550
- audio_stall_count_per_100sec: audioStallInfo.stallCount / audioStats.statsInterval * 100 * 1e3,
7551
- video_stall_duration: videoStallInfo.stall.stallDuration500ms,
7552
- video_stall_count: videoStallInfo.stall.stallCount500ms,
7553
- video_stall_duration_100ms: videoStallInfo.stall.stallDuration100ms,
7554
- video_stall_count_100ms: videoStallInfo.stall.stallCount100ms,
7555
- video_stall_time_per_100sec: videoStallInfo.stall.stallDuration500ms / videoStats.statsInterval * 100,
7556
- video_stall_count_per_100sec: videoStallInfo.stall.stallCount500ms / videoStats.statsInterval * 100 * 1e3,
7557
- rtt: videoStats.rtt,
7558
- video_jb_delay: videoStats.jitterBufferDelay,
7559
- audio_jb_delay: audioStats.jitterBufferDelay,
7560
- audio_lost_rate: audioStats.audioLossRate,
7561
- video_lost_rate: videoStats.videoLossRate,
7562
- video_retransmitted_rate: videoStats.retransmittedRate,
7563
- quality_audio_level: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.audioLevel,
7564
- quality_video_level: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.videoLevel,
7565
- quality_audio_qos: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.audioQos,
7566
- quality_video_qos: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.videoQos,
7567
- quality_qos: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.qualityQos,
7568
- quality_audio_qoe: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.audioQoe,
7569
- quality_video_qoe: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.videoQoe,
7570
- current_delay: _this7._getDelay(),
7571
- visibility_state: document.visibilityState,
7572
- target_delay: _this7._targetDelayHint,
7573
- av_sync_diff,
7574
- set_delay_error: _this7._setDelayError || null
7575
- });
7576
- case 26:
7577
- _this7._preAudioStats = curAudioStats;
7578
- _this7._preVideoStats = curVideoStats;
7579
- _this7.set_delay_error = null;
7580
- case 29:
7581
- case "end":
7582
- return _context7.stop();
7583
- }
7584
- }, _callee7);
7585
- })), 2e3);
8075
+ var report = /* @__PURE__ */ function() {
8076
+ var _ref5 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee9() {
8077
+ var _this7$_audioTranscei, _this7$_videoTranscei;
8078
+ 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;
8079
+ return _regeneratorRuntime$1().wrap(function _callee9$(_context9) {
8080
+ while (1)
8081
+ switch (_context9.prev = _context9.next) {
8082
+ case 0:
8083
+ 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))) {
8084
+ _context9.next = 4;
8085
+ break;
8086
+ }
8087
+ _this7._preAudioStats = null;
8088
+ _this7._preVideoStats = null;
8089
+ return _context9.abrupt("return");
8090
+ case 4:
8091
+ if (!_this7._audioStallObserver && _this7._audioTransceicer) {
8092
+ _this7._audioStallObserver = new AudioStallObserver();
8093
+ _this7._audioStallObserver.start(_this7._audioTransceicer);
8094
+ }
8095
+ if (!_this7._videoStallObserver && _this7._video && _this7._media) {
8096
+ _this7._videoStallObserver = new VideoStallObserver();
8097
+ _this7._videoStallObserver.start(_this7._media);
8098
+ }
8099
+ if (!_this7._frameRecvCallback && _this7._media) {
8100
+ _this7._frameRecvCallback = new VideoFrameRecvCallback();
8101
+ (_this7$_frameRecvCall = _this7._frameRecvCallback) === null || _this7$_frameRecvCall === void 0 ? void 0 : _this7$_frameRecvCall.start(_this7._media);
8102
+ }
8103
+ if (_this7._pc && !_this7._networkQuality && _this7._opts.enableNetworkQuality && _this7._opts.networkQuality) {
8104
+ _this7._networkQuality = new NetworkQuality(_this7._pc, _this7._opts.networkQuality);
8105
+ }
8106
+ _context9.next = 10;
8107
+ return Promise.all([getRecvAudioStats(_this7._audioTransceicer.receiver.getStats()), getRecvVideoStats(_this7._videoTransceicer.receiver.getStats())]);
8108
+ case 10:
8109
+ _yield$Promise$all3 = _context9.sent;
8110
+ _yield$Promise$all4 = _slicedToArray(_yield$Promise$all3, 2);
8111
+ curAudioStats = _yield$Promise$all4[0];
8112
+ curVideoStats = _yield$Promise$all4[1];
8113
+ if (!(_this7._preAudioStats && _this7._preVideoStats)) {
8114
+ _context9.next = 28;
8115
+ break;
8116
+ }
8117
+ audioStats = diffRecvAudioStats(_this7._preAudioStats, curAudioStats);
8118
+ videoStats = diffRecvVideoStats(_this7._preVideoStats, curVideoStats);
8119
+ _this7._videoJitterBufferDelay = videoStats.jitterBufferDelay;
8120
+ _context9.next = 20;
8121
+ return (_this7$_audioStallObs = _this7._audioStallObserver) === null || _this7$_audioStallObs === void 0 ? void 0 : _this7$_audioStallObs.getAudioStallInfo();
8122
+ case 20:
8123
+ audioStallInfo = _context9.sent;
8124
+ _context9.next = 23;
8125
+ return (_this7$_videoStallObs = _this7._videoStallObserver) === null || _this7$_videoStallObs === void 0 ? void 0 : _this7$_videoStallObs.getStallInfo({
8126
+ interval: videoStats.statsInterval,
8127
+ frameRateReceived: videoStats.receivedFrameRate,
8128
+ frameRateDecoded: videoStats.decoderOutputFrameRate,
8129
+ bitrate: videoStats.receivedKBitrate
8130
+ });
8131
+ case 23:
8132
+ videoStallInfo = _context9.sent;
8133
+ _ref6 = (_this7$_networkQualit = (_this7$_networkQualit2 = _this7._networkQuality) === null || _this7$_networkQualit2 === void 0 ? void 0 : _this7$_networkQualit2.getDownlinkQuality(_objectSpread2$2(_objectSpread2$2({}, audioStats), {}, {
8134
+ stallDuration: (audioStallInfo === null || audioStallInfo === void 0 ? void 0 : audioStallInfo.stallDuration) || 0
8135
+ }), _objectSpread2$2(_objectSpread2$2({}, videoStats), {}, {
8136
+ stallDuration: (videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallDuration100ms) || (videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallDuration500ms) || 0
8137
+ }))) !== null && _this7$_networkQualit !== void 0 ? _this7$_networkQualit : [], _ref7 = _slicedToArray(_ref6, 2), quality = _ref7[0], qualityInfo = _ref7[1];
8138
+ if (_this7._opts.enableAdaptiveJitterBuffer) {
8139
+ _this7._handleJitterBuffer(qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.qualityQos, _this7._opts.adaptiveJitterBuffer, _this7._opts.networkStrategy);
8140
+ }
8141
+ if (videoStats.estimatedPlayoutTimestamp && audioStats.estimatedPlayoutTimestamp) {
8142
+ av_sync_diff = videoStats.estimatedPlayoutTimestamp - audioStats.estimatedPlayoutTimestamp;
8143
+ }
8144
+ _this7.emit(EXTEND_EVENTS.RTC_NETWORK, _objectSpread2$2({
8145
+ interval: videoStats.statsInterval,
8146
+ network_quality: quality,
8147
+ audio_stall_duration: audioStallInfo === null || audioStallInfo === void 0 ? void 0 : audioStallInfo.stallDuration,
8148
+ audio_stall_count: audioStallInfo === null || audioStallInfo === void 0 ? void 0 : audioStallInfo.stallCount,
8149
+ audio_stall_time_per_100sec: ((audioStallInfo === null || audioStallInfo === void 0 ? void 0 : audioStallInfo.stallDuration) || 0) / audioStats.statsInterval * 100,
8150
+ audio_stall_count_per_100sec: ((audioStallInfo === null || audioStallInfo === void 0 ? void 0 : audioStallInfo.stallCount) || 0) / audioStats.statsInterval * 100 * 1e3,
8151
+ video_stall_duration: videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallDuration500ms,
8152
+ video_stall_count: videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallCount500ms,
8153
+ video_stall_duration_100ms: videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallDuration100ms,
8154
+ video_stall_count_100ms: videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallCount100ms,
8155
+ video_stall_time_per_100sec: ((videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallDuration500ms) || 0) / videoStats.statsInterval * 100,
8156
+ video_stall_count_per_100sec: ((videoStallInfo === null || videoStallInfo === void 0 ? void 0 : videoStallInfo.stall.stallCount500ms) || 0) / videoStats.statsInterval * 100 * 1e3,
8157
+ rtt: videoStats.rtt,
8158
+ video_jb_delay: videoStats.jitterBufferDelay,
8159
+ audio_jb_delay: audioStats.jitterBufferDelay,
8160
+ audio_lost_rate: audioStats.audioLossRate,
8161
+ video_lost_rate: videoStats.videoLossRate,
8162
+ video_retransmitted_rate: videoStats.retransmittedRate,
8163
+ quality_audio_level: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.audioLevel,
8164
+ quality_video_level: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.videoLevel,
8165
+ quality_audio_qos: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.audioQos,
8166
+ quality_video_qos: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.videoQos,
8167
+ quality_qos: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.qualityQos,
8168
+ quality_audio_qoe: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.audioQoe,
8169
+ quality_video_qoe: qualityInfo === null || qualityInfo === void 0 ? void 0 : qualityInfo.videoQoe,
8170
+ current_delay: _this7._getDelay(),
8171
+ visibility_state: document.visibilityState,
8172
+ target_delay: _this7._targetDelayHint,
8173
+ av_sync_diff,
8174
+ set_delay_error: _this7._setDelayError || null,
8175
+ video_width: ((_this7$_media = _this7._media) === null || _this7$_media === void 0 ? void 0 : _this7$_media.videoWidth) || 0,
8176
+ video_height: ((_this7$_media2 = _this7._media) === null || _this7$_media2 === void 0 ? void 0 : _this7$_media2.videoHeight) || 0,
8177
+ abr_state: videoStats.abrState || "none",
8178
+ recv_frame_rate: videoStats.receivedFrameRate,
8179
+ decode_frame_rate: videoStats.decoderOutputFrameRate,
8180
+ pli: videoStats.pliCount,
8181
+ drop_frame_rate: videoStats.framesDropped,
8182
+ audio_packets_received: audioStats.packetsReceived,
8183
+ video_packets_received: videoStats.packetsReceived,
8184
+ video_muted: (_this7$_media3 = _this7._media) === null || _this7$_media3 === void 0 ? void 0 : _this7$_media3.muted,
8185
+ video_paused: (_this7$_media4 = _this7._media) === null || _this7$_media4 === void 0 ? void 0 : _this7$_media4.paused,
8186
+ video_volume: (_this7$_media5 = _this7._media) === null || _this7$_media5 === void 0 ? void 0 : _this7$_media5.volume,
8187
+ video_current_time: (_this7$_media6 = _this7._media) === null || _this7$_media6 === void 0 ? void 0 : _this7$_media6.currentTime
8188
+ }, ((_this7$_frameRecvCall2 = _this7._frameRecvCallback) === null || _this7$_frameRecvCall2 === void 0 ? void 0 : _this7$_frameRecvCall2.getRecentRenderInfo4Report()) || {}));
8189
+ case 28:
8190
+ _this7._preAudioStats = curAudioStats;
8191
+ _this7._preVideoStats = curVideoStats;
8192
+ _this7._setDelayError = null;
8193
+ case 31:
8194
+ case "end":
8195
+ return _context9.stop();
8196
+ }
8197
+ }, _callee9);
8198
+ }));
8199
+ return function report2() {
8200
+ return _ref5.apply(this, arguments);
8201
+ };
8202
+ }();
8203
+ this._rtcReportTimer = setInterval(function() {
8204
+ return report();
8205
+ }, 2e3);
8206
+ report();
7586
8207
  }
7587
8208
  }, {
7588
8209
  key: "_handleJitterBuffer",
7589
8210
  value: function _handleJitterBuffer(quality, adaptiveJitterBuffer, networkStrategy) {
8211
+ if (!adaptiveJitterBuffer || !networkStrategy) {
8212
+ return;
8213
+ }
7590
8214
  this._networkQualityResult.push(quality);
7591
8215
  if (this._networkQualityResult.length > adaptiveJitterBuffer.networkWindow) {
7592
8216
  this._networkQualityResult.shift();
7593
8217
  }
7594
- var validNetworkQualityResult = this._networkQualityResult.filter(Boolean);
8218
+ var validNetworkQualityResult = this._networkQualityResult.filter(function(v) {
8219
+ return typeof v === "number";
8220
+ });
7595
8221
  if (validNetworkQualityResult.length === adaptiveJitterBuffer.networkWindow) {
7596
8222
  var _networkStrategy$aver;
7597
8223
  var averageQuality;
@@ -7615,13 +8241,15 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
7615
8241
  }, {
7616
8242
  key: "_stopRtcReport",
7617
8243
  value: function _stopRtcReport() {
7618
- var _this$_audioStallObse, _this$_videoStallObse, _this$_networkQuality;
8244
+ var _this$_audioStallObse, _this$_videoStallObse, _this$_frameRecvCallb, _this$_networkQuality;
7619
8245
  (_this$_audioStallObse = this._audioStallObserver) === null || _this$_audioStallObse === void 0 ? void 0 : _this$_audioStallObse.destroy();
7620
8246
  (_this$_videoStallObse = this._videoStallObserver) === null || _this$_videoStallObse === void 0 ? void 0 : _this$_videoStallObse.destroy();
8247
+ (_this$_frameRecvCallb = this._frameRecvCallback) === null || _this$_frameRecvCallb === void 0 ? void 0 : _this$_frameRecvCallb.stop();
8248
+ delete this._frameRecvCallback;
7621
8249
  (_this$_networkQuality = this._networkQuality) === null || _this$_networkQuality === void 0 ? void 0 : _this$_networkQuality.destroy();
7622
- this._audioStallObserver = null;
7623
- this._videoStallObserver = null;
7624
- this._networkQuality = null;
8250
+ delete this._audioStallObserver;
8251
+ delete this._videoStallObserver;
8252
+ delete this._networkQuality;
7625
8253
  this._preAudioStats = null;
7626
8254
  this._preVideoStats = null;
7627
8255
  if (this._rtcReportTimer) {
@@ -7629,60 +8257,89 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
7629
8257
  this._rtcReportTimer = 0;
7630
8258
  }
7631
8259
  }
8260
+ }, {
8261
+ key: "_clearDelay",
8262
+ value: function _clearDelay() {
8263
+ if (this._setDelayTimer) {
8264
+ clearInterval(this._setDelayTimer);
8265
+ delete this._setDelayTimer;
8266
+ }
8267
+ this._targetDelayHint = null;
8268
+ this._setDelayError = null;
8269
+ }
7632
8270
  }, {
7633
8271
  key: "_disconnect",
7634
- value: function _disconnect() {
7635
- var _this$_loader, _this$_networkEvaluat2;
7636
- (_this$_loader = this._loader) === null || _this$_loader === void 0 ? void 0 : _this$_loader.cancel();
8272
+ value: function _disconnect(reason) {
8273
+ var _this$_loader2, _this$_networkEvaluat2;
8274
+ this._clearDelay();
8275
+ this._clearMediaSrc();
8276
+ (_this$_loader2 = this._loader) === null || _this$_loader2 === void 0 ? void 0 : _this$_loader2.cancel();
7637
8277
  (_this$_networkEvaluat2 = this._networkEvaluate) === null || _this$_networkEvaluat2 === void 0 ? void 0 : _this$_networkEvaluat2.destroy();
7638
8278
  this._stopRtcReport();
7639
8279
  clearTimeout(this._checkStatsErrorTimer);
7640
8280
  this._clearPeerStateTimeout();
8281
+ this._firstFrameObserver.setFailureReason(reason);
8282
+ this._firstFrameObserver.reset();
7641
8283
  this._audioTransceicer = null;
7642
8284
  this._videoTransceicer = null;
7643
8285
  this._mediaStream = null;
7644
- this._networkEvaluate = null;
8286
+ }
8287
+ }, {
8288
+ key: "_clearMediaSrc",
8289
+ value: function _clearMediaSrc() {
8290
+ if (this._media) {
8291
+ this._media.srcObject = null;
8292
+ this._media.removeAttribute("src");
8293
+ }
7645
8294
  }
7646
8295
  }, {
7647
8296
  key: "_emitError",
7648
8297
  value: function _emitError(error) {
8298
+ var _error$originError;
8299
+ logger.warn(error);
8300
+ this._clearDelay();
8301
+ 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);
8302
+ this._firstFrameObserver.reset();
7649
8303
  this.emit(EVENT.ERROR, error);
7650
8304
  clearTimeout(this._checkStatsErrorTimer);
7651
8305
  this._clearPeerStateTimeout();
7652
8306
  if (this._pc) {
7653
8307
  this._pc.close();
7654
- if (this._media) {
7655
- this._media.srcObject = null;
7656
- this._media.removeAttribute("src");
7657
- }
8308
+ this._clearMediaSrc();
7658
8309
  }
7659
8310
  }
7660
8311
  }, {
7661
8312
  key: "_createEmptyPeer",
7662
8313
  value: function() {
7663
- var _createEmptyPeer2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee8() {
8314
+ var _createEmptyPeer2 = _asyncToGenerator$1(/* @__PURE__ */ _regeneratorRuntime$1().mark(function _callee10() {
7664
8315
  var pc;
7665
- return _regeneratorRuntime$1().wrap(function _callee8$(_context8) {
8316
+ return _regeneratorRuntime$1().wrap(function _callee10$(_context10) {
7666
8317
  while (1)
7667
- switch (_context8.prev = _context8.next) {
8318
+ switch (_context10.prev = _context10.next) {
7668
8319
  case 0:
7669
8320
  pc = new RTCPeerConnection();
7670
- _context8.next = 3;
8321
+ _context10.next = 3;
7671
8322
  return pc.createOffer();
7672
8323
  case 3:
7673
8324
  pc.close();
7674
- pc = null;
7675
- case 5:
8325
+ case 4:
7676
8326
  case "end":
7677
- return _context8.stop();
8327
+ return _context10.stop();
7678
8328
  }
7679
- }, _callee8);
8329
+ }, _callee10);
7680
8330
  }));
7681
8331
  function _createEmptyPeer() {
7682
8332
  return _createEmptyPeer2.apply(this, arguments);
7683
8333
  }
7684
8334
  return _createEmptyPeer;
7685
8335
  }()
8336
+ }, {
8337
+ key: "_emitFirstFrameState",
8338
+ value: function _emitFirstFrameState(info, extra) {
8339
+ this.emit(EXTEND_EVENTS.RTC_FIRST_FRAME, _objectSpread2$2(_objectSpread2$2(_objectSpread2$2({}, info), extra), {}, {
8340
+ initOptionsIncludePreload: !!this._opts.preloadPromise
8341
+ }));
8342
+ }
7686
8343
  }, {
7687
8344
  key: "_changeVolumeInHarmonyWorkaround",
7688
8345
  value: function _changeVolumeInHarmonyWorkaround() {
@@ -7696,7 +8353,8 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
7696
8353
  enumerable: true,
7697
8354
  get: originalDescriptor.get,
7698
8355
  set: function set(val) {
7699
- originalDescriptor.set.call(this, val);
8356
+ var _originalDescriptor$s;
8357
+ (_originalDescriptor$s = originalDescriptor.set) === null || _originalDescriptor$s === void 0 ? void 0 : _originalDescriptor$s.call(this, val);
7700
8358
  var _changeNumberInRange = changeNumberInRange(this.volume, 0, 1, 0.01), _changeNumberInRange2 = _slicedToArray(_changeNumberInRange, 2), sourceVolume = _changeNumberInRange2[0], targetVolume = _changeNumberInRange2[1];
7701
8359
  this.volume = targetVolume;
7702
8360
  this.volume = sourceVolume;
@@ -7712,14 +8370,47 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
7712
8370
  }
7713
8371
  }
7714
8372
  }
8373
+ }, {
8374
+ key: "_mutedBeforePlayingWorkaround",
8375
+ value: function _mutedBeforePlayingWorkaround() {
8376
+ var _this9 = this;
8377
+ if (isHeyTapBrowser() || isVivoBrowser()) {
8378
+ var originalDescriptor = Object.getOwnPropertyDescriptor(HTMLMediaElement.prototype, "muted");
8379
+ if (this._media && originalDescriptor) {
8380
+ logger.log("apply muted workaround for vivo & oppo");
8381
+ var originalMuted = this._media.muted;
8382
+ this._media.muted = true;
8383
+ Object.defineProperty(this._media, "muted", {
8384
+ configurable: true,
8385
+ enumerable: true,
8386
+ get: function get() {
8387
+ return originalMuted;
8388
+ },
8389
+ set: function set(val) {
8390
+ logger.log("muted workaround. set muted =", val);
8391
+ originalMuted = val;
8392
+ }
8393
+ });
8394
+ var revertMutedProxy = function revertMutedProxy2() {
8395
+ logger.log("revert muted workaround. muted:", originalMuted);
8396
+ if (_this9._media) {
8397
+ Object.defineProperty(_this9._media, "muted", originalDescriptor);
8398
+ _this9._media.muted = originalMuted;
8399
+ _this9._media.removeEventListener("playing", revertMutedProxy2);
8400
+ }
8401
+ };
8402
+ this._media.addEventListener("playing", revertMutedProxy);
8403
+ }
8404
+ }
8405
+ }
7715
8406
  }, {
7716
8407
  key: "destroy",
7717
8408
  value: function destroy(keepClearMediaStream) {
7718
- var _this$_revertVolumeWo, _this$_media;
7719
- this._disconnect();
8409
+ var _this$_revertVolumeWo, _this$_media3;
8410
+ this._disconnect("invoke destroy");
7720
8411
  (_this$_revertVolumeWo = this._revertVolumeWorkaround) === null || _this$_revertVolumeWo === void 0 ? void 0 : _this$_revertVolumeWo.call(this);
7721
8412
  delete this._revertVolumeWorkaround;
7722
- (_this$_media = this._media) === null || _this$_media === void 0 ? void 0 : _this$_media.removeEventListener("timeupdate", this._mockWaitingByTimeupdate);
8413
+ (_this$_media3 = this._media) === null || _this$_media3 === void 0 ? void 0 : _this$_media3.removeEventListener("timeupdate", this._mockWaitingByTimeupdate);
7723
8414
  if (this._media && !keepClearMediaStream) {
7724
8415
  this._media.srcObject = null;
7725
8416
  }
@@ -7730,7 +8421,6 @@ var Rts = /* @__PURE__ */ function(_EventEmitter) {
7730
8421
  this._media = null;
7731
8422
  this._player = null;
7732
8423
  this._pc = null;
7733
- this._opts = null;
7734
8424
  }
7735
8425
  }], [{
7736
8426
  key: "enableLogger",
@@ -7759,15 +8449,11 @@ var RtsPlugin = /* @__PURE__ */ function(_BasePlugin) {
7759
8449
  function RtsPlugin2() {
7760
8450
  var _this;
7761
8451
  _classCallCheck$3(this, RtsPlugin2);
7762
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
7763
- args[_key] = arguments[_key];
7764
- }
7765
- _this = _super.call.apply(_super, [this].concat(args));
7766
- _defineProperty$2(_assertThisInitialized$1(_this), "_rts", null);
7767
- _defineProperty$2(_assertThisInitialized$1(_this), "_mediaStream", null);
7768
- _defineProperty$2(_assertThisInitialized$1(_this), "_disconnectTimer", void 0);
7769
- _defineProperty$2(_assertThisInitialized$1(_this), "_rtsOpts", null);
7770
- _defineProperty$2(_assertThisInitialized$1(_this), "_onPause", function() {
8452
+ _this = _super.apply(this, arguments);
8453
+ _this._rts = null;
8454
+ _this._rtsOpts = null;
8455
+ _this._mediaStream = null;
8456
+ _this._onPause = function() {
7771
8457
  if (_this._disconnectTimer) {
7772
8458
  return;
7773
8459
  }
@@ -7775,8 +8461,8 @@ var RtsPlugin = /* @__PURE__ */ function(_BasePlugin) {
7775
8461
  _this._closeAfterPause();
7776
8462
  _this._clearDisconnectTimer();
7777
8463
  }, _this.config.disconnectTime * 1e3);
7778
- });
7779
- _defineProperty$2(_assertThisInitialized$1(_this), "_reInit", function() {
8464
+ };
8465
+ _this._reInit = function() {
7780
8466
  var _this$_rts;
7781
8467
  _this._clearDisconnectTimer();
7782
8468
  if ((_this$_rts = _this._rts) !== null && _this$_rts !== void 0 && _this$_rts._pc) {
@@ -7784,8 +8470,8 @@ var RtsPlugin = /* @__PURE__ */ function(_BasePlugin) {
7784
8470
  }
7785
8471
  _this._init();
7786
8472
  _this._bindRtsEvents();
7787
- });
7788
- _defineProperty$2(_assertThisInitialized$1(_this), "_init", function() {
8473
+ };
8474
+ _this._init = function() {
7789
8475
  var _this$_rts2;
7790
8476
  (_this$_rts2 = _this._rts) === null || _this$_rts2 === void 0 ? void 0 : _this$_rts2.destroy();
7791
8477
  var config = _this.player.config;
@@ -7804,9 +8490,11 @@ var RtsPlugin = /* @__PURE__ */ function(_BasePlugin) {
7804
8490
  }
7805
8491
  }, rtsOpts));
7806
8492
  _this._rts.load(config.url);
7807
- });
7808
- _defineProperty$2(_assertThisInitialized$1(_this), "_onSwitchURL", function(url) {
7809
- if (url) {
8493
+ };
8494
+ _this._onSwitchURL = function(url) {
8495
+ if (url.startsWith("blob:") || url === "") {
8496
+ url = _this.player.config.url;
8497
+ } else if (url) {
7810
8498
  _this.player.config.url = url;
7811
8499
  }
7812
8500
  if (_this._rts) {
@@ -7814,14 +8502,25 @@ var RtsPlugin = /* @__PURE__ */ function(_BasePlugin) {
7814
8502
  } else {
7815
8503
  _this._reInit();
7816
8504
  }
7817
- });
7818
- _defineProperty$2(_assertThisInitialized$1(_this), "destroy", function() {
8505
+ };
8506
+ _this.__retry = function() {
8507
+ _this.player.removeClass(STATE_CLASS.ERROR);
8508
+ _this.player.addClass(STATE_CLASS.LOADING);
8509
+ runHooks(_assertThisInitialized$1(_this), "retry", function() {
8510
+ _this.player.src = "";
8511
+ _this.player.once(CANPLAY, function() {
8512
+ _this.player.mediaPlay();
8513
+ });
8514
+ });
8515
+ };
8516
+ _this.destroy = function() {
7819
8517
  var _this$_rts3;
7820
8518
  _this.player.switchURL = _this._originSwitchFn;
8519
+ _this.player.retry = _this._originRetry;
7821
8520
  _this._clearDisconnectTimer();
7822
8521
  (_this$_rts3 = _this._rts) === null || _this$_rts3 === void 0 ? void 0 : _this$_rts3.destroy();
7823
8522
  _this._rts = null;
7824
- });
8523
+ };
7825
8524
  return _this;
7826
8525
  }
7827
8526
  _createClass$3(RtsPlugin2, [{
@@ -7831,32 +8530,38 @@ var RtsPlugin = /* @__PURE__ */ function(_BasePlugin) {
7831
8530
  return (_this$_rts4 = this._rts) === null || _this$_rts4 === void 0 ? void 0 : _this$_rts4.pc;
7832
8531
  }
7833
8532
  }, {
7834
- key: "videoTrack",
8533
+ key: "jitterBufferDelay",
7835
8534
  get: function get() {
7836
8535
  var _this$_rts5;
7837
- return (_this$_rts5 = this._rts) === null || _this$_rts5 === void 0 ? void 0 : _this$_rts5.videoTack;
8536
+ return ((_this$_rts5 = this._rts) === null || _this$_rts5 === void 0 ? void 0 : _this$_rts5.getJitterBufferDelay()) || 0;
7838
8537
  }
7839
8538
  }, {
7840
- key: "audioTrack",
8539
+ key: "loader",
7841
8540
  get: function get() {
7842
8541
  var _this$_rts6;
7843
- return (_this$_rts6 = this._rts) === null || _this$_rts6 === void 0 ? void 0 : _this$_rts6.audioTrack;
8542
+ return (_this$_rts6 = this._rts) === null || _this$_rts6 === void 0 ? void 0 : _this$_rts6.loader;
7844
8543
  }
7845
8544
  }, {
7846
- key: "core",
8545
+ key: "videoTrack",
7847
8546
  get: function get() {
7848
- return this._rts;
8547
+ var _this$_rts7;
8548
+ return (_this$_rts7 = this._rts) === null || _this$_rts7 === void 0 ? void 0 : _this$_rts7.videoTack;
7849
8549
  }
7850
8550
  }, {
7851
- key: "loader",
8551
+ key: "audioTrack",
7852
8552
  get: function get() {
7853
- var _this$_rts7;
7854
- return (_this$_rts7 = this._rts) === null || _this$_rts7 === void 0 ? void 0 : _this$_rts7.loader;
8553
+ var _this$_rts8;
8554
+ return (_this$_rts8 = this._rts) === null || _this$_rts8 === void 0 ? void 0 : _this$_rts8.audioTrack;
8555
+ }
8556
+ }, {
8557
+ key: "core",
8558
+ get: function get() {
8559
+ return this._rts;
7855
8560
  }
7856
8561
  }, {
7857
8562
  key: "version",
7858
8563
  get: function get() {
7859
- return "0.2.1-alpha.47";
8564
+ return "0.2.1-alpha.53";
7860
8565
  }
7861
8566
  }, {
7862
8567
  key: "beforePlayerInit",
@@ -7864,9 +8569,15 @@ var RtsPlugin = /* @__PURE__ */ function(_BasePlugin) {
7864
8569
  var _this$player2, _this$player$config, _this$player$config$r, _this2 = this;
7865
8570
  this._init();
7866
8571
  if (!this._originSwitchFn) {
7867
- this._originSwitchFn = this.player.switchURL.bind(this.player);
8572
+ var _this$player$switchUR;
8573
+ this._originSwitchFn = (_this$player$switchUR = this.player.switchURL) === null || _this$player$switchUR === void 0 ? void 0 : _this$player$switchUR.bind(this.player);
8574
+ }
8575
+ if (!this._originRetry) {
8576
+ var _this$player$retry;
8577
+ this._originRetry = (_this$player$retry = this.player.retry) === null || _this$player$retry === void 0 ? void 0 : _this$player$retry.bind(this.player);
7868
8578
  }
7869
8579
  this.player.switchURL = this._onSwitchURL;
8580
+ this.player.retry = this.__retry;
7870
8581
  (_this$player2 = this.player) === null || _this$player2 === void 0 ? void 0 : _this$player2.useHooks("replay", this._onSwitchURL);
7871
8582
  this.on(URL_CHANGE, this._onSwitchURL);
7872
8583
  this.on(DESTROY, this.destroy);
@@ -7896,6 +8607,7 @@ var RtsPlugin = /* @__PURE__ */ function(_BasePlugin) {
7896
8607
  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)) {
7897
8608
  _this2.player.video.srcObject = new MediaStream();
7898
8609
  }
8610
+ return "";
7899
8611
  }
7900
8612
  }
7901
8613
  }
@@ -7906,26 +8618,26 @@ var RtsPlugin = /* @__PURE__ */ function(_BasePlugin) {
7906
8618
  }, {
7907
8619
  key: "getStats",
7908
8620
  value: function getStats2() {
7909
- var _this$_rts8;
7910
- return (_this$_rts8 = this._rts) === null || _this$_rts8 === void 0 ? void 0 : _this$_rts8.getStats();
8621
+ var _this$_rts9;
8622
+ return (_this$_rts9 = this._rts) === null || _this$_rts9 === void 0 ? void 0 : _this$_rts9.getStats();
7911
8623
  }
7912
8624
  }, {
7913
8625
  key: "getStatsSnapshoot",
7914
8626
  value: function getStatsSnapshoot2() {
7915
- var _this$_rts9;
7916
- return (_this$_rts9 = this._rts) === null || _this$_rts9 === void 0 ? void 0 : _this$_rts9.getStatsSnapshoot();
8627
+ var _this$_rts10;
8628
+ return (_this$_rts10 = this._rts) === null || _this$_rts10 === void 0 ? void 0 : _this$_rts10.getStatsSnapshoot();
7917
8629
  }
7918
8630
  }, {
7919
8631
  key: "getNetWorkInfo",
7920
8632
  value: function getNetWorkInfo() {
7921
- var _this$_rts10;
7922
- return (_this$_rts10 = this._rts) === null || _this$_rts10 === void 0 ? void 0 : _this$_rts10.networkStats;
8633
+ var _this$_rts11;
8634
+ return (_this$_rts11 = this._rts) === null || _this$_rts11 === void 0 ? void 0 : _this$_rts11.networkStats;
7923
8635
  }
7924
8636
  }, {
7925
8637
  key: "setDelay",
7926
8638
  value: function setDelay(delayHint) {
7927
- var _this$_rts11;
7928
- (_this$_rts11 = this._rts) === null || _this$_rts11 === void 0 ? void 0 : _this$_rts11._setDelay(delayHint);
8639
+ var _this$_rts12;
8640
+ (_this$_rts12 = this._rts) === null || _this$_rts12 === void 0 ? void 0 : _this$_rts12._setDelay(delayHint);
7929
8641
  }
7930
8642
  }, {
7931
8643
  key: "_clearDisconnectTimer",
@@ -7936,15 +8648,15 @@ var RtsPlugin = /* @__PURE__ */ function(_BasePlugin) {
7936
8648
  }, {
7937
8649
  key: "_closeAfterPause",
7938
8650
  value: function _closeAfterPause() {
7939
- var _this$_rts12, _this$config, _this$_rts14;
7940
- if (!((_this$_rts12 = this._rts) !== null && _this$_rts12 !== void 0 && _this$_rts12._pc)) {
8651
+ var _this$_rts13, _this$config, _this$_rts15;
8652
+ if (!((_this$_rts13 = this._rts) !== null && _this$_rts13 !== void 0 && _this$_rts13._pc)) {
7941
8653
  return;
7942
8654
  }
7943
8655
  if ((_this$config = this.config) !== null && _this$config !== void 0 && _this$config.seamlesslyReload) {
7944
- var _this$_rts13;
7945
- this._mediaStream = (_this$_rts13 = this._rts) === null || _this$_rts13 === void 0 ? void 0 : _this$_rts13._mediaStream;
8656
+ var _this$_rts14;
8657
+ this._mediaStream = (_this$_rts14 = this._rts) === null || _this$_rts14 === void 0 ? void 0 : _this$_rts14._mediaStream;
7946
8658
  }
7947
- (_this$_rts14 = this._rts) === null || _this$_rts14 === void 0 ? void 0 : _this$_rts14.destroy(true);
8659
+ (_this$_rts15 = this._rts) === null || _this$_rts15 === void 0 ? void 0 : _this$_rts15.destroy(true);
7948
8660
  this._rts = null;
7949
8661
  }
7950
8662
  }, {
@@ -7960,16 +8672,17 @@ var RtsPlugin = /* @__PURE__ */ function(_BasePlugin) {
7960
8672
  this._transCoreEvent(EVENT.SEI);
7961
8673
  this._transCoreEvent(EXTEND_EVENTS.RTC_STATE_CHANGE);
7962
8674
  this._transCoreEvent(EXTEND_EVENTS.RTC_NETWORK);
8675
+ this._transCoreEvent(EXTEND_EVENTS.RTC_FIRST_FRAME);
7963
8676
  }
7964
8677
  }, {
7965
8678
  key: "_transErrorEvent",
7966
8679
  value: function _transErrorEvent() {
7967
- var _this3 = this;
7968
- this._rts.on(EVENT.ERROR, function(err) {
8680
+ var _this$_rts16, _this3 = this, _this$_rts17;
8681
+ (_this$_rts16 = this._rts) === null || _this$_rts16 === void 0 ? void 0 : _this$_rts16.on(EVENT.ERROR, function(err) {
7969
8682
  if (!_this3.player)
7970
8683
  return;
7971
8684
  var e = new Errors(_this3.player, err);
7972
- var _this3$_rtsOpts = _this3._rtsOpts, backupConstruct = _this3$_rtsOpts.backupConstruct, backupURL = _this3$_rtsOpts.backupURL;
8685
+ var _ref = _this3._rtsOpts || {}, backupConstruct = _ref.backupConstruct, backupURL = _ref.backupURL;
7973
8686
  if (backupURL) {
7974
8687
  var _player$video;
7975
8688
  var player = _this3.player;
@@ -7989,6 +8702,7 @@ var RtsPlugin = /* @__PURE__ */ function(_BasePlugin) {
7989
8702
  });
7990
8703
  player.unRegisterPlugin("rts");
7991
8704
  player.switchURL = _this3._originSwitchFn;
8705
+ player.retry = _this3._originRetry;
7992
8706
  _this3._rts = null;
7993
8707
  player.rts = null;
7994
8708
  if ((_player$video = player.video) !== null && _player$video !== void 0 && _player$video.srcObject) {
@@ -8005,7 +8719,7 @@ var RtsPlugin = /* @__PURE__ */ function(_BasePlugin) {
8005
8719
  }
8006
8720
  _this3.player.emit(ERROR, e);
8007
8721
  });
8008
- this._rts.on("waiting", function() {
8722
+ (_this$_rts17 = this._rts) === null || _this$_rts17 === void 0 ? void 0 : _this$_rts17.on("waiting", function() {
8009
8723
  var _this3$player;
8010
8724
  (_this3$player = _this3.player) === null || _this3$player === void 0 ? void 0 : _this3$player.emit("waiting");
8011
8725
  });
@@ -8013,8 +8727,8 @@ var RtsPlugin = /* @__PURE__ */ function(_BasePlugin) {
8013
8727
  }, {
8014
8728
  key: "_transCoreEvent",
8015
8729
  value: function _transCoreEvent(eventName) {
8016
- var _this4 = this;
8017
- this._rts.on(eventName, function(e) {
8730
+ var _this$_rts18, _this4 = this;
8731
+ (_this$_rts18 = this._rts) === null || _this$_rts18 === void 0 ? void 0 : _this$_rts18.on(eventName, function(e) {
8018
8732
  if (_this4.player) {
8019
8733
  _this4.player.emit("core_event", _objectSpread2$2(_objectSpread2$2({}, e), {}, {
8020
8734
  eventName
@@ -8052,7 +8766,8 @@ var RtsPlugin = /* @__PURE__ */ function(_BasePlugin) {
8052
8766
  case 3:
8053
8767
  res = _context.sent;
8054
8768
  hasH264 = (_res$video = res.video) === null || _res$video === void 0 ? void 0 : _res$video.filter(function(x) {
8055
- return x.codec === "H264" && (!targetProfileLevel || x.config.indexOf(targetProfileLevel) !== -1);
8769
+ var _x$config;
8770
+ return x.codec === "H264" && (!targetProfileLevel || ((_x$config = x.config) === null || _x$config === void 0 ? void 0 : _x$config.indexOf(targetProfileLevel)) !== -1);
8056
8771
  }).length;
8057
8772
  if (hasH264) {
8058
8773
  _context.next = 10;
@@ -8063,7 +8778,8 @@ var RtsPlugin = /* @__PURE__ */ function(_BasePlugin) {
8063
8778
  case 8:
8064
8779
  res1 = _context.sent;
8065
8780
  hasH264 = (_res1$video = res1.video) === null || _res1$video === void 0 ? void 0 : _res1$video.filter(function(x) {
8066
- return x.codec === "H264" && (!targetProfileLevel || x.config.indexOf(targetProfileLevel) !== -1);
8781
+ var _x$config2;
8782
+ return x.codec === "H264" && (!targetProfileLevel || ((_x$config2 = x.config) === null || _x$config2 === void 0 ? void 0 : _x$config2.indexOf(targetProfileLevel)) !== -1);
8067
8783
  }).length;
8068
8784
  case 10:
8069
8785
  return _context.abrupt("return", !!hasH264);