swarmcloud-hls 2.9.0 → 2.9.2

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.
@@ -1 +1 @@
1
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.P2pEngineHls=t():e.P2pEngineHls=t()}(this,(()=>(()=>{var e={204:e=>{"use strict";var t,s="object"==typeof Reflect?Reflect:null,i=s&&"function"==typeof s.apply?s.apply:function(e,t,s){return Function.prototype.apply.call(e,t,s)};t=s&&"function"==typeof s.ownKeys?s.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var r=Number.isNaN||function(e){return e!=e};function n(){n.init.call(this)}e.exports=n,e.exports.once=function(e,t){return new Promise((function(s,i){function r(s){e.removeListener(t,n),i(s)}function n(){"function"==typeof e.removeListener&&e.removeListener("error",r),s([].slice.call(arguments))}p(e,t,n,{once:!0}),"error"!==t&&function(e,t,s){"function"==typeof e.on&&p(e,"error",t,s)}(e,r,{once:!0})}))},n.EventEmitter=n,n.prototype._events=void 0,n.prototype._eventsCount=0,n.prototype._maxListeners=void 0;var o=10;function a(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function h(e){return void 0===e._maxListeners?n.defaultMaxListeners:e._maxListeners}function l(e,t,s,i){var r,n,o,l;if(a(s),void 0===(n=e._events)?(n=e._events=Object.create(null),e._eventsCount=0):(void 0!==n.newListener&&(e.emit("newListener",t,s.listener?s.listener:s),n=e._events),o=n[t]),void 0===o)o=n[t]=s,++e._eventsCount;else if("function"==typeof o?o=n[t]=i?[s,o]:[o,s]:i?o.unshift(s):o.push(s),(r=h(e))>0&&o.length>r&&!o.warned){o.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=o.length,l=c,console&&console.warn&&console.warn(l)}return e}function c(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function d(e,t,s){var i={fired:!1,wrapFn:void 0,target:e,type:t,listener:s},r=c.bind(i);return r.listener=s,i.wrapFn=r,r}function u(e,t,s){var i=e._events;if(void 0===i)return[];var r=i[t];return void 0===r?[]:"function"==typeof r?s?[r.listener||r]:[r]:s?function(e){for(var t=new Array(e.length),s=0;s<t.length;++s)t[s]=e[s].listener||e[s];return t}(r):f(r,r.length)}function g(e){var t=this._events;if(void 0!==t){var s=t[e];if("function"==typeof s)return 1;if(void 0!==s)return s.length}return 0}function f(e,t){for(var s=new Array(t),i=0;i<t;++i)s[i]=e[i];return s}function p(e,t,s,i){if("function"==typeof e.on)i.once?e.once(t,s):e.on(t,s);else{if("function"!=typeof e.addEventListener)throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof e);e.addEventListener(t,(function r(n){i.once&&e.removeEventListener(t,r),s(n)}))}}Object.defineProperty(n,"defaultMaxListeners",{enumerable:!0,get:function(){return o},set:function(e){if("number"!=typeof e||e<0||r(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");o=e}}),n.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},n.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||r(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this},n.prototype.getMaxListeners=function(){return h(this)},n.prototype.emit=function(e){for(var t=[],s=1;s<arguments.length;s++)t.push(arguments[s]);var r="error"===e,n=this._events;if(void 0!==n)r=r&&void 0===n.error;else if(!r)return!1;if(r){var o;if(t.length>0&&(o=t[0]),o instanceof Error)throw o;var a=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw a.context=o,a}var h=n[e];if(void 0===h)return!1;if("function"==typeof h)i(h,this,t);else{var l=h.length,c=f(h,l);for(s=0;s<l;++s)i(c[s],this,t)}return!0},n.prototype.addListener=function(e,t){return l(this,e,t,!1)},n.prototype.on=n.prototype.addListener,n.prototype.prependListener=function(e,t){return l(this,e,t,!0)},n.prototype.once=function(e,t){return a(t),this.on(e,d(this,e,t)),this},n.prototype.prependOnceListener=function(e,t){return a(t),this.prependListener(e,d(this,e,t)),this},n.prototype.removeListener=function(e,t){var s,i,r,n,o;if(a(t),void 0===(i=this._events))return this;if(void 0===(s=i[e]))return this;if(s===t||s.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete i[e],i.removeListener&&this.emit("removeListener",e,s.listener||t));else if("function"!=typeof s){for(r=-1,n=s.length-1;n>=0;n--)if(s[n]===t||s[n].listener===t){o=s[n].listener,r=n;break}if(r<0)return this;0===r?s.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(s,r),1===s.length&&(i[e]=s[0]),void 0!==i.removeListener&&this.emit("removeListener",e,o||t)}return this},n.prototype.off=n.prototype.removeListener,n.prototype.removeAllListeners=function(e){var t,s,i;if(void 0===(s=this._events))return this;if(void 0===s.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==s[e]&&(0==--this._eventsCount?this._events=Object.create(null):delete s[e]),this;if(0===arguments.length){var r,n=Object.keys(s);for(i=0;i<n.length;++i)"removeListener"!==(r=n[i])&&this.removeAllListeners(r);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if("function"==typeof(t=s[e]))this.removeListener(e,t);else if(void 0!==t)for(i=t.length-1;i>=0;i--)this.removeListener(e,t[i]);return this},n.prototype.listeners=function(e){return u(this,e,!0)},n.prototype.rawListeners=function(e){return u(this,e,!1)},n.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):g.call(e,t)},n.prototype.listenerCount=g,n.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}},622:function(e){!function(t){var s=/^(?=((?:[a-zA-Z0-9+\-.]+:)?))\1(?=((?:\/\/[^\/?#]*)?))\2(?=((?:(?:[^?#\/]*\/)*[^;?#\/]*)?))\3((?:;[^?#]*)?)(\?[^#]*)?(#[^]*)?$/,i=/^(?=([^\/?#]*))\1([^]*)$/,r=/(?:\/|^)\.(?=\/)/g,n=/(?:\/|^)\.\.\/(?!\.\.\/)[^\/]*(?=\/)/g,o={buildAbsoluteURL:function(e,t,s){if(s=s||{},e=e.trim(),!(t=t.trim())){if(!s.alwaysNormalize)return e;var r=o.parseURL(e);if(!r)throw new Error("Error trying to parse base URL.");return r.path=o.normalizePath(r.path),o.buildURLFromParts(r)}var n=o.parseURL(t);if(!n)throw new Error("Error trying to parse relative URL.");if(n.scheme)return s.alwaysNormalize?(n.path=o.normalizePath(n.path),o.buildURLFromParts(n)):t;var a=o.parseURL(e);if(!a)throw new Error("Error trying to parse base URL.");if(!a.netLoc&&a.path&&"/"!==a.path[0]){var h=i.exec(a.path);a.netLoc=h[1],a.path=h[2]}a.netLoc&&!a.path&&(a.path="/");var l={scheme:a.scheme,netLoc:n.netLoc,path:null,params:n.params,query:n.query,fragment:n.fragment};if(!n.netLoc&&(l.netLoc=a.netLoc,"/"!==n.path[0]))if(n.path){var c=a.path,d=c.substring(0,c.lastIndexOf("/")+1)+n.path;l.path=o.normalizePath(d)}else l.path=a.path,n.params||(l.params=a.params,n.query||(l.query=a.query));return null===l.path&&(l.path=s.alwaysNormalize?o.normalizePath(n.path):n.path),o.buildURLFromParts(l)},parseURL:function(e){var t=s.exec(e);return t?{scheme:t[1]||"",netLoc:t[2]||"",path:t[3]||"",params:t[4]||"",query:t[5]||"",fragment:t[6]||""}:null},normalizePath:function(e){for(e=e.split("").reverse().join("").replace(r,"");e.length!==(e=e.replace(n,"")).length;);return e.split("").reverse().join("")},buildURLFromParts:function(e){return e.scheme+e.netLoc+e.path+e.params+e.query+e.fragment}};e.exports=o}()},47:(e,t)=>{"use strict";t.l=r;var s=2147483647;function i(e){if(e>s)throw new RangeError('The value "'+e+'" is invalid for option "size"');var t=new Uint8Array(e);return t.__proto__=r.prototype,t}function r(e,t,s){if("number"==typeof e){if("string"==typeof t)throw new TypeError('The "string" argument must be of type string. Received type number');return a(e)}return n(e,t,s)}function n(e,t,s){if("string"==typeof e)return function(e,t){"string"==typeof t&&""!==t||(t="utf8");if(!r.isEncoding(t))throw new TypeError("Unknown encoding: "+t);var s=0|c(e,t),n=i(s),o=n.write(e,t);o!==s&&(n=n.slice(0,o));return n}(e,t);if(ArrayBuffer.isView(e))return h(e);if(null==e)throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e);if(_(e,ArrayBuffer)||e&&_(e.buffer,ArrayBuffer))return function(e,t,s){if(t<0||e.byteLength<t)throw new RangeError('"offset" is outside of buffer bounds');if(e.byteLength<t+(s||0))throw new RangeError('"length" is outside of buffer bounds');var i;i=void 0===t&&void 0===s?new Uint8Array(e):void 0===s?new Uint8Array(e,t):new Uint8Array(e,t,s);return i.__proto__=r.prototype,i}(e,t,s);if("number"==typeof e)throw new TypeError('The "value" argument must not be of type number. Received type number');var n=e.valueOf&&e.valueOf();if(null!=n&&n!==e)return r.from(n,t,s);var o=function(e){if(r.isBuffer(e)){var t=0|l(e.length),s=i(t);return 0===s.length||e.copy(s,0,0,t),s}if(void 0!==e.length)return"number"!=typeof e.length||y(e.length)?i(0):h(e);if("Buffer"===e.type&&Array.isArray(e.data))return h(e.data)}(e);if(o)return o;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof e[Symbol.toPrimitive])return r.from(e[Symbol.toPrimitive]("string"),t,s);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e)}function o(e){if("number"!=typeof e)throw new TypeError('"size" argument must be of type number');if(e<0)throw new RangeError('The value "'+e+'" is invalid for option "size"')}function a(e){return o(e),i(e<0?0:0|l(e))}function h(e){for(var t=e.length<0?0:0|l(e.length),s=i(t),r=0;r<t;r+=1)s[r]=255&e[r];return s}function l(e){if(e>=s)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s.toString(16)+" bytes");return 0|e}function c(e,t){if(r.isBuffer(e))return e.length;if(ArrayBuffer.isView(e)||_(e,ArrayBuffer))return e.byteLength;if("string"!=typeof e)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof e);var s=e.length,i=arguments.length>2&&!0===arguments[2];if(!i&&0===s)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return s;case"utf8":case"utf-8":return m(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*s;case"hex":return s>>>1;default:if(n)return i?-1:m(e).length;t=(""+t).toLowerCase(),n=!0}}function d(e,t,s,i){s=Number(s)||0;const r=e.length-s;i?(i=Number(i))>r&&(i=r):i=r;const n=t.length;let o;for(i>n/2&&(i=n/2),o=0;o<i;++o){const i=parseInt(t.substr(2*o,2),16);if(y(i))return o;e[s+o]=i}return o}function u(e,t,s,i){return p(m(t,e.length-s),e,s,i)}function g(e,t,s,i){return p(function(e){const t=[];for(let s=0;s<e.length;++s)t.push(255&e.charCodeAt(s));return t}(t),e,s,i)}function f(e,t,s,i){return p(function(e,t){let s,i,r;const n=[];for(let o=0;o<e.length&&!((t-=2)<0);++o)s=e.charCodeAt(o),i=s>>8,r=s%256,n.push(r),n.push(i);return n}(t,e.length-s),e,s,i)}function p(e,t,s,i){let r;for(r=0;r<i&&!(r+s>=t.length||r>=e.length);++r)t[r+s]=e[r];return r}function m(e,t){var s;t=t||1/0;for(var i=e.length,r=null,n=[],o=0;o<i;++o){if((s=e.charCodeAt(o))>55295&&s<57344){if(!r){if(s>56319){(t-=3)>-1&&n.push(239,191,189);continue}if(o+1===i){(t-=3)>-1&&n.push(239,191,189);continue}r=s;continue}if(s<56320){(t-=3)>-1&&n.push(239,191,189),r=s;continue}s=65536+(r-55296<<10|s-56320)}else r&&(t-=3)>-1&&n.push(239,191,189);if(r=null,s<128){if((t-=1)<0)break;n.push(s)}else if(s<2048){if((t-=2)<0)break;n.push(s>>6|192,63&s|128)}else if(s<65536){if((t-=3)<0)break;n.push(s>>12|224,s>>6&63|128,63&s|128)}else{if(!(s<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;n.push(s>>18|240,s>>12&63|128,s>>6&63|128,63&s|128)}}return n}function _(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}function y(e){return e!=e}"undefined"!=typeof Symbol&&null!=Symbol.species&&r[Symbol.species]===r&&Object.defineProperty(r,Symbol.species,{value:null,configurable:!0,enumerable:!1,writable:!1}),r.from=function(e,t,s){return n(e,t,s)},r.prototype.__proto__=Uint8Array.prototype,r.__proto__=Uint8Array,r.alloc=function(e,t,s){return function(e,t,s){return o(e),e<=0?i(e):void 0!==t?"string"==typeof s?i(e).fill(t,s):i(e).fill(t):i(e)}(e,t,s)},r.allocUnsafe=function(e){return a(e)},r.isBuffer=function(e){return null!=e&&!0===e._isBuffer&&e!==r.prototype},r.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},r.concat=function(e,t){if(!Array.isArray(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return r.alloc(0);var s;if(void 0===t)for(t=0,s=0;s<e.length;++s)t+=e[s].length;var i=r.allocUnsafe(t),n=0;for(s=0;s<e.length;++s){var o=e[s];if(_(o,Uint8Array)&&(o=r.from(o)),!r.isBuffer(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(i,n),n+=o.length}return i},r.byteLength=c,r.prototype._isBuffer=!0,r.prototype.copy=function(e,t,s,i){if(!r.isBuffer(e))throw new TypeError("argument should be a Buffer");if(s||(s=0),i||0===i||(i=this.length),t>=e.length&&(t=e.length),t||(t=0),i>0&&i<s&&(i=s),i===s)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(s<0||s>=this.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),e.length-t<i-s&&(i=e.length-t+s);var n=i-s;if(this===e&&"function"==typeof Uint8Array.prototype.copyWithin)this.copyWithin(t,s,i);else if(this===e&&s<t&&t<i)for(var o=n-1;o>=0;--o)e[o+t]=this[o+s];else Uint8Array.prototype.set.call(e,this.subarray(s,i),t);return n},r.prototype.write=function(e,t,s,i){if(void 0===t)i="utf8",s=this.length,t=0;else if(void 0===s&&"string"==typeof t)i=t,s=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t>>>=0,isFinite(s)?(s>>>=0,void 0===i&&(i="utf8")):(i=s,s=void 0)}const r=this.length-t;if((void 0===s||s>r)&&(s=r),e.length>0&&(s<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");let n=!1;for(;;)switch(i){case"hex":return d(this,e,t,s);case"utf8":case"utf-8":return u(this,e,t,s);case"ascii":case"latin1":case"binary":return g(this,e,t,s);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return f(this,e,t,s);default:if(n)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),n=!0}}},934:e=>{"use strict";function t(e,t){for(const s in t)Object.defineProperty(e,s,{value:t[s],enumerable:!0,configurable:!0});return e}e.exports=function(e,s,i){if(!e||"string"==typeof e)throw new TypeError("Please pass an Error to err-code");i||(i={}),"object"==typeof s&&(i=s,s=void 0),null!=s&&(i.code=s);try{return t(e,i)}catch(s){i.message=e.message,i.stack=e.stack;const r=function(){};return r.prototype=Object.create(Object.getPrototypeOf(e)),t(new r,i)}}},485:function(e,t,s){var i;!function(r){"use strict";function n(e,t){var s=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(s>>16)<<16|65535&s}function o(e,t,s,i,r,o){return n((a=n(n(t,e),n(i,o)))<<(h=r)|a>>>32-h,s);var a,h}function a(e,t,s,i,r,n,a){return o(t&s|~t&i,e,t,r,n,a)}function h(e,t,s,i,r,n,a){return o(t&i|s&~i,e,t,r,n,a)}function l(e,t,s,i,r,n,a){return o(t^s^i,e,t,r,n,a)}function c(e,t,s,i,r,n,a){return o(s^(t|~i),e,t,r,n,a)}function d(e,t){var s,i,r,o,d;e[t>>5]|=128<<t%32,e[14+(t+64>>>9<<4)]=t;var u=1732584193,g=-271733879,f=-1732584194,p=271733878;for(s=0;s<e.length;s+=16)i=u,r=g,o=f,d=p,u=a(u,g,f,p,e[s],7,-680876936),p=a(p,u,g,f,e[s+1],12,-389564586),f=a(f,p,u,g,e[s+2],17,606105819),g=a(g,f,p,u,e[s+3],22,-1044525330),u=a(u,g,f,p,e[s+4],7,-176418897),p=a(p,u,g,f,e[s+5],12,1200080426),f=a(f,p,u,g,e[s+6],17,-1473231341),g=a(g,f,p,u,e[s+7],22,-45705983),u=a(u,g,f,p,e[s+8],7,1770035416),p=a(p,u,g,f,e[s+9],12,-1958414417),f=a(f,p,u,g,e[s+10],17,-42063),g=a(g,f,p,u,e[s+11],22,-1990404162),u=a(u,g,f,p,e[s+12],7,1804603682),p=a(p,u,g,f,e[s+13],12,-40341101),f=a(f,p,u,g,e[s+14],17,-1502002290),u=h(u,g=a(g,f,p,u,e[s+15],22,1236535329),f,p,e[s+1],5,-165796510),p=h(p,u,g,f,e[s+6],9,-1069501632),f=h(f,p,u,g,e[s+11],14,643717713),g=h(g,f,p,u,e[s],20,-373897302),u=h(u,g,f,p,e[s+5],5,-701558691),p=h(p,u,g,f,e[s+10],9,38016083),f=h(f,p,u,g,e[s+15],14,-660478335),g=h(g,f,p,u,e[s+4],20,-405537848),u=h(u,g,f,p,e[s+9],5,568446438),p=h(p,u,g,f,e[s+14],9,-1019803690),f=h(f,p,u,g,e[s+3],14,-187363961),g=h(g,f,p,u,e[s+8],20,1163531501),u=h(u,g,f,p,e[s+13],5,-1444681467),p=h(p,u,g,f,e[s+2],9,-51403784),f=h(f,p,u,g,e[s+7],14,1735328473),u=l(u,g=h(g,f,p,u,e[s+12],20,-1926607734),f,p,e[s+5],4,-378558),p=l(p,u,g,f,e[s+8],11,-2022574463),f=l(f,p,u,g,e[s+11],16,1839030562),g=l(g,f,p,u,e[s+14],23,-35309556),u=l(u,g,f,p,e[s+1],4,-1530992060),p=l(p,u,g,f,e[s+4],11,1272893353),f=l(f,p,u,g,e[s+7],16,-155497632),g=l(g,f,p,u,e[s+10],23,-1094730640),u=l(u,g,f,p,e[s+13],4,681279174),p=l(p,u,g,f,e[s],11,-358537222),f=l(f,p,u,g,e[s+3],16,-722521979),g=l(g,f,p,u,e[s+6],23,76029189),u=l(u,g,f,p,e[s+9],4,-640364487),p=l(p,u,g,f,e[s+12],11,-421815835),f=l(f,p,u,g,e[s+15],16,530742520),u=c(u,g=l(g,f,p,u,e[s+2],23,-995338651),f,p,e[s],6,-198630844),p=c(p,u,g,f,e[s+7],10,1126891415),f=c(f,p,u,g,e[s+14],15,-1416354905),g=c(g,f,p,u,e[s+5],21,-57434055),u=c(u,g,f,p,e[s+12],6,1700485571),p=c(p,u,g,f,e[s+3],10,-1894986606),f=c(f,p,u,g,e[s+10],15,-1051523),g=c(g,f,p,u,e[s+1],21,-2054922799),u=c(u,g,f,p,e[s+8],6,1873313359),p=c(p,u,g,f,e[s+15],10,-30611744),f=c(f,p,u,g,e[s+6],15,-1560198380),g=c(g,f,p,u,e[s+13],21,1309151649),u=c(u,g,f,p,e[s+4],6,-145523070),p=c(p,u,g,f,e[s+11],10,-1120210379),f=c(f,p,u,g,e[s+2],15,718787259),g=c(g,f,p,u,e[s+9],21,-343485551),u=n(u,i),g=n(g,r),f=n(f,o),p=n(p,d);return[u,g,f,p]}function u(e){var t,s="",i=32*e.length;for(t=0;t<i;t+=8)s+=String.fromCharCode(e[t>>5]>>>t%32&255);return s}function g(e){var t,s=[];for(s[(e.length>>2)-1]=void 0,t=0;t<s.length;t+=1)s[t]=0;var i=8*e.length;for(t=0;t<i;t+=8)s[t>>5]|=(255&e.charCodeAt(t/8))<<t%32;return s}function f(e){var t,s,i="0123456789abcdef",r="";for(s=0;s<e.length;s+=1)t=e.charCodeAt(s),r+=i.charAt(t>>>4&15)+i.charAt(15&t);return r}function p(e){return unescape(encodeURIComponent(e))}function m(e){return function(e){return u(d(g(e),8*e.length))}(p(e))}function _(e,t){return function(e,t){var s,i,r=g(e),n=[],o=[];for(n[15]=o[15]=void 0,r.length>16&&(r=d(r,8*e.length)),s=0;s<16;s+=1)n[s]=909522486^r[s],o[s]=1549556828^r[s];return i=d(n.concat(g(t)),512+8*t.length),u(d(o.concat(i),640))}(p(e),p(t))}function y(e,t,s){return t?s?_(t,e):f(_(t,e)):s?m(e):f(m(e))}void 0===(i=function(){return y}.call(t,s,t,e))||(e.exports=i)}()},422:e=>{const t={ANDROID_WEB:"android-web",IOS_WEB:"iOS-web",PC_NATIVE:"PC-native",PC_WEB:"PC-web"};var s={getNetType:function(){let e=(new RegExp("nettype\\/(\\w*)").exec(i())||[,""])[1].toLowerCase();if(!e&&navigator.connection){switch(navigator.connection.type){case"ethernet":e="ethernet";break;case"cellular":e="cellular";break;default:e="wifi"}}return e},getPlatform:function(){return s.isAndroid()?t.ANDROID_WEB:s.isIOS()?t.IOS_WEB:s.isElectron()?t.PC_NATIVE:t.PC_WEB},isX5:function(){return this.isAndroid()&&/\s(TBS|X5Core)\/[\w\.\-]+/i.test(i())},isPC:function(){return!n(r("os "))&&!n(r("android[/ ]"))},isIOS:function(){return n(r("os "))},isAndroid:function(){return n(r("android[/ ]"))},isIOSSafari:function(){return this.isIOS()&&this.isSafari()},isElectron:function(){return/electron/i.test(i())},isMobile:function(){return s.isAndroid()||s.isIOS()},isSafari:function(){return/^((?!chrome|android).)*safari/i.test(i())},isFirefox:function(){return/firefox/i.test(i())},isChrome:function(){return/chrome/i.test(i())},isLocalHost:function(){return"localhost"===location.hostname},device:t,getBrowser:function(){return s.isX5()?"X5":s.isChrome()?"Chrome":s.isFirefox()?"Firefox":s.isIOSSafari()?"iOS-Safari":s.isSafari()?"Mac-Safari":"Unknown"}};function i(){return navigator.userAgent.toLowerCase()}function r(e){return""+(new RegExp(e+"(\\d+((\\.|_)\\d+)*)").exec(i())||[,0])[1]||void 0}function n(e){return parseFloat((e||"").replace(/\_/g,"."))||0}e.exports=s},77:e=>{let t;e.exports="function"==typeof queueMicrotask?queueMicrotask.bind(globalThis):e=>(t||(t=Promise.resolve())).then(e).catch((e=>setTimeout((()=>{throw e}),0)))}},t={};function s(i){var r=t[i];if(void 0!==r)return r.exports;var n=t[i]={exports:{}};return e[i].call(n.exports,n,n.exports,s),n.exports}s.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},s.d=(e,t)=>{for(var i in t)s.o(t,i)&&!s.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var i={};return(()=>{"use strict";s.d(i,{default:()=>Ot});const e={DC_SIGNAL:"SIGNAL",DC_OPEN:"OPEN",DC_REQUEST:"REQUEST",DC_SEND_REQUEST:"SEND_REQUEST",DC_PIECE_NOT_FOUND:"PIECE_NOT_FOUND",DC_PIECE_ABORT:"PIECE_ABORT",DC_PIECE_CANCEL:"PIECE_CANCEL",DC_CLOSE:"CLOSE",DC_RESPONSE:"RESPONSE",DC_ERROR:"ERROR",DC_PIECE:"PIECE",DC_PIECE_DATA:"PIECE_DATA",DC_TIMEOUT:"TIMEOUT",DC_PIECE_ACK:"PIECE_ACK",DC_METADATA:"METADATA",DC_PLAT_ANDROID:"ANDROID",DC_PLAT_IOS:"IOS",DC_PLAT_WEB:"WEB",DC_CHOKE:"CHOKE",DC_UNCHOKE:"UNCHOKE",DC_HAVE:"HAVE",DC_HAVE_REVERSE:"HAVE_REVERSE",DC_LOST:"LOST",DC_GET_PEERS:"GET_PEERS",DC_PEERS:"PEERS",DC_STATS:"STATS",DC_PEER_SIGNAL:"PEER_SIGNAL",DC_PLAYLIST:"PLAYLIST",BM_LOST:"lost",BM_ADDED_SEG_:"BM_ADDED_SEG_",BM_ADDED_SN_:"BM_ADDED_SN_",BM_SEG_ADDED:"BM_SEG_ADDED",FRAG_CHANGED:"FRAG_CHANGED",FRAG_LOADED:"FRAG_LOADED",FRAG_LOADING:"FRAG_LOADING",RESTART_P2P:"RESTART_P2P",EXCEPTION:"exception",REQUESTING_MAP_HAVE:"REQUESTING_MAP_HAVE",BUILDER_MAP_HAVE:"BUILDER_MAP_HAVE",SYN_OUTPUT:"SYN_OUTPUT",SYN_ERROR:"SYN_ERROR",SYN_PARTIAL:"SYN_PARTIAL"},t={...e,SCH_DCHAVE:"SCH_DCHAVE",SCH_WAIT_PEER:"SCH_WAIT_PEER",SW_PLAYLIST:"SW_PLAYLIST",SW_GET_PLAYLIST:"SW_GET_PLAYLIST",SW_GET_MEDIA:"SW_GET_MEDIA",LEVEL_LOADED:"LEVEL_LOADED",MANIFEST_PARSED:"MANIFEST_PARSED"};var r=s(204),n=s.n(r),o=s(47),a=s(622),h=s.n(a);const l=64e3;function c(){return!0}function d(e){return new URL(location.href).searchParams.get(e)}function u(){return Date.parse(new Date)/1e3}function g(e,t){return parseInt(Math.random()*(t-e+1)+e,10)}function f(e,t,s,i=2e3,r=!1){const n=new XMLHttpRequest;let o=e;return r&&(o=function(e,t,s){const i=new URL(e);return i.searchParams.append(t,s),i.href}(e,"__PROXY_IDENTIFIER__",!0)),new Promise(((r,a)=>{n.open("GET",o,!0),n.responseType="arraybuffer",n.timeout=i,n.onreadystatechange=e=>{if(4===n.readyState){const e=n.status;206===e||200===e&&t?r(n.response):a(`status ${e}`)}},n.onerror=e=>{a("request error")},n.ontimeout=e=>{a("timeout")},n.setRequestHeader("Range",t||"bytes=0-0"),s&&s(n,e),n.send()}))}function p(){if("undefined"==typeof self)return null;var e={RTCPeerConnection:self.RTCPeerConnection||self.mozRTCPeerConnection||self.webkitRTCPeerConnection,RTCSessionDescription:self.RTCSessionDescription||self.mozRTCSessionDescription||self.webkitRTCSessionDescription,RTCIceCandidate:self.RTCIceCandidate||self.mozRTCIceCandidate||self.webkitRTCIceCandidate};return e.RTCPeerConnection&&e.RTCPeerConnection.prototype?e:null}function m(e){const t=o.l.from(e),s=new o.l(e.byteLength);return t.copy(s),s}function _(){return location.protocol.startsWith("https")}function y(e,t){const s=e.byteLength-t,i=[];let r=t,n=Math.floor(s/l),a=s%l;for(let t=0;t<n;t++){const t=(0,o.l)(l);e.copy(t,0,r,r+l),i.push(t),r+=l}if(a>0){const t=(0,o.l)(a);e.copy(t,0,r,r+a),i.push(t)}return i}function S(e,t){if(e.size<=t)return;const s=[...e.values()];do{e.delete(s.shift())}while(e.size>t)}function v(e){return e instanceof ArrayBuffer&&0!==e.byteLength}const P={debug:0,info:1,warn:2,error:3,none:4};const b=class{constructor(e){this.logLevel=e,this.onlineDebug=!1;try{console.debug=console.log}catch(e){}"debug"!==e&&"info"!==e||(this.logLevel="error"),!0===e?this.logLevel="warn":!1===e?this.logLevel="none":e in P||(this.logLevel="error"),this.resetLogger()}enableDebug(){this.onlineDebug=!0;for(let e in P)this[e]=console[e]}resetLogger(){this.onlineDebug=!1;for(let e in P)P[e]<P[this.logLevel]?this[e]=c:this[e]=console[e]}get isDebugLevel(){return P[this.logLevel]<=2||this.onlineDebug}};var w=s(77),E=s.n(w);const C=65536;function I(e){return e.replace(/a=ice-options:trickle\s\n/g,"")}class L extends(n()){constructor(e){super(),this.channelName=e.initiator?e.channelName:null,this.initiator=e.initiator||!1,this.channelConfig=e.channelConfig||L.channelConfig,this.channelNegotiated=this.channelConfig.negotiated,this.config=Object.assign({},L.config,e.config),this.offerOptions=e.offerOptions||{},this.answerOptions=e.answerOptions||{},this.sdpTransform=e.sdpTransform||(e=>e),this.trickle=void 0===e.trickle||e.trickle,this.allowHalfTrickle=void 0!==e.allowHalfTrickle&&e.allowHalfTrickle,this.iceCompleteTimeout=e.iceCompleteTimeout||5e3,this.destroyed=!1,this.destroying=!1,this._connected=!1,this.remoteAddress=void 0,this.remoteFamily=void 0,this.remotePort=void 0,this.localAddress=void 0,this.localFamily=void 0,this.localPort=void 0,this._wrtc=e.wrtc&&"object"==typeof e.wrtc?e.wrtc:p(),this._pcReady=!1,this._channelReady=!1,this._iceComplete=!1,this._iceCompleteTimer=null,this._channel=null,this._pendingCandidates=[],this._isNegotiating=!1,this._firstNegotiation=!0,this._batchedNegotiation=!1,this._queuedNegotiation=!1,this._sendersAwaitingStable=[],this._senderMap=new Map,this._closingInterval=null,this._chunk=null,this._cb=null,this._interval=null;try{this._pc=new this._wrtc.RTCPeerConnection(this.config)}catch(e){return void E()((()=>this.destroy(e)))}this._pc.oniceconnectionstatechange=()=>{this._onIceStateChange()},this._pc.onicegatheringstatechange=()=>{this._onIceStateChange()},this._pc.onconnectionstatechange=()=>{this._onConnectionStateChange()},this._pc.onsignalingstatechange=()=>{this._onSignalingStateChange()},this._pc.onicecandidate=e=>{this._onIceCandidate(e)},this.initiator||this.channelNegotiated?this._setupData({channel:this._pc.createDataChannel(this.channelName,this.channelConfig)}):this._pc.ondatachannel=e=>{this._setupData(e)},this._needsNegotiation()}get bufferSize(){return this._channel&&this._channel.bufferedAmount||0}get connected(){return this._connected&&"open"===this._channel.readyState}signal(e){if(!this.destroyed&&this._pc){if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e={}}if(e.renegotiate&&this.initiator&&this._needsNegotiation(),e.candidate)if(this._pc.remoteDescription&&this._pc.remoteDescription.type)try{this._addIceCandidate(e.candidate)}catch(e){}else this._pendingCandidates.push(e.candidate);e.sdp&&this._pc.setRemoteDescription(new this._wrtc.RTCSessionDescription(e)).then((()=>{this.destroyed||(this._pendingCandidates.forEach((e=>{try{this._addIceCandidate(e)}catch(e){}})),this._pendingCandidates=[],"offer"===this._pc.remoteDescription.type&&this._createAnswer())})).catch((e=>{this.destroy(e)})),e.sdp||e.candidate||e.renegotiate||e.transceiverRequest||this.destroy(new Error("signal() called with invalid signal data"))}}_addIceCandidate(e){const t=new this._wrtc.RTCIceCandidate(e);this._pc.addIceCandidate(t).catch((e=>{var s;!t.address||t.address.endsWith(".local")?(s="Ignoring unsupported ICE candidate.",console.warn(s)):this.destroy(e)}))}send(e){if("string"==typeof e){RTCDataChannel.prototype.send.toString().includes("[native code]")&&this._channel.send(e)}else this._channel.send(e)}_needsNegotiation(){this._batchedNegotiation||(this._batchedNegotiation=!0,E()((()=>{this._batchedNegotiation=!1,!this.initiator&&this._firstNegotiation||this.negotiate(),this._firstNegotiation=!1})))}negotiate(){this.initiator?this._isNegotiating?this._queuedNegotiation=!0:setTimeout((()=>{this._createOffer()}),0):this._isNegotiating?this._queuedNegotiation=!0:this.emit("signal",{type:"renegotiate",renegotiate:!0}),this._isNegotiating=!0}destroy(e){this._destroy(e)}_destroy(e){this.destroyed||this.destroying||(this.destroying=!0,E()((()=>{if(this.destroyed=!0,this.destroying=!1,this._connected=!1,this._pcReady=!1,this._channelReady=!1,this._senderMap=null,clearInterval(this._closingInterval),this._closingInterval=null,clearInterval(this._interval),this._interval=null,this._chunk=null,this._cb=null,this._channel){try{this._channel.close()}catch(e){}this._channel.onmessage=null,this._channel.onopen=null,this._channel.onclose=null,this._channel.onerror=null}if(this._pc){try{this._pc.close()}catch(e){}this._pc.oniceconnectionstatechange=null,this._pc.onicegatheringstatechange=null,this._pc.onsignalingstatechange=null,this._pc.onicecandidate=null,this._pc.ondatachannel=null}this._pc=null,this._channel=null,e&&this.emit("error",e),this.emit("close")})))}_setupData(e){if(!e.channel)return this.destroy(new Error("Data channel event is missing `channel` property"));this._channel=e.channel,this._channel.binaryType="arraybuffer","number"==typeof this._channel.bufferedAmountLowThreshold&&(this._channel.bufferedAmountLowThreshold=C),this.channelName=this._channel.label,this._channel.onmessage=e=>{this._onChannelMessage(e)},this._channel.onbufferedamountlow=()=>{this._onChannelBufferedAmountLow()},this._channel.onopen=()=>{this._onChannelOpen()},this._channel.onclose=()=>{this._onChannelClose()},this._channel.onerror=e=>{this.destroy(e)};let t=!1;this._closingInterval=setInterval((()=>{this._channel&&"closing"===this._channel.readyState?(t&&this._onChannelClose(),t=!0):t=!1}),5e3)}get isBufferedAmountHigh(){return this._channel.bufferedAmount>C}write(e,t){if(this.destroyed)return t(new Error("cannot write after peer is destroyed"));if(this._connected){try{this.send(e)}catch(e){return this.destroy(e)}this.isBufferedAmountHigh?this._cb=t:t(null)}else this._chunk=e,this._cb=t}_startIceCompleteTimeout(){this.destroyed||this._iceCompleteTimer||(this._iceCompleteTimer=setTimeout((()=>{this._iceComplete||(this._iceComplete=!0,this.emit("iceTimeout"),this.emit("_iceComplete"))}),this.iceCompleteTimeout))}_createOffer(){this.destroyed||this._pc.createOffer(this.offerOptions).then((e=>{if(this.destroyed)return;this.trickle||this.allowHalfTrickle||(e.sdp=I(e.sdp)),e.sdp=this.sdpTransform(e.sdp);const t=()=>{if(this.destroyed)return;const t=this._pc.localDescription||e;this.emit("signal",{type:t.type,sdp:t.sdp})};this._pc.setLocalDescription(e).then((()=>{this.destroyed||(this.trickle||this._iceComplete?t():this.once("_iceComplete",t))})).catch((e=>{this.destroy(e)}))})).catch((e=>{this.destroy(e)}))}_createAnswer(){this.destroyed||this._pc.createAnswer(this.answerOptions).then((e=>{if(this.destroyed)return;this.trickle||this.allowHalfTrickle||(e.sdp=I(e.sdp)),e.sdp=this.sdpTransform(e.sdp);const t=()=>{if(this.destroyed)return;const t=this._pc.localDescription||e;this.emit("signal",{type:t.type,sdp:t.sdp})};this._pc.setLocalDescription(e).then((()=>{this.destroyed||(this.trickle||this._iceComplete?t():this.once("_iceComplete",t))})).catch((e=>{this.destroy(e)}))})).catch((e=>{this.destroy(e)}))}_onConnectionStateChange(){this.destroyed||"failed"===this._pc.connectionState&&this.destroy(new Error("Connection failed."))}_onIceStateChange(){if(this.destroyed)return;const e=this._pc.iceConnectionState,t=this._pc.iceGatheringState;this.emit("iceStateChange",e,t),"connected"!==e&&"completed"!==e||(this._pcReady=!0,this._maybeReady()),"failed"===e&&this.destroy(new Error("Ice connection failed.")),"closed"===e&&this.destroy(new Error("Ice connection closed."))}getStats(e){const t=e=>("[object Array]"===Object.prototype.toString.call(e.values)&&e.values.forEach((t=>{Object.assign(e,t)})),e);0===this._pc.getStats.length?this._pc.getStats().then((s=>{const i=[];s.forEach((e=>{i.push(t(e))})),e(null,i)}),(t=>e(t))):this._pc.getStats.length>0?this._pc.getStats((s=>{if(this.destroyed)return;const i=[];s.result().forEach((e=>{const s={};e.names().forEach((t=>{s[t]=e.stat(t)})),s.id=e.id,s.type=e.type,s.timestamp=e.timestamp,i.push(t(s))})),e(null,i)}),(t=>e(t))):e(null,[])}_maybeReady(){if(this._connected||this._connecting||!this._pcReady||!this._channelReady)return;this._connecting=!0;const e=()=>{this.destroyed||this.getStats(((t,s)=>{if(this.destroyed)return;t&&(s=[]);const i={},r={},n={};let o=!1;s.forEach((e=>{"remotecandidate"!==e.type&&"remote-candidate"!==e.type||(i[e.id]=e),"localcandidate"!==e.type&&"local-candidate"!==e.type||(r[e.id]=e),"candidatepair"!==e.type&&"candidate-pair"!==e.type||(n[e.id]=e)}));const a=e=>{o=!0;let t=r[e.localCandidateId];t&&(t.ip||t.address)?(this.localAddress=t.ip||t.address,this.localPort=Number(t.port)):t&&t.ipAddress?(this.localAddress=t.ipAddress,this.localPort=Number(t.portNumber)):"string"==typeof e.googLocalAddress&&(t=e.googLocalAddress.split(":"),this.localAddress=t[0],this.localPort=Number(t[1])),this.localAddress&&(this.localFamily=this.localAddress.includes(":")?"IPv6":"IPv4");let s=i[e.remoteCandidateId];s&&(s.ip||s.address)?(this.remoteAddress=s.ip||s.address,this.remotePort=Number(s.port)):s&&s.ipAddress?(this.remoteAddress=s.ipAddress,this.remotePort=Number(s.portNumber)):"string"==typeof e.googRemoteAddress&&(s=e.googRemoteAddress.split(":"),this.remoteAddress=s[0],this.remotePort=Number(s[1])),this.remoteAddress&&(this.remoteFamily=this.remoteAddress.includes(":")?"IPv6":"IPv4")};if(s.forEach((e=>{"transport"===e.type&&e.selectedCandidatePairId&&a(n[e.selectedCandidatePairId]),("googCandidatePair"===e.type&&"true"===e.googActiveConnection||("candidatepair"===e.type||"candidate-pair"===e.type)&&e.selected)&&a(e)})),o||Object.keys(n).length&&!Object.keys(r).length){if(this._connecting=!1,this._connected=!0,this._chunk){try{this.send(this._chunk)}catch(t){return this.destroy(t)}this._chunk=null;const e=this._cb;this._cb=null,e(null)}"number"!=typeof this._channel.bufferedAmountLowThreshold&&(this._interval=setInterval((()=>this._onInterval()),150),this._interval.unref&&this._interval.unref()),this.emit("connect")}else setTimeout(e,100)}))};e()}_onInterval(){!this._cb||!this._channel||this._channel.bufferedAmount>C||this._onChannelBufferedAmountLow()}_onSignalingStateChange(){this.destroyed||("stable"===this._pc.signalingState&&(this._isNegotiating=!1,this._sendersAwaitingStable.forEach((e=>{this._pc.removeTrack(e),this._queuedNegotiation=!0})),this._sendersAwaitingStable=[],this._queuedNegotiation?(this._queuedNegotiation=!1,this._needsNegotiation()):this.emit("negotiated")),this.emit("signalingStateChange",this._pc.signalingState))}_onIceCandidate(e){this.destroyed||(e.candidate&&this.trickle?this.emit("signal",{type:"candidate",candidate:{candidate:e.candidate.candidate,sdpMLineIndex:e.candidate.sdpMLineIndex,sdpMid:e.candidate.sdpMid}}):e.candidate||this._iceComplete||(this._iceComplete=!0,this.emit("_iceComplete")),e.candidate&&this._startIceCompleteTimeout())}_onChannelMessage(e){if(this.destroyed)return;let t=e.data;t instanceof ArrayBuffer&&(t=o.l.from(t)),this.emit("data",t)}_onChannelBufferedAmountLow(){if(this.destroyed||!this._cb)return;const e=this._cb;this._cb=null,e(null)}_onChannelOpen(){this._connected||this.destroyed||(this._channelReady=!0,this._maybeReady())}_onChannelClose(){this.destroyed||this.destroy()}}L.config={iceServers:[{urls:["stun:stun.l.google.com:19302","stun:global.stun.twilio.com:3478"]}],sdpSemantics:"unified-plan"},L.channelConfig={};const T=L;class R{constructor(e,t,s,i,r=0){this.sn=e,this.segId=t,this.data=s,this.fromPeerId=i,this.level=r||0}static fromSegment(e){const t=new R(e.sn,e.segId,e.data,e.fromPeerId,e.level);return t.from=e.from,t}get size(){return this.data.byteLength}get isSequential(){return this.sn>=0}}var A=s(422),D=s.n(A);class M extends(n()){static get defaultPacketSize(){return l}static get VERSION(){return"8"}constructor(e,t,s,i,r,n={}){super(),this.channel=e.fetcher.channelId,this.logger=e.logger,this.config=r,this.isInitiator=i,this.options=n,this.intermediator=n.intermediator||null,this.signalMsgs=[],this.assignPeerId(t,s),this.platform="unknown",this.super=!1,this.mobile=!1,this.mobileWeb=!1,this.mobileNet=!1,this.connected=!1,this.msgQueue=[],this.miss=0,this.notifySet=new Set,this.bufArr=[],this.packetSize=l,this.sendReqQueue=[],this.downloading=!1,this.uploading=!1,this.choked=!1,this.streamListeners=[],this.pieceMsg={},this.uploadInterrupter={targetSegId:void 0,currentSegId:void 0,canceled:!1},this.datasToSend=[],this.bytesUploaded=0,this.dataWriting=!1,this.timeSendRequest=0,this.timeReceivePiece=0,this.timeSendPiece=0,this.weight=0,this.peersConnected=1,this.uploadSpeed=0,this.gotPeers=!1,this.currentLevel=0,this.currentPos=0,this.useBackupSignal=!1,this.webRTCConfig={};const{stuns:o}=this.options;if(o&&o.length>0){const e=[];o.forEach((t=>{this.logger.info(`use stun ${t}`),e.push({urls:t})})),this.webRTCConfig.iceServers=e}this.config.webRTCConfig&&(this.webRTCConfig={...this.config.webRTCConfig,...this.webRTCConfig}),this.playlistMap=new Map,this._initPeerChannel(),this.notFatalClosed=!1,this.startSN=Number.MAX_SAFE_INTEGER,this.endSN=-1,this._loadedBytes=0}assignPeerId(t,s){this.remotePeerId=s,this.channelId=this.isInitiator?`${t}-${s}`:`${s}-${t}`,s&&(this.timeJoin=u(),this.dataExchangeTs=this.timeJoin,this.gotStatsTs=this.timeJoin,this._startTimer()),setTimeout((()=>{for(let t of this.signalMsgs)this.emit(e.DC_SIGNAL,t,!0)}),0)}_startTimer(){this.connTimeout=setTimeout((()=>{this.logger.warn(`dc ${this.channelId} connection timeout`),this.emit(e.DC_TIMEOUT)}),2e4)}get isAvailable(){return this.downloadNum<2&&!this.choked}get isAvailableUrgently(){return!this.downloading&&!this.choked}cancelDownload(t,s,i){if(i&&this.downloading&&!(this.streamListeners.length>0||this.remainAttachments<=2))return this.logger.info(`cancel download ${i} remain packets ${this.remainAttachments}`),this.timeReceivePiece=0,this.sendJson({event:e.DC_PIECE_CANCEL,sn:t,level:s,seg_id:i})}addStreamListener(e,t,s){this.streamListeners.push({handler:s,peerId:t})}removeStreamListener(e){this.streamListeners=this.streamListeners.filter((t=>t.peerId!==e||(t.handler(void 0,void 0,!0,"aborted by cancel"),!1)))}_initPeerChannel(){const t=new T({initiator:this.isInitiator,trickle:this.options.trickle||!1,config:this.webRTCConfig});this._datachannel=t,t.on("error",(t=>{let s=!0;"Ice connection failed."===t.message&&this.notFatalClosed&&(s=!1),this.emit(e.DC_ERROR,s)})),t.on("signal",(t=>{this.signalMsgs.push(t),this.emit(e.DC_SIGNAL,t)}));t.on("connect",(()=>{for(this.logger.info(`datachannel CONNECTED to ${this.remotePeerId} from ${this.intermediator?"peer":"server"}`),this.connected=!0,clearTimeout(this.connTimeout),this.signalMsgs=[],this.emit(e.DC_OPEN);this.msgQueue.length>0;){let e=this.msgQueue.shift();this.emit(e.event,e)}})),t.on("data",(t=>{const{logger:s}=this;if("string"==typeof t){let i=JSON.parse(t);if(!i)return void s.error("dc received string is null");if(!this.connected)return void this.msgQueue.push(i);let r,n=i.event;switch(r=n!==e.DC_PLAYLIST&&n!==e.DC_PEER_SIGNAL?`string: ${t}`:`event: ${n}`,s.debug(`datachannel receive ${r} from ${this.remotePeerId}`),n){case e.DC_HAVE:if(this.emit(i.event,i),!i.sn)return;this.config.live||(i.sn<this.startSN&&(this.startSN=i.sn),i.sn>this.endSN&&(this.endSN=i.sn));break;case e.DC_PIECE:this.downloading=!0,this.dataExchangeTs=u(),this.timeReceivePiece=performance.now(),this.pieceMsg=i,this._prepareForBinary(i.attachments,i.seg_id,i.sn,i.size),this.emit(i.event,i);break;case e.DC_PIECE_CANCEL:this.uploadInterrupter.targetSegId=i.seg_id,this.emit(i.event,i);break;case e.DC_PIECE_NOT_FOUND:this._sendNextReq()||(this.downloading=!1),this.emit(i.event,i);break;case e.DC_REQUEST:this._handleRequestMsg(i);break;case e.DC_PIECE_ACK:this.uploadInterrupter.canceled||(this._handlePieceAck(i.size,i.miss),this.emit(i.event,i));break;case e.DC_STATS:this._handleStats(i);break;case e.DC_PLAYLIST:this.config.sharePlaylist&&this._handlePlaylist(i);break;case e.DC_METADATA:this._handleMetadata(i);break;case e.DC_PIECE_ABORT:this.downloading&&(this._notifyDownloadListenersAbort("aborted by upstream peer"),this.emit(e.DC_PIECE_ABORT,i));break;case e.DC_CHOKE:s.info(`choke peer ${this.remotePeerId}`),this.choked=!0;break;case e.DC_UNCHOKE:s.info(`unchoke peer ${this.remotePeerId}`),this.choked=!1;break;case e.DC_CLOSE:this.emit(i.event,i.fatal||!1);break;default:this.emit(i.event,i)}}else{if(!t)return void s.error("datachannel on data is undefined!");if(!this.downloading)return void s.warn(`peer not downloading, data size ${t.byteLength} pieceMsg ${JSON.stringify(this.pieceMsg)}`);this._handleBinaryMsg(t)}})),t.once("close",(()=>{this.emit(e.DC_CLOSE,!1)})),t.on("iceStateChange",((e,t)=>{"disconnected"===e&&(this.logger.warn(`${this.remotePeerId} disconnected`),this.connected=!1)}))}sendJson(t){t.event!==e.DC_PLAYLIST&&t.event!==e.DC_PEER_SIGNAL?this.logger.debug(`dc bufferSize ${this._datachannel.bufferSize} send ${JSON.stringify(t)} to ${this.remotePeerId}`):this.logger.debug(`dc send event ${t.event} to ${this.remotePeerId}`);const s=JSON.stringify(t);return s.length>l?(this.logger.error("string to send is too large"),!1):this.send(s,!1)}send(e,t=!0){return t?(this.datasToSend.push(e),this.dataWriting||this._sendDataSync(),!0):this.sendImmediately(e)}_checkIfNeedInterrupt(){const{targetSegId:t,currentSegId:s,canceled:i}=this.uploadInterrupter;return!!i||!(!t||t!==s)&&(this.logger.info("cancel send data"),this.sendMsgPieceAbort(`${s} transfer canceled`),this.datasToSend=[],this.uploadInterrupter.canceled=!0,this._handlePieceAck(this.bytesUploaded,0),this.emit(e.DC_PIECE_ACK,{seg_id:s,size:this.bytesUploaded,canceled:!0}),!0)}_sendDataSync(){if(this._checkIfNeedInterrupt()||0===this.datasToSend.length)return void(this.dataWriting=!1);this.dataWriting=!0;const t=this.datasToSend.shift();t?(this.bytesUploaded+=t.byteLength,this._datachannel.write(t,(t=>{if(t)return this.dataWriting=!1,this.logger.warn(t.message),void this.emit(e.DC_ERROR,!1);this._sendDataSync()}))):this.logger.error("sendDataSync data is undefined!")}sendImmediately(t){if(this._datachannel.connected)try{return this._datachannel.send(t),!0}catch(t){this.logger.warn(`datachannel ${this.channelId} send data failed, close it`),this.emit(e.DC_ERROR,!1)}return!1}sendMsgHave(t,s,i={}){const r=i.reverse||void 0;delete i.reverse,this.sendJson({event:r?e.DC_HAVE_REVERSE:e.DC_HAVE,sn:t,seg_id:s,...i})}sendPieceNotFound(t,s,i={}){this.uploading=!1,this.sendJson({event:e.DC_PIECE_NOT_FOUND,seg_id:s,sn:t,...i})}sendPeers(t){this.sendJson({event:e.DC_PEERS,peers:t})}sendPeersRequest(){this.sendJson({event:e.DC_GET_PEERS})}sendMsgStats(t,s={}){const i={event:e.DC_STATS,total_conns:t,...s};this.sendJson(i)}sendMsgPlaylist(t,s,i){const r=this.playlistMap.get(t);if(r&&r.seq>=i)return;const n={event:e.DC_PLAYLIST,url:t,data:s,seq:i};this.playlistMap.set(t,{data:s,seq:i}),this.sendJson(n)}sendMsgSignal(t,s,i){return this.sendJson({event:e.DC_PEER_SIGNAL,action:"signal",to_peer_id:t,from_peer_id:s,data:i})}sendMsgSignalReject(t,s,i,r=!1){return this.sendJson({event:e.DC_PEER_SIGNAL,action:"reject",to_peer_id:t,from_peer_id:s,reason:i,fatal:r})}sendMetaData(t,s,i,r=!1){this.isInitiator&&(this.timeSendRequest=performance.now()),this.sendJson({event:e.DC_METADATA,field:t,platform:e.DC_PLAT_WEB,mobile:!!D().isMobile(),mobile_net:r,channel:this.channel,version:"2.9.0",sequential:s,peers:i})}sendPartialBuffer(e,t,s={}){this.sendMsgPiece(e,s);for(let e=0;e<t.length;e++)this.send(t[e])}sendMsgPiece(e,t={}){const{targetSegId:s}=this.uploadInterrupter;if(s&&s===e.seg_id)return this.logger.info("cancel send piece msg"),this.sendMsgPieceAbort(`${s} piece canceled`),void(this.uploadInterrupter.canceled=!0);this.uploadInterrupter={currentSegId:e.seg_id,targetSegId:void 0,canceled:!1},this.datasToSend=[],this.bytesUploaded=0,e.ext||(e.ext={}),e.ext.from&&t.from&&(t.from=`${e.ext.from}->${t.from}`),t.incompletes&&e.ext.incompletes&&(t.incompletes+=e.ext.incompletes),t=Object.assign({},e.ext,t);const i={...e,ext:t};this.sendJson(i)}sendBuffer(t,s,i,r={}){const n=r.reverse||void 0;if(delete r.reverse,!i)return void this.logger.error("sendBuffer payload is undefined!");let o=i.byteLength,a=0,h=0;o%this.packetSize==0?h=o/this.packetSize:(h=Math.floor(o/this.packetSize)+1,a=o%this.packetSize);let l={event:e.DC_PIECE,attachments:h,seg_id:s,sn:t,level:r.level,size:o,reverse:n};delete r.level,this.sendMsgPiece(l,r);const c=function(e,t,s,i){let r=[];if(i){let n;for(let i=0;i<s-1;i++)n=e.slice(i*t,(i+1)*t),r.push(n);n=e.slice(e.byteLength-i,e.byteLength),r.push(n)}else{let i;for(let n=0;n<s;n++)i=e.slice(n*t,(n+1)*t),r.push(i)}return r}(i,this.packetSize,h,a);this._sendBufferArray(c,n),this.uploading=!1,this.timeSendPiece=performance.now()}get downloadNum(){return this.downloading?this.sendReqQueue.length+1:0}requestDataById(t,s,i=!1,r={}){const n={event:e.DC_REQUEST,seg_id:t,sn:s,...r,urgent:i};this.downloading?(this.logger.info(`${this.remotePeerId} add req ${t} in queue`),i?this.sendReqQueue.unshift(n):this.sendReqQueue.push(n)):this._realRequestData(n)}requestDataBySN(t,s=!1,i={}){const r={event:e.DC_REQUEST,sn:t,...i,urgent:s};this.downloading?(this.logger.info(`add req ${t} in queue`),s?this.sendReqQueue.unshift(r):this.sendReqQueue.push(r)):this._realRequestData(r)}_sendBufferArray(e,t=!1){const s=t?e.reverse():e;for(let e=0;e<s.length;e++)this.send(s[e])}_realRequestData(t){this.sendJson(t),this.timeSendRequest=performance.now(),this.downloading=!0,this.emit(e.DC_SEND_REQUEST)}shouldWaitForRemain(e){return 0!==this.bufArrSize&&(0!==this.timeReceivePiece&&this.currentLoadSpeed()>=this.minRequiredSpeed(e))}close(t){t||(this.notFatalClosed=!0),this.emit(e.DC_CLOSE,t)}receiveSignal(e){e&&this._datachannel.signal(e)}_notifyDownloadListenersAbort(e){for(let t of this.streamListeners){const{handler:s}=t;s(void 0,void 0,!0,e)}this.streamListeners=[]}destroy(t=!0){this.logger.info(`destroy datachannel ${this.channelId}`),this.chokeTimer&&clearTimeout(this.chokeTimer),this.connTimeout&&clearTimeout(this.connTimeout),this.uploading&&this.sendMsgPieceAbort("peer is closing"),this._notifyDownloadListenersAbort("upstream peer is closed");let s={event:e.DC_CLOSE,fatal:t};this.sendJson(s),this._datachannel.removeAllListeners(),this.removeAllListeners(),this._datachannel.destroy()}_handleBinaryMsg(t){const{attachments:s,level:i,reverse:r}=this.pieceMsg;this.listenerCount(e.DC_RESPONSE)>0&&this.bufArr.push(t),this._loadedBytes+=t.byteLength,this.remainAttachments--;let n=r?this.remainAttachments+1:s-this.remainAttachments;const o=0===this.remainAttachments;if(this.emit(e.DC_PIECE_DATA,this.bufSN,this.segId,t,n,o,this.pieceMsg),this.streamListeners.length>0)for(let e of this.streamListeners){const{handler:s}=e;s(this.bufSN,this.segId,!1,t,o)}if(o){if(this.streamListeners=[],this.timeSendRequest>0)if(this.super)this.weight=1;else{const e=this.expectedSize/(performance.now()-this.timeSendRequest);this.weight=this.weight>0?.6*this.weight+.4*e:e}this.sendJson({event:e.DC_PIECE_ACK,sn:this.bufSN,seg_id:this.segId,level:i,size:this.expectedSize,miss:this.miss||void 0}),this.timeSendRequest=0,this.timeReceivePiece=0,this._sendNextReq()||(this.downloading=!1),this._handleBinaryData(r)}}_sendNextReq(){if(this.sendReqQueue.length>0){const e=this.sendReqQueue.shift();return this.logger.info(`get msg from sendReqQueue ${JSON.stringify(e)}`),this._realRequestData(e),!0}return!1}_handlePlaylist(e){const{url:t,data:s,seq:i}=e;this.playlistMap.set(t,{data:s,seq:i})}getLatestPlaylist(e,t){if(!this.playlistMap.has(e))return null;const s=this.playlistMap.get(e);return s.seq<=t||s.seq>t+2?null:s}_handleMetadata(t){const{logger:s}=this;if(this.isInitiator){const e=performance.now()-this.timeSendRequest;e>0&&(this.weight=1e5/e,s.info(`handle Metadata from ${this.remotePeerId} initial weight ${this.weight}`)),this.timeSendRequest=0}const i=t.channel;if(this.channel!==i)return s.error(`peer channel ${i} not matched!`),void this.emit(e.DC_ERROR,!0);if(t.super){s.info(`got super peer ${this.remotePeerId}`),this.super=!0;const{token:i}=this.config;if(i&&t.token!==i)return s.warn(`super peer token ${t.token} not matched!`),void this.emit(e.DC_ERROR,!0)}switch(t.platform){case e.DC_PLAT_ANDROID:this.platform=e.DC_PLAT_ANDROID;break;case e.DC_PLAT_IOS:this.platform=e.DC_PLAT_IOS;break;case e.DC_PLAT_WEB:this.platform=e.DC_PLAT_WEB}if(this.mobile=t.mobile||!1,this.mobileNet=t.mobile_net||!1,this.mobileWeb=this.mobile&&this.platform===e.DC_PLAT_WEB||!1,this.sequential=t.sequential,s.info(`${this.remotePeerId} platform ${this.platform} sequential ${this.sequential}`),t.peers&&(this.peersConnected+=t.peers,s.info(`${this.remotePeerId} now has ${this.peersConnected} peers`)),this.emit(e.DC_METADATA,t),t.field&&!this.config.live&&t.sequential){const{field:e}=t;if(Array.isArray(e))this._handleField(e);else for(let t in e)this._handleField(e[t])}}_handleField(e){e.forEach((e=>{e>=0&&(e<this.startSN&&(this.startSN=e),e>this.endSN&&(this.endSN=e))}))}_handleStats(e){this.gotStatsTs=u();const t=e.total_conns;t>0&&this.peersConnected!==t&&(this.peersConnected=t,this.logger.info(`${this.remotePeerId} now has ${this.peersConnected} peers`)),e.level&&(this.currentLevel=e.level),e.pos&&(this.currentPos=e.pos)}_handleRequestMsg(t){if(this.dataExchangeTs=u(),this.uploading)return this.logger.warn(`${this.remotePeerId} is uploading when receive request`),void this.sendPieceNotFound(t.sn,t.seg_id,{level:t.level});this.uploading=!0,this.emit(e.DC_REQUEST,t)}_handlePieceAck(e,t){0!==this.timeSendPiece&&(this.uploadSpeed=Math.round(e/(performance.now()-this.timeSendPiece)*2),this.timeSendPiece=0,this.logger.info(`${this.remotePeerId} uploadSpeed is ${this.uploadSpeed}`)),t>0&&this.logger.warn(`peer ${this.remotePeerId} miss ${t}`)}_prepareForBinary(e,t,s,i){this.bufArr=[],this._loadedBytes=0,this.remainAttachments=e,this.segId=t,this.bufSN=s,this.expectedSize=i}_handleBinaryData(t=!1){if(this.listenerCount(e.DC_RESPONSE)>0){t&&this.bufArr.reverse();let s=o.l.concat(this.bufArr);const i=s.byteLength;if(i===this.expectedSize){let t=s.buffer;const i=new R(this.bufSN,this.segId,t,this.remotePeerId,this.pieceMsg.level);this.emit(e.DC_RESPONSE,i,this.weight)}else this.logger.error(`${this.segId} expectedSize ${this.expectedSize} != byteLength ${i}`)}this.segId="",this.bufArr=[]}checkIfNeedChoke(e=!1){const{logger:t}=this,s=performance.now()-this.timeSendRequest;if(!e&&s<1500)t.info(`duration ${s} no need choke`);else if(this.miss++,t.info(`${this.remotePeerId} miss ${this.miss}`),this.miss>2&&!this.choked){this.choked=!0;const e=30*this.miss;e<=150?(t.warn(`datachannel ${this.channelId} is choked`),this.chokeTimer=setTimeout((()=>{this.choked=!1,t.warn(`datachannel ${this.channelId} is unchoked`)}),1e3*e)):t.warn(`datachannel ${this.channelId} is choked permanently`)}}get bufArrSize(){return this.downloading?this.pieceMsg.attachments-this.remainAttachments:0}loadtimeout(){const{logger:e,pieceMsg:t}=this;return e.warn(`timeout while downloading from ${this.remotePeerId}, ${this.bufArrSize} of ${t.attachments} packets loaded`),this.checkIfNeedChoke(),!0}sendMsgPieceAbort(t){(this.uploading||0!==this.datasToSend.length)&&(this.uploading=!1,this.sendJson({event:e.DC_PIECE_ABORT,reason:t}))}loadedBytes(){return this._loadedBytes}currentLoadSpeed(){return 0===this.timeReceivePiece?0:this.loadedBytes()/(performance.now()-this.timeReceivePiece)}minRequiredSpeed(e){return(this.pieceMsg.size-this.loadedBytes())/e}}const N=M,k={DPlayer:"dplayer",CBPlayer:"cbplayer",jwplayer:"jwplayer",videojs:"videojs",Clappr:"clappr",ckplayer:"ckplayer",MediaElementPlayer:"mediaelement",MediaElement:"mediaelement",TcPlayer:"tcplayer",flowplayer:"flowplayer",Chimee:"chimee",ChimeePlayer:"chimee",HlsJsPlayer:"xgplayer",fluidPlayer:"fluidplayer",OpenPlayer:"openplayer",Plyr:"plyr",Playerjs:"playerjs",Aliplayer:"aliplayer",shaka:"shakaplayer"};function O(){let e;for(let t in k)if(self[t]){e=k[t];break}return e}const $="nllL",B="d3NzJ",x="==",F="TNBLy9z",q="aWduY",z="mNvbQ",H="WwuY2RuY";class W extends(n()){constructor(e={}){if(super(),this.p2pEnabled=!(!1===e.p2pEnabled||"0"===d("_p2p")),e.tag&&e.tag.length>20)throw new Error("Tag is too long");if(e.appName&&e.appName.length>30)throw new Error("appName is too long");if(e.appId&&e.appId.length>30)throw new Error("appId is too long");if(e.token&&e.token.length>20)throw new Error("Token is too long")}initLogger(){const{config:e}=this;e.showSlogan&&"en"==("zh-CN"===(navigator.language||navigator.userLanguage)?"cn":"en")&&console.log(`%cLet the browsers become your unlimitedly scalable CDN!\n%c${self.atob("aHR0cHM6Ly9zd2FybWNsb3VkLm5ldA==")}`,"color: dodgerblue; padding:20px 0; font-size: x-large","font-size: medium; padding-bottom:15px");const t=new b(e.logLevel);return e.logger=this.logger=t,t}getExtraForStats(){return{}}getExtraForPeersRequest(){const e={};return e.num_want=this._getNumWant(),e}_getNumWant(){const{tracker:e}=this;if(!e.scheduler)return;const t=e.scheduler.peersNum;return t>0&&e.maxConnsActive-t>0?e.maxConnsActive-t:void 0}makeChannelId(e,t){if(!e||"string"!=typeof e){const e="token is required while using customized channelId!";throw console.error(e),new Error(e)}return"function"==typeof t?(s,i)=>`${e}-${t(s,i)}`:()=>`${e}-${t}`}makeSignalId(){let e="";const{config:t}=this,s=decodeURIComponent(self.atob(B+F+q+H+$+z+x));t.signalConfig&&(t.wsSignalerAddr=t.signalConfig);const{wsSignalerAddr:i}=t;if(i){let r;"object"==typeof i?(i.main||(i.main=s),r=i.main):"string"==typeof i&&(r=i,t.wsSignalerAddr={main:r}),r===s&&(r=void 0),r&&!t.wsSignalerAddr.backup&&(e=h().parseURL(r).netLoc.substr(2))}else t.wsSignalerAddr={main:s,byDefault:!0};return e}get commonBrowserInfo(){const e=D().getPlatform(),t=D().getNetType()||"wifi";this.netType=t;const{main:s,backup:i,byDefault:r}=this.config.wsSignalerAddr||{};return{signal:r?void 0:s,signal2:i,device:e,netType:t,player:O()||void 0}}get isMobileNet(){return"wifi"!==this.netType&&"ethernet"!==this.netType}setupWindowListeners(e){const t=["iPad","iPhone"].indexOf(navigator.platform)>=0?"pagehide":"beforeunload",s=()=>{this.fetcher&&this.fetcher.postStatsWithBeacon(),this.p2pEnabled&&this.disableP2P(),self.removeEventListener(t,s)};e?self.removeEventListener(t,s):self.addEventListener(t,s)}destroy(){this.disableP2P(!0),this.removeAllListeners(),this.setupWindowListeners(!0)}enableP2P(){return this.p2pEnabled?null:(this.logger&&this.logger.info("enable P2P"),this.config.p2pEnabled=this.p2pEnabled=!0,this.browserInfo?(this._init(this.channel,this.browserInfo),this):null)}get version(){return W.version}static isSupported(){const e=p();return!(!e||void 0===e.RTCPeerConnection.prototype.createDataChannel)}static get TrackerZone(){return{CN:"eu",EU:"eu",HK:"hk",USA:"us"}}}W.version="2.9.0",W.protocolVersion=N.VERSION;const j=W;function U(){if(!function(){if("undefined"!=typeof self)return self.ManagedMediaSource||self.MediaSource||self.WebKitMediaSource}())return!1;const e=self.SourceBuffer||self.WebKitSourceBuffer;return!e||e.prototype&&"function"==typeof e.prototype.appendBuffer&&"function"==typeof e.prototype.remove}let G={wsMaxRetries:10,p2pEnabled:!0,wifiOnly:!1,memoryCacheLimit:{pc:419430400,mobile:104857600},dcDownloadTimeout:25,logLevel:"error",tag:"",webRTCConfig:{},token:void 0,appName:void 0,appId:void 0,prefetchNum:5,showSlogan:!0,trickleICE:!0,announceLocation:"eu",trackerZone:void 0,geoIpPreflight:!0,getStats:function(e,t,s){},getPeerId:function(e){},getPeersInfo:function(e){}};const V={...G,httpLoadTime:0,sharePlaylist:!1,useHttpRange:!0,hlsjsInstance:null,proxyOnly:!1,p2pBlackList:["vtt","webvtt","key"],live:!0,swFile:"./sw.js",swScope:"./",swAutoRegister:!0,mediaElem:void 0,httpStreamEnabled:!0,diskCacheLimit:{pc:262144e4,mobile:1572864e3},useDiskCache:!0,waitForPeer:!1,waitForPeerTimeout:4,strictSegmentId:!1},J="store not init";function Q(e){return new Promise(((t,s)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>s(e.error)}))}function X(e,t){return t?t("readonly",(t=>Q(t.get(e)))):Promise.reject(J)}function Y(e,t,s){return s?s("readwrite",(s=>(s.put(t,e),Q(s.transaction)))):Promise.reject(J)}function K(e,t){return t?t("readwrite",(t=>(t.delete(e),Q(t.transaction)))):Promise.reject(J)}function Z(e){return e?e("readwrite",(e=>(e.clear(),Q(e.transaction)))):Promise.reject(J)}function ee(e,t){return e.openCursor().onsuccess=function(){this.result&&(t(this.result),this.result.continue())},Q(e.transaction)}const te="size";class se extends(n()){constructor(e,t){super(),this.name="SegmentStore",this.logger=t.logger,this.logger.info("use SegmentStore"),this.channel=e.channel;const s=e.browserInfo.device;this.isPC=s===D().device.PC_WEB||s===D().device.PC_NATIVE,this.maxBufSize=this.isPC?t.diskCacheLimit.pc:t.diskCacheLimit.mobile,this.overflowed=!1,this.loadingSN=0}async setupStore(){if(navigator.storage&&navigator.storage.estimate){const e=await navigator.storage.estimate(),t=Math.floor(e.quota-e.usage);t<this.maxBufSize&&(this.maxBufSize=t-104857600)}return new Promise((async(e,t)=>{if(this.isPC&&this.maxBufSize<419430400||!this.isPC&&this.maxBufSize<104857600)return void t("disk storage not enough");const s=["segments","id2Sn","metadata"];let i;try{i=function(e,t){const s=indexedDB.open(e);s.onupgradeneeded=()=>{const e=s.result;t.forEach((t=>{e.createObjectStore(t)}))};const i=Q(s);return t.map((e=>(t,s)=>i.then((i=>s(i.transaction(e,t).objectStore(e))))))}(this.channel,s)}catch(e){return void t(e)}this.segmentsStore=i[0],this.id2SnStore=i[1],this.metaStore=i[2];const r=setTimeout((()=>{t("setupStore timeout")}),500);this._initMetaStore().then((()=>{clearTimeout(r),e()})).catch((e=>{t(e)}))}))}_initMetaStore(){return this.logger.info("init MetaStore size"),Y(te,0,this.metaStore)}currBufSize(){return X(te,this.metaStore)}async hasSegOfId(e){if(!e)return Promise.resolve(!1);const t=await X(e,this.id2SnStore);return new Promise(((s,i)=>{void 0!==t?X(t,this.segmentsStore).then((t=>{t&&t.length>0&&t.some((t=>t.segId===e))?s(!0):s(!1)})).catch((e=>{this.logger.error(e),s(!1)})):s(!1)}))}async getSegById(e){if(!e)return null;const t=await X(e,this.id2SnStore);return new Promise(((s,i)=>{void 0!==t?X(t,this.segmentsStore).then((t=>{if(t&&t.length>0){const i=t.find((t=>t.segId===e));if(!i)return void s(null);if(!v(i.data))return this.logger.error(`getSegById ${i.sn} is not buffer`),void s(null);s(R.fromSegment(i))}else s(null)})).catch((e=>{this.logger.error(e),s(null)})):s(null)}))}getSegIdBySN(e){return new Promise(((t,s)=>{X(e,this.segmentsStore).then((e=>{e&&e.length>0?t(e[0].segId):t(null)})).catch((e=>{this.logger.error(e),t(null)}))}))}putSeg(t){const{logger:s}=this;v(t.data)?this._addSeg(t).then((t=>{this.emit(`${e.BM_ADDED_SN_}${t.sn}`,t),this.emit(e.BM_SEG_ADDED,t)})).catch((e=>{e&&(s.error(e),("QuotaExceededError"===e.name||e.inner&&"QuotaExceededError"===e.inner.name)&&this._trimDisk(!0))})):s.error(`putSeg ${t.sn} is not buffer`)}_addSeg(e){const{segId:t,sn:s}=e;return Y(t,s,this.id2SnStore),new Promise(((i,r)=>{X(s,this.segmentsStore).then((n=>{n?0===n.filter((e=>e.segId===t)).length&&(n.push(this._segmentToCache(e)),Y(s,n,this.segmentsStore).then((()=>{this._increaseBufSize(e.data.byteLength),i(e)})).catch((e=>{r(e)}))):Y(s,[this._segmentToCache(e)],this.segmentsStore).then((()=>{this._increaseBufSize(e.data.byteLength),i(e)})).catch((e=>{r(e)}))})).catch((e=>{r(e)}))}))}async _trimDisk(t=!1){let s=this.maxBufSize;const{logger:i}=this;let r=await this.currBufSize();var n;(t&&(s=r-104857600,s<0&&(s=0)),r<s)||(n=this.segmentsStore,n?n("readonly",(e=>{if(e.getAllKeys)return Q(e.getAllKeys());const t=[];return ee(e,(e=>t.push(e.key))).then((()=>t))})):Promise.reject(J)).then((async t=>{const n=t.sort(((e,t)=>e-t));let o=0;do{if(o++>10){console.error("too much loops in SegmentStore");break}const t=n.shift();if(void 0===t){i.error("lastSN not found");continue}if(t>=this.loadingSN){i.warn(`trimDisk failed, loadingSN ${this.loadingSN}`);break}const s=n[0],a=await X(t,this.segmentsStore);if(!a){i.warn("lastSeg not found");continue}let h=0;a.forEach((e=>{h+=e.data.byteLength})),K(t,this.segmentsStore).then((()=>{this._decreaseBufSize(parseInt(h))})),a.forEach((r=>{K(r.segId,this.id2SnStore),i.info(`pop seg ${r.segId} size ${r.data.byteLength}`),this.emit(e.BM_LOST,{sn:t,segId:r.segId,next:s,level:r.level})})),r-=h,i.info(`pop sn ${t} size ${h} currBufSize ${r}`),this.overflowed||(this.overflowed=!0)}while(r>=s)}))}_decreaseBufSize(e){X(te,this.metaStore).then((t=>{t&&Y(te,t-e,this.metaStore)})).catch((e=>{this.logger.error(e)}))}_increaseBufSize(e){X(te,this.metaStore).then((t=>{Y(te,t+e,this.metaStore),this._trimDisk()})).catch((e=>{this.logger.error(e)}))}_segmentToCache(e){return{data:e.data,level:e.level,segId:e.segId,sn:e.sn}}clear(){this.logger.warn("clear segment store");try{this._clearDisk()}catch(e){}}_clearDisk(){Z(this.segmentsStore),Z(this.id2SnStore),Z(this.metaStore)}destroy(){this.clear(),this.removeAllListeners()}}const ie=se;class re extends(n()){constructor(e,t){super(),this.name="SegmentCache",this.logger=t.logger,this.logger.info("use SegmentCache");const s=e.browserInfo.device;if(this.maxBufSize=s===D().device.PC_WEB||s===D().device.PC_NATIVE?t.memoryCacheLimit.pc:t.memoryCacheLimit.mobile,t.live)this.maxBufSize=31457280;else{if(0===this.maxBufSize)throw new Error("cannot use SegmentCache");const e=function(){const{memory:e}=performance;return e?e.jsHeapSizeLimit-e.usedJSHeapSize:-1}();e>=0&&e<this.maxBufSize&&(this.maxBufSize=e-31457280)}this._segPool=new Map,this._currBufSize=0,this.id2Sn=new Map,this.overflowed=!1,this.loadingSN=0}get currBufSize(){return this._currBufSize}hasSegOfId(e){return new Promise(((t,s)=>{const i=this.id2Sn.get(e);this._segPool.has(i)?t(this._segPool.get(i).some((t=>t.segId===e))):t(!1)}))}getSegById(e){const t=this.id2Sn.get(e);return new Promise(((s,i)=>{if(!this._segPool.has(t))return void s(null);s(this._segPool.get(t).find((t=>t.segId===e)))}))}getSegIdBySN(e){return new Promise(((t,s)=>{if(this._segPool.has(e)){t(this._segPool.get(e)[0].segId)}else t(null)}))}_calSegPoolSize(){let e=0;return this._segPool.forEach((t=>{t.forEach((t=>{e+=t.size}))})),e}putSeg(e){this._currBufSize>=1.5*this.maxBufSize&&(this._currBufSize=this._calSegPoolSize(),this._currBufSize>=1.5*this.maxBufSize&&(this.clear(),this.overflowed=!1)),v(e.data)?this._addSeg(e):this.logger.error(`putSeg ${e.sn} is not buffer`)}_addSeg(t){const{logger:s}=this,{segId:i,sn:r,size:n}=t;if(this.id2Sn.set(i,r),this._segPool.has(r)){this._segPool.get(r).push(t)}else this._segPool.set(r,[t]);this._currBufSize+=parseInt(n);const o=this._segPool.size;if(this.emit(`${e.BM_ADDED_SN_}${t.sn}`,t),this.emit(e.BM_SEG_ADDED,t),this._currBufSize<this.maxBufSize||o<=5)return;const a=Array.from(this._segPool.keys()).sort(((e,t)=>e-t));let h=0;do{if(h++>10){console.error("too much loops in SegmentCache");break}const t=a.shift();if(void 0===t){s.error("lastSN not found");continue}const i=a[0],r=this._segPool.get(t);if(!r){s.error("lastSeg not found");continue}let n=0;r.forEach((e=>{n+=e.size})),this._currBufSize-=parseInt(n),this._segPool.delete(t),r.forEach((s=>{this.id2Sn.delete(s.segId),this.emit(e.BM_LOST,{sn:t,segId:s.segId,next:i,level:s.level})})),s.info(`pop sn ${t} size ${n} currBufSize ${this._currBufSize}`),this.overflowed||(this.overflowed=!0)}while(this._currBufSize>=this.maxBufSize&&this._segPool.size>5)}clear(){this.logger.warn("clear segment cache"),this._segPool.clear(),this.id2Sn.clear(),this._currBufSize=0}destroy(){this.clear(),this.removeAllListeners()}}const ne=re;class oe extends j{constructor(e={}){super(e),e.validateSegment||(e.validateSegment=function(e,t){return!0}),this.config=Object.assign({},V,e),this.rangeTested=!1,this.lastLevel=0,this.multiBitrate=!1}setup(){let{token:e,channelId:t}=this.config,s=e=>{const t=h().parseURL(e);return`${t.netLoc.substr(2)+t.path.substring(0,t.path.lastIndexOf("."))}`};t&&(s=this.makeChannelId(e,t));return{channelIdMaker:s,signalId:this.makeSignalId(),browserInfo:{...this.commonBrowserInfo,tag:this.config.tag||void 0}}}setupElectron(){this.browserInfo.device===A.device.PC_NATIVE&&(this.browserInfo={...this.browserInfo,app:this.config.appName,bundle:this.config.appId})}getExtraForStats(){const e=super.getExtraForStats();return!this.config.live&&this.media&&(e.pos=Math.round(this.media.currentTime)),this.multiBitrate&&this.currentLevel!==this.lastLevel&&(e.level=this.currentLevel+"",this.lastLevel=this.currentLevel),e}getExtraForPeersRequest(){const e=super.getExtraForPeersRequest();return this.multiBitrate&&(e.level=this.currentLevel+""),e}destroy(){super.destroy()}async initSegmentManager(){const{logger:e,config:t}=this;if(self.indexedDB&&t.useDiskCache&&!t.live){const s=new ie(this,t);try{await s.setupStore(),this.bufMgr=s}catch(s){e.warn(s),this.bufMgr=new ne(this,t)}}else this.bufMgr=new ne(this,t);if(this.bufMgr.maxBufSize<=0)throw new Error("bufMgr state is invalid")}getTagForVod(){const e=`${(0,A.getBrowser)()}${_()?"s":""}`;return this.bufMgr?`${e}_${"SegmentStore"===this.bufMgr.name?"d":"m"}`:e}determineHttpLoadTime(e){let t=2.5;if(e&&e.length>0){const s=e.length;t=s<=3?1:s<=4?1.5:s<=5?2:s<=8?2.5:3}return t}}var ae=s(485),he=s.n(ae),le=s(934),ce=s.n(le);const de=e=>{const t=localStorage.getItem(e);try{const e=JSON.parse(t);return e.value?e.value:e}catch(e){return t}},ue=(e,t,s)=>{((e,t)=>{"object"==typeof t&&(t=JSON.stringify(t)),localStorage.setItem(e,t)})(e,{value:t,duration:s,startTime:Date.now()})};class ge{constructor(){this.p2p=0,this.share=0,this.http=0}recordP2p(e){this.p2p+=e}recordShare(e){this.share+=e}recordHttp(e){this.http+=e}resetTraffic(){this.p2p=0,this.share=0,this.http=0}get healthRatio(){if(0===this.http)return 1e3;let e=Math.round((this.p2p+this.share)/this.http*100);return e<=0&&(e=1),e}}const fe="SW_GEOIP_KEY",pe="TRACKER_EXPT",me="IPAPI_ERROR",_e="ZXU",ye="uY2R",Se="LmNv",ve="uYnll",Pe="bQ==",be="aGsuc3d",we="hcm1j",Ee="bG91ZC",Ce="5uZXQ=",Ie=Symbol("httpDownloaded"),Le=Symbol("p2pDownloaded"),Te=Symbol("p2pUploaded");class Re extends(n()){constructor(e,t,s,i,r){let n;super(),this.config=e.config;let o=this.config.announceLocation;switch(this.config.trackerZone&&(o=this.config.trackerZone),o){case"cn":case"eu":n=_e+ye+ve+Se+Pe;break;case"hk":n=be+we+Ee+Ce;break;case"us":n="dXMuaGR0dmNsb3VkLmNvbQ=="}this.engine=e,this.key=t||void 0,this.baseUrl=i||`https://${self.atob(n)}/v1`,this.channelId=self.btoa(s),this.timestamp=u(),this.health=new ge;const a=h().parseURL(this.baseUrl).netLoc;this.announce=a.replace(/\/\//,"");const l=function(e,t,s,i,r,n){let o=location.hostname;"localhost"===o&&n&&(o=`${n}.${o}`);function a(e,t,s,i,r,n){return he()(e+t+s+i+r,n)}const h=a(o,t,s,i,r,e);return h.substr(0,8)}(this.timestamp,"2.9.0",this.announce,this.channelId,r.type,this.key);this.native=!!r.bundle,this.announceInfo={...r,channel:this.channelId,ts:this.timestamp,version:"2.9.0",v:l,announce:this.announce,k:De(this.key)},this.announceURL=`${this.baseUrl}/channel`,this.reportFails=0,this.statsRequesting=!1,this.forbidden=!1,this.failConns=0,this.totalHTTPDownloaded=0,this.totalP2PDownloaded=0,this.totalP2PUploaded=0,this[Ie]=0,this[Le]=0,this[Te]=0,this.speed=0,this.offline=!1,this.errsBufStalled=0,this.mediaRequests=0,this.errsInternalExpt=0}geoipRequest(){const{logger:e}=this.engine;return new Promise(((t,s)=>{if((e=>{const t=localStorage.getItem(e);try{const e=JSON.parse(t);return!(!e.duration||!e.startTime)&&Date.now()-e.startTime<e.duration}catch(e){return!1}})(fe)){const s=de(fe);e.info("found local geo data"),t(s)}else fetch(self.atob("aHR0cHM6Ly9wcm8uaXAtYXBpLmNvbS9qc29uP2ZpZWxkcz0yMTgxODI2JmtleT1YT3BpYW5zUmdZeEdUaG8=")).then((e=>e.json())).then((e=>{if("success"!==e.status){const t=new Error(`preflight status ${e.status}`);throw ce()(t,me)}{const s=e.mobile?432e5:2592e5;ue(fe,e,s),t(e)}})).catch((e=>{s(e)}))}))}btAnnouncePreflight(){const{logger:e}=this.engine;return this.announceInfo.asn?this.btAnnounce():(e.info("preflight ip-api"),Promise.race([this.geoipRequest(),new Promise(((e,t)=>{setTimeout((()=>{t(ce()(new Error("request timeout"),me))}),600)}))]).then((e=>(this._parseGeoResponse(e),this.btAnnounce()))).catch((t=>{if(t.code!==pe){const t=de(fe);return t&&(e.info("use expired ipData"),this._parseGeoResponse(t)),this.btAnnounce()}throw t})))}_parseGeoResponse(e){const{lat:t,lon:s,isp:i,as:r,mobile:n,countryCode:o,continentCode:a}=e;n&&(this.announceInfo.netType="cellular");const h=r.split(" ")[0].substr(2);this.announceInfo={...this.announceInfo,lat:t,lon:s,isp:i,asn:h,country:o}}btAnnounce(){const{logger:e}=this.engine;return this.announceInfo.tag||(this.announceInfo.tag=`${(0,A.getBrowser)()}${_()?"s":""}`),new Promise(((t,s)=>{fetch(this.announceURL,{headers:this._requestHeader,method:"POST",body:JSON.stringify(this.announceInfo)}).then((e=>{if(!e.ok){const t=e.status>=500&&e.status<600;throw ce()(new Error(`server response code is ${e.status}`),pe,{retry:t})}return e.json()})).then((e=>{if(!this.engine)throw ce()(new Error("runtime error"),pe,{retry:!1});const s=e.data;if(s.f&&(this.forbidden=!0),-1===e.ret){const{code:t,msg:s}=e.data;throw ce()(new Error(s),pe,{retry:t>=5e3})}s.info&&console.info(`${s.info}`),s.warn&&console.warn(`${s.warn}`),s.min_conns||(s.min_conns=8),(!s.rejected||s.rejected&&s.share_only)&&s.id&&s.report_interval&&s.peers?(this.peerId=this.id=s.id,s.report_interval<20&&(s.report_interval=20),this.btStats(s.report_interval),this.getPeersURL=`${this.baseUrl}/channel/${this.channelId}/node/${this.peerId}/peers`,this.statsURL=`${this.baseUrl}/channel/${this.channelId}/node/${this.peerId}/stats`,t(s)):this.engine&&(this.engine.p2pEnabled=!1)})).catch((t=>{e.error(`btAnnounce error ${t}`),s(ce()(t,t.code,{retry:t.retry}))}))}))}btStats(e=10){this.heartbeater=setInterval((()=>{this.postStats()}),1e3*e)}postStatsWithBeacon(){if(this.offline)return;this.offline=!0;let e={off:!0};this.statsRequesting||(e={...e,...this._makeStatsBody()}),this.statsURL&&navigator.sendBeacon&&navigator.sendBeacon(this.statsURL,JSON.stringify(e))}postStats(){const{logger:t}=this.engine;this.statsRequesting=!0,fetch(this.statsURL,{method:"POST",body:JSON.stringify(this._makeStatsBody())}).then((e=>(this.statsRequesting=!1,this.reportFails=0,e.text()))).then((s=>{let i;if(i=s?JSON.parse(s):{ret:0,data:{}},-1===i.ret)clearInterval(this.heartbeater),t.error(`${i.data.msg} code ${i.data.code}`),this.engine.emit(e.RESTART_P2P);else{const{http:e=0,p2p:t=0,share:s=0,failConns:i=0,rebuffers:r=0,requests:n=0,errsInternalExpt:o=0}=this.lastStats||{};this[Ie]>=e&&(this[Ie]-=e),this[Le]>=t&&(this[Le]-=t),this[Te]>=s&&(this[Te]-=s),this.failConns>=i&&(this.failConns-=i),this.errsBufStalled>=r&&(this.errsBufStalled-=r),this.mediaRequests>=n&&(this.mediaRequests-=n),this.errsInternalExpt>=o&&(this.errsInternalExpt-=o),this.exptMsg&&(this.exptMsg=void 0)}})).catch((e=>{t.error(`btStats error ${e}`),this.statsRequesting=!1,this.reportFails++,this.reportFails>=3&&clearInterval(this.heartbeater)}))}btGetPeers(e,t=!1){const{logger:s}=this.engine,{asn:i,country:r}=this.announceInfo;let n={exclusions:e,asn:i,country:r,ratio:this.health.healthRatio,urgent:t||void 0},o={};return this.engine.getExtraForPeersRequest&&(o=this.engine.getExtraForPeersRequest()),n=Object.assign({},n,o),new Promise(((e,t)=>{this.reportFails>=3?t(new Error("reportFails >= 3")):fetch(this.getPeersURL,{headers:this._requestHeader,method:"POST",body:JSON.stringify(n)}).then((e=>e.json())).then((s=>{-1===s.ret?t(s.data.msg):e(s.data)})).catch((e=>{s.error(`btGetPeers error ${e}`),t(e)})).finally((()=>{this.health.resetTraffic()}))}))}increFailConns(){this.failConns++}increRebuffers(){this.errsBufStalled++}increMediaRequests(){this.mediaRequests++}reportFlow(e){const t=Math.round(e/1024);this[Ie]+=t,this.totalHTTPDownloaded+=t,this.health.recordHttp(t),this._emitStats()}reportDCTraffic(e,t){const s=Math.round(e/1024);this[Le]+=s,this.totalP2PDownloaded+=s,this.health.recordP2p(s),this.speed=Math.round(t),this._emitStats()}reportUploaded(e=0){const t=Math.round(e/1024);this.totalP2PUploaded+=t,this.health.recordShare(t),this[Te]+=t,this._emitStats()}destroy(){const{logger:e}=this.engine;e.warn("destroy fetcher"),this.removeAllListeners(),clearInterval(this.heartbeater)}_emitStats(){this.engine.emit("stats",{totalHTTPDownloaded:this.totalHTTPDownloaded,totalP2PDownloaded:this.totalP2PDownloaded,totalP2PUploaded:this.totalP2PUploaded,p2pDownloadSpeed:this.speed});const e=this.config.getStats;e&&"function"==typeof e&&e(this.totalP2PDownloaded,this.totalP2PUploaded,this.totalHTTPDownloaded,this.speed)}_makeStatsBody(){const{asn:e,country:t}=this.announceInfo;let s={totalConns:this.engine.tracker.totalConns,failConns:this.failConns,rebuffers:this.errsBufStalled||void 0,requests:this.mediaRequests||void 0,errsInternalExpt:this.errsInternalExpt,http:Math.round(this[Ie])||0,p2p:Math.round(this[Le])||0,share:Math.round(this[Te])||0,asn:e,country:t},i={};return this.engine.getExtraForStats&&(i=this.engine.getExtraForStats()),s=Object.assign({},s,i),this.lastStats=JSON.parse(JSON.stringify(s)),Object.keys(s).forEach((e=>{0===s[e]&&delete s[e]})),this.exptMsg&&(s.exptMsg="2.9.0 "+this.exptMsg),s}get _requestHeader(){let e={};return this.native&&(e={...e,"X-SW-Key":De(this.key),"User-Agent":"electron","X-SW-ID":this.announceInfo.bundle}),e}}const Ae=Re;function De(e){if(!e)return;const t="C@K<#q";let s="";const i=t.length;for(let r=0;r<e.length;r++){const n=e.charCodeAt(r)^t.charCodeAt(r%i);s+=String.fromCharCode(n)}return self.btoa(s)}var Me=function(e,t){return Me=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var s in t)t.hasOwnProperty(s)&&(e[s]=t[s])},Me(e,t)};function Ne(e,t){function s(){this.constructor=e}Me(e,t),e.prototype=null===t?Object.create(t):(s.prototype=t.prototype,new s)}function ke(e,t){var s="function"==typeof Symbol&&e[Symbol.iterator];if(!s)return e;var i,r,n=s.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(i=n.next()).done;)o.push(i.value)}catch(e){r={error:e}}finally{try{i&&!i.done&&(s=n.return)&&s.call(n)}finally{if(r)throw r.error}}return o}function Oe(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(ke(arguments[t]));return e}var $e=function(e,t){this.target=t,this.type=e},Be=function(e){function t(t,s){var i=e.call(this,"error",s)||this;return i.message=t.message,i.error=t,i}return Ne(t,e),t}($e),xe=function(e){function t(t,s,i){void 0===t&&(t=1e3),void 0===s&&(s="");var r=e.call(this,"close",i)||this;return r.wasClean=!0,r.code=t,r.reason=s,r}return Ne(t,e),t}($e),Fe=function(){if("undefined"!=typeof WebSocket)return WebSocket},qe={maxReconnectionDelay:1e4,minReconnectionDelay:1e3+4e3*Math.random(),minUptime:5e3,reconnectionDelayGrowFactor:1.3,connectionTimeout:4e3,maxRetries:1/0,maxEnqueuedMessages:1/0,startClosed:!1,debug:!1};const ze=function(){function e(e,t,s){var i=this;void 0===s&&(s={}),this._listeners={error:[],message:[],open:[],close:[]},this._retryCount=-1,this._shouldReconnect=!0,this._connectLock=!1,this._binaryType="blob",this._closeCalled=!1,this._messageQueue=[],this.onclose=null,this.onerror=null,this.onmessage=null,this.onopen=null,this._handleOpen=function(e){i._debug("open event");var t=i._options.minUptime,s=void 0===t?qe.minUptime:t;clearTimeout(i._connectTimeout),i._uptimeTimeout=setTimeout((function(){return i._acceptOpen()}),s),i._ws.binaryType=i._binaryType,i._messageQueue.forEach((function(e){return i._ws.send(e)})),i._messageQueue=[],i.onopen&&i.onopen(e),i._listeners.open.forEach((function(t){return i._callEventListener(e,t)}))},this._handleMessage=function(e){i._debug("message event"),i.onmessage&&i.onmessage(e),i._listeners.message.forEach((function(t){return i._callEventListener(e,t)}))},this._handleError=function(e){i._debug("error event",e.message),i._disconnect(void 0,"TIMEOUT"===e.message?"timeout":void 0),i.onerror&&i.onerror(e),i._debug("exec error listeners"),i._listeners.error.forEach((function(t){return i._callEventListener(e,t)})),i._connect()},this._handleClose=function(e){i._debug("close event"),i._clearTimeouts(),i._shouldReconnect&&i._connect(),i.onclose&&i.onclose(e),i._listeners.close.forEach((function(t){return i._callEventListener(e,t)}))},this._url=e,this._protocols=t,this._options=s,this._options.startClosed&&(this._shouldReconnect=!1),this._connect()}return Object.defineProperty(e,"CONNECTING",{get:function(){return 0},enumerable:!0,configurable:!0}),Object.defineProperty(e,"OPEN",{get:function(){return 1},enumerable:!0,configurable:!0}),Object.defineProperty(e,"CLOSING",{get:function(){return 2},enumerable:!0,configurable:!0}),Object.defineProperty(e,"CLOSED",{get:function(){return 3},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CONNECTING",{get:function(){return e.CONNECTING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"OPEN",{get:function(){return e.OPEN},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CLOSING",{get:function(){return e.CLOSING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CLOSED",{get:function(){return e.CLOSED},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"binaryType",{get:function(){return this._ws?this._ws.binaryType:this._binaryType},set:function(e){this._binaryType=e,this._ws&&(this._ws.binaryType=e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"retryCount",{get:function(){return Math.max(this._retryCount,0)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"bufferedAmount",{get:function(){return this._messageQueue.reduce((function(e,t){return"string"==typeof t?e+=t.length:t instanceof Blob?e+=t.size:e+=t.byteLength,e}),0)+(this._ws?this._ws.bufferedAmount:0)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extensions",{get:function(){return this._ws?this._ws.extensions:""},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"protocol",{get:function(){return this._ws?this._ws.protocol:""},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"readyState",{get:function(){return this._ws?this._ws.readyState:this._options.startClosed?e.CLOSED:e.CONNECTING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._ws?this._ws.url:""},enumerable:!0,configurable:!0}),e.prototype.close=function(e,t){void 0===e&&(e=1e3),this._closeCalled=!0,this._shouldReconnect=!1,this._clearTimeouts(),this._ws?this._ws.readyState!==this.CLOSED?this._ws.close(e,t):this._debug("close: already closed"):this._debug("close enqueued: no ws instance")},e.prototype.reconnect=function(e,t){this._shouldReconnect=!0,this._closeCalled=!1,this._retryCount=-1,this._ws&&this._ws.readyState!==this.CLOSED?(this._disconnect(e,t),this._connect()):this._connect()},e.prototype.send=function(e){if(this._ws&&this._ws.readyState===this.OPEN)this._debug("send",e),this._ws.send(e);else{var t=this._options.maxEnqueuedMessages,s=void 0===t?qe.maxEnqueuedMessages:t;this._messageQueue.length<s&&(this._debug("enqueue",e),this._messageQueue.push(e))}},e.prototype.addEventListener=function(e,t){this._listeners[e]&&this._listeners[e].push(t)},e.prototype.dispatchEvent=function(e){var t,s,i=this._listeners[e.type];if(i)try{for(var r=function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],s=0;return t?t.call(e):{next:function(){return e&&s>=e.length&&(e=void 0),{value:e&&e[s++],done:!e}}}}(i),n=r.next();!n.done;n=r.next()){var o=n.value;this._callEventListener(e,o)}}catch(e){t={error:e}}finally{try{n&&!n.done&&(s=r.return)&&s.call(r)}finally{if(t)throw t.error}}return!0},e.prototype.removeEventListener=function(e,t){this._listeners[e]&&(this._listeners[e]=this._listeners[e].filter((function(e){return e!==t})))},e.prototype._debug=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._options.debug&&console.log.apply(console,Oe(["RWS>"],e))},e.prototype._getNextDelay=function(){var e=this._options,t=e.reconnectionDelayGrowFactor,s=void 0===t?qe.reconnectionDelayGrowFactor:t,i=e.minReconnectionDelay,r=void 0===i?qe.minReconnectionDelay:i,n=e.maxReconnectionDelay,o=void 0===n?qe.maxReconnectionDelay:n,a=0;return this._retryCount>0&&(a=r*Math.pow(s,this._retryCount-1))>o&&(a=o),this._debug("next delay",a),a},e.prototype._wait=function(){var e=this;return new Promise((function(t){setTimeout(t,e._getNextDelay())}))},e.prototype._getNextUrl=function(e){if("string"==typeof e)return Promise.resolve(e);if("function"==typeof e){var t=e();if("string"==typeof t)return Promise.resolve(t);if(t.then)return t}throw Error("Invalid URL")},e.prototype._connect=function(){var e=this;if(!this._connectLock&&this._shouldReconnect){this._connectLock=!0;var t=this._options,s=t.maxRetries,i=void 0===s?qe.maxRetries:s,r=t.connectionTimeout,n=void 0===r?qe.connectionTimeout:r,o=t.WebSocket,a=void 0===o?Fe():o;if(this._retryCount>=i)this._debug("max retries reached",this._retryCount,">=",i);else{if(this._retryCount++,this._debug("connect",this._retryCount),this._removeListeners(),void 0===(h=a)||!h||2!==h.CLOSING)throw Error("No valid WebSocket class provided");var h;this._wait().then((function(){return e._getNextUrl(e._url)})).then((function(t){e._closeCalled||(e._debug("connect",{url:t,protocols:e._protocols}),e._ws=e._protocols?new a(t,e._protocols):new a(t),e._ws.binaryType=e._binaryType,e._connectLock=!1,e._addListeners(),e._connectTimeout=setTimeout((function(){return e._handleTimeout()}),n))}))}}},e.prototype._handleTimeout=function(){this._debug("timeout event"),this._handleError(new Be(Error("TIMEOUT"),this))},e.prototype._disconnect=function(e,t){if(void 0===e&&(e=1e3),this._clearTimeouts(),this._ws){this._removeListeners();try{this._ws.close(e,t),this._handleClose(new xe(e,t,this))}catch(e){}}},e.prototype._acceptOpen=function(){this._debug("accept open"),this._retryCount=0},e.prototype._callEventListener=function(e,t){"handleEvent"in t?t.handleEvent(e):t(e)},e.prototype._removeListeners=function(){this._ws&&(this._debug("removeListeners"),this._ws.removeEventListener("open",this._handleOpen),this._ws.removeEventListener("close",this._handleClose),this._ws.removeEventListener("message",this._handleMessage),this._ws.removeEventListener("error",this._handleError))},e.prototype._addListeners=function(){this._ws&&(this._debug("addListeners"),this._ws.addEventListener("open",this._handleOpen),this._ws.addEventListener("close",this._handleClose),this._ws.addEventListener("message",this._handleMessage),this._ws.addEventListener("error",this._handleError))},e.prototype._clearTimeouts=function(){clearTimeout(this._connectTimeout),clearTimeout(this._uptimeTimeout)},e}();class He extends(n()){constructor(e,t){super(),this.logger=e,t.startsWith("wss")?this.addr=t.replace("wss","https"):t.startsWith("ws")&&(this.addr=t.replace("ws","http")),this.connected=!1,this.retryCount=0,this.closed=!1,this.msgQueue=[],this.posting=!1}start(){this.closed=!1,this._hello((()=>{this._longPolling()}))}_hello(e){fetch(this.addr+"&hello",{method:"POST"}).then((e=>{if(!e.ok)throw new Error("hello response was not ok");return e.json()})).then((t=>{this.connected=!0,e(),this.onopen&&this.onopen(t.ver)})).catch((e=>{this.closed=!0,this.onerror&&this.onerror(e)}))}send(e){this.msgQueue.push(e),this.posting||this._realSend([...this.msgQueue])}_realSend(e){0!==e.length&&(this.posting=!0,this.msgQueue=[],fetch(this.addr,{method:"POST",body:JSON.stringify(e)}).then((()=>{this.posting=!1,this.msgQueue.length>0&&this._realSend([...this.msgQueue])})).catch((e=>{this.logger.error(e),this.posting=!1})))}close(){this.connected&&(this.closed=!0,this.connected=!1,this.abortController&&this.abortController.abort(),this.onclose&&this.onclose())}destroy(){this.close(),this.removeAllListeners()}_longPolling(){if(this.closed)return;this.abortController=new AbortController;const e=this.abortController.signal;fetch(this.addr,{signal:e}).then((e=>{if(!e.ok)throw new Error("polling response was not ok");return e.text()})).then((e=>{e&&this.onmessage&&this.onmessage(JSON.parse(e)),this.retryCount=0,this._longPolling()})).catch((e=>{this.connected&&(this.retryCount<=3?(this.retryCount++,this._longPolling()):(this.connected=!1,this.onerror&&this.onerror(e)))}))}}class We extends(n()){constructor(e,t,s,i,r="main"){super(),this.logger=e,this.config=t,this.wsAddr=s,this.serverVersion=0,this.pingInterval=i||60,this.name=r,this.pollingClient=new He(e,s);try{this._ws=this._init()}catch(t){e.error(t),this._startPolling()}}_init(){const e={maxRetries:this.config.wsMaxRetries,minReconnectionDelay:g(1e4,6e4),maxReconnectionDelay:6e5,maxEnqueuedMessages:20};let t=new ze(this.wsAddr,void 0,e);return t.addEventListener("open",(()=>{this.logger.info(`signal ${this.name} ${this.wsAddr} connection opened`),this.pollingClient.connected?this.pollingClient.close():(this.onopen&&this.onopen(),this._startPing(this.pingInterval))})),t.push=t.send,t.send=e=>{let s=JSON.stringify(e);t.push(s)},t.addEventListener("message",(e=>{let t=e.data;const s=JSON.parse(t),i=s.action;if("pong"!==i){if("ver"!==i)return"close"===i?(this.logger.warn(`server close signal ${this.name} reason ${s.reason}`),void this.close()):void(this.onmessage&&this.onmessage(s,this.name));this.serverVersion=s.ver}else clearTimeout(this.pongTimer)})),t.addEventListener("close",(e=>{this.logger.warn(`signal ${this.name} ${this.wsAddr} closed ${e.code} ${e.reason}`),e.code>=5e3||e.code<4e3?(this.onclose&&this.onclose(),this._stopPing()):this.close()})),t.addEventListener("error",(e=>{this._stopPing(),this.onerror&&this.onerror(e),this._startPolling()})),t}_startPolling(){this.pollingClient.connected||(this.logger.info("start polling"),this.pollingClient.start(),this._setupPolling(this.pollingClient))}sendSignal(e,t){const s={action:"signal",to_peer_id:e,data:t};this._send(s)}sendReject(e,t,s){const i={action:"reject",to_peer_id:e,reason:t,fatal:s};this._send(i)}_send(e){this.pollingClient.connected?this.pollingClient.send(e):this._ws&&this._ws.send(e)}_startPing(e=120){this.connected&&(this.pingTimer=setInterval((()=>{const e={action:"ping"};this._ws&&this._ws.send(e),this.serverVersion>=22&&this._waitForPong()}),1e3*e))}_waitForPong(){this.pongTimer=setTimeout((()=>{this.logger.warn(`signal ${this.name} wait for pong timeout, reconnect`),this.close(),this.reconnect()}),15e3)}_resetPing(){this._stopPing(),this._startPing(this.pingInterval)}_stopPing(){clearInterval(this.pingTimer),clearTimeout(this.pongTimer),this.pingTimer=null,this.pongTimer=null}close(){this.logger.info(`close signal ${this.name}`),this._stopPing(),(()=>{this._ws&&this._ws.close(1e3,"normal close")})(),this.pollingClient.close()}reconnect(){this._ws&&(this.logger.info(`reconnect signal ${this.name}`),this._ws.reconnect())}destroy(){this.close(),this._ws=null,this.removeAllListeners(),this.pollingClient.destroy()}get connected(){return!!this.pollingClient.connected||this._connected}get _connected(){return!!this._ws&&this._ws.readyState===ze.OPEN}_setupPolling(e){e.onopen=e=>{e&&(this.serverVersion=e),this.logger.info("polling opened"),this.onopen&&this.onopen()},e.onerror=e=>{this._connected||this.onerror&&this.onerror(e)},e.onclose=()=>{this._connected||this.onclose&&this.onclose()},e.onmessage=e=>{if(this.onmessage)for(let t of e)this.onmessage(t,this.name)}}}const je=We,Ue=class extends(n()){constructor(e,t,s,i){super(),this.logger=e,this.config=t,this.mainAddr=s,this.backupAddr=i,this.mainWS=this._init(s),this.backupTimer=setTimeout((()=>{this.destroyed||(this.backupWS=this._init(i,"backup"))}),900),this._connected=!1,this.destroyed=!1}_init(e,t){if(!e)return null;let s=new je(this.logger,this.config,e,270,t);return s.onopen=()=>{!this._connected&&this.onopen&&(this._connected=!0,this.onopen())},s.onmessage=e=>{this.onmessage&&this.onmessage(e,s.name)},s.onclose=()=>{this._connected&&!this.connected&&this.onclose&&(this._connected=!1,this.onclose())},s.onerror=e=>{this.onerror&&this.onerror(e)},s}sendSignal(e,t,s){if(s){const i=this._getWSByName(s);i&&i.sendSignal(e,t)}else this.mainConnected?this.mainWS.sendSignal(e,t):this.backupConnected?this.backupWS.sendSignal(e,t):this.logger.warn("no signal available")}sendReject(e,t,s,i){if(i){const r=this._getWSByName(i);if(r)return void r.sendReject(e,t,s)}this.mainConnected?this.mainWS.sendReject(e,t,s):this.backupConnected?this.backupWS.sendReject(e,t,s):this.logger.warn("no signal available, send reject failed")}close(){this.mainWS&&this.mainWS.close(),this.backupWS&&this.backupWS.close()}_getWSByName(e){return this.mainWS&&this.mainWS.name===e?this.mainWS:this.backupWS&&this.backupWS.name===e?this.backupWS:null}reconnect(){this.mainWS&&this.mainWS.reconnect(),this.backupWS&&this.backupWS.reconnect()}destroy(){this.close(),clearTimeout(this.backupTimer),this.mainWS=null,this.backupWS=null,this.removeAllListeners(),this.destroyed=!0}get connected(){return this.mainConnected||this.backupConnected}get mainConnected(){return this.mainWS&&this.mainWS.connected}get backupConnected(){return this.backupWS&&this.backupWS.connected}};const Ge=function(e,t,s=40){var i=null,r=!1,n=s;return function(s=!1){if(s)return clearTimeout(i),void(r=!1);r||(r=!0,i=setTimeout((function(){e.call(t,n),r=!1,i=null}),1e3*n),n*=1.1)}};class Ve{constructor(e,t,s=15){this.engine=e,this.config=t,this.trickle=t.waitForPeer,this.poolSize=s,this.pool=[];for(let e=0;e<s;e++)this.pool.push(this._createPeer());this.timer=setTimeout((()=>{this.destroy()}),2e4)}_createPeer(){return new N(this.engine,void 0,void 0,!0,this.config,{trickle:this.trickle})}get size(){return this.pool.length}getPeer(){return 0===this.size?this._createPeer():this.pool.shift()}destroy(){for(let e of this.pool)e.destroy(!0);this.pool=[],clearTimeout(this.timer)}}class Je extends(n()){constructor(e,t,s,i){super(),this.engine=e,this.logger=e.logger,this.config=i,this.connected=!1,this.scheduler=s,this.sequential=this.scheduler.sequential,this.DCMap=new Map,this.failedDCSet=new Set,this.notFoundDCSet=new Set;const r=D().isMobile();this.peerPool=new Ve(e,i,r?10:15),this.signalerWs=null,this.fetcher=t,this.peers=[],this.minConns=5,this.stuns=[],this.requestMorePeers=Ge(this._requestMorePeers,this),this.maxConns=r?13:22,this.maxConnsActive=r?8:12,this.peersIncrement=0,this.gotPeersFromTracker=!1,this.fuseRate=-1,this.overloaded=!1}get totalConns(){return this.scheduler.peersNum+1}resumeP2P(){if(!this.fetcher)return;const{engine:t,config:s,fetcher:i}=this,{btAnnounce:r,btAnnouncePreflight:n}=i,{wsSignalerAddr:o,wifiOnly:a,geoIpPreflight:h,getPeerId:l}=s;(h?n:r).call(i).then((e=>{if(!this.scheduler)return;t.peerId=this.peerId=e.id,this.minConns=e.min_conns;const s=e.peers;this.scheduler.notifyPeersLoaded(s.length),t.netType=i.announceInfo.netType,(e.wifi_only||a)&&t.isMobileNet&&(this.scheduler.downloadOnly=!0,this.logger.info("downloadOnly mode")),e.overload&&(this.overloaded=!0,this.logger.warn("server is overloaded, degrade"));const r=o.main;let n=o.backup;e.signal&&!e.signal2&&(n=void 0),this.signalerWs=this._initSignalerWs(e.signal||r,e.signal2||n,e.token,e.token2),0===s.length?this.requestMorePeers():this.peers=this._filterPeers(s),t.emit("peerId",this.peerId),l&&"function"==typeof l&&l(this.peerId),e.stun&&e.stun.length>0&&(this.stuns=e.stun),e.debug&&this.logger.enableDebug(),e.fuse_rate&&(this.fuseRate=e.fuse_rate),this.logger.info(`announce request response ${JSON.stringify(e,null,2)}`)})).catch((s=>{if(this.scheduler&&("TRACKER_EXPT"===s.code&&t.emit(e.EXCEPTION,s),this.scheduler.notifyPeersLoaded(0),s.retry)){const e=g(15e3,4e4);this.logger.warn(`announce retry after ${e}ms`),this.announceTimer=setTimeout((()=>{this.resumeP2P()}),e)}}))}stopP2P(){this.fetcher.postStatsWithBeacon(),this.fetcher.destroy(),this.fetcher=null,this.requestMorePeers(!0),this.scheduler.destroy(),this.scheduler=null,this.signalerWs&&(this.signalerWs.destroy(),this.signalerWs=null),this.peers=[];for(let e of this.DCMap.values())e.destroy(!0);this.DCMap.clear(),this.peerPool.destroy(),this.peerPool=null,this.failedDCSet.clear(),this.notFoundDCSet.clear(),this.logger.warn("tracker stop p2p")}destroy(){this.stopP2P(),this.removeAllListeners(),clearTimeout(this.announceTimer);const{config:e}=this;e.getStats=e.getPeerId=e.getPeersInfo=null,this.logger.warn("destroy tracker")}_filterPeers(e){const t=[],s=[...this.DCMap.keys(),...this.failedDCSet.keys(),this.peerId];return e.filter((e=>!s.includes(e.id))).forEach((e=>{t.push({id:e.id,intermediator:e.intermediator})})),t}_tryConnectToAllPeers(){if(0!==this.peers.length&&this.signalerWs.connected)for(this.logger.info(`try connect to ${this.peers.length} peers`);this.peers.length>0&&!(this.DCMap.size>=this.maxConnsActive);){let e=this.peers.shift();const t=e.intermediator;this.logger.debug(`new DataChannel ${e.id} intermediator ${t}`),this._createDatachannel(e.id,!0,t)}}_setupDC(t){t.on(e.DC_SIGNAL,((e,s)=>{const i=t.remotePeerId;if(t.intermediator){const s=this.DCMap.get(t.intermediator);if(s){if(s.sendMsgSignal(i,this.peerId,e))return;this.logger.warn(`intermediator ${t.intermediator} relay failed`)}}this.signalerWs.sendSignal(i,e,t.signalName)})).on(e.DC_PEER_SIGNAL,(e=>{const s=e.to_peer_id,i=e.from_peer_id,r=e.action;if(s&&i&&r)if(s!==this.peerId){this.logger.info(`relay signal for ${i}`);const n=this.DCMap.get(s);if(n){if("signal"!==r)return void n.sendMsgSignalReject(s,i,e.reason,e.fatal);if(n.sendMsgSignal(s,i,e.data))return}t.sendMsgSignal(i,s)}else"signal"===r?this._handleSignalMsg(i,e,t.remotePeerId):this._handSignalRejected(i,e)})).on(e.DC_GET_PEERS,(()=>{const e=u(),s=this.scheduler.getPeers().filter((e=>e.peersConnected<(e.mobileWeb?13:22)&&!e.super));if(s&&s.length>0){const i=[];s.forEach((s=>{if(s.remotePeerId===t.remotePeerId||s.remotePeerId===this.peerId)return;if(!this.config.live&&(s.currentPos-t.currentPos>600||s.currentPos<t.currentPos))return;e-s.timeJoin>50&&i.push({id:s.remotePeerId})})),this.logger.info(`send ${i.length} peers to ${t.remotePeerId}`),t.sendPeers(i)}})).on(e.DC_PEERS,(e=>{t.gotPeers=!0;const s=e.peers;if(s&&s.length>0&&this.scheduler.peersNum<10){const e=5;this.logger.info(`receive ${s.length} peers from ${t.remotePeerId}`),s.forEach((e=>{e.intermediator=t.remotePeerId})),this.peers=this._filterPeers(s).slice(0,e),this._tryConnectToAllPeers()}})).once(e.DC_ERROR,(e=>{this.logger.info(`datachannel ${t.channelId} failed fatal ${e}`),this.scheduler&&(this.scheduler.deletePeer(t),this._destroyAndDeletePeer(t.remotePeerId,e),this.requestMorePeers(),this.fetcher&&(t.connected||e&&this.fetcher.increFailConns(),e&&this.failedDCSet.add(t.remotePeerId),this._doSignalFusing(this.scheduler.peersNum),this._tryConnectToAllPeers()))})).once(e.DC_TIMEOUT,(()=>{this.notFoundDCSet.add(t.remotePeerId)})).once(e.DC_CLOSE,(e=>{this.logger.info(`datachannel ${t.channelId} closed fatal ${e}`),this.scheduler&&(this.scheduler.deletePeer(t),this._doSignalFusing(this.scheduler.peersNum)),this._destroyAndDeletePeer(t.remotePeerId,e),e&&this.failedDCSet.add(t.remotePeerId),this.requestMorePeers(),this._tryConnectToAllPeers()})).once(e.DC_OPEN,(()=>{t.isInitiator&&this.scheduler.handshakePeer(t)})).once(e.DC_METADATA,(e=>{const{scheduler:s}=this;t.isInitiator||s.handshakePeer(t),s.handleMetaData(t,e);const i=this.DCMap.size>=this.minConns+3;this.requestMorePeers(i),this.peersIncrement++,this._doSignalFusing(s.peersNum+1)}))}_doSignalFusing(e){if(this.fuseRate<=0)return;const t=this.signalerWs.connected;t&&e>=this.fuseRate+2?(this.logger.warn("reach fuseRate, report stats close signaler"),this.totalConns-1>0&&this.fetcher.postStats(),this.signalerWs.close()):!t&&e<this.fuseRate&&(this.logger.warn("low conns, reconnect signaler"),this.signalerWs.reconnect())}_initSignalerWs(t,s,i,r){const n=(e,t)=>{let s=`${e}?id=${this.peerId}&p=web&v=2.9.0`;return t&&(s=`${s}&token=${t}`),s};let o,a=n(t,i);if(!this.overloaded&&s&&s!==t){let e=n(s,r);o=new Ue(this.logger,this.config,a,e)}else o=new je(this.logger,this.config,a,270);return o.onopen=()=>{this.connected=!0,this.engine.emit("serverConnected",!0),this._tryConnectToAllPeers()},o.onmessage=(e,t)=>{let s=e.action;const i=e.from_peer_id||e.from;if(i)switch(s){case"signal":this._handleSignalMsg(i,e,null,t);break;case"reject":this._handSignalRejected(i,e);break;default:this.logger.warn(`Signal websocket unknown action ${s}`)}else this.logger.warn("fromPeerId is missed")},o.onclose=()=>{this.connected=!1,this.engine.emit("serverConnected",!1)},o.onerror=t=>{t.message&&this.engine.emit(e.EXCEPTION,ce()(t,"SIGNAL_EXPT"))},o}_handSignalRejected(e,t){this.logger.warn(`signaling ${e} rejected, reason ${t.reason}`);const s=this.DCMap.get(e);s&&!s.connected&&(s.destroy(t.fatal),this.DCMap.delete(e)),this.requestMorePeers(),t.fatal&&this.failedDCSet.add(e),this._tryConnectToAllPeers()}_handleSignalMsg(e,t,s,i){if(!this.scheduler)return;const{logger:r}=this;if(t.data){if(this.failedDCSet.has(e))return void this._sendSignalReject(e,`peer ${e} in blocked list`,s,i,!0);this._handleSignal(e,t.data,s,i)}else{const t=this.DCMap.get(e);if(!t)return;if(this.signalerWs.backupConnected&&t&&t.signalMsgs.length>0&&"main"===i&&!t.useBackupSignal){t.useBackupSignal=!0,t.signalName="backup",r.warn(`${e} not found from main, try backup signal`);for(let s of t.signalMsgs)this.signalerWs.sendSignal(e,s,"backup");return}if(t.useBackupSignal)return;this._destroyAndDeletePeer(e),r.info(`signaling ${e} not found`);const{scheduler:n}=this;n.waitForPeer&&(n.waitingPeers--,0===n.waitingPeers&&n.notifyPeersLoaded(0)),this.requestMorePeers(),this._tryConnectToAllPeers(),s||this.notFoundDCSet.add(e)}}_handleSignal(e,t,s,i){const r=t.type,{logger:n}=this;let o=this.DCMap.get(e);if(o){if(o.connected)return void n.info("datachannel had connected, signal ignored");if("offer"===r){if(!(this.peerId>e))return void n.warn(`signal type wrong ${r}, ignored`);this._destroyAndDeletePeer(e,!1),n.warn(`signal type wrong ${r}, convert to non initiator`),o=this._createDatachannel(e,!1,s)}}else{if("answer"===r){const t=`signal type wrong ${r}`;return n.warn(t),this._sendSignalReject(e,t,s,i),void this._destroyAndDeletePeer(e,!1)}if(n.debug(`receive node ${e} connection request`),this.DCMap.size>=this.maxConns){const t=`peers reach limit ${this.maxConns}`;return n.warn(t),void this._sendSignalReject(e,t,s,i)}o=this._createDatachannel(e,!1,s)}o&&(i&&(o.signalName=i),o.receiveSignal(t))}_createDatachannel(e,t,s){if(!this.engine.fetcher)return;let i;if(t&&this.peerPool.size>0)i=this.peerPool.getPeer(),this.logger.info(`get peer from pool, signal size ${i.signalMsgs.length}`),i.intermediator=s,i.assignPeerId(this.peerId,e);else{let r=this.config.trickleICE;s||this.overloaded&&(r=!1),i=new N(this.engine,this.peerId,e,t,this.config,{stuns:this.stuns,intermediator:s,trickle:r})}return this.DCMap.set(e,i),this._setupDC(i),i}_sendSignalReject(e,t,s,i,r){if(s){const i=this.DCMap.get(s);if(i&&i.sendMsgSignalReject(e,this.peerId,t,r))return}this.signalerWs.sendReject(e,t,r,i)}_requestMorePeers(e){if(!this.fetcher)return;const{logger:t}=this;t.info(`requestMorePeers after delay ${e}`);const s=this.scheduler.peersNum,i=this.peersIncrement;this.peersIncrement=0,s>=this.minConns||(0===s||i<=3&&!this.gotPeersFromTracker&&!this.overloaded?(this.failedDCSet.size>50&&(this.failedDCSet=new Set([...this.failedDCSet].slice(-50))),this.notFoundDCSet.size>20&&(this.notFoundDCSet=new Set([...this.notFoundDCSet].slice(-20))),this.fetcher.btGetPeers([...this.DCMap.keys(),...this.failedDCSet.keys(),...this.notFoundDCSet.keys()],0===s).then((e=>{e&&e.peers&&(t.info(`requestMorePeers resp ${JSON.stringify(e,null,2)}`),this.peers=this._filterPeers(e.peers),this._tryConnectToAllPeers())})).catch((e=>{t.error(`requestMorePeers error ${e}`)})),this.gotPeersFromTracker=!0):s<this.maxConnsActive&&(this.scheduler.requestPeers(),this.gotPeersFromTracker=!1))}_destroyAndDeletePeer(e,t=!0){const s=this.DCMap.get(e);return!!s&&(s.destroy(t),this.DCMap.delete(e),!0)}}const Qe=Je;function Xe(e,t,s="main"){return"main"!==s&&"audio"!==s}function Ye(){const e=performance.now();return{trequest:e,tfirst:0,tload:0,aborted:!1,loaded:0,retry:0,total:0,chunkCount:0,bwEstimate:0,loading:{start:e,first:0,end:0},parsing:{start:0,end:0},buffering:{start:0,first:0,end:0}}}function Ke(e,t){let s,i,r,n,o;const a=performance.now();s=a-300,i=a-200,r=a,e.trequest=s,e.tfirst=i,e.tload=r,e.loading={first:s,start:i,end:r},n=o=t,e.loaded=n,e.total=o}class Ze extends(n()){constructor(){super(),this.UNSENT=0,this.OPENED=1,this.HEADERS_RECEIVED=2,this.LOADING=3,this.DONE=4,this.timeout=0,this.withCredentials=!1,this.status=0,this.readyState=this.UNSENT,this.headers=new Map,this.responseHeaders=null,this.on("load",(e=>{this.onload&&this.onload(e)})),this.on("abort",(e=>{this.onabort&&this.onabort(e)})),this.on("error",(e=>{this.onerror&&this.onerror(e)})),this.on("loadstart",(e=>{this.onloadstart&&this.onloadstart(e)})),this.on("progress",(e=>{this.onprogress&&this.onprogress(e)})),this.on("timeout",(e=>{this.ontimeout&&this.ontimeout(e)})),this.on("loadend",(e=>{this.onloadend&&this.onloadend(e)})),this.on("readystatechange",(()=>{this.onreadystatechange&&this.onreadystatechange()}))}setRequestHeader(e,t){this.headers.set(e,t)}addEventListener(e,t){this.addListener(e,t)}removeEventListener(e,t){this.removeListener(e,t)}overrideMimeType(){}getAllResponseHeaders(){if(!this.responseHeaders)return null;let e="";return this.responseHeaders.forEach(((t,s)=>{e+=`${s}: ${t}\n`})),e}getResponseHeader(e){return this.responseHeaders?this.responseHeaders.get(e):null}open(){this.readyState=this.OPENED,this.emit("loadstart")}abort(){this.readyState=this.DONE,this.status=0}send(){}_emitEvent(e){this.emit(e,new ProgressEvent(e))}}class et{constructor(e){this.fetchSetup=e.fetchSetup||tt,this.xhrSetup=e.xhrSetup,function(e){try{new e}catch(e){return!1}return!0}(self.AbortController)&&(this.controller=new self.AbortController),this.stats=Ye(),this.packetSize=l,this.fakeXhr=new Ze}destroy(){this.loader=this.callbacks=null,this.abortInternal()}abortInternal(){const e=this.response;e&&e.ok||(this.stats.aborted=!0,this.callbacks&&this.callbacks.onUpdate&&this.callbacks.onUpdate(void 0,!1,!0),this.controller&&this.controller.abort())}abort(){this.abortInternal(),this.callbacks&&this.callbacks.onAbort&&this.callbacks.onAbort(this.stats,this.context,this.response)}load(e,t,s){const i=this.stats;i.trequest=i.loading.start=performance.now();let r=function(e,t){const s={method:"GET",mode:"cors",credentials:"same-origin",signal:t,headers:new self.Headers(Object.assign({},e.headers))};e.rangeEnd&&s.headers.set("Range","bytes="+e.rangeStart+"-"+String(e.rangeEnd-1));return s}(e,this.controller?this.controller.signal:void 0);const n="arraybuffer"===e.responseType,o=n?"byteLength":"length",a=s.onUpdate,h=s.onBodyStart;this.context=e,this.config=t,this.callbacks=s,this.xhrSetup&&(this.xhrSetup(this.fakeXhr,e.url),r=function(e,t){e.withCredentials&&(t.credentials="include");for(let[s,i]of e.headers)t.headers.set(s,i);return t}(this.fakeXhr,r)),this.request=this.fetchSetup(e,r),clearTimeout(this.requestTimeout),this.requestTimeout=setTimeout((()=>{this.abortInternal(),this.fakeXhr._emitEvent("timeout"),this.fakeXhr._emitEvent("loadend"),s.onTimeout&&s.onTimeout(i,e,this.response)}),this.fakeXhr.timeout||t.timeout);const{fakeXhr:l}=this;l.readyState=l.OPENED,l.emit("readystatechange"),l._emitEvent("loadstart"),fetch(this.request).then((t=>{if(this.response=this.loader=t,!t.ok){const{status:e,statusText:s}=t;throw a&&a(void 0,!1,!0),new st(s||"fetch, bad network response",e,t)}i.tfirst=i.loading.first=Math.max(performance.now(),i.loading.start),i.total=parseInt(t.headers.get("Content-Length")||"0");const{fakeXhr:s}=this;return s.readyState=s.HEADERS_RECEIVED,s.responseHeaders=t.headers,s.emit("readystatechange"),a&&"0"!==i.total?(h&&h(i.total),this.loadProgressively(t,i,e,a)):(s.emit("progress",new ProgressEvent("progress",{lengthComputable:!1})),n?t.arrayBuffer():t.text())})).then((t=>{const{response:r}=this;clearTimeout(this.requestTimeout),i.tload=i.loading.end=Math.max(performance.now(),i.loading.first),i.loaded=i.total=t[o];const n={url:r.url,data:t};s.onProgress&&s.onProgress(i,e,t,r),s.onSuccess&&s.onSuccess(n,i,e,r)})).catch((t=>{if(clearTimeout(this.requestTimeout),i.aborted)return;a&&a(void 0,!1,!0);const r=t&&t.code||0,n=t?t.message:null;s.onError&&s.onError({code:r,text:n},e,t?t.details:null)}))}loadProgressively(e,t,s,i){const r=e.body.getReader();let n=0,a=0,h=(0,o.l)(0);const l=()=>r.read().then((({value:s,done:r})=>{const{fakeXhr:c}=this;if(c.readyState!==c.LOADING&&(c.readyState=c.LOADING,c.emit("readystatechange")),s&&(n+=s.length),r){if(h.byteLength>0)if(n<=this.packetSize){const e=(0,o.l)(n);h.copy(e,0,a*this.packetSize,h.byteLength),i(e,!0)}else{const e=y(h,a*this.packetSize);for(let t=0;t<e.length;t++)i(e[t],t===e.length-1)}const t=h.buffer,{fakeXhr:s}=this,{status:r,statusText:l,url:c}=e;return s.readyState=s.DONE,s.responseText=r,s.status=l,s.responseURL=c,s.responseType="arraybuffer",s.response=t,s.emit("readystatechange"),s._emitEvent("load"),s._emitEvent("loadend"),Promise.resolve(t)}if(t.loaded+=s.length,c.emit("progress",new ProgressEvent("progress",{lengthComputable:!0,loaded:t.loaded,total:t.total})),h=o.l.concat([h,s]),n>=this.packetSize){n-=this.packetSize;const e=(0,o.l)(this.packetSize);h.copy(e,0,a*this.packetSize,(a+1)*this.packetSize),a++,i(e,!1)}return l()})).catch((()=>(this.fakeXhr._emitEvent("abort"),this.fakeXhr._emitEvent("loadend"),Promise.reject())));return l()}}function tt(e,t){return new self.Request(e.url,t)}class st extends Error{constructor(e,t,s){super(e),this.code=t,this.details=s}}class it{constructor(t,s,i,r){this.bufferList=[],this.streamListeners=[],this.finished=!1,this.packetSize=l,this.attachments=r%this.packetSize==0?r/this.packetSize:Math.floor(r/this.packetSize)+1,this.pieceMsg={event:e.DC_PIECE,attachments:this.attachments,seg_id:i,sn:t,level:s,size:r,reverse:!1},this.sink=(0,o.l)(0),this.source="HttpStream"}receiveBytes(e,t){e.byteLength&&(this.sink=o.l.concat([this.sink,e]),this.bufferList.push(e),t&&(this.finished=!0),this._notifyStreamListeners(e))}getCompleteBuffer(){return this.sink.buffer}destroy(){this.finished||this._notifyStreamListenersAbort()}addStreamListener(e,t,s){this.streamListeners.push({handler:s,peerId:t})}removeStreamListener(e){this.streamListeners=this.streamListeners.filter((t=>t.peerId!==e||(t.handler(void 0,void 0,!0,"aborted by cancel"),!1)))}_notifyStreamListenersAbort(){for(let e of this.streamListeners){const{handler:t}=e;t(void 0,void 0,!0,"aborted by httpLoader")}this.streamListeners.length=0}_notifyStreamListeners(e){const{sn:t,seg_id:s}=this.pieceMsg;for(let i of this.streamListeners){const{handler:r}=i;r(t,s,!1,e,this.finished)}this.finished&&(this.streamListeners.length=0)}}const rt=0,nt=1,ot=2,at=3,ht=(e,t,s,i,r)=>e.filter((e=>e.bitset.hasWithId(s,i,r,t)));class lt{constructor(e=!1,t){this.isLive=e,this.levelMap=new Map;for(let e in t){const s=Number(e);if(s<0)continue;const i=new Map;if(t[e])for(let s of t[e])i.set(s,{state:nt,segId:void 0});this.levelMap.set(s,i)}}totalLevels(){return this.levelMap.size}hasWithId(e,t,s,i=rt){if(t<0)return!1;const r=this._createOrGetSet(t).get(e);return!!r&&((!s||!r.segId||r.segId===s)&&(i===rt||r.state===i))}has(e,t,s=rt){return this.hasWithId(e,t,void 0,s)}hasCompleteOr(e,t,s=nt){const i=this._createOrGetSet(t).get(e);return!!i&&(i.state===nt||i.state===s)}getObj(e,t){let s=this._createOrGetSet(t).get(e);return s||(s={}),s}getSegId(e,t){return this.getObj(e,t).segId}getState(e,t){return this.getObj(e,t).state}delete(e,t){return this._createOrGetSet(t).delete(e)}add(e,t,s,i){if("number"!=typeof(r=e)||r%1!=0)return;var r;this._createOrGetSet(t).set(e,{state:i,segId:s}),this.isLive&&this._trimBitset(e)}array(e){const t=this._createOrGetSet(e);return this._keysForStateComplete(t)}allArray(){let e={};return this.levelMap.forEach(((t,s)=>{e[s]=this._keysForStateComplete(t)})),e}clear(){this.levelMap.forEach((e=>{e.clear()}))}size(e){return this._createOrGetSet(e).size}_createOrGetSet(e){"number"!=typeof e&&(e=Number(e));let t=this.levelMap.get(e);return t||(t=new Map,this.levelMap.set(e,t)),t}_trimBitset(e){const t=e-20;t>0&&this.levelMap.forEach((e=>{e.delete(t)}))}_keysForStateComplete(e){const t=[];for(let[s,i]of e)i.state===nt&&t.push(s);return t}}class ct{constructor(){this.levelMap=new Map}totalLevels(){return this.levelMap.size}has(e,t){return this._createOrGetMap(t).has(e)}delete(e,t){return this._createOrGetMap(t).delete(e)}decre(e,t){const s=this._createOrGetMap(t);if(s.has(e)){let t=s.get(e);1===t?s.delete(e):s.set(e,t-1)}}incre(e,t){const s=this._createOrGetMap(t);if(s.has(e)){let t=s.get(e);s.set(e,t+1)}else s.set(e,1)}clear(){this.levelMap.forEach((e=>{e.clear()}))}size(e){return this._createOrGetMap(e).size}_createOrGetMap(e){"number"!=typeof e&&(e=Number(e));let t=this.levelMap.get(e);return t||(t=new Map,this.levelMap.set(e,t)),t}}const dt=class{constructor(){this.peerMap=new Map}isEmpty(){return 0===this.peerMap.size}size(){return this.peerMap.size}clear(){this.peerMap.clear()}getPeers(){return[...this.peerMap.values()]}getPeerValues(){return this.peerMap.values()}hasPeer(e){return this.peerMap.has(e)}addPeer(e,t){this.peerMap.set(e,t)}getPeerIds(){return[...this.peerMap.keys()]}removePeer(e){this.peerMap.delete(e)}getPeersOrderByWeight(){const e=this.getAvailablePeers();return e.sort(((e,t)=>0===t.weight?1:0===e.weight?-1:t.weight-e.weight)),e}getPeer(e){return this.peerMap.get(e)}getAvailablePeers(){return this.getPeers().filter((e=>e.isAvailableUrgently))}},ut=1,gt=2,ft=3,pt=4;class mt{constructor(e){this.generator=e,this.status=ut,this.next=this.next.bind(this)}next(e){if(this.status===pt)return console.warn("status is canceled");if(this.status===gt)return console.warn("status is waiting");const t=this.execute.bind(this,this.cb);this.nextInfo=this.generator(t),this.status=gt,this.nextInfo.execute(e)}execute(e,t){this.status=ft,e.apply(t,[this.next])}cancel(){this.status=pt,this.nextInfo&&"function"==typeof this.nextInfo.cancel&&this.nextInfo.cancel()}start(e,t){if("function"!=typeof e)throw new SyntaxError("param cb must be a function");this.cb=e,this.next(t)}continue(e){this.status=ut,this.next(e)}}const _t=Symbol("shareOnly");class yt extends(n()){constructor(e,t){super(),this.engine=e,this.config=t,this.logger=e.logger,this.bufMgr=null,this.peerManager=new dt,this._setupEngine&&this._setupEngine(),this.startCheckConnsTimer(),this.dcDownloadTimeout=t.dcDownloadTimeout,this[_t]=!1,this.downloadOnly=!1,this.loadedPeerNum=0}get isMobileNet(){return this.engine.isMobileNet}startCheckConnsTimer(){this.checkConnsTimer=setInterval((()=>{this.logger.info("start check conns");const e=this.getStatsForPeer();let t=this.peersNum;const s=u();this.getPeers().forEach((i=>{t>4&&(s-i.dataExchangeTs>120||s-i.gotStatsTs>=83)?(this.logger.warn(`close dead or different level peer ${i.remotePeerId} level ${i.currentLevel}`),i.close(!1),t--):i.connected&&i.sendMsgStats(t,e)}))}),4e4)}getStatsForPeer(){return{}}requestPeers(){this.logger.info("request peers from peer");const t={event:e.DC_GET_PEERS};for(let e of this.getPeers())e.mobileNet||e.super||e.sendJson(t)}chokePeerRequest(t){const s={event:e.DC_CHOKE};t?t.sendJson(s):this._broadcastToPeers(s)}unchokePeerRequest(t){const s={event:e.DC_UNCHOKE};t?t.sendJson(s):this._broadcastToPeers(s)}stopRequestFromPeers(){for(let e of this.getPeers())e.choked=!0}resumeRequestFromPeers(){for(let e of this.getPeers())e.choked=!1}setShareOnly(){this[_t]=!0}deletePeer(e){this.peerManager.hasPeer(e.remotePeerId)&&this.peerManager.removePeer(e.remotePeerId),this._peersStats(this.peerManager.getPeerIds())}getPeers(){return[...this.peerManager.getPeerValues()]}addPeer(e){const{logger:t}=this;this.peerManager.addPeer(e.remotePeerId,e),this[_t]&&(e.choked=!0);const s=this.peerManager.getPeerIds();this._peersStats(s),t.info(`add peer ${e.remotePeerId}, now has ${s.length} peers`),!e.mobileNet&&!this.waitForPeer&&e.isInitiator&&this.peersNum<=5&&e.peersConnected>1&&e.sendPeersRequest()}get hasPeers(){return this.peersNum>0}get peersNum(){return this.peerManager.size()}get hasIdlePeers(){const{logger:e}=this,t=this.getIdlePeer().length;if(e.info(`peers: ${this.peersNum} idle peers: ${t}`),t<this.peersNum){const t=this.peerManager.getPeers(),s=t.filter((e=>e.downloading));e.warn(`downloading: ${s.length} choked: ${t.filter((e=>e.choked)).length}`);for(let t of s)e.warn(`${t.remotePeerId} loading ${t.segId} packets ${t.bufArr.length} total ${t.pieceMsg.attachments}`)}return t>0}getIdlePeer(){return this.peerManager.getAvailablePeers()}set bufferManager(t){this.bufMgr=t,t.on(e.BM_LOST,(({sn:t,segId:s,next:i,level:r})=>{this.config.live||this._broadcastToPeers({event:e.DC_LOST,sn:t,seg_id:s,level:r||void 0}),this.onBufferManagerLost(t,s,i,r)})).on(e.BM_SEG_ADDED,(e=>{this.onBufferManagerSegAdded(e)}))}onBufferManagerSegAdded(e){}destroy(){const{logger:e}=this;this.peersNum>0&&this.peerManager.clear(),this.removeAllListeners(),clearInterval(this.checkConnsTimer),this.checkTimer&&this.checkTimer.cancel(),e.warn("destroy BtScheduler")}notifyPeersLoaded(e){}_setupDC(t){const{logger:s}=this;t.on(e.DC_PIECE_ACK,(e=>{e.size&&(this.engine.fetcher.reportUploaded(e.size),s.info(`uploaded ${e.seg_id} size ${e.size} to ${t.remotePeerId}, canceled ${e.canceled||!1}`))})).on(e.DC_PIECE_ABORT,(e=>{s.warn(`peer ${t.remotePeerId} download aborted, reason ${e.reason}`),t.downloading&&this._handlePieceAborted&&this._handlePieceAborted(t.remotePeerId),t.downloading=!1})).on(e.DC_REQUEST,(()=>{})).on(e.DC_SEND_REQUEST,(()=>{}))}_broadcastToPeers(e){for(let t of this.getPeers())t.sendJson(e)}_peersStats(e){this.engine.emit("peers",e);const t=this.engine.config.getPeersInfo;t&&"function"==typeof t&&t(e)}startCheckPeersTimer(e=3e3){this.checkTimer=new mt((function(e){let t;return{execute:function(s=1e3){t=setTimeout(e,s)},cancel:function(){clearTimeout(t)}}})),this.checkTimer.start((e=>{this.checkPeers();const t=1e3*(0===(s=this.loadedPeerNum)?3:.5*s+1.67);var s;this.logger.debug(`loaded peers ${this.loadedPeerNum} nextDelay ${t}`),this.loadedPeerNum=0,e(t)}),e)}}const St=yt;class vt extends(n()){constructor(e){super(),this.internalMap=new Map,this.eventName=e}has(e,t){return this.internalMap.has(this._generateId(e,t))}set(e,t,s){const i=this._generateId(e,t);this.internalMap.set(i,s),this.emit(`${this.eventName}${e}-${t}`,s)}get(e,t){return this.internalMap.get(this._generateId(e,t))}delete(e,t){const s=this._generateId(e,t),i=this.internalMap.get(s);return!!i&&(i.destroy(),this.internalMap.delete(s),!0)}clear(){this.internalMap.clear(),this.removeAllListeners()}_generateId(e,t){return"number"!=typeof t&&(t=Number(t)),`${t}-${e}`}}function Pt(e,t,s,i=0,r=0){const n=function(e,t,s,i=0,r=0){const n=l;let o=i,a=r||s-1;const h=Math.floor(s/n),c=s%n>0?h+1:h;e>=0&&(o+=(e+1)*n),t>=0&&t<c&&(a-=s%n+(c-t-1)*n);return{rangeStart:o,rangeEnd:a+1}}(e,t,s,i,r);return`bytes=${n.rangeStart}-${n.rangeEnd-1}`}function bt(e,t){return`${e}-${t}`}function wt(e,t,s,i){let r=s.split("?")[0];return r.startsWith("http")&&(r=r.split("://")[1]),i?`${r}|${i}`:`${r}`}const Et=0,Ct=1,It=2,Lt=3;class Tt extends(n()){constructor(e,s,i,r,n,o=!1,a){super(),this.coordinator=e,this.logger=s,this.rangeSupported=o,this.rangeStart=0,this.rangeEnd=0,this.httpLoadTime=2e3,this.proxied=!1,this.pieceMsg={event:t.DC_PIECE,sn:i,level:r,seg_id:n},a&&this.setExtra(a),this.forwardPeer=null,this.reversePeer=null,this.bufArr=[],this.forwardBufList=[],this.reverseBufList=[],this.forwardOffset=-1,this.reverseOffset=1e4,this.timeStart=0,this.timeReceivePiece=0,this.timer=void 0,this.destroyed=!1,this.forwardStreamListeners=[],this.reverseStreamListeners=[],this.rangeRequesting=!1,this.waitingRemain=!1,this.httpLoaded=0,this.p2pLoaded=0,this.deadline=0,this.p2pCanceled=!1}get segId(){return this.pieceMsg.seg_id}isDownloading(){return this.timeReceivePiece>0}isAlmostDeadline(){return!!this.rangeRequesting||this.deadline>0&&this.deadline-performance.now()<400}hasPeer(e){return!!e&&(e===this.forwardPeer||e===this.reversePeer)}streamListeners(){return[...this.reverseStreamListeners,...this.forwardStreamListeners].length}_notifyStreamListeners(e,t,s){const{sn:i,seg_id:r,attachments:n}=this.pieceMsg,o=e&&0===s||!e&&s===n-1,a=e?this.reverseStreamListeners:this.forwardStreamListeners;e?this.reverseBufList.push(t):this.forwardBufList.push(t),o&&(this.forwardBufList.push([...this.reverseBufList].reverse()),this.reverseBufList.push([...this.forwardBufList].reverse()));for(let e of a){const{handler:s}=e;s(i,r,!1,t,o)}o&&(a.length=0)}_notifyStreamListenersAbort(){const e=[...this.reverseStreamListeners,...this.forwardStreamListeners];for(let t of e){const{handler:e}=t;e(void 0,void 0,!0,"aborted by synthesizer")}e.length=0}_notifyStreamListenersRemain(){if(this.forwardStreamListeners.length>0){for(let e=this.forwardOffset+1;e<this.bufArr.length;e++)this._notifyStreamListeners(!1,this.bufArr[e],e);this.forwardStreamListeners=[]}if(this.reverseStreamListeners.length>0){for(let e=this.reverseOffset-1;e>=0;e--)this._notifyStreamListeners(!0,this.bufArr[e],e);this.reverseStreamListeners=[]}}addStreamListener(e,t,s){(e?this.reverseStreamListeners:this.forwardStreamListeners).push({handler:s,peerId:t})}removeStreamListener(e){const t=t=>t.filter((t=>t.peerId!==e||(t.handler(void 0,void 0,!0,"aborted by cancel"),!1)));this.forwardStreamListeners=t(this.forwardStreamListeners),this.reverseStreamListeners=t(this.reverseStreamListeners)}setTimeout(e=0){const t=this.streamListeners();let s=performance.now();if(t>2){if((e/=2)<2500)if(this.timeReceivePiece>0){e=3e3-(s-this.timeReceivePiece)}else e=2500;this.logger.info(`stream listeners ${t}, set timeout ${e}`)}e<=0?setTimeout((()=>{this._handleTimeout(!1,!1)}),0):(this.deadline=s+e,this._startTimer(e))}setExtra(e={}){e.url&&(this.url=e.url),e.rangeStart&&(this.rangeStart=e.rangeStart),e.rangeEnd&&(this.rangeEnd=e.rangeEnd),e.httpLoadTime&&(this.httpLoadTime=e.httpLoadTime),e.proxied&&(this.proxied=!0),e.xhrSetup&&(this.xhrSetup=e.xhrSetup),e.headers&&(this.headers=e.headers),e.segId&&!this.pieceMsg.seg_id&&(this.pieceMsg.seg_id=e.segId)}hasForwardPeer(){return!!this.forwardPeer}hasReversePeer(){return!!this.reversePeer}hasPeerId(e){return this.forwardPeer&&this.forwardPeer.remotePeerId===e||this.reversePeer&&this.reversePeer.remotePeerId===e}isEmpty(){return null===this.forwardPeer&&null===this.reversePeer}isFull(){return this.forwardPeer&&this.reversePeer}setForwardPeer(e){this.forwardPeer=e,this.reversePeer&&this._print(),this._setupPeer(e,!1)}setReversePeer(e){this.reversePeer=e,this.forwardPeer&&this._print(),this._setupPeer(e,!0)}deletePeer(e,t=!1){const s=e===this.reversePeer;this._detachPeer(e),s?(this.reversePeer=null,t&&(this.reverseOffset=this.pieceMsg.attachments||1e4)):(this.forwardPeer=null,t&&(this.forwardOffset=-1)),this.isEmpty()&&this._handleTimeout(!1,!1)}terminate(){this._handleTimeout(!1,!1)}hasPartialBuffer(){return this.hasForwardBuffer()||this.hasReverseBuffer()}hasForwardBuffer(){return this.forwardOffset>=0}hasReverseBuffer(){return this.pieceMsg&&this.reverseOffset<this.pieceMsg.attachments}_cancelP2p(){if(this.p2pCanceled)return;this.p2pCanceled=!0;const{seg_id:e,sn:t,level:s}=this.pieceMsg;[this.forwardPeer,this.reversePeer].filter((e=>!!e)).forEach((i=>{i.cancelDownload(t,s,e)}))}destroy(){this.logger.info("destroy syn"),clearTimeout(this.timer),this._notifyStreamListenersAbort(),this._cancelP2p(),this.removeAllListeners(),this.destroyed=!0,this._detachPeer(this.forwardPeer),this.forwardPeer=null,this.forwardOffset=-1,this._detachPeer(this.reversePeer),this.reversePeer=null,this.reverseOffset=1e4,this.bufArr=[],this.forwardStreamListeners=[],this.reverseStreamListeners=[]}_detachPeer(e){if(!e)return;const s=e===this.reversePeer?this.reverseEvents:this.forwardEvents;s&&e.off(t.DC_PIECE_DATA,s.onPieceData).off(t.DC_PIECE,s.onPiece).off(t.DC_PIECE_NOT_FOUND,s.onPieceNotFound).off(t.DC_PIECE_ABORT,s.onPieceAbort)}_receivePacket(e,s,i,r=!0){const{seg_id:n,sn:a,level:h,size:l}=this.pieceMsg,c=s-1;if(this.bufArr[c])return this.logger.warn(`syn bufArr ${this.pieceMsg.sn} already has ${c} size ${i.byteLength}`),!1;if(r?this.p2pLoaded+=i.byteLength:this.httpLoaded+=i.byteLength,this.bufArr[c]=i,e?this.reverseOffset=c:this.forwardOffset=c,this._notifyStreamListeners(e,i,c),this.forwardOffset!==this.reverseOffset-1)return!0;this.forwardPeer&&(this.forwardPeer.miss=0),this.reversePeer&&(this.reversePeer.miss=0),clearTimeout(this.timer),this._notifyStreamListenersRemain();const d=l/(performance.now()-this.timeStart);let u=o.l.concat(this.bufArr);const g=u.byteLength;if(g===l){let e=u.buffer;const s=new R(a,n,e,this.getFromPeerId(),h);this.emit(t.SYN_OUTPUT,s,{speed:d,p2p:this.p2pLoaded,http:this.httpLoaded})}else{this.logger.error(`${h}-${a} expectedSize ${l} != byteLength ${g} forward ${this.forwardOffset} reverse ${this.reverseOffset}`);for(let e=0;e<this.bufArr.length;e++)this.logger.error(`piece ${e} size ${this.bufArr[e].byteLength}`);this.emit(t.SYN_ERROR,this.pieceMsg,Et)}}_setupPeer(e,s){0===this.timeStart&&(this.timeStart=performance.now());const i=(t,s,i,r,n,o)=>{if(this.destroyed)return;if(!this._validateMsg(t,o.level,s))return void this.logger.warn(`onPieceData ${o.level}-${t} not match ${JSON.stringify(this.pieceMsg)} from ${e.remotePeerId}`);const{reverse:a}=o;this._receivePacket(a,r,i)&&!this.waitingRemain&&!this.rangeRequesting&&this.deadline>0&&this._shouldSwitch()&&(this.logger.warn("should switch to http"),clearTimeout(this.timer),this._handleTimeout(!1,!1))},r=s=>{if(this.destroyed)return;const{attachments:i,size:r,sn:n,level:o,seg_id:a}=s;return r&&this._validateMsg(n,o,a)?this.pieceMsg.size&&r!==this.pieceMsg.size?(this.logger.warn(`onPiece ${s.level}-${s.sn} size not match`),void this.emit(t.SYN_ERROR,this.pieceMsg,Et)):void(0===this.bufArr.length&&(this.pieceMsg={...this.pieceMsg,seg_id:a,size:r,attachments:i},this.reverseOffset=i,this.bufArr=new Array(i),this.timeReceivePiece=performance.now())):(this.logger.warn(`onPiece ${JSON.stringify(s)} not match ${JSON.stringify(this.pieceMsg)}`),void this.deletePeer(e))},n=t=>{this.destroyed||this.deletePeer(e)},o=()=>{this.destroyed||this.deletePeer(e)},a={onPieceData:i,onPiece:r,onPieceNotFound:n,onPieceAbort:o};s?this.reverseEvents=a:this.forwardEvents=a,e.on(t.DC_PIECE_DATA,i).once(t.DC_PIECE,r).once(t.DC_PIECE_NOT_FOUND,n).once(t.DC_PIECE_ABORT,o)}_validateMsg(e,t,s){return(!this.pieceMsg.seg_id||s===this.pieceMsg.seg_id)&&(e===this.pieceMsg.sn&&t===this.pieceMsg.level)}_shouldSwitch(){const e=this.pieceMsg.size-64e3*this.loadedPackets();return this.coordinator.shouldSwitchToHttp(e,this.deadline,this.p2pSpeed,64e3,this.httpLoadTime)}_startTimer(e,t=!0){this.timer=setTimeout(this._handleTimeout.bind(this,t),e)}loadedPackets(){return this.pieceMsg.attachments-(this.reverseOffset-this.forwardOffset-1)}_handleTimeout(e=!1,s=!0){if(this.destroyed)return;const{level:i,sn:r,size:n,attachments:o}=this.pieceMsg;if(!n||0===this.timeReceivePiece)return this.logger.warn(`syn load timeout ${i}-${r} url ${this.url}`),void this.emit(t.SYN_ERROR,this.pieceMsg,Et);if(e&&this.timeReceivePiece>0&&(this.logger.warn(`syn ${this.loadedPackets()} of ${o} packets loaded`),this.shouldWaitForRemain(this.httpLoadTime))){const e=this.httpLoadTime;return this.waitingRemain=!0,this.logger.info(`syn wait for remain ${e}`),void this._startTimer(e,!1)}if(s){const e=[this.forwardPeer,this.reversePeer].filter((e=>!!e)).sort(((e,t)=>e.currentLoadSpeed()-t.currentLoadSpeed())).shift();e&&e.loadtimeout()}if(this._cancelP2p(),this.rangeSupported&&this.url)return this._loadRemainBufferByHttp();this._notifyStreamListenersAbort(),this.emit(t.SYN_ERROR,this.pieceMsg,Lt)}shouldWaitForRemain(e){if(e<=0||this.isEmpty()||this.streamListeners()>0)return!1;const t=performance.now()-this.timeStart;return t<500||t<1e3&&this.timeReceivePiece>0&&e>3e3||this.shouldWaitForRemainUrgent(e)}shouldWaitForRemainUrgent(e){if(0===this.timeReceivePiece||e<=0)return!1;const t=this.p2pSpeed;let s=0;[this.forwardPeer,this.reversePeer].forEach((e=>{e&&(s+=e.loadedBytes())}));const i=(this.pieceMsg.size-s)/e;return this.logger.info(`syn remainTime ${e} speed ${t} required ${i}`),t>=i}get p2pSpeed(){let e=0;return[this.forwardPeer,this.reversePeer].forEach((t=>{t&&(e+=t.currentLoadSpeed())})),e}getFromPeerId(){const{forwardPeer:e,reversePeer:t}=this;return this.isFull()&&e!==t?`${e.remotePeerId}:${t.remotePeerId}`:e?`${e.remotePeerId}`:t?`${t.remotePeerId}`:""}_loadRemainBufferByHttp(){if(this.rangeRequesting)return;const{size:e,sn:s,level:i}=this.pieceMsg,r=this.rangeEnd>0?this.rangeEnd-1:0;let n=this.forwardOffset;const a=Pt(n,this.reverseOffset,e,this.rangeStart,r),h=performance.now();let l=this.deadline+this.httpLoadTime-h+1e3;l<2e3?l=2e3:l>6e3&&(l=6e3),this.logger.info(`continue download ${i}-${s} from ${this.url} range: ${a} timeout ${l}`),this.rangeRequesting=!0,this.headers&&(this.xhrSetup=e=>{for(const t of Object.keys(this.headers))e.setRequestHeader(t,this.headers[t])}),f(this.url,a,this.xhrSetup,l,this.proxied).then((e=>{if(this.destroyed)return;if(this.rangeRequesting=!1,!e)return void this.emit(t.SYN_ERROR,this.pieceMsg,Ct);let i=o.l.from(e);const r=i.byteLength/(performance.now()-h);this.coordinator.addHttpSpeed(r),i.byteLength===this.pieceMsg.size&&(this.logger.warn(`syn range request ${s} resp whole ts`),n=-1);const a=y(i,0);let l=n+1;for(let e=0;e<a.length;e++)this.bufArr[l]||this._receivePacket(!1,l+1,a[e],!1),l++})).catch((e=>{if(this.destroyed)return;this.rangeRequesting=!1,this.logger.error(`http partial download ${s} error ${e}`);const i="timeout"===e?It:Ct;this.emit(t.SYN_ERROR,this.pieceMsg,i)}))}_print(){const{level:e,sn:t}=this.pieceMsg;this.logger.info(`syn parallel loading ${e}-${t}`)}}class Rt{constructor(){this.meanHttpSpeed=0}addHttpSpeed(e){this.meanHttpSpeed=.4*this.meanHttpSpeed+.6*e}shouldSwitchToHttp(e,t,s,i,r){if(this.meanHttpSpeed<=0)return!1;if(s>=this.meanHttpSpeed)return!1;if(this.meanHttpSpeed*r>=e)return!1;return((r+t-performance.now())*this.meanHttpSpeed-e)/(this.meanHttpSpeed-s)*s<i}}class At extends St{constructor(e,s){super(e,s),this.bitset=new lt(s.live||!1),this.bitCounts=new ct,this.requestingMap=new vt(t.REQUESTING_MAP_HAVE),this.segmentBuilderMap=new vt(t.BUILDER_MAP_HAVE),this.allowP2pLimit=s.httpLoadTime+1.5,this.playlistInfo=new Map,this.isUploader=!1,this.isReceiver=!1,this.targetPeers={},this.mBufferedDuration=0,this.sequential=!0,this.httpTimeouts=0,this.httpRangeErrs=0,this.coordinator=new Rt,this.loadingSegId="",this.loadingSN=0,this.currPlaySN=0,this.currLostSN=-1,this.nextLostSN=-1,this.config.live?this.maxPrefetchCount=10:(this.maxPrefetchCount=150,this.startCheckPeersTimer())}get httpRangeSupported(){return this.config.httpRangeSupported}handshakePeer(e){this._setupDC(e),e.sendMetaData(this.bitset.allArray(),!0,this.peersNum,this.isMobileNet)}_receiveDCHave(e,s,i,r){this.bitset.has(e,s)||this.bitCounts.incre(e,s),r.isAvailableUrgently&&this.emit(t.SCH_DCHAVE,i)}_setupDC(e){super._setupDC(e),e.on(t.DC_HAVE,(t=>{if(e.bitset&&t.sn>=0){const{sn:s,level:i,complete:r,seg_id:n}=t,o=r?nt:ot;e.bitset.add(s,i,n,o),this._receiveDCHave(s,i,n,e),e.isAvailableUrgently&&this._handleDCHave(e,s,i,n,o)}})).on(t.DC_HAVE_REVERSE,(t=>{if(e.bitset&&t.sn>=0){const{sn:s,level:i,seg_id:r}=t;e.bitset.hasCompleteOr(s,i,at)||e.bitset.add(s,i,r,at),this._receiveDCHave(s,i,r,e),e.isAvailableUrgently&&this._handleDCHave(e,s,i,r,at)}})).on(t.DC_LOST,(t=>{if(!e.bitset)return;const{sn:s,level:i}=t;e.bitset.has(s,i)&&(e.bitset.delete(s,i),this.bitCounts.decre(s,i))})).on(t.DC_PIECE,(e=>{e.ext&&e.ext.incompletes>=7||this.notifyAllPeers(e.sn,e.level,e.seg_id,e.reverse?at:ot)})).on(t.DC_PIECE_CANCEL,(t=>{const{sn:s,level:i}=t,r=this.requestingMap.get(s,i);if(r)return void r.removeStreamListener(e.remotePeerId);const n=this.segmentBuilderMap.get(s,i);n&&n.removeStreamListener(e.remotePeerId)})).on(t.DC_PIECE_NOT_FOUND,(t=>{const{sn:s,level:i}=t;e.bitset.delete(s,i),this.bitCounts.decre(s,i),e.checkIfNeedChoke(!0)})).on(t.DC_REQUEST,(async s=>{const{logger:i}=this,{sn:r,level:n,reverse:o}=s;this.isUploader=!0;let a=s.seg_id;a||(a=await this.bufMgr.getSegIdBySN(r));const h=this.requestingMap.get(r,n);let l=!1;h&&h.isDownloading()&&(l=!0);const c=await this.bufMgr.getSegById(a);if(c)i.info("found seg from bufMgr"),c.level===n?e.sendBuffer(c.sn,c.segId,c.data,{from:"Cache",level:c.level,reverse:o}):e.sendPieceNotFound(r,a,{level:n});else if(l){i.info(`syn had ${h.loadedPackets()} packets, wait remain from upstream ${h.getFromPeerId()}`);const t={...h.pieceMsg,reverse:o},s=o?h.reverseBufList:h.forwardBufList;e.sendPartialBuffer(t,s,{from:h.isFull()?"WaitPartialDouble":"WaitPartialSingle",incompletes:1}),s.length<t.attachments?u(h,e,o):e.uploading=!1}else if(o)e.sendPieceNotFound(r,a,{level:n});else{const s=this.segmentBuilderMap.get(r,n);if(s)i.info(`peer request ${r} wait from builder, sent ${s.bufferList.length}`),d(s,e);else if(r>=this.loadingSN){let s;const h=h=>{this.segmentBuilderMap.off(`${t.BUILDER_MAP_HAVE}${r}-${n}`,s),h&&h.level===n?(i.info(`peer request notify seg ${h.sn}`),e.sendBuffer(h.sn,h.segId,h.data,{from:"NotifySegment",level:h.level,reverse:o})):e.sendPieceNotFound(r,a,{level:n})};s=s=>{this.bufMgr.off(`${t.BM_ADDED_SN_}${r}`,h),d(s,e)},i.info(`peer request ${r} wait from fragLoader`),this.segmentBuilderMap.once(`${t.BUILDER_MAP_HAVE}${r}-${n}`,s),this.bufMgr.once(`${t.BM_ADDED_SN_}${r}`,h)}else e.sendPieceNotFound(r,a,{level:n})}function d(e,t){t.sendPartialBuffer(e.pieceMsg,e.bufferList,{from:e.source,incompletes:1}),e.bufferList.length<e.pieceMsg.attachments?u(e,t,!1):t.uploading=!1}function u(e,t,s){e.addStreamListener(s,t.remotePeerId,((e,s,i,r,n)=>{i?t.sendMsgPieceAbort(r):t.send(r),n&&(t.uploading=!1)}))}}))}handleMetaData(e,t){if(t.field){e.bitset=new lt(this.config.live,t.field);for(let e in t.field){const s=Number(e);if(s<0)continue;t.field[s].forEach((e=>{this.bitset.has(e,s)||this.bitCounts.incre(e,s)}))}this.addPeer(e),this.downloadOnly&&this.chokePeerRequest(e)}}peersHas(e,t){return this.bitCounts.has(e,t)}deletePeer(e){if(this.peerManager.hasPeer(e.remotePeerId)&&e.bitset){const t=e.bitset.allArray();for(let e in t){const s=Number(e),i=t[s];i&&i.forEach((e=>{this.bitCounts.decre(e,s)}))}}this.cleanRequestingMap(e.remotePeerId),super.deletePeer(e)}hasAndSetTargetPeer(e,t,s,i){const{logger:r,config:n}=this;this.waitForPeer&&(this.mBufferedDuration=i=n.waitForPeerTimeout+n.httpLoadTime);let o=1e3*(i-n.httpLoadTime);const a=n.httpLoadTime+1.5;if(r.info(`bufferedDuration ${1e3*i} remainLoadTime ${o}`),i<=a)return!1;if(this.requestingMap.has(e,t)){const h=this.requestingMap.get(e,t);if(!h)return this._searchAvailablePeers(e,t,s);const l=h.segId;if(l&&l!==s)return r.warn(`syn segId ${l} not match ${s}`),this.requestingMap.delete(e,t),this._searchAvailablePeers(e,t,s);if(!h.shouldWaitForRemain(o)){if(r.warn(`syn prefetch timeout at ${e}`),h.isFull())return!1;const o=this.peerManager.getPeersOrderByWeight(),l=ht(o,nt,e,t,s);let c=ht(o,ot,e,t,s),d=ht(o,at,e,t,s);if(h.hasReversePeer()){if(c=l.concat(c),c.length>0)return this.targetPeers.forwardPeer=c[0],!0}else if(h.hasForwardPeer()){if(d=l.concat(d),d.length>0)return this.targetPeers.reversePeer=d[0],!0}else{if(l.length>0)return h.hasForwardBuffer()?this.targetPeers.reversePeer=l[0]:this.targetPeers.forwardPeer=l[0],!0;{let e=!1;if(c.length>0&&(this.targetPeers.forwardPeer=c[0],e=!0),d.length>0&&(this.targetPeers.reversePeer=d[0],e=!0),e)return!0}}return!h.isEmpty()&&n.httpRangeSupported&&i>a+1}return r.info(`prefetch ${e} wait for remain`),!0}return this._searchAvailablePeers(e,t,s)}_searchAvailablePeers(e,t,s){if(!this.hasIdlePeers||!this.peersHas(e,t))return!1;const i=this.peerManager.getPeersOrderByWeight(),[r,n]=((e,t,s,i)=>{const r=ht(e,nt,t,s,i);if(r.length>=2)return[r[0],r[1]];if(1===r.length){const n=ht(e,ot,t,s,i);if(n.length>=1)return[n[0],r[0]];const o=ht(e,at,t,s,i);return o.length>=1?[r[0],o[0]]:0===g(0,1)?[null,r[0]]:[r[0],null]}const n=ht(e,ot,t,s,i);if(n.length>=1)return[n[0],null];const o=ht(e,at,t,s,i);return o.length>=1?[null,o[0]]:[null,null]})(i,e,t,s);return this.targetPeers={forwardPeer:r,reversePeer:n},[r,n].some((e=>!!e))}reportTraffic(e,t,s){const{fetcher:i}=this.engine;i&&(e>0&&i.reportFlow(e),t>0&&i.reportDCTraffic(t,s))}notifyAllPeers(e,t,s,i=nt){if(!s)return void this.logger.error("segId is required");if(this.downloadOnly)return;const{live:r}=this.config;if(this.bitset.has(e,t,i))return;const n=((e,t,s)=>`${e}-${t}-${s}`)(e,t,i);let o;i!==at&&(o=i===nt);const a=this.requestingMap.get(e,t);for(let h of this.getPeers())a&&a.hasPeer(h)||h.notifySet.has(n)||h.bitset.hasCompleteOr(e,t,i)||h.uploading||(h.sendMsgHave(e,s,{level:t,reverse:i===at,complete:o}),h.notifySet.add(n),r&&S(h.notifySet,20))}checkPeers(){if(!this.hasPeers)return;const{logger:e,config:t,engine:s}=this,i=t.live,{currentLevel:r}=s;if(e.info(`currentLevel ${r}`),0===this.bitCounts.size(r))return;if(!i&&this.nextLostSN>=0&&this.nextLostSN>=this.currPlaySN-10)return;if(this.mBufferedDuration<this.allowP2pLimit&&(0!==this.mBufferedDuration||this.isHlsjs))return void e.info(`low buffer time ${this.mBufferedDuration}, skip prefetch`);const n=this.peerManager.getPeersOrderByWeight();if(0===n.length)return;const o=[];let{prefetchNum:a,endSN:h,startSN:l}=t;i&&(a=1);let c=0,d=this.loadingSN+1;if(!i)if(this.loadingSN>=h&&!this.bufMgr.overflowed)d=l;else{const e=Math.min(...n.filter((e=>e.endSN>=d)).map((e=>e?e.startSN:1/0)));if(!isFinite(e))return;d<e&&(d=e)}for(;o.length<a&&o.length<n.length&&c<this.maxPrefetchCount;){if(!i&&d>h)return;if(i&&d>this.loadingSN+2)return;if(this.bitset.has(d,r))d++;else{if(d!==this.loadingSN&&this.bitCounts.has(d,r)&&!this.requestingMap.has(d,r))for(let s of n)if(!o.includes(s)&&s.bitset.has(d,r)){const i=s.bitset.getState(d,r);let n;n=i===nt?0===g(0,1):i===at,o.push(s);const a=s.bitset.getSegId(d,r),h=new Tt(this.coordinator,this.logger,d,r,a,t.httpRangeSupported);this._setupSynthesizer(h),n?h.setReversePeer(s):h.setForwardPeer(s),this.requestingMap.set(d,r,h),s.requestDataBySN(d,!1,{level:r,reverse:n}),e.info(`request prefetch ${d} level ${r} from peer ${s.remotePeerId} downloadNum ${s.downloadNum} reverse ${n}`);break}c++,d++}}this.loadedPeerNum=o.length}onBufferManagerLost(e,t,s,i){this.currLostSN=e,s&&(this.nextLostSN=s),this.bitset.delete(e,i),this.bitCounts.delete(e,i)}cleanRequestingMap(e){const t=this.peerManager.getPeer(e);if(t)for(let[s,i]of this.requestingMap.internalMap){const r=s.split("-"),n=Number(r[1]),o=Number(r[0]);i.hasPeerId(e)&&(this.logger.info(`delete ${e} in synthesizer`),i.deletePeer(t),this.bitCounts.decre(n,o),t.bitset.delete(n,o))}}shouldWaitForNextSeg(){let e;return e=!this.isUploader&&(!!this.isReceiver||g(0,100)>20),this.isReceiver=this.isUploader=!1,e}updateLoaded(e,t,s){this.bitset.hasCompleteOr(e,t)||(this.bitset.add(e,t,s,nt),this.bitCounts.delete(e,t))}broadcastPlaylist(e,t){if(!this.config.live)return;const s=function(e){const t=e.split("\n");let s=0,i=0;for(let e of t){const t=/^#EXT-X-MEDIA-SEQUENCE:?(\-?[0-9.]*)?/.exec(e);if(t&&t[1]){s=parseInt(t[1],10);break}}for(let e of t)e.startsWith("#EXTINF")&&i++;return s+i-1}(t);if(!this.isMobileNet)for(let i of this.getPeers())i.sendMsgPlaylist(e,t,s);this.playlistInfo.set(e,{seq:s,data:t})}getPlaylistFromPeer(e){if(!this.config.live)return null;const{seq:t,data:s}=this.playlistInfo.get(e);for(let s of this.getPeers()){const i=s.getLatestPlaylist(e,t);if(i)return this.playlistInfo.set(e,i),i}return null}getBufferedDuration(){let{media:e,currentSrc:t}=this.engine;if(!e||e.src!==t&&0===e.currentTime){if(this.logger.info("try get video element"),e=function(e,t){let s;if(e&&("string"==typeof e?s=document.querySelector(e):e instanceof HTMLMediaElement&&(s=e)),!s){const e=[...document.getElementsByTagName("video"),...document.getElementsByTagName("audio")];1===e.length?s=e[0]:(t&&(s=e.find((e=>e.src===t))),s||(s=e.find((e=>e.currentTime>0))))}return s}(this.config.mediaElem,t),!e)return 5;this.engine.media=e}let s=0,i=e.currentTime,r=e.buffered;for(let e=r.length-1;e>=0;e--)if(i>=r.start(e)&&i<=r.end(e)){s=r.end(e)-i;break}return this.mBufferedDuration=s,s>0?s:0}destroy(){super.destroy(),this.requestingMap.clear(),this.segmentBuilderMap.clear()}_handleSynOutput(e){e>0?this.httpTimeouts++:this.httpTimeouts>0&&this.httpTimeouts--}_notifySynthesizer(e,t,s,i,r,n=!0){const{logger:o}=this,a=this.requestingMap.get(s,i);if(!a)return;const h=a.segId;function l(r,n){n?e.requestDataById(t,s,!0,{level:i,reverse:r}):(o.info(`notify syn prefetch ${s}`),e.requestDataBySN(s,!1,{level:i,reverse:r}))}function c(){return r===ot||r===nt}function d(){return r===at||r===nt}t&&h&&t!==h?o.warn(`notifySynthesizer segId ${t} not match ${h}`):a.isFull()||(a.isAlmostDeadline()?o.info("almost deadline, ignored"):a.isEmpty()?a.hasForwardBuffer()&&d()?(a.setReversePeer(e),l(!0,n)):a.hasReverseBuffer()&&c()&&(a.setForwardPeer(e),l(!1,n)):!a.hasForwardPeer()&&c()?(a.setForwardPeer(e),l(!1,n)):!a.hasReversePeer()&&d()&&(a.setReversePeer(e),l(!0,n)))}_setupEngine(){}getStatsForPeer(){const{currentLevel:e,media:t}=this.engine,s={level:e};if(t&&!this.config.live){const{currentTime:e}=t;s.pos=Math.round(e)}return s}_handleSynError(e){switch(e){case Ct:this.logger.warn("ERROR_SYN_RANGE_REQUEST"),this.httpRangeErrs++;break;case It:this.logger.warn("ERROR_SYN_HTTP_TIMEOUT"),this.httpTimeouts+=3}this.httpRangeErrs>=5&&(this.config.httpLoadTime<=4.5&&(this.config.httpLoadTime+=.5),this.httpRangeErrs=0)}}const Dt=class extends At{constructor(e,t){super(e,t),this.isHlsjs=!0,this.waitForPeer=t.waitForPeer||!1,this.waitForPeerTimeout=t.waitForPeerTimeout,this.waitingPeers=0,this.waitingSeg={}}startWaitPeerTimer(){this.waitForPeer&&(this.waitForPeerTimer=setTimeout((()=>{this.waitForPeer&&(this.waitForPeer=!1,this.emit(t.SCH_WAIT_PEER))}),1e3*(this.waitForPeerTimeout+0)))}updatePlaySN(e){this.currPlaySN=e}load(e,t,s){this.isReceiver=!0;const{logger:i,config:r}=this;this.context=e;const{rangeStart:n,rangeEnd:o,url:a}=e,h=e.frag,{segId:l,sn:c,level:d}=h;this.callbacks=s,this.stats=Ye(),this.criticalSeg={sn:c,level:d,segId:l};let u=this.mBufferedDuration-r.httpLoadTime;u>this.dcDownloadTimeout&&(u=this.dcDownloadTimeout);const{forwardPeer:g,reversePeer:f}=this.targetPeers;g||f||(u-=1);let p=this.requestingMap.get(c,d);const m={rangeStart:Number(n),rangeEnd:Number(o),url:a,httpLoadTime:1e3*r.httpLoadTime-500,xhrSetup:r.xhrSetup,segId:l,headers:Object.keys(e.headers||{}).length>0?e.headers:void 0};p?p.setExtra(m):(p=new Tt(this.coordinator,this.logger,c,d,l,this.httpRangeSupported,m),this._setupSynthesizer(p),this.requestingMap.set(c,d,p)),g&&(p.setForwardPeer(g),g.requestDataById(l,c,!0,{level:d})),f&&(p.setReversePeer(f),f.requestDataById(l,c,!0,{level:d,reverse:!0})),p.isEmpty()&&(u=0),i.info(`syn setTimeout ${u}`),p.setTimeout(1e3*u),this.targetPeers={}}waitPeerNotifier(){return new Promise((e=>{this.waitForPeer||e(),setTimeout(e,1e3*this.waitForPeerTimeout),this.once(t.SCH_WAIT_PEER,e)}))}addPeer(e){if(super.addPeer(e),this.waitForPeer){const{level:s,sn:i}=this.waitingSeg,r=e.remotePeerId;e.bitset.has(i,s)?(this.logger.info(`found initial seg ${s}-${i} from peer ${r}`),this.emit(t.SCH_WAIT_PEER)):this.waitingPeers===this.peersNum&&this.emit(t.SCH_WAIT_PEER)}}notifyPeersLoaded(e){this.logger.info(`notifyPeersLoaded ${e}`),this.waitForPeer&&(0===e?(this.waitForPeer=!1,this.emit(t.SCH_WAIT_PEER)):this.waitingPeers=e)}destroy(){super.destroy(),this.logger.warn("destroy HlsjsScheduler"),clearTimeout(this.waitForPeerTimer)}_setupDC(e){super._setupDC(e)}_setupSynthesizer(e){const s=()=>{this.bitCounts.has(this.loadingSN,this.engine.currentLevel)&&this.emit(t.SCH_DCHAVE,this.loadingSegId),this.criticalSeg||this.checkPeers()};e.on(t.SYN_OUTPUT,((t,i)=>{const{config:r,logger:n}=this,{segId:o,sn:a,data:h,level:l}=t,{speed:c,http:d,p2p:u}=i;this._handleSynOutput(d);const g=this.criticalSeg&&this.criticalSeg.segId===o;if(r.validateSegment(o,new Uint8Array(h))){this.notifyAllPeers(a,l,o),this.bitset.has(a,l)||this.reportTraffic(d,u,c);const s=e.getFromPeerId();if(g){n.info(`receive criticalSeg seg_id ${o}`);let e=this.stats;e.tfirst=e.loading.first=Math.max(e.trequest,performance.now()),e.tload=e.loading.end=e.tfirst,e.loaded=e.total=h.byteLength,this.criticalSeg=null;const{frag:t}=this.context;t.fromPeerId=s,t.loadByP2P=!0,this.callbacks.onSuccess({data:h,url:this.context.url},e,this.context)}else this.bitset.has(a,l)||(this.bufMgr.putSeg(t),this.updateLoaded(a,l,o))}else n.error(`segment ${o} validate failed`),g&&this.callbacks.onTimeout(this.stats,this.context,null);this.requestingMap.delete(a,l),r.live&&s()})).on(t.SYN_ERROR,((t,i)=>{const{config:r,logger:n}=this,{sn:o,level:a}=t;n.warn(`SYN_ERROR loading ${o} code ${i}`),this.criticalSeg&&this.criticalSeg.sn===o&&(this.criticalSeg=null,this.callbacks.onTimeout(this.stats,this.context,null)),i===Lt&&e.hasPartialBuffer()?n.warn("syn abort with partial buffer"):(this.requestingMap.delete(o,a),this._handleSynError(i)),r.live&&s()}))}_setupEngine(){super._setupEngine(),this.engine.on(t.FRAG_LOADING,(({sn:e,segId:t,byHttp:s,level:i})=>{this.loadingSN=e,this.loadingSegId=t})).on(t.FRAG_LOADED,(({sn:e,segId:t,byP2p:s,level:i})=>{this.requestingMap.delete(e,i),this.updateLoaded(e,i,t)})).on(t.FRAG_CHANGED,(({sn:e})=>{this.updatePlaySN(e)}))}_handleDCHave(e,t,s,i,r){this._notifySynthesizer(e,i,t,s,r),this.config.live&&!this.criticalSeg&&E()((()=>{this.checkPeers()}))}};const Mt=class extends oe{static get name(){return"HlsjsP2pEngine"}constructor(e,t={}){if(super(t),!e)throw new TypeError("hlsjs instance is null");this.hlsjs=e,this.HLSEvents=e.constructor.Events;const s=e.constructor.version;this.config.isHlsV0=s&&"0"===s.split(".")[0],this.config.xhrSetup=e.config.xhrSetup,!0===this.config.httpStreamEnabled&&(e.config.streamEnabled=function(){if(self.fetch&&self.AbortController&&self.ReadableStream&&self.Request)try{return new self.ReadableStream({}),!0}catch(e){}return!1}());const{channelIdMaker:i,signalId:r,browserInfo:n}=this.setup();this.config.waitForPeer&&this.config.sourceUrl?(this.config.trickleICE=!0,this.config.httpRangeSupported=!0,this._startEngine(this.config.sourceUrl,this.config.live,n,i,r)):this.config.waitForPeer=!1;const o=(t,s)=>{if(!s)return;const{config:a}=this,h=s.details,l=h.live;this.config.waitForPeer?this.tracker&&this.tracker.scheduler.startWaitPeerTimer():this._startEngine(this.hlsjs.url,l,n,i,r,h),a.waitForPeer&&this.logger.info("waitForPeer mode"),e.off(this.HLSEvents.LEVEL_LOADED,o)};e.on(this.HLSEvents.LEVEL_LOADED,o);const a=(e,t)=>{if(!t)return;const{config:s}=this,{fragments:i}=t.details;s.httpLoadTime=this.determineHttpLoadTime(i)};0===this.config.httpLoadTime&&(this.config.live?e.on(this.HLSEvents.LEVEL_LOADED,a):this.config.httpLoadTime=2.5);const h=(t,s)=>{const{config:i}=this;s.audioTracks&&s.audioTracks.length>0&&(i.strictSegmentId||i.segmentId||(i.segmentId=wt)),i.segmentId||(this.config.segmentId=i.strictSegmentId?wt:bt);const r=s.levels.length;this.multiBitrate=r>1,e.off(this.HLSEvents.MANIFEST_PARSED,h)};e.on(this.HLSEvents.MANIFEST_PARSED,h),e.on(this.HLSEvents.DESTROYING,(()=>{e.off(this.HLSEvents.LEVEL_LOADED,a),this.destroy()}))}_startEngine(e,t,s,i,r,n={}){const{config:o}=this;o.live=this.hlsjs.config.live=t,this.browserInfo={...s,live:t,abr:this.multiBitrate||void 0,type:"hls"},this.channel=`${i(e)}|${r}[${N.VERSION}]`,this.setupElectron();const a=this.initLogger();a.info("use HlsjsP2pEngine"),this.logger=this.hlsjs.config.logger=a,a.info(`channel ${this.channel}`),t||(o.startSN=n.startSN,o.endSN=n.endSN,a.info(`startSN ${n.startSN} endSN ${n.endSN}`)),this.eventListened=!1,this._init(this.channel,this.browserInfo)}async _init(e,s){const{logger:i,config:r}=this;if(!this.p2pEnabled||"undefined"==typeof self)return;this.hlsjs.config.p2pEnabled=this.p2pEnabled,this.hlsjs.config.sharePlaylist=r.sharePlaylist;try{await this.initSegmentManager()}catch(e){return void i.warn(e)}this.media=this.hlsjs.media,this.media&&(this.currentSrc=this.media.src),s.live||(s.tag=this.getTagForVod(),this.media&&(s.pos=Math.round(this.media.currentTime)));let o=new Ae(this,r.token,encodeURIComponent(e),r.announce||"",s);this.fetcher=o;const a=new Dt(this,r);this.tracker=new Qe(this,o,a,r),this.hlsjs.config.bufMgr=this.bufMgr,a.bufferManager=this.bufMgr,this.hlsjs.config.segmentId=this.config.segmentId,this.hlsjs.config.fLoader=function(e,s,i,r,o){return class extends(n()){constructor(t){super(),this.logger=t.logger,this.isHlsV0=r,this.bufMgr=t.bufMgr,this.streamEnabled=t.streamEnabled,this.httpLoader=this.streamEnabled?new et(t):new t.loader(t),this.p2pEnabled=t.p2pEnabled,this.isLive=t.live,this.scheduler=e,this.fetcher=s,this.segmentId=t.segmentId,this.blockTypes=i,this.forbidden=s.forbidden,this.stats=this.httpLoader.stats||Ye(),this.enableWorker=t.enableWorker,this.segmentBypass="function"==typeof o?o:()=>!1}destroy(){this.httpLoader.destroy()}abort(){this.httpLoader.abort()}async load(e,s,i){const{logger:r,scheduler:n}=this,o=e.frag;this.isHlsV0||(o.stats=this.stats);let a=e.frag.segId;if(!a){let t;e.rangeEnd&&(t="bytes="+e.rangeStart+"-"+(e.rangeEnd-1)),a=e.frag.segId=this.segmentId(String(o.level),o.sn,o.url,t)}if(!o.url||Xe(o.url,this.blockTypes,o.type)||this.segmentBypass(o.url,o.tagList))return r.info(`HTTP load blockType ${o.url}`),e.frag.loadByHTTP=!0,this.httpLoader.load(e,s,i);if(this.forbidden)return;this.fetcher.increMediaRequests(),s.maxRetry=2;const h=n.getBufferedDuration(),l=await this.bufMgr.getSegById(a);if(this.p2pEnabled&&l){r.info(`bufMgr found seg sn ${o.sn} segId ${a} level ${o.level}`);let t=m(l.data).buffer,s={url:e.url,data:t};return Ke(this.stats,l.size),o.loaded=l.size,o.loadByP2P=!0,e.frag.fromPeerId=l.fromPeerId,void E()((()=>{!this.isHlsV0&&i.onProgress&&i.onProgress(this.stats,e,s.data),i.onSuccess(s,this.stats,e)}))}if(this.p2pEnabled&&n.hasAndSetTargetPeer(o.sn,o.level,o.segId,h))this.loadFragByP2p(e,s,i,a);else if(n.waitForPeer&&(r.warn("waitPeerNotifier start"),n.waitingSeg={sn:o.sn,level:o.level},await n.waitPeerNotifier(),r.warn("waitPeerNotifier end"),this.p2pEnabled&&n.hasAndSetTargetPeer(o.sn,o.level,o.segId,h)))this.loadFragByP2p(e,s,i,a);else if(r.info(`fragLoader load ${a} at ${o.sn} level ${o.level} buffered ${1e3*h}`),this.isLive&&n.hasPeers&&h>7&&n.shouldWaitForNextSeg()){let l=h-7;l>4.5&&(l=4.5);const c=r=>{r===a&&(n.off(t.SCH_DCHAVE,c),clearTimeout(this.waitTimer),n.hasAndSetTargetPeer(o.sn,o.level,o.segId,h)?this.loadFragByP2p(e,s,i,a):this.loadFragByHttp(e,s,i,a))};r.info(`wait peer have for ${l}s`),n.on(t.SCH_DCHAVE,c),this.waitTimer=setTimeout((()=>{this.loadFragByHttp(e,s,i,a),n.off(t.SCH_DCHAVE,c)}),1e3*l)}else{const t=n.requestingMap.get(o.sn,o.level);n.httpRangeSupported&&t&&t.segId===o.segId&&t.hasPartialBuffer()?(r.warn(`syn has partial buffer for ${o.segId}`),this.loadFragByP2p(e,s,i,a)):this.loadFragByHttp(e,s,i,a)}}loadFragByHttp(e,t,s,i){const{logger:r,scheduler:n}=this,{segmentBuilderMap:o}=n;n.isReceiver=!1;const a=e.frag,{sn:h,level:l}=a;if(this.streamEnabled){let e;n.isMobileNet||n.notifyAllPeers(h,l,i,ot),s.onUpdate=(t,s,i)=>{i?o.delete(h,l):e&&e.receiveBytes(t,s)},s.onBodyStart=t=>{!e&&t>0&&(e=new it(h,l,i,t),o.has(h,l)||o.set(h,l,e))}}const c=s.onSuccess;s.onSuccess=async(e,t,s)=>{if(!await this.bufMgr.hasSegOfId(i)){const t=m(e.data).buffer,s=new R(h,i,t,this.fetcher.peerId,l);this.bufMgr.putSeg(s)}o.delete(h,l),this.fetcher.reportFlow(t.total);let a=t.tload-t.trequest;r.info(`HTTP loaded ${i} time ${a}`),n.notifyAllPeers(h,l,i),c(e,t,s)};const d=s.onProgress;s.onProgress=(e,t,s)=>{a.loaded=e.total,d(e,t,s&&this.enableWorker?m(s).buffer:s)},e.frag.loadByHTTP=!0,this.httpLoader.load(e,t,s)}loadFragByP2p(e,t,s,i){const{logger:r}=this,n=e.frag;this.scheduler.load(e,t,s);const o=s.onSuccess,a=s.onTimeout;s.onTimeout=(e,h)=>{r.warn(`P2P timeout switched to HTTP load ${n.relurl} at ${n.sn}`),s.onSuccess=o,this.loadFragByHttp(h,t,s,i),s.onTimeout=a},s.onSuccess=async(e,t,a)=>{if(!await this.bufMgr.hasSegOfId(i)){const t=m(e.data).buffer,s=new R(n.sn,i,t,n.fromPeerId||this.fetcher.peerId,n.level);this.bufMgr.putSeg(s)}n.loadByP2P||this.fetcher.reportFlow(t.total),n.loaded=t.loaded,r.info(`${n.loadByP2P?"P2P":"HTTP"} loaded segment id ${i}`),!this.isHlsV0&&s.onProgress&&s.onProgress(t,a,e.data),o(e,t,a)}}}}(a,o,r.p2pBlackList,r.isHlsV0,r.segmentBypass),r.sharePlaylist&&(this.hlsjs.config.pLoader=function(e){return class extends(n()){constructor(t){super(),this.logger=t.logger,this.xhrLoader=new t.loader(t),this.p2pEnabled=t.p2pEnabled,this.scheduler=e,this.stats=this.xhrLoader.stats||Ye()}destroy(){this.xhrLoader.destroy()}abort(){this.xhrLoader.abort()}load(e,t,s){const{logger:i}=this,{url:r}=e,n=function(e){return e.split("?")[0]}(r),o=s.onSuccess;if(s.onSuccess=(e,t,s)=>{this.scheduler&&!s.loadedByPeer&&this.scheduler.broadcastPlaylist(n,e.data),o(e,t,s)},this.scheduler&&this.scheduler.playlistInfo.has(n)){const t=this.scheduler.getPlaylistFromPeer(n);if(t&&t.data){const{data:n,seq:o}=t;i.info(`got playlist from peer seq ${o}`),Ke(this.stats,n.length);let a={url:r,data:n};return e.loadedByPeer=!0,void E()((()=>{s.onSuccess(a,this.stats,e)}))}}this.xhrLoader.load(e,t,s)}}}(a)),this.trackerTried=!1,this.eventListened||(this.hlsjs.on(this.HLSEvents.FRAG_LOADING,this._onFragLoading.bind(this)),this.hlsjs.on(this.HLSEvents.FRAG_LOADED,this._onFragLoaded.bind(this)),this.hlsjs.on(this.HLSEvents.FRAG_CHANGED,this._onFragChanged.bind(this)),this.hlsjs.on(this.HLSEvents.ERROR,this._onHlsError.bind(this)),this.eventListened=!0),this.setupWindowListeners(),this.trackerTried||this.tracker.connected||!r.p2pEnabled||(this.tracker.resumeP2P(),this.trackerTried=!0)}_onFragLoading(e,s){const i=s.frag;let{sn:r,level:n,segId:o}=i;if(!Xe(i.url,this.config.p2pBlackList,i.type)){if(this.logger.debug("loading frag "+r),this.bufMgr&&(this.bufMgr.loadingSN=r),!o){let e;i._byteRange&&(e="bytes="+i._byteRange[0]+"-"+i._byteRange[1]);let t=i.url;o=i.segId=this.config.segmentId(String(n),i.sn,t,e)}this.emit(t.FRAG_LOADING,{sn:r,segId:o,byHttp:i.loadByHTTP,level:n})}}_onFragLoaded(e,s){const{frag:i}=s,{sn:r,segId:n,loaded:o,duration:a,level:h,fromPeerId:l,loadByP2P:c,url:d}=i,{config:u,logger:g}=this;Xe(i.url,u.p2pBlackList,i.type)||(this.emit(t.FRAG_LOADED,{url:d,sn:r,level:h,segId:n,loaded:o,duration:a,byP2p:!!c,fromPeerId:l}),!this.rangeTested&&u.useHttpRange&&(f(i.url,void 0,u.xhrSetup).then((()=>{u.httpRangeSupported=!0,g.info("http range is supported")})).catch((e=>{u.httpRangeSupported=!1,g.warn(`http range is not supported, ${e}`)})),this.rangeTested=!0))}_onFragChanged(e,s){const{frag:i}=s;if(!Xe(i.url,this.config.p2pBlackList,i.type)){this.logger.debug("frag changed: "+i.sn);const{sn:e,duration:s}=i;this.emit(t.FRAG_CHANGED,{sn:e,duration:s})}}_onHlsError(e,s){if(!s)return;const{logger:i}=this,r=`${s.type} details ${s.details} reason ${s.reason}`;s.fatal?i.error(r):i.warn(r);const n=this.hlsjs.constructor.ErrorDetails;switch(s.details){case n.BUFFER_STALLED_ERROR:this.fetcher&&this.fetcher.increRebuffers();break;case n.INTERNAL_EXCEPTION:"demuxerWorker"!==s.event&&(s.error||(s.error={}),this.fetcher&&s.err&&(this.fetcher.errsInternalExpt++,this.fetcher.exptMsg=`${s.error.message} event ${s.event} ua ${navigator.userAgent}`),i.error(`INTERNAL_EXCEPTION event ${s.event} err ${s.error.message}`),this.emit(t.EXCEPTION,ce()(s.error,"HLSJS_EXPT")))}}get currentLevel(){const{currentLevel:e}=this.hlsjs;return e>=0?e:0}disableP2P(){this.logger&&this.logger.warn("disable P2P"),this.p2pEnabled&&(this.p2pEnabled=!1,this.config.p2pEnabled=this.hlsjs.config.p2pEnabled=this.p2pEnabled,this.tracker&&(this.tracker.stopP2P(),this.tracker={},this.fetcher=null,this.bufMgr.destroy(),this.bufMgr=null,this.hlsjs.config.fLoader=this.hlsjs.config.pLoader=this.hlsjs.constructor.DefaultConfig.loader))}};const Nt=class extends oe{static get name(){return"ShadowP2pEngine"}constructor(){super(),console.warn("Using Shadow Engine")}disableP2P(){}isServiceWorkerSupported(){return!1}};class kt{static get Events(){return t}static get TrackerZone(){return j.TrackerZone}static isSupported(){return j.isSupported()&&(U()||Nt.isServiceWorkerSupported())}static isServiceWorkerSupported(){return Nt.isServiceWorkerSupported()}static isMSESupported(){return U()}static getBrowser(){return D().getBrowser()}static get ServiceWorkerEngine(){return Nt}static get HlsjsEngine(){return Mt}static async tryRegisterServiceWorker({swFile:e="./sw.js",swScope:t="./"}={}){return kt.registerServiceWorker({swFile:e,swScope:t})}static async registerServiceWorker({swFile:e="./sw.js",swScope:t="./",hlsjsInstance:s}={}){const{serviceWorker:i}=navigator;return!i||s?Promise.resolve():i.getRegistration().then((s=>{return s||Promise.race([i.register(e,{scope:t}).then((e=>function(e){return new Promise(((t,s)=>{const i=e.installing||e.waiting||e.active,r=()=>"activated"===i.state&&(i.removeEventListener("statechange",r),t(e),!0);r()||i.addEventListener("statechange",r)}))}(e))),(r=300,new Promise((e=>setTimeout(e,r))))]);var r})).catch((()=>{Promise.resolve()}))}constructor(e={}){const{hlsjsInstance:t}=e;delete e.hlsjsInstance,"1"!==d("_ios")&&!e.proxyOnly&&t&&U()?this._realEngine=new Mt(t,e):this._realEngine=new Nt(e)}get realEngine(){return this._realEngine}get engineName(){return this._realEngine.constructor.name}once(e,t){return this._realEngine.once(e,t)}on(e,t){return this._realEngine.on(e,t)}off(e,t){return this._realEngine.off(e,t)}removeListener(e,t){return this._realEngine.removeListener(e,t)}removeAllListeners(e){return this._realEngine.removeAllListeners(e)}set p2pEnabled(e){this._realEngine.p2pEnabled=e}get p2pEnabled(){return this._realEngine.p2pEnabled}enableP2P(){this._realEngine.enableP2P()}disableP2P(){this._realEngine.disableP2P()}destroy(){this._realEngine.destroy()}async registerServiceWorker(){return"function"==typeof this._realEngine.registerServiceWorker?this._realEngine.registerServiceWorker():Promise.reject("Not supported by this engine")}async unregisterServiceWorker(){return"function"==typeof this._realEngine.unregisterServiceWorker?this._realEngine.unregisterServiceWorker():Promise.reject("Not supported by this engine")}get version(){return j.version}}kt.version=j.version,kt.protocolVersion=N.VERSION,"undefined"!=typeof self&&(self.P2PEngineHls=kt);const Ot=kt})(),i=i.default})()));
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.P2pEngineHls=t():e.P2pEngineHls=t()}(this,(()=>(()=>{var e={204:e=>{"use strict";var t,s="object"==typeof Reflect?Reflect:null,i=s&&"function"==typeof s.apply?s.apply:function(e,t,s){return Function.prototype.apply.call(e,t,s)};t=s&&"function"==typeof s.ownKeys?s.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var r=Number.isNaN||function(e){return e!=e};function n(){n.init.call(this)}e.exports=n,e.exports.once=function(e,t){return new Promise((function(s,i){function r(s){e.removeListener(t,n),i(s)}function n(){"function"==typeof e.removeListener&&e.removeListener("error",r),s([].slice.call(arguments))}p(e,t,n,{once:!0}),"error"!==t&&function(e,t,s){"function"==typeof e.on&&p(e,"error",t,s)}(e,r,{once:!0})}))},n.EventEmitter=n,n.prototype._events=void 0,n.prototype._eventsCount=0,n.prototype._maxListeners=void 0;var o=10;function a(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function h(e){return void 0===e._maxListeners?n.defaultMaxListeners:e._maxListeners}function l(e,t,s,i){var r,n,o,l;if(a(s),void 0===(n=e._events)?(n=e._events=Object.create(null),e._eventsCount=0):(void 0!==n.newListener&&(e.emit("newListener",t,s.listener?s.listener:s),n=e._events),o=n[t]),void 0===o)o=n[t]=s,++e._eventsCount;else if("function"==typeof o?o=n[t]=i?[s,o]:[o,s]:i?o.unshift(s):o.push(s),(r=h(e))>0&&o.length>r&&!o.warned){o.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=o.length,l=c,console&&console.warn&&console.warn(l)}return e}function c(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function d(e,t,s){var i={fired:!1,wrapFn:void 0,target:e,type:t,listener:s},r=c.bind(i);return r.listener=s,i.wrapFn=r,r}function u(e,t,s){var i=e._events;if(void 0===i)return[];var r=i[t];return void 0===r?[]:"function"==typeof r?s?[r.listener||r]:[r]:s?function(e){for(var t=new Array(e.length),s=0;s<t.length;++s)t[s]=e[s].listener||e[s];return t}(r):f(r,r.length)}function g(e){var t=this._events;if(void 0!==t){var s=t[e];if("function"==typeof s)return 1;if(void 0!==s)return s.length}return 0}function f(e,t){for(var s=new Array(t),i=0;i<t;++i)s[i]=e[i];return s}function p(e,t,s,i){if("function"==typeof e.on)i.once?e.once(t,s):e.on(t,s);else{if("function"!=typeof e.addEventListener)throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof e);e.addEventListener(t,(function r(n){i.once&&e.removeEventListener(t,r),s(n)}))}}Object.defineProperty(n,"defaultMaxListeners",{enumerable:!0,get:function(){return o},set:function(e){if("number"!=typeof e||e<0||r(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");o=e}}),n.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},n.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||r(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this},n.prototype.getMaxListeners=function(){return h(this)},n.prototype.emit=function(e){for(var t=[],s=1;s<arguments.length;s++)t.push(arguments[s]);var r="error"===e,n=this._events;if(void 0!==n)r=r&&void 0===n.error;else if(!r)return!1;if(r){var o;if(t.length>0&&(o=t[0]),o instanceof Error)throw o;var a=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw a.context=o,a}var h=n[e];if(void 0===h)return!1;if("function"==typeof h)i(h,this,t);else{var l=h.length,c=f(h,l);for(s=0;s<l;++s)i(c[s],this,t)}return!0},n.prototype.addListener=function(e,t){return l(this,e,t,!1)},n.prototype.on=n.prototype.addListener,n.prototype.prependListener=function(e,t){return l(this,e,t,!0)},n.prototype.once=function(e,t){return a(t),this.on(e,d(this,e,t)),this},n.prototype.prependOnceListener=function(e,t){return a(t),this.prependListener(e,d(this,e,t)),this},n.prototype.removeListener=function(e,t){var s,i,r,n,o;if(a(t),void 0===(i=this._events))return this;if(void 0===(s=i[e]))return this;if(s===t||s.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete i[e],i.removeListener&&this.emit("removeListener",e,s.listener||t));else if("function"!=typeof s){for(r=-1,n=s.length-1;n>=0;n--)if(s[n]===t||s[n].listener===t){o=s[n].listener,r=n;break}if(r<0)return this;0===r?s.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(s,r),1===s.length&&(i[e]=s[0]),void 0!==i.removeListener&&this.emit("removeListener",e,o||t)}return this},n.prototype.off=n.prototype.removeListener,n.prototype.removeAllListeners=function(e){var t,s,i;if(void 0===(s=this._events))return this;if(void 0===s.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==s[e]&&(0==--this._eventsCount?this._events=Object.create(null):delete s[e]),this;if(0===arguments.length){var r,n=Object.keys(s);for(i=0;i<n.length;++i)"removeListener"!==(r=n[i])&&this.removeAllListeners(r);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if("function"==typeof(t=s[e]))this.removeListener(e,t);else if(void 0!==t)for(i=t.length-1;i>=0;i--)this.removeListener(e,t[i]);return this},n.prototype.listeners=function(e){return u(this,e,!0)},n.prototype.rawListeners=function(e){return u(this,e,!1)},n.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):g.call(e,t)},n.prototype.listenerCount=g,n.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}},622:function(e){!function(t){var s=/^(?=((?:[a-zA-Z0-9+\-.]+:)?))\1(?=((?:\/\/[^\/?#]*)?))\2(?=((?:(?:[^?#\/]*\/)*[^;?#\/]*)?))\3((?:;[^?#]*)?)(\?[^#]*)?(#[^]*)?$/,i=/^(?=([^\/?#]*))\1([^]*)$/,r=/(?:\/|^)\.(?=\/)/g,n=/(?:\/|^)\.\.\/(?!\.\.\/)[^\/]*(?=\/)/g,o={buildAbsoluteURL:function(e,t,s){if(s=s||{},e=e.trim(),!(t=t.trim())){if(!s.alwaysNormalize)return e;var r=o.parseURL(e);if(!r)throw new Error("Error trying to parse base URL.");return r.path=o.normalizePath(r.path),o.buildURLFromParts(r)}var n=o.parseURL(t);if(!n)throw new Error("Error trying to parse relative URL.");if(n.scheme)return s.alwaysNormalize?(n.path=o.normalizePath(n.path),o.buildURLFromParts(n)):t;var a=o.parseURL(e);if(!a)throw new Error("Error trying to parse base URL.");if(!a.netLoc&&a.path&&"/"!==a.path[0]){var h=i.exec(a.path);a.netLoc=h[1],a.path=h[2]}a.netLoc&&!a.path&&(a.path="/");var l={scheme:a.scheme,netLoc:n.netLoc,path:null,params:n.params,query:n.query,fragment:n.fragment};if(!n.netLoc&&(l.netLoc=a.netLoc,"/"!==n.path[0]))if(n.path){var c=a.path,d=c.substring(0,c.lastIndexOf("/")+1)+n.path;l.path=o.normalizePath(d)}else l.path=a.path,n.params||(l.params=a.params,n.query||(l.query=a.query));return null===l.path&&(l.path=s.alwaysNormalize?o.normalizePath(n.path):n.path),o.buildURLFromParts(l)},parseURL:function(e){var t=s.exec(e);return t?{scheme:t[1]||"",netLoc:t[2]||"",path:t[3]||"",params:t[4]||"",query:t[5]||"",fragment:t[6]||""}:null},normalizePath:function(e){for(e=e.split("").reverse().join("").replace(r,"");e.length!==(e=e.replace(n,"")).length;);return e.split("").reverse().join("")},buildURLFromParts:function(e){return e.scheme+e.netLoc+e.path+e.params+e.query+e.fragment}};e.exports=o}()},47:(e,t)=>{"use strict";t.l=r;var s=2147483647;function i(e){if(e>s)throw new RangeError('The value "'+e+'" is invalid for option "size"');var t=new Uint8Array(e);return t.__proto__=r.prototype,t}function r(e,t,s){if("number"==typeof e){if("string"==typeof t)throw new TypeError('The "string" argument must be of type string. Received type number');return a(e)}return n(e,t,s)}function n(e,t,s){if("string"==typeof e)return function(e,t){"string"==typeof t&&""!==t||(t="utf8");if(!r.isEncoding(t))throw new TypeError("Unknown encoding: "+t);var s=0|c(e,t),n=i(s),o=n.write(e,t);o!==s&&(n=n.slice(0,o));return n}(e,t);if(ArrayBuffer.isView(e))return h(e);if(null==e)throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e);if(_(e,ArrayBuffer)||e&&_(e.buffer,ArrayBuffer))return function(e,t,s){if(t<0||e.byteLength<t)throw new RangeError('"offset" is outside of buffer bounds');if(e.byteLength<t+(s||0))throw new RangeError('"length" is outside of buffer bounds');var i;i=void 0===t&&void 0===s?new Uint8Array(e):void 0===s?new Uint8Array(e,t):new Uint8Array(e,t,s);return i.__proto__=r.prototype,i}(e,t,s);if("number"==typeof e)throw new TypeError('The "value" argument must not be of type number. Received type number');var n=e.valueOf&&e.valueOf();if(null!=n&&n!==e)return r.from(n,t,s);var o=function(e){if(r.isBuffer(e)){var t=0|l(e.length),s=i(t);return 0===s.length||e.copy(s,0,0,t),s}if(void 0!==e.length)return"number"!=typeof e.length||y(e.length)?i(0):h(e);if("Buffer"===e.type&&Array.isArray(e.data))return h(e.data)}(e);if(o)return o;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof e[Symbol.toPrimitive])return r.from(e[Symbol.toPrimitive]("string"),t,s);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e)}function o(e){if("number"!=typeof e)throw new TypeError('"size" argument must be of type number');if(e<0)throw new RangeError('The value "'+e+'" is invalid for option "size"')}function a(e){return o(e),i(e<0?0:0|l(e))}function h(e){for(var t=e.length<0?0:0|l(e.length),s=i(t),r=0;r<t;r+=1)s[r]=255&e[r];return s}function l(e){if(e>=s)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s.toString(16)+" bytes");return 0|e}function c(e,t){if(r.isBuffer(e))return e.length;if(ArrayBuffer.isView(e)||_(e,ArrayBuffer))return e.byteLength;if("string"!=typeof e)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof e);var s=e.length,i=arguments.length>2&&!0===arguments[2];if(!i&&0===s)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return s;case"utf8":case"utf-8":return m(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*s;case"hex":return s>>>1;default:if(n)return i?-1:m(e).length;t=(""+t).toLowerCase(),n=!0}}function d(e,t,s,i){s=Number(s)||0;const r=e.length-s;i?(i=Number(i))>r&&(i=r):i=r;const n=t.length;let o;for(i>n/2&&(i=n/2),o=0;o<i;++o){const i=parseInt(t.substr(2*o,2),16);if(y(i))return o;e[s+o]=i}return o}function u(e,t,s,i){return p(m(t,e.length-s),e,s,i)}function g(e,t,s,i){return p(function(e){const t=[];for(let s=0;s<e.length;++s)t.push(255&e.charCodeAt(s));return t}(t),e,s,i)}function f(e,t,s,i){return p(function(e,t){let s,i,r;const n=[];for(let o=0;o<e.length&&!((t-=2)<0);++o)s=e.charCodeAt(o),i=s>>8,r=s%256,n.push(r),n.push(i);return n}(t,e.length-s),e,s,i)}function p(e,t,s,i){let r;for(r=0;r<i&&!(r+s>=t.length||r>=e.length);++r)t[r+s]=e[r];return r}function m(e,t){var s;t=t||1/0;for(var i=e.length,r=null,n=[],o=0;o<i;++o){if((s=e.charCodeAt(o))>55295&&s<57344){if(!r){if(s>56319){(t-=3)>-1&&n.push(239,191,189);continue}if(o+1===i){(t-=3)>-1&&n.push(239,191,189);continue}r=s;continue}if(s<56320){(t-=3)>-1&&n.push(239,191,189),r=s;continue}s=65536+(r-55296<<10|s-56320)}else r&&(t-=3)>-1&&n.push(239,191,189);if(r=null,s<128){if((t-=1)<0)break;n.push(s)}else if(s<2048){if((t-=2)<0)break;n.push(s>>6|192,63&s|128)}else if(s<65536){if((t-=3)<0)break;n.push(s>>12|224,s>>6&63|128,63&s|128)}else{if(!(s<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;n.push(s>>18|240,s>>12&63|128,s>>6&63|128,63&s|128)}}return n}function _(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}function y(e){return e!=e}"undefined"!=typeof Symbol&&null!=Symbol.species&&r[Symbol.species]===r&&Object.defineProperty(r,Symbol.species,{value:null,configurable:!0,enumerable:!1,writable:!1}),r.from=function(e,t,s){return n(e,t,s)},r.prototype.__proto__=Uint8Array.prototype,r.__proto__=Uint8Array,r.alloc=function(e,t,s){return function(e,t,s){return o(e),e<=0?i(e):void 0!==t?"string"==typeof s?i(e).fill(t,s):i(e).fill(t):i(e)}(e,t,s)},r.allocUnsafe=function(e){return a(e)},r.isBuffer=function(e){return null!=e&&!0===e._isBuffer&&e!==r.prototype},r.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},r.concat=function(e,t){if(!Array.isArray(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return r.alloc(0);var s;if(void 0===t)for(t=0,s=0;s<e.length;++s)t+=e[s].length;var i=r.allocUnsafe(t),n=0;for(s=0;s<e.length;++s){var o=e[s];if(_(o,Uint8Array)&&(o=r.from(o)),!r.isBuffer(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(i,n),n+=o.length}return i},r.byteLength=c,r.prototype._isBuffer=!0,r.prototype.copy=function(e,t,s,i){if(!r.isBuffer(e))throw new TypeError("argument should be a Buffer");if(s||(s=0),i||0===i||(i=this.length),t>=e.length&&(t=e.length),t||(t=0),i>0&&i<s&&(i=s),i===s)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(s<0||s>=this.length)throw new RangeError("Index out of range");if(i<0)throw new RangeError("sourceEnd out of bounds");i>this.length&&(i=this.length),e.length-t<i-s&&(i=e.length-t+s);var n=i-s;if(this===e&&"function"==typeof Uint8Array.prototype.copyWithin)this.copyWithin(t,s,i);else if(this===e&&s<t&&t<i)for(var o=n-1;o>=0;--o)e[o+t]=this[o+s];else Uint8Array.prototype.set.call(e,this.subarray(s,i),t);return n},r.prototype.write=function(e,t,s,i){if(void 0===t)i="utf8",s=this.length,t=0;else if(void 0===s&&"string"==typeof t)i=t,s=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t>>>=0,isFinite(s)?(s>>>=0,void 0===i&&(i="utf8")):(i=s,s=void 0)}const r=this.length-t;if((void 0===s||s>r)&&(s=r),e.length>0&&(s<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");i||(i="utf8");let n=!1;for(;;)switch(i){case"hex":return d(this,e,t,s);case"utf8":case"utf-8":return u(this,e,t,s);case"ascii":case"latin1":case"binary":return g(this,e,t,s);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return f(this,e,t,s);default:if(n)throw new TypeError("Unknown encoding: "+i);i=(""+i).toLowerCase(),n=!0}}},934:e=>{"use strict";function t(e,t){for(const s in t)Object.defineProperty(e,s,{value:t[s],enumerable:!0,configurable:!0});return e}e.exports=function(e,s,i){if(!e||"string"==typeof e)throw new TypeError("Please pass an Error to err-code");i||(i={}),"object"==typeof s&&(i=s,s=void 0),null!=s&&(i.code=s);try{return t(e,i)}catch(s){i.message=e.message,i.stack=e.stack;const r=function(){};return r.prototype=Object.create(Object.getPrototypeOf(e)),t(new r,i)}}},485:function(e,t,s){var i;!function(r){"use strict";function n(e,t){var s=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(s>>16)<<16|65535&s}function o(e,t,s,i,r,o){return n((a=n(n(t,e),n(i,o)))<<(h=r)|a>>>32-h,s);var a,h}function a(e,t,s,i,r,n,a){return o(t&s|~t&i,e,t,r,n,a)}function h(e,t,s,i,r,n,a){return o(t&i|s&~i,e,t,r,n,a)}function l(e,t,s,i,r,n,a){return o(t^s^i,e,t,r,n,a)}function c(e,t,s,i,r,n,a){return o(s^(t|~i),e,t,r,n,a)}function d(e,t){var s,i,r,o,d;e[t>>5]|=128<<t%32,e[14+(t+64>>>9<<4)]=t;var u=1732584193,g=-271733879,f=-1732584194,p=271733878;for(s=0;s<e.length;s+=16)i=u,r=g,o=f,d=p,u=a(u,g,f,p,e[s],7,-680876936),p=a(p,u,g,f,e[s+1],12,-389564586),f=a(f,p,u,g,e[s+2],17,606105819),g=a(g,f,p,u,e[s+3],22,-1044525330),u=a(u,g,f,p,e[s+4],7,-176418897),p=a(p,u,g,f,e[s+5],12,1200080426),f=a(f,p,u,g,e[s+6],17,-1473231341),g=a(g,f,p,u,e[s+7],22,-45705983),u=a(u,g,f,p,e[s+8],7,1770035416),p=a(p,u,g,f,e[s+9],12,-1958414417),f=a(f,p,u,g,e[s+10],17,-42063),g=a(g,f,p,u,e[s+11],22,-1990404162),u=a(u,g,f,p,e[s+12],7,1804603682),p=a(p,u,g,f,e[s+13],12,-40341101),f=a(f,p,u,g,e[s+14],17,-1502002290),u=h(u,g=a(g,f,p,u,e[s+15],22,1236535329),f,p,e[s+1],5,-165796510),p=h(p,u,g,f,e[s+6],9,-1069501632),f=h(f,p,u,g,e[s+11],14,643717713),g=h(g,f,p,u,e[s],20,-373897302),u=h(u,g,f,p,e[s+5],5,-701558691),p=h(p,u,g,f,e[s+10],9,38016083),f=h(f,p,u,g,e[s+15],14,-660478335),g=h(g,f,p,u,e[s+4],20,-405537848),u=h(u,g,f,p,e[s+9],5,568446438),p=h(p,u,g,f,e[s+14],9,-1019803690),f=h(f,p,u,g,e[s+3],14,-187363961),g=h(g,f,p,u,e[s+8],20,1163531501),u=h(u,g,f,p,e[s+13],5,-1444681467),p=h(p,u,g,f,e[s+2],9,-51403784),f=h(f,p,u,g,e[s+7],14,1735328473),u=l(u,g=h(g,f,p,u,e[s+12],20,-1926607734),f,p,e[s+5],4,-378558),p=l(p,u,g,f,e[s+8],11,-2022574463),f=l(f,p,u,g,e[s+11],16,1839030562),g=l(g,f,p,u,e[s+14],23,-35309556),u=l(u,g,f,p,e[s+1],4,-1530992060),p=l(p,u,g,f,e[s+4],11,1272893353),f=l(f,p,u,g,e[s+7],16,-155497632),g=l(g,f,p,u,e[s+10],23,-1094730640),u=l(u,g,f,p,e[s+13],4,681279174),p=l(p,u,g,f,e[s],11,-358537222),f=l(f,p,u,g,e[s+3],16,-722521979),g=l(g,f,p,u,e[s+6],23,76029189),u=l(u,g,f,p,e[s+9],4,-640364487),p=l(p,u,g,f,e[s+12],11,-421815835),f=l(f,p,u,g,e[s+15],16,530742520),u=c(u,g=l(g,f,p,u,e[s+2],23,-995338651),f,p,e[s],6,-198630844),p=c(p,u,g,f,e[s+7],10,1126891415),f=c(f,p,u,g,e[s+14],15,-1416354905),g=c(g,f,p,u,e[s+5],21,-57434055),u=c(u,g,f,p,e[s+12],6,1700485571),p=c(p,u,g,f,e[s+3],10,-1894986606),f=c(f,p,u,g,e[s+10],15,-1051523),g=c(g,f,p,u,e[s+1],21,-2054922799),u=c(u,g,f,p,e[s+8],6,1873313359),p=c(p,u,g,f,e[s+15],10,-30611744),f=c(f,p,u,g,e[s+6],15,-1560198380),g=c(g,f,p,u,e[s+13],21,1309151649),u=c(u,g,f,p,e[s+4],6,-145523070),p=c(p,u,g,f,e[s+11],10,-1120210379),f=c(f,p,u,g,e[s+2],15,718787259),g=c(g,f,p,u,e[s+9],21,-343485551),u=n(u,i),g=n(g,r),f=n(f,o),p=n(p,d);return[u,g,f,p]}function u(e){var t,s="",i=32*e.length;for(t=0;t<i;t+=8)s+=String.fromCharCode(e[t>>5]>>>t%32&255);return s}function g(e){var t,s=[];for(s[(e.length>>2)-1]=void 0,t=0;t<s.length;t+=1)s[t]=0;var i=8*e.length;for(t=0;t<i;t+=8)s[t>>5]|=(255&e.charCodeAt(t/8))<<t%32;return s}function f(e){var t,s,i="0123456789abcdef",r="";for(s=0;s<e.length;s+=1)t=e.charCodeAt(s),r+=i.charAt(t>>>4&15)+i.charAt(15&t);return r}function p(e){return unescape(encodeURIComponent(e))}function m(e){return function(e){return u(d(g(e),8*e.length))}(p(e))}function _(e,t){return function(e,t){var s,i,r=g(e),n=[],o=[];for(n[15]=o[15]=void 0,r.length>16&&(r=d(r,8*e.length)),s=0;s<16;s+=1)n[s]=909522486^r[s],o[s]=1549556828^r[s];return i=d(n.concat(g(t)),512+8*t.length),u(d(o.concat(i),640))}(p(e),p(t))}function y(e,t,s){return t?s?_(t,e):f(_(t,e)):s?m(e):f(m(e))}void 0===(i=function(){return y}.call(t,s,t,e))||(e.exports=i)}()},422:e=>{const t={ANDROID_WEB:"android-web",IOS_WEB:"iOS-web",PC_NATIVE:"PC-native",PC_WEB:"PC-web"};var s={getNetType:function(){let e=(new RegExp("nettype\\/(\\w*)").exec(i())||[,""])[1].toLowerCase();if(!e&&navigator.connection){switch(navigator.connection.type){case"ethernet":e="ethernet";break;case"cellular":e="cellular";break;default:e="wifi"}}return e},getPlatform:function(){return s.isAndroid()?t.ANDROID_WEB:s.isIOS()?t.IOS_WEB:s.isElectron()?t.PC_NATIVE:t.PC_WEB},isX5:function(){return this.isAndroid()&&/\s(TBS|X5Core)\/[\w\.\-]+/i.test(i())},isPC:function(){return!n(r("os "))&&!n(r("android[/ ]"))},isIOS:function(){return n(r("os "))},isIpad:function(){return navigator.userAgent.match(/(iPad)/)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1},isAndroid:function(){return n(r("android[/ ]"))},isIOSSafari:function(){return this.isIOS()&&this.isSafari()},isIpadSafari:function(){return this.isIpad()&&this.isSafari()},isElectron:function(){return/electron/i.test(i())},isMobile:function(){return s.isAndroid()||s.isIOS()},isSafari:function(){return/^((?!chrome|android).)*safari/i.test(i())},isFirefox:function(){return/firefox/i.test(i())},isChrome:function(){return/chrome/i.test(i())},isLocalHost:function(){return"localhost"===location.hostname},device:t,getBrowser:function(){return s.isX5()?"X5":s.isChrome()?"Chrome":s.isFirefox()?"Firefox":s.isIpadSafari()?"iPad-Safari":s.isIOSSafari()?"iPhone-Safari":s.isSafari()?"Mac-Safari":"Unknown"}};function i(){return navigator.userAgent.toLowerCase()}function r(e){return""+(new RegExp(e+"(\\d+((\\.|_)\\d+)*)").exec(i())||[,0])[1]||void 0}function n(e){return parseFloat((e||"").replace(/\_/g,"."))||0}e.exports=s},77:e=>{let t;e.exports="function"==typeof queueMicrotask?queueMicrotask.bind(globalThis):e=>(t||(t=Promise.resolve())).then(e).catch((e=>setTimeout((()=>{throw e}),0)))}},t={};function s(i){var r=t[i];if(void 0!==r)return r.exports;var n=t[i]={exports:{}};return e[i].call(n.exports,n,n.exports,s),n.exports}s.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return s.d(t,{a:t}),t},s.d=(e,t)=>{for(var i in t)s.o(t,i)&&!s.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},s.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var i={};return(()=>{"use strict";s.d(i,{default:()=>$t});const e={DC_SIGNAL:"SIGNAL",DC_OPEN:"OPEN",DC_REQUEST:"REQUEST",DC_SEND_REQUEST:"SEND_REQUEST",DC_PIECE_NOT_FOUND:"PIECE_NOT_FOUND",DC_PIECE_ABORT:"PIECE_ABORT",DC_PIECE_CANCEL:"PIECE_CANCEL",DC_CLOSE:"CLOSE",DC_RESPONSE:"RESPONSE",DC_ERROR:"ERROR",DC_PIECE:"PIECE",DC_PIECE_DATA:"PIECE_DATA",DC_TIMEOUT:"TIMEOUT",DC_PIECE_ACK:"PIECE_ACK",DC_METADATA:"METADATA",DC_PLAT_ANDROID:"ANDROID",DC_PLAT_IOS:"IOS",DC_PLAT_WEB:"WEB",DC_CHOKE:"CHOKE",DC_UNCHOKE:"UNCHOKE",DC_HAVE:"HAVE",DC_HAVE_REVERSE:"HAVE_REVERSE",DC_LOST:"LOST",DC_GET_PEERS:"GET_PEERS",DC_PEERS:"PEERS",DC_STATS:"STATS",DC_PEER_SIGNAL:"PEER_SIGNAL",DC_PLAYLIST:"PLAYLIST",BM_LOST:"lost",BM_ADDED_SEG_:"BM_ADDED_SEG_",BM_ADDED_SN_:"BM_ADDED_SN_",BM_SEG_ADDED:"BM_SEG_ADDED",FRAG_CHANGED:"FRAG_CHANGED",FRAG_LOADED:"FRAG_LOADED",FRAG_LOADING:"FRAG_LOADING",RESTART_P2P:"RESTART_P2P",EXCEPTION:"exception",REQUESTING_MAP_HAVE:"REQUESTING_MAP_HAVE",BUILDER_MAP_HAVE:"BUILDER_MAP_HAVE",SYN_OUTPUT:"SYN_OUTPUT",SYN_ERROR:"SYN_ERROR",SYN_PROGRESS:"SYN_PROGRESS"},t={...e,SCH_DCHAVE:"SCH_DCHAVE",SCH_WAIT_PEER:"SCH_WAIT_PEER",SW_PLAYLIST:"SW_PLAYLIST",SW_GET_PLAYLIST:"SW_GET_PLAYLIST",SW_GET_MEDIA:"SW_GET_MEDIA",LEVEL_LOADED:"LEVEL_LOADED",MANIFEST_PARSED:"MANIFEST_PARSED"};var r=s(204),n=s.n(r),o=s(47),a=s(622),h=s.n(a);const l=64e3;function c(){return!0}function d(e){return new URL(location.href).searchParams.get(e)}function u(){return Date.parse(new Date)/1e3}function g(e,t){return parseInt(Math.random()*(t-e+1)+e,10)}function f(e,t,s,i=2e3,r=!1){const n=new XMLHttpRequest;let o=e;return r&&(o=function(e,t,s){const i=new URL(e);return i.searchParams.append(t,s),i.href}(e,"__PROXY_IDENTIFIER__",!0)),new Promise(((r,a)=>{n.open("GET",o,!0),n.responseType="arraybuffer",n.timeout=i,n.onreadystatechange=e=>{if(4===n.readyState){const e=n.status;206===e||200===e&&t?r(n.response):a(`status ${e}`)}},n.onerror=e=>{a("request error")},n.ontimeout=e=>{a("timeout")},n.setRequestHeader("Range",t||"bytes=0-0"),s&&s(n,e),n.send()}))}function p(){if("undefined"==typeof self)return null;var e={RTCPeerConnection:self.RTCPeerConnection||self.mozRTCPeerConnection||self.webkitRTCPeerConnection,RTCSessionDescription:self.RTCSessionDescription||self.mozRTCSessionDescription||self.webkitRTCSessionDescription,RTCIceCandidate:self.RTCIceCandidate||self.mozRTCIceCandidate||self.webkitRTCIceCandidate};return e.RTCPeerConnection&&e.RTCPeerConnection.prototype?e:null}function m(e){const t=o.l.from(e),s=new o.l(e.byteLength);return t.copy(s),s}function _(){return location.protocol.startsWith("https")}function y(e,t){const s=e.byteLength-t,i=[];let r=t,n=Math.floor(s/l),a=s%l;for(let t=0;t<n;t++){const t=(0,o.l)(l);e.copy(t,0,r,r+l),i.push(t),r+=l}if(a>0){const t=(0,o.l)(a);e.copy(t,0,r,r+a),i.push(t)}return i}function S(e,t){if(e.size<=t)return;const s=[...e.values()];do{e.delete(s.shift())}while(e.size>t)}function v(e){return e instanceof ArrayBuffer&&0!==e.byteLength}function P(){let e=new Date,t=e.getHours(),s=e.getMinutes(),i=e.getSeconds(),r=e.getMilliseconds();return`${t.toString().padStart(2,"0")}:${s.toString().padStart(2,"0")}:${i.toString().padStart(2,"0")}.${r}`}var b=function(e,t){return b=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var s in t)t.hasOwnProperty(s)&&(e[s]=t[s])},b(e,t)};function w(e,t){function s(){this.constructor=e}b(e,t),e.prototype=null===t?Object.create(t):(s.prototype=t.prototype,new s)}function E(e,t){var s="function"==typeof Symbol&&e[Symbol.iterator];if(!s)return e;var i,r,n=s.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(i=n.next()).done;)o.push(i.value)}catch(e){r={error:e}}finally{try{i&&!i.done&&(s=n.return)&&s.call(n)}finally{if(r)throw r.error}}return o}function C(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(E(arguments[t]));return e}var I=function(e,t){this.target=t,this.type=e},T=function(e){function t(t,s){var i=e.call(this,"error",s)||this;return i.message=t.message,i.error=t,i}return w(t,e),t}(I),L=function(e){function t(t,s,i){void 0===t&&(t=1e3),void 0===s&&(s="");var r=e.call(this,"close",i)||this;return r.wasClean=!0,r.code=t,r.reason=s,r}return w(t,e),t}(I),R=function(){if("undefined"!=typeof WebSocket)return WebSocket},D={maxReconnectionDelay:1e4,minReconnectionDelay:1e3+4e3*Math.random(),minUptime:5e3,reconnectionDelayGrowFactor:1.3,connectionTimeout:4e3,maxRetries:1/0,maxEnqueuedMessages:1/0,startClosed:!1,debug:!1};const A=function(){function e(e,t,s){var i=this;void 0===s&&(s={}),this._listeners={error:[],message:[],open:[],close:[]},this._retryCount=-1,this._shouldReconnect=!0,this._connectLock=!1,this._binaryType="blob",this._closeCalled=!1,this._messageQueue=[],this.onclose=null,this.onerror=null,this.onmessage=null,this.onopen=null,this._handleOpen=function(e){i._debug("open event");var t=i._options.minUptime,s=void 0===t?D.minUptime:t;clearTimeout(i._connectTimeout),i._uptimeTimeout=setTimeout((function(){return i._acceptOpen()}),s),i._ws.binaryType=i._binaryType,i._messageQueue.forEach((function(e){return i._ws.send(e)})),i._messageQueue=[],i.onopen&&i.onopen(e),i._listeners.open.forEach((function(t){return i._callEventListener(e,t)}))},this._handleMessage=function(e){i._debug("message event"),i.onmessage&&i.onmessage(e),i._listeners.message.forEach((function(t){return i._callEventListener(e,t)}))},this._handleError=function(e){i._debug("error event",e.message),i._disconnect(void 0,"TIMEOUT"===e.message?"timeout":void 0),i.onerror&&i.onerror(e),i._debug("exec error listeners"),i._listeners.error.forEach((function(t){return i._callEventListener(e,t)})),i._connect()},this._handleClose=function(e){i._debug("close event"),i._clearTimeouts(),i._shouldReconnect&&i._connect(),i.onclose&&i.onclose(e),i._listeners.close.forEach((function(t){return i._callEventListener(e,t)}))},this._url=e,this._protocols=t,this._options=s,this._options.startClosed&&(this._shouldReconnect=!1),this._connect()}return Object.defineProperty(e,"CONNECTING",{get:function(){return 0},enumerable:!0,configurable:!0}),Object.defineProperty(e,"OPEN",{get:function(){return 1},enumerable:!0,configurable:!0}),Object.defineProperty(e,"CLOSING",{get:function(){return 2},enumerable:!0,configurable:!0}),Object.defineProperty(e,"CLOSED",{get:function(){return 3},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CONNECTING",{get:function(){return e.CONNECTING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"OPEN",{get:function(){return e.OPEN},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CLOSING",{get:function(){return e.CLOSING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CLOSED",{get:function(){return e.CLOSED},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"binaryType",{get:function(){return this._ws?this._ws.binaryType:this._binaryType},set:function(e){this._binaryType=e,this._ws&&(this._ws.binaryType=e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"retryCount",{get:function(){return Math.max(this._retryCount,0)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"bufferedAmount",{get:function(){return this._messageQueue.reduce((function(e,t){return"string"==typeof t?e+=t.length:t instanceof Blob?e+=t.size:e+=t.byteLength,e}),0)+(this._ws?this._ws.bufferedAmount:0)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extensions",{get:function(){return this._ws?this._ws.extensions:""},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"protocol",{get:function(){return this._ws?this._ws.protocol:""},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"readyState",{get:function(){return this._ws?this._ws.readyState:this._options.startClosed?e.CLOSED:e.CONNECTING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._ws?this._ws.url:""},enumerable:!0,configurable:!0}),e.prototype.close=function(e,t){void 0===e&&(e=1e3),this._closeCalled=!0,this._shouldReconnect=!1,this._clearTimeouts(),this._ws?this._ws.readyState!==this.CLOSED?this._ws.close(e,t):this._debug("close: already closed"):this._debug("close enqueued: no ws instance")},e.prototype.reconnect=function(e,t){this._shouldReconnect=!0,this._closeCalled=!1,this._retryCount=-1,this._ws&&this._ws.readyState!==this.CLOSED?(this._disconnect(e,t),this._connect()):this._connect()},e.prototype.send=function(e){if(this._ws&&this._ws.readyState===this.OPEN)this._debug("send",e),this._ws.send(e);else{var t=this._options.maxEnqueuedMessages,s=void 0===t?D.maxEnqueuedMessages:t;this._messageQueue.length<s&&(this._debug("enqueue",e),this._messageQueue.push(e))}},e.prototype.addEventListener=function(e,t){this._listeners[e]&&this._listeners[e].push(t)},e.prototype.dispatchEvent=function(e){var t,s,i=this._listeners[e.type];if(i)try{for(var r=function(e){var t="function"==typeof Symbol&&e[Symbol.iterator],s=0;return t?t.call(e):{next:function(){return e&&s>=e.length&&(e=void 0),{value:e&&e[s++],done:!e}}}}(i),n=r.next();!n.done;n=r.next()){var o=n.value;this._callEventListener(e,o)}}catch(e){t={error:e}}finally{try{n&&!n.done&&(s=r.return)&&s.call(r)}finally{if(t)throw t.error}}return!0},e.prototype.removeEventListener=function(e,t){this._listeners[e]&&(this._listeners[e]=this._listeners[e].filter((function(e){return e!==t})))},e.prototype._debug=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._options.debug&&console.log.apply(console,C(["RWS>"],e))},e.prototype._getNextDelay=function(){var e=this._options,t=e.reconnectionDelayGrowFactor,s=void 0===t?D.reconnectionDelayGrowFactor:t,i=e.minReconnectionDelay,r=void 0===i?D.minReconnectionDelay:i,n=e.maxReconnectionDelay,o=void 0===n?D.maxReconnectionDelay:n,a=0;return this._retryCount>0&&(a=r*Math.pow(s,this._retryCount-1))>o&&(a=o),this._debug("next delay",a),a},e.prototype._wait=function(){var e=this;return new Promise((function(t){setTimeout(t,e._getNextDelay())}))},e.prototype._getNextUrl=function(e){if("string"==typeof e)return Promise.resolve(e);if("function"==typeof e){var t=e();if("string"==typeof t)return Promise.resolve(t);if(t.then)return t}throw Error("Invalid URL")},e.prototype._connect=function(){var e=this;if(!this._connectLock&&this._shouldReconnect){this._connectLock=!0;var t=this._options,s=t.maxRetries,i=void 0===s?D.maxRetries:s,r=t.connectionTimeout,n=void 0===r?D.connectionTimeout:r,o=t.WebSocket,a=void 0===o?R():o;if(this._retryCount>=i)this._debug("max retries reached",this._retryCount,">=",i);else{if(this._retryCount++,this._debug("connect",this._retryCount),this._removeListeners(),void 0===(h=a)||!h||2!==h.CLOSING)throw Error("No valid WebSocket class provided");var h;this._wait().then((function(){return e._getNextUrl(e._url)})).then((function(t){e._closeCalled||(e._debug("connect",{url:t,protocols:e._protocols}),e._ws=e._protocols?new a(t,e._protocols):new a(t),e._ws.binaryType=e._binaryType,e._connectLock=!1,e._addListeners(),e._connectTimeout=setTimeout((function(){return e._handleTimeout()}),n))}))}}},e.prototype._handleTimeout=function(){this._debug("timeout event"),this._handleError(new T(Error("TIMEOUT"),this))},e.prototype._disconnect=function(e,t){if(void 0===e&&(e=1e3),this._clearTimeouts(),this._ws){this._removeListeners();try{this._ws.close(e,t),this._handleClose(new L(e,t,this))}catch(e){}}},e.prototype._acceptOpen=function(){this._debug("accept open"),this._retryCount=0},e.prototype._callEventListener=function(e,t){"handleEvent"in t?t.handleEvent(e):t(e)},e.prototype._removeListeners=function(){this._ws&&(this._debug("removeListeners"),this._ws.removeEventListener("open",this._handleOpen),this._ws.removeEventListener("close",this._handleClose),this._ws.removeEventListener("message",this._handleMessage),this._ws.removeEventListener("error",this._handleError))},e.prototype._addListeners=function(){this._ws&&(this._debug("addListeners"),this._ws.addEventListener("open",this._handleOpen),this._ws.addEventListener("close",this._handleClose),this._ws.addEventListener("message",this._handleMessage),this._ws.addEventListener("error",this._handleError))},e.prototype._clearTimeouts=function(){clearTimeout(this._connectTimeout),clearTimeout(this._uptimeTimeout)},e}(),M={debug:3,info:4,warn:5,error:6};class N{constructor(e,t,s,i){this.wsAddr=`${e}?app=${t}&id=${s}&v=${i}`,this.destroyed=!1;try{this._ws=this._init()}catch(e){console.error(e)}}_init(){const e={maxRetries:3,minReconnectionDelay:g(5e3,15e3),maxReconnectionDelay:6e5,maxEnqueuedMessages:200};return new A(this.wsAddr,void 0,e)}send(e,t){if(this.destroyed)return;const s=M[e];this._ws.send(JSON.stringify({records:[{level:s,text:`${P()}: ${t}`}]}))}sendBatch(e){const t=[];for(let s of e)t.push({level:M[s.levelKey],text:s.message});this._ws.send(JSON.stringify({records:t}))}destroy(){this._ws&&(this._ws.close(1e3,"normal close"),this._ws=null,this.destroyed=!0)}}const k={debug:0,info:1,warn:2,error:3,none:4};const O=class{constructor(e){this.logLevel=e,this.onlineDebug=!1,this.logCache=[];try{console.debug=console.log}catch(e){}"debug"!==e&&"info"!==e||(this.logLevel="error"),!0===e?this.logLevel="warn":!1===e?this.logLevel="none":e in k||(this.logLevel="error"),this.resetLogger()}enableDebug(){this.onlineDebug=!0;for(let e in k)this[e]=console[e];this._hookLogFunc(((e,t)=>{this.logUploader&&this.logUploader.send(e,t)}))}enableReport(e){this.reportUrl=e,this._hookLogFunc(((e,t)=>{this.reportUrl&&(this.logCache.push({levelKey:e,message:`${P()}: ${t}`}),this.logCache.length>250&&this.logCache.shift())}))}report(e,t,s,i){this.logCache.unshift({levelKey:"info",message:e});const r=new N(this.reportUrl,t,s,i);this.reportUrl=void 0,r._ws.addEventListener("open",(()=>{r.sendBatch(this.logCache),setTimeout((()=>{r.destroy()}),5e3)}),{once:!0})}_hookLogFunc(e){for(let t in k){const s=this[t];this[t]=i=>{e(t,i),s(i)}}}setUploader(e){this.logUploader=e}resetLogger(){this.onlineDebug=!1;for(let e in k)k[e]<k[this.logLevel]?this[e]=c:this[e]=console[e]}get isDebugLevel(){return k[this.logLevel]<=2||this.onlineDebug}};var $=s(77),B=s.n($);const x=65536;function q(e){return e.replace(/a=ice-options:trickle\s\n/g,"")}class F extends(n()){constructor(e){super(),this.channelName=e.initiator?e.channelName:null,this.initiator=e.initiator||!1,this.channelConfig=e.channelConfig||F.channelConfig,this.channelNegotiated=this.channelConfig.negotiated,this.config=Object.assign({},F.config,e.config),this.offerOptions=e.offerOptions||{},this.answerOptions=e.answerOptions||{},this.sdpTransform=e.sdpTransform||(e=>e),this.trickle=void 0===e.trickle||e.trickle,this.allowHalfTrickle=void 0!==e.allowHalfTrickle&&e.allowHalfTrickle,this.iceCompleteTimeout=e.iceCompleteTimeout||5e3,this.destroyed=!1,this.destroying=!1,this._connected=!1,this.remoteAddress=void 0,this.remoteFamily=void 0,this.remotePort=void 0,this.localAddress=void 0,this.localFamily=void 0,this.localPort=void 0,this._wrtc=e.wrtc&&"object"==typeof e.wrtc?e.wrtc:p(),this._pcReady=!1,this._channelReady=!1,this._iceComplete=!1,this._iceCompleteTimer=null,this._channel=null,this._pendingCandidates=[],this._pendingData=[],this._isNegotiating=!1,this._firstNegotiation=!0,this._batchedNegotiation=!1,this._queuedNegotiation=!1,this._sendersAwaitingStable=[],this._senderMap=new Map,this._closingInterval=null,this._chunk=null,this._cb=null,this._interval=null;try{this._pc=new this._wrtc.RTCPeerConnection(this.config)}catch(e){return void B()((()=>this.destroy(e)))}this._pc.oniceconnectionstatechange=()=>{this._onIceStateChange()},this._pc.onicegatheringstatechange=()=>{this._onIceStateChange()},this._pc.onconnectionstatechange=()=>{this._onConnectionStateChange()},this._pc.onsignalingstatechange=()=>{this._onSignalingStateChange()},this._pc.onicecandidate=e=>{this._onIceCandidate(e)},this.initiator||this.channelNegotiated?this._setupData({channel:this._pc.createDataChannel(this.channelName,this.channelConfig)}):this._pc.ondatachannel=e=>{this._setupData(e)},this._needsNegotiation()}get bufferSize(){return this._channel&&this._channel.bufferedAmount||0}get connected(){return this._connected&&"open"===this._channel.readyState}signal(e){if(!this.destroyed&&this._pc){if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e={}}if(e.renegotiate&&this.initiator&&this._needsNegotiation(),e.candidate)if(this._pc.remoteDescription&&this._pc.remoteDescription.type)try{this._addIceCandidate(e.candidate)}catch(e){}else this._pendingCandidates.push(e.candidate);e.sdp&&this._pc.setRemoteDescription(new this._wrtc.RTCSessionDescription(e)).then((()=>{this.destroyed||(this._pendingCandidates.forEach((e=>{try{this._addIceCandidate(e)}catch(e){}})),this._pendingCandidates=[],"offer"===this._pc.remoteDescription.type&&this._createAnswer())})).catch((e=>{this.destroy(e)})),e.sdp||e.candidate||e.renegotiate||e.transceiverRequest||this.destroy(new Error("signal() called with invalid signal data"))}}_addIceCandidate(e){const t=new this._wrtc.RTCIceCandidate(e);this._pc.addIceCandidate(t).catch((e=>{var s;!t.address||t.address.endsWith(".local")?(s="Ignoring unsupported ICE candidate.",console.warn(s)):this.destroy(e)}))}send(e){if("string"==typeof e){RTCDataChannel.prototype.send.toString().includes("[native code]")&&this._channel.send(e)}else this._channel.send(e)}_needsNegotiation(){this._batchedNegotiation||(this._batchedNegotiation=!0,B()((()=>{this._batchedNegotiation=!1,!this.initiator&&this._firstNegotiation||this.negotiate(),this._firstNegotiation=!1})))}negotiate(){this.initiator?this._isNegotiating?this._queuedNegotiation=!0:setTimeout((()=>{this._createOffer()}),0):this._isNegotiating?this._queuedNegotiation=!0:this.emit("signal",{type:"renegotiate",renegotiate:!0}),this._isNegotiating=!0}destroy(e){this._destroy(e)}_destroy(e){this.destroyed||this.destroying||(this.destroying=!0,B()((()=>{if(this.destroyed=!0,this.destroying=!1,this._connected=!1,this._pcReady=!1,this._channelReady=!1,this._senderMap=null,clearInterval(this._closingInterval),this._closingInterval=null,clearInterval(this._interval),this._interval=null,this._chunk=null,this._cb=null,this._channel){try{this._channel.close()}catch(e){}this._channel.onmessage=null,this._channel.onopen=null,this._channel.onclose=null,this._channel.onerror=null}if(this._pc){try{this._pc.close()}catch(e){}this._pc.oniceconnectionstatechange=null,this._pc.onicegatheringstatechange=null,this._pc.onsignalingstatechange=null,this._pc.onicecandidate=null,this._pc.ondatachannel=null}this._pc=null,this._channel=null,e&&this.emit("error",e),this.emit("close")})))}_setupData(e){if(!e.channel)return this.destroy(new Error("Data channel event is missing `channel` property"));this._channel=e.channel,this._channel.binaryType="arraybuffer","number"==typeof this._channel.bufferedAmountLowThreshold&&(this._channel.bufferedAmountLowThreshold=x),this.channelName=this._channel.label,this._channel.onmessage=e=>{this._onChannelMessage(e)},this._channel.onbufferedamountlow=()=>{this._onChannelBufferedAmountLow()},this._channel.onopen=()=>{this._onChannelOpen()},this._channel.onclose=()=>{this._onChannelClose()},this._channel.onerror=e=>{this.destroy(e)};let t=!1;this._closingInterval=setInterval((()=>{this._channel&&"closing"===this._channel.readyState?(t&&this._onChannelClose(),t=!0):t=!1}),5e3)}get isBufferedAmountHigh(){return this._channel.bufferedAmount>x}write(e,t){if(this.destroyed)return t(new Error("cannot write after peer is destroyed"));if(this._connected){try{this.send(e)}catch(e){return this.destroy(e)}this.isBufferedAmountHigh?this._cb=t:t(null)}else this._chunk=e,this._cb=t}_startIceCompleteTimeout(){this.destroyed||this._iceCompleteTimer||(this._iceCompleteTimer=setTimeout((()=>{this._iceComplete||(this._iceComplete=!0,this.emit("iceTimeout"),this.emit("_iceComplete"))}),this.iceCompleteTimeout))}_createOffer(){this.destroyed||this._pc.createOffer(this.offerOptions).then((e=>{if(this.destroyed)return;this.trickle||this.allowHalfTrickle||(e.sdp=q(e.sdp)),e.sdp=this.sdpTransform(e.sdp);const t=()=>{if(this.destroyed)return;const t=this._pc.localDescription||e;this.emit("signal",{type:t.type,sdp:t.sdp})};this._pc.setLocalDescription(e).then((()=>{this.destroyed||(this.trickle||this._iceComplete?t():this.once("_iceComplete",t))})).catch((e=>{this.destroy(e)}))})).catch((e=>{this.destroy(e)}))}_createAnswer(){this.destroyed||this._pc.createAnswer(this.answerOptions).then((e=>{if(this.destroyed)return;this.trickle||this.allowHalfTrickle||(e.sdp=q(e.sdp)),e.sdp=this.sdpTransform(e.sdp);const t=()=>{if(this.destroyed)return;const t=this._pc.localDescription||e;this.emit("signal",{type:t.type,sdp:t.sdp})};this._pc.setLocalDescription(e).then((()=>{this.destroyed||(this.trickle||this._iceComplete?t():this.once("_iceComplete",t))})).catch((e=>{this.destroy(e)}))})).catch((e=>{this.destroy(e)}))}_onConnectionStateChange(){this.destroyed||"failed"===this._pc.connectionState&&this.destroy(new Error("Connection failed."))}_onIceStateChange(){if(this.destroyed)return;const e=this._pc.iceConnectionState,t=this._pc.iceGatheringState;this.emit("iceStateChange",e,t),"connected"!==e&&"completed"!==e||(this._pcReady=!0,this._maybeReady()),"failed"===e&&this.destroy(new Error("Ice connection failed.")),"closed"===e&&this.destroy(new Error("Ice connection closed."))}getStats(e){const t=e=>("[object Array]"===Object.prototype.toString.call(e.values)&&e.values.forEach((t=>{Object.assign(e,t)})),e);0===this._pc.getStats.length?this._pc.getStats().then((s=>{const i=[];s.forEach((e=>{i.push(t(e))})),e(null,i)}),(t=>e(t))):this._pc.getStats.length>0?this._pc.getStats((s=>{if(this.destroyed)return;const i=[];s.result().forEach((e=>{const s={};e.names().forEach((t=>{s[t]=e.stat(t)})),s.id=e.id,s.type=e.type,s.timestamp=e.timestamp,i.push(t(s))})),e(null,i)}),(t=>e(t))):e(null,[])}_maybeReady(){if(this._connected||this._connecting||!this._pcReady||!this._channelReady)return;this._connecting=!0;const e=()=>{this.destroyed||this.getStats(((t,s)=>{if(this.destroyed)return;t&&(s=[]);const i={},r={},n={};let o=!1;s.forEach((e=>{"remotecandidate"!==e.type&&"remote-candidate"!==e.type||(i[e.id]=e),"localcandidate"!==e.type&&"local-candidate"!==e.type||(r[e.id]=e),"candidatepair"!==e.type&&"candidate-pair"!==e.type||(n[e.id]=e)}));const a=e=>{o=!0;let t=r[e.localCandidateId];t&&(t.ip||t.address)?(this.localAddress=t.ip||t.address,this.localPort=Number(t.port)):t&&t.ipAddress?(this.localAddress=t.ipAddress,this.localPort=Number(t.portNumber)):"string"==typeof e.googLocalAddress&&(t=e.googLocalAddress.split(":"),this.localAddress=t[0],this.localPort=Number(t[1])),this.localAddress&&(this.localFamily=this.localAddress.includes(":")?"IPv6":"IPv4");let s=i[e.remoteCandidateId];s&&(s.ip||s.address)?(this.remoteAddress=s.ip||s.address,this.remotePort=Number(s.port)):s&&s.ipAddress?(this.remoteAddress=s.ipAddress,this.remotePort=Number(s.portNumber)):"string"==typeof e.googRemoteAddress&&(s=e.googRemoteAddress.split(":"),this.remoteAddress=s[0],this.remotePort=Number(s[1])),this.remoteAddress&&(this.remoteFamily=this.remoteAddress.includes(":")?"IPv6":"IPv4")};if(s.forEach((e=>{"transport"===e.type&&e.selectedCandidatePairId&&a(n[e.selectedCandidatePairId]),("googCandidatePair"===e.type&&"true"===e.googActiveConnection||("candidatepair"===e.type||"candidate-pair"===e.type)&&e.selected)&&a(e)})),o||Object.keys(n).length&&!Object.keys(r).length){if(this._connecting=!1,this._connected=!0,this._chunk){try{this.send(this._chunk)}catch(t){return this.destroy(t)}this._chunk=null;const e=this._cb;this._cb=null,e(null)}"number"!=typeof this._channel.bufferedAmountLowThreshold&&(this._interval=setInterval((()=>this._onInterval()),150),this._interval.unref&&this._interval.unref()),this.emit("connect");for(let e of this._pendingData)this.emit("data",e);this._pendingData=[]}else setTimeout(e,100)}))};e()}_onInterval(){!this._cb||!this._channel||this._channel.bufferedAmount>x||this._onChannelBufferedAmountLow()}_onSignalingStateChange(){this.destroyed||("stable"===this._pc.signalingState&&(this._isNegotiating=!1,this._sendersAwaitingStable.forEach((e=>{this._pc.removeTrack(e),this._queuedNegotiation=!0})),this._sendersAwaitingStable=[],this._queuedNegotiation?(this._queuedNegotiation=!1,this._needsNegotiation()):this.emit("negotiated")),this.emit("signalingStateChange",this._pc.signalingState))}_onIceCandidate(e){this.destroyed||(e.candidate&&this.trickle?this.emit("signal",{type:"candidate",candidate:{candidate:e.candidate.candidate,sdpMLineIndex:e.candidate.sdpMLineIndex,sdpMid:e.candidate.sdpMid}}):e.candidate||this._iceComplete||(this._iceComplete=!0,this.emit("_iceComplete")),e.candidate&&this._startIceCompleteTimeout())}_onChannelMessage(e){if(this.destroyed)return;let t=e.data;t instanceof ArrayBuffer&&(t=o.l.from(t)),this._connected?this.emit("data",t):this._pendingData.length<10&&this._pendingData.push(t)}_onChannelBufferedAmountLow(){if(this.destroyed||!this._cb)return;const e=this._cb;this._cb=null,e(null)}_onChannelOpen(){this._connected||this.destroyed||(this._channelReady=!0,this._maybeReady())}_onChannelClose(){this.destroyed||this.destroy()}}F.config={iceServers:[{urls:["stun:stun.l.google.com:19302","stun:global.stun.twilio.com:3478"]}],sdpSemantics:"unified-plan"},F.channelConfig={};const H=F;class z{constructor(e,t,s,i,r=0){this.sn=e,this.segId=t,this.data=s,this.fromPeerId=i,this.level=r||0}static fromSegment(e){const t=new z(e.sn,e.segId,e.data,e.fromPeerId,e.level);return t.from=e.from,t}get size(){return this.data.byteLength}get isSequential(){return this.sn>=0}}var U=s(422),W=s.n(U);class j extends(n()){static get defaultPacketSize(){return l}static get VERSION(){return"8"}constructor(e,t,s,i,r,n={}){super(),this.channel=e.fetcher.channelId,this.logger=e.logger,this.config=r,this.isInitiator=i,this.options=n,this.intermediator=n.intermediator||null,this.signalMsgs=[],this.assignPeerId(t,s),this.platform="unknown",this.super=!1,this.mobile=!1,this.mobileWeb=!1,this.mobileNet=!1,this.connected=!1,this.msgQueue=[],this.miss=0,this.notifySet=new Set,this.bufArr=[],this.packetSize=l,this.sendReqQueue=[],this.downloading=!1,this.uploading=!1,this.choked=!1,this.streamListeners=[],this.pieceMsg={},this.uploadInterrupter={targetSegId:void 0,currentSegId:void 0,canceled:!1},this.datasToSend=[],this.bytesUploaded=0,this.dataWriting=!1,this.timeSendRequest=0,this.timeReceivePiece=0,this.timeSendPiece=0,this.weight=0,this.peersConnected=1,this.uploadSpeed=0,this.currentLevel=0,this.currentPos=0,this.useBackupSignal=!1,this.gotPeersTS=0,this.webRTCConfig={};const{stuns:o}=this.options;if(o&&o.length>0){const e=[];o.forEach((t=>{this.logger.info(`use stun ${t}`),e.push({urls:t})})),this.webRTCConfig.iceServers=e}this.config.webRTCConfig&&(this.webRTCConfig={...this.config.webRTCConfig,...this.webRTCConfig}),this.playlistMap=new Map,this._initPeerChannel(),this.notFatalClosed=!1,this.startSN=Number.MAX_SAFE_INTEGER,this.endSN=-1,this._loadedBytes=0}assignPeerId(t,s){this.remotePeerId=s,this.channelId=this.isInitiator?`${t}-${s}`:`${s}-${t}`,s&&(this.timeJoin=u(),this.dataExchangeTs=this.timeJoin,this.gotStatsTs=this.timeJoin,this._startTimer()),setTimeout((()=>{for(let t of this.signalMsgs)this.emit(e.DC_SIGNAL,t,!0)}),0)}_startTimer(){this.connTimeout=setTimeout((()=>{this.logger.warn(`dc ${this.channelId} connection timeout`),this.emit(e.DC_TIMEOUT)}),2e4)}get isAvailable(){return this.downloadNum<2&&!this.choked}get isAvailableUrgently(){return!this.downloading&&!this.choked}cancelDownload(t,s,i){if(i&&this.downloading&&!(this.streamListeners.length>0||this.remainAttachments<=2))return this.logger.info(`cancel download ${i} remain packets ${this.remainAttachments}`),this.timeReceivePiece=0,this.sendJson({event:e.DC_PIECE_CANCEL,sn:t,level:s,seg_id:i})}addStreamListener(e,t,s){this.streamListeners.push({handler:s,peerId:t})}removeStreamListener(e){this.streamListeners=this.streamListeners.filter((t=>t.peerId!==e||(t.handler(void 0,void 0,!0,"aborted by cancel"),!1)))}_initPeerChannel(){const t=new H({initiator:this.isInitiator,trickle:this.options.trickle||!1,config:this.webRTCConfig});this._datachannel=t,t.on("error",(t=>{let s=!0;"Ice connection failed."===t.message&&this.notFatalClosed&&(s=!1),this.emit(e.DC_ERROR,s)})),t.on("signal",(t=>{this.signalMsgs.push(t),this.emit(e.DC_SIGNAL,t)}));t.on("connect",(()=>{for(this.logger.info(`datachannel CONNECTED from ${this.intermediator?"peer":"server"} to ${this.remotePeerId}`),this.connected=!0,clearTimeout(this.connTimeout),this.signalMsgs=[],this.emit(e.DC_OPEN);this.msgQueue.length>0;){let e=this.msgQueue.shift();this.emit(e.event,e)}})),t.on("data",(t=>{const{logger:s}=this;if("string"==typeof t){let i=JSON.parse(t);if(!i)return void s.error("dc received string is null");if(!this.connected)return void this.msgQueue.push(i);let r,n=i.event;switch(r=n!==e.DC_PLAYLIST&&n!==e.DC_PEER_SIGNAL?`string: ${t}`:`event: ${n}`,s.debug(`datachannel receive ${r} from ${this.remotePeerId}`),n){case e.DC_HAVE:if(this.emit(i.event,i),!i.sn)return;this.config.live||(i.sn<this.startSN&&(this.startSN=i.sn),i.sn>this.endSN&&(this.endSN=i.sn));break;case e.DC_PIECE:this.downloading=!0,this.dataExchangeTs=u(),this.timeReceivePiece=performance.now(),this.pieceMsg=i,this._prepareForBinary(i.attachments,i.seg_id,i.sn,i.size),this.emit(i.event,i);break;case e.DC_PIECE_CANCEL:this.uploadInterrupter.targetSegId=i.seg_id,this.emit(i.event,i);break;case e.DC_PIECE_NOT_FOUND:this._sendNextReq()||(this.downloading=!1),this.emit(i.event,i);break;case e.DC_REQUEST:this._handleRequestMsg(i);break;case e.DC_PIECE_ACK:this.uploadInterrupter.canceled||(this._handlePieceAck(i.size,i.miss),this.emit(i.event,i));break;case e.DC_STATS:this._handleStats(i);break;case e.DC_PLAYLIST:this.config.sharePlaylist&&this._handlePlaylist(i);break;case e.DC_METADATA:this._handleMetadata(i);break;case e.DC_PIECE_ABORT:this.downloading&&(this._notifyDownloadListenersAbort("aborted by upstream peer"),this.emit(e.DC_PIECE_ABORT,i));break;case e.DC_CHOKE:s.info(`choke peer ${this.remotePeerId}`),this.choked=!0;break;case e.DC_UNCHOKE:s.info(`unchoke peer ${this.remotePeerId}`),this.choked=!1;break;case e.DC_CLOSE:this.emit(i.event,i.fatal||!1);break;default:this.emit(i.event,i)}}else{if(!t)return void s.error("datachannel on data is undefined!");if(!this.downloading)return void s.warn(`peer not downloading, data size ${t.byteLength} pieceMsg ${JSON.stringify(this.pieceMsg)}`);this._handleBinaryMsg(t)}})),t.once("close",(()=>{this.emit(e.DC_CLOSE,!1)})),t.on("iceStateChange",((e,t)=>{"disconnected"===e&&(this.logger.warn(`${this.remotePeerId} disconnected`),this.connected=!1)}))}sendJson(t){t.event!==e.DC_PLAYLIST&&t.event!==e.DC_PEER_SIGNAL?this.logger.debug(`dc bufferSize ${this._datachannel.bufferSize} send ${JSON.stringify(t)} to ${this.remotePeerId}`):this.logger.debug(`dc send event ${t.event} to ${this.remotePeerId}`);const s=JSON.stringify(t);return s.length>l?(this.logger.error("string to send is too large"),!1):this.send(s,!1)}send(e,t=!0){return t?(this.datasToSend.push(e),this.dataWriting||this._sendDataSync(),!0):this.sendImmediately(e)}_checkIfNeedInterrupt(){const{targetSegId:t,currentSegId:s,canceled:i}=this.uploadInterrupter;return!!i||!(!t||t!==s)&&(this.logger.info("cancel send data"),this.sendMsgPieceAbort(`${s} transfer canceled`),this.datasToSend=[],this.uploadInterrupter.canceled=!0,this._handlePieceAck(this.bytesUploaded,0),this.emit(e.DC_PIECE_ACK,{seg_id:s,size:this.bytesUploaded,canceled:!0}),!0)}_sendDataSync(){if(this._checkIfNeedInterrupt()||0===this.datasToSend.length)return void(this.dataWriting=!1);this.dataWriting=!0;const t=this.datasToSend.shift();t?(this.bytesUploaded+=t.byteLength,this._datachannel.write(t,(t=>{if(t)return this.dataWriting=!1,this.logger.warn(t.message),void this.emit(e.DC_ERROR,!1);this._sendDataSync()}))):this.logger.error("sendDataSync data is undefined!")}sendImmediately(t){if(this._datachannel.connected)try{return this._datachannel.send(t),!0}catch(t){this.logger.warn(`datachannel ${this.channelId} send data failed, close it`),this.emit(e.DC_ERROR,!1)}return!1}sendMsgHave(t,s,i={}){const r=i.reverse||void 0;delete i.reverse,this.sendJson({event:r?e.DC_HAVE_REVERSE:e.DC_HAVE,sn:t,seg_id:s,...i})}sendPieceNotFound(t,s,i={}){this.uploading=!1,this.sendJson({event:e.DC_PIECE_NOT_FOUND,seg_id:s,sn:t,...i})}sendPeers(t){this.sendJson({event:e.DC_PEERS,peers:t})}sendPeersRequest(){this.sendJson({event:e.DC_GET_PEERS})}sendMsgStats(t,s={}){const i={event:e.DC_STATS,total_conns:t,...s};this.sendJson(i)}sendMsgPlaylist(t,s,i){const r=this.playlistMap.get(t);if(r&&r.seq>=i)return;const n={event:e.DC_PLAYLIST,url:t,data:s,seq:i};this.playlistMap.set(t,{data:s,seq:i}),this.sendJson(n)}sendMsgSignal(t,s,i){return this.sendJson({event:e.DC_PEER_SIGNAL,action:"signal",to_peer_id:t,from_peer_id:s,data:i})}sendMsgSignalReject(t,s,i,r=!1){return this.sendJson({event:e.DC_PEER_SIGNAL,action:"reject",to_peer_id:t,from_peer_id:s,reason:i,fatal:r})}sendMetaData(t,s,i,r,n=!1){this.isInitiator&&(this.timeSendRequest=performance.now()),this.sendJson({event:e.DC_METADATA,field:t,platform:e.DC_PLAT_WEB,mobile:!!W().isMobile(),mobile_net:n,channel:this.channel,version:"2.9.2",sequential:s,peers:i,region:r})}sendPartialBuffer(e,t,s={}){this.sendMsgPiece(e,s);for(let e=0;e<t.length;e++)this.send(t[e])}sendMsgPiece(e,t={}){const{targetSegId:s}=this.uploadInterrupter;if(s&&s===e.seg_id)return this.logger.info("cancel send piece msg"),this.sendMsgPieceAbort(`${s} piece canceled`),void(this.uploadInterrupter.canceled=!0);this.uploadInterrupter={currentSegId:e.seg_id,targetSegId:void 0,canceled:!1},this.datasToSend=[],this.bytesUploaded=0,e.ext||(e.ext={}),e.ext.from&&t.from&&(t.from=`${e.ext.from}->${t.from}`),t.incompletes&&e.ext.incompletes&&(t.incompletes+=e.ext.incompletes),t=Object.assign({},e.ext,t);const i={...e,ext:t};this.sendJson(i)}sendBuffer(t,s,i,r={}){const n=r.reverse||void 0;if(delete r.reverse,!i)return void this.logger.error("sendBuffer payload is undefined!");let o=i.byteLength,a=0,h=0;o%this.packetSize==0?h=o/this.packetSize:(h=Math.floor(o/this.packetSize)+1,a=o%this.packetSize);let l={event:e.DC_PIECE,attachments:h,seg_id:s,sn:t,level:r.level,size:o,reverse:n};delete r.level,this.sendMsgPiece(l,r);const c=function(e,t,s,i){let r=[];if(i){let n;for(let i=0;i<s-1;i++)n=e.slice(i*t,(i+1)*t),r.push(n);n=e.slice(e.byteLength-i,e.byteLength),r.push(n)}else{let i;for(let n=0;n<s;n++)i=e.slice(n*t,(n+1)*t),r.push(i)}return r}(i,this.packetSize,h,a);this._sendBufferArray(c,n),this.uploading=!1,this.timeSendPiece=performance.now()}get downloadNum(){return this.downloading?this.sendReqQueue.length+1:0}requestDataById(t,s,i=!1,r={}){const n={event:e.DC_REQUEST,seg_id:t,sn:s,...r,urgent:i};this.downloading?(this.logger.info(`${this.remotePeerId} add req ${t} in queue`),i?this.sendReqQueue.unshift(n):this.sendReqQueue.push(n)):this._realRequestData(n)}requestDataBySN(t,s=!1,i={}){const r={event:e.DC_REQUEST,sn:t,...i,urgent:s};this.downloading?(this.logger.info(`add req ${t} in queue`),s?this.sendReqQueue.unshift(r):this.sendReqQueue.push(r)):this._realRequestData(r)}_sendBufferArray(e,t=!1){const s=t?e.reverse():e;for(let e=0;e<s.length;e++)this.send(s[e])}_realRequestData(t){this.sendJson(t),this.timeSendRequest=performance.now(),this.downloading=!0,this.emit(e.DC_SEND_REQUEST)}shouldWaitForRemain(e){return 0!==this.bufArrSize&&(0!==this.timeReceivePiece&&this.currentLoadSpeed()>=this.minRequiredSpeed(e))}close(t){t||(this.notFatalClosed=!0),this.emit(e.DC_CLOSE,t)}receiveSignal(e){e&&this._datachannel.signal(e)}_notifyDownloadListenersAbort(e){for(let t of this.streamListeners){const{handler:s}=t;s(void 0,void 0,!0,e)}this.streamListeners=[]}destroy(t=!0){this.logger.info(`destroy datachannel ${this.channelId}`),this.chokeTimer&&clearTimeout(this.chokeTimer),this.connTimeout&&clearTimeout(this.connTimeout),this.uploading&&this.sendMsgPieceAbort("peer is closing"),this._notifyDownloadListenersAbort("upstream peer is closed");let s={event:e.DC_CLOSE,fatal:t};this.sendJson(s),this._datachannel.removeAllListeners(),this.removeAllListeners(),this._datachannel.destroy()}_handleBinaryMsg(t){const{attachments:s,level:i,reverse:r}=this.pieceMsg;this.listenerCount(e.DC_RESPONSE)>0&&this.bufArr.push(t),this._loadedBytes+=t.byteLength,this.remainAttachments--;let n=r?this.remainAttachments+1:s-this.remainAttachments;const o=0===this.remainAttachments;if(this.emit(e.DC_PIECE_DATA,this.bufSN,this.segId,t,n,o,this.pieceMsg),this.streamListeners.length>0)for(let e of this.streamListeners){const{handler:s}=e;s(this.bufSN,this.segId,!1,t,o)}if(o){if(this.streamListeners=[],this.timeSendRequest>0)if(this.super)this.weight=1;else{const e=this.expectedSize/(performance.now()-this.timeSendRequest);this.weight=this.weight>0?.6*this.weight+.4*e:e}this.sendJson({event:e.DC_PIECE_ACK,sn:this.bufSN,seg_id:this.segId,level:i,size:this.expectedSize,miss:this.miss||void 0}),this.timeSendRequest=0,this.timeReceivePiece=0,this._sendNextReq()||(this.downloading=!1),this._handleBinaryData(r)}}_sendNextReq(){if(this.sendReqQueue.length>0){const e=this.sendReqQueue.shift();return this.logger.info(`get msg from sendReqQueue ${JSON.stringify(e)}`),this._realRequestData(e),!0}return!1}_handlePlaylist(e){const{url:t,data:s,seq:i}=e;this.playlistMap.set(t,{data:s,seq:i})}getLatestPlaylist(e,t){if(!this.playlistMap.has(e))return null;const s=this.playlistMap.get(e);return s.seq<=t||s.seq>t+2?null:s}_handleMetadata(t){const{logger:s}=this;if(this.isInitiator){const e=performance.now()-this.timeSendRequest;e>0&&(this.weight=1e5/e,s.info(`handle Metadata from ${this.remotePeerId} initial weight ${this.weight}`)),this.timeSendRequest=0}const i=t.channel;if(this.channel!==i)return s.error(`peer channel ${i} not matched!`),void this.emit(e.DC_ERROR,!0);if(t.super){s.info(`got super peer ${this.remotePeerId}`),this.super=!0;const{token:i}=this.config;if(i&&t.token!==i)return s.warn(`super peer token ${t.token} not matched!`),void this.emit(e.DC_ERROR,!0)}t.region&&(this.region=t.region);switch(t.platform){case e.DC_PLAT_ANDROID:this.platform=e.DC_PLAT_ANDROID;break;case e.DC_PLAT_IOS:this.platform=e.DC_PLAT_IOS;break;case e.DC_PLAT_WEB:this.platform=e.DC_PLAT_WEB}if(this.mobile=t.mobile||!1,this.mobileNet=t.mobile_net||!1,this.mobileWeb=this.mobile&&this.platform===e.DC_PLAT_WEB||!1,this.sequential=t.sequential,s.info(`${this.remotePeerId} platform ${this.platform} sequential ${this.sequential}`),t.peers&&(this.peersConnected+=t.peers,s.info(`${this.remotePeerId} now has ${this.peersConnected} peers`)),this.emit(e.DC_METADATA,t),t.field&&!this.config.live&&t.sequential){const{field:e}=t;if(Array.isArray(e))this._handleField(e);else for(let t in e)this._handleField(e[t])}}_handleField(e){e.forEach((e=>{e>=0&&(e<this.startSN&&(this.startSN=e),e>this.endSN&&(this.endSN=e))}))}_handleStats(e){this.gotStatsTs=u();const t=e.total_conns;t>0&&this.peersConnected!==t&&(this.peersConnected=t,this.logger.info(`${this.remotePeerId} now has ${this.peersConnected} peers`)),e.level&&(this.currentLevel=e.level),e.pos&&(this.currentPos=e.pos)}_handleRequestMsg(t){if(this.dataExchangeTs=u(),this.uploading)return this.logger.warn(`${this.remotePeerId} is uploading when receive request`),void this.sendPieceNotFound(t.sn,t.seg_id,{level:t.level});this.uploading=!0,this.emit(e.DC_REQUEST,t)}_handlePieceAck(e,t){0!==this.timeSendPiece&&(this.uploadSpeed=Math.round(e/(performance.now()-this.timeSendPiece)*2),this.timeSendPiece=0,this.logger.info(`${this.remotePeerId} uploadSpeed is ${this.uploadSpeed}`)),t>0&&this.logger.warn(`peer ${this.remotePeerId} miss ${t}`)}_prepareForBinary(e,t,s,i){this.bufArr=[],this._loadedBytes=0,this.remainAttachments=e,this.segId=t,this.bufSN=s,this.expectedSize=i}_handleBinaryData(t=!1){if(this.listenerCount(e.DC_RESPONSE)>0){t&&this.bufArr.reverse();let s=o.l.concat(this.bufArr);const i=s.byteLength;if(i===this.expectedSize){let t=s.buffer;const i=new z(this.bufSN,this.segId,t,this.remotePeerId,this.pieceMsg.level);this.emit(e.DC_RESPONSE,i,this.weight)}else this.logger.error(`${this.segId} expectedSize ${this.expectedSize} != byteLength ${i}`)}this.segId="",this.bufArr=[]}checkIfNeedChoke(e=!1){const{logger:t}=this,s=performance.now()-this.timeSendRequest;if(!e&&s<1500)t.info(`duration ${s} no need choke`);else if(this.miss++,t.info(`${this.remotePeerId} miss ${this.miss}`),this.miss>2&&!this.choked){this.choked=!0;const e=30*this.miss;e<=150?(t.warn(`datachannel ${this.channelId} is choked`),this.chokeTimer=setTimeout((()=>{this.choked=!1,t.warn(`datachannel ${this.channelId} is unchoked`)}),1e3*e)):t.warn(`datachannel ${this.channelId} is choked permanently`)}}get bufArrSize(){return this.downloading?this.pieceMsg.attachments-this.remainAttachments:0}loadtimeout(){const{logger:e,pieceMsg:t}=this;return e.warn(`timeout while downloading from ${this.remotePeerId}, ${this.bufArrSize} of ${t.attachments} packets loaded`),this.checkIfNeedChoke(),!0}sendMsgPieceAbort(t){(this.uploading||0!==this.datasToSend.length)&&(this.uploading=!1,this.sendJson({event:e.DC_PIECE_ABORT,reason:t}))}loadedBytes(){return this._loadedBytes}currentLoadSpeed(){return 0===this.timeReceivePiece?0:this.loadedBytes()/(performance.now()-this.timeReceivePiece)}minRequiredSpeed(e){return(this.pieceMsg.size-this.loadedBytes())/e}}const G=j,V={DPlayer:"dplayer",CBPlayer:"cbplayer",jwplayer:"jwplayer",videojs:"videojs",Clappr:"clappr",ckplayer:"ckplayer",MediaElementPlayer:"mediaelement",MediaElement:"mediaelement",TcPlayer:"tcplayer",flowplayer:"flowplayer",Chimee:"chimee",ChimeePlayer:"chimee",HlsJsPlayer:"xgplayer",fluidPlayer:"fluidplayer",OpenPlayer:"openplayer",Plyr:"plyr",Playerjs:"playerjs",Aliplayer:"aliplayer",shaka:"shakaplayer"};function J(){let e;for(let t in V)if(self[t]){e=V[t];break}return e}const Q="nllL",Y="d3NzJ",X="==",K="TNBLy9z",Z="aWduY",ee="mNvbQ",te="WwuY2RuY";class se extends(n()){constructor(e={}){if(super(),this.p2pEnabled=!(!1===e.p2pEnabled||"0"===d("_p2p")),e.tag&&e.tag.length>20)throw new Error("Tag is too long");if(e.appName&&e.appName.length>30)throw new Error("appName is too long");if(e.appId&&e.appId.length>30)throw new Error("appId is too long");if(e.token&&e.token.length>20)throw new Error("Token is too long")}initLogger(){const{config:e}=this;e.showSlogan&&"en"==("zh-CN"===(navigator.language||navigator.userLanguage)?"cn":"en")&&console.log(`%cLet the browsers become your unlimitedly scalable CDN!\n%c${self.atob("aHR0cHM6Ly9zd2FybWNsb3VkLm5ldA==")}`,"color: dodgerblue; padding:20px 0; font-size: x-large","font-size: medium; padding-bottom:15px");const t=new O(e.logLevel);return e.logger=this.logger=t,t}getExtraForStats(){return{}}getExtraForPeersRequest(){const e={};return e.num_want=this._getNumWant(),e}_getNumWant(){const{tracker:e}=this;if(!e.scheduler)return;const t=e.scheduler.peersNum;return t>0&&e.maxConnsActive-t>0?e.maxConnsActive-t:void 0}makeChannelId(e,t){if(!e||"string"!=typeof e){const e="token is required while using customized channelId!";throw console.error(e),new Error(e)}return"function"==typeof t?(s,i)=>`${e}-${t(s,i)}`:()=>`${e}-${t}`}makeSignalId(){let e="";const{config:t}=this,s=decodeURIComponent(self.atob(Y+K+Z+te+Q+ee+X));t.signalConfig&&(t.wsSignalerAddr=t.signalConfig);const{wsSignalerAddr:i}=t;if(i){let r;"object"==typeof i?(i.main||(i.main=s),r=i.main):"string"==typeof i&&(r=i,t.wsSignalerAddr={main:r}),r===s&&(r=void 0),r&&!t.wsSignalerAddr.backup&&(e=h().parseURL(r).netLoc.substr(2))}else t.wsSignalerAddr={main:s,byDefault:!0};return e}get commonBrowserInfo(){const e=W().getPlatform(),t=W().getNetType()||"wifi";this.netType=t;const{main:s,backup:i,byDefault:r}=this.config.wsSignalerAddr||{};return{signal:r?void 0:s,signal2:i,device:e,netType:t,player:J()||void 0}}get isMobileNet(){return"wifi"!==this.netType&&"ethernet"!==this.netType}setupWindowListeners(e){const t=["iPad","iPhone"].indexOf(navigator.platform)>=0?"pagehide":"beforeunload",s=()=>{this.fetcher&&this.fetcher.postStatsWithBeacon(),this.p2pEnabled&&this.disableP2P(),self.removeEventListener(t,s)};e?self.removeEventListener(t,s):self.addEventListener(t,s)}destroy(){this.disableP2P(!0),this.removeAllListeners(),this.setupWindowListeners(!0)}enableP2P(){return this.p2pEnabled?null:(this.logger&&this.logger.info("enable P2P"),this.config.p2pEnabled=this.p2pEnabled=!0,this.browserInfo?(this._init(this.channel,this.browserInfo),this):null)}get version(){return se.version}static isSupported(){const e=p();return!(!e||void 0===e.RTCPeerConnection.prototype.createDataChannel)}static get TrackerZone(){return{EU:"eu",HK:"hk",USA:"us"}}determineHttpLoadTime(e){let t=2.5;if(e&&e.length>0){const s=e.length;t=s<=3?1:s<=4?1.5:s<=5?2:s<=8?2.5:3}return t}}se.version="2.9.2",se.protocolVersion=G.VERSION;const ie=se;function re(){if(!function(){if("undefined"!=typeof self)return self.ManagedMediaSource||self.MediaSource||self.WebKitMediaSource}())return!1;const e=self.SourceBuffer||self.WebKitSourceBuffer;return!e||e.prototype&&"function"==typeof e.prototype.appendBuffer&&"function"==typeof e.prototype.remove}let ne={wsMaxRetries:10,p2pEnabled:!0,wifiOnly:!1,memoryCacheLimit:{pc:419430400,mobile:104857600},dcDownloadTimeout:25,logLevel:"error",tag:"",webRTCConfig:{},token:void 0,appName:void 0,appId:void 0,prefetchNum:5,showSlogan:!0,trickleICE:!0,announceLocation:"eu",trackerZone:void 0,geoIpPreflight:!0,getStats:function(e,t,s){},getPeerId:function(e){},getPeersInfo:function(e){}};const oe={...ne,httpLoadTime:0,sharePlaylist:!1,useHttpRange:!0,hlsjsInstance:null,proxyOnly:!1,p2pBlackList:["vtt","webvtt","key"],live:!0,swFile:"./sw.js",swScope:"./",swAutoRegister:!0,mediaElem:void 0,httpStreamEnabled:!0,diskCacheLimit:{pc:262144e4,mobile:1572864e3},useDiskCache:!0,waitForPeer:!1,waitForPeerTimeout:4,strictSegmentId:!1},ae="store not init";function he(e){return new Promise(((t,s)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>s(e.error)}))}function le(e,t){return t?t("readonly",(t=>he(t.get(e)))):Promise.reject(ae)}function ce(e,t,s){return s?s("readwrite",(s=>(s.put(t,e),he(s.transaction)))):Promise.reject(ae)}function de(e,t){return t?t("readwrite",(t=>(t.delete(e),he(t.transaction)))):Promise.reject(ae)}function ue(e){return e?e("readwrite",(e=>(e.clear(),he(e.transaction)))):Promise.reject(ae)}function ge(e,t){return e.openCursor().onsuccess=function(){this.result&&(t(this.result),this.result.continue())},he(e.transaction)}const fe="size";class pe extends(n()){constructor(e,t){super(),this.name="SegmentStore",this.logger=t.logger,this.logger.info("use SegmentStore"),this.channel=e.channel;const s=e.browserInfo.device;this.isPC=s===W().device.PC_WEB||s===W().device.PC_NATIVE,this.maxBufSize=this.isPC?t.diskCacheLimit.pc:t.diskCacheLimit.mobile,this.overflowed=!1,this.loadingSN=0}async setupStore(){if(navigator.storage&&navigator.storage.estimate){const e=await navigator.storage.estimate(),t=Math.floor(e.quota-e.usage);t<this.maxBufSize&&(this.maxBufSize=t-104857600)}return new Promise((async(e,t)=>{if(this.isPC&&this.maxBufSize<419430400||!this.isPC&&this.maxBufSize<104857600)return void t("disk storage not enough");const s=["segments","id2Sn","metadata"];let i;try{i=function(e,t){const s=indexedDB.open(e);s.onupgradeneeded=()=>{const e=s.result;t.forEach((t=>{e.createObjectStore(t)}))};const i=he(s);return t.map((e=>(t,s)=>i.then((i=>s(i.transaction(e,t).objectStore(e))))))}(this.channel,s)}catch(e){return void t(e)}this.segmentsStore=i[0],this.id2SnStore=i[1],this.metaStore=i[2];const r=setTimeout((()=>{t("setupStore timeout")}),500);this._initMetaStore().then((()=>{clearTimeout(r),e()})).catch((e=>{t(e)}))}))}_initMetaStore(){return this.logger.info("init MetaStore size"),ce(fe,0,this.metaStore)}currBufSize(){return le(fe,this.metaStore)}async hasSegOfId(e){if(!e)return Promise.resolve(!1);const t=await le(e,this.id2SnStore);return new Promise(((s,i)=>{void 0!==t?le(t,this.segmentsStore).then((t=>{t&&t.length>0&&t.some((t=>t.segId===e))?s(!0):s(!1)})).catch((e=>{this.logger.error(e),s(!1)})):s(!1)}))}async getSegById(e){if(!e)return null;const t=await le(e,this.id2SnStore);return new Promise(((s,i)=>{void 0!==t?le(t,this.segmentsStore).then((t=>{if(t&&t.length>0){const i=t.find((t=>t.segId===e));if(!i)return void s(null);if(!v(i.data))return this.logger.error(`getSegById ${i.sn} is not buffer`),void s(null);s(z.fromSegment(i))}else s(null)})).catch((e=>{this.logger.error(e),s(null)})):s(null)}))}getSegIdBySN(e){return new Promise(((t,s)=>{le(e,this.segmentsStore).then((e=>{e&&e.length>0?t(e[0].segId):t(null)})).catch((e=>{this.logger.error(e),t(null)}))}))}putSeg(t){const{logger:s}=this;v(t.data)?this._addSeg(t).then((t=>{this.emit(`${e.BM_ADDED_SN_}${t.sn}`,t),this.emit(e.BM_SEG_ADDED,t)})).catch((e=>{e&&(s.error(e),("QuotaExceededError"===e.name||e.inner&&"QuotaExceededError"===e.inner.name)&&this._trimDisk(!0))})):s.error(`putSeg ${t.sn} is not buffer`)}_addSeg(e){const{segId:t,sn:s}=e;return ce(t,s,this.id2SnStore),new Promise(((i,r)=>{le(s,this.segmentsStore).then((n=>{n?0===n.filter((e=>e.segId===t)).length&&(n.push(this._segmentToCache(e)),ce(s,n,this.segmentsStore).then((()=>{this._increaseBufSize(e.data.byteLength),i(e)})).catch((e=>{r(e)}))):ce(s,[this._segmentToCache(e)],this.segmentsStore).then((()=>{this._increaseBufSize(e.data.byteLength),i(e)})).catch((e=>{r(e)}))})).catch((e=>{r(e)}))}))}async _trimDisk(t=!1){let s=this.maxBufSize;const{logger:i}=this;let r=await this.currBufSize();var n;(t&&(s=r-104857600,s<0&&(s=0)),r<s)||(n=this.segmentsStore,n?n("readonly",(e=>{if(e.getAllKeys)return he(e.getAllKeys());const t=[];return ge(e,(e=>t.push(e.key))).then((()=>t))})):Promise.reject(ae)).then((async t=>{const n=t.sort(((e,t)=>e-t));let o=0;do{if(o++>10){console.error("too much loops in SegmentStore");break}const t=n.shift();if(void 0===t){i.error("lastSN not found");continue}if(t>=this.loadingSN){i.warn(`trimDisk failed, loadingSN ${this.loadingSN}`);break}const s=n[0],a=await le(t,this.segmentsStore);if(!a){i.warn("lastSeg not found");continue}let h=0;a.forEach((e=>{h+=e.data.byteLength})),de(t,this.segmentsStore).then((()=>{this._decreaseBufSize(parseInt(h))})),a.forEach((r=>{de(r.segId,this.id2SnStore),i.info(`pop seg ${r.segId} size ${r.data.byteLength}`),this.emit(e.BM_LOST,{sn:t,segId:r.segId,next:s,level:r.level})})),r-=h,i.info(`pop sn ${t} size ${h} currBufSize ${r}`),this.overflowed||(this.overflowed=!0)}while(r>=s)}))}_decreaseBufSize(e){le(fe,this.metaStore).then((t=>{t&&ce(fe,t-e,this.metaStore)})).catch((e=>{this.logger.error(e)}))}_increaseBufSize(e){le(fe,this.metaStore).then((t=>{ce(fe,t+e,this.metaStore),this._trimDisk()})).catch((e=>{this.logger.error(e)}))}_segmentToCache(e){return{data:e.data,level:e.level,segId:e.segId,sn:e.sn}}clear(){this.logger.warn("clear segment store");try{this._clearDisk()}catch(e){}}_clearDisk(){ue(this.segmentsStore),ue(this.id2SnStore),ue(this.metaStore)}destroy(){this.clear(),this.removeAllListeners()}}const me=pe;class _e extends(n()){constructor(e,t){super(),this.name="SegmentCache",this.logger=t.logger,this.logger.info("use SegmentCache");const s=e.browserInfo.device;if(this.maxBufSize=s===W().device.PC_WEB||s===W().device.PC_NATIVE?t.memoryCacheLimit.pc:t.memoryCacheLimit.mobile,t.live)this.maxBufSize=31457280;else{if(0===this.maxBufSize)throw new Error("cannot use SegmentCache");const e=function(){const{memory:e}=performance;return e?e.jsHeapSizeLimit-e.usedJSHeapSize:-1}();e>=0&&e<this.maxBufSize&&(this.maxBufSize=e-31457280)}this._segPool=new Map,this._currBufSize=0,this.id2Sn=new Map,this.overflowed=!1,this.loadingSN=0}get currBufSize(){return this._currBufSize}hasSegOfId(e){return new Promise(((t,s)=>{const i=this.id2Sn.get(e);this._segPool.has(i)?t(this._segPool.get(i).some((t=>t.segId===e))):t(!1)}))}getSegById(e){const t=this.id2Sn.get(e);return new Promise(((s,i)=>{if(!this._segPool.has(t))return void s(null);s(this._segPool.get(t).find((t=>t.segId===e)))}))}getSegIdBySN(e){return new Promise(((t,s)=>{if(this._segPool.has(e)){t(this._segPool.get(e)[0].segId)}else t(null)}))}_calSegPoolSize(){let e=0;return this._segPool.forEach((t=>{t.forEach((t=>{e+=t.size}))})),e}putSeg(e){this._currBufSize>=1.5*this.maxBufSize&&(this._currBufSize=this._calSegPoolSize(),this._currBufSize>=1.5*this.maxBufSize&&(this.clear(),this.overflowed=!1)),v(e.data)?this._addSeg(e):this.logger.error(`putSeg ${e.sn} is not buffer`)}_addSeg(t){const{logger:s}=this,{segId:i,sn:r,size:n}=t;if(this.id2Sn.set(i,r),this._segPool.has(r)){this._segPool.get(r).push(t)}else this._segPool.set(r,[t]);this._currBufSize+=parseInt(n);const o=this._segPool.size;if(this.emit(`${e.BM_ADDED_SN_}${t.sn}`,t),this.emit(e.BM_SEG_ADDED,t),this._currBufSize<this.maxBufSize||o<=5)return;const a=Array.from(this._segPool.keys()).sort(((e,t)=>e-t));let h=0;do{if(h++>10){console.error("too much loops in SegmentCache");break}const t=a.shift();if(void 0===t){s.error("lastSN not found");continue}const i=a[0],r=this._segPool.get(t);if(!r){s.error("lastSeg not found");continue}let n=0;r.forEach((e=>{n+=e.size})),this._currBufSize-=parseInt(n),this._segPool.delete(t),r.forEach((s=>{this.id2Sn.delete(s.segId),this.emit(e.BM_LOST,{sn:t,segId:s.segId,next:i,level:s.level})})),s.info(`pop sn ${t} size ${n} currBufSize ${this._currBufSize}`),this.overflowed||(this.overflowed=!0)}while(this._currBufSize>=this.maxBufSize&&this._segPool.size>5)}clear(){this.logger.warn("clear segment cache"),this._segPool.clear(),this.id2Sn.clear(),this._currBufSize=0}destroy(){this.clear(),this.removeAllListeners()}}const ye=_e;class Se extends ie{constructor(e={}){super(e),e.validateSegment||(e.validateSegment=function(e,t){return!0}),this.config=Object.assign({},oe,e),this.rangeTested=!1,this.lastLevel=0,this.multiBitrate=!1}setup(){let{token:e,channelId:t}=this.config,s=e=>{const t=h().parseURL(e);return`${t.netLoc.substr(2)+t.path.substring(0,t.path.lastIndexOf("."))}`};t&&(s=this.makeChannelId(e,t));return{channelIdMaker:s,signalId:this.makeSignalId(),browserInfo:{...this.commonBrowserInfo,tag:this.config.tag||void 0}}}setupElectron(){this.browserInfo.device===U.device.PC_NATIVE&&(this.browserInfo={...this.browserInfo,app:this.config.appName,bundle:this.config.appId})}getExtraForStats(){const e=super.getExtraForStats();return!this.config.live&&this.media&&(e.pos=Math.round(this.media.currentTime)),this.multiBitrate&&this.currentLevel!==this.lastLevel&&(e.level=this.currentLevel+"",this.lastLevel=this.currentLevel),e}getExtraForPeersRequest(){const e=super.getExtraForPeersRequest();return this.multiBitrate&&(e.level=this.currentLevel+""),e}destroy(){super.destroy()}async initSegmentManager(){const{logger:e,config:t}=this;if(self.indexedDB&&t.useDiskCache&&!t.live){const s=new me(this,t);try{await s.setupStore(),this.bufMgr=s}catch(s){e.warn(s),this.bufMgr=new ye(this,t)}}else this.bufMgr=new ye(this,t);if(this.bufMgr.maxBufSize<=0)throw new Error("bufMgr state is invalid")}getTagForVod(){const e=`${(0,U.getBrowser)()}${_()?"s":""}`;return this.bufMgr?`${e}_${"SegmentStore"===this.bufMgr.name?"d":"m"}`:e}}var ve=s(485),Pe=s.n(ve),be=s(934),we=s.n(be);const Ee=e=>{const t=localStorage.getItem(e);try{const e=JSON.parse(t);return e.value?e.value:e}catch(e){return t}},Ce=(e,t,s)=>{((e,t)=>{"object"==typeof t&&(t=JSON.stringify(t)),localStorage.setItem(e,t)})(e,{value:t,duration:s,startTime:Date.now()})};class Ie{constructor(){this.p2p=0,this.share=0,this.http=0}recordP2p(e){this.p2p+=e}recordShare(e){this.share+=e}recordHttp(e){this.http+=e}resetTraffic(){this.p2p=0,this.share=0,this.http=0}get healthRatio(){if(0===this.http)return 1e3;let e=Math.round((this.p2p+this.share)/this.http*100);return e<=0&&(e=1),e}}const Te="SW_GEOIP_KEY",Le="TRACKER_EXPT",Re="IPAPI_ERROR",De="ZXU",Ae="uY2R",Me="LmNv",Ne="uYnll",ke="bQ==",Oe="aGsuc3d",$e="hcm1j",Be="bG91ZC",xe="5uZXQ=",qe=Symbol("httpDownloaded"),Fe=Symbol("p2pDownloaded"),He=Symbol("p2pUploaded");class ze extends(n()){constructor(e,t,s,i,r){let n;super(),this.config=e.config;let o=this.config.announceLocation;switch(this.config.trackerZone&&(o=this.config.trackerZone),o){case"hk":n=Oe+$e+Be+xe;break;case"us":n="dXMuaGR0dmNsb3VkLmNvbQ==";break;default:n=De+Ae+Ne+Me+ke}this.engine=e,this.key=t||void 0,this.baseUrl=i||`https://${self.atob(n)}/v1`,this.channelId=self.btoa(s),this.timestamp=u(),this.health=new Ie;const a=h().parseURL(this.baseUrl).netLoc;this.announce=a.replace(/\/\//,"");const l=function(e,t,s,i,r,n){let o=location.hostname;"localhost"===o&&n&&(o=`${n}.${o}`);function a(e,t,s,i,r,n){return Pe()(e+t+s+i+r,n)}const h=a(o,t,s,i,r,e);return h.substr(0,8)}(this.timestamp,"2.9.2",this.announce,this.channelId,r.type,this.key);this.native=!!r.bundle,this.announceInfo={...r,channel:this.channelId,ts:this.timestamp,version:"2.9.2",v:l,announce:this.announce,k:We(this.key)},this.announceURL=`${this.baseUrl}/channel`,this.reportFails=0,this.statsRequesting=!1,this.forbidden=!1,this.failConns=0,this.totalHTTPDownloaded=0,this.totalP2PDownloaded=0,this.totalP2PUploaded=0,this[qe]=0,this[Fe]=0,this[He]=0,this.speed=0,this.offline=!1,this.errsBufStalled=0,this.mediaRequests=0,this.errsInternalExpt=0}geoipRequest(){const{logger:e}=this.engine;return new Promise(((t,s)=>{if((e=>{const t=localStorage.getItem(e);try{const e=JSON.parse(t);return!(!e.duration||!e.startTime)&&Date.now()-e.startTime<e.duration}catch(e){return!1}})(Te)){const s=Ee(Te);e.info("found local geo data"),t(s)}else fetch(self.atob("aHR0cHM6Ly9wcm8uaXAtYXBpLmNvbS9qc29uP2ZpZWxkcz0yMTgxODI2JmtleT1YT3BpYW5zUmdZeEdUaG8=")).then((e=>e.json())).then((e=>{if("success"!==e.status){const t=new Error(`preflight status ${e.status}`);throw we()(t,Re)}{const s=e.mobile?432e5:2592e5;Ce(Te,e,s),t(e)}})).catch((e=>{s(e)}))}))}btAnnouncePreflight(){const{logger:e}=this.engine;return this.announceInfo.asn?this.btAnnounce():(e.info("preflight ip-api"),Promise.race([this.geoipRequest(),new Promise(((e,t)=>{setTimeout((()=>{t(we()(new Error("request timeout"),Re))}),600)}))]).then((e=>(this._parseGeoResponse(e),this.btAnnounce()))).catch((t=>{if(t.code!==Le){const t=Ee(Te);return t&&(e.info("use expired ipData"),this._parseGeoResponse(t)),this.btAnnounce()}throw t})))}_parseGeoResponse(e){const{lat:t,lon:s,isp:i,as:r,mobile:n,countryCode:o,continentCode:a}=e;n&&(this.announceInfo.netType="cellular");const h=r.split(" ")[0].substr(2);this.announceInfo={...this.announceInfo,lat:t,lon:s,isp:i,asn:h,country:o}}btAnnounce(){const{logger:e}=this.engine;return this.announceInfo.tag||(this.announceInfo.tag=`${(0,U.getBrowser)()}${_()?"s":""}`),new Promise(((t,s)=>{fetch(this.announceURL,{headers:this._requestHeader,method:"POST",body:JSON.stringify(this.announceInfo)}).then((e=>{if(!e.ok){const t=e.status>=500&&e.status<600;throw we()(new Error(`server response code is ${e.status}`),Le,{retry:t})}return e.json()})).then((e=>{if(!this.engine)throw we()(new Error("runtime error"),Le,{retry:!1});const s=e.data;if(s.f&&(this.forbidden=!0),-1===e.ret){const{code:t,msg:s}=e.data;throw we()(new Error(s),Le,{retry:t>=5e3})}s.info&&console.info(`${s.info}`),s.warn&&console.warn(`${s.warn}`),s.min_conns||(s.min_conns=8),(!s.rejected||s.rejected&&s.share_only)&&s.id&&s.report_interval&&s.peers?(this.peerId=this.id=s.id,s.report_interval<20&&(s.report_interval=20),this.btStats(s.report_interval),this.getPeersURL=`${this.baseUrl}/channel/${this.channelId}/node/${this.peerId}/peers`,this.statsURL=`${this.baseUrl}/channel/${this.channelId}/node/${this.peerId}/stats`,t(s)):this.engine&&(this.engine.p2pEnabled=!1)})).catch((t=>{e.error(`btAnnounce error ${t}`),s(we()(t,t.code,{retry:t.retry}))}))}))}btStats(e=10){this.heartbeater=setInterval((()=>{this.postStats()}),1e3*e)}postStatsWithBeacon(){if(this.offline)return;this.offline=!0;let e={off:!0};this.statsRequesting||(e={...e,...this._makeStatsBody()}),this.statsURL&&navigator.sendBeacon&&navigator.sendBeacon(this.statsURL,JSON.stringify(e))}postStats(){const{logger:t}=this.engine;this.statsRequesting=!0,fetch(this.statsURL,{method:"POST",body:JSON.stringify(this._makeStatsBody())}).then((e=>(this.statsRequesting=!1,this.reportFails=0,e.text()))).then((s=>{let i;if(i=s?JSON.parse(s):{ret:0,data:{}},-1===i.ret)clearInterval(this.heartbeater),t.error(`${i.data.msg} code ${i.data.code}`),this.engine.emit(e.RESTART_P2P);else{const{http:e=0,p2p:t=0,share:s=0,failConns:i=0,rebuffers:r=0,requests:n=0,errsInternalExpt:o=0}=this.lastStats||{};this[qe]>=e&&(this[qe]-=e),this[Fe]>=t&&(this[Fe]-=t),this[He]>=s&&(this[He]-=s),this.failConns>=i&&(this.failConns-=i),this.errsBufStalled>=r&&(this.errsBufStalled-=r),this.mediaRequests>=n&&(this.mediaRequests-=n),this.errsInternalExpt>=o&&(this.errsInternalExpt-=o),this.exptMsg&&(this.exptMsg=void 0)}})).catch((e=>{t.error(`btStats error ${e}`),this.statsRequesting=!1,this.reportFails++,this.reportFails>=3&&clearInterval(this.heartbeater)}))}btGetPeers(e,t=!1){const{logger:s}=this.engine,{asn:i,country:r}=this.announceInfo;let n={exclusions:e,asn:i,country:r,ratio:this.health.healthRatio,urgent:t||void 0},o={};return this.engine.getExtraForPeersRequest&&(o=this.engine.getExtraForPeersRequest()),n=Object.assign({},n,o),new Promise(((e,t)=>{this.reportFails>=3?t(new Error("reportFails >= 3")):fetch(this.getPeersURL,{headers:this._requestHeader,method:"POST",body:JSON.stringify(n)}).then((e=>e.json())).then((s=>{-1===s.ret?t(s.data.msg):e(s.data)})).catch((e=>{s.error(`btGetPeers error ${e}`),t(e)})).finally((()=>{this.health.resetTraffic()}))}))}increFailConns(){this.failConns++}increRebuffers(){this.errsBufStalled++}increMediaRequests(){this.mediaRequests++}reportFlow(e){const t=Math.round(e/1024);this[qe]+=t,this.totalHTTPDownloaded+=t,this.health.recordHttp(t),this._emitStats()}reportDCTraffic(e,t){const s=Math.round(e/1024);this[Fe]+=s,this.totalP2PDownloaded+=s,this.health.recordP2p(s),this.speed=Math.round(t),this._emitStats()}reportUploaded(e=0){const t=Math.round(e/1024);this.totalP2PUploaded+=t,this.health.recordShare(t),this[He]+=t,this._emitStats()}destroy(){const{logger:e}=this.engine;e.warn("destroy fetcher"),this.removeAllListeners(),clearInterval(this.heartbeater)}_emitStats(){this.engine.emit("stats",{totalHTTPDownloaded:this.totalHTTPDownloaded,totalP2PDownloaded:this.totalP2PDownloaded,totalP2PUploaded:this.totalP2PUploaded,p2pDownloadSpeed:this.speed});const e=this.config.getStats;e&&"function"==typeof e&&e(this.totalP2PDownloaded,this.totalP2PUploaded,this.totalHTTPDownloaded,this.speed)}_makeStatsBody(){const{asn:e,country:t}=this.announceInfo;let s={totalConns:this.engine.tracker.totalConns,failConns:this.failConns,rebuffers:this.errsBufStalled||void 0,requests:this.mediaRequests||void 0,errsInternalExpt:this.errsInternalExpt,http:Math.round(this[qe])||0,p2p:Math.round(this[Fe])||0,share:Math.round(this[He])||0,asn:e,country:t},i={};this.engine.getExtraForStats&&(i=this.engine.getExtraForStats()),s=Object.assign({},s,i),this.lastStats=JSON.parse(JSON.stringify(s)),Object.keys(s).forEach((e=>{0===s[e]&&delete s[e]}));const{logger:r}=this.engine;return r.isDebugLevel&&r.info(`report ${JSON.stringify(s)}`),this.exptMsg&&(s.exptMsg="2.9.2 "+this.exptMsg),s}get _requestHeader(){let e={};return this.native&&(e={...e,"X-SW-Key":We(this.key),"User-Agent":"electron","X-SW-ID":this.announceInfo.bundle}),e}}const Ue=ze;function We(e){if(!e)return;const t="C@K<#q";let s="";const i=t.length;for(let r=0;r<e.length;r++){const n=e.charCodeAt(r)^t.charCodeAt(r%i);s+=String.fromCharCode(n)}return self.btoa(s)}class je extends(n()){constructor(e,t){super(),this.logger=e,t.startsWith("wss")?this.addr=t.replace("wss","https"):t.startsWith("ws")&&(this.addr=t.replace("ws","http")),this.connected=!1,this.retryCount=0,this.closed=!1,this.msgQueue=[],this.posting=!1}start(){this.closed=!1,this._hello((()=>{this._longPolling()}))}_hello(e){fetch(this.addr+"&hello",{method:"POST"}).then((e=>{if(!e.ok)throw new Error("hello response was not ok");return e.json()})).then((t=>{this.connected=!0,e(),this.onopen&&this.onopen(t.ver)})).catch((e=>{this.closed=!0,this.onerror&&this.onerror(e)}))}send(e){this.msgQueue.push(e),this.posting||this._realSend([...this.msgQueue])}_realSend(e){0!==e.length&&(this.posting=!0,this.msgQueue=[],fetch(this.addr,{method:"POST",body:JSON.stringify(e)}).then((()=>{this.posting=!1,this.msgQueue.length>0&&this._realSend([...this.msgQueue])})).catch((e=>{this.logger.error(e),this.posting=!1})))}close(){this.connected&&(this.closed=!0,this.connected=!1,this.abortController&&this.abortController.abort(),this.onclose&&this.onclose())}destroy(){this.close(),this.removeAllListeners()}_longPolling(){if(this.closed)return;this.abortController=new AbortController;const e=this.abortController.signal;fetch(this.addr,{signal:e}).then((e=>{if(!e.ok)throw new Error("polling response was not ok");return e.text()})).then((e=>{e&&this.onmessage&&this.onmessage(JSON.parse(e)),this.retryCount=0,this._longPolling()})).catch((e=>{this.connected&&(this.retryCount<=3?(this.retryCount++,this._longPolling()):(this.connected=!1,this.onerror&&this.onerror(e)))}))}}const Ge=class{constructor(e,t,s,i,r="main"){this.logger=e,this.config=t,this.wsAddr=s,this.serverVersion=0,this.pingInterval=i||60,this.name=r,this.normalClosed=!1,this.pollingClient=new je(e,s);try{this._ws=this._init()}catch(t){e.error(t),this._startPolling()}}_init(){const e={maxRetries:this.config.wsMaxRetries,minReconnectionDelay:g(1e4,6e4),maxReconnectionDelay:6e5,maxEnqueuedMessages:20};let t=new A(this.wsAddr,void 0,e);return t.addEventListener("open",(()=>{this.logger.info(`signal ${this.name} ${this.wsAddr} connection opened`),this.normalClosed=!1,this.pollingClient.connected?this.pollingClient.close():(this.onopen&&this.onopen(),this._startPing(this.pingInterval))})),t.push=t.send,t.send=e=>{let s=JSON.stringify(e);t.push(s)},t.addEventListener("message",(e=>{let t=e.data;const s=JSON.parse(t),i=s.action;if("pong"!==i){if("ver"!==i)return"close"===i?(this.logger.warn(`server close signal ${this.name} reason ${s.reason}`),void this.close()):void(this.onmessage&&this.onmessage(s,this.name));this.serverVersion=s.ver}else clearTimeout(this.pongTimer)})),t.addEventListener("close",(e=>{this.logger.warn(`signal ${this.name} ${this.wsAddr} closed ${e.code} ${e.reason}`),e.code>=5e3||e.code<4e3?(this.onclose&&this.onclose(),this._stopPing()):this.close()})),t.addEventListener("error",(e=>{this._stopPing(),this.onerror&&this.onerror(e),this._startPolling()})),t}_startPolling(){this.pollingClient.connected||(this.logger.info("start polling"),this.pollingClient.start(),this._setupPolling(this.pollingClient))}sendSignal(e,t){const s={action:"signal",to_peer_id:e,data:t};this._send(s)}sendReject(e,t,s){const i={action:"reject",to_peer_id:e,reason:t,fatal:s};this._send(i)}_send(e){this.pollingClient.connected?this.pollingClient.send(e):this._ws&&this._ws.send(e)}_startPing(e=120){this.connected&&(this.pingTimer=setInterval((()=>{const e={action:"ping"};this._ws&&this._ws.send(e),this.serverVersion>=22&&this._waitForPong()}),1e3*e))}_waitForPong(){this.pongTimer=setTimeout((()=>{this.logger.warn(`signal ${this.name} wait for pong timeout, reconnect`),this.close(),this.reconnect()}),15e3)}_resetPing(){this._stopPing(),this._startPing(this.pingInterval)}_stopPing(){clearInterval(this.pingTimer),clearTimeout(this.pongTimer),this.pingTimer=null,this.pongTimer=null}close(){this.logger.info(`close signal ${this.name}`),this._stopPing(),(()=>{this._ws&&this._ws.close(1e3,"normal close")})(),this.pollingClient.close(),this.normalClosed=!0}reconnect(){this._ws&&(this.logger.info(`reconnect signal ${this.name}`),this._ws.reconnect())}destroy(){this.close(),this._ws=null,this.pollingClient.destroy()}get connected(){return!!this.pollingClient.connected||this._connected}get _connected(){return!!this._ws&&this._ws.readyState===A.OPEN}_setupPolling(e){e.onopen=e=>{e&&(this.serverVersion=e),this.logger.info("polling opened"),this.onopen&&this.onopen()},e.onerror=e=>{this._connected||this.onerror&&this.onerror(e)},e.onclose=()=>{this._connected||this.onclose&&this.onclose()},e.onmessage=e=>{if(this.onmessage)for(let t of e)this.onmessage(t,this.name)}}};const Ve=function(e,t,s=40){var i=null,r=!1,n=s;return function(s=!1){if(s)return clearTimeout(i),void(r=!1);r||(r=!0,i=setTimeout((function(){e.call(t,n),r=!1,i=null}),1e3*n),n*=1.1)}};class Je{constructor(e,t,s=15){this.engine=e,this.config=t,this.trickle=t.waitForPeer,this.poolSize=s,this.pool=[];for(let e=0;e<s;e++)this.pool.push(this._createPeer());this.timer=setTimeout((()=>{this.destroy()}),2e4)}_createPeer(){return new G(this.engine,void 0,void 0,!0,this.config,{trickle:this.trickle})}get size(){return this.pool.length}getPeer(){return 0===this.size?this._createPeer():this.pool.shift()}destroy(){for(let e of this.pool)e.destroy(!0);this.pool=[],clearTimeout(this.timer)}}class Qe extends(n()){constructor(e,t,s,i){super(),this.engine=e,this.logger=e.logger,this.config=i,this.connected=!1,this.scheduler=s,this.sequential=this.scheduler.sequential,this.DCMap=new Map,this.failedDCSet=new Set,this.notFoundDCSet=new Set;const r=W().isMobile();this.peerPool=new Je(e,i,r?10:15),this.signalerWs=null,this.fetcher=t,this.peers=[],this.requestPeersQueue=[],this.minConns=5,this.stuns=[],this.requestMorePeers=Ve(this._requestMorePeers,this),this.maxConns=r?15:22,this.maxConnsActive=r?10:13,this.peersIncrement=0,this.gotPeersFromTracker=!1,this.requestPeersWaitCount=0,this.fuseRate=-1,this.overloaded=!1}get totalConns(){return this.scheduler.peersNum+1}resumeP2P(){if(!this.fetcher)return;const{engine:t,config:s,fetcher:i}=this,{btAnnounce:r,btAnnouncePreflight:n}=i,{wsSignalerAddr:o,wifiOnly:a,geoIpPreflight:h,getPeerId:l}=s;(h?n:r).call(i).then((e=>{if(!this.scheduler)return;t.peerId=this.peerId=e.id,this.minConns=e.min_conns,this.scheduler.minConns=this.minConns;const s=e.peers;this.scheduler.notifyPeersLoaded(s.length),t.netType=i.announceInfo.netType,(e.wifi_only||a)&&t.isMobileNet&&(this.scheduler.downloadOnly=!0,this.logger.info("downloadOnly mode")),e.overload&&(this.overloaded=!0,this.logger.warn("server is overloaded, degrade"));const r=o.main;let n=o.backup;e.signal&&!e.signal2&&(n=void 0),this.signalerWs=this._initSignalerWs(e.signal||r,e.signal2||n,e.token,e.token2),0===s.length?this.requestMorePeers():this.peers=this._filterPeers(s),t.emit("peerId",this.peerId),l&&"function"==typeof l&&l(this.peerId),e.stun&&e.stun.length>0&&(this.stuns=e.stun),e.debug&&(this.logger.enableDebug(),e.log_url&&(this.logUploader=new N(e.log_url,location.hostname,this.peerId,"2.9.2"),this.logger.setUploader(this.logUploader))),t.onTrackerResume&&t.onTrackerResume(e),e.fuse_rate&&(this.fuseRate=e.fuse_rate),this.logger.info(`announce request response ${JSON.stringify(e,null,2)}`)})).catch((s=>{if(this.scheduler&&("TRACKER_EXPT"===s.code&&t.emit(e.EXCEPTION,s),this.scheduler.notifyPeersLoaded(0),s.retry)){const e=g(15e3,4e4);this.logger.warn(`announce retry after ${e}ms`),this.announceTimer=setTimeout((()=>{this.resumeP2P()}),e)}}))}stopP2P(){this.fetcher.postStatsWithBeacon(),this.fetcher.destroy(),this.fetcher=null,this.requestMorePeers(!0),this.scheduler.destroy(),this.scheduler=null,this.signalerWs&&(this.signalerWs.destroy(),this.signalerWs=null),this.peers=[];for(let e of this.DCMap.values())e.destroy(!0);this.DCMap.clear(),this.peerPool.destroy(),this.peerPool=null,this.failedDCSet.clear(),this.notFoundDCSet.clear(),this.logUploader&&(this.logUploader.destroy(),this.logUploader=null),this.logger.warn("tracker stop p2p")}destroy(){this.stopP2P(),this.removeAllListeners(),clearTimeout(this.announceTimer),clearTimeout(this.requestPeersTimer);const{config:e}=this;e.getStats=e.getPeerId=e.getPeersInfo=null,this.logger.warn("destroy tracker")}_filterPeers(e){const t=[],s=[...this.DCMap.keys(),...this.failedDCSet.keys(),this.peerId];return e.filter((e=>!s.includes(e.id))).forEach((e=>{t.push({id:e.id,intermediator:e.intermediator})})),t}_tryConnectToAllPeers(){if(0!==this.peers.length&&this.signalerWs.connected)for(this.logger.info(`try connect to ${this.peers.length} peers`);this.peers.length>0&&!(this.DCMap.size>=this.maxConnsActive);){let e=this.peers.shift();const t=e.intermediator;this.logger.debug(`new DataChannel ${e.id} intermediator ${t}`),this._createDatachannel(e.id,!0,t)}}_setupDC(t){t.on(e.DC_SIGNAL,((e,s)=>{const i=t.remotePeerId;if(t.intermediator){const s=this.DCMap.get(t.intermediator);if(s){if(s.sendMsgSignal(i,this.peerId,e))return;this.logger.warn(`intermediator ${t.intermediator} relay failed`)}}this.signalerWs.sendSignal(i,e,t.signalName)})).on(e.DC_PEER_SIGNAL,(e=>{const s=e.to_peer_id,i=e.from_peer_id,r=e.action;if(s&&i&&r)if(s!==this.peerId){this.logger.info(`relay signal for ${i}`);const n=this.DCMap.get(s);if(n){if("signal"!==r)return void n.sendMsgSignalReject(s,i,e.reason,e.fatal);if(n.sendMsgSignal(s,i,e.data))return}t.sendMsgSignal(i,s)}else"signal"===r?this._handleSignalMsg(i,e,t.remotePeerId):this._handSignalRejected(i,e)})).on(e.DC_GET_PEERS,(()=>{const e=u(),s=this.scheduler.getPeers().filter((e=>e.peersConnected<(e.mobileWeb?15:22)&&!e.super));if(s&&s.length>0){const i=[];s.forEach((s=>{if(s.remotePeerId===t.remotePeerId||s.remotePeerId===this.peerId)return;if(!this.config.live&&(s.currentPos-t.currentPos>600||s.currentPos<t.currentPos))return;e-s.timeJoin>50&&i.push({id:s.remotePeerId,region:s.region||void 0})})),this.logger.info(`send ${i.length} peers to ${t.remotePeerId}`),t.sendPeers(i)}})).on(e.DC_PEERS,(e=>{const s=e.peers;this.logger.info(`receive ${s.length} peers from ${t.remotePeerId}`),s&&s.length>0&&(s.forEach((e=>{e.intermediator=t.remotePeerId,e.region||(e.region={})})),this.requestPeersQueue.push(...s)),this.requestPeersWaitCount--,this.requestPeersWaitCount<=0&&this._handleRequestedPeers()})).once(e.DC_ERROR,(e=>{this.logger.info(`datachannel ${t.channelId} failed fatal ${e}`),this.scheduler&&(this.scheduler.deletePeer(t),this._destroyAndDeletePeer(t.remotePeerId,e),this.fetcher&&(t.connected||e&&this.fetcher.increFailConns(),e&&this.failedDCSet.add(t.remotePeerId),this._doSignalFusing(this.scheduler.peersNum),this._doPeersRequest()))})).once(e.DC_TIMEOUT,(()=>{this.notFoundDCSet.add(t.remotePeerId)})).once(e.DC_CLOSE,(e=>{this.logger.info(`datachannel ${t.channelId} closed fatal ${e}`),this.scheduler&&(this.scheduler.deletePeer(t),this._doSignalFusing(this.scheduler.peersNum)),this._destroyAndDeletePeer(t.remotePeerId,e),e&&this.failedDCSet.add(t.remotePeerId),this._doPeersRequest()})).once(e.DC_OPEN,(()=>{t.isInitiator&&this.scheduler.handshakePeer(t)})).once(e.DC_METADATA,(e=>{const{scheduler:s}=this;t.isInitiator||s.handshakePeer(t),s.handleMetaData(t,e);const i=this.DCMap.size>=this.minConns+3;this.requestMorePeers(i),this.peersIncrement++,this._doSignalFusing(s.peersNum)}))}_doPeersRequest(){this.signalerWs.normalClosed?this._requestPeersFromPeers(this.scheduler.peersNum):(this.requestMorePeers(),this._tryConnectToAllPeers())}_doSignalFusing(e){if(this.fuseRate<=0)return;const t=this.signalerWs.connected;t&&e>=this.fuseRate?(this.logger.warn("reach fuseRate, report stats close signaler"),this.totalConns-1>0&&this.fetcher.postStats(),this.signalerWs.close()):!t&&e<=this.minConns&&this.signalerWs.normalClosed&&(this.logger.warn(`low conns ${e}, reconnect signaler`),this.signalerWs.reconnect())}_initSignalerWs(t,s,i,r){const n=(e,t)=>{let s=`${e}?id=${this.peerId}&p=web&v=2.9.2`;return t&&(s=`${s}&token=${t}`),s};let o,a=n(t,i);if(!this.overloaded&&s&&s!==t){let e=n(s,r);o=new class{constructor(e,t,s,i){this.logger=e,this.config=t,this.mainAddr=s,this.backupAddr=i,this.mainWS=this._init(s),this.backupTimer=setTimeout((()=>{this.destroyed||(this.backupWS=this._init(i,"backup"))}),900),this._connected=!1,this.destroyed=!1,this.normalClosed=!1}_init(e,t){if(!e)return null;let s=new Ge(this.logger,this.config,e,270,t);return s.onopen=()=>{this.normalClosed=!1,!this._connected&&this.onopen&&(this._connected=!0,this.onopen())},s.onmessage=e=>{this.onmessage&&this.onmessage(e,s.name)},s.onclose=()=>{this._connected&&!this.connected&&this.onclose&&(this._connected=!1,this.onclose())},s.onerror=e=>{this.onerror&&this.onerror(e)},s}sendSignal(e,t,s){if(s){const i=this._getWSByName(s);i&&i.sendSignal(e,t)}else this.mainConnected?this.mainWS.sendSignal(e,t):this.backupConnected?this.backupWS.sendSignal(e,t):this.logger.warn("no signal available")}sendReject(e,t,s,i){if(i){const r=this._getWSByName(i);if(r)return void r.sendReject(e,t,s)}this.mainConnected?this.mainWS.sendReject(e,t,s):this.backupConnected?this.backupWS.sendReject(e,t,s):this.logger.warn("no signal available, send reject failed")}close(){this.mainWS&&this.mainWS.close(),this.backupWS&&this.backupWS.close(),this.normalClosed=!0}_getWSByName(e){return this.mainWS&&this.mainWS.name===e?this.mainWS:this.backupWS&&this.backupWS.name===e?this.backupWS:null}reconnect(){this.mainWS&&this.mainWS.reconnect(),this.backupWS&&this.backupWS.reconnect()}destroy(){this.close(),clearTimeout(this.backupTimer),this.mainWS=null,this.backupWS=null,this.destroyed=!0}get connected(){return this.mainConnected||this.backupConnected}get mainConnected(){return this.mainWS&&this.mainWS.connected}get backupConnected(){return this.backupWS&&this.backupWS.connected}}(this.logger,this.config,a,e)}else o=new Ge(this.logger,this.config,a,270);return o.onopen=()=>{this.connected=!0,this.engine.emit("serverConnected",!0),this._tryConnectToAllPeers()},o.onmessage=(e,t)=>{let s=e.action;const i=e.from_peer_id||e.from;if(i)switch(s){case"signal":this._handleSignalMsg(i,e,null,t);break;case"reject":this._handSignalRejected(i,e);break;default:this.logger.warn(`Signal websocket unknown action ${s}`)}else this.logger.warn("fromPeerId is missed")},o.onclose=()=>{this.connected=!1,this.engine.emit("serverConnected",!1)},o.onerror=t=>{t.message&&this.engine.emit(e.EXCEPTION,we()(t,"SIGNAL_EXPT"))},o}_handSignalRejected(e,t){this.logger.warn(`signaling ${e} rejected, reason ${t.reason}`);const s=this.DCMap.get(e);s&&!s.connected&&(s.destroy(t.fatal),this.DCMap.delete(e)),this.requestMorePeers(),t.fatal&&this.failedDCSet.add(e),this._tryConnectToAllPeers()}_handleSignalMsg(e,t,s,i){if(!this.scheduler)return;const{logger:r}=this;if(t.data){if(this.failedDCSet.has(e))return void this._sendSignalReject(e,`peer ${e} in blocked list`,s,i,!0);this._handleSignal(e,t.data,s,i)}else{const t=this.DCMap.get(e);if(!t)return;if(this.signalerWs.backupConnected&&t&&t.signalMsgs.length>0&&"main"===i&&!t.useBackupSignal){t.useBackupSignal=!0,t.signalName="backup",r.warn(`${e} not found from main, try backup signal`);for(let s of t.signalMsgs)this.signalerWs.sendSignal(e,s,"backup");return}if(t.useBackupSignal)return;this._destroyAndDeletePeer(e),r.info(`signaling ${e} not found`);const{scheduler:n}=this;n.waitForPeer&&(n.waitingPeers--,0===n.waitingPeers&&n.notifyPeersLoaded(0)),this.requestMorePeers(),this._tryConnectToAllPeers(),s||this.notFoundDCSet.add(e)}}_handleSignal(e,t,s,i){const r=t.type,{logger:n}=this;let o=this.DCMap.get(e);if(o){if(o.connected)return void n.info("datachannel had connected, signal ignored");if("offer"===r){if(!(this.peerId>e))return void n.warn(`signal type wrong ${r}, ignored`);this._destroyAndDeletePeer(e,!1),n.warn(`signal type wrong ${r}, convert to non initiator`),o=this._createDatachannel(e,!1,s)}}else{if("answer"===r){const t=`signal type wrong ${r}`;return n.warn(t),this._sendSignalReject(e,t,s,i),void this._destroyAndDeletePeer(e,!1)}if(n.debug(`receive node ${e} connection request`),this.DCMap.size>=this.maxConns){const t=`peers reach limit ${this.maxConns}`;return n.warn(t),void this._sendSignalReject(e,t,s,i)}o=this._createDatachannel(e,!1,s)}o&&(i&&(o.signalName=i),o.receiveSignal(t))}_createDatachannel(e,t,s){if(!this.engine.fetcher)return;let i;if(t&&this.peerPool.size>0)i=this.peerPool.getPeer(),this.logger.info(`get peer from pool, signal size ${i.signalMsgs.length}`),i.intermediator=s,i.assignPeerId(this.peerId,e);else{let r=this.config.trickleICE;this.overloaded&&(r=!1),i=new G(this.engine,this.peerId,e,t,this.config,{stuns:this.stuns,intermediator:s,trickle:!s&&r})}return this.DCMap.set(e,i),this._setupDC(i),i}_sendSignalReject(e,t,s,i,r){if(s){const i=this.DCMap.get(s);if(i&&i.sendMsgSignalReject(e,this.peerId,t,r))return}this.signalerWs.sendReject(e,t,r,i)}_requestMorePeers(e){if(!this.fetcher)return;const{logger:t}=this,s=this.scheduler.peersNum;if(s>=this.maxConnsActive)return;t.info(`requestMorePeers after delay ${e}`);const i=this.peersIncrement;this.peersIncrement=0,0===s||i<=3&&!this.gotPeersFromTracker&&!this.overloaded?this._requestPeersFromServer(s):this._requestPeersFromPeers(s)||this._requestPeersFromServer(s)}_requestPeersFromServer(e){const{logger:t}=this;this.failedDCSet.size>50&&(this.failedDCSet=new Set([...this.failedDCSet].slice(-50))),this.notFoundDCSet.size>20&&(this.notFoundDCSet=new Set([...this.notFoundDCSet].slice(-20))),this.fetcher.btGetPeers([...this.DCMap.keys(),...this.failedDCSet.keys(),...this.notFoundDCSet.keys()],0===e).then((e=>{e&&e.peers&&(t.info(`requestMorePeers resp ${JSON.stringify(e,null,2)}`),this.peers=this._filterPeers(e.peers),this._tryConnectToAllPeers())})).catch((e=>{t.error(`requestMorePeers error ${e}`)})),this.gotPeersFromTracker=!0}_requestPeersFromPeers(e){return!!this.requestPeersTimer||(e>=this.maxConnsActive||(this.requestPeersWaitCount=this.scheduler.requestPeers(),0!==this.requestPeersWaitCount&&(this.gotPeersFromTracker=!1,this.requestPeersTimer=setTimeout((()=>{this._handleRequestedPeers()}),1e4),!0)))}_handleRequestedPeers(){if(clearTimeout(this.requestPeersTimer),this.requestPeersTimer=void 0,0===this.requestPeersQueue.length)return;const e=function(e,t){const s=[],i=new Set;for(let t of e)i.has(t.id)||(i.add(t.id),s.push(t));const{asn:r,country:n}=t;if(!r||!n||s.length<2)return s;const o=s.filter((e=>!e.region.asn&&!e.region.country)),a=s.filter((e=>e.region.country===n&&e.region.asn!==r)),h=s.filter((e=>e.region.asn===r&&e.region.country===n)),l=s.filter((e=>!o.includes(e)&&!h.includes(e)&&!a.includes(e)));return h.concat(a).concat(o).concat(l)}(this.requestPeersQueue,this.engine.fetcher.announceInfo);this.peers=this._filterPeers(e),this.requestPeersQueue=[],this._tryConnectToAllPeers()}_destroyAndDeletePeer(e,t=!0){const s=this.DCMap.get(e);return!!s&&(s.destroy(t),this.DCMap.delete(e),!0)}}const Ye=Qe;function Xe(e,t,s="main"){return"main"!==s&&"audio"!==s}function Ke(){const e=performance.now();return{trequest:e,tfirst:0,tload:0,aborted:!1,loaded:0,retry:0,total:0,chunkCount:0,bwEstimate:0,loading:{start:e,first:0,end:0},parsing:{start:0,end:0},buffering:{start:0,first:0,end:0}}}function Ze(e,t){let s,i,r,n,o;const a=performance.now();s=a-300,i=a-200,r=a,e.trequest=s,e.tfirst=i,e.tload=r,e.loading={first:s,start:i,end:r},n=o=t,e.loaded=n,e.total=o}class et extends(n()){constructor(){super(),this.UNSENT=0,this.OPENED=1,this.HEADERS_RECEIVED=2,this.LOADING=3,this.DONE=4,this.timeout=0,this.withCredentials=!1,this.status=0,this.readyState=this.UNSENT,this.headers=new Map,this.responseHeaders=null,this.on("load",(e=>{this.onload&&this.onload(e)})),this.on("abort",(e=>{this.onabort&&this.onabort(e)})),this.on("error",(e=>{this.onerror&&this.onerror(e)})),this.on("loadstart",(e=>{this.onloadstart&&this.onloadstart(e)})),this.on("progress",(e=>{this.onprogress&&this.onprogress(e)})),this.on("timeout",(e=>{this.ontimeout&&this.ontimeout(e)})),this.on("loadend",(e=>{this.onloadend&&this.onloadend(e)})),this.on("readystatechange",(()=>{this.onreadystatechange&&this.onreadystatechange()}))}setRequestHeader(e,t){this.headers.set(e,t)}addEventListener(e,t){this.addListener(e,t)}removeEventListener(e,t){this.removeListener(e,t)}overrideMimeType(){}getAllResponseHeaders(){if(!this.responseHeaders)return null;let e="";return this.responseHeaders.forEach(((t,s)=>{e+=`${s}: ${t}\n`})),e}getResponseHeader(e){return this.responseHeaders?this.responseHeaders.get(e):null}open(){this.readyState=this.OPENED,this.emit("loadstart")}abort(){this.readyState=this.DONE,this.status=0,this.emit("loadend")}send(){}_emitEvent(e){this.emit(e,{type:e,target:this})}}class tt{constructor(e){this.fetchSetup=e.fetchSetup||st,this.xhrSetup=e.xhrSetup,function(e){try{new e}catch(e){return!1}return!0}(self.AbortController)&&(this.controller=new self.AbortController),this.stats=Ke(),this.packetSize=l,this.fakeXhr=new et}destroy(){this.loader=this.callbacks=null,this.abortInternal()}abortInternal(){const e=this.response;e&&e.ok||(this.stats.aborted=!0,this.callbacks&&this.callbacks.onUpdate&&this.callbacks.onUpdate(void 0,!1,!0),this.controller&&this.controller.abort())}abort(){this.abortInternal(),this.callbacks&&this.callbacks.onAbort&&this.callbacks.onAbort(this.stats,this.context,this.response)}load(e,t,s){const i=this.stats;i.trequest=i.loading.start=performance.now();let r=function(e,t){const s={method:"GET",mode:"cors",credentials:"same-origin",signal:t,headers:new self.Headers(Object.assign({},e.headers))};e.rangeEnd&&s.headers.set("Range","bytes="+e.rangeStart+"-"+String(e.rangeEnd-1));return s}(e,this.controller?this.controller.signal:void 0);const n="arraybuffer"===e.responseType,o=n?"byteLength":"length",a=s.onUpdate,h=s.onBodyStart;this.context=e,this.config=t,this.callbacks=s,this.xhrSetup&&(this.xhrSetup(this.fakeXhr,e.url),r=function(e,t){e.withCredentials&&(t.credentials="include");for(let[s,i]of e.headers)t.headers.set(s,i);return t}(this.fakeXhr,r)),this.request=this.fetchSetup(e,r),clearTimeout(this.requestTimeout),this.requestTimeout=setTimeout((()=>{this.abortInternal(),this.fakeXhr._emitEvent("timeout"),this.fakeXhr._emitEvent("loadend"),s.onTimeout&&s.onTimeout(i,e,this.response)}),this.fakeXhr.timeout||t.timeout);const{fakeXhr:l}=this;l.readyState=l.OPENED,l.emit("readystatechange"),l._emitEvent("loadstart"),fetch(this.request).then((t=>{if(this.response=this.loader=t,!t.ok){const{status:e,statusText:s}=t;throw a&&a(void 0,!1,!0),new it(s||"fetch, bad network response",e,t)}i.tfirst=i.loading.first=Math.max(performance.now(),i.loading.start),i.total=parseInt(t.headers.get("Content-Length")||"0");const{fakeXhr:s}=this;return s.readyState=s.HEADERS_RECEIVED,s.responseHeaders=t.headers,s.emit("readystatechange"),a&&"0"!==i.total?(h&&h(i.total),this.loadProgressively(t,i,e,a)):(s.emit("progress",new ProgressEvent("progress",{lengthComputable:!1})),n?t.arrayBuffer():t.text())})).then((t=>{const{response:r}=this;clearTimeout(this.requestTimeout),i.tload=i.loading.end=Math.max(performance.now(),i.loading.first),i.loaded=i.total=t[o];const n={url:r.url,data:t};s.onProgress&&s.onProgress(i,e,t,r),s.onSuccess&&s.onSuccess(n,i,e,r)})).catch((t=>{if(clearTimeout(this.requestTimeout),i.aborted)return;a&&a(void 0,!1,!0);const r=t&&t.code||0,n=t?t.message:null;s.onError&&s.onError({code:r,text:n},e,t?t.details:null)}))}loadProgressively(e,t,s,i){const r=e.body.getReader();let n=0,a=0,h=(0,o.l)(0),l=!1;const c=()=>r.read().then((({value:s,done:r})=>{const{fakeXhr:d}=this;if(d.readyState!==d.LOADING&&(d.readyState=d.LOADING,d.emit("readystatechange")),s&&(n+=s.length),r){if(h.byteLength>0)if(n<=this.packetSize){const e=(0,o.l)(n);h.copy(e,0,a*this.packetSize,h.byteLength),i(e,!0)}else{const e=y(h,a*this.packetSize);for(let t=0;t<e.length;t++)i(e[t],t===e.length-1)}const t=h.buffer,{fakeXhr:s}=this,{status:r,statusText:l,url:c}=e;return s.readyState=s.DONE,s.responseText=r,s.status=l,s.responseURL=c,s.responseType="arraybuffer",s.response=t,s.emit("readystatechange"),s._emitEvent("load"),s._emitEvent("loadend"),Promise.resolve(t)}if(t.loaded+=s.length,d.emit("progress",new ProgressEvent("progress",{lengthComputable:!0,loaded:t.loaded,total:t.total})),this.callbacks.onLoaded&&this.callbacks.onLoaded({total:t.total,loaded:t.loaded,first:!l},this.context),l=!0,h=o.l.concat([h,s]),n>=this.packetSize){n-=this.packetSize;const e=(0,o.l)(this.packetSize);h.copy(e,0,a*this.packetSize,(a+1)*this.packetSize),a++,i(e,!1)}return c()})).catch((()=>(this.fakeXhr._emitEvent("abort"),this.fakeXhr._emitEvent("loadend"),Promise.reject())));return c()}}function st(e,t){return new self.Request(e.url,t)}class it extends Error{constructor(e,t,s){super(e),this.code=t,this.details=s}}class rt{constructor(t,s,i,r){this.bufferList=[],this.streamListeners=[],this.finished=!1,this.packetSize=l,this.attachments=r%this.packetSize==0?r/this.packetSize:Math.floor(r/this.packetSize)+1,this.pieceMsg={event:e.DC_PIECE,attachments:this.attachments,seg_id:i,sn:t,level:s,size:r,reverse:!1},this.sink=(0,o.l)(0),this.source="HttpStream"}receiveBytes(e,t){e.byteLength&&(this.sink=o.l.concat([this.sink,e]),this.bufferList.push(e),t&&(this.finished=!0),this._notifyStreamListeners(e))}getCompleteBuffer(){return this.sink.buffer}destroy(){this.finished||this._notifyStreamListenersAbort()}addStreamListener(e,t,s){this.streamListeners.push({handler:s,peerId:t})}removeStreamListener(e){this.streamListeners=this.streamListeners.filter((t=>t.peerId!==e||(t.handler(void 0,void 0,!0,"aborted by cancel"),!1)))}_notifyStreamListenersAbort(){for(let e of this.streamListeners){const{handler:t}=e;t(void 0,void 0,!0,"aborted by httpLoader")}this.streamListeners.length=0}_notifyStreamListeners(e){const{sn:t,seg_id:s}=this.pieceMsg;for(let i of this.streamListeners){const{handler:r}=i;r(t,s,!1,e,this.finished)}this.finished&&(this.streamListeners.length=0)}}const nt=0,ot=1,at=2,ht=3,lt=(e,t,s,i,r)=>e.filter((e=>e.bitset.hasWithId(s,i,r,t)));function ct(e,t,s,i=0,r=0){const n=function(e,t,s,i=0,r=0){const n=l;let o=i,a=r||s-1;const h=Math.floor(s/n),c=s%n>0?h+1:h;e>=0&&(o+=(e+1)*n),t>=0&&t<c&&(a-=s%n+(c-t-1)*n);return{rangeStart:o,rangeEnd:a+1}}(e,t,s,i,r);return`bytes=${n.rangeStart}-${n.rangeEnd-1}`}function dt(e,t){return`${e}-${t}`}function ut(e,t,s,i){let r=s.split("?")[0];return r.startsWith("http")&&(r=r.split("://")[1]),i?`${r}|${i}`:`${r}`}class gt{constructor(e=!1,t){this.isLive=e,this.levelMap=new Map;for(let e in t){const s=Number(e);if(s<0)continue;const i=new Map;if(t[e])for(let s of t[e])i.set(s,{state:ot,segId:void 0});this.levelMap.set(s,i)}}totalLevels(){return this.levelMap.size}hasWithId(e,t,s,i=nt){if(t<0)return!1;const r=this._createOrGetSet(t).get(e);return!!r&&((!s||!r.segId||r.segId===s)&&(i===nt||r.state===i))}has(e,t,s=nt){return this.hasWithId(e,t,void 0,s)}hasCompleteOr(e,t,s=ot){const i=this._createOrGetSet(t).get(e);return!!i&&(i.state===ot||i.state===s)}getObj(e,t){let s=this._createOrGetSet(t).get(e);return s||(s={}),s}getSegId(e,t){return this.getObj(e,t).segId}getState(e,t){return this.getObj(e,t).state}delete(e,t){return this._createOrGetSet(t).delete(e)}add(e,t,s,i){if("number"!=typeof(r=e)||r%1!=0)return;var r;this._createOrGetSet(t).set(e,{state:i,segId:s}),this.isLive&&this._trimBitset(e)}array(e){const t=this._createOrGetSet(e);return this._keysForStateComplete(t)}allArray(){let e={};return this.levelMap.forEach(((t,s)=>{e[s]=this._keysForStateComplete(t)})),e}clear(){this.levelMap.forEach((e=>{e.clear()}))}size(e){return this._createOrGetSet(e).size}_createOrGetSet(e){"number"!=typeof e&&(e=Number(e));let t=this.levelMap.get(e);return t||(t=new Map,this.levelMap.set(e,t)),t}_trimBitset(e){const t=e-20;t>0&&this.levelMap.forEach((e=>{e.delete(t)}))}_keysForStateComplete(e){const t=[];for(let[s,i]of e)i.state===ot&&t.push(s);return t}}class ft{constructor(){this.levelMap=new Map}totalLevels(){return this.levelMap.size}has(e,t){return this._createOrGetMap(t).has(e)}delete(e,t){return this._createOrGetMap(t).delete(e)}decre(e,t){const s=this._createOrGetMap(t);if(s.has(e)){let t=s.get(e);1===t?s.delete(e):s.set(e,t-1)}}incre(e,t){const s=this._createOrGetMap(t);if(s.has(e)){let t=s.get(e);s.set(e,t+1)}else s.set(e,1)}clear(){this.levelMap.forEach((e=>{e.clear()}))}size(e){return this._createOrGetMap(e).size}_createOrGetMap(e){"number"!=typeof e&&(e=Number(e));let t=this.levelMap.get(e);return t||(t=new Map,this.levelMap.set(e,t)),t}}const pt=class{constructor(){this.peerMap=new Map}isEmpty(){return 0===this.peerMap.size}size(){return this.peerMap.size}clear(){this.peerMap.clear()}getPeers(){return[...this.peerMap.values()]}getPeerValues(){return this.peerMap.values()}hasPeer(e){return this.peerMap.has(e)}addPeer(e,t){this.peerMap.set(e,t)}getPeerIds(){return[...this.peerMap.keys()]}removePeer(e){this.peerMap.delete(e)}getPeersOrderByWeight(){const e=this.getAvailablePeers();return e.sort(((e,t)=>0===t.weight?1:0===e.weight?-1:t.weight-e.weight)),e}getPeer(e){return this.peerMap.get(e)}getAvailablePeers(){return this.getPeers().filter((e=>e.isAvailableUrgently))}},mt=1,_t=2,yt=3,St=4;class vt{constructor(e){this.generator=e,this.status=mt,this.next=this.next.bind(this)}next(e){if(this.status===St)return console.warn("status is canceled");if(this.status===_t)return console.warn("status is waiting");const t=this.execute.bind(this,this.cb);this.nextInfo=this.generator(t),this.status=_t,this.nextInfo.execute(e)}execute(e,t){this.status=yt,e.apply(t,[this.next])}cancel(){this.status=St,this.nextInfo&&"function"==typeof this.nextInfo.cancel&&this.nextInfo.cancel()}start(e,t){if("function"!=typeof e)throw new SyntaxError("param cb must be a function");this.cb=e,this.next(t)}continue(e){this.status=mt,this.next(e)}}const Pt=Symbol("shareOnly");class bt extends(n()){constructor(e,t){super(),this.engine=e,this.config=t,this.logger=e.logger,this.bufMgr=null,this.peerManager=new pt,this._setupEngine&&this._setupEngine(),this.startCheckConnsTimer(),this.dcDownloadTimeout=t.dcDownloadTimeout,this[Pt]=!1,this.downloadOnly=!1,this.loadedPeerNum=0,this.minConns=5}get isMobileNet(){return this.engine.isMobileNet}startCheckConnsTimer(){this.checkConnsTimer=setInterval((()=>{this.logger.info("start check conns");const e=this.getStatsForPeer();let t=this.peersNum;const s=u();this.getPeers().forEach((i=>{t>this.minConns+1&&(s-i.dataExchangeTs>120||s-i.gotStatsTs>=83)?(this.logger.warn(`close dead or different level peer ${i.remotePeerId} level ${i.currentLevel}`),i.close(!1),t--):i.connected&&i.sendMsgStats(t,e)}))}),4e4)}getStatsForPeer(){return{}}requestPeers(){const e=u();let t=0;for(let s of this.getPeers())s.mobileNet||s.super||(e-s.gotPeersTS<80?this.logger.warn(`${s.remotePeerId} just got peers, ignored`):(s.sendPeersRequest(),s.gotPeersTS=e,t++));return t}chokePeerRequest(t){const s={event:e.DC_CHOKE};t?t.sendJson(s):this._broadcastToPeers(s)}unchokePeerRequest(t){const s={event:e.DC_UNCHOKE};t?t.sendJson(s):this._broadcastToPeers(s)}stopRequestFromPeers(){for(let e of this.getPeers())e.choked=!0}resumeRequestFromPeers(){for(let e of this.getPeers())e.choked=!1}setShareOnly(){this[Pt]=!0}deletePeer(e){this.peerManager.hasPeer(e.remotePeerId)&&this.peerManager.removePeer(e.remotePeerId),this._peersStats(this.peerManager.getPeerIds())}getPeers(){return[...this.peerManager.getPeerValues()]}addPeer(e){const{logger:t}=this;this.peerManager.addPeer(e.remotePeerId,e),this[Pt]&&(e.choked=!0);const s=this.peerManager.getPeerIds();this._peersStats(s),t.info(`add peer ${e.remotePeerId}, now has ${s.length} peers`)}get hasPeers(){return this.peersNum>0}get peersNum(){return this.peerManager.size()}get hasIdlePeers(){const{logger:e}=this,t=this.getIdlePeer().length;if(e.info(`peers: ${this.peersNum} idle peers: ${t}`),t<this.peersNum){const t=this.peerManager.getPeers(),s=t.filter((e=>e.downloading));e.warn(`downloading: ${s.length} choked: ${t.filter((e=>e.choked)).length}`);for(let t of s)e.warn(`${t.remotePeerId} loading ${t.segId} packets ${t.bufArr.length} total ${t.pieceMsg.attachments}`)}return t>0}getIdlePeer(){return this.peerManager.getAvailablePeers()}set bufferManager(t){this.bufMgr=t,t.on(e.BM_LOST,(({sn:t,segId:s,next:i,level:r})=>{this.config.live||this._broadcastToPeers({event:e.DC_LOST,sn:t,seg_id:s,level:r||void 0}),this.onBufferManagerLost(t,s,i,r)})).on(e.BM_SEG_ADDED,(e=>{this.onBufferManagerSegAdded(e)}))}onBufferManagerSegAdded(e){}destroy(){const{logger:e}=this;this.peersNum>0&&this.peerManager.clear(),this.removeAllListeners(),clearInterval(this.checkConnsTimer),this.checkTimer&&this.checkTimer.cancel(),e.warn("destroy BtScheduler")}notifyPeersLoaded(e){}_setupDC(t){const{logger:s}=this;t.on(e.DC_PIECE_ACK,(e=>{e.size&&(this.engine.fetcher.reportUploaded(e.size),s.info(`uploaded ${e.seg_id} size ${e.size} to ${t.remotePeerId}, canceled ${e.canceled||!1}`))})).on(e.DC_PIECE_ABORT,(e=>{s.warn(`peer ${t.remotePeerId} download aborted, reason ${e.reason}`),t.downloading&&this._handlePieceAborted&&this._handlePieceAborted(t.remotePeerId),t.downloading=!1})).on(e.DC_REQUEST,(()=>{})).on(e.DC_SEND_REQUEST,(()=>{}))}_broadcastToPeers(e){for(let t of this.getPeers())t.sendJson(e)}_peersStats(e){this.engine.emit("peers",e);const t=this.engine.config.getPeersInfo;t&&"function"==typeof t&&t(e)}startCheckPeersTimer(e=3e3){this.checkTimer=new vt((function(e){let t;return{execute:function(s=1e3){t=setTimeout(e,s)},cancel:function(){clearTimeout(t)}}})),this.checkTimer.start((e=>{this.checkPeers();const t=1e3*(0===(s=this.loadedPeerNum)?3:.5*s+1.67);var s;this.loadedPeerNum=0,e(t)}),e)}}const wt=bt;class Et extends(n()){constructor(e){super(),this.internalMap=new Map,this.eventName=e}has(e,t){return this.internalMap.has(this._generateId(e,t))}set(e,t,s){const i=this._generateId(e,t);this.internalMap.set(i,s),this.emit(`${this.eventName}${e}-${t}`,s)}get(e,t){return this.internalMap.get(this._generateId(e,t))}delete(e,t){const s=this._generateId(e,t),i=this.internalMap.get(s);return!!i&&(i.destroy(),this.internalMap.delete(s),!0)}clear(){this.internalMap.clear(),this.removeAllListeners()}_generateId(e,t){return"number"!=typeof t&&(t=Number(t)),`${t}-${e}`}}const Ct=0,It=1,Tt=2,Lt=3;class Rt extends(n()){constructor(e,s,i,r,n,o=!1,a){super(),this.coordinator=e,this.logger=s,this.rangeSupported=o,this.rangeStart=0,this.rangeEnd=0,this.httpLoadTime=2e3,this.proxied=!1,this.pieceMsg={event:t.DC_PIECE,sn:i,level:r,seg_id:n},a&&this.setExtra(a),this.forwardPeer=null,this.reversePeer=null,this.bufArr=[],this.forwardBufList=[],this.reverseBufList=[],this.forwardOffset=-1,this.reverseOffset=1e4,this.timeStart=0,this.timeReceivePiece=0,this.timer=void 0,this.destroyed=!1,this.forwardStreamListeners=[],this.reverseStreamListeners=[],this.rangeRequesting=!1,this.waitingRemain=!1,this.httpLoaded=0,this.p2pLoaded=0,this.deadline=0,this.p2pCanceled=!1,this.firstReceived=!1}get segId(){return this.pieceMsg.seg_id}isDownloading(){return this.timeReceivePiece>0}isAlmostDeadline(){if(this.rangeRequesting||0===this.deadline)return!0;const e=this.deadline-performance.now();return e<=0||(this.p2pSpeed>2*this.minRequiredSpeed(e)||e<500)}hasPeer(e){return!!e&&(e===this.forwardPeer||e===this.reversePeer)}streamListeners(){return[...this.reverseStreamListeners,...this.forwardStreamListeners].length}_notifyStreamListeners(e,t,s){const{sn:i,seg_id:r,attachments:n}=this.pieceMsg,o=e&&0===s||!e&&s===n-1,a=e?this.reverseStreamListeners:this.forwardStreamListeners;e?this.reverseBufList.push(t):this.forwardBufList.push(t),o&&(this.forwardBufList.push([...this.reverseBufList].reverse()),this.reverseBufList.push([...this.forwardBufList].reverse()));for(let e of a){const{handler:s}=e;s(i,r,!1,t,o)}o&&(a.length=0)}_notifyStreamListenersAbort(){const e=[...this.reverseStreamListeners,...this.forwardStreamListeners];for(let t of e){const{handler:e}=t;e(void 0,void 0,!0,"aborted by synthesizer")}e.length=0}_notifyStreamListenersRemain(){if(this.forwardStreamListeners.length>0){for(let e=this.forwardOffset+1;e<this.bufArr.length;e++)this._notifyStreamListeners(!1,this.bufArr[e],e);this.forwardStreamListeners=[]}if(this.reverseStreamListeners.length>0){for(let e=this.reverseOffset-1;e>=0;e--)this._notifyStreamListeners(!0,this.bufArr[e],e);this.reverseStreamListeners=[]}}addStreamListener(e,t,s){(e?this.reverseStreamListeners:this.forwardStreamListeners).push({handler:s,peerId:t})}removeStreamListener(e){const t=t=>t.filter((t=>t.peerId!==e||(t.handler(void 0,void 0,!0,"aborted by cancel"),!1)));this.forwardStreamListeners=t(this.forwardStreamListeners),this.reverseStreamListeners=t(this.reverseStreamListeners)}setTimeout(e=0){let t=performance.now();e<=0?setTimeout((()=>{this._handleTimeout(!1,!1)}),0):(this.deadline=t+e,this._startTimer(e))}setExtra(e={}){e.url&&(this.url=e.url),e.rangeStart&&(this.rangeStart=e.rangeStart),e.rangeEnd&&(this.rangeEnd=e.rangeEnd),e.httpLoadTime&&(this.httpLoadTime=e.httpLoadTime),e.proxied&&(this.proxied=!0),e.xhrSetup&&(this.xhrSetup=e.xhrSetup),e.headers&&(this.headers=e.headers),e.segId&&!this.pieceMsg.seg_id&&(this.pieceMsg.seg_id=e.segId)}hasForwardPeer(){return!!this.forwardPeer}hasReversePeer(){return!!this.reversePeer}hasPeerId(e){return this.forwardPeer&&this.forwardPeer.remotePeerId===e||this.reversePeer&&this.reversePeer.remotePeerId===e}isEmpty(){return null===this.forwardPeer&&null===this.reversePeer}isFull(){return this.forwardPeer&&this.reversePeer}setForwardPeer(e){this.forwardPeer=e,this.reversePeer&&this._print(),this._setupPeer(e,!1)}setReversePeer(e){this.reversePeer=e,this.forwardPeer&&this._print(),this._setupPeer(e,!0)}deletePeer(e,t=!1){const s=e===this.reversePeer;this._detachPeer(e),s?(this.reversePeer=null,t&&(this.reverseOffset=this.pieceMsg.attachments||1e4)):(this.forwardPeer=null,t&&(this.forwardOffset=-1)),this.isEmpty()&&this._handleTimeout(!1,!1)}terminate(){this._handleTimeout(!1,!1)}hasPartialBuffer(){return this.hasForwardBuffer()||this.hasReverseBuffer()}hasForwardBuffer(){return this.forwardOffset>=0}hasReverseBuffer(){return this.pieceMsg&&this.reverseOffset<this.pieceMsg.attachments}_cancelP2p(){if(this.p2pCanceled)return;this.p2pCanceled=!0;const{seg_id:e,sn:t,level:s}=this.pieceMsg;[this.forwardPeer,this.reversePeer].filter((e=>!!e)).forEach((i=>{i.cancelDownload(t,s,e)}))}destroy(){this.logger.info("destroy syn"),clearTimeout(this.timer),this._notifyStreamListenersAbort(),this._cancelP2p(),this.removeAllListeners(),this.destroyed=!0,this._detachPeer(this.forwardPeer),this.forwardPeer=null,this.forwardOffset=-1,this._detachPeer(this.reversePeer),this.reversePeer=null,this.reverseOffset=1e4,this.bufArr=[],this.forwardStreamListeners=[],this.reverseStreamListeners=[]}_detachPeer(e){if(!e)return;const s=e===this.reversePeer?this.reverseEvents:this.forwardEvents;s&&e.off(t.DC_PIECE_DATA,s.onPieceData).off(t.DC_PIECE,s.onPiece).off(t.DC_PIECE_NOT_FOUND,s.onPieceNotFound).off(t.DC_PIECE_ABORT,s.onPieceAbort)}_receivePacket(e,s,i,r=!0){const{seg_id:n,sn:a,level:h,size:l,attachments:c}=this.pieceMsg,d=s-1;if(this.bufArr[d])return this.logger.warn(`syn bufArr ${this.pieceMsg.sn} already has ${d} size ${i.byteLength}`),!1;if(r?this.p2pLoaded+=i.byteLength:this.httpLoaded+=i.byteLength,this.emit(t.SYN_PROGRESS,{total:l,loaded:this.p2pLoaded+this.httpLoaded,first:!this.firstReceived,segId:n,sn:a}),this.firstReceived=!0,this.bufArr[d]=i,e?this.reverseOffset=d:this.forwardOffset=d,this._notifyStreamListeners(e,i,d),this.forwardOffset!==this.reverseOffset-1)return!0;this.forwardPeer&&(this.forwardPeer.miss=0),this.reversePeer&&(this.reversePeer.miss=0),clearTimeout(this.timer),this._notifyStreamListenersRemain();const u=l/(performance.now()-this.timeStart);let g=o.l.concat(this.bufArr);const f=g.byteLength;if(f===l){let e=g.buffer;const s=new z(a,n,e,this.getFromPeerId(),h);this.emit(t.SYN_OUTPUT,s,{speed:u,p2p:this.p2pLoaded,http:this.httpLoaded,underused:this.forwardPeer&&this.reversePeer&&(-1===this.forwardOffset||this.reverseOffset>=c)})}else{this.logger.error(`${h}-${a} expectedSize ${l} != byteLength ${f} forward ${this.forwardOffset} reverse ${this.reverseOffset}`);for(let e=0;e<this.bufArr.length;e++)this.logger.error(`piece ${e} size ${this.bufArr[e].byteLength}`);this.emit(t.SYN_ERROR,this.pieceMsg,Ct)}}_setupPeer(e,s){0===this.timeStart&&(this.timeStart=performance.now());const i=(t,s,i,r,n,o)=>{if(this.destroyed)return;if(!this._validateMsg(t,o.level,s))return void this.logger.warn(`onPieceData ${o.level}-${t} not match ${JSON.stringify(this.pieceMsg)} from ${e.remotePeerId}`);const{reverse:a}=o;this._receivePacket(a,r,i)&&!this.waitingRemain&&!this.rangeRequesting&&this.deadline>0&&this._shouldSwitch()&&(this.logger.warn("should switch to http"),clearTimeout(this.timer),this._handleTimeout(!1,!1))},r=s=>{if(this.destroyed)return;const{attachments:i,size:r,sn:n,level:o,seg_id:a}=s;return r&&this._validateMsg(n,o,a)?this.pieceMsg.size&&r!==this.pieceMsg.size?(this.logger.warn(`onPiece ${s.level}-${s.sn} size not match`),void this.emit(t.SYN_ERROR,this.pieceMsg,Ct)):void(0===this.bufArr.length&&(this.pieceMsg={...this.pieceMsg,seg_id:a,size:r,attachments:i},this.reverseOffset=i,this.bufArr=new Array(i),this.timeReceivePiece=performance.now())):(this.logger.warn(`onPiece ${JSON.stringify(s)} not match ${JSON.stringify(this.pieceMsg)}`),void this.deletePeer(e))},n=t=>{this.destroyed||this.deletePeer(e)},o=()=>{this.destroyed||this.deletePeer(e)},a={onPieceData:i,onPiece:r,onPieceNotFound:n,onPieceAbort:o};s?this.reverseEvents=a:this.forwardEvents=a,e.on(t.DC_PIECE_DATA,i).once(t.DC_PIECE,r).once(t.DC_PIECE_NOT_FOUND,n).once(t.DC_PIECE_ABORT,o)}_validateMsg(e,t,s){return(!this.pieceMsg.seg_id||s===this.pieceMsg.seg_id)&&(e===this.pieceMsg.sn&&t===this.pieceMsg.level)}_shouldSwitch(){const e=this.pieceMsg.size-64e3*this.loadedPackets();return this.coordinator.shouldSwitchToHttp(e,this.deadline,this.p2pSpeed,64e3,this.httpLoadTime)}_startTimer(e,t=!0){this.timer=setTimeout(this._handleTimeout.bind(this,t),e)}loadedPackets(){return this.pieceMsg.attachments-(this.reverseOffset-this.forwardOffset-1)}_handleTimeout(e=!1,s=!0){if(this.destroyed)return;const{level:i,sn:r,size:n,attachments:o}=this.pieceMsg;if(!n||0===this.timeReceivePiece)return this.logger.warn(`syn load timeout ${i}-${r} url ${this.url}`),void this.emit(t.SYN_ERROR,this.pieceMsg,Ct);if(e&&this.timeReceivePiece>0&&(this.logger.warn(`syn ${this.loadedPackets()} of ${o} packets loaded`),this.shouldWaitForRemain(this.httpLoadTime))){const e=this.httpLoadTime;return this.waitingRemain=!0,this.logger.info(`syn wait for remain ${e}`),void this._startTimer(e,!1)}if(s){const e=[this.forwardPeer,this.reversePeer].filter((e=>!!e)).sort(((e,t)=>e.currentLoadSpeed()-t.currentLoadSpeed())).shift();e&&e.loadtimeout()}if(this._cancelP2p(),this.rangeSupported&&this.url)return this._loadRemainBufferByHttp();this._notifyStreamListenersAbort(),this.emit(t.SYN_ERROR,this.pieceMsg,Lt)}shouldWaitForRemain(e){if(e<=0||this.isEmpty()||this.streamListeners()>0)return!1;const t=performance.now()-this.timeStart;return t<500||t<1e3&&this.timeReceivePiece>0&&e>3e3||this.shouldWaitForRemainUrgent(e)}shouldWaitForRemainUrgent(e){if(0===this.timeReceivePiece||e<=0)return!1;const t=this.p2pSpeed,s=this.minRequiredSpeed(e);return this.logger.info(`syn remainTime ${e} speed ${t} required ${s}`),t>=s}minRequiredSpeed(e){let t=0;return[this.forwardPeer,this.reversePeer].forEach((e=>{e&&(t+=e.loadedBytes())})),(this.pieceMsg.size-t)/e}get p2pSpeed(){let e=0;return[this.forwardPeer,this.reversePeer].forEach((t=>{t&&(e+=t.currentLoadSpeed())})),e}getFromPeerId(){const{forwardPeer:e,reversePeer:t}=this;return this.isFull()&&e!==t?`${e.remotePeerId}:${t.remotePeerId}`:e?`${e.remotePeerId}`:t?`${t.remotePeerId}`:""}_loadRemainBufferByHttp(){if(this.rangeRequesting)return;const{size:e,sn:s,level:i}=this.pieceMsg,r=this.rangeEnd>0?this.rangeEnd-1:0;let n=this.forwardOffset;const a=ct(n,this.reverseOffset,e,this.rangeStart,r),h=performance.now();let l=this.deadline+this.httpLoadTime-h+1e3;l<2e3?l=2e3:l>6e3&&(l=6e3),this.logger.info(`continue download ${i}-${s} from ${this.url} range: ${a} timeout ${l}`),this.rangeRequesting=!0,this.headers&&(this.xhrSetup=e=>{for(const t of Object.keys(this.headers))e.setRequestHeader(t,this.headers[t])}),f(this.url,a,this.xhrSetup,l,this.proxied).then((e=>{if(this.destroyed)return;if(this.rangeRequesting=!1,!e)return void this.emit(t.SYN_ERROR,this.pieceMsg,It);let i=o.l.from(e);const r=i.byteLength/(performance.now()-h);this.coordinator.addHttpSpeed(r),i.byteLength===this.pieceMsg.size&&(this.logger.warn(`syn range request ${s} resp whole ts`),n=-1);const a=y(i,0);let l=n+1;for(let e=0;e<a.length;e++)this.bufArr[l]||this._receivePacket(!1,l+1,a[e],!1),l++})).catch((e=>{if(this.destroyed)return;this.rangeRequesting=!1,this.logger.error(`http partial download ${s} error ${e}`);const i="timeout"===e?Tt:It;this.emit(t.SYN_ERROR,this.pieceMsg,i)}))}_print(){const{level:e,sn:t}=this.pieceMsg;this.logger.info(`syn parallel loading ${e}-${t}`)}}class Dt{constructor(){this.meanHttpSpeed=0}addHttpSpeed(e){this.meanHttpSpeed=.4*this.meanHttpSpeed+.6*e}shouldSwitchToHttp(e,t,s,i,r){if(this.meanHttpSpeed<=0)return!1;if(s>=this.meanHttpSpeed)return!1;if(this.meanHttpSpeed*r>=e)return!1;return((r+t-performance.now())*this.meanHttpSpeed-e)/(this.meanHttpSpeed-s)*s<i}}class At extends wt{constructor(e,s){super(e,s),this.bitset=new gt(s.live||!1),this.bitCounts=new ft,this.requestingMap=new Et(t.REQUESTING_MAP_HAVE),this.segmentBuilderMap=new Et(t.BUILDER_MAP_HAVE),this.allowP2pLimit=s.httpLoadTime+1.5,this.playlistInfo=new Map,this.isUploader=!1,this.isReceiver=!1,this.targetPeers={},this.mBufferedDuration=0,this.sequential=!0,this.httpTimeouts=0,this.httpRangeErrs=0,this.coordinator=new Dt,this.loadingSegId="",this.loadingSN=0,this.currPlaySN=0,this.currLostSN=-1,this.nextLostSN=-1,this.config.live?this.maxPrefetchCount=10:(this.maxPrefetchCount=150,this.startCheckPeersTimer())}get httpRangeSupported(){return this.config.httpRangeSupported}handshakePeer(e){this._setupDC(e);const{asn:t,country:s}=this.engine.fetcher.announceInfo;e.sendMetaData(this.bitset.allArray(),!0,this.peersNum,{asn:t,country:s},this.isMobileNet)}_receiveDCHave(e,s,i,r){this.bitset.has(e,s)||this.bitCounts.incre(e,s),r.isAvailableUrgently&&this.emit(t.SCH_DCHAVE,i)}_setupDC(e){super._setupDC(e),e.on(t.DC_HAVE,(t=>{if(e.bitset&&t.sn>=0){const{sn:s,level:i,complete:r,seg_id:n}=t,o=r?ot:at;e.bitset.add(s,i,n,o),this._receiveDCHave(s,i,n,e),e.isAvailableUrgently&&this._handleDCHave(e,s,i,n,o)}})).on(t.DC_HAVE_REVERSE,(t=>{if(e.bitset&&t.sn>=0){const{sn:s,level:i,seg_id:r}=t;e.bitset.hasCompleteOr(s,i,ht)||e.bitset.add(s,i,r,ht),this._receiveDCHave(s,i,r,e),e.isAvailableUrgently&&this._handleDCHave(e,s,i,r,ht)}})).on(t.DC_LOST,(t=>{if(!e.bitset)return;const{sn:s,level:i}=t;e.bitset.has(s,i)&&(e.bitset.delete(s,i),this.bitCounts.decre(s,i))})).on(t.DC_PIECE,(e=>{e.ext&&e.ext.incompletes>=7||this.notifyAllPeers(e.sn,e.level,e.seg_id,e.reverse?ht:at)})).on(t.DC_PIECE_CANCEL,(t=>{const{sn:s,level:i}=t,r=this.requestingMap.get(s,i);if(r)return void r.removeStreamListener(e.remotePeerId);const n=this.segmentBuilderMap.get(s,i);n&&n.removeStreamListener(e.remotePeerId)})).on(t.DC_PIECE_NOT_FOUND,(t=>{const{sn:s,level:i}=t;e.bitset.delete(s,i),this.bitCounts.decre(s,i),e.checkIfNeedChoke(!0)})).on(t.DC_REQUEST,(async s=>{const{logger:i}=this,{sn:r,level:n,reverse:o}=s;this.isUploader=!0;let a=s.seg_id;a||(a=await this.bufMgr.getSegIdBySN(r));const h=this.requestingMap.get(r,n);let l=!1;h&&h.isDownloading()&&(l=!0);const c=await this.bufMgr.getSegById(a);if(c)i.info(`found seg ${a} from bufMgr`),c.level===n?e.sendBuffer(c.sn,c.segId,c.data,{from:"Cache",level:c.level,reverse:o}):e.sendPieceNotFound(r,a,{level:n});else if(l){i.info(`syn had ${h.loadedPackets()} packets, wait remain from upstream ${h.getFromPeerId()}`);const t={...h.pieceMsg,reverse:o},s=o?h.reverseBufList:h.forwardBufList;e.sendPartialBuffer(t,s,{from:h.isFull()?"WaitPartialDouble":"WaitPartialSingle",incompletes:1}),s.length<t.attachments?u(h,e,o):e.uploading=!1}else if(o)e.sendPieceNotFound(r,a,{level:n});else{const s=this.segmentBuilderMap.get(r,n);if(s)i.info(`peer request ${r} wait from builder, sent ${s.bufferList.length}`),d(s,e);else if(r>=this.loadingSN){let s;const h=h=>{this.segmentBuilderMap.off(`${t.BUILDER_MAP_HAVE}${r}-${n}`,s),h&&h.level===n?(i.info(`peer request notify seg ${h.sn}`),e.sendBuffer(h.sn,h.segId,h.data,{from:"NotifySegment",level:h.level,reverse:o})):e.sendPieceNotFound(r,a,{level:n})};s=s=>{this.bufMgr.off(`${t.BM_ADDED_SN_}${r}`,h),d(s,e)},i.info(`peer request ${r} wait from fragLoader`),this.segmentBuilderMap.once(`${t.BUILDER_MAP_HAVE}${r}-${n}`,s),this.bufMgr.once(`${t.BM_ADDED_SN_}${r}`,h)}else e.sendPieceNotFound(r,a,{level:n})}function d(e,t){t.sendPartialBuffer(e.pieceMsg,e.bufferList,{from:e.source,incompletes:1}),e.bufferList.length<e.pieceMsg.attachments?u(e,t,!1):t.uploading=!1}function u(e,t,s){e.addStreamListener(s,t.remotePeerId,((e,s,i,r,n)=>{i?t.sendMsgPieceAbort(r):t.send(r),n&&(t.uploading=!1)}))}}))}handleMetaData(e,t){if(t.field){e.bitset=new gt(this.config.live,t.field);for(let e in t.field){const s=Number(e);if(s<0)continue;t.field[s].forEach((e=>{this.bitset.has(e,s)||this.bitCounts.incre(e,s)}))}this.addPeer(e),this.downloadOnly&&this.chokePeerRequest(e)}}peersHas(e,t){return this.bitCounts.has(e,t)}deletePeer(e){if(this.peerManager.hasPeer(e.remotePeerId)&&e.bitset){const t=e.bitset.allArray();for(let e in t){const s=Number(e),i=t[s];i&&i.forEach((e=>{this.bitCounts.decre(e,s)}))}}this.cleanRequestingMap(e.remotePeerId),super.deletePeer(e)}hasAndSetTargetPeer(e,t,s,i){const{logger:r,config:n}=this;this.waitForPeer&&(this.mBufferedDuration=i=n.waitForPeerTimeout+n.httpLoadTime);let o=1e3*(i-n.httpLoadTime);const a=n.httpLoadTime+1.5;if(r.info(`bufferedDuration ${1e3*i} remainLoadTime ${o}`),i<=a)return!1;if(this.requestingMap.has(e,t)){const h=this.requestingMap.get(e,t);if(!h)return this._searchAvailablePeers(e,t,s);const l=h.segId;if(l&&l!==s)return r.warn(`syn segId ${l} not match ${s}`),this.requestingMap.delete(e,t),this._searchAvailablePeers(e,t,s);if(!h.shouldWaitForRemain(o)){if(r.warn(`syn prefetch timeout at ${e}`),h.isFull())return!1;const o=this.peerManager.getPeersOrderByWeight(),l=lt(o,ot,e,t,s);let c=lt(o,at,e,t,s),d=lt(o,ht,e,t,s);if(h.hasReversePeer()){if(c=l.concat(c),c.length>0)return this.targetPeers.forwardPeer=c[0],!0}else if(h.hasForwardPeer()){if(d=l.concat(d),d.length>0)return this.targetPeers.reversePeer=d[0],!0}else{if(l.length>0)return h.hasForwardBuffer()?this.targetPeers.reversePeer=l[0]:this.targetPeers.forwardPeer=l[0],!0;{let e=!1;if(c.length>0&&(this.targetPeers.forwardPeer=c[0],e=!0),d.length>0&&(this.targetPeers.reversePeer=d[0],e=!0),e)return!0}}return!h.isEmpty()&&n.httpRangeSupported&&i>a+1}return r.info(`prefetch ${e} wait for remain`),!0}return this._searchAvailablePeers(e,t,s)}_searchAvailablePeers(e,t,s){if(!this.hasIdlePeers||!this.peersHas(e,t))return!1;const i=this.peerManager.getPeersOrderByWeight(),[r,n]=((e,t,s,i)=>{const r=lt(e,ot,t,s,i);if(r.length>=2)return[r[0],r[1]];if(1===r.length){const n=lt(e,at,t,s,i);if(n.length>=1)return[n[0],r[0]];const o=lt(e,ht,t,s,i);return o.length>=1?[r[0],o[0]]:0===g(0,1)?[null,r[0]]:[r[0],null]}const n=lt(e,at,t,s,i);if(n.length>=1)return[n[0],null];const o=lt(e,ht,t,s,i);return o.length>=1?[null,o[0]]:[null,null]})(i,e,t,s);return this.targetPeers={forwardPeer:r,reversePeer:n},[r,n].some((e=>!!e))}reportTraffic(e,t,s){const{fetcher:i}=this.engine;i&&(e>0&&i.reportFlow(e),t>0&&i.reportDCTraffic(t,s))}notifyAllPeers(e,t,s,i=ot){if(!s)return void this.logger.error("segId is required");if(this.downloadOnly)return;const{live:r}=this.config;if(this.bitset.has(e,t,i))return;const n=((e,t,s)=>`${e}-${t}-${s}`)(e,t,i);let o;i!==ht&&(o=i===ot);const a=this.requestingMap.get(e,t);for(let h of this.getPeers())a&&a.hasPeer(h)||h.notifySet.has(n)||h.bitset.hasCompleteOr(e,t,i)||h.uploading||(h.sendMsgHave(e,s,{level:t,reverse:i===ht,complete:o}),h.notifySet.add(n),r&&S(h.notifySet,20))}checkPeers(){if(!this.hasPeers)return;const{logger:e,config:t,engine:s}=this,i=t.live,{currentLevel:r}=s;if(0===this.bitCounts.size(r))return;if(!i&&this.nextLostSN>=0&&this.nextLostSN>=this.currPlaySN-10)return;if(this.mBufferedDuration<this.allowP2pLimit&&(0!==this.mBufferedDuration||this.isHlsjs))return void e.info(`low buffer time ${this.mBufferedDuration}, skip prefetch`);const n=this.peerManager.getPeersOrderByWeight();if(0===n.length)return;const o=[];let{prefetchNum:a,endSN:h,startSN:l}=t;i&&(a=1);let c=0,d=this.loadingSN+1;if(!i)if(this.loadingSN>=h&&!this.bufMgr.overflowed)d=l;else{const e=Math.min(...n.filter((e=>e.endSN>=d)).map((e=>e?e.startSN:1/0)));if(!isFinite(e))return;d<e&&(d=e)}for(;o.length<a&&o.length<n.length&&c<this.maxPrefetchCount;){if(!i&&d>h)return;if(i&&d>this.loadingSN+2)return;if(this.bitset.has(d,r))d++;else{if(d!==this.loadingSN&&this.bitCounts.has(d,r)&&!this.requestingMap.has(d,r))for(let s of n)if(!o.includes(s)&&s.bitset.has(d,r)){const i=s.bitset.getState(d,r);let n;n=i===ot?0===g(0,1):i===ht,o.push(s);const a=s.bitset.getSegId(d,r),h=new Rt(this.coordinator,this.logger,d,r,a,t.httpRangeSupported);this._setupSynthesizer(h),n?h.setReversePeer(s):h.setForwardPeer(s),this.requestingMap.set(d,r,h),s.requestDataBySN(d,!1,{level:r,reverse:n}),e.info(`request prefetch ${d} level ${r} from peer ${s.remotePeerId} downloadNum ${s.downloadNum} reverse ${n}`);break}c++,d++}}this.loadedPeerNum=o.length}onBufferManagerLost(e,t,s,i){this.currLostSN=e,s&&(this.nextLostSN=s),this.bitset.delete(e,i),this.bitCounts.delete(e,i)}cleanRequestingMap(e){const t=this.peerManager.getPeer(e);if(t)for(let[s,i]of this.requestingMap.internalMap){const r=s.split("-"),n=Number(r[1]),o=Number(r[0]);i.hasPeerId(e)&&(this.logger.info(`delete ${e} in synthesizer`),i.deletePeer(t),this.bitCounts.decre(n,o),t.bitset.delete(n,o))}}shouldWaitForNextSeg(){let e;return e=!this.isUploader&&(!!this.isReceiver||g(0,100)>20),this.isReceiver=this.isUploader=!1,e}updateLoaded(e,t,s){this.bitset.hasCompleteOr(e,t)||(this.bitset.add(e,t,s,ot),this.bitCounts.delete(e,t))}broadcastPlaylist(e,t){if(!this.config.live)return;const s=function(e){const t=e.split("\n");let s=0,i=0;for(let e of t){const t=/^#EXT-X-MEDIA-SEQUENCE:?(\-?[0-9.]*)?/.exec(e);if(t&&t[1]){s=parseInt(t[1],10);break}}for(let e of t)e.startsWith("#EXTINF")&&i++;return s+i-1}(t);if(!this.isMobileNet)for(let i of this.getPeers())i.sendMsgPlaylist(e,t,s);this.playlistInfo.set(e,{seq:s,data:t})}getPlaylistFromPeer(e){if(!this.config.live)return null;const{seq:t,data:s}=this.playlistInfo.get(e);for(let s of this.getPeers()){const i=s.getLatestPlaylist(e,t);if(i)return this.playlistInfo.set(e,i),i}return null}getBufferedDuration(){let{media:e,currentSrc:t}=this.engine;if(!e||e.src!==t&&0===e.currentTime){if(this.logger.info("try get video element"),e=function(e,t){let s;if(e&&("string"==typeof e?s=document.querySelector(e):e instanceof HTMLMediaElement&&(s=e)),!s){const e=[...document.getElementsByTagName("video"),...document.getElementsByTagName("audio")];1===e.length?s=e[0]:(t&&(s=e.find((e=>e.src===t))),s||(s=e.find((e=>e.currentTime>0))))}return s}(this.config.mediaElem,t),!e)return 5;this.engine.media=e}let s=0,i=e.currentTime,r=e.buffered;for(let e=r.length-1;e>=0;e--)if(i>=r.start(e)&&i<=r.end(e)){s=r.end(e)-i;break}return this.mBufferedDuration=s,s>0?s:0}destroy(){super.destroy(),this.requestingMap.clear(),this.segmentBuilderMap.clear()}_handleSynOutput(e,t){e>0?this.httpTimeouts++:this.httpTimeouts>0&&this.httpTimeouts--,t&&this.logger.warn("underused transfer")}_notifySynthesizer(e,t,s,i,r,n=!0){const{logger:o}=this,a=this.requestingMap.get(s,i);if(!a)return;const h=a.segId;function l(r,n){n?e.requestDataById(t,s,!0,{level:i,reverse:r}):(o.info(`notify syn prefetch ${s}`),e.requestDataBySN(s,!1,{level:i,reverse:r}))}function c(){return r===at||r===ot}function d(){return r===ht||r===ot}t&&h&&t!==h?o.warn(`notifySynthesizer segId ${t} not match ${h}`):a.isFull()||a.isAlmostDeadline()||(a.isEmpty()?a.hasForwardBuffer()&&d()?(a.setReversePeer(e),l(!0,n)):a.hasReverseBuffer()&&c()&&(a.setForwardPeer(e),l(!1,n)):!a.hasForwardPeer()&&c()?(a.setForwardPeer(e),l(!1,n)):!a.hasReversePeer()&&d()&&(a.setReversePeer(e),l(!0,n)))}_setupEngine(){}getStatsForPeer(){const{currentLevel:e,media:t}=this.engine,s={level:e};if(t&&!this.config.live){const{currentTime:e}=t;s.pos=Math.round(e)}return s}_handleSynError(e){switch(e){case It:this.logger.warn("ERROR_SYN_RANGE_REQUEST"),this.httpRangeErrs++;break;case Tt:this.logger.warn("ERROR_SYN_HTTP_TIMEOUT"),this.httpTimeouts+=3}this.httpRangeErrs>=5&&(this.config.httpLoadTime<=4.5&&(this.config.httpLoadTime+=.5),this.httpRangeErrs=0)}}const Mt=class extends At{constructor(e,t){super(e,t),this.isHlsjs=!0,this.waitForPeer=t.waitForPeer||!1,this.waitForPeerTimeout=t.waitForPeerTimeout,this.waitingPeers=0,this.waitingSeg={},this.requestedSet=new Set}startWaitPeerTimer(){this.waitForPeer&&(this.waitForPeerTimer=setTimeout((()=>{this.waitForPeer&&(this.waitForPeer=!1,this.emit(t.SCH_WAIT_PEER))}),1e3*(this.waitForPeerTimeout+0)))}updatePlaySN(e){this.currPlaySN=e}load(e,t,s){this.isReceiver=!0;const{logger:i,config:r}=this;this.context=e;const{rangeStart:n,rangeEnd:o,url:a}=e,h=e.frag,{segId:l,sn:c,level:d}=h;this.callbacks=s,this.stats=Ke(),this.criticalSeg={sn:c,level:d,segId:l};let u=this.mBufferedDuration-r.httpLoadTime;u>this.dcDownloadTimeout&&(u=this.dcDownloadTimeout);const{forwardPeer:g,reversePeer:f}=this.targetPeers;g||f||(u-=1);let p=this.requestingMap.get(c,d);const m={rangeStart:Number(n),rangeEnd:Number(o),url:a,httpLoadTime:1e3*r.httpLoadTime-500,xhrSetup:r.xhrSetup,segId:l,headers:Object.keys(e.headers||{}).length>0?e.headers:void 0};p?p.setExtra(m):(p=new Rt(this.coordinator,this.logger,c,d,l,this.httpRangeSupported,m),this._setupSynthesizer(p),this.requestingMap.set(c,d,p)),g&&(p.setForwardPeer(g),g.requestDataById(l,c,!0,{level:d})),f&&(p.setReversePeer(f),f.requestDataById(l,c,!0,{level:d,reverse:!0})),p.isEmpty()&&(u=0),i.info(`syn setTimeout ${u}`),p.setTimeout(1e3*u),this.targetPeers={}}waitPeerNotifier(){return new Promise((e=>{this.waitForPeer||e(),setTimeout(e,1e3*this.waitForPeerTimeout),this.once(t.SCH_WAIT_PEER,e)}))}addPeer(e){if(super.addPeer(e),this.waitForPeer){const{level:s,sn:i}=this.waitingSeg,r=e.remotePeerId;e.bitset.has(i,s)?(this.logger.info(`found initial seg ${s}-${i} from peer ${r}`),this.emit(t.SCH_WAIT_PEER)):this.waitingPeers===this.peersNum&&this.emit(t.SCH_WAIT_PEER)}}notifyPeersLoaded(e){this.logger.info(`notifyPeersLoaded ${e}`),this.waitForPeer&&(0===e?(this.waitForPeer=!1,this.emit(t.SCH_WAIT_PEER)):this.waitingPeers=e)}destroy(){super.destroy(),this.logger.warn("destroy HlsjsScheduler"),clearTimeout(this.waitForPeerTimer)}_setupDC(e){super._setupDC(e)}_setupSynthesizer(e){const s=()=>{this.bitCounts.has(this.loadingSN,this.engine.currentLevel)&&this.emit(t.SCH_DCHAVE,this.loadingSegId),this.criticalSeg||this.checkPeers()};e.on(t.SYN_OUTPUT,((t,i)=>{const{config:r,logger:n}=this,{segId:o,sn:a,data:h,level:l}=t,{speed:c,http:d,p2p:u,underused:g}=i;this._handleSynOutput(d,g);const f=this.criticalSeg&&this.criticalSeg.segId===o;if(r.validateSegment(o,new Uint8Array(h))){this.notifyAllPeers(a,l,o),this.bitset.has(a,l)||this.reportTraffic(d,u,c);const s=e.getFromPeerId();if(f){n.info(`receive criticalSeg seg_id ${o}`);let{stats:e}=this;e.tload=e.loading.end=performance.now(),e.loaded=e.total=h.byteLength,this.criticalSeg=null;const{frag:t}=this.context;t.fromPeerId=s,t.loadByP2P=!0,this.callbacks.onSuccess({data:h,url:this.context.url},e,this.context),this.callbacks=void 0}else this.bitset.has(a,l)||(this.bufMgr.putSeg(t),this.updateLoaded(a,l,o))}else n.error(`segment ${o} validate failed`),f&&this.callbacks.onTimeout(this.stats,this.context,null);this.requestingMap.delete(a,l),r.live&&s()})).on(t.SYN_ERROR,((t,i)=>{const{config:r,logger:n}=this,{sn:o,level:a}=t;n.warn(`SYN_ERROR loading ${o} code ${i}`),this.criticalSeg&&this.criticalSeg.sn===o&&(this.criticalSeg=null,this.callbacks.onTimeout(this.stats,this.context,null)),i===Lt&&e.hasPartialBuffer()?n.warn("syn abort with partial buffer"):(this.requestingMap.delete(o,a),this._handleSynError(i)),r.live&&s()})).on(t.SYN_PROGRESS,(({total:e,loaded:t,first:s,segId:i})=>{let{stats:r}=this;s&&r&&(r.tfirst=r.loading.first=Math.max(r.trequest,performance.now()));this.criticalSeg&&this.criticalSeg.segId===i&&this.callbacks&&this.callbacks.onLoaded&&this.callbacks.onLoaded({total:e,loaded:t,first:s},this.context)}))}_setupEngine(){super._setupEngine(),this.engine.on(t.FRAG_LOADING,(({sn:e,segId:t,byHttp:s,level:i})=>{if(this.loadingSN=e,this.loadingSegId=t,s){const s=this.requestingMap.get(e,i);s&&0===s.streamListeners()&&(this.logger.warn(`http loading ${t}, destroy syn`),this.requestingMap.delete(e,i))}})).on(t.FRAG_LOADED,(({sn:e,segId:t,byP2p:s,level:i})=>{this.requestingMap.delete(e,i),this.updateLoaded(e,i,t)})).on(t.FRAG_CHANGED,(({sn:e})=>{this.updatePlaySN(e)}))}_handleDCHave(e,t,s,i,r){this._notifySynthesizer(e,i,t,s,r),this.config.live&&!this.criticalSeg&&B()((()=>{this.checkPeers()}))}};const Nt=class extends Se{static get name(){return"HlsjsP2pEngine"}constructor(e,t={}){if(super(t),!e)throw new TypeError("hlsjs instance is null");this.hlsjs=e,this.HLSEvents=e.constructor.Events;const s=e.constructor.version;this.config.isHlsV0=s&&"0"===s.split(".")[0],this.config.xhrSetup=e.config.xhrSetup,!0===this.config.httpStreamEnabled&&(e.config.streamEnabled=function(){if(self.fetch&&self.AbortController&&self.ReadableStream&&self.Request)try{return new self.ReadableStream({}),!0}catch(e){}return!1}());const{channelIdMaker:i,signalId:r,browserInfo:n}=this.setup();this.config.waitForPeer&&this.config.sourceUrl?(this.config.trickleICE=!0,this.config.httpRangeSupported=!0,this._startEngine(this.config.sourceUrl,this.config.live,n,i,r)):this.config.waitForPeer=!1;const o=(t,s)=>{if(!s)return;const{config:a}=this,h=s.details,l=h.live;a.waitForPeer?(this.tracker&&this.tracker.scheduler.startWaitPeerTimer(),this.logger.info("waitForPeer mode")):this._startEngine(this.hlsjs.url,l,n,i,r,h),e.off(this.HLSEvents.LEVEL_LOADED,o)};e.on(this.HLSEvents.LEVEL_LOADED,o);const a=(e,t)=>{if(!t)return;const{config:s}=this,{fragments:i,averagetargetduration:r}=t.details;s.httpLoadTime=this.determineHttpLoadTime(i),this.logger.info(`segments in playlist: ${i.length}, targetDuration: ${r}`)};0===this.config.httpLoadTime&&(this.config.live?e.on(this.HLSEvents.LEVEL_LOADED,a):this.config.httpLoadTime=2.5);const h=(t,s)=>{const{config:i}=this;s.audioTracks&&s.audioTracks.length>0&&(i.strictSegmentId||i.segmentId||(i.segmentId=ut)),i.segmentId||(this.config.segmentId=i.strictSegmentId?ut:dt);const r=s.levels.length;this.multiBitrate=r>1,e.off(this.HLSEvents.MANIFEST_PARSED,h)};e.on(this.HLSEvents.MANIFEST_PARSED,h),e.on(this.HLSEvents.DESTROYING,(()=>{e.off(this.HLSEvents.LEVEL_LOADED,a),this.destroy()}))}_startEngine(e,t,s,i,r,n={}){const{config:o}=this;o.live=this.hlsjs.config.live=t,this.browserInfo={...s,live:t,abr:this.multiBitrate||void 0,type:"hls"},this.channel=`${i(e)}|${r}[${G.VERSION}]`,this.setupElectron();const a=this.initLogger();a.info("use HlsjsP2pEngine"),this.logger=this.hlsjs.config.logger=a,a.info(`channel ${this.channel}`),t||(o.startSN=n.startSN,o.endSN=n.endSN,a.info(`startSN ${n.startSN} endSN ${n.endSN}`)),this.eventListened=!1,this._init(this.channel,this.browserInfo)}async _init(e,s){const{logger:i,config:r}=this;if(!this.p2pEnabled||"undefined"==typeof self)return;this.hlsjs.config.p2pEnabled=this.p2pEnabled,this.hlsjs.config.sharePlaylist=r.sharePlaylist;try{await this.initSegmentManager()}catch(e){return void i.warn(e)}this.media=this.hlsjs.media,this.media&&(this.currentSrc=this.media.src),s.live||(s.tag=this.getTagForVod(),this.media&&(s.pos=Math.round(this.media.currentTime)));let o=new Ue(this,r.token,encodeURIComponent(e),r.announce||"",s);this.fetcher=o;const a=new Mt(this,r);this.tracker=new Ye(this,o,a,r),this.hlsjs.config.bufMgr=this.bufMgr,a.bufferManager=this.bufMgr,this.hlsjs.config.segmentId=this.config.segmentId,this.hlsjs.config.fLoader=function(e,s,i,r,o){return class extends(n()){constructor(t){super(),this.logger=t.logger,this.isHlsV0=r,this.bufMgr=t.bufMgr,this.streamEnabled=t.streamEnabled,this.httpLoader=this.streamEnabled?new tt(t):new t.loader(t),this.p2pEnabled=t.p2pEnabled,this.isLive=t.live,this.scheduler=e,this.fetcher=s,this.segmentId=t.segmentId||(t.strictSegmentId?ut:dt),this.blockTypes=i,this.forbidden=s.forbidden,this.stats=this.httpLoader.stats||Ke(),this.enableWorker=t.enableWorker,this.segmentBypass="function"==typeof o?o:()=>!1}destroy(){this.httpLoader.destroy()}abort(){this.httpLoader.abort()}async load(e,s,i){const{logger:r,scheduler:n}=this,o=e.frag;this.isHlsV0||(o.stats=this.stats);let a=e.frag.segId;if(!a){let t;e.rangeEnd&&(t="bytes="+e.rangeStart+"-"+(e.rangeEnd-1)),a=e.frag.segId=this.segmentId(String(o.level),o.sn,o.url,t)}if(!o.url||Xe(o.url,this.blockTypes,o.type)||this.segmentBypass(o.url,o.tagList))return r.info(`HTTP load blockType ${o.url}`),e.frag.loadByHTTP=!0,this.httpLoader.load(e,s,i);if(this.isLive&&n.requestedSet.has(a))return r.warn(`HTTP load duplicated ${o.url}`),e.frag.loadByHTTP=!0,this.httpLoader.load(e,s,i);if(this.forbidden)return;this.fetcher.increMediaRequests(),s.maxRetry=2;const h=n.getBufferedDuration(),l=await this.bufMgr.getSegById(a);if(this.p2pEnabled&&l){r.info(`bufMgr found seg sn ${o.sn} segId ${a} level ${o.level}`);let t=m(l.data).buffer,s={url:e.url,data:t};return Ze(this.stats,l.size),o.loaded=l.size,o.loadByP2P=!0,e.frag.fromPeerId=l.fromPeerId,void B()((()=>{!this.isHlsV0&&i.onProgress&&i.onProgress(this.stats,e,s.data),i.onSuccess(s,this.stats,e)}))}if(this.p2pEnabled&&n.hasAndSetTargetPeer(o.sn,o.level,o.segId,h))this.loadFragByP2p(e,s,i,a);else if(n.waitForPeer&&(r.warn("waitPeerNotifier start"),n.waitingSeg={sn:o.sn,level:o.level},await n.waitPeerNotifier(),r.warn("waitPeerNotifier end"),this.p2pEnabled&&n.hasAndSetTargetPeer(o.sn,o.level,o.segId,h)))this.loadFragByP2p(e,s,i,a);else if(r.info(`fragLoader load ${a} at ${o.sn} level ${o.level} buffered ${1e3*h}`),this.isLive&&n.hasPeers&&h>7&&n.shouldWaitForNextSeg()){let l=h-7;l>4.5&&(l=4.5);const c=r=>{r===a&&(n.off(t.SCH_DCHAVE,c),clearTimeout(this.waitTimer),n.hasAndSetTargetPeer(o.sn,o.level,o.segId,h)?this.loadFragByP2p(e,s,i,a):this.loadFragByHttp(e,s,i,a))};r.info(`wait peer have for ${l}s`),n.on(t.SCH_DCHAVE,c),this.waitTimer=setTimeout((()=>{this.loadFragByHttp(e,s,i,a),n.off(t.SCH_DCHAVE,c)}),1e3*l)}else{const t=n.requestingMap.get(o.sn,o.level);n.httpRangeSupported&&t&&t.segId===o.segId&&t.hasPartialBuffer()?(r.warn(`syn has partial buffer for ${o.segId}`),this.loadFragByP2p(e,s,i,a)):this.loadFragByHttp(e,s,i,a)}}loadFragByHttp(e,t,s,i){const{logger:r,scheduler:n}=this,{segmentBuilderMap:o}=n;n.isReceiver=!1;const a=e.frag,{sn:h,level:l}=a;if(this.streamEnabled){let e;n.isMobileNet||n.notifyAllPeers(h,l,i,at),s.onUpdate=(t,s,i)=>{i?o.delete(h,l):e&&e.receiveBytes(t,s)},s.onBodyStart=t=>{!e&&t>0&&(e=new rt(h,l,i,t),o.has(h,l)||o.set(h,l,e))}}const c=s.onSuccess;s.onSuccess=async(e,t,s)=>{if(!await this.bufMgr.hasSegOfId(i)){const t=m(e.data).buffer,s=new z(h,i,t,this.fetcher.peerId,l);this.bufMgr.putSeg(s)}o.delete(h,l),this.fetcher.reportFlow(t.total);let a=t.tload-t.trequest;r.info(`HTTP loaded ${i} time ${a}`),n.notifyAllPeers(h,l,i),c(e,t,s)};const d=s.onProgress;s.onProgress=(e,t,s)=>{a.loaded=e.total,d(e,t,s&&this.enableWorker?m(s).buffer:s)},e.frag.loadByHTTP=!0,this.httpLoader.load(e,t,s)}loadFragByP2p(e,t,s,i){const{logger:r}=this,n=e.frag;this.scheduler.load(e,t,s);const o=s.onSuccess,a=s.onTimeout;s.onTimeout=(e,h)=>{r.warn(`P2P timeout switched to HTTP load ${n.relurl} at ${n.sn}`),s.onSuccess=o,this.loadFragByHttp(h,t,s,i),s.onTimeout=a},s.onSuccess=async(e,t,a)=>{if(!await this.bufMgr.hasSegOfId(i)){const t=m(e.data).buffer,s=new z(n.sn,i,t,n.fromPeerId||this.fetcher.peerId,n.level);this.bufMgr.putSeg(s)}n.loadByP2P||this.fetcher.reportFlow(t.total),n.loaded=t.loaded,r.info(`${n.loadByP2P?"P2P":"HTTP"} loaded segment id ${i}`),!this.isHlsV0&&s.onProgress&&s.onProgress(t,a,e.data),o(e,t,a)}}}}(a,o,r.p2pBlackList,r.isHlsV0,r.segmentBypass),r.sharePlaylist&&(this.hlsjs.config.pLoader=function(e){return class extends(n()){constructor(t){super(),this.logger=t.logger,this.xhrLoader=new t.loader(t),this.p2pEnabled=t.p2pEnabled,this.scheduler=e,this.stats=this.xhrLoader.stats||Ke()}destroy(){this.xhrLoader.destroy()}abort(){this.xhrLoader.abort()}load(e,t,s){const{logger:i}=this,{url:r}=e,n=function(e){return e.split("?")[0]}(r),o=s.onSuccess;if(s.onSuccess=(e,t,s)=>{this.scheduler&&!s.loadedByPeer&&this.scheduler.broadcastPlaylist(n,e.data),o(e,t,s)},this.scheduler&&this.scheduler.playlistInfo.has(n)){const t=this.scheduler.getPlaylistFromPeer(n);if(t&&t.data){const{data:n,seq:o}=t;i.info(`got playlist from peer seq ${o}`),Ze(this.stats,n.length);let a={url:r,data:n};return e.loadedByPeer=!0,void B()((()=>{s.onSuccess(a,this.stats,e)}))}}this.xhrLoader.load(e,t,s)}}}(a)),this.trackerTried=!1,this.eventListened||(this.hlsjs.on(this.HLSEvents.FRAG_LOADING,this._onFragLoading.bind(this)),this.hlsjs.on(this.HLSEvents.FRAG_LOADED,this._onFragLoaded.bind(this)),this.hlsjs.on(this.HLSEvents.FRAG_CHANGED,this._onFragChanged.bind(this)),this.hlsjs.on(this.HLSEvents.ERROR,this._onHlsError.bind(this)),this.eventListened=!0),this.setupWindowListeners(),this.trackerTried||this.tracker.connected||!r.p2pEnabled||(this.tracker.resumeP2P(),this.trackerTried=!0)}_onFragLoading(e,s){const i=s.frag;let{sn:r,level:n,segId:o}=i;if(!Xe(i.url,this.config.p2pBlackList,i.type)){if(this.logger.debug("loading frag "+r),this.bufMgr&&(this.bufMgr.loadingSN=r),!o){let e;i._byteRange&&(e="bytes="+i._byteRange[0]+"-"+i._byteRange[1]);let t=i.url;o=i.segId=this.config.segmentId(String(n),i.sn,t,e)}this.emit(t.FRAG_LOADING,{sn:r,segId:o,byHttp:i.loadByHTTP,level:n})}}_onFragLoaded(e,s){const{frag:i}=s,{sn:r,segId:n,loaded:o,duration:a,level:h,fromPeerId:l,loadByP2P:c,url:d}=i,{config:u,logger:g}=this;this.tracker&&(S(this.tracker.scheduler.requestedSet,50),this.tracker.scheduler.requestedSet.add(n)),Xe(i.url,u.p2pBlackList,i.type)||(this.emit(t.FRAG_LOADED,{url:d,sn:r,level:h,segId:n,loaded:o,duration:a,byP2p:!!c,fromPeerId:l}),!this.rangeTested&&u.useHttpRange&&(f(i.url,void 0,u.xhrSetup).then((()=>{u.httpRangeSupported=!0,g.info("http range is supported")})).catch((e=>{u.httpRangeSupported=!1,g.warn(`http range is not supported, ${e}`)})),this.rangeTested=!0))}_onFragChanged(e,s){const{frag:i}=s;if(!Xe(i.url,this.config.p2pBlackList,i.type)){this.logger.debug("frag changed: "+i.sn);const{sn:e,duration:s}=i;this.emit(t.FRAG_CHANGED,{sn:e,duration:s})}}_onHlsError(e,s){if(!s)return;const{logger:i}=this,r=`${s.type} details ${s.details} reason ${s.reason}`;if(s.fatal?i.error(r):i.warn(r),"networkError"===s.type)return;const{player:n}=this.browserInfo,o=`${n||""} hlsjs ${this.hlsjs.constructor.version} ${location.href}`,a=this.hlsjs.constructor.ErrorDetails;switch(s.details){case a.BUFFER_STALLED_ERROR:this.fetcher&&this.fetcher.increRebuffers();break;case a.INTERNAL_EXCEPTION:"demuxerWorker"!==s.event&&(s.error||(s.error={}),this.fetcher&&s.fatal&&(this.fetcher.errsInternalExpt++,this.fetcher.exptMsg=`${s.error.message} event ${s.event} ${o}`),i.error(`INTERNAL_EXCEPTION event ${s.event} err ${s.error.message}`),this.emit(t.EXCEPTION,we()(s.error,"HLSJS_EXPT")));break;default:if(s.fatal){const e=`${s.type} ${s.details} ${s.err||""} ${o}`;i&&i.reportUrl&&i.report(e,s.details,this.peerId,"2.9.2"),this.fetcher&&(this.fetcher.exptMsg=e)}}}get currentLevel(){const{currentLevel:e}=this.hlsjs;return e>=0?e:0}disableP2P(){this.logger&&this.logger.warn("disable P2P"),this.p2pEnabled&&(this.p2pEnabled=!1,this.config.p2pEnabled=this.hlsjs.config.p2pEnabled=this.p2pEnabled,this.tracker&&(this.tracker.stopP2P(),this.tracker={},this.fetcher=null,this.bufMgr.destroy(),this.bufMgr=null,this.hlsjs.config.fLoader=this.hlsjs.config.pLoader=this.hlsjs.constructor.DefaultConfig.loader))}onTrackerResume(e){e.report_url&&this.logger.enableReport(e.report_url)}};const kt=class extends Se{static get name(){return"ShadowP2pEngine"}constructor(){super(),console.warn("Using Shadow Engine")}disableP2P(){}isServiceWorkerSupported(){return!1}};class Ot{static get Events(){return t}static get TrackerZone(){return ie.TrackerZone}static isSupported(){return ie.isSupported()&&(re()||kt.isServiceWorkerSupported())}static isServiceWorkerSupported(){return kt.isServiceWorkerSupported()}static isMSESupported(){return re()}static getBrowser(){return W().getBrowser()}static get ServiceWorkerEngine(){return kt}static get HlsjsEngine(){return Nt}static async tryRegisterServiceWorker({swFile:e="./sw.js",swScope:t="./"}={}){return Ot.registerServiceWorker({swFile:e,swScope:t})}static async registerServiceWorker({swFile:e="./sw.js",swScope:t="./",hlsjsInstance:s}={}){const{serviceWorker:i}=navigator;return!i||s?Promise.resolve():i.getRegistration().then((s=>{return s||Promise.race([i.register(e,{scope:t}).then((e=>function(e){return new Promise(((t,s)=>{const i=e.installing||e.waiting||e.active,r=()=>"activated"===i.state&&(i.removeEventListener("statechange",r),t(e),!0);r()||i.addEventListener("statechange",r)}))}(e))),(r=300,new Promise((e=>setTimeout(e,r))))]);var r})).catch((()=>{Promise.resolve()}))}constructor(e={}){const{hlsjsInstance:t}=e;delete e.hlsjsInstance,e.live&&(e.useDiskCache=!1),"1"!==d("_ios")&&!e.proxyOnly&&t&&re()?this._realEngine=new Nt(t,e):this._realEngine=new kt(e)}get realEngine(){return this._realEngine}get engineName(){return this._realEngine.constructor.name}once(e,t){return this._realEngine.once(e,t)}on(e,t){return this._realEngine.on(e,t)}off(e,t){return this._realEngine.off(e,t)}removeListener(e,t){return this._realEngine.removeListener(e,t)}removeAllListeners(e){return this._realEngine.removeAllListeners(e)}set p2pEnabled(e){this._realEngine.p2pEnabled=e}get p2pEnabled(){return this._realEngine.p2pEnabled}enableP2P(){this._realEngine.enableP2P()}disableP2P(){this._realEngine.disableP2P()}destroy(){this._realEngine.destroy()}async registerServiceWorker(){return"function"==typeof this._realEngine.registerServiceWorker?this._realEngine.registerServiceWorker():Promise.reject("Not supported by this engine")}async unregisterServiceWorker(){return"function"==typeof this._realEngine.unregisterServiceWorker?this._realEngine.unregisterServiceWorker():Promise.reject("Not supported by this engine")}get version(){return ie.version}}Ot.version=ie.version,Ot.protocolVersion=G.VERSION,"undefined"!=typeof self&&(self.P2PEngineHls=Ot);const $t=Ot})(),i=i.default})()));