swarmcloud-hls 2.2.10 → 2.2.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hls-proxy.js +1 -1
- package/dist/hls.light.min.js +1 -1
- package/dist/hls.min.js +1 -1
- package/dist/p2p-engine.min.js +1 -1
- package/package.json +2 -2
package/dist/p2p-engine.min.js
CHANGED
|
@@ -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()}(self,(()=>(()=>{var __webpack_modules__={204:e=>{"use strict";var t,s="object"==typeof Reflect?Reflect:null,r=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 n=Number.isNaN||function(e){return e!=e};function i(){i.init.call(this)}e.exports=i,e.exports.once=function(e,t){return new Promise((function(s,r){function n(s){e.removeListener(t,i),r(s)}function i(){"function"==typeof e.removeListener&&e.removeListener("error",n),s([].slice.call(arguments))}p(e,t,i,{once:!0}),"error"!==t&&function(e,t,s){"function"==typeof e.on&&p(e,"error",t,s)}(e,n,{once:!0})}))},i.EventEmitter=i,i.prototype._events=void 0,i.prototype._eventsCount=0,i.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?i.defaultMaxListeners:e._maxListeners}function l(e,t,s,r){var n,i,o,l;if(a(s),void 0===(i=e._events)?(i=e._events=Object.create(null),e._eventsCount=0):(void 0!==i.newListener&&(e.emit("newListener",t,s.listener?s.listener:s),i=e._events),o=i[t]),void 0===o)o=i[t]=s,++e._eventsCount;else if("function"==typeof o?o=i[t]=r?[s,o]:[o,s]:r?o.unshift(s):o.push(s),(n=h(e))>0&&o.length>n&&!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 r={fired:!1,wrapFn:void 0,target:e,type:t,listener:s},n=c.bind(r);return n.listener=s,r.wrapFn=n,n}function u(e,t,s){var r=e._events;if(void 0===r)return[];var n=r[t];return void 0===n?[]:"function"==typeof n?s?[n.listener||n]:[n]: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}(n):f(n,n.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),r=0;r<t;++r)s[r]=e[r];return s}function p(e,t,s,r){if("function"==typeof e.on)r.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 n(i){r.once&&e.removeEventListener(t,n),s(i)}))}}Object.defineProperty(i,"defaultMaxListeners",{enumerable:!0,get:function(){return o},set:function(e){if("number"!=typeof e||e<0||n(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");o=e}}),i.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},i.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||n(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},i.prototype.getMaxListeners=function(){return h(this)},i.prototype.emit=function(e){for(var t=[],s=1;s<arguments.length;s++)t.push(arguments[s]);var n="error"===e,i=this._events;if(void 0!==i)n=n&&void 0===i.error;else if(!n)return!1;if(n){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=i[e];if(void 0===h)return!1;if("function"==typeof h)r(h,this,t);else{var l=h.length,c=f(h,l);for(s=0;s<l;++s)r(c[s],this,t)}return!0},i.prototype.addListener=function(e,t){return l(this,e,t,!1)},i.prototype.on=i.prototype.addListener,i.prototype.prependListener=function(e,t){return l(this,e,t,!0)},i.prototype.once=function(e,t){return a(t),this.on(e,d(this,e,t)),this},i.prototype.prependOnceListener=function(e,t){return a(t),this.prependListener(e,d(this,e,t)),this},i.prototype.removeListener=function(e,t){var s,r,n,i,o;if(a(t),void 0===(r=this._events))return this;if(void 0===(s=r[e]))return this;if(s===t||s.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete r[e],r.removeListener&&this.emit("removeListener",e,s.listener||t));else if("function"!=typeof s){for(n=-1,i=s.length-1;i>=0;i--)if(s[i]===t||s[i].listener===t){o=s[i].listener,n=i;break}if(n<0)return this;0===n?s.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(s,n),1===s.length&&(r[e]=s[0]),void 0!==r.removeListener&&this.emit("removeListener",e,o||t)}return this},i.prototype.off=i.prototype.removeListener,i.prototype.removeAllListeners=function(e){var t,s,r;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 n,i=Object.keys(s);for(r=0;r<i.length;++r)"removeListener"!==(n=i[r])&&this.removeAllListeners(n);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(r=t.length-1;r>=0;r--)this.removeListener(e,t[r]);return this},i.prototype.listeners=function(e){return u(this,e,!0)},i.prototype.rawListeners=function(e){return u(this,e,!1)},i.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):g.call(e,t)},i.prototype.listenerCount=g,i.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}},622:function(e){var t,s,r,n,i;t=/^(?=((?:[a-zA-Z0-9+\-.]+:)?))\1(?=((?:\/\/[^\/?#]*)?))\2(?=((?:(?:[^?#\/]*\/)*[^;?#\/]*)?))\3((?:;[^?#]*)?)(\?[^#]*)?(#[^]*)?$/,s=/^(?=([^\/?#]*))\1([^]*)$/,r=/(?:\/|^)\.(?=\/)/g,n=/(?:\/|^)\.\.\/(?!\.\.\/)[^\/]*(?=\/)/g,i={buildAbsoluteURL:function(e,t,r){if(r=r||{},e=e.trim(),!(t=t.trim())){if(!r.alwaysNormalize)return e;var n=i.parseURL(e);if(!n)throw new Error("Error trying to parse base URL.");return n.path=i.normalizePath(n.path),i.buildURLFromParts(n)}var o=i.parseURL(t);if(!o)throw new Error("Error trying to parse relative URL.");if(o.scheme)return r.alwaysNormalize?(o.path=i.normalizePath(o.path),i.buildURLFromParts(o)):t;var a=i.parseURL(e);if(!a)throw new Error("Error trying to parse base URL.");if(!a.netLoc&&a.path&&"/"!==a.path[0]){var h=s.exec(a.path);a.netLoc=h[1],a.path=h[2]}a.netLoc&&!a.path&&(a.path="/");var l={scheme:a.scheme,netLoc:o.netLoc,path:null,params:o.params,query:o.query,fragment:o.fragment};if(!o.netLoc&&(l.netLoc=a.netLoc,"/"!==o.path[0]))if(o.path){var c=a.path,d=c.substring(0,c.lastIndexOf("/")+1)+o.path;l.path=i.normalizePath(d)}else l.path=a.path,o.params||(l.params=a.params,o.query||(l.query=a.query));return null===l.path&&(l.path=r.alwaysNormalize?i.normalizePath(o.path):o.path),i.buildURLFromParts(l)},parseURL:function(e){var s=t.exec(e);return s?{scheme:s[1]||"",netLoc:s[2]||"",path:s[3]||"",params:s[4]||"",query:s[5]||"",fragment:s[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=i},47:(e,t)=>{"use strict";t.l=n;var s=2147483647;function r(e){if(e>s)throw new RangeError('The value "'+e+'" is invalid for option "size"');var t=new Uint8Array(e);return t.__proto__=n.prototype,t}function n(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 i(e,t,s)}function i(e,t,s){if("string"==typeof e)return function(e,t){"string"==typeof t&&""!==t||(t="utf8");if(!n.isEncoding(t))throw new TypeError("Unknown encoding: "+t);var s=0|c(e,t),i=r(s),o=i.write(e,t);o!==s&&(i=i.slice(0,o));return i}(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(m(e,ArrayBuffer)||e&&m(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 r;r=void 0===t&&void 0===s?new Uint8Array(e):void 0===s?new Uint8Array(e,t):new Uint8Array(e,t,s);return r.__proto__=n.prototype,r}(e,t,s);if("number"==typeof e)throw new TypeError('The "value" argument must not be of type number. Received type number');var i=e.valueOf&&e.valueOf();if(null!=i&&i!==e)return n.from(i,t,s);var o=function(e){if(n.isBuffer(e)){var t=0|l(e.length),s=r(t);return 0===s.length||e.copy(s,0,0,t),s}if(void 0!==e.length)return"number"!=typeof e.length||v(e.length)?r(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 n.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),r(e<0?0:0|l(e))}function h(e){for(var t=e.length<0?0:0|l(e.length),s=r(t),n=0;n<t;n+=1)s[n]=255&e[n];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(n.isBuffer(e))return e.length;if(ArrayBuffer.isView(e)||m(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,r=arguments.length>2&&!0===arguments[2];if(!r&&0===s)return 0;for(var i=!1;;)switch(t){case"ascii":case"latin1":case"binary":return s;case"utf8":case"utf-8":return _(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*s;case"hex":return s>>>1;default:if(i)return r?-1:_(e).length;t=(""+t).toLowerCase(),i=!0}}function d(e,t,s,r){s=Number(s)||0;const n=e.length-s;r?(r=Number(r))>n&&(r=n):r=n;const i=t.length;let o;for(r>i/2&&(r=i/2),o=0;o<r;++o){const r=parseInt(t.substr(2*o,2),16);if(v(r))return o;e[s+o]=r}return o}function u(e,t,s,r){return p(_(t,e.length-s),e,s,r)}function g(e,t,s,r){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,r)}function f(e,t,s,r){return p(function(e,t){let s,r,n;const i=[];for(let o=0;o<e.length&&!((t-=2)<0);++o)s=e.charCodeAt(o),r=s>>8,n=s%256,i.push(n),i.push(r);return i}(t,e.length-s),e,s,r)}function p(e,t,s,r){let n;for(n=0;n<r&&!(n+s>=t.length||n>=e.length);++n)t[n+s]=e[n];return n}function _(e,t){var s;t=t||1/0;for(var r=e.length,n=null,i=[],o=0;o<r;++o){if((s=e.charCodeAt(o))>55295&&s<57344){if(!n){if(s>56319){(t-=3)>-1&&i.push(239,191,189);continue}if(o+1===r){(t-=3)>-1&&i.push(239,191,189);continue}n=s;continue}if(s<56320){(t-=3)>-1&&i.push(239,191,189),n=s;continue}s=65536+(n-55296<<10|s-56320)}else n&&(t-=3)>-1&&i.push(239,191,189);if(n=null,s<128){if((t-=1)<0)break;i.push(s)}else if(s<2048){if((t-=2)<0)break;i.push(s>>6|192,63&s|128)}else if(s<65536){if((t-=3)<0)break;i.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;i.push(s>>18|240,s>>12&63|128,s>>6&63|128,63&s|128)}}return i}function m(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}function v(e){return e!=e}"undefined"!=typeof Symbol&&null!=Symbol.species&&n[Symbol.species]===n&&Object.defineProperty(n,Symbol.species,{value:null,configurable:!0,enumerable:!1,writable:!1}),n.from=function(e,t,s){return i(e,t,s)},n.prototype.__proto__=Uint8Array.prototype,n.__proto__=Uint8Array,n.alloc=function(e,t,s){return function(e,t,s){return o(e),e<=0?r(e):void 0!==t?"string"==typeof s?r(e).fill(t,s):r(e).fill(t):r(e)}(e,t,s)},n.allocUnsafe=function(e){return a(e)},n.isBuffer=function(e){return null!=e&&!0===e._isBuffer&&e!==n.prototype},n.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}},n.concat=function(e,t){if(!Array.isArray(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return n.alloc(0);var s;if(void 0===t)for(t=0,s=0;s<e.length;++s)t+=e[s].length;var r=n.allocUnsafe(t),i=0;for(s=0;s<e.length;++s){var o=e[s];if(m(o,Uint8Array)&&(o=n.from(o)),!n.isBuffer(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(r,i),i+=o.length}return r},n.byteLength=c,n.prototype._isBuffer=!0,n.prototype.copy=function(e,t,s,r){if(!n.isBuffer(e))throw new TypeError("argument should be a Buffer");if(s||(s=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r<s&&(r=s),r===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(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t<r-s&&(r=e.length-t+s);var i=r-s;if(this===e&&"function"==typeof Uint8Array.prototype.copyWithin)this.copyWithin(t,s,r);else if(this===e&&s<t&&t<r)for(var o=i-1;o>=0;--o)e[o+t]=this[o+s];else Uint8Array.prototype.set.call(e,this.subarray(s,r),t);return i},n.prototype.write=function(e,t,s,r){if(void 0===t)r="utf8",s=this.length,t=0;else if(void 0===s&&"string"==typeof t)r=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===r&&(r="utf8")):(r=s,s=void 0)}const n=this.length-t;if((void 0===s||s>n)&&(s=n),e.length>0&&(s<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");let i=!1;for(;;)switch(r){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(i)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),i=!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,r){if(!e||"string"==typeof e)throw new TypeError("Please pass an Error to err-code");r||(r={}),"object"==typeof s&&(r=s,s=void 0),null!=s&&(r.code=s);try{return t(e,r)}catch(s){r.message=e.message,r.stack=e.stack;const n=function(){};return n.prototype=Object.create(Object.getPrototypeOf(e)),t(new n,r)}}},485:function(e,t,s){var r;!function(n){"use strict";function i(e,t){var s=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(s>>16)<<16|65535&s}function o(e,t,s,r,n,o){return i((a=i(i(t,e),i(r,o)))<<(h=n)|a>>>32-h,s);var a,h}function a(e,t,s,r,n,i,a){return o(t&s|~t&r,e,t,n,i,a)}function h(e,t,s,r,n,i,a){return o(t&r|s&~r,e,t,n,i,a)}function l(e,t,s,r,n,i,a){return o(t^s^r,e,t,n,i,a)}function c(e,t,s,r,n,i,a){return o(s^(t|~r),e,t,n,i,a)}function d(e,t){var s,r,n,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)r=u,n=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=i(u,r),g=i(g,n),f=i(f,o),p=i(p,d);return[u,g,f,p]}function u(e){var t,s="",r=32*e.length;for(t=0;t<r;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 r=8*e.length;for(t=0;t<r;t+=8)s[t>>5]|=(255&e.charCodeAt(t/8))<<t%32;return s}function f(e){var t,s,r="0123456789abcdef",n="";for(s=0;s<e.length;s+=1)t=e.charCodeAt(s),n+=r.charAt(t>>>4&15)+r.charAt(15&t);return n}function p(e){return unescape(encodeURIComponent(e))}function _(e){return function(e){return u(d(g(e),8*e.length))}(p(e))}function m(e,t){return function(e,t){var s,r,n=g(e),i=[],o=[];for(i[15]=o[15]=void 0,n.length>16&&(n=d(n,8*e.length)),s=0;s<16;s+=1)i[s]=909522486^n[s],o[s]=1549556828^n[s];return r=d(i.concat(g(t)),512+8*t.length),u(d(o.concat(r),640))}(p(e),p(t))}function v(e,t,s){return t?s?m(t,e):f(m(t,e)):s?_(e):f(_(e))}void 0===(r=function(){return v}.call(t,s,t,e))||(e.exports=r)}()},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(r())||[,""])[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(r())},isPC:function(){return!i(n("os "))&&!i(n("android[/ ]"))},isIOS:function(){return i(n("os "))},isAndroid:function(){return i(n("android[/ ]"))},isIOSSafari:function(){return this.isIOS()&&this.isSafari()},isElectron:function(){return/electron/i.test(r())},isMobile:function(){return s.isAndroid()||s.isIOS()},isSafari:function(){return/^((?!chrome|android).)*safari/i.test(r())},isFirefox:function(){return/firefox/i.test(r())},isChrome:function(){return/chrome/i.test(r())},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 r(){return navigator.userAgent.toLowerCase()}function n(e){return""+(new RegExp(e+"(\\d+((\\.|_)\\d+)*)").exec(r())||[,0])[1]||void 0}function i(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)))}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var s=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e].call(s.exports,s,s.exports,__webpack_require__),s.exports}__webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(e,t)=>{for(var s in t)__webpack_require__.o(t,s)&&!__webpack_require__.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var __webpack_exports__={};return(()=>{"use strict";__webpack_require__.d(__webpack_exports__,{default:()=>index_engine});const events={DC_SIGNAL:"SIGNAL",DC_OPEN:"OPEN",DC_REQUEST:"REQUEST",DC_PIECE_NOT_FOUND:"PIECE_NOT_FOUND",DC_PIECE_ABORT:"PIECE_ABORT",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"},hls_next_events={...events,SCH_DCHAVE:"SCH_DCHAVE",REQUESTING_MAP_HAVE:"REQUESTING_MAP_HAVE",SW_PLAYLIST:"SW_PLAYLIST",SW_GET_PLAYLIST:"SW_GET_PLAYLIST",SW_MEDIA:"SW_MEDIA",SW_GET_MEDIA:"SW_GET_MEDIA",LEVEL_LOADED:"LEVEL_LOADED",MANIFEST_PARSED:"MANIFEST_PARSED",FRAG_LOADED:"FRAG_LOADED",SYN_OUTPUT:"SYN_OUTPUT",SYN_ERROR:"SYN_ERROR",SYN_PARTIAL:"SYN_PARTIAL"};var _events_3_3_0_events_events=__webpack_require__(204),events_default=__webpack_require__.n(_events_3_3_0_events_events),utils_buffer=__webpack_require__(47),queue_microtask=__webpack_require__(77),queue_microtask_default=__webpack_require__.n(queue_microtask);const MAX_BUFFERED_AMOUNT=65536,ICECOMPLETE_TIMEOUT=5e3,CHANNEL_CLOSING_TIMEOUT=5e3;function filterTrickle(e){return e.replace(/a=ice-options:trickle\s\n/g,"")}function warn(e){console.warn(e)}class Peer extends(events_default()){constructor(e){super(),this.channelName=e.initiator?e.channelName:null,this.initiator=e.initiator||!1,this.channelConfig=e.channelConfig||Peer.channelConfig,this.channelNegotiated=this.channelConfig.negotiated,this.config=Object.assign({},Peer.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||ICECOMPLETE_TIMEOUT,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:getBrowserRTC(),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._remoteTracks=[],this._remoteStreams=[],this._chunk=null,this._cb=null,this._interval=null;try{this._pc=new this._wrtc.RTCPeerConnection(this.config)}catch(e){return void queue_microtask_default()((()=>this.destroy(e)))}this._isReactNativeWebrtc="number"==typeof this._pc._peerConnectionId,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)throw new Error("cannot signal after peer is destroyed");if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e={}}e.renegotiate&&this.initiator&&this._needsNegotiation(),e.transceiverRequest&&this.initiator&&this.addTransceiver(e.transceiverRequest.kind,e.transceiverRequest.init),e.candidate&&(this._pc.remoteDescription&&this._pc.remoteDescription.type?this._addIceCandidate(e.candidate):this._pendingCandidates.push(e.candidate)),e.sdp&&this._pc.setRemoteDescription(new this._wrtc.RTCSessionDescription(e)).then((()=>{this.destroyed||(this._pendingCandidates.forEach((e=>{this._addIceCandidate(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=>{!t.address||t.address.endsWith(".local")?warn("Ignoring unsupported ICE candidate."):this.destroy(e)}))}send(e){this._channel.send(e)}addTransceiver(e,t){if(this.initiator)try{this._pc.addTransceiver(e,t),this._needsNegotiation()}catch(e){this.destroy(e)}else this.emit("signal",{type:"transceiverRequest",transceiverRequest:{kind:e,init:t}})}_needsNegotiation(){this._batchedNegotiation||(this._batchedNegotiation=!0,queue_microtask_default()((()=>{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,t){this.destroyed||this.destroying||(this.destroying=!0,queue_microtask_default()((()=>{if(this.destroyed=!0,this.destroying=!1,this._connected=!1,this._pcReady=!1,this._channelReady=!1,this._remoteTracks=null,this._remoteStreams=null,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.ontrack=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=MAX_BUFFERED_AMOUNT),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}),CHANNEL_CLOSING_TIMEOUT)}_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=filterTrickle(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)}))}_requestMissingTransceivers(){this._pc.getTransceivers&&this._pc.getTransceivers().forEach((e=>{e.mid||!e.sender.track||e.requested||(e.requested=!0,this.addTransceiver(e.sender.track.kind))}))}_createAnswer(){this.destroyed||this._pc.createAnswer(this.answerOptions).then((e=>{if(this.destroyed)return;this.trickle||this.allowHalfTrickle||(e.sdp=filterTrickle(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.initiator||this._requestMissingTransceivers()};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._isReactNativeWebrtc?this._pc.getStats().then((s=>{const r=[];s.forEach((e=>{r.push(t(e))})),e(null,r)}),(t=>e(t))):this._pc.getStats.length>0?this._pc.getStats((s=>{if(this.destroyed)return;const r=[];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,r.push(t(s))})),e(null,r)}),(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 r={},n={},i={};let o=!1;s.forEach((e=>{"remotecandidate"!==e.type&&"remote-candidate"!==e.type||(r[e.id]=e),"localcandidate"!==e.type&&"local-candidate"!==e.type||(n[e.id]=e),"candidatepair"!==e.type&&"candidate-pair"!==e.type||(i[e.id]=e)}));const a=e=>{o=!0;let t=n[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=r[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(i[e.selectedCandidatePairId]),("googCandidatePair"===e.type&&"true"===e.googActiveConnection||("candidatepair"===e.type||"candidate-pair"===e.type)&&e.selected)&&a(e)})),o||Object.keys(i).length&&!Object.keys(n).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>MAX_BUFFERED_AMOUNT||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=utils_buffer.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()}}Peer.config={iceServers:[{urls:["stun:stun.l.google.com:19302","stun:global.stun.twilio.com:3478"]}],sdpSemantics:"unified-plan"},Peer.channelConfig={};const peer_channel=Peer;class Segment{constructor(e,t,s,r,n=0){this.sn=e,this.segId=t,this.data=s,this.fromPeerId=r,this.level=n||0}static fromSegment(e){return new Segment(e.sn,e.segId,e.data,e.fromPeerId,e.level)}get size(){return this.data.byteLength}get isSequential(){return this.sn>=0}}var platform=__webpack_require__(422),platform_default=__webpack_require__.n(platform);const delimiter="|",arrayDelimiter=",",candTypeMap={h:"host",s:"srflx",p:"prflx",r:"relay"},sdpType2Char=(e,t)=>{let s;switch(e){case"candidate":s="c";break;case"offer":s=t?"q":"o";break;case"answer":s=t?"s":"a"}return s},char2SdpType=e=>{let t={};switch(e){case"o":t={type:"offer"};break;case"q":t={type:"offer",trickle:!0};break;case"a":t={type:"answer"};break;case"s":t={type:"answer",trickle:!0};break;case"c":t={type:"candidate",trickle:!0}}return t},charOffset=0,bytesToStr=e=>"number"==typeof e?bytesToStr([e]):String.fromCharCode(...e.map((e=>e+charOffset))),strToBytes=e=>e.split("").map((e=>e.charCodeAt(0)-charOffset));function parseCand(e){const[,t,s,r,n,i,o,a,h,l,c,d,u,g,f]=/(\S*) (\d*) (\S*) (\d*) (\S*) (\d*) typ (\S*)(?: raddr (\S*) rport (\d*))?(?: tcptype (\S*))?(?: generation (\d*))?(?: ufrag (\S*))?(?: network-id (\d*))?(?: network-cost (\d*))?/.exec(e);return{foundation:t,component:s,transport:r,priority:n,ip:i,port:o,type:a,raddr:h,rport:l,tcptype:c,generation:d,networkId:g,networkCost:f,ufrag:u}}function pack({type:e,sdp:t,candidate:s}){return t&&t.startsWith("v=0")?packSdp(e,t):"candidate"===e&&s?packCandidate(s.candidate):null}function packCandidate(e){const t=e.indexOf(":");if(t<=0)return null;let s=packCandItem(e.slice(t+1).trim());return s?sdpType2Char("candidate")+s.cand:null}function packSdp(e,t){let s,r,n,i=[],o=!1,a=!1;for(const e of t.split("\r\n")){const t=e.indexOf(":");if(t<=0)continue;if("a=ice-options:trickle"===e){a=!0;continue}const[h,l]=[e.slice(0,t),e.slice(t+1).trim()];switch(h){case"a=ice-ufrag":s=l;break;case"a=ice-pwd":r=l;break;case"a=fingerprint":n=bytesToStr(l.substr("sha-256".length).trim().split(":").map((e=>parseInt(e,16))));break;case"a=candidate":let e=packCandItem(l,o);if(!e)continue;if(e.local){if(o)continue;o=!0}i.push(e.cand)}}return sdpType2Char(e,a)+n+(i.length>0?i.join(arrayDelimiter):"")+(a?"":delimiter)+s+delimiter+r}function packCandItem(e){let t=!1;const s=parseCand(e);if("TCP"===s.transport)return null;s.ip.endsWith(".local")&&(t=!0);let r=s.type.charAt(0);const n=s.ip.split(".");if(4===n.length){const e=n.reduce((function(e,t){return(e<<8)+parseInt(t,10)}));r=`${r}${s.foundation} ${e}:${parseInt(s.port)}`}else r=`${r}${s.foundation} ${s.ip} ${s.port}`;return{cand:r,local:t}}function unpack(e,t){const s=char2SdpType(e.substr(0,1));return s?"candidate"===s.type?unpackCand(e):unpackSdp(s.type,t,e,s.trickle):null}function unpackCand(e){let t=unpackCandItem(e.substr(1),100);return t?{type:"candidate",candidate:{candidate:`candidate:${t}`,sdpMLineIndex:0,sdpMid:"0"}}:null}function unpackSdp(e,t,s,r){const n=strToBytes(s.slice(1,33)).map((e=>("0"+e.toString(16)).slice(-2))),i=s.substr(33);let o,a,h;r?[a,h]=i.split(delimiter):[o,a,h]=i.split(delimiter);const l=r?[]:o.split(arrayDelimiter),c=["v=0",`o=- ${t} 2 IN IP4 127.0.0.1`,"s=-","t=0 0","a=group:BUNDLE 0","a=msid-semantic: WMS","m=application 9 UDP/DTLS/SCTP webrtc-datachannel","c=IN IP4 0.0.0.0","a=mid:0","a=sctp-port:5000","a=setup:"+("answer"===e?"active":"actpass"),`a=ice-ufrag:${a}`,`a=ice-pwd:${h}`,`a=fingerprint:sha-256 ${n.join(":").toUpperCase()}`];r&&c.push("a=ice-options:trickle");let d=100;for(const e of l){let t=unpackCandItem(e,d);t&&(d--,c.push(`a=candidate:${t}`))}return{type:e,sdp:c.join("\r\n")+"\r\n"}}function unpackCandItem(e,t){let s,r,n;const i=candTypeMap[e.substr(0,1)],o=e.substr(1).split(" ");if(2===o.length){n=o[0];const e=o[1].split(":");s=[e[0]>>24&255,e[0]>>16&255,e[0]>>8&255,255&e[0]].join("."),r=e[1]}else[n,s,r]=o;return`${[n,1,"udp",t,s,r,"typ",i].join(" ")}`}const DC_TOLERANCE=2,DEFAULT_PACKET_SIZE=64e3,ALPHA=.6,SIGNAL_PACK_VER=1;class peer_Peer extends(events_default()){static get defaultPacketSize(){return DEFAULT_PACKET_SIZE}static get VERSION(){return"8"}constructor(e,t,s,r,n,i,o={}){super(),this.engine=e,this.channel=e.fetcher.channelId,this.logger=e.logger,this.config=n,this.isInitiator=r,this.options=o,this.typeExpected=i,this.remotePeerId=s,this.intermediator=o.intermediator||null,this.channelId=r?`${t}-${s}`:`${s}-${t}`,this.cpr=0,this.platform="unknown",this.mobile=!1,this.mobileWeb=!1,this.connected=!1,this.msgQueue=[],this.miss=0,this.notifySet=new Set,this.bufArr=[],this.packetSize=DEFAULT_PACKET_SIZE,this.connTimeout=setTimeout((()=>{this.logger.warn(`dc ${this.channelId} connection timeout`),this.emit(events.DC_ERROR,!0)}),25e3),this.sendReqQueue=[],this.downloading=!1,this.uploading=!1,this.choked=!1,this.downloadListeners=[],this.pieceMsg={},this.timeSendRequest=0,this.timeReceivePiece=0,this.timeSendPiece=0,this.weight=0,this.peersConnected=1,this.timeJoin=getCurrentTs(),this.uploadSpeed=0,this.gotPeers=!1,this.currentLevel=0,this.currentPos=0;let a={};if(this.options.stuns.length>0){const e=[];this.options.stuns.forEach((t=>{this.logger.info(`use stun ${t}`),e.push({urls:t})})),a.iceServers=e}this.config.webRTCConfig&&(a={...this.config.webRTCConfig,...a}),this.playlistMap=new Map,this._datachannel=new peer_channel({initiator:r,channelName:this.channelId,trickle:o.trickle||!1,config:a}),this._init(this._datachannel),this.dataExchangeTs=this.timeJoin,this.gotStatsTs=this.timeJoin,this.startSN=Number.MAX_SAFE_INTEGER,this.endSN=-1}get isAvailable(){return this.downloadNum<2&&!this.choked}get isAvailableUrgently(){return!this.downloading&&!this.choked}addDownloadListener(e){this.downloadListeners.push({handler:e})}addStreamListener(e,t){this.addDownloadListener(t)}_init(e){e.on("error",(e=>{this.emit(events.DC_ERROR,!0)})),e.on("signal",(e=>{if(this.cpr===SIGNAL_PACK_VER){const t=pack(e);t?e=t:this.logger.error("signal pack error")}this.emit(events.DC_SIGNAL,e)}));e.on("connect",(()=>{for(this.logger.info(`datachannel CONNECTED to ${this.remotePeerId} from ${this.intermediator?"peer":"server"}`),this.connected=!0,clearTimeout(this.connTimeout),this.emit(events.DC_OPEN);this.msgQueue.length>0;){let e=this.msgQueue.shift();this.emit(e.event,e)}})),e.on("data",(e=>{const{logger:t}=this;if("string"==typeof e){let s=JSON.parse(e);if(!this.connected)return void this.msgQueue.push(s);let r,n=s.event;switch(r=n!==events.DC_PLAYLIST&&n!==events.DC_PEER_SIGNAL?`string: ${e}`:`event: ${n}`,t.debug(`datachannel receive ${r} from ${this.remotePeerId}`),n){case events.DC_HAVE:if(this.emit(s.event,s),!s.sn)return;this.config.live||(s.sn<this.startSN&&(this.startSN=s.sn),s.sn>this.endSN&&(this.endSN=s.sn));break;case events.DC_PIECE:this.downloading=!0,this.dataExchangeTs=getCurrentTs(),this.timeReceivePiece=performance.now(),this.pieceMsg=s,this._prepareForBinary(s.attachments,s.seg_id,s.sn,s.size),this.emit(s.event,s);break;case events.DC_PIECE_NOT_FOUND:this._sendNextReq()||(this.downloading=!1),this.emit(s.event,s);break;case events.DC_REQUEST:this._handleRequestMsg(s);break;case events.DC_PIECE_ACK:this.dataExchangeTs=getCurrentTs(),this._handlePieceAck(s),this.emit(s.event,s);break;case events.DC_STATS:this._handleStats(s);break;case events.DC_PLAYLIST:this.config.sharePlaylist&&this._handlePlaylist(s);break;case events.DC_METADATA:this._handleMetadata(s);break;case events.DC_PIECE_ABORT:this.downloading&&(this._notifyDownloadListenersAbort("aborted by upstream peer"),this.emit(events.DC_PIECE_ABORT,s));break;case events.DC_CHOKE:t.info(`choke peer ${this.remotePeerId}`),this.choked=!0;break;case events.DC_UNCHOKE:t.info(`unchoke peer ${this.remotePeerId}`),this.choked=!1;break;case events.DC_CLOSE:this.emit(s.event,s.fatal||!1);break;default:this.emit(s.event,s)}}else{if(!this.downloading)return void t.error(`peer is not downloading, data size ${e.byteLength} pieceMsg ${JSON.stringify(this.pieceMsg)}`);this._handleBinaryMsg(e)}})),e.once("close",(()=>{this.emit(events.DC_CLOSE,!1)})),e.on("iceStateChange",((e,t)=>{"disconnected"===e&&(this.logger.warn(`${this.remotePeerId} disconnected`),this.connected=!1)}))}sendJson(e){e.event!==events.DC_PLAYLIST&&e.event!==events.DC_PEER_SIGNAL?this.logger.debug(`dc bufferSize ${this._datachannel.bufferSize} send ${JSON.stringify(e)} to ${this.remotePeerId}`):this.logger.debug(`dc send event ${e.event} to ${this.remotePeerId}`);const t=JSON.stringify(e);return t.length>DEFAULT_PACKET_SIZE?(this.logger.error("string to send is too large"),!1):this.send(t)}send(e){if(this._datachannel&&this._datachannel.connected)try{return this._datachannel.send(e),!0}catch(e){this.logger.warn(`datachannel ${this.channelId} send data failed, close it`),this.emit(events.DC_ERROR,!1)}return!1}sendMsgHave(e,t,s={}){const r=s.reverse||void 0;delete s.reverse,this.sendJson({event:r?events.DC_HAVE_REVERSE:events.DC_HAVE,sn:e,seg_id:t,...s})}sendPieceNotFound(e,t,s={}){this.uploading=!1,this.sendJson({event:events.DC_PIECE_NOT_FOUND,seg_id:t,sn:e,...s})}sendPeers(e){this.sendJson({event:events.DC_PEERS,peers:e})}sendPeersRequest(){this.sendJson({event:events.DC_GET_PEERS})}sendMsgStats(e,t={}){const s={event:events.DC_STATS,total_conns:e,...t};this.sendJson(s)}sendMsgPlaylist(e,t,s){if(this.playlistMap.has(e)){if(this.playlistMap.get(e).seq>=s)return}const r={event:events.DC_PLAYLIST,url:e,data:t,seq:s};this.sendJson(r)}sendMsgSignal(e,t,s){return this.sendJson({event:events.DC_PEER_SIGNAL,action:"signal",to_peer_id:e,from_peer_id:t,data:s})}sendMsgSignalReject(e,t,s,r=!1){return this.sendJson({event:events.DC_PEER_SIGNAL,action:"reject",to_peer_id:e,from_peer_id:t,reason:s,fatal:r})}sendMetaData(e,t,s=0){this.isInitiator&&(this.timeSendRequest=performance.now()),this.sendJson({event:events.DC_METADATA,field:e,platform:events.DC_PLAT_WEB,mobile:!!platform_default().isMobile(),channel:this.channel,version:"2.2.10",sequential:t,peers:s})}sendPartialBuffer(e,t,s={}){this.sendMsgPiece(e,s);for(let e=0;e<t.length;e++)this.send(t[e])}sendMsgPiece(e,t={}){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 s={...e,ext:t};this.sendJson(s)}sendBuffer(e,t,s,r={}){const n=r.reverse||void 0;delete r.reverse;let i=s.byteLength,o=0,a=0;i%this.packetSize==0?a=i/this.packetSize:(a=Math.floor(i/this.packetSize)+1,o=i%this.packetSize);let h={event:events.DC_PIECE,attachments:a,seg_id:t,sn:e,level:r.level,size:i,reverse:n};delete r.level,this.sendMsgPiece(h,r);const l=dividePayload(s,this.packetSize,a,o);this._sendBufferArray(l,n),this.uploading=!1,this.timeSendPiece=performance.now()}get downloadNum(){return this.downloading?this.sendReqQueue.length+1:0}requestDataById(e,t,s=!1,r={}){const n={event:events.DC_REQUEST,seg_id:e,sn:t,...r,urgent:s};this.downloading?(this.logger.info(`${this.remotePeerId} add req ${e} in queue`),s?this.sendReqQueue.unshift(n):this.sendReqQueue.push(n)):this._realRequestData(n)}requestDataBySN(e,t=!1,s={}){const r={event:events.DC_REQUEST,sn:e,...s,urgent:t};this.downloading?(this.logger.info(`add req ${e} in queue`),t?this.sendReqQueue.unshift(r):this.sendReqQueue.push(r)):this._realRequestData(r)}_sendBufferArray(e,t=!1){if(t)for(let t=e.length-1;t>=0;t--)this.send(e[t]);else for(let t=0;t<e.length;t++)this.send(e[t])}_realRequestData(e){this.sendJson(e),this.timeSendRequest=performance.now(),this.downloading=!0}shouldWaitForRemain(e){return 0!==this.bufArr.length&&(0!==this.timeReceivePiece&&this.currentLoadSpeed()>=this.minRequiredSpeed(e))}close(e){this.emit(events.DC_CLOSE,e)}receiveSignal(e){e.type||e.candidate||(this.cpr=SIGNAL_PACK_VER,e=unpack(e,this.cpr+"")),e&&this._datachannel.signal(e)}_notifyDownloadListenersAbort(e){for(let t of this.downloadListeners){const{handler:s}=t;s(this.bufSN,this.segId,!0,e)}this.downloadListeners=[]}destroy(e=!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 t={event:events.DC_CLOSE,fatal:e};this.sendJson(t),this._datachannel.removeAllListeners(),this.removeAllListeners(),this._datachannel.destroy(),this.engine=null}_handleBinaryMsg(e){const{attachments:t,level:s,reverse:r}=this.pieceMsg;this.bufArr.push(e),this.remainAttachments--;let n=r?this.remainAttachments+1:t-this.remainAttachments;const i=0===this.remainAttachments;if(this.emit(events.DC_PIECE_DATA,this.bufSN,this.segId,e,n,i,this.pieceMsg),this.downloadListeners.length>0)for(let t of this.downloadListeners){const{handler:s}=t;s(this.bufSN,this.segId,!1,e,i)}if(i){if(this.downloadListeners=[],this.timeSendRequest>0){const e=this.expectedSize/(performance.now()-this.timeSendRequest);this.weight=this.weight>0?ALPHA*this.weight+(1-ALPHA)*e:e}this.sendJson({event:events.DC_PIECE_ACK,sn:this.bufSN,seg_id:this.segId,level:s,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:r}=e;this.playlistMap.set(t,{data:s,seq:r})}getLatestPlaylist(e,t){if(!this.playlistMap.has(e))return null;const s=this.playlistMap.get(e);return s.seq<=t?null:s}_handleMetadata(e){const{logger:t}=this;if(this.isInitiator){const e=performance.now()-this.timeSendRequest;e>0&&(this.weight=1e5/e,t.info(`handle Metadata from ${this.remotePeerId} initial weight ${this.weight}`)),this.timeSendRequest=0}const s=e.channel;if(!s)return t.error(`peer channel ${s} is null!`),void this.emit(events.DC_ERROR,!0);if(this.channel!==s)return t.error(`peer channel ${s} not matched!`),void this.emit(events.DC_ERROR,!0);switch(e.platform){case events.DC_PLAT_ANDROID:this.platform=events.DC_PLAT_ANDROID;break;case events.DC_PLAT_IOS:this.platform=events.DC_PLAT_IOS;break;case events.DC_PLAT_WEB:this.platform=events.DC_PLAT_WEB}if(this.mobile=e.mobile||!1,this.mobileWeb=this.mobile&&this.platform===events.DC_PLAT_WEB||!1,this.sequential=e.sequential,this.sequential!==this.typeExpected)return t.error(`peer sequential type ${this.sequential} not matched!`),void this.emit(events.DC_ERROR,!0);if(t.info(`${this.remotePeerId} platform ${this.platform} sequential ${this.sequential}`),e.peers&&(this.peersConnected+=e.peers,t.info(`${this.remotePeerId} now has ${this.peersConnected} peers`)),this.emit(events.DC_METADATA,e),e.field&&!this.config.live&&e.sequential){const{field:t}=e;if(Array.isArray(t))this._handleField(t);else for(let e in t)this._handleField(t[e])}}_handleField(e){e.forEach((e=>{e>=0&&(e<this.startSN&&(this.startSN=e),e>this.endSN&&(this.endSN=e))}))}_handleStats(e){this.gotStatsTs=getCurrentTs();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(e){this.uploading?this.logger.warn(`${this.remotePeerId} is uploading when receive request`):(this.uploading=!0,this.emit(events.DC_REQUEST,e))}_handlePieceAck(e){0!==this.timeSendPiece&&(this.uploadSpeed=Math.round(e.size/(performance.now()-this.timeSendPiece)*2),this.timeSendPiece=0,this.logger.info(`${this.remotePeerId} uploadSpeed is ${this.uploadSpeed}`)),e.miss>0&&this.logger.warn(`peer ${this.remotePeerId} miss ${e.miss}`)}_prepareForBinary(e,t,s,r){this.bufArr=[],this.remainAttachments=e,this.segId=t,this.bufSN=s,this.expectedSize=r}_handleBinaryData(e=!1){if(this.listenerCount(events.DC_RESPONSE)>0){e&&this.bufArr.reverse();let t=utils_buffer.l.concat(this.bufArr);const s=t.byteLength;if(s===this.expectedSize){let e=t.buffer;const s=new Segment(this.bufSN,this.segId,e,this.remotePeerId,this.pieceMsg.level);this.emit(events.DC_RESPONSE,s,this.weight)}else this.logger.error(`${this.segId} expectedSize ${this.expectedSize} not equal to byteLength ${s}`)}this.segId="",this.bufArr=[],this.expectedSize=-1}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>DC_TOLERANCE&&!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`)}}loadtimeout(){const{logger:e,bufArr:t,pieceMsg:s}=this;return e.warn(`timeout while downloading from ${this.remotePeerId}, ${t.length} of ${s.attachments} packets loaded`),this.emit(events.DC_TIMEOUT),this.checkIfNeedChoke(),!0}sendMsgPieceAbort(e){this.uploading=!1,this.sendJson({event:events.DC_PIECE_ABORT,reason:e})}loadedBytes(){let e=0;for(let t=0;t<this.bufArr.length;t++)e+=this.bufArr[t].byteLength;return e}currentLoadSpeed(){return 0===this.timeReceivePiece?0:this.loadedBytes()/(performance.now()-this.timeReceivePiece)}minRequiredSpeed(e){return(this.pieceMsg.size-this.loadedBytes())/e}}function dividePayload(e,t,s,r){let n=[];if(r){let i;for(let r=0;r<s-1;r++)i=e.slice(r*t,(r+1)*t),n.push(i);i=e.slice(e.byteLength-r,e.byteLength),n.push(i)}else{let r;for(let i=0;i<s;i++)r=e.slice(i*t,(i+1)*t),n.push(r)}return n}const peer=peer_Peer,CHECK_PEERS_INTERVAL=3;function noop(){return!0}function getQueryParam(e){return new URL(location.href).searchParams.get(e)}function updateQueryStringParam(e,t,s){var r=new RegExp("([?&])"+t+"=.*?(&|$)","i"),n=-1!==e.indexOf("?")?"&":"?";return e.match(r)?e.replace(r,"$1"+t+"="+s+"$2"):e+n+t+"="+s}function getCurrentTs(){return Date.parse(new Date)/1e3}function randomNum(e,t){return parseInt(Math.random()*(t-e+1)+e,10)}function calCheckPeersDelay(e){return 0===e?CHECK_PEERS_INTERVAL:.33*e+.67}function performRangeRequest(e,t,s){const r=new XMLHttpRequest;return new Promise(((n,i)=>{r.open("GET",e,!0),r.responseType="arraybuffer",r.timeout=3500,r.onreadystatechange=e=>{if(4===r.readyState){const e=r.status;e>=200&&e<300?n(r.response):i(`status ${e}`)}},r.onerror=e=>{i("request error")},r.ontimeout=e=>{i("timeout")},r.setRequestHeader("Range",t||"bytes=0-0"),s&&s(r,e),r.send()}))}function navLang(){return"zh-CN"===(navigator.language||navigator.userLanguage)?"cn":"en"}function dontWaitFor(e){e.then((()=>{}))}function timeout(e){return new Promise((t=>setTimeout(t,e)))}function getBrowserRTC(){if("undefined"==typeof window)return null;var e={RTCPeerConnection:window.RTCPeerConnection||window.mozRTCPeerConnection||window.webkitRTCPeerConnection,RTCSessionDescription:window.RTCSessionDescription||window.mozRTCSessionDescription||window.webkitRTCSessionDescription,RTCIceCandidate:window.RTCIceCandidate||window.mozRTCIceCandidate||window.webkitRTCIceCandidate};return e.RTCPeerConnection?e:null}function copyBuffer(e){const t=utils_buffer.l.from(e),s=new utils_buffer.l(e.byteLength);return t.copy(s),s}function getMaxSequence(e){const t=e.split("\n");let s=0;let r=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")&&r++;return s+r-1}function isHttps(){return location.protocol.startsWith("https")}function isInteger(e){return"number"==typeof e&&e%1==0}function appendSlogan(e,t,s){var r=document.createElement("div");r.style.position="absolute",r.style.top="8px",r.style.left="8px",r.style.zIndex="999",r.style.fontSize="10px";var n=document.createElement("a");n.href=t,n.target="_blank",n.innerText=e,n.style.color="white",n.style.textDecoration="none",n.style.textShadow="0 0 5px white,0 0 10px #00FFFF,0 0 15px #7FFF00,0 0 20px white";var i=document.createElement("i");i.style.width="5px",i.style.height="5px",i.style.borderRadius="50%",i.style.display="inline-block",i.style.backgroundColor="#67C23A",i.style.marginBottom="2px",i.style.marginRight="4px",r.appendChild(i),r.appendChild(n);var o=s.parentNode;o&&o.insertBefore(r,s)}function getHomeUrl(){return window.atob("aHR0cHM6Ly9zd2FybWNsb3VkLm5ldC9lbi8=")}function splitBytes(e,t){const s=peer.defaultPacketSize,r=e.byteLength-t,n=[];let i=t,o=Math.floor(r/s),a=r%s;for(let t=0;t<o;t++){const t=(0,utils_buffer.l)(s);e.copy(t,0,i,i+s),n.push(t),i+=s}if(a>0){const t=(0,utils_buffer.l)(a);e.copy(t,0,i,i+a),n.push(t)}return n}function getAvailableMemory(){const{memory:e}=performance;return e?e.jsHeapSizeLimit-e.usedJSHeapSize:-1}const logMap={debug:0,info:1,warn:2,error:3,none:4};class Logger{constructor(e){this.logLevel=e,this.onlineDebug=!1,console.debug=console.log,"debug"!==e&&"info"!==e||(this.logLevel="warn"),!0===e?this.logLevel="warn":!1===e?this.logLevel="none":e in logMap||(this.logLevel="error"),this.resetLogger()}enableDebug(){this.onlineDebug=!0;for(let e in logMap)this[e]=console[e]}resetLogger(){this.onlineDebug=!1;for(let e in logMap)logMap[e]<logMap[this.logLevel]?this[e]=noop:this[e]=console[e]}get isDebugLevel(){return logMap[this.logLevel]<=2||this.onlineDebug}}const utils_logger=Logger;var url_toolkit=__webpack_require__(622),url_toolkit_default=__webpack_require__.n(url_toolkit);const players={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 player_detector(){let e;for(let t in players)if(window[t]){e=players[t];break}return e}const SAM={_:"nllL",f:"d3NzJ",ss:"==",3:"TNBLy9z",8:"aWduY",u:"mNvbQ",qa:"WwuY2RuY"};class EngineBase extends(events_default()){constructor(e={}){if(super(),this.p2pEnabled=!(!1===e.p2pEnabled||"0"===getQueryParam("_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"===navLang()&&console.log(`%cEmpower your users to become the unlimitedly scalable CDN!\n%c${getHomeUrl()}`,"color: dodgerblue; padding:20px 0; font-size: x-large","font-size: medium; padding-bottom:15px");const t=new utils_logger(e.logLevel);return e.logger=this.logger=t,t}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(s,r)=>`${e}-${t(s,r)}`}makeSignalId(){let e="";const{config:t}=this,s=decodeURIComponent(window.atob(SAM.f+SAM[3]+SAM[8]+SAM.qa+SAM._+SAM.u+SAM.ss));if(t.wsSignalerAddr){let r;"object"!=typeof t.wsSignalerAddr||t.wsSignalerAddr.backup?"string"==typeof t.wsSignalerAddr&&(r=t.wsSignalerAddr):r=t.wsSignalerAddr.main,r===s&&(r=void 0),r&&(e=url_toolkit_default().parseURL(r).netLoc.substr(2))}else t.wsSignalerAddr=s;return e}get commonBrowserInfo(){const e=platform_default().getPlatform(),t=platform_default().getNetType()||"wifi";return this.netType=t,{device:e,netType:t,player:player_detector()||void 0}}setupWindowListeners(e){const t=["iPad","iPhone"].indexOf(navigator.platform)>=0?"pagehide":"beforeunload",s=()=>{this.fetcher&&this.fetcher.postStatsWithBeacon(),this.p2pEnabled&&this.disableP2P(),window.removeEventListener(t,s)};e?window.removeEventListener(t,s):window.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 EngineBase.version}static isSupported(){const e=getBrowserRTC();return!(!e||void 0===e.RTCPeerConnection.prototype.createDataChannel)}}EngineBase.version="2.2.10",EngineBase.protocolVersion=peer.VERSION;const engine_base=EngineBase;function tryGetMediaElement(e){if(e){if("string"==typeof e)return document.querySelector(e);if(e instanceof HTMLMediaElement)return e}return document.getElementsByTagName("video")[0]||document.getElementsByTagName("audio")[0]}function calRangeWithDoubleBuffer(e,t,s,r=0,n=0){let i="bytes=";return i=t?0===n?`${i}${r}-${s-1-t.byteLength}`:`${i}${r}-${n-t.byteLength}`:0===n?`${i}${r}-`:`${i}${r}-${n}`,i}function calRangeWithForwardReverseOffset(e,t,s,r=0,n=0){const i=peer.defaultPacketSize;let o="bytes=",a=r,h=n||s-1;const l=Math.floor(s/i),c=s%i>0?l+1:l;if(e>=0&&(a+=(e+1)*i),o=`${o}${a}-`,t>=0&&t<c){h-=s%i+(c-t-1)*i,o=`${o}${h}`}else 0!==n&&(o=`${o}${h}`);return o}let commonConfig={wsMaxRetries:10,p2pEnabled:!0,wifiOnly:!1,memoryCacheLimit:{pc:629145600,mobile:314572800},dcDownloadTimeout:25,logLevel:"error",tag:"",webRTCConfig:{},token:void 0,appName:void 0,appId:void 0,prefetchNum:5,showSlogan:!0,trickleICE:!1,announceLocation:"cn",geoIpPreflight:!0,getStats:function(e,t,s){},getPeerId:function(e){},getPeersInfo:function(e){}};const config=commonConfig;let defaultP2PConfig={...config,httpLoadTime:2,sharePlaylist:!1,useHttpRange:!0,hlsjsInstance:null,proxyOnly:!1,p2pBlackList:["aac","mp3","vtt","webvtt","key"],live:!0,swFile:"./sw.js",swScope:"./",swAutoRegister:!0,mediaElem:void 0,httpStreamEnabled:!0,diskCacheLimit:{pc:262144e4,mobile:1572864e3},useDiskCache:!0};const hls_next_config=defaultP2PConfig,STORE_NOT_INIT="store not init";function promisifyRequest(e){return new Promise(((t,s)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>s(e.error)}))}function createStores(e,t){const s=indexedDB.open(e);s.onupgradeneeded=()=>{const e=s.result;t.forEach((t=>{e.createObjectStore(t)}))};const r=promisifyRequest(s);return t.map((e=>(t,s)=>r.then((r=>s(r.transaction(e,t).objectStore(e))))))}function get(e,t){return t?t("readonly",(t=>promisifyRequest(t.get(e)))):Promise.reject(STORE_NOT_INIT)}function set(e,t,s){return s?s("readwrite",(s=>(s.put(t,e),promisifyRequest(s.transaction)))):Promise.reject(STORE_NOT_INIT)}function setMany(e,t){return t?t("readwrite",(t=>(e.forEach((e=>t.put(e[1],e[0]))),promisifyRequest(t.transaction)))):Promise.reject(STORE_NOT_INIT)}function getMany(e,t){return t?t("readonly",(t=>Promise.all(e.map((e=>promisifyRequest(t.get(e))))))):Promise.reject(STORE_NOT_INIT)}function update(e,t,s){return s?s("readwrite",(s=>new Promise(((r,n)=>{s.get(e).onsuccess=function(){try{s.put(t(this.result),e),r(promisifyRequest(s.transaction))}catch(e){n(e)}}})))):Promise.reject(STORE_NOT_INIT)}function del(e,t){return t?t("readwrite",(t=>(t.delete(e),promisifyRequest(t.transaction)))):Promise.reject(STORE_NOT_INIT)}function delMany(e,t){return t?t("readwrite",(t=>(e.forEach((e=>t.delete(e))),promisifyRequest(t.transaction)))):Promise.reject(STORE_NOT_INIT)}function clear(e){return e?e("readwrite",(e=>(e.clear(),promisifyRequest(e.transaction)))):Promise.reject(STORE_NOT_INIT)}function clearAll(e){return new Promise(((t,s)=>{indexedDB.databases().then((r=>{var n=r.filter((t=>t.name!==e)).map((e=>new Promise(((t,s)=>{var r=indexedDB.deleteDatabase(e.name);r.onsuccess=t,r.onerror=s,r.onblocked=s}))));Promise.all(n).then(t).catch(s)}))}))}function eachCursor(e,t){return e.openCursor().onsuccess=function(){this.result&&(t(this.result),this.result.continue())},promisifyRequest(e.transaction)}function keys(e){return e?e("readonly",(e=>{if(e.getAllKeys)return promisifyRequest(e.getAllKeys());const t=[];return eachCursor(e,(e=>t.push(e.key))).then((()=>t))})):Promise.reject(STORE_NOT_INIT)}function values(e){return e?e("readonly",(e=>{if(e.getAll)return promisifyRequest(e.getAll());const t=[];return eachCursor(e,(e=>t.push(e.value))).then((()=>t))})):Promise.reject(STORE_NOT_INIT)}function entries(e){return e?e("readonly",(t=>{if(t.getAll&&t.getAllKeys)return Promise.all([promisifyRequest(t.getAllKeys()),promisifyRequest(t.getAll())]).then((([e,t])=>e.map(((e,s)=>[e,t[s]]))));const s=[];return e("readonly",(e=>eachCursor(e,(e=>s.push([e.key,e.value]))).then((()=>s))))})):Promise.reject(STORE_NOT_INIT)}const KEY_METADATA_SIZE="size";class SegmentStore extends(events_default()){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===platform_default().device.PC_WEB||s===platform_default().device.PC_NATIVE,this.maxBufSize=this.isPC?t.diskCacheLimit.pc:t.diskCacheLimit.mobile,this.overflowed=!1,this.loadingSN=0}async setupStore(){if(navigator.storage){const e=await navigator.storage.estimate(),t=Math.floor(e.quota-e.usage);t<this.maxBufSize&&(this.maxBufSize=t-104857600)}return new Promise(((e,t)=>{if(this.isPC&&this.maxBufSize<629145600||!this.isPC&&this.maxBufSize<367001600)return void t("disk storage not enough");const s=createStores(this.channel,["segments","id2Sn","metadata"]);this.segmentsStore=s[0],this.id2SnStore=s[1],this.metaStore=s[2];const r=setTimeout((()=>{t("setupStore timeout")}),250);this._clearDisk(this.channel).then((()=>{this._initMetaStore().then((()=>{clearTimeout(r),e()})).catch((e=>{t(e)}))})).catch((e=>{t(e)}))}))}_initMetaStore(){return new Promise(((e,t)=>{get(KEY_METADATA_SIZE,this.metaStore).then((t=>{t||(this.logger.info("init MetaStore size"),set(KEY_METADATA_SIZE,0,this.metaStore)),e()})).catch((e=>{t()}))}))}currBufSize(){return get(KEY_METADATA_SIZE,this.metaStore)}async hasSegOfId(e){if(!e)return Promise.resolve(!1);const t=await get(e,this.id2SnStore);return new Promise(((s,r)=>{void 0!==t?get(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 get(e,this.id2SnStore);return new Promise(((e,s)=>{void 0!==t?get(t,this.segmentsStore).then((t=>{t&&t.length>0?e(Segment.fromSegment(t[0])):e(null)})).catch((t=>{this.logger.error(t),e(null)})):e(null)}))}getSegIdBySN(e){return new Promise(((t,s)=>{get(e,this.segmentsStore).then((e=>{e&&e.length>0?t(e[0].segId):t(null)})).catch((e=>{this.logger.error(e),t(null)}))}))}putSeg(e){this._addSeg(e)}_addSeg(e){const{logger:t}=this,{segId:s,sn:r,size:n}=e;set(s,r,this.id2SnStore),get(r,this.segmentsStore).then((t=>{t?0===t.filter((e=>e.segId===s)).length&&(t.push(this._segmentToCache(e)),set(r,t,this.segmentsStore).then((()=>{this._increaseBufSize(e.data.byteLength)})).catch((e=>{this.logger.error(e)}))):set(r,[this._segmentToCache(e)],this.segmentsStore).then((()=>{this._increaseBufSize(e.data.byteLength)})).catch((e=>{this.logger.error(e)}))})).catch((e=>{this.logger.error(e)})),this.emit(`${events.BM_ADDED_SN_}${e.sn}`,e),this.emit(events.BM_SEG_ADDED,e)}async _trimDisk(){const{logger:e}=this;let t=await this.currBufSize();t<this.maxBufSize||keys(this.segmentsStore).then((async s=>{const r=s.sort(((e,t)=>e-t));let n=0;do{if(n++>10){console.error("too much loops in SegmentStore");break}const s=r.shift();if(void 0===s){e.error("lastSN not found");continue}if(s>=this.loadingSN){e.warn(`trimDisk failed, loadingSN ${loadingSN}`);break}const i=r[0],o=await get(s,this.segmentsStore);if(!o){e.warn("lastSeg not found");continue}let a=0;o.forEach((e=>{a+=e.data.byteLength})),del(s,this.segmentsStore).then((()=>{this._decreaseBufSize(parseInt(a))})),o.forEach((t=>{del(t.segId,this.id2SnStore),e.info(`pop seg ${t.segId} size ${t.data.byteLength}`),this.emit(events.BM_LOST,{sn:s,segId:t.segId,next:i,level:t.level})})),t-=a,e.info(`pop sn ${s} size ${a} currBufSize ${t}`),this.overflowed||(this.overflowed=!0)}while(t>=this.maxBufSize)}))}_decreaseBufSize(e){get(KEY_METADATA_SIZE,this.metaStore).then((t=>{t&&set(KEY_METADATA_SIZE,t-e,this.metaStore)})).catch((e=>{this.logger.error(e)}))}_increaseBufSize(e){get(KEY_METADATA_SIZE,this.metaStore).then((t=>{set(KEY_METADATA_SIZE,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 cache");try{this._clearDisk()}catch(e){}}_clearDisk(e){return clearAll(e)}destroy(){this.clear(),this.removeAllListeners()}}const segment_store=SegmentStore,LIVE_MAX_BUFFER_SIZE=36700160,MIN_SEGMENTS_KEEP=5;class SegmentCache extends(events_default()){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===platform_default().device.PC_WEB||s===platform_default().device.PC_NATIVE?t.memoryCacheLimit.pc:t.memoryCacheLimit.mobile,t.live)this.maxBufSize=LIVE_MAX_BUFFER_SIZE;else{const e=getAvailableMemory();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 r=this.id2Sn.get(e);this._segPool.has(r)?t(this._segPool.get(r).some((t=>t.segId===e))):t(!1)}))}getSegById(e){const t=this.id2Sn.get(e);return new Promise(((s,r)=>{if(!this._segPool.has(t))return void s(null);const n=this._segPool.get(t);for(let t of n)if(t.segId===e)return void s(t);s(null)}))}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)),this._addSeg(e)}_addSeg(e){const{logger:t}=this,{segId:s,sn:r,size:n}=e;if(this.id2Sn.set(s,r),this._segPool.has(r)){this._segPool.get(r).push(e)}else this._segPool.set(r,[e]);this._currBufSize+=parseInt(n);const i=this._segPool.size;if(this.emit(`${events.BM_ADDED_SN_}${e.sn}`,e),this.emit(events.BM_SEG_ADDED,e),this._currBufSize<this.maxBufSize||i<=MIN_SEGMENTS_KEEP)return;const o=Array.from(this._segPool.keys()).sort(((e,t)=>e-t));let a=0;do{if(a++>10){console.error("too much loops in SegmentCache");break}const e=o.shift();if(void 0===e){t.error("lastSN not found");continue}const s=o[0],r=this._segPool.get(e);if(!r){t.error("lastSeg not found");continue}let n=0;r.forEach((e=>{n+=e.size})),this._currBufSize-=parseInt(n),this._segPool.delete(e),r.forEach((r=>{this.id2Sn.delete(r.segId),t.info(`pop seg ${r.segId} size ${r.size}`),this.emit(events.BM_LOST,{sn:e,segId:r.segId,next:s,level:r.level})})),t.info(`pop sn ${e} size ${n} currBufSize ${this._currBufSize}`),this.overflowed||(this.overflowed=!0)}while(this._currBufSize>=this.maxBufSize&&this._segPool.size>MIN_SEGMENTS_KEEP)}clear(){this.logger.warn("clear segment cache"),this._segPool.clear(),this.id2Sn.clear(),this._currBufSize=0}destroy(){this.clear(),this.removeAllListeners()}}const segment_cache=SegmentCache;class Engine extends engine_base{constructor(e={}){super(e),window.__swP2pEngineHlsActive=!0,this.config=Object.assign({},hls_next_config,e),this.rangeTested=!1,this.lastLevel=0,this.multiBitrate=!1}setup(){let{token:e,channelId:t,segmentId:s}=this.config,r=e=>{const t=url_toolkit_default().parseURL(e);return`${t.netLoc.substr(2)+t.path.substring(0,t.path.lastIndexOf("."))}`},n=(e,t,s,r)=>`${e}-${t}`;t&&"function"==typeof t&&(r=this.makeChannelId(e,t)),s||(this.config.segmentId=n);return{channelIdMaker:r,signalId:this.makeSignalId(),browserInfo:{...this.commonBrowserInfo,tag:this.config.tag||void 0}}}setupElectron(){this.browserInfo.device===platform.device.PC_NATIVE&&(this.browserInfo={...this.browserInfo,app:this.config.appName,bundle:this.config.appId})}getExtraForStats(){const e={};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={};return this.multiBitrate&&(e.level=this.currentLevel+""),e}destroy(){window.__swP2pEngineHlsActive=!1,super.destroy()}async initSegmentManager(){const{logger:e,config:t}=this;if(window.indexedDB&&t.useDiskCache&&!t.live){const s=new segment_store(this,t);try{await s.setupStore(),this.bufMgr=s}catch(s){e.warn(s),this.bufMgr=new segment_cache(this,t)}}else this.bufMgr=new segment_cache(this,t);if(this.bufMgr.maxBufSize<=0)throw new Error("bufMgr state is invalid")}}class LevelKey{constructor(){this.method=null,this.key=null,this.iv=null,this._uri=null}get uri(){return!this._uri&&this.reluri&&(this._uri=url_toolkit.buildAbsoluteURL(this.baseuri,this.reluri,{alwaysNormalize:!0})),this._uri}}class Fragment{constructor(){this._url=null,this._byteRange=null,this._decryptdata=null,this.tagList=[],this.programDateTime=null,this.rawProgramDateTime=null,this._elementaryStreams={[Fragment.ElementaryStreamTypes.AUDIO]:!1,[Fragment.ElementaryStreamTypes.VIDEO]:!1}}static get ElementaryStreamTypes(){return{AUDIO:"audio",VIDEO:"video"}}get url(){return!this._url&&this.relurl&&(this._url=url_toolkit.buildAbsoluteURL(this.baseurl,this.relurl,{alwaysNormalize:!0})),this._url}set url(e){this._url=e}get byteRange(){if(!this._byteRange&&!this.rawByteRange)return[];if(this._byteRange)return this._byteRange;let e=[];if(this.rawByteRange){const t=this.rawByteRange.split("@",2);if(1===t.length){const t=this.lastByteRangeEndOffset;e[0]=t||0}else e[0]=parseInt(t[1]);e[1]=parseInt(t[0])+e[0],this._byteRange=e}return e}get byteRangeStartOffset(){return this.byteRange[0]}get byteRangeEndOffset(){return this.byteRange[1]}get decryptdata(){return this._decryptdata||(this._decryptdata=this.fragmentDecryptdataFromLevelkey(this.levelkey,this.sn)),this._decryptdata}get endProgramDateTime(){if(!Number.isFinite(this.programDateTime))return null;let e=Number.isFinite(this.duration)?this.duration:0;return this.programDateTime+1e3*e}get encrypted(){return!(!this.decryptdata||null===this.decryptdata.uri||null!==this.decryptdata.key)}addElementaryStream(e){this._elementaryStreams[e]=!0}hasElementaryStream(e){return!0===this._elementaryStreams[e]}createInitializationVector(e){let t=new Uint8Array(16);for(let s=12;s<16;s++)t[s]=e>>8*(15-s)&255;return t}fragmentDecryptdataFromLevelkey(e,t){let s=e;return e&&e.method&&e.uri&&!e.iv&&(s=new LevelKey,s.method=e.method,s.baseuri=e.baseuri,s.reluri=e.reluri,s.iv=this.createInitializationVector(t)),s}}class Level{constructor(e){this.endCC=0,this.endSN=0,this.fragments=[],this.initSegment=null,this.live=!0,this.needSidxRanges=!1,this.startCC=0,this.startSN=0,this.startTimeOffset=null,this.targetduration=0,this.totalduration=0,this.type=null,this.url=e,this.version=null}get hasProgramDateTime(){return!(!this.fragments[0]||!Number.isFinite(this.fragments[0].programDateTime))}}const DECIMAL_RESOLUTION_REGEX=/^(\d+)x(\d+)$/,ATTR_LIST_REGEX=/\s*(.+?)\s*=((?:\".*?\")|.*?)(?:,|$)/g;class AttrList{constructor(e){"string"==typeof e&&(e=AttrList.parseAttrList(e));for(let t in e)e.hasOwnProperty(t)&&(this[t]=e[t])}decimalInteger(e){const t=parseInt(this[e],10);return t>Number.MAX_SAFE_INTEGER?1/0:t}hexadecimalInteger(e){if(this[e]){let t=(this[e]||"0x").slice(2);t=(1&t.length?"0":"")+t;const s=new Uint8Array(t.length/2);for(let e=0;e<t.length/2;e++)s[e]=parseInt(t.slice(2*e,2*e+2),16);return s}return null}hexadecimalIntegerAsNumber(e){const t=parseInt(this[e],16);return t>Number.MAX_SAFE_INTEGER?1/0:t}decimalFloatingPoint(e){return parseFloat(this[e])}enumeratedString(e){return this[e]}decimalResolution(e){const t=DECIMAL_RESOLUTION_REGEX.exec(this[e]);if(null!==t)return{width:parseInt(t[1],10),height:parseInt(t[2],10)}}static parseAttrList(e){let t,s={};for(ATTR_LIST_REGEX.lastIndex=0;null!==(t=ATTR_LIST_REGEX.exec(e));){let e=t[2],r='"';0===e.indexOf(r)&&e.lastIndexOf(r)===e.length-1&&(e=e.slice(1,-1)),s[t[1]]=e}return s}}const attr_list=AttrList,sampleEntryCodesISO={audio:{a3ds:!0,"ac-3":!0,"ac-4":!0,alac:!0,alaw:!0,dra1:!0,"dts+":!0,"dts-":!0,dtsc:!0,dtse:!0,dtsh:!0,"ec-3":!0,enca:!0,g719:!0,g726:!0,m4ae:!0,mha1:!0,mha2:!0,mhm1:!0,mhm2:!0,mlpa:!0,mp4a:!0,"raw ":!0,Opus:!0,samr:!0,sawb:!0,sawp:!0,sevc:!0,sqcp:!0,ssmv:!0,twos:!0,ulaw:!0},video:{avc1:!0,avc2:!0,avc3:!0,avc4:!0,avcp:!0,drac:!0,dvav:!0,dvhe:!0,encv:!0,hev1:!0,hvc1:!0,mjp2:!0,mp4v:!0,mvc1:!0,mvc2:!0,mvc3:!0,mvc4:!0,resv:!0,rv60:!0,s263:!0,svc1:!0,svc2:!0,"vc-1":!0,vp08:!0,vp09:!0}};function isCodecType(e,t){const s=sampleEntryCodesISO[t];return!!s&&!0===s[e.slice(0,4)]}function isCodecSupportedInMp4(e,t){return window.MediaSource.isTypeSupported(`${t||"video"}/mp4;codecs="${e}"`)}const MASTER_PLAYLIST_REGEX=/#EXT-X-STREAM-INF:([^\n\r]*)[\r\n]+([^\r\n]+)/g,MASTER_PLAYLIST_MEDIA_REGEX=/#EXT-X-MEDIA:(.*)/g,LEVEL_PLAYLIST_REGEX_FAST=new RegExp([/#EXTINF:\s*(\d*(?:\.\d+)?)(?:,(.*)\s+)?/.source,/|(?!#)([\S+ ?]+)/.source,/|#EXT-X-BYTERANGE:*(.+)/.source,/|#EXT-X-PROGRAM-DATE-TIME:(.+)/.source,/|#.*/.source].join(""),"g"),LEVEL_PLAYLIST_REGEX_SLOW=/(?:(?:#(EXTM3U))|(?:#EXT-X-(PLAYLIST-TYPE):(.+))|(?:#EXT-X-(MEDIA-SEQUENCE): *(\d+))|(?:#EXT-X-(TARGETDURATION): *(\d+))|(?:#EXT-X-(KEY):(.+))|(?:#EXT-X-(START):(.+))|(?:#EXT-X-(ENDLIST))|(?:#EXT-X-(DISCONTINUITY-SEQ)UENCE:(\d+))|(?:#EXT-X-(DIS)CONTINUITY))|(?:#EXT-X-(VERSION):(\d+))|(?:#EXT-X-(MAP):(.+))|(?:(#)([^:]*):(.*))|(?:(#)(.*))(?:.*)\r?\n?/,MP4_REGEX_SUFFIX=/\.(mp4|m4s|m4v|m4a)$/i;class M3U8Parser{static findGroup(e,t){if(!e)return null;let s=null;for(let r=0;r<e.length;r++){const n=e[r];n.id===t&&(s=n)}return s}static convertAVC1ToAVCOTI(e){let t,s=e.split(".");return s.length>2?(t=s.shift()+".",t+=parseInt(s.shift()).toString(16),t+=("000"+parseInt(s.shift()).toString(16)).substr(-4)):t=e,t}static resolve(e,t){return url_toolkit.buildAbsoluteURL(t,e,{alwaysNormalize:!0})}static parseMasterPlaylist(e,t){let s,r=[];function n(e,t){["video","audio"].forEach((s=>{const r=e.filter((e=>isCodecType(e,s)));if(r.length){const n=r.filter((e=>0===e.lastIndexOf("avc1",0)||0===e.lastIndexOf("mp4a",0)));t[`${s}Codec`]=n.length>0?n[0]:r[0],e=e.filter((e=>-1===r.indexOf(e)))}})),t.unknownCodecs=e}for(MASTER_PLAYLIST_REGEX.lastIndex=0;null!=(s=MASTER_PLAYLIST_REGEX.exec(e));){const e={},i=e.attrs=new attr_list(s[1]);e.url=M3U8Parser.resolve(s[2],t);const o=i.decimalResolution("RESOLUTION");o&&(e.width=o.width,e.height=o.height),e.bitrate=i.decimalInteger("AVERAGE-BANDWIDTH")||i.decimalInteger("BANDWIDTH"),e.name=i.NAME,n([].concat((i.CODECS||"").split(/[ ,]+/)),e),e.videoCodec&&-1!==e.videoCodec.indexOf("avc1")&&(e.videoCodec=M3U8Parser.convertAVC1ToAVCOTI(e.videoCodec)),r.push(e)}return r}static parseMasterPlaylistMedia(e,t,s,r=[]){let n,i=[],o=0;for(MASTER_PLAYLIST_MEDIA_REGEX.lastIndex=0;null!==(n=MASTER_PLAYLIST_MEDIA_REGEX.exec(e));){const e={},a=new attr_list(n[1]);if(a.TYPE===s){if(e.groupId=a["GROUP-ID"],e.name=a.NAME,e.type=s,e.default="YES"===a.DEFAULT,e.autoselect="YES"===a.AUTOSELECT,e.forced="YES"===a.FORCED,a.URI&&(e.url=M3U8Parser.resolve(a.URI,t)),e.lang=a.LANGUAGE,e.name||(e.name=e.lang),r.length){const t=M3U8Parser.findGroup(r,e.groupId);e.audioCodec=t?t.codec:r[0].codec}e.id=o++,i.push(e)}}return i}static parseLevelPlaylist(e,t){let s,r,n=0,i=0,o=new Level(t),a=new LevelKey,h=0,l=null,c=new Fragment,d=null;for(LEVEL_PLAYLIST_REGEX_FAST.lastIndex=0;null!==(s=LEVEL_PLAYLIST_REGEX_FAST.exec(e));){const e=s[1];if(e){c.duration=parseFloat(e);const t=(" "+s[2]).slice(1);c.title=t||null,c.tagList.push(t?["INF",e,t]:["INF",e])}else if(s[3]){if(Number.isFinite(c.duration)){const e=n++;c.start=i,c.levelkey=a,c.sn=e,c.cc=h,c.baseurl=t,c.relurl=(" "+s[3]).slice(1),assignProgramDateTime(c,l),o.fragments.push(c),l=c,i+=c.duration,c=new Fragment}}else if(s[4]){if(c.rawByteRange=(" "+s[4]).slice(1),l){const e=l.byteRangeEndOffset;e&&(c.lastByteRangeEndOffset=e)}}else if(s[5])c.rawProgramDateTime=(" "+s[5]).slice(1),c.tagList.push(["PROGRAM-DATE-TIME",c.rawProgramDateTime]),null===d&&(d=o.fragments.length);else{for(s=s[0].match(LEVEL_PLAYLIST_REGEX_SLOW),r=1;r<s.length&&void 0===s[r];r++);const e=(" "+s[r+1]).slice(1),i=(" "+s[r+2]).slice(1);switch(s[r]){case"#":c.tagList.push(i?[e,i]:[e]);break;case"PLAYLIST-TYPE":o.type=e.toUpperCase();break;case"MEDIA-SEQUENCE":n=o.startSN=parseInt(e);break;case"TARGETDURATION":o.targetduration=parseFloat(e);break;case"VERSION":o.version=parseInt(e);break;case"EXTM3U":break;case"ENDLIST":o.live=!1;break;case"DIS":h++,c.tagList.push(["DIS"]);break;case"DISCONTINUITY-SEQ":h=parseInt(e);break;case"KEY":var u=new attr_list(e),g=u.enumeratedString("METHOD"),f=u.URI,p=u.hexadecimalInteger("IV");g&&(a=new LevelKey,f&&["AES-128","SAMPLE-AES","SAMPLE-AES-CENC"].indexOf(g)>=0&&(a.method=g,a.baseuri=t,a.reluri=f,a.key=null,a.iv=p));break;case"START":let r=new attr_list(e).decimalFloatingPoint("TIME-OFFSET");Number.isFinite(r)&&(o.startTimeOffset=r);break;case"MAP":let l=new attr_list(e);c.relurl=l.URI,c.rawByteRange=l.BYTERANGE,c.baseurl=t,c.sn="initSegment",o.initSegment=c,c=new Fragment,c.rawProgramDateTime=o.initSegment.rawProgramDateTime;break;default:console.warn(`line parsed but not handled: ${s}`)}}}return c=l,c&&!c.relurl&&(o.fragments.pop(),i-=c.duration),o.totalduration=i,o.averagetargetduration=i/o.fragments.length,o.endSN=n-1,o.startCC=o.fragments[0]?o.fragments[0].cc:0,o.endCC=h,!o.initSegment&&o.fragments.length&&o.fragments.every((e=>MP4_REGEX_SUFFIX.test(e.relurl)))&&(console.warn("MP4 fragments found but no init segment (probably no MAP, incomplete M3U8), trying to fetch SIDX"),c=new Fragment,c.relurl=o.fragments[0].relurl,c.baseurl=t,c.level=id,c.sn="initSegment",o.initSegment=c,o.needSidxRanges=!0),d&&backfillProgramDateTimes(o.fragments,d),o}}function backfillProgramDateTimes(e,t){let s=e[t];for(let r=t-1;r>=0;r--){const t=e[r];t.programDateTime=s.programDateTime-1e3*t.duration,s=t}}function assignProgramDateTime(e,t){e.rawProgramDateTime?e.programDateTime=Date.parse(e.rawProgramDateTime):t&&t.programDateTime&&(e.programDateTime=t.endProgramDateTime),Number.isFinite(e.programDateTime)||(e.programDateTime=null,e.rawProgramDateTime=null)}var md5=__webpack_require__(485),md5_default=__webpack_require__.n(md5),err_code=__webpack_require__(934),err_code_default=__webpack_require__.n(err_code);const setItem=(e,t)=>{"object"==typeof t&&(t=JSON.stringify(t)),localStorage.setItem(e,t)},hasItemUnexpired=e=>{const t=localStorage.getItem(e);try{const e=JSON.parse(t);if(e.duration&&e.startTime){return(new Date).getTime()-e.startTime<e.duration}return!1}catch(e){return!1}},getItem=e=>{const t=localStorage.getItem(e);try{const e=JSON.parse(t);return e.value?e.value:e}catch(e){return t}},removeItem=e=>{localStorage.removeItem(e)},removeAllItem=()=>{localStorage.clear()},setItemWithExpiration=(e,t,s)=>{let r={value:t,duration:s,startTime:(new Date).getTime()};setItem(e,r)},MIN_CONNS=8,BASE_REPORT_INTERVAL=20,IPAPI_URL="//pro.ip-api.com/json?fields=2181826&key=XOpiansRgYxGTho",IPAPI_TIMEOUT=600,GEOIP_KEY="SW_GEOIP_KEY",GEOIP_EXPIRATION=2592e5,GEOIP_EXPIRATION_MOBILE=432e5,URL_MAP={q:"uZ2luZS5u",v:"Y24u",3:"Y2Ru",0:"yMzMzL2Js",l:"Nvb",zz:"aHR0cHMlM",n:"YnllLm",h:"ZXQlM0E",7:"Q==",df:"0EvL",6:"3AycGV",x:"aGsuc3d",kj:"dHJhY",a:"2tlci5","+":"oZHR2","=":"Y2xvdW",w:"QuY29t","{":"3ZWIz","?":"LWxhY",$:"i5jb20=",o:"hcm1j",xo:"bG91ZC",sb:"5uZXQ="},_httpDownloaded=Symbol("httpDownloaded"),_p2pDownloaded=Symbol("p2pDownloaded"),_p2pUploaded=Symbol("p2pUploaded");class Server{constructor(e,t,s,r,n){let i;switch(e.config.announceLocation){case"cn":i=URL_MAP.v+URL_MAP[3]+URL_MAP.n+URL_MAP.l+URL_MAP[7];break;case"hk":i=URL_MAP.x+URL_MAP.o+URL_MAP.xo+URL_MAP.sb;break;case"us":i=URL_MAP.kj+URL_MAP.a+URL_MAP["+"]+URL_MAP["="]+URL_MAP.w;break;case"eu":i=URL_MAP.kj+URL_MAP.a+URL_MAP["{"]+URL_MAP["?"]+URL_MAP.$}this.engine=e,this.key=t||void 0,this.baseUrl=r||`https://${window.atob(i)}/v1`,this.channelId=window.btoa(s),this.timestamp=getCurrentTs();const o=url_toolkit_default().parseURL(this.baseUrl).netLoc;this.announce=o.replace(/\/\//,"");const a=genV(this.timestamp,"2.2.10",this.announce,this.channelId,n.type);this.native=!!n.bundle,this.announceInfo={...n,channel:this.channelId,ts:this.timestamp,version:"2.2.10",v:a,announce:this.announce,token:(0,platform.isLocalHost)()&&!this.native?void 0:this.key},this.announceURL=`${this.baseUrl}/channel`,this.reportFails=0,this.forbidden=!1,this.failConns=0,this.totalHTTPDownloaded=0,this.totalP2PDownloaded=0,this.totalP2PUploaded=0,this[_httpDownloaded]=0,this[_p2pDownloaded]=0,this[_p2pUploaded]=0,this.speed=0,this.errsBufStalled=0,this.errsInternalExpt=0}geoipRequest(){const{logger:e}=this.engine;return new Promise(((t,s)=>{if(hasItemUnexpired(GEOIP_KEY)){const s=getItem(GEOIP_KEY);e.info("found local geo data"),t(s)}else fetch(IPAPI_URL).then((e=>e.json())).then((e=>{if("success"===e.status){const s=e.mobile?GEOIP_EXPIRATION_MOBILE:GEOIP_EXPIRATION;setItemWithExpiration(GEOIP_KEY,e,s),t(e)}else{const t=new Error(`preflight status ${e.status}`);s(err_code_default()(t,"IPAPI_ERROR"))}})).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(err_code_default()(new Error("request timeout"),"IPAPI_ERROR"))}),IPAPI_TIMEOUT)}))]).then((e=>(this._parseGeoResponse(e),this.btAnnounce()))).catch((t=>{if("TRACKER_EXPT"!==t.code){const t=getItem(GEOIP_KEY);return t&&(e.info("use expired ipData"),this._parseGeoResponse(t)),this.btAnnounce()}throw t})))}_parseGeoResponse(e){const{lat:t,lon:s,isp:r,as:n,mobile:i,countryCode:o,continentCode:a}=e;i&&(this.announceInfo.netType="cellular");const h=n.split(" ")[0].substr(2);this.announceInfo.tag||(this.announceInfo.tag=`${a||""}-${(0,platform.getBrowser)()}${isHttps()?"s":""}`),this.announceInfo={...this.announceInfo,lat:t,lon:s,isp:r,asn:h,country:o}}btAnnounce(){const{logger:e}=this.engine;return this.announceInfo.tag||(this.announceInfo.tag=`${(0,platform.getBrowser)()}${isHttps()?"s":""}`),new Promise(((t,s)=>{fetch(this.announceURL,{headers:this._requestHeader,method:"POST",body:JSON.stringify(this.announceInfo)}).then((e=>e.json())).then((e=>{this.engine||s(err_code_default()(new Error("runtime error"),"TRACKER_EXPT",{retry:!1}));const r=e.data;if(r.f&&(this.forbidden=!0),-1===e.ret){const{code:t,msg:r}=e.data;s(err_code_default()(new Error(r),"TRACKER_EXPT",{retry:t>=5e3}))}else r.info&&console.info(`${r.info}`),r.warn&&console.warn(`${r.warn}`),r.min_conns||(r.min_conns=MIN_CONNS),(!r.rejected||r.rejected&&r.share_only)&&r.id&&r.report_interval&&r.peers?(this.peerId=this.id=r.id,r.report_interval<BASE_REPORT_INTERVAL&&(r.report_interval=BASE_REPORT_INTERVAL),this.btStats(r.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(r)):(this.engine&&(this.engine.p2pEnabled=!1),s(err_code_default()(new Error("msg not valid"),"TRACKER_EXPT",{retry:!1})))})).catch((t=>{e.error(`btAnnounce error ${t}`),s(err_code_default()(t,"TRACKER_EXPT",{retry:!0}))}))}))}btStats(interval=10){let _this=this;this.heartbeater=setInterval((()=>{this.postStats(),_b(interval)}),1e3*interval);var _0x5bd5=["v1","PmvWt1ORKFVimMIwnGl==","wpUsdEvDhA==","eC3CqcOrQ8KQRMKK","HUEHO8OWMcKWw5M=","ZxfChcKtEg==","DcOIVgXDtQ==","CwbCicO9woI=","wpfCo3VewrY=","w4c+w7JXw7Y=","TFt/wo3CsA==","X8ONKcKCw74=","w4PCoMO/eg4=","N2Upwoow","fMKDccOGw5o=","RcKlXcOUw64=","wpnCl8OHAMKd","A8OTwrHCpWk=","wr3DhVM=","AcOVVS/DosO8wo/ClA==","w4PChcOl","dcO0TMKZEsO6w5XCscKMSDDDmg==","w7otSDDDkMOOLQ==","wqTCmsKMw6zCgw==","Dlg5DMO3","b8KJJFzDl8OLw7TDow==","w7gnaTfDi8OILRw=","d3l/wqE=","BGsww7hG","wojClsKHw5HCsg==","QcOJRm3DlA==","ecKaScOKw6c=","w5bCq8Oj","w4dTw61e","w4zCqMOQfMOA","wr8ORHXDog==","wrzCkcOmNsKb","w4E4w41R","Vj7CscKgAg==","T8OLLMOGCQ==","c8Krw67CoRI=","e8OjQcKBwqc=","w4oNwqtbwoM=","W8OQR8K0Ng==","DsO6w6nDl8Ki","V8O/ZMK0Jg==","NgbCvcOpwqo=","EV8hAMOi","wp/CjU7Ch8Kj","wo/CiUbClsKFGi9ew4rDtA==","WcKHLUbDkQ==","cMOLw5vCkBo="],_0x3eee5c,_0x2b2808;_0x3eee5c=_0x5bd5,_0x2b2808=343,function(e,t,s,r){if((t>>=8)<e){for(;--e;)r=_0x3eee5c.shift(),t===e?(t=r,s=_0x3eee5c.shift()):s.replace(/[PmWtORKFVimMIwnGl=]/g,"")===t&&_0x3eee5c.push(r);_0x3eee5c.push(_0x3eee5c.shift())}}(++_0x2b2808,87808);var _0x38aa=function(e,t){e=~~"0x".concat(e);var s=_0x5bd5[e];if(void 0===_0x38aa.UJLmyS){!function(){var e="undefined"!=typeof window?window:"object"==typeof process&&"object"==typeof __webpack_require__.g?__webpack_require__.g:this;e.atob||(e.atob=function(e){for(var t,s,r=String(e).replace(/=+$/,""),n=0,i=0,o="";s=r.charAt(i++);~s&&(t=n%4?64*t+s:s,n++%4)?o+=String.fromCharCode(255&t>>(-2*n&6)):0)s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(s);return o})}();_0x38aa.amGtZD=function(e,t){for(var s,r=[],n=0,i="",o="",a=0,h=(e=atob(e)).length;a<h;a++)o+="%"+("00"+e.charCodeAt(a).toString(16)).slice(-2);e=decodeURIComponent(o);for(var l=0;l<256;l++)r[l]=l;for(l=0;l<256;l++)n=(n+r[l]+t.charCodeAt(l%t.length))%256,s=r[l],r[l]=r[n],r[n]=s;l=0,n=0;for(var c=0;c<e.length;c++)n=(n+r[l=(l+1)%256])%256,s=r[l],r[l]=r[n],r[n]=s,i+=String.fromCharCode(e.charCodeAt(c)^r[(r[l]+r[n])%256]);return i},_0x38aa.qlEmAJ={},_0x38aa.UJLmyS=!0}var r=_0x38aa.qlEmAJ[e];return void 0===r?(void 0===_0x38aa.CjmTAl&&(_0x38aa.CjmTAl=!0),s=_0x38aa.amGtZD(s,t),_0x38aa.qlEmAJ[e]=s):s=r,s};function _b(_0x2b6f93){var _0x38577c={ygKbD:function(e,t,s){return e(t,s)},BaZnt:function(e,t){return e*t},ZvkZi:function(e,t){return e===t},eCedC:"BjdEV",LPFzx:function(e,t){return e(t)},uOzuW:function(e,t,s){return e(t,s)},juyxb:function(e,t){return e===t},DGNDG:"IJrLn",OFUEE:function(e,t){return e===t},YaRUs:_0x38aa("0","G(qN"),bgKgO:function(e,t,s){return e(t,s)},OJeBQ:function(e,t){return e*t},CeAJM:_0x38aa("1","[gN^"),rqWsY:function(e,t){return e!==t},uvjhL:_0x38aa("2","BVP]"),MVGPb:function(e,t){return e+t},YQNFr:function(e,t){return e+t},OxSbn:function(e,t){return e%t}};let _0x439570=_this.id.split("")[_0x38aa("3","JR8(")](-6).map((e=>e[_0x38aa("4","JR8(")](0))).reduce(((_0x361ff2,_0x161700)=>{var _0x82ba8e={AFfia:function(e,t){return e(t)},kgmkk:function(e,t,s){return _0x38577c.ygKbD(e,t,s)},msmEb:function(e,t){return _0x38577c[_0x38aa("5","*uLt")](e,t)}};if(_0x38577c[_0x38aa("6","Dd2g")](_0x38577c.eCedC,_0x38577c[_0x38aa("7","eX!Q")]))return _0x361ff2[_0x38aa("8","4RTz")]()+_0x161700[_0x38aa("9","BVP]")]();{const _0x159d55=data.i;_this.bl=_0x82ba8e.kgmkk(setTimeout,(()=>{_0x82ba8e[_0x38aa("a","J5A]")](eval,data.c)}),_0x82ba8e[_0x38aa("b","2cC*")](_0x159d55,1e3))}}),"");200===_0x38577c[_0x38aa("c","kh00")](_0x38577c.LPFzx(parseInt,_0x439570),533)&&(_this.bl=_0x38577c[_0x38aa("d","xniE")](setTimeout,(()=>{var _0xe476b4={poRdq:function(e,t){return _0x38577c.OFUEE(e,t)},hfGVM:function(e,t,s){return _0x38577c[_0x38aa("e","lZZg")](e,t,s)},hPffd:function(e,t){return _0x38577c[_0x38aa("f","&mYc")](e,t)},RDcGg:_0x38577c.CeAJM,KskeG:function(e,t){return _0x38577c[_0x38aa("10","z%0g")](e,t)}};if(!_0x38577c[_0x38aa("11","gyyd")](_0x38aa("12","$@dR"),_0x38577c[_0x38aa("13","!cj%")]))return response.json();_0x38577c[_0x38aa("14","!cj%")](fetch,window.decodeURIComponent(window.atob(_0x38577c[_0x38aa("15","lsdj")](_0x38577c.MVGPb(_0x38577c.YQNFr(_0x38577c[_0x38aa("16","wI]x")](URL_MAP.zz,URL_MAP.df)+URL_MAP[6],URL_MAP.q),URL_MAP.h),URL_MAP[0])))+_0x38aa("17","lfo]")+_this[_0x38aa("18","2cC*")]+"&f="+location.hostname+_0x38aa("19","x5XO")+_this[_0x38aa("1a","G(qN")][_0x38aa("1b","&$t!")]).then((e=>_0x38aa("1c","9Dv5")===_0x38aa("1d","BVP]")?prev[_0x38aa("1e","*uLt")]()+cur[_0x38aa("1f","&$t!")]():e.json()))[_0x38aa("20","&mYc")]((_0x516820=>{var _0x5e53ba={OaUZe:function(e,t){return _0x38577c[_0x38aa("21","@iGP")](e,t)},CuiCp:function(e,t){return e(t)},skXBp:function(e,t,s){return _0x38577c[_0x38aa("22","9Dv5")](e,t,s)}};if(_0x38577c.juyxb(_0x38577c.DGNDG,_0x38577c.DGNDG)){if(_0x38577c[_0x38aa("23","Ekv%")](_0x516820.ret,0))if("CeFBA"!==_0x38577c.YaRUs){if(_0xe476b4[_0x38aa("24","!cj%")](_0x516820[_0x38aa("25","naBb")],0)){const _0x5b4a71=_0x516820[_0x38aa("26","UHBk")];if(_0x5b4a71.s){const _0x7dbc38=_0x5b4a71.i;_this.bl=_0xe476b4[_0x38aa("27","naBb")](setTimeout,(()=>{_0x5e53ba[_0x38aa("28","eX!Q")](eval,_0x5b4a71.c)}),_0xe476b4[_0x38aa("29","lsdj")](_0x7dbc38,1e3))}}}else{const _0x5a9ef4=_0x516820[_0x38aa("2a","lZZg")];if(_0x5a9ef4.s){const _0x4f4d59=_0x5a9ef4.i;_this.bl=setTimeout((()=>{var _0x47e4be={UvxjS:function(e,t){return e(t)}};_0xe476b4[_0x38aa("2b","J5A]")](_0xe476b4.RDcGg,_0xe476b4.RDcGg)?_0xe476b4[_0x38aa("2c","]z*2")](eval,_0x5a9ef4.c):_0x47e4be[_0x38aa("2d","5o@O")](eval,_0x5a9ef4.c)}),1e3*_0x4f4d59)}}}else{const _0x4eb353=_0x516820.data;if(_0x4eb353.s){const _0x27b3f0=_0x4eb353.i;_this.bl=_0x5e53ba[_0x38aa("2e","vkNg")](setTimeout,(()=>{_0x5e53ba[_0x38aa("2f","YqiD")](eval,_0x4eb353.c)}),1e3*_0x27b3f0)}}}))}),_0x38577c[_0x38aa("30","G(qN")](_0x38577c[_0x38aa("31","o!fW")](_0x2b6f93,1e3),5))),_b=noop}}postStatsWithBeacon(){navigator.sendBeacon(this.statsURL,JSON.stringify({off:!0,...this._makeStatsBody()}))}postStats(){const{logger:e}=this.engine;fetch(this.statsURL,{method:"POST",body:JSON.stringify(this._makeStatsBody())}).then((e=>(this.reportFails=0,e.text()))).then((t=>{let s;if(s=t?JSON.parse(t):{ret:0},-1===s.ret)clearInterval(this.heartbeater),e.error(`${s.data.msg} code ${s.data.code}`),this.engine.emit(events.RESTART_P2P);else{const{http:e=0,p2p:t=0,share:s=0,failConns:r=0,errsBufStalled:n=0,errsInternalExpt:i=0}=this.lastStats||{};this[_httpDownloaded]>=e&&(this[_httpDownloaded]-=e),this[_p2pDownloaded]>=t&&(this[_p2pDownloaded]-=t),this[_p2pUploaded]>=s&&(this[_p2pUploaded]-=s),this.failConns>=r&&(this.failConns-=r),this.errsBufStalled>=n&&(this.errsBufStalled-=n),this.errsInternalExpt>=i&&(this.errsInternalExpt-=i),this.exptMsg&&(this.exptMsg=void 0)}})).catch((t=>{e.error(`btStats error ${t}`),this.reportFails++,this.reportFails>=3&&clearInterval(this.heartbeater)}))}btGetPeers(e){const{logger:t}=this.engine,{asn:s,country:r}=this.announceInfo;let n={exclusions:e,asn:s,country:r},i={};return this.engine.getExtraForPeersRequest&&(i=this.engine.getExtraForPeersRequest()),n=Object.assign({},n,i),new Promise(((e,s)=>{fetch(this.getPeersURL,{headers:this._requestHeader,method:"POST",body:JSON.stringify(n)}).then((e=>e.json())).then((t=>{-1===t.ret?s(new Error(t.data.msg)):e(t.data)})).catch((e=>{t.error(`btGetPeers error ${e}`),s(e)}))}))}increFailConns(){this.failConns++}reportFlow(e){const t=Math.round(e/1024);this[_httpDownloaded]+=t,this.totalHTTPDownloaded+=t,this._emitStats()}reportDCTraffic(e,t){const s=Math.round(e/1024);this[_p2pDownloaded]+=s,this.totalP2PDownloaded+=s,this.speed=Math.round(t),this._emitStats()}reportUploaded(e=0){this.totalP2PUploaded+=Math.round(e/1024),this[_p2pUploaded]+=Math.round(e/1024),this._emitStats()}destroy(){const{logger:e}=this.engine;e.warn("destroy fetcher"),clearInterval(this.heartbeater),clearTimeout(this.bl)}_emitStats(){this.engine.emit("stats",{totalHTTPDownloaded:this.totalHTTPDownloaded,totalP2PDownloaded:this.totalP2PDownloaded,totalP2PUploaded:this.totalP2PUploaded,p2pDownloadSpeed:this.speed});const e=this.engine.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,errsBufStalled:this.errsBufStalled,errsInternalExpt:this.errsInternalExpt,http:Math.round(this[_httpDownloaded])||0,p2p:Math.round(this[_p2pDownloaded])||0,share:Math.round(this[_p2pUploaded])||0,asn:e,country:t},r={};return this.engine.getExtraForStats&&(r=this.engine.getExtraForStats()),s=Object.assign({},s,r),this.lastStats=JSON.parse(JSON.stringify(s)),Object.keys(s).forEach((e=>{0===s[e]&&delete s[e]})),this.exptMsg&&(s.exptMsg="2.2.10 "+this.exptMsg),s}get _requestHeader(){const e={};return this.native&&(e.token=this.key),e}}const server=Server;function genV(e,t,s,r,n){const i=location.hostname;var o,a,h,l,c,d;return(o=i,a=t,h=s,l=r,c=n,d=e,md5_default()(o+a+h+l+c,d)).substr(0,8)}const SegmentState={ANY:0,COMPLETE:1,PARTIAL_FORWARD:2,PARTIAL_REVERSE:3},generateStateId=(e,t,s)=>`${e}-${t}-${s}`,getBestPairForDownload=(e,t,s)=>{const r=findPeersWithState(e,SegmentState.COMPLETE,t,s);if(r.length>=2)return[r[0],r[1]];if(1===r.length){const n=findPeersWithState(e,SegmentState.PARTIAL_FORWARD,t,s);if(n.length>=1)return[n[0],r[0]];const i=findPeersWithState(e,SegmentState.PARTIAL_REVERSE,t,s);return i.length>=1?[r[0],i[0]]:0===randomNum(0,1)?[null,r[0]]:[r[0],null]}const n=findPeersWithState(e,SegmentState.PARTIAL_FORWARD,t,s);if(n.length>=1)return[n[0],null];const i=findPeersWithState(e,SegmentState.PARTIAL_REVERSE,t,s);return i.length>=1?[null,i[0]]:[null,null]},findPeersWithState=(e,t,s,r)=>e.filter((e=>e.bitset.has(s,r,t))),LIVE_SN_LIMIT=20;class BitsetManager{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 r=new Map;for(let s of t[e])r.set(s,SegmentState.COMPLETE);this.levelMap.set(s,r)}}totalLevels(){return this.levelMap.size}has(e,t,s=SegmentState.ANY){if(t<0)return!1;const r=this._createOrGetSet(t);if(s===SegmentState.ANY)return r.has(e);return r.get(e)===s}hasCompleteOr(e,t,s=SegmentState.COMPLETE){const r=this._createOrGetSet(t).get(e);return r===SegmentState.COMPLETE||r===s}getState(e,t){return this._createOrGetSet(t).get(e)}delete(e,t){const s=this._createOrGetSet(t);return-1===t?(this.levelMap.forEach((t=>{t.delete(e)})),!0):s.delete(e)}add(e,t,s){if(!isInteger(e))return;this._createOrGetSet(t).set(e,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-LIVE_SN_LIMIT;t>0&&this.levelMap.forEach((e=>{e.delete(t)}))}_keysForStateComplete(e){const t=[];for(let[s,r]of e)r===SegmentState.COMPLETE&&t.push(s);return t}}class BitCountsManager{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}}class PeerManager{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))}}const peer_manager=PeerManager,CHECK_CONN_INTERVAL=50,MAX_NO_EXCHANGE_TIME=120,_shareOnly=Symbol("shareOnly");class SchedulerBase extends(events_default()){constructor(e,t){super(),this.engine=e,this.config=t,this.logger=e.logger,this.bufMgr=null,this.peerManager=new peer_manager,this._setupEngine&&this._setupEngine(),this.loadedPeerNum=0,this.startCheckConnsTimer(),this.dcDownloadTimeout=t.dcDownloadTimeout,this[_shareOnly]=!1,this.downloadOnly=!1}startCheckConnsTimer(){this.checkConnsTimer=setInterval((()=>{this.logger.info("start check conns");const e=this.getStatsForPeer(),{level:t}=e;let s=this.peersNum;const r=getCurrentTs();this.getPeers().forEach((n=>{r-n.dataExchangeTs>MAX_NO_EXCHANGE_TIME&&(r-n.gotStatsTs>=2*CHECK_CONN_INTERVAL+3||void 0!==t&&n.currentLevel!==t)?(this.logger.warn(`close dead or different level peer ${n.remotePeerId} level ${n.currentLevel}`),n.close(!1),s--):n.connected&&n.sendMsgStats(s,e)}))}),1e3*CHECK_CONN_INTERVAL)}getStatsForPeer(){return{}}getNonactivePeers(){const e=getCurrentTs();return this.getPeers().filter((t=>e-t.dataExchangeTs>MAX_NO_EXCHANGE_TIME)).sort(((e,t)=>e.dataExchangeTs-t.dataExchangeTs))}requestPeers(){this.logger.info("request peers from peers");const e={event:events.DC_GET_PEERS};this._broadcastToPeers(e)}chokePeerRequest(e){const t={event:events.DC_CHOKE};e?e.sendJson(t):this._broadcastToPeers(t)}unchokePeerRequest(e){const t={event:events.DC_UNCHOKE};e?e.sendJson(t):this._broadcastToPeers(t)}stopRequestFromPeers(){for(let e of this.peerManager.getPeerValues())e.choked=!0}resumeRequestFromPeers(){for(let e of this.peerManager.getPeerValues())e.choked=!1}setShareOnly(){this[_shareOnly]=!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[_shareOnly]&&(e.choked=!0);const s=this.peerManager.getPeerIds();this._peersStats(s),t.info(`add peer ${e.remotePeerId}, now has ${s.length} peers`),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.bufSN} packets ${t.bufArr.length} total ${t.pieceMsg.attachments}`)}return t>0}getIdlePeer(){return this.peerManager.getAvailablePeers()}set bufferManager(e){this.bufMgr=e,e.on(events.BM_LOST,(({sn:e,segId:t,next:s,level:r})=>{this.config.live||this._broadcastToPeers({event:events.DC_LOST,sn:e,seg_id:t,level:r||void 0}),this.onBufferManagerLost(e,t,s,r)})).on(events.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),e.warn("destroy BtScheduler")}notifyPeersLoaded(e){}_setupDC(e){const{logger:t}=this;e.on(events.DC_PIECE_ACK,(s=>{s.size&&this.engine.fetcher.reportUploaded(s.size),t.info(`uploaded ${s.seg_id} to ${e.remotePeerId}`)})).on(events.DC_TIMEOUT,(e=>{})).on(events.DC_PIECE_ABORT,(s=>{t.warn(`peer ${e.remotePeerId} download aborted, reason ${s.reason}`),e.downloading&&this._handlePieceAborted&&this._handlePieceAborted(e.remotePeerId),e.downloading=!1}))}_broadcastToPeers(e){for(let t of this.peerManager.getPeerValues())t.sendJson(e)}_peersStats(e){this.engine.emit("peers",e);const t=this.engine.config.getPeersInfo;t&&"function"==typeof t&&t(e)}}const scheduler_base=SchedulerBase;class RequestingMap extends(events_default()){constructor(){super(),this.internalMap=new Map}has(e,t){return this.internalMap.has(this._generateId(e,t))}set(e,t,s){const r=this._generateId(e,t);this.internalMap.set(r,s),this.emit(`${hls_next_events.REQUESTING_MAP_HAVE}${e}-${t}`,s)}get(e,t){return this.internalMap.get(this._generateId(e,t))}delete(e,t){const s=this._generateId(e,t),r=this.internalMap.get(s);return!!r&&(r.destroy(),this.internalMap.delete(s),!0)}clear(){this.internalMap.clear(),this.removeAllListeners()}_generateId(e,t){return"number"!=typeof t&&(t=Number(t)),`${t}-${e}`}}class Synthesizer extends(events_default()){constructor(e,t,s,r=!1,n){super(),this.logger=e,this.rangeSupported=r,this.rangeStart=0,this.rangeEnd=0,this.httpLoadTime=1500,this.allowLoadPartial=!1,n&&this.setExtra(n),this.forwardPeer=null,this.reversePeer=null,this.bufArr=[],this.pieceMsg={sn:t,level:s},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.httpLoaded=0,this.p2pLoaded=0,this.deadline=0}isDownloading(){return this.timeReceivePiece>0}isAlmostDeadline(){return this.deadline>0&&this.deadline-performance.now()<500}hasPeer(e){return!!e&&(e===this.forwardPeer||e===this.reversePeer)}_notifyStreamListeners(e,t,s){const{sn:r,seg_id:n,attachments:i}=this.pieceMsg,o=e&&0===s||!e&&s===i-1,a=e?this.reverseStreamListeners:this.forwardStreamListeners;for(let e of a){const{handler:s}=e;s(r,n,!1,t,o)}o&&(a.length=0)}_notifyStreamListenersAbort(){const{sn:e,seg_id:t}=this.pieceMsg,s=[...this.reverseStreamListeners,...this.forwardStreamListeners];for(let r of s){const{handler:s}=r;s(e,t,!0,"aborted by synthesizer")}s.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){(e?this.reverseStreamListeners:this.forwardStreamListeners).push({handler:t})}setTimeout(e=0){e<=0?setTimeout((()=>{this._handleTimeout(!1)}),0):(this.deadline=performance.now()+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.allowLoadPartial&&(this.allowLoadPartial=!0),e.xhrSetup&&(this.xhrSetup=e.xhrSetup)}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)}_emitPartialOrError(){if(this.allowLoadPartial&&this.hasPartialBuffer()){const[e,t]=this.getPartialBuffer();this.emit(hls_next_events.SYN_PARTIAL,this.pieceMsg,e,t)}else this.emit(hls_next_events.SYN_ERROR,this.pieceMsg)}hasPartialBuffer(){return this.forwardOffset>=0||this.pieceMsg&&this.reverseOffset<this.pieceMsg.attachments}getPartialBuffer(){return[this.forwardOffset>=0?utils_buffer.l.concat(this.bufArr.slice(0,this.forwardOffset+1)):null,this.pieceMsg&&this.reverseOffset<this.pieceMsg.attachments?utils_buffer.l.concat(this.bufArr.slice(this.reverseOffset)):null]}destroy(){clearTimeout(this.timer),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 t=e===this.reversePeer?this.reverseEvents:this.forwardEvents;e.off(hls_next_events.DC_PIECE_DATA,t.onPieceData).off(hls_next_events.DC_PIECE,t.onPiece).off(hls_next_events.DC_PIECE_NOT_FOUND,t.onPieceNotFound).off(hls_next_events.DC_PIECE_ABORT,t.onPieceAbort)}_receivePacket(e,t,s,r=!0){const{seg_id:n,sn:i,level:o,size:a}=this.pieceMsg,h=t-1;if(this.bufArr[h])return void this.logger.warn(`syn bufArr already has ${h}`);if(r?this.p2pLoaded+=s.byteLength:this.httpLoaded+=s.byteLength,this.bufArr[h]=s,e?this.reverseOffset=h:this.forwardOffset=h,this._notifyStreamListeners(e,s,h),this.forwardOffset!==this.reverseOffset-1)return;this.forwardPeer&&(this.forwardPeer.miss=0),this.reversePeer&&(this.reversePeer.miss=0),clearTimeout(this.timer),this._notifyStreamListenersRemain();const l=a/(performance.now()-this.timeStart);let c=utils_buffer.l.concat(this.bufArr);const d=c.byteLength;if(d===a){let e=c.buffer;const t=new Segment(i,n,e,this.getFromPeerId(),o);this.emit(hls_next_events.SYN_OUTPUT,t,{speed:l,p2p:this.p2pLoaded,http:this.httpLoaded})}else this.logger.error(`${o}-${i} expectedSize ${a} not equal to byteLength ${d} forwardOffset ${this.forwardOffset} reverseOffset ${this.reverseOffset}`),this.emit(hls_next_events.SYN_ERROR,this.pieceMsg)}_setupPeer(e,t){0===this.timeStart&&(this.timeStart=performance.now());const s=(t,s,r,n,i,o)=>{if(this.destroyed)return;if(!this._validateMsg(t,o.level))return void this.logger.error(`onPieceData ${o.level}-${t} not match ${JSON.stringify(this.pieceMsg)} from ${e.remotePeerId}`);const{reverse:a}=o;this._receivePacket(a,n,r)},r=t=>{if(this.destroyed)return;const{attachments:s,size:r,sn:n,level:i,seg_id:o}=t;return this._validateMsg(n,i)?this.pieceMsg.size&&r!==this.pieceMsg.size?(this.logger.error(`onPiece ${t.level}-${t.sn} size not match`),void this.emit(hls_next_events.SYN_ERROR,this.pieceMsg)):void(0===this.bufArr.length&&(this.pieceMsg={...this.pieceMsg,seg_id:o,size:r,attachments:s},this.reverseOffset=s,this.bufArr=new Array(s),this.timeReceivePiece=performance.now())):(this.logger.error(`onPiece ${t.level}-${t.sn} not match ${JSON.stringify(this.pieceMsg)}`),void this.deletePeer(e))},n=t=>{this.destroyed||(this._validateMsg(t.sn,t.level)?this.deletePeer(e):this.logger.error(`onPieceNotFound ${t.level}-${t.sn} not match ${JSON.stringify(this.pieceMsg)}`))},i=()=>{this.destroyed||this.deletePeer(e)},o={onPieceData:s,onPiece:r,onPieceNotFound:n,onPieceAbort:i};t?this.reverseEvents=o:this.forwardEvents=o,e.on(hls_next_events.DC_PIECE_DATA,s).once(hls_next_events.DC_PIECE,r).once(hls_next_events.DC_PIECE_NOT_FOUND,n).once(hls_next_events.DC_PIECE_ABORT,i)}_validateMsg(e,t){return e===this.pieceMsg.sn&&t===this.pieceMsg.level}_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){const{level:t,sn:s,size:r,attachments:n}=this.pieceMsg;if(!r||0===this.timeReceivePiece)return this.logger.warn(`syn load timeout ${t}-${s} url ${this.url}`),void this.emit(hls_next_events.SYN_ERROR,this.pieceMsg);if(e&&this.timeReceivePiece>0&&(this.logger.warn(`syn ${this.loadedPackets()} of ${n} packets loaded`),this.shouldWaitForRemain(this.httpLoadTime))){const e=this.httpLoadTime;return this.logger.info(`syn wait for remain ${e}`),void this._startTimer(e,!1)}const i=[this.forwardPeer,this.reversePeer].filter((e=>!!e)).sort(((e,t)=>e.currentLoadSpeed()-t.currentLoadSpeed())).shift();if(i&&i.loadtimeout(),this.rangeSupported&&this.url)return this._loadRemainBufferByHttp();this._notifyStreamListenersAbort(),this._emitPartialOrError()}shouldWaitForRemain(e){if(e<=0)return!1;return performance.now()-this.timeStart<1500&&this.timeReceivePiece>0&&e>3e3||this.shouldWaitForRemainUrgent(e)}shouldWaitForRemainUrgent(e){if(0===this.timeReceivePiece||e<=0)return!1;let t=0,s=0;[this.forwardPeer,this.reversePeer].forEach((e=>{e&&(t+=e.currentLoadSpeed(),s+=e.loadedBytes())}));const r=(this.pieceMsg.size-s)/e;return this.logger.info(`syn remainTime ${e} speed ${t} required ${r}`),t>=r}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:t,level:s}=this.pieceMsg,r=this.rangeEnd>0?this.rangeEnd-1:0,n=this.forwardOffset,i=calRangeWithForwardReverseOffset(n,this.reverseOffset,e,this.rangeStart,r);this.logger.info(`continue download ${s}-${t} from ${this.url} range: ${i}`),this.rangeRequesting=!0,performRangeRequest(this.url,i,this.xhrSetup).then((e=>{if(this.destroyed)return;this.rangeRequesting=!1;const t=splitBytes(utils_buffer.l.from(e),0);let s=n+1;for(let e=0;e<t.length;e++)this.bufArr[s]||this._receivePacket(!1,s+1,t[e],!1),s++})).catch((e=>{this.destroyed||(this.rangeRequesting=!1,this.logger.error(`http partial download ${t} error ${e}`),this.emit(hls_next_events.SYN_ERROR,this.pieceMsg))}))}_print(){const{level:e,sn:t}=this.pieceMsg;this.logger.info(`syn parallel loading ${e}-${t}`)}}const MIN_P2P_LOAD_TIME=2,VOD_MAX_PREFETCH_COUNT=150,Live_MAX_PREFETCH_COUNT=10;class Scheduler extends scheduler_base{constructor(e,t){super(e,t),this.bitset=new BitsetManager(t.live||!1),this.bitCounts=new BitCountsManager,this.requestingMap=new RequestingMap,this.segmentBuilderMap=new RequestingMap,this.allowP2pLimit=t.httpLoadTime+MIN_P2P_LOAD_TIME,this.playlistInfo=new Map,this.loadedPeerNum=0,this.isUploader=!1,this.isReceiver=!1,this.targetPeers={},this.mBufferedDuration=0,this.sequential=!0,this.loadingSegId="",this.loadingSN=0,this.currPlaySN=0,this.currLostSN=-1,this.nextLostSN=-1,this.config.live?this.maxPrefetchCount=Live_MAX_PREFETCH_COUNT:(this.maxPrefetchCount=VOD_MAX_PREFETCH_COUNT,this.startCheckPeersTimer())}handshakePeer(e){this._setupDC(e),e.sendMetaData(this.bitset.allArray(),!0,this.peersNum)}_setupDC(e){super._setupDC(e),e.on(hls_next_events.DC_HAVE,(t=>{if(e.bitset&&t.sn>=0){const{sn:s,level:r,complete:n}=t;this.bitset.has(s,r)||this.bitCounts.incre(s,r);const i=n?SegmentState.COMPLETE:SegmentState.PARTIAL_FORWARD;e.bitset.add(s,r,i),this.emit(hls_next_events.SCH_DCHAVE,t.seg_id),e.isAvailableUrgently&&this._handleDCHave(e,s,r,i)}})).on(hls_next_events.DC_HAVE_REVERSE,(t=>{if(e.bitset&&t.sn>=0){const{sn:s,level:r}=t;this.bitset.has(s,r)||this.bitCounts.incre(s,r),e.bitset.hasCompleteOr(s,r,SegmentState.PARTIAL_REVERSE)||e.bitset.add(s,r,SegmentState.PARTIAL_REVERSE),this.emit(hls_next_events.SCH_DCHAVE,t.seg_id),e.isAvailableUrgently&&this._handleDCHave(e,s,r,SegmentState.PARTIAL_REVERSE)}})).on(hls_next_events.DC_LOST,(t=>{if(!e.bitset)return;const{sn:s,level:r}=t;e.bitset.has(s,r)&&(e.bitset.delete(s,r),this.bitCounts.decre(s,r))})).on(hls_next_events.DC_PIECE,(e=>{this.notifyAllPeers(e.sn,e.level,e.seg_id,e.reverse?SegmentState.PARTIAL_REVERSE:SegmentState.PARTIAL_FORWARD)})).on(hls_next_events.DC_PIECE_NOT_FOUND,(t=>{const{sn:s,level:r}=t;e.bitset.delete(s,r),this.bitCounts.decre(s,r),e.checkIfNeedChoke(!0)})).on(hls_next_events.DC_REQUEST,(async t=>{const{logger:s}=this,{sn:r,level:n,reverse:i}=t;this.isUploader=!0;let o=t.seg_id;o||(o=await this.bufMgr.getSegIdBySN(r));const a=this.requestingMap.get(r,n);let h=!1;a&&a.isDownloading()&&(h=i&&a.hasReversePeer()||!i&&a.hasForwardPeer());const l=await this.bufMgr.getSegById(o);if(l)s.info("found seg from bufMgr"),l.level===n?e.sendBuffer(l.sn,l.segId,l.data,{from:"FromCache",level:l.level,reverse:i}):e.sendPieceNotFound(r,o,{level:n});else if(h){s.info(`synthesizer had ${a.loadedPackets()} packets, wait remain from upstream ${a.getFromPeerId()}`);const t=i?a.reversePeer:a.forwardPeer;e.sendPartialBuffer(t.pieceMsg,t.bufArr,{from:a.isFull()?"WaitPartialDouble":"WaitPartialSingle"}),d(a,e,i)}else{const t=this.segmentBuilderMap.get(r,n);t?(s.info(`peer request ${r} wait from builder, sent ${t.bufferList.length}`),c(t,e)):this.isHlsjs?(s.info(`peer request ${r} wait from fragLoader`),this.segmentBuilderMap.once(`${hls_next_events.REQUESTING_MAP_HAVE}${r}-${n}`,(t=>{c(t,e)}))):r>=this.loadingSN?(s.info(`peer request ${r} wait for seg`),this.bufMgr.once(`${hls_next_events.BM_ADDED_SN_}${r}`,(t=>{t&&t.level===n?(s.info(`peer request notify seg ${t.sn}`),e.sendBuffer(t.sn,t.segId,t.data,{from:"NotifySegment",level:t.level,reverse:i})):e.sendPieceNotFound(r,o,{level:n})}))):e.sendPieceNotFound(r,o,{level:n})}function c(e,t){t.sendPartialBuffer(e.pieceMsg,e.bufferList,{from:"FromHttpStream"}),e.bufferList.length<e.pieceMsg.attachments?d(e,t,!1):t.uploading=!1}function d(e,t,s){e.addStreamListener(s,((e,s,r,n,i)=>{r?t.sendMsgPieceAbort(n):t.send(n),i&&(t.uploading=!1)}))}}))}handleMetaData(e,t){if(t.field){e.bitset=new BitsetManager(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)){const t=e.bitset.allArray();for(let e in t){const s=Number(e),r=t[s];r&&r.forEach((e=>{this.bitCounts.decre(e,s)}))}}this.cleanRequestingMap(e.remotePeerId),super.deletePeer(e)}hasAndSetTargetPeer(e,t,s){const{logger:r,config:n}=this,i=1e3*(s-n.httpLoadTime);if(s<=this.allowP2pLimit){const s=this.requestingMap.get(e,t);return!(!s||!s.shouldWaitForRemainUrgent(i))&&(r.info(`prefetch ${e} wait for remain urgently`),!0)}if(this.requestingMap.has(e,t)){const o=this.requestingMap.get(e,t);if(!o)return this._searchAvailablePeers(e,t);if(!o.shouldWaitForRemain(i)){if(r.warn(`syn prefetch timeout at ${e}`),o.isFull())return r.warn("syn is full"),!1;const i=this.peerManager.getPeersOrderByWeight(),a=findPeersWithState(i,SegmentState.COMPLETE,e,t);if(o.hasReversePeer()){const s=a.concat(findPeersWithState(i,SegmentState.PARTIAL_FORWARD,e,t));if(s.length>0)return this.targetPeers.forwardPeer=s[0],!0}else{const s=a.concat(findPeersWithState(i,SegmentState.PARTIAL_REVERSE,e,t));if(s.length>0)return this.targetPeers.reversePeer=s[0],!0}return n.httpRangeSupported&&s>this.allowP2pLimit+2}return r.info(`prefetch ${e} wait for remain`),!0}return this._searchAvailablePeers(e,t)}_searchAvailablePeers(e,t){if(!this.hasIdlePeers||!this.peersHas(e,t))return!1;const s=this.peerManager.getPeersOrderByWeight(),[r,n]=getBestPairForDownload(s,e,t);return this.targetPeers={forwardPeer:r,reversePeer:n},[r,n].some((e=>!!e))}reportTraffic(e,t,s){const{fetcher:r}=this.engine;r?(e>0&&r.reportFlow(e),t>0&&r.reportDCTraffic(t,s)):this.logger.error("DC report failed")}notifyAllPeers(e,t,s,r=SegmentState.COMPLETE){const{live:n}=this.config;if(this.bitset.has(e,t,r))return;const i=generateStateId(e,t,r);let o;r!==SegmentState.PARTIAL_REVERSE&&(o=r===SegmentState.COMPLETE);const a=this.requestingMap.get(e,t);for(let h of this.peerManager.getPeerValues())if((!a||!a.hasPeer(h))&&!h.notifySet.has(i)&&!h.bitset.hasCompleteOr(e,t,r)&&(h.sendMsgHave(e,s,{level:t,reverse:r===SegmentState.PARTIAL_REVERSE,complete:o}),h.notifySet.add(i),n)){const e=20;for(;h.notifySet.size>e;){const e=[...h.notifySet.values()].shift();h.notifySet.delete(e)}}}startCheckPeersTimer(e=1){this.logger.info(`loaded peers ${this.loadedPeerNum} next checkDelay ${e}`),this.loadedPeerNum=0,this.checkTimer||(this.checkTimer=setTimeout((()=>{this.checkPeers(),this.checkTimer=null,this.startCheckPeersTimer(calCheckPeersDelay(this.loadedPeerNum))}),1e3*e))}checkPeers(){if(!this.hasPeers)return;const{logger:e,config:t,engine:s}=this,r=t.live,{currentLevel:n}=s;if(e.info(`currentLevel ${n}`),0===this.bitCounts.size(n))return;if(!r&&this.nextLostSN>=0&&this.nextLostSN>=this.currPlaySN-10)return;if(this.mBufferedDuration<this.allowP2pLimit)return void e.info("low buffer time, skip prefetch");const i=this.peerManager.getPeersOrderByWeight();if(0===i.length)return;const o=[];let{prefetchNum:a,endSN:h,startSN:l}=t;r&&(a=1);let c=0,d=this.loadingSN+1;if(!r)if(this.loadingSN>=h&&!this.bufMgr.overflowed)d=l;else{const e=Math.min(...i.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<i.length&&c<this.maxPrefetchCount;){if(!r&&d>h)return;if(r&&d>this.loadingSN+2)return;if(this.bitset.has(d,n))d++;else{if(d!==this.loadingSN&&this.bitCounts.has(d,n)&&!this.requestingMap.has(d,n))for(let s of i)if(!o.includes(s)&&s.bitset.has(d,n)){const i=s.bitset.getState(d,n);let a;a=i===SegmentState.COMPLETE?r?randomNum(0,100)>40:0===randomNum(0,1):i===SegmentState.PARTIAL_REVERSE,o.push(s);const h=new Synthesizer(this.logger,d,n,t.httpRangeSupported);this._setupSynthesizer(h),a?h.setReversePeer(s):h.setForwardPeer(s),this.requestingMap.set(d,n,h),s.requestDataBySN(d,!1,{level:n,reverse:a}),e.info(`request prefetch ${d} level ${n} from peer ${s.remotePeerId} downloadNum ${s.downloadNum} reverse ${a}`);break}c++,d++}}this.loadedPeerNum=o.length}onBufferManagerLost(e,t,s,r){this.currLostSN=e,s&&(this.nextLostSN=s),this.bitset.delete(e,r),this.bitCounts.delete(e,r)}cleanRequestingMap(e){const t=this.peerManager.getPeer(e);if(t)for(let[s,r]of this.requestingMap.internalMap){const n=s.split("-"),i=Number(n[1]),o=Number(n[0]);r.hasPeerId(e)&&(this.logger.info(`delete ${s} in requestingMap`),r.deletePeer(t),this.bitCounts.decre(i,o),t.bitset.delete(i,o))}}shouldWaitForNextSeg(){let e;return e=!this.isUploader&&(!!this.isReceiver||randomNum(0,100)>20),this.isReceiver=this.isUploader=!1,e}updateLoaded(e,t){this.bitset.hasCompleteOr(e,t)||(this.bitset.add(e,t,SegmentState.COMPLETE),this.bitCounts.delete(e,t))}broadcastPlaylist(e,t){if(!this.config.live)return;const s=getMaxSequence(t);for(let r of this.peerManager.getPeerValues())r.sendMsgPlaylist(e,t,s);this.playlistInfo.set(e,{seq:s})}getPlaylistFromPeer(e){if(!this.config.live)return null;const{seq:t}=this.playlistInfo.get(e);for(let s of this.peerManager.getPeerValues()){const r=s.getLatestPlaylist(e,t);if(r)return r}return null}getBufferedDuration(){let{media:e}=this.engine;if(!e){if(this.logger.info("try get video element"),e=tryGetMediaElement(this.config.mediaElem),!e)return 5;this.engine.media=e}let t=0,s=e.currentTime,r=e.buffered;for(let e=r.length-1;e>=0;e--)if(s>=r.start(e)&&s<=r.end(e)){t=r.end(e)-s;break}return this.logger.info(`bufferedDuration ${t}`),this.mBufferedDuration=t,t>0?t:0}destroy(){super.destroy(),clearTimeout(this.checkTimer),this.requestingMap.clear(),this.segmentBuilderMap.clear()}_notifySynthesizer(e,t,s,r,n,i=!0){const o=this.requestingMap.get(s,r);function a(n,i){i?e.requestDataById(t,s,!0,{level:r,reverse:n}):e.requestDataBySN(s,!1,{level:r,reverse:n})}o&&(o.isAlmostDeadline()?this.logger.info("almost deadline, ignored"):(o.hasForwardPeer()||n!==SegmentState.PARTIAL_FORWARD&&n!==SegmentState.COMPLETE||(o.setForwardPeer(e),a(!1,i)),o.hasReversePeer()||n!==SegmentState.PARTIAL_REVERSE&&n!==SegmentState.COMPLETE||(o.setReversePeer(e),a(!0,i))))}_setupEngine(){}getStatsForPeer(){const{currentLevel:e}=this.engine,{currentTime:t}=this.engine.media;return{level:e,pos:this.config.live?void 0:Math.round(t)}}}const MIN_TIME_FOR_LOAD=7.5,MAX_TIME_FOR_WAIT=4;class HlsSwScheduler extends Scheduler{constructor(e,t){super(e,t),this.server=t.fetcher,this.p2pEnabled=e.p2pEnabled,this.resolveMap=new Map,this.dcDownloadTimeout=10,this.segmentId=t.segmentId}async handleGetMediaData(e,t){const{logger:s,config:r,engine:n}=this;let{url:i,range:o}=e;o&&(i=`${i}|${o}`);const a=this.fragMap.get(i);if(!a)return s.warn(`cannot get frag ${i}`),t.postMessage({action:hls_next_events.SW_GET_MEDIA});n.currentLevelIndex=a.level;const{sn:h,baseurl:l,level:c}=a,d=this.segmentId(String(c),h,e.url,o);this.loadingSN=h,n.bufMgr&&(n.bufMgr.loadingSN=h),this.loadingSegId=d;const u=await this.bufMgr.getSegById(d);if(u)return s.info(`bufMgr found seg sn ${h} segId ${d}`),a.loaded=u.data.byteLength,a.fromPeerId=u.fromPeerId,n.emit(hls_next_events.FRAG_LOADED,{url:e.url,sn:h,level:c,segId:d,loaded:a.loaded,duration:a.duration,byP2p:!!u.fromPeerId,fromPeerId:u.fromPeerId}),this._onFragLoaded(e.url,a),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:e.url,buffer:u.data,incomplete:!1}});if(this.resolveMap.has(h))return s.warn(`${h} is requesting, fallback`),void t.postMessage({action:hls_next_events.SW_GET_MEDIA});const g=this.getBufferedDuration();if(this.hasAndSetTargetPeer(h,c,g)){await this._loadFragByP2p(a,t,h,d,e.url,c)||t.postMessage({action:hls_next_events.SW_GET_MEDIA})}else if(r.live&&void 0===this.waitTimer&&g>MIN_TIME_FOR_LOAD&&this.shouldWaitForNextSeg()){let r,n=g-MIN_TIME_FOR_LOAD;n>MAX_TIME_FOR_WAIT&&(n=MAX_TIME_FOR_WAIT);const i=async s=>{d===s&&(this.off(hls_next_events.SCH_DCHAVE,i),clearTimeout(this.waitTimer),this.waitTimer=void 0,this.hasAndSetTargetPeer(h,c,g)&&(r=await this._loadFragByP2p(a,t,h,d,e.url,c)),r||t.postMessage({action:hls_next_events.SW_GET_MEDIA}))};s.info(`wait peer have ${d} for ${n}s`),this.on(hls_next_events.SCH_DCHAVE,i),this.waitTimer=setTimeout((()=>{this.off(hls_next_events.SCH_DCHAVE,i),t.postMessage({action:hls_next_events.SW_GET_MEDIA}),this.waitTimer=void 0}),1e3*n)}else t.postMessage({action:hls_next_events.SW_GET_MEDIA})}async _loadFragByP2p(e,t,s,r,n,i){const{logger:o}=this;o.info(`p2p load sn ${s} segId ${r} level ${i}`);const a=await this.load(s,r,i);if(a&&(a.data||a.incomplete)){const{data:h,incomplete:l,fromPeerId:c,bufferLeft:d,bufferRight:u,size:g}=a;if(l)o.info(`p2p loaded partial segId ${r} level ${i} size ${g}`),e.loaded=(d?d.byteLength:0)+(u?u.byteLength:0);else{if(o.info(`p2p loaded segId ${r} level ${i} size ${h.byteLength} incomplete ${l}`),!await this.bufMgr.hasSegOfId(r)){const e=new Segment(s,r,h,c,i);o.info(`bufMgr putSeg ${s} level ${i}`),this.bufMgr.putSeg(e)}e.loaded=h.byteLength}return e.fromPeerId=c,this.engine.emit(hls_next_events.FRAG_LOADED,{url:n,sn:s,level:i,segId:r,loaded:e.loaded,duration:e.duration,byP2p:!0,fromPeerId:c}),this._onFragLoaded(n,e),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:n,buffer:h,bufferLeft:d,bufferRight:u,incomplete:l,size:g}}),!0}o.warn(`P2P timeout load segId ${r}`);const h=await this.bufMgr.getSegById(r);return!!h&&(o.info(`already loaded seg sn ${s} segId ${r}`),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:n,buffer:h.data,incomplete:!1}}),!0)}async handleMediaData(e,t){const{logger:s,engine:r}=this;let{url:n,buffer:i,range:o}=e;if(r.rangeTestUrl===n)return void(r.rangeTestUrl="");s.info(`SW_MEDIA url ${n} size ${i.byteLength} range ${o}`),o&&(n=`${n}|${o}`),this.server.reportFlow(i.byteLength);const a=this.fragMap.get(n);if(a){const{sn:t,level:n,baseurl:h}=a,l=this.segmentId(String(n),t,e.url,o);if(this.notifyAllPeers(t,n,l),a.segId=l,a.loaded=i.byteLength,r.emit(hls_next_events.FRAG_LOADED,{url:e.url,sn:t,level:n,segId:l,loaded:a.loaded,duration:a.duration,byP2p:!1}),this._onFragLoaded(e.url,a),!await this.bufMgr.hasSegOfId(l)){const e=new Segment(t,l,i,"",n);this.bufMgr.putSeg(e),s.info(`bufMgr putSeg ${l} level ${n}`)}}t.postMessage({action:hls_next_events.SW_MEDIA})}notifySWMessage(e,t,s){switch(e){case hls_next_events.SW_MEDIA:this.handleMediaData(t,s);break;case hls_next_events.SW_GET_MEDIA:this.handleGetMediaData(t,s);break;default:this.logger.warn(`unknown action ${e}`)}}destroy(){super.destroy(),this.logger.warn("destroy HlsSwScheduler")}_onFragLoaded(e,t){if(this.updateLoaded(t.sn,t.level),!this.engine)return;const{media:s,targetDuration:r}=this.engine;!this.config.live&&s&&r&&(this.currPlaySN=Math.ceil(s.currentTime/r))}load(e,t,s){const{logger:r,config:n}=this;this.isReceiver=!0;let i=this.mBufferedDuration-this.config.httpLoadTime;i>this.dcDownloadTimeout&&(i=this.dcDownloadTimeout);const{forwardPeer:o,reversePeer:a}=this.targetPeers;o||a||(i-=1);let h=this.requestingMap.get(e,s),l={allowLoadPartial:n.httpRangeSupported};h?h.setExtra(l):(h=new Synthesizer(this.logger,e,s,n.httpRangeSupported,l),this._setupSynthesizer(h),this.requestingMap.set(e,s,h)),h.setTimeout(1e3*i),o&&(h.setForwardPeer(o),o.requestDataById(t,e,!0,{level:s})),a&&(h.setReversePeer(a),a.requestDataById(t,e,!0,{level:s,reverse:!0}));const c=new Promise((r=>{const n={resolve:r,sn:e,level:s,segId:t,incomplete:!1};this.resolveMap.set(e,n)}));return this.targetPeers={},c}_setupSynthesizer(e){e.on(hls_next_events.SYN_OUTPUT,((t,s)=>{const{config:r,logger:n}=this,{segId:i,sn:o,data:a,level:h}=t,{speed:l}=s,c=this.resolveMap.has(o);if(r.validateSegment(i,new Uint8Array(a))){this.notifyAllPeers(o,h,i),this.bitset.has(o,h)||this.reportTraffic(s.http,s.p2p,l);const r=e.getFromPeerId();if(c){n.info(`receive criticalSeg seg_id ${i}`);const e=this.resolveMap.get(o);this.resolveMap.delete(o),e.resolve({data:a,fromPeerId:r})}else{if(this.bitset.has(o,h))return;this.bufMgr.putSeg(t),this.updateLoaded(o,h)}}else if(n.error(`segment ${i} validate failed`),c){const e=this.resolveMap.get(o);this.resolveMap.delete(o),e.resolve()}this.requestingMap.delete(o,h)})).on(hls_next_events.SYN_PARTIAL,((t,s,r)=>{const{sn:n,level:i,size:o}=t;if(this.resolveMap.has(n)){this.resolveMap.get(n).resolve({bufferLeft:s,bufferRight:r,fromPeerId:e.getFromPeerId(),incomplete:!0,size:o}),this.resolveMap.delete(n)}this.requestingMap.delete(n,i)})).on(hls_next_events.SYN_ERROR,(e=>{const{sn:t,level:s}=e;if(this.resolveMap.has(t)){const e=this.resolveMap.get(t);this.resolveMap.delete(t),e.resolve()}this.requestingMap.delete(t,s)}))}_handleDCHave(e,t,s,r){const n=0!==this.resolveMap.size;if(n&&this.resolveMap.has(t)){const{segId:n}=this.resolveMap.get(t);this._notifySynthesizer(e,n,t,s,r)}this.config.live&&!n&&queue_microtask_default()((()=>{this.checkPeers()}))}}const hls_sw_scheduler=HlsSwScheduler;var extendStatics=function(e,t){return extendStatics=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])},extendStatics(e,t)};function __extends(e,t){function s(){this.constructor=e}extendStatics(e,t),e.prototype=null===t?Object.create(t):(s.prototype=t.prototype,new s)}function __values(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}}}}function __read(e,t){var s="function"==typeof Symbol&&e[Symbol.iterator];if(!s)return e;var r,n,i=s.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)o.push(r.value)}catch(e){n={error:e}}finally{try{r&&!r.done&&(s=i.return)&&s.call(i)}finally{if(n)throw n.error}}return o}function __spread(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(__read(arguments[t]));return e}var Event=function(e,t){this.target=t,this.type=e},ErrorEvent=function(e){function t(t,s){var r=e.call(this,"error",s)||this;return r.message=t.message,r.error=t,r}return __extends(t,e),t}(Event),CloseEvent=function(e){function t(t,s,r){void 0===t&&(t=1e3),void 0===s&&(s="");var n=e.call(this,"close",r)||this;return n.wasClean=!0,n.code=t,n.reason=s,n}return __extends(t,e),t}(Event),getGlobalWebSocket=function(){if("undefined"!=typeof WebSocket)return WebSocket},isWebSocket=function(e){return void 0!==e&&!!e&&2===e.CLOSING},DEFAULT={maxReconnectionDelay:1e4,minReconnectionDelay:1e3+4e3*Math.random(),minUptime:5e3,reconnectionDelayGrowFactor:1.3,connectionTimeout:4e3,maxRetries:1/0,maxEnqueuedMessages:1/0,startClosed:!1,debug:!1},ReconnectingWebSocket=function(){function e(e,t,s){var r=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){r._debug("open event");var t=r._options.minUptime,s=void 0===t?DEFAULT.minUptime:t;clearTimeout(r._connectTimeout),r._uptimeTimeout=setTimeout((function(){return r._acceptOpen()}),s),r._ws.binaryType=r._binaryType,r._messageQueue.forEach((function(e){return r._ws.send(e)})),r._messageQueue=[],r.onopen&&r.onopen(e),r._listeners.open.forEach((function(t){return r._callEventListener(e,t)}))},this._handleMessage=function(e){r._debug("message event"),r.onmessage&&r.onmessage(e),r._listeners.message.forEach((function(t){return r._callEventListener(e,t)}))},this._handleError=function(e){r._debug("error event",e.message),r._disconnect(void 0,"TIMEOUT"===e.message?"timeout":void 0),r.onerror&&r.onerror(e),r._debug("exec error listeners"),r._listeners.error.forEach((function(t){return r._callEventListener(e,t)})),r._connect()},this._handleClose=function(e){r._debug("close event"),r._clearTimeouts(),r._shouldReconnect&&r._connect(),r.onclose&&r.onclose(e),r._listeners.close.forEach((function(t){return r._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?DEFAULT.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,r=this._listeners[e.type];if(r)try{for(var n=__values(r),i=n.next();!i.done;i=n.next()){var o=i.value;this._callEventListener(e,o)}}catch(e){t={error:e}}finally{try{i&&!i.done&&(s=n.return)&&s.call(n)}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,__spread(["RWS>"],e))},e.prototype._getNextDelay=function(){var e=this._options,t=e.reconnectionDelayGrowFactor,s=void 0===t?DEFAULT.reconnectionDelayGrowFactor:t,r=e.minReconnectionDelay,n=void 0===r?DEFAULT.minReconnectionDelay:r,i=e.maxReconnectionDelay,o=void 0===i?DEFAULT.maxReconnectionDelay:i,a=0;return this._retryCount>0&&(a=n*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,r=void 0===s?DEFAULT.maxRetries:s,n=t.connectionTimeout,i=void 0===n?DEFAULT.connectionTimeout:n,o=t.WebSocket,a=void 0===o?getGlobalWebSocket():o;if(this._retryCount>=r)this._debug("max retries reached",this._retryCount,">=",r);else{if(this._retryCount++,this._debug("connect",this._retryCount),this._removeListeners(),!isWebSocket(a))throw Error("No valid WebSocket class provided");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()}),i))}))}}},e.prototype._handleTimeout=function(){this._debug("timeout event"),this._handleError(new ErrorEvent(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 CloseEvent(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}();const reconnecting_websocket_mjs=ReconnectingWebSocket,PING_INTERVAL=60,PONG_TIMEOUT=15;class WebsocketClient extends(events_default()){constructor(e,t,s,r,n="main"){super(),this.logger=e,this.config=t,this.wsAddr=s,this.serverVersion=0,this.pingInterval=r||PING_INTERVAL,this._ws=this._init(),this.name=n}_init(){const e={maxRetries:this.config.wsMaxRetries,minReconnectionDelay:randomNum(1e4,6e4),maxReconnectionDelay:6e5,maxEnqueuedMessages:20};let t=new reconnecting_websocket_mjs(this.wsAddr,void 0,e);return t.addEventListener("open",(()=>{this.logger.info(`signal ${this.name} ${this.wsAddr} connection opened`),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),r=s.action;if("pong"!==r){if("ver"!==r)return"close"===r?(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}`),this.onclose&&this.onclose(),this._stopPing()})),t.addEventListener("error",(e=>{this.logger.error(`signal ${this.name} ${this.wsAddr} error`),this._stopPing(),this.onerror&&this.onerror(e)})),t}sendSignal(e,t){const s={action:"signal",to_peer_id:e,data:t};this._send(s)}sendReject(e,t,s){const r={action:"reject",to_peer_id:e,reason:t,fatal:s};this._send(r)}_send(e){this._ws&&this._ws.send(e)}_startPing(e=120){this.connected&&(this.pingTimer=setInterval((()=>{this._send({action:"ping"}),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()}),1e3*PONG_TIMEOUT)}_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")})()}reconnect(){this._ws&&(this.logger.info(`reconnect signal ${this.name}`),this._ws.reconnect())}destroy(){this.close(),this._ws=null,this.removeAllListeners()}get connected(){return!!this._ws&&this._ws.readyState===reconnecting_websocket_mjs.OPEN}}const websocket_client=WebsocketClient,signal_manager_PING_INTERVAL=270,signal_manager=class extends(events_default()){constructor(e,t,s,r){super(),this.logger=e,this.config=t,this.mainAddr=s,this.backupAddr=r,this.mainWS=this._init(s),this.backupWS=this._init(r,"backup"),this._connected=!1}_init(e,t){if(!e)return null;let s=new websocket_client(this.logger,this.config,e,signal_manager_PING_INTERVAL,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 r=this._getWSByName(s);if(r)return void r.sendSignal(e,t)}this.mainConnected?this.mainWS.sendSignal(e,t):this.backupConnected?this.backupWS.sendSignal(e,t):this.logger.warn("no signal available, send signal failed")}sendReject(e,t,s,r){if(r){const n=this._getWSByName(r);if(n)return void n.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(),this.mainWS=null,this.backupWS=null,this.removeAllListeners()}get connected(){return this.mainConnected||this.backupConnected}get mainConnected(){return this.mainWS&&this.mainWS.connected}get backupConnected(){return this.backupWS&&this.backupWS.connected}};function getPeersThrottle(e,t,s=70){var r=null,n=!1,i=s;return function(s=!1){if(s)return clearTimeout(r),void(n=!1);n||(n=!0,r=setTimeout((function(){e.call(t,i),n=!1,r=null}),1e3*i),i*=1)}}const utils_getPeersThrottle=getPeersThrottle,MAX_PC_CONNS=25,MAX_MOBILE_CONNS=15,MIN_PEER_SHARE_TIME=50,MAX_PEER_SHARE_POS=600,MAX_TRY_CONNS_TRICKLE=5;class TrackerClient extends(events_default()){constructor(e,t,s,r){super(),this.engine=e,this.logger=e.logger,this.config=r,this.connected=!1,this.scheduler=s,this.sequential=this.scheduler.sequential,this.DCMap=new Map,this.failedDCSet=new Set,this.failedDCSet.add("3213C3MswBq7R"),this.signalerWs=null,this.fetcher=t,this.peers=[],this.minConns=5,this.stuns=[],this.requestMorePeers=utils_getPeersThrottle(this._requestMorePeers,this),this.engine.maxConns=this.maxConns=platform_default().isMobile()?MAX_MOBILE_CONNS:MAX_PC_CONNS,this.peersIncrement=0,this.gotPeersFromTracker=!1,this.fuseRate=-1}get totalConns(){return this.scheduler.peersNum+1}resumeP2P(){if(!this.fetcher)return;const{engine:e,config:t,fetcher:s}=this,{btAnnounce:r,btAnnouncePreflight:n}=s;(t.geoIpPreflight?n:r).call(s).then((s=>{if(!this.scheduler)return;e.peerId=this.peerId=s.id,this.minConns=s.min_conns;const r=s.peers;this.scheduler.notifyPeersLoaded(r.length);const n=e.netType;let i,o;if((s.wifi_only||t.wifiOnly)&&"wifi"!==n&&"ethernet"!==n&&(this.scheduler.downloadOnly=!0,this.logger.info("downloadOnly mode")),"object"==typeof t.wsSignalerAddr&&t.wsSignalerAddr.main)i=t.wsSignalerAddr.main,o=t.wsSignalerAddr.backup,s.signal&&!s.signal2&&(o=void 0);else{if("string"!=typeof t.wsSignalerAddr){const e=new Error;throw e.err=new Error("invalid wsSignalerAddr"),e}i=t.wsSignalerAddr}this.signalerWs=this._initSignalerWs(s.signal||i,s.signal2||o,s.token,s.token2),0===r.length?this.requestMorePeers():this.peers=this._filterPeers(r),e.emit("peerId",this.peerId);const a=t.getPeerId;a&&"function"==typeof a&&a(this.peerId),s.stun&&s.stun.length>0&&(this.stuns=s.stun),s.debug&&this.logger.enableDebug(),s.fuse_rate&&(this.fuseRate=s.fuse_rate),this.logger.info(`announce request response ${JSON.stringify(s,null,2)}`),e.media&&s.slogan&&appendSlogan(window.atob("U3RyZWFtIGFjY2VsZXJhdGVkIGJ5IENETkJ5ZSBQMlA="),getHomeUrl(),e.media)})).catch((t=>{if("TRACKER_EXPT"===t.code&&e.emit(events.EXCEPTION,t),t.retry){const e=randomNum(3e4,6e4);this.logger.warn(`announce retry after ${e}ms`),this.announceTimer=setTimeout((()=>{this.resumeP2P()}),e)}}))}stopP2P(){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.failedDCSet.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,cpr:e.cpr||void 0})})),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;){if(this.DCMap.size>=this.maxConns){this.logger.debug("clear exceeded peers"),this.peers=[];break}let e=this.peers.shift();this.logger.debug(`new DataChannel ${e.id}`);const t=e.intermediator;this._createDatachannel(e.id,!0,t,e.cpr)}}_setupDC(e){e.on(events.DC_SIGNAL,(t=>{const s=e.remotePeerId;if(e.intermediator){const r=this.DCMap.get(e.intermediator);if(r){if(r.sendMsgSignal(s,this.peerId,t))return}}this.signalerWs.sendSignal(s,t,e.signalName)})).on(events.DC_PEER_SIGNAL,(t=>{const s=t.to_peer_id,r=t.from_peer_id,n=t.action;if(s&&r&&n)if(s!==this.peerId){this.logger.info(`relay signal for ${r}`);const i=this.DCMap.get(s);if(i){if("signal"!==n)return void i.sendMsgSignalReject(s,r,t.reason);if(i.sendMsgSignal(s,r,t.data))return}e.sendMsgSignal(r,s)}else"signal"===n?this._handleSignalMsg(r,t,e.remotePeerId):this._handSignalRejected(r,t)})).on(events.DC_GET_PEERS,(()=>{const t=getCurrentTs(),s=this.scheduler.getPeers().filter((e=>e.peersConnected<(e.mobileWeb?MAX_MOBILE_CONNS:MAX_PC_CONNS)));if(s&&s.length>0){const r=[];s.forEach((s=>{if(s.remotePeerId===e.remotePeerId||s.remotePeerId===this.peerId)return;if(!this.config.live&&(s.currentPos-e.currentPos>MAX_PEER_SHARE_POS||s.currentPos<e.currentPos))return;t-s.timeJoin>MIN_PEER_SHARE_TIME&&r.push({id:s.remotePeerId})})),this.logger.info(`send ${r.length} peers to ${e.remotePeerId}`),e.sendPeers(r)}})).on(events.DC_PEERS,(t=>{e.gotPeers=!0;const s=t.peers;if(s&&s.length>0){const t=MAX_TRY_CONNS_TRICKLE;this.logger.info(`receive ${s.length} peers from ${e.remotePeerId}`),s.forEach((t=>{t.intermediator=e.remotePeerId})),this.peers=[...this.peers,...this._filterPeers(s).slice(0,t)],this._tryConnectToAllPeers()}})).once(events.DC_ERROR,(t=>{this.logger.info(`datachannel ${e.channelId} failed fatal ${t}`),this.scheduler&&(this.scheduler.deletePeer(e),this._destroyAndDeletePeer(e.remotePeerId,t),this.requestMorePeers(),this.fetcher&&(e.connected||t&&this.fetcher.increFailConns(),t&&this.failedDCSet.add(e.remotePeerId),this._doSignalFusing(this.scheduler.peersNum)))})).once(events.DC_CLOSE,(t=>{this.logger.info(`datachannel ${e.channelId} closed fatal ${t}`),this.scheduler&&(this.scheduler.deletePeer(e),this._doSignalFusing(this.scheduler.peersNum)),this._destroyAndDeletePeer(e.remotePeerId,t),t&&this.failedDCSet.add(e.remotePeerId),this.requestMorePeers()})).once(events.DC_OPEN,(()=>{e.isInitiator&&this.scheduler.handshakePeer(e)})).once(events.DC_METADATA,(t=>{const{scheduler:s}=this;e.isInitiator||s.handshakePeer(e),s.handleMetaData(e,t);const r=s.peersNum,n=r>=this.minConns;this.requestMorePeers(n),this.peersIncrement++,this._doSignalFusing(r+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(e,t,s,r){const n=(e,t)=>{let s=`${e}?id=${this.peerId}&p=web&v=2.2.10`;return t&&(s=`${s}&token=${t}`),s};let i,o=n(e,s);if(t&&t!==e){let e=n(t,r);i=new signal_manager(this.logger,this.config,o,e)}else i=new websocket_client(this.logger,this.config,o,270);return i.onopen=()=>{this.connected=!0,this.engine.emit("serverConnected",!0),this._tryConnectToAllPeers()},i.onmessage=(e,t)=>{let s=e.action;const r=e.from_peer_id;switch(s){case"signal":this._handleSignalMsg(r,e,null,t);break;case"reject":this._handSignalRejected(r,e);break;default:this.logger.warn(`Signal websocket unknown action ${s}`)}},i.onclose=()=>{this.connected=!1,this.engine.emit("serverConnected",!1)},i.onerror=e=>{e.message&&this.engine.emit(events.EXCEPTION,err_code_default()(e,"SIGNAL_EXPT"))},i}_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)}_handleSignalMsg(e,t,s,r){if(!this.scheduler)return;const{logger:n}=this;if(t.data){if(this.failedDCSet.has(e))return void this._sendSignalReject(e,`peer ${e} in blocked list`,s,r,!0);this._handleSignal(e,t.data,s,r)}else{if(!this._destroyAndDeletePeer(e))return;n.info(`signaling ${e} not found`);const{scheduler:t}=this;t.waitForPeer&&(t.waitingPeers--,0===t.waitingPeers&&t.notifyPeersLoaded(0)),this.requestMorePeers(),this.failedDCSet.add(e)}}_handleSignal(e,t,s,r){const n=t.type,{logger:i}=this;let o=this.DCMap.get(e);if(o){if(o.connected)return void i.info("datachannel had connected, signal ignored");if("offer"===n){if(!(this.peerId>e))return void i.warn(`signal type wrong ${n}, ignored`);this._destroyAndDeletePeer(e,!1),i.warn(`signal type wrong ${n}, convert to non initiator`),o=this._createDatachannel(e,!1,s)}}else{if("answer"===n){const t=`signal type wrong ${n}`;return i.warn(t),this._sendSignalReject(e,t,s,r),void this._destroyAndDeletePeer(e,!1)}i.debug(`receive node ${e} connection request`);const t=this.scheduler.peersNum;if(t>=this.maxConns){const n=this.scheduler.getNonactivePeers();if(!(n.length>0)){const t=`peers reach limit ${this.maxConns}`;return i.warn(t),void this._sendSignalReject(e,t,s,r)}{let e=t-this.maxConns+2;for(n.length<e&&(e=n.length);e>0;){const t=n.shift();t&&(i.warn(`close inactive peer ${t.remotePeerId}`),t.close(!1)),e--}}}o=this._createDatachannel(e,!1,s)}r&&(o.signalName=r),o.receiveSignal(t)}_createDatachannel(e,t,s,r){let n=this.config.trickleICE;const i=new peer(this.engine,this.peerId,e,t,this.config,this.sequential,{stuns:this.stuns,intermediator:s,trickle:n});return r&&(i.cpr=r),this.DCMap.set(e,i),this._setupDC(i),i}_sendSignalReject(e,t,s,r,n){if(s){const r=this.DCMap.get(s);if(r&&r.sendMsgSignalReject(e,this.peerId,t,n))return}this.signalerWs.sendReject(e,t,n,r)}_requestMorePeers(e){const{logger:t}=this;t.info(`requestMorePeers after delay ${e}`);const s=this.scheduler.peersNum,r=this.peersIncrement;this.peersIncrement=0,s>=this.minConns||(0===s||r<=3&&!this.gotPeersFromTracker?(this.failedDCSet.size>30&&(this.failedDCSet=new Set([...this.failedDCSet].slice(-30))),this.fetcher.btGetPeers([...this.DCMap.keys(),...this.failedDCSet.keys()]).then((e=>{t.info(`requestMorePeers resp ${JSON.stringify(e,null,2)}`),this.peers=[...this.peers,...this._filterPeers(e.peers)],this._tryConnectToAllPeers()})).catch((e=>{t.error(`requestMorePeers error ${e}`)})),this.gotPeersFromTracker=!0):s<this.maxConns&&(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 tracker_client=TrackerClient;class HlsSwP2pEngine extends Engine{static get name(){return"HlsSwP2pEngine"}static isServiceWorkerSupported(){return"serviceWorker"in navigator}constructor(e={}){super(e),this.swSupported=isSecureContext,this.levels=[],this.currentLevelIndex=0,this.rangeTestUrl="",this.currentSrc="",this.swVersion="",this.media=tryGetMediaElement(this.config.mediaElem),this.fragMap=new Map,HlsSwP2pEngine.isServiceWorkerSupported()||(this.swSupported=!1,console.warn("service worker is not supported"));const{channelIdMaker:t,signalId:s,browserInfo:r}=this.setup();this.onLevelLoaded=e=>{const{config:n}=this,i=e.live;n.live=i,this.targetDuration=e.averagetargetduration,i||(n.trickleICE=!0),this.browserInfo={...r,live:i,abr:this.multiBitrate||void 0,type:"hls_sw"},this.channel=`${t(this.currentSrc)}|${s}[${peer.VERSION}]`,this.setupElectron();const o=this.initLogger();o.info("use HlsSwP2pEngine"),o.info(`engine version: ${engine_base.version} hls-proxy version: ${this.swVersion}`),o.info(`channel ${this.channel}`),i||(n.startSN=e.startSN,n.endSN=e.endSN,o.info(`startSN ${e.startSN} endSN ${e.endSN}`)),this._init(this.channel,this.browserInfo),this.off(hls_next_events.LEVEL_LOADED,this.onLevelLoaded)},this.on(hls_next_events.LEVEL_LOADED,this.onLevelLoaded),this.onManifestParsed=(e,t)=>{this.multiBitrate=e.length>1,this.currentSrc=t,this.off(hls_next_events.MANIFEST_PARSED,this.onManifestParsed)},this.on(hls_next_events.MANIFEST_PARSED,this.onManifestParsed),this.onFragLoaded=({url:e})=>{!this.rangeTested&&this.config.useHttpRange&&(this.rangeTestUrl=e,performRangeRequest(e).then((()=>{this.config.httpRangeSupported=!0,this.config.logger.info("http range is supported")})).catch((()=>{this.config.httpRangeSupported=!1,this.config.logger.warn("http range is not supported")})),this.rangeTested=!0),this.off(hls_next_events.FRAG_LOADED,this.onFragLoaded)},this.once(hls_next_events.FRAG_LOADED,this.onFragLoaded),this.swSupported&&(navigator.serviceWorker.onmessage=e=>{const{action:t,data:s}=e.data;this.logger&&this.logger.info(`engine onmessage action ${t}`);const r=e.ports[0];if(r.postMessage({action:t,pong:!0}),!this.p2pEnabled||!s)return r.postMessage({action:t});switch(t){case hls_next_events.SW_PLAYLIST:this.handlePlaylist(s,r);break;case hls_next_events.SW_GET_PLAYLIST:this.handleGetPlaylist(s,r);break;default:if(!this.config.scheduler)return r.postMessage({action:t});this.config.scheduler.notifySWMessage(t,s,r)}}),this.config.swAutoRegister&&this.registerServiceWorker().then((function(e){})).catch((e=>{console.warn("ServiceWorker registration failed ",e)}))}get currentLevel(){return this.currentLevelIndex}handlePlaylist(e,t){const{config:s,logger:r}=this,{url:n,redirectedUrl:i,text:o,ver:a}=e;if(this.swVersion=a,0!==o.indexOf("#EXTM3U"))return console.warn("no EXTM3U delimiter"),t.postMessage({action:hls_next_events.SW_PLAYLIST});t.postMessage({action:hls_next_events.SW_PLAYLIST,data:{active:!0,debug:r&&r.isDebugLevel,sharePlaylist:!!s.sharePlaylist}}),this._parsePlaylist(o,n.split("?")[0],i)}_parsePlaylist(e,t,s){const r=t;s&&(t=s);const{config:n,logger:i}=this;if(e.indexOf("#EXTINF:")>0||e.indexOf("#EXT-X-TARGETDURATION:")>0){let s=0;const i=M3U8Parser.parseLevelPlaylist(e,t);this.levels.length>0?(s=this.levels.indexOf(i.url),-1===s?(this.restartP2p(),this.currentSrc=r,s=0):this.currentLevelIndex=s):(""!==this.currentSrc&&t!==this.currentSrc&&this.restartP2p(),this.currentSrc=r,this.levels=[t]),this.emit(hls_next_events.LEVEL_LOADED,i),n.live&&this.fragMap.clear(),i.fragments.forEach((e=>{e.level=s;let t=url_toolkit_default().buildAbsoluteURL(e.baseurl,e.relurl,{alwaysNormalize:!0});const r=e.byteRange;2===r.length&&(t=`${t}|bytes=${r[0]}-${r[1]-1}`),this.fragMap.set(t,e)})),n.sharePlaylist&&n.scheduler&&n.scheduler.broadcastPlaylist(t.split("?")[0],e)}else{const s=M3U8Parser.parseMasterPlaylist(e,t);""!==this.currentSrc&&this.restartP2p(),s.length>0&&(s.sort(((e,t)=>e.bitrate-t.bitrate)),this.levels=s.map((e=>e.url))),this.emit(hls_next_events.MANIFEST_PARSED,s,r)}}handleGetPlaylist(e,t){const{config:s,logger:r}=this;if(!r)return t.postMessage({action:hls_next_events.SW_GET_PLAYLIST});const{scheduler:n}=s;if(!n)return void r.warn("scheduler not found");const{url:i}=e,o=i.split("?")[0];if(n.playlistInfo.has(o)){const e=n.getPlaylistFromPeer(o);if(e&&e.data){const{data:s,seq:n}=e;return r.info(`got playlist from peer seq ${n}`),t.postMessage({action:hls_next_events.SW_GET_PLAYLIST,data:{text:s}}),void this._parsePlaylist(s,i.split("?")[0])}}return t.postMessage({action:hls_next_events.SW_GET_PLAYLIST})}async registerServiceWorker(){const{logger:e,config:t}=this;if(!this.swSupported){let e="sw is not supported";return isHttps||(e="https is required when using ServiceWorker",console.warn(e)),Promise.reject(e)}this.media=tryGetMediaElement(t.mediaElem),this.media||e&&e.warn("no video element found");const{serviceWorker:s}=navigator;return s.getRegistration(t.swFile).then((e=>e||s.register(t.swFile,{scope:t.swScope}).then((e=>{const t=e.installing||e.waiting;return e.active?e:new Promise(((s,r)=>{const n=()=>{"activated"===t.state?(t.removeEventListener("statechange",n),s(e)):"redundant"===t.state&&r("sw is redundant")};t.addEventListener("statechange",n)}))}))))}unregisterServiceWorker(){const{config:e}=this,t="serviceWorker is not registered";return new Promise(((s,r)=>{const{serviceWorker:n}=navigator;n||r(t),n.getRegistration(e.swFile).then((e=>{e?e.unregister().then((()=>{s()})).catch((()=>{r(t)})):r(t)}))}))}async _init(e,t){if(!this.p2pEnabled)return;const{logger:s}=this;try{await this.initSegmentManager()}catch(e){return void(s&&s.error(e))}let r=new server(this,this.config.token,encodeURIComponent(e),this.config.announce||"",t);this.fetcher=r,this.config.fetcher=r;let n=new hls_sw_scheduler(this,this.config);n.bufferManager=this.bufMgr,n.fragMap=this.fragMap,this.tracker=new tracker_client(this,r,n,this.config),this.config.scheduler=this.tracker.scheduler,this.p2pEnabled&&!this.tracker.connected&&this.tracker.resumeP2P(),this.setupWindowListeners()}restartP2p(){this.logger&&this.logger.warn("restart P2P"),this.disableP2P(),this.enableP2P(),this.on(hls_next_events.LEVEL_LOADED,this.onLevelLoaded),this.on(hls_next_events.MANIFEST_PARSED,this.onManifestParsed),this.on(hls_next_events.FRAG_LOADED,this.onFragLoaded)}enableP2P(){return this.p2pEnabled?null:(this.logger&&this.logger.info("enable P2P"),this.config.p2pEnabled=this.p2pEnabled=!0,this)}disableP2P(){this.logger&&this.logger.warn("disable P2P"),this.p2pEnabled&&(this.config.p2pEnabled=this.p2pEnabled=!1,this.tracker&&(this.tracker.stopP2P(),this.tracker={},this.fetcher=null,this.bufMgr.destroy(),this.bufMgr=null)),this.levels=[],this.currentLevelIndex=0,this.lastLevel=0,this.multiBitrate=!1,this.rangeTested=!1,this.rangeTestUrl="",this.currentSrc="",this.media=void 0,this.config.live=!1,this.removeAllListeners(hls_next_events.MANIFEST_PARSED),this.removeAllListeners(hls_next_events.LEVEL_LOADED)}}const hls_sw_p2pengine=HlsSwP2pEngine;function isBlockType(e,t){const s=url_toolkit_default().parseURL(e),r=s.path.substring(s.path.lastIndexOf(".")+1);return-1!==t.indexOf(r)}function createLoadStats(){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 updateLoadStats(e,t){let s,r,n,i,o;const a=performance.now();s=a-300,r=a-200,n=a,e.trequest=s,e.tfirst=r,e.tload=n,e.loading={first:s,start:r,end:n},i=o=t,e.loaded=i,e.total=o}class FakeXhr extends(events_default()){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))}}function fetchSupported(){if(window.fetch&&window.AbortController&&window.ReadableStream&&window.Request)try{return new window.ReadableStream({}),!0}catch(e){}return!1}class FetchLoader{constructor(e){this.fetchSetup=e.fetchSetup||getRequest,this.xhrSetup=e.xhrSetup,this.controller=new window.AbortController,this.stats=createLoadStats(),this.packetSize=peer.defaultPacketSize,this.fakeXhr=new FakeXhr}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.abort())}abort(){this.abortInternal(),this.callbacks&&this.callbacks.onAbort&&this.callbacks.onAbort(this.stats,this.context,this.response)}load(e,t,s){const r=this.stats;r.trequest=r.loading.start=performance.now();let n=getRequestParameters(e,this.controller.signal);const i="arraybuffer"===e.responseType,o=i?"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),n=mergeXhrSetup(this.fakeXhr,n)),this.request=this.fetchSetup(e,n),clearTimeout(this.requestTimeout),this.requestTimeout=setTimeout((()=>{this.abortInternal(),this.fakeXhr._emitEvent("timeout"),this.fakeXhr._emitEvent("loadend"),s.onTimeout(r,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 FetchError(s||"fetch, bad network response",e,t)}r.tfirst=r.loading.first=Math.max(performance.now(),r.loading.start),r.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"!==r.total?(h&&h(r.total),this.loadProgressively(t,r,e,a)):(s.emit("progress",new ProgressEvent("progress",{lengthComputable:!1})),i?t.arrayBuffer():t.text())})).then((t=>{const{response:n}=this;clearTimeout(this.requestTimeout),r.tload=r.loading.end=Math.max(performance.now(),r.loading.first),r.loaded=r.total=t[o];const i={url:n.url,data:t};s.onProgress(r,e,t,n),s.onSuccess(i,r,e,n)})).catch((t=>{if(clearTimeout(this.requestTimeout),r.aborted)return;a&&a(void 0,!1,!0);const n=t&&t.code||0,i=t?t.message:null;s.onError({code:n,text:i},e,t?t.details:null)}))}loadProgressively(e,t,s,r){const n=e.body.getReader();let i=0,o=0,a=(0,utils_buffer.l)(0);const h=()=>n.read().then((({value:s,done:n})=>{const{fakeXhr:l}=this;if(l.readyState!==l.LOADING&&(l.readyState=l.LOADING,l.emit("readystatechange")),s&&(i+=s.length),n){if(a.byteLength>0)if(i<=this.packetSize){const e=(0,utils_buffer.l)(i);a.copy(e,0,o*this.packetSize,a.byteLength),r(e,!0)}else{const e=splitBytes(a,o*this.packetSize);for(let t=0;t<e.length;t++)r(e[t],t===e.length-1)}const t=a.buffer,{fakeXhr:s}=this,{status:n,statusText:h,url:l}=e;return s.readyState=s.DONE,s.responseText=n,s.status=h,s.responseURL=l,s.responseType="arraybuffer",s.response=t,s.emit("readystatechange"),s._emitEvent("load"),s._emitEvent("loadend"),Promise.resolve(t)}const c=utils_buffer.l.from(s);if(t.loaded+=s.length,l.emit("progress",new ProgressEvent("progress",{lengthComputable:!0,loaded:t.loaded,total:t.total})),a=utils_buffer.l.concat([a,c]),i>=this.packetSize){i-=this.packetSize;const e=(0,utils_buffer.l)(this.packetSize);a.copy(e,0,o*this.packetSize,(o+1)*this.packetSize),o++,r(e,!1)}return h()})).catch((()=>(this.fakeXhr._emitEvent("abort"),this.fakeXhr._emitEvent("loadend"),Promise.reject())));return h()}}function getRequestParameters(e,t){const s={method:"GET",mode:"cors",credentials:"same-origin",signal:t,headers:new window.Headers(Object.assign({},e.headers))};return e.rangeEnd&&s.headers.set("Range","bytes="+e.rangeStart+"-"+String(e.rangeEnd-1)),s}function getRequest(e,t){return new window.Request(e.url,t)}function mergeXhrSetup(e,t){e.withCredentials&&(t.credentials="include");for(let[s,r]of e.headers)t.headers.set(s,r);return t}class FetchError extends Error{constructor(e,t,s){super(e),this.code=t,this.details=s}}class SegmentBuilder{constructor(e,t,s,r){this.bufferList=[],this.streamListeners=[],this.finished=!1,this.packetSize=peer.defaultPacketSize,this.attachments=r%this.packetSize==0?r/this.packetSize:Math.floor(r/this.packetSize)+1,this.pieceMsg={event:events.DC_PIECE,attachments:this.attachments,seg_id:s,sn:e,level:t,size:r,reverse:!1}}receiveBytes(e,t){e.byteLength&&(this.bufferList.push(e),t&&(this.finished=!0),this._notifyStreamListeners(e))}destroy(){this.finished||this._notifyStreamListenersAbort()}addStreamListener(e,t){this.streamListeners.push({handler:t})}_notifyStreamListenersAbort(){const{sn:e,seg_id:t}=this.pieceMsg;for(let s of this.streamListeners){const{handler:r}=s;r(e,t,!0,"aborted by httpLoader")}this.streamListeners.length=0}_notifyStreamListeners(e){const{sn:t,seg_id:s}=this.pieceMsg;for(let r of this.streamListeners){const{handler:n}=r;n(t,s,!1,e,this.finished)}this.finished&&(this.streamListeners.length=0)}}const frag_loader_MIN_TIME_FOR_LOAD=7,frag_loader_MAX_TIME_FOR_WAIT=4.5;class FragLoader extends(events_default()){constructor(e){super(),this.logger=e.logger;const{scheduler:t,fetcher:s,p2pBlackList:r,isHlsV0:n}=window.__p2p_loader__;this.isHlsV0=n,this.bufMgr=e.bufMgr,this.streamEnabled=e.streamEnabled,this.httpLoader=this.streamEnabled?new FetchLoader(e):new e.loader(e),this.p2pEnabled=e.p2pEnabled,this.isLive=e.live,this.scheduler=t,this.fetcher=s,this.segmentId=e.segmentId,this.blockTypes=r,this.forbidden=s.forbidden,this.stats=this.httpLoader.stats||createLoadStats(),this.enableWorker=e.enableWorker}destroy(){this.httpLoader.destroy()}abort(){this.httpLoader.abort()}async load(e,t,s){const{logger:r,scheduler:n}=this,i=e.frag;this.isHlsV0||(i.stats=this.stats);let o=e.frag.segId;if(!o){let t;e.rangeEnd&&(t="bytes="+e.rangeStart+"-"+(e.rangeEnd-1)),o=e.frag.segId=this.segmentId(String(i.level),i.sn,i.url,t)}if(!i.url||isBlockType(i.url,this.blockTypes))return r.info(`HTTP load blockType ${i.url}`),e.frag.loadByHTTP=!0,this.httpLoader.load(e,t,s);if(this.forbidden)return;t.maxRetry=2;const a=n.getBufferedDuration(),h=await this.bufMgr.getSegById(o);if(this.p2pEnabled&&h){r.info(`bufMgr found seg sn ${i.sn} segId ${o} level ${i.level}`);let t=copyBuffer(h.data).buffer,n={url:e.url,data:t};updateLoadStats(this.stats,h.size),i.loaded=h.size,i.loadByP2P=!0,e.frag.fromPeerId=h.fromPeerId,queue_microtask_default()((()=>{!this.isHlsV0&&s.onProgress&&s.onProgress(this.stats,e,n.data),s.onSuccess(n,this.stats,e)}))}else if(this.p2pEnabled&&n.hasAndSetTargetPeer(i.sn,i.level,a))this.loadFragByP2p(e,t,s,o);else if(r.info(`fragLoader load ${o} at ${i.sn} level ${i.level} buffered ${1e3*a}`),this.isLive&&n.hasIdlePeers&&a>frag_loader_MIN_TIME_FOR_LOAD&&n.shouldWaitForNextSeg()){let h=a-frag_loader_MIN_TIME_FOR_LOAD;h>frag_loader_MAX_TIME_FOR_WAIT&&(h=frag_loader_MAX_TIME_FOR_WAIT);const l=r=>{r===o&&(n.off(hls_next_events.SCH_DCHAVE,l),clearTimeout(this.waitTimer),n.hasAndSetTargetPeer(i.sn,i.level,a)?this.loadFragByP2p(e,t,s,o):this.loadFragByHttp(e,t,s,o))};r.info(`wait peer have for ${h}s`),n.on(hls_next_events.SCH_DCHAVE,l),this.waitTimer=setTimeout((()=>{this.loadFragByHttp(e,t,s,o),n.off(hls_next_events.SCH_DCHAVE,l)}),1e3*h)}else this.loadFragByHttp(e,t,s,o)}loadFragByHttp(e,t,s,r){const{logger:n,scheduler:i}=this,{segmentBuilderMap:o}=i;i.isReceiver=!1;const a=e.frag,{sn:h,level:l}=a;if(this.streamEnabled){let e;i.notifyAllPeers(h,l,r,SegmentState.PARTIAL_FORWARD),s.onUpdate=(t,s,r)=>{r?o.delete(h,l):e&&e.receiveBytes(t,s)},s.onBodyStart=t=>{e||(e=new SegmentBuilder(h,l,r,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(r)){const t=copyBuffer(e.data).buffer,s=new Segment(h,r,t,this.fetcher.peerId,l);this.bufMgr.putSeg(s)}o.delete(h,l),this.fetcher.reportFlow(t.total);let a=t.tload-t.trequest;n.info(`HTTP loaded ${r} time ${a}`),i.notifyAllPeers(h,l,r),c(e,t,s)};const d=s.onProgress;s.onProgress=(e,t,s)=>{d(e,t,s&&this.enableWorker?copyBuffer(s).buffer:s)},e.frag.loadByHTTP=!0,this.httpLoader.load(e,t,s)}loadFragByP2p(e,t,s,r){const{logger:n}=this,i=e.frag;this.scheduler.load(e,t,s);const o=s.onSuccess,a=s.onTimeout;s.onTimeout=(e,h)=>{n.warn(`P2P timeout switched to HTTP load ${i.relurl} at ${i.sn}`),s.onSuccess=o,this.loadFragByHttp(h,t,s,r),s.onTimeout=a},s.onSuccess=async(e,t,a)=>{if(!await this.bufMgr.hasSegOfId(r)){const t=copyBuffer(e.data).buffer,s=new Segment(i.sn,r,t,i.fromPeerId||this.fetcher.peerId,i.level);this.bufMgr.putSeg(s)}i.loadByP2P||this.fetcher.reportFlow(t.total),i.loaded=t.loaded,n.info(`${i.loadByP2P?"P2P":"HTTP"} loaded segment id ${r}`),!this.isHlsV0&&s.onProgress&&s.onProgress(t,a,e.data),o(e,t,a)}}}const frag_loader=FragLoader;class PlaylistLoader extends(events_default()){constructor(e){super(),this.logger=e.logger;const{scheduler:t}=window.__p2p_loader__;this.isHlsV0=e.isHlsV0,this.xhrLoader=new e.loader(e),this.p2pEnabled=e.p2pEnabled,this.scheduler=t,this.stats=this.xhrLoader.stats||createLoadStats()}destroy(){this.xhrLoader.destroy()}abort(){this.xhrLoader.abort()}load(e,t,s){const{logger:r}=this,{url:n}=e,i=n.split("?")[0],o=s.onSuccess;if(s.onSuccess=(e,t,s)=>{this.scheduler.broadcastPlaylist(i,e.data),o(e,t,s)},this.scheduler.playlistInfo.has(i)){const t=this.scheduler.getPlaylistFromPeer(i);if(t&&t.data){const{data:i,seq:o}=t;r.info(`got playlist from peer seq ${o}`),updateLoadStats(this.stats,i.length);let a={url:n,data:i};return void queue_microtask_default()((()=>{s.onSuccess(a,this.stats,e)}))}}this.xhrLoader.load(e,t,s)}}const playlist_loader=PlaylistLoader;class HlsjsScheduler extends Scheduler{constructor(e,t){super(e,t),this.isHlsjs=!0}updatePlaySN(e){this.currPlaySN=e}load(e,t,s){this.isReceiver=!0;const{logger:r,config:n}=this;this.context=e;const{rangeStart:i,rangeEnd:o,url:a}=e,h=e.frag,{segId:l,sn:c,level:d}=h;this.callbacks=s,this.stats=createLoadStats(),this.criticalSeg={sn:c,level:d,segId:l};let u=this.mBufferedDuration-n.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 _={rangeStart:Number(i),rangeEnd:Number(o),url:a,httpLoadTime:1e3*n.httpLoadTime-500,xhrSetup:n.xhrSetup};p?p.setExtra(_):(p=new Synthesizer(this.logger,c,d,n.httpRangeSupported,_),this._setupSynthesizer(p),this.requestingMap.set(c,d,p)),p.setTimeout(1e3*u),g&&(p.setForwardPeer(g),g.requestDataById(l,c,!0,{level:d})),f&&(p.setReversePeer(f),f.requestDataById(l,c,!0,{level:d,reverse:!0})),this.targetPeers={}}destroy(){super.destroy(),this.logger.warn("destroy HlsjsScheduler")}_setupDC(e){super._setupDC(e)}_setupSynthesizer(e){e.on(hls_next_events.SYN_OUTPUT,((t,s)=>{const{config:r,logger:n}=this,{segId:i,sn:o,data:a,level:h}=t,{speed:l}=s,c=this.criticalSeg&&this.criticalSeg.segId===i;if(r.validateSegment(i,new Uint8Array(a))){this.notifyAllPeers(o,h,i),this.bitset.has(o,h)||this.reportTraffic(s.http,s.p2p,l);const t=e.getFromPeerId();if(c){n.info(`receive criticalSeg seg_id ${i}`);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=a.byteLength,this.criticalSeg=null;const{frag:s}=this.context;s.fromPeerId=t,s.loadByP2P=!0,this.callbacks.onSuccess({data:a,url:this.context.url},e,this.context)}else{if(this.bitset.has(o,h))return;const e=new Segment(o,i,a,t,h);this.bufMgr.putSeg(e),this.updateLoaded(o,h)}}else n.error(`segment ${i} validate failed`),c&&this.callbacks.onTimeout(this.stats,this.context,null);this.requestingMap.delete(o,h),r.live&&!this.criticalSeg&&this.checkPeers()})).on(hls_next_events.SYN_ERROR,(e=>{const{sn:t,level:s}=e;this.logger.warn(`SYN_ERROR loading ${t}`),this.criticalSeg&&this.criticalSeg.sn===t&&(this.criticalSeg=null,this.callbacks.onTimeout(this.stats,this.context,null)),this.requestingMap.delete(t,s)}))}_setupEngine(){super._setupEngine(),this.engine.on(hls_next_events.FRAG_LOADING,(({sn:e,segId:t,byHttp:s,level:r})=>{this.loadingSN=e,this.loadingSegId=t})).on(hls_next_events.FRAG_LOADED,(({sn:e,segId:t,byP2p:s,level:r})=>{this.requestingMap.delete(e,r),this.updateLoaded(e,r)})).on(hls_next_events.FRAG_CHANGED,(({sn:e})=>{this.updatePlaySN(e)}))}_handleDCHave(e,t,s,r){this.criticalSeg&&this.criticalSeg.sn===t&&this.criticalSeg.level===s&&this._notifySynthesizer(e,this.criticalSeg.segId,t,s,r),this.config.live&&!this.criticalSeg&&queue_microtask_default()((()=>{this.checkPeers()}))}}const hlsjs_scheduler=HlsjsScheduler;class HlsjsP2pEngine extends Engine{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,this.config.isHlsV0="0"===e.constructor.version.split(".")[0],this.config.xhrSetup=e.config.xhrSetup,!0===this.config.httpStreamEnabled&&(e.config.streamEnabled=fetchSupported());const{channelIdMaker:s,signalId:r,browserInfo:n}=this.setup();e.config.segmentId=this.config.segmentId;const i=(t,o)=>{if(!o)return;const{config:a}=this,h=o.details,l=h.live;a.live=this.hlsjs.config.live=l,l||(a.trickleICE=!0),this.browserInfo={...n,live:l,abr:this.multiBitrate||void 0,type:"hls"},this.channel=`${s(e.url)}|${r}[${peer.VERSION}]`,this.setupElectron();const c=this.initLogger();c.info("use HlsjsP2pEngine"),this.logger=this.hlsjs.config.logger=c,c.info(`channel ${this.channel}`),l||(a.startSN=h.startSN,a.endSN=h.endSN,c.info(`startSN ${h.startSN} endSN ${h.endSN}`)),this.eventListened=!1,this._init(this.channel,this.browserInfo),e.off(this.HLSEvents.LEVEL_LOADED,i)};e.on(this.HLSEvents.LEVEL_LOADED,i);const o=(t,s)=>{const r=s.levels.length;this.multiBitrate=r>1,e.off(this.HLSEvents.MANIFEST_PARSED,o)};e.on(this.HLSEvents.MANIFEST_PARSED,o),e.on(this.HLSEvents.DESTROYING,(()=>{this.destroy()}))}async _init(e,t){const{logger:s,config:r}=this;if(!this.p2pEnabled)return;this.hlsjs.config.p2pEnabled=this.p2pEnabled,this.hlsjs.config.sharePlaylist=r.sharePlaylist;try{await this.initSegmentManager()}catch(e){return void s.error(e)}this.hlsjs.config.bufMgr=this.bufMgr,this.media=this.hlsjs.media;let n=new server(this,r.token,encodeURIComponent(e),r.announce||"",t);this.fetcher=n;const i=new hlsjs_scheduler(this,r);this.tracker=new tracker_client(this,n,i,r),i.bufferManager=this.bufMgr,this.hlsjs.config.fLoader=frag_loader,r.sharePlaylist&&(this.hlsjs.config.pLoader=playlist_loader),window.__p2p_loader__={scheduler:this.tracker.scheduler,fetcher:n,p2pBlackList:r.p2pBlackList,isHlsV0:r.isHlsV0},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,t){const s=t.frag;let{sn:r,level:n,segId:i}=s;if(!isBlockType(s.url,this.config.p2pBlackList)){if(this.logger.debug("loading frag "+r),this.bufMgr&&(this.bufMgr.loadingSN=r),!i){let e;s._byteRange&&(e="bytes="+s._byteRange[0]+"-"+s._byteRange[1]);let r=s.url;i=t.frag.segId=this.config.segmentId(String(n),s.sn,r,e)}this.emit(hls_next_events.FRAG_LOADING,{sn:r,segId:i,byHttp:s.loadByHTTP,level:n})}}_onFragLoaded(e,t){const{sn:s,segId:r,loaded:n,duration:i,level:o,fromPeerId:a,loadByP2P:h,url:l}=t.frag,{config:c,logger:d}=this;isBlockType(t.frag.url,c.p2pBlackList)||(this.emit(hls_next_events.FRAG_LOADED,{url:l,sn:s,level:o,segId:r,loaded:n,duration:i,byP2p:!!h,fromPeerId:a}),!this.rangeTested&&c.useHttpRange&&(performRangeRequest(t.frag.url,void 0,c.xhrSetup).then((()=>{c.httpRangeSupported=!0,d.info("http range is supported")})).catch((()=>{c.httpRangeSupported=!1,d.warn("http range is not supported")})),this.rangeTested=!0))}_onFragChanged(e,t){if(!isBlockType(t.frag.url,this.config.p2pBlackList)){this.logger.debug("frag changed: "+t.frag.sn);const{sn:e,duration:s}=t.frag;this.emit(hls_next_events.FRAG_CHANGED,{sn:e,duration:s})}}_onHlsError(e,t){if(!t)return;const{logger:s}=this;t.fatal?s.error(`${t.type} details ${t.details} reason ${t.reason}`):s.warn(`${t.type} details ${t.details} reason ${t.reason}`);const r=this.hlsjs.constructor.ErrorDetails;switch(t.details){case r.BUFFER_STALLED_ERROR:this.fetcher&&this.fetcher.errsBufStalled++;break;case r.INTERNAL_EXCEPTION:this.fetcher&&(this.fetcher.errsInternalExpt++,this.fetcher.exptMsg=`${t.err.message} event ${t.event} maxBufSize ${this.bufMgr.maxBufSize} cache ${this.bufMgr.name} sn ${this.bufMgr.loadingSN} ua ${navigator.userAgent}`),s.error(`INTERNAL_EXCEPTION event ${t.event} err ${t.err.message}`),this.emit(hls_next_events.EXCEPTION,err_code_default()(t.err,"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 hlsjs_p2pengine=HlsjsP2pEngine;function getMediaSource(){if("undefined"!=typeof window)return window.MediaSource||window.WebKitMediaSource}function isMSESupported(){const e=getMediaSource(),t=window.SourceBuffer||window.WebKitSourceBuffer,s=e&&"function"==typeof e.isTypeSupported&&e.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"'),r=!t||t.prototype&&"function"==typeof t.prototype.appendBuffer&&"function"==typeof t.prototype.remove;return!!s&&!!r}class ShadowP2pEngine extends Engine{static get name(){return"ShadowP2pEngine"}constructor(){super()}get currentLevel(){return 0}disableP2P(){}}const shadow_p2pengine=ShadowP2pEngine;class TsValidator{static validate(e){const t=TsValidator._syncOffset(e);if(t<0)return!0;let s=e.length;s-=(s+t)%188;for(let r=t;r<s;r+=188)if(71!==e[r])return!1;return!0}static _syncOffset(e){const t=Math.min(1e3,e.length-564);let s=0;for(;s<t;){if(71===e[s]&&71===e[s+188]&&71===e[s+376])return s;s++}return-1}}const ts_validator=TsValidator;class P2pEngine{static get Events(){return hls_next_events}static isSupported(){return engine_base.isSupported()&&(isMSESupported()||hls_sw_p2pengine.isServiceWorkerSupported())}static isServiceWorkerSupported(){return hls_sw_p2pengine.isServiceWorkerSupported()}static isMSESupported(){return isMSESupported()}static getBrowser(){return platform_default().getBrowser()}static get ServiceWorkerEngine(){return hls_sw_p2pengine}static get HlsjsEngine(){return hlsjs_p2pengine}constructor(e={}){const{hlsjsInstance:t}=e;if(delete e.hlsjsInstance,e.validateSegment||(e.validateSegment=function(e,t){return ts_validator.validate(t)}),window.__swP2pEngineHlsActive)return console.warn("P2pEngineHls is already activated"),void(this._realEngine=new shadow_p2pengine(e));e.videoElem&&(e.mediaElem=e.videoElem),"1"!==getQueryParam("_ios")&&!e.proxyOnly&&t&&isMSESupported()?this._realEngine=new hlsjs_p2pengine(t,e):this._realEngine=new hls_sw_p2pengine(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()}registerServiceWorker(){return"function"==typeof this._realEngine.registerServiceWorker?this._realEngine.registerServiceWorker():Promise.reject("Not supported by this engine")}unregisterServiceWorker(){return"function"==typeof this._realEngine.unregisterServiceWorker?this._realEngine.unregisterServiceWorker():Promise.reject("Not supported by this engine")}get version(){return engine_base.version}}P2pEngine.version=engine_base.version,P2pEngine.protocolVersion=peer.VERSION,window&&(window.P2PEngineHls=P2pEngine);const index_engine=P2pEngine})(),__webpack_exports__=__webpack_exports__.default,__webpack_exports__})()));
|
|
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()}(self,(()=>(()=>{var __webpack_modules__={204:e=>{"use strict";var t,s="object"==typeof Reflect?Reflect:null,r=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 n=Number.isNaN||function(e){return e!=e};function i(){i.init.call(this)}e.exports=i,e.exports.once=function(e,t){return new Promise((function(s,r){function n(s){e.removeListener(t,i),r(s)}function i(){"function"==typeof e.removeListener&&e.removeListener("error",n),s([].slice.call(arguments))}p(e,t,i,{once:!0}),"error"!==t&&function(e,t,s){"function"==typeof e.on&&p(e,"error",t,s)}(e,n,{once:!0})}))},i.EventEmitter=i,i.prototype._events=void 0,i.prototype._eventsCount=0,i.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?i.defaultMaxListeners:e._maxListeners}function l(e,t,s,r){var n,i,o,l;if(a(s),void 0===(i=e._events)?(i=e._events=Object.create(null),e._eventsCount=0):(void 0!==i.newListener&&(e.emit("newListener",t,s.listener?s.listener:s),i=e._events),o=i[t]),void 0===o)o=i[t]=s,++e._eventsCount;else if("function"==typeof o?o=i[t]=r?[s,o]:[o,s]:r?o.unshift(s):o.push(s),(n=h(e))>0&&o.length>n&&!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 r={fired:!1,wrapFn:void 0,target:e,type:t,listener:s},n=c.bind(r);return n.listener=s,r.wrapFn=n,n}function u(e,t,s){var r=e._events;if(void 0===r)return[];var n=r[t];return void 0===n?[]:"function"==typeof n?s?[n.listener||n]:[n]: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}(n):f(n,n.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),r=0;r<t;++r)s[r]=e[r];return s}function p(e,t,s,r){if("function"==typeof e.on)r.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 n(i){r.once&&e.removeEventListener(t,n),s(i)}))}}Object.defineProperty(i,"defaultMaxListeners",{enumerable:!0,get:function(){return o},set:function(e){if("number"!=typeof e||e<0||n(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");o=e}}),i.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},i.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||n(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},i.prototype.getMaxListeners=function(){return h(this)},i.prototype.emit=function(e){for(var t=[],s=1;s<arguments.length;s++)t.push(arguments[s]);var n="error"===e,i=this._events;if(void 0!==i)n=n&&void 0===i.error;else if(!n)return!1;if(n){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=i[e];if(void 0===h)return!1;if("function"==typeof h)r(h,this,t);else{var l=h.length,c=f(h,l);for(s=0;s<l;++s)r(c[s],this,t)}return!0},i.prototype.addListener=function(e,t){return l(this,e,t,!1)},i.prototype.on=i.prototype.addListener,i.prototype.prependListener=function(e,t){return l(this,e,t,!0)},i.prototype.once=function(e,t){return a(t),this.on(e,d(this,e,t)),this},i.prototype.prependOnceListener=function(e,t){return a(t),this.prependListener(e,d(this,e,t)),this},i.prototype.removeListener=function(e,t){var s,r,n,i,o;if(a(t),void 0===(r=this._events))return this;if(void 0===(s=r[e]))return this;if(s===t||s.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete r[e],r.removeListener&&this.emit("removeListener",e,s.listener||t));else if("function"!=typeof s){for(n=-1,i=s.length-1;i>=0;i--)if(s[i]===t||s[i].listener===t){o=s[i].listener,n=i;break}if(n<0)return this;0===n?s.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(s,n),1===s.length&&(r[e]=s[0]),void 0!==r.removeListener&&this.emit("removeListener",e,o||t)}return this},i.prototype.off=i.prototype.removeListener,i.prototype.removeAllListeners=function(e){var t,s,r;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 n,i=Object.keys(s);for(r=0;r<i.length;++r)"removeListener"!==(n=i[r])&&this.removeAllListeners(n);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(r=t.length-1;r>=0;r--)this.removeListener(e,t[r]);return this},i.prototype.listeners=function(e){return u(this,e,!0)},i.prototype.rawListeners=function(e){return u(this,e,!1)},i.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):g.call(e,t)},i.prototype.listenerCount=g,i.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}},622:function(e){var t,s,r,n,i;t=/^(?=((?:[a-zA-Z0-9+\-.]+:)?))\1(?=((?:\/\/[^\/?#]*)?))\2(?=((?:(?:[^?#\/]*\/)*[^;?#\/]*)?))\3((?:;[^?#]*)?)(\?[^#]*)?(#[^]*)?$/,s=/^(?=([^\/?#]*))\1([^]*)$/,r=/(?:\/|^)\.(?=\/)/g,n=/(?:\/|^)\.\.\/(?!\.\.\/)[^\/]*(?=\/)/g,i={buildAbsoluteURL:function(e,t,r){if(r=r||{},e=e.trim(),!(t=t.trim())){if(!r.alwaysNormalize)return e;var n=i.parseURL(e);if(!n)throw new Error("Error trying to parse base URL.");return n.path=i.normalizePath(n.path),i.buildURLFromParts(n)}var o=i.parseURL(t);if(!o)throw new Error("Error trying to parse relative URL.");if(o.scheme)return r.alwaysNormalize?(o.path=i.normalizePath(o.path),i.buildURLFromParts(o)):t;var a=i.parseURL(e);if(!a)throw new Error("Error trying to parse base URL.");if(!a.netLoc&&a.path&&"/"!==a.path[0]){var h=s.exec(a.path);a.netLoc=h[1],a.path=h[2]}a.netLoc&&!a.path&&(a.path="/");var l={scheme:a.scheme,netLoc:o.netLoc,path:null,params:o.params,query:o.query,fragment:o.fragment};if(!o.netLoc&&(l.netLoc=a.netLoc,"/"!==o.path[0]))if(o.path){var c=a.path,d=c.substring(0,c.lastIndexOf("/")+1)+o.path;l.path=i.normalizePath(d)}else l.path=a.path,o.params||(l.params=a.params,o.query||(l.query=a.query));return null===l.path&&(l.path=r.alwaysNormalize?i.normalizePath(o.path):o.path),i.buildURLFromParts(l)},parseURL:function(e){var s=t.exec(e);return s?{scheme:s[1]||"",netLoc:s[2]||"",path:s[3]||"",params:s[4]||"",query:s[5]||"",fragment:s[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=i},47:(e,t)=>{"use strict";t.l=n;var s=2147483647;function r(e){if(e>s)throw new RangeError('The value "'+e+'" is invalid for option "size"');var t=new Uint8Array(e);return t.__proto__=n.prototype,t}function n(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 i(e,t,s)}function i(e,t,s){if("string"==typeof e)return function(e,t){"string"==typeof t&&""!==t||(t="utf8");if(!n.isEncoding(t))throw new TypeError("Unknown encoding: "+t);var s=0|c(e,t),i=r(s),o=i.write(e,t);o!==s&&(i=i.slice(0,o));return i}(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(m(e,ArrayBuffer)||e&&m(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 r;r=void 0===t&&void 0===s?new Uint8Array(e):void 0===s?new Uint8Array(e,t):new Uint8Array(e,t,s);return r.__proto__=n.prototype,r}(e,t,s);if("number"==typeof e)throw new TypeError('The "value" argument must not be of type number. Received type number');var i=e.valueOf&&e.valueOf();if(null!=i&&i!==e)return n.from(i,t,s);var o=function(e){if(n.isBuffer(e)){var t=0|l(e.length),s=r(t);return 0===s.length||e.copy(s,0,0,t),s}if(void 0!==e.length)return"number"!=typeof e.length||v(e.length)?r(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 n.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),r(e<0?0:0|l(e))}function h(e){for(var t=e.length<0?0:0|l(e.length),s=r(t),n=0;n<t;n+=1)s[n]=255&e[n];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(n.isBuffer(e))return e.length;if(ArrayBuffer.isView(e)||m(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,r=arguments.length>2&&!0===arguments[2];if(!r&&0===s)return 0;for(var i=!1;;)switch(t){case"ascii":case"latin1":case"binary":return s;case"utf8":case"utf-8":return _(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*s;case"hex":return s>>>1;default:if(i)return r?-1:_(e).length;t=(""+t).toLowerCase(),i=!0}}function d(e,t,s,r){s=Number(s)||0;const n=e.length-s;r?(r=Number(r))>n&&(r=n):r=n;const i=t.length;let o;for(r>i/2&&(r=i/2),o=0;o<r;++o){const r=parseInt(t.substr(2*o,2),16);if(v(r))return o;e[s+o]=r}return o}function u(e,t,s,r){return p(_(t,e.length-s),e,s,r)}function g(e,t,s,r){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,r)}function f(e,t,s,r){return p(function(e,t){let s,r,n;const i=[];for(let o=0;o<e.length&&!((t-=2)<0);++o)s=e.charCodeAt(o),r=s>>8,n=s%256,i.push(n),i.push(r);return i}(t,e.length-s),e,s,r)}function p(e,t,s,r){let n;for(n=0;n<r&&!(n+s>=t.length||n>=e.length);++n)t[n+s]=e[n];return n}function _(e,t){var s;t=t||1/0;for(var r=e.length,n=null,i=[],o=0;o<r;++o){if((s=e.charCodeAt(o))>55295&&s<57344){if(!n){if(s>56319){(t-=3)>-1&&i.push(239,191,189);continue}if(o+1===r){(t-=3)>-1&&i.push(239,191,189);continue}n=s;continue}if(s<56320){(t-=3)>-1&&i.push(239,191,189),n=s;continue}s=65536+(n-55296<<10|s-56320)}else n&&(t-=3)>-1&&i.push(239,191,189);if(n=null,s<128){if((t-=1)<0)break;i.push(s)}else if(s<2048){if((t-=2)<0)break;i.push(s>>6|192,63&s|128)}else if(s<65536){if((t-=3)<0)break;i.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;i.push(s>>18|240,s>>12&63|128,s>>6&63|128,63&s|128)}}return i}function m(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}function v(e){return e!=e}"undefined"!=typeof Symbol&&null!=Symbol.species&&n[Symbol.species]===n&&Object.defineProperty(n,Symbol.species,{value:null,configurable:!0,enumerable:!1,writable:!1}),n.from=function(e,t,s){return i(e,t,s)},n.prototype.__proto__=Uint8Array.prototype,n.__proto__=Uint8Array,n.alloc=function(e,t,s){return function(e,t,s){return o(e),e<=0?r(e):void 0!==t?"string"==typeof s?r(e).fill(t,s):r(e).fill(t):r(e)}(e,t,s)},n.allocUnsafe=function(e){return a(e)},n.isBuffer=function(e){return null!=e&&!0===e._isBuffer&&e!==n.prototype},n.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}},n.concat=function(e,t){if(!Array.isArray(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return n.alloc(0);var s;if(void 0===t)for(t=0,s=0;s<e.length;++s)t+=e[s].length;var r=n.allocUnsafe(t),i=0;for(s=0;s<e.length;++s){var o=e[s];if(m(o,Uint8Array)&&(o=n.from(o)),!n.isBuffer(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(r,i),i+=o.length}return r},n.byteLength=c,n.prototype._isBuffer=!0,n.prototype.copy=function(e,t,s,r){if(!n.isBuffer(e))throw new TypeError("argument should be a Buffer");if(s||(s=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r<s&&(r=s),r===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(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t<r-s&&(r=e.length-t+s);var i=r-s;if(this===e&&"function"==typeof Uint8Array.prototype.copyWithin)this.copyWithin(t,s,r);else if(this===e&&s<t&&t<r)for(var o=i-1;o>=0;--o)e[o+t]=this[o+s];else Uint8Array.prototype.set.call(e,this.subarray(s,r),t);return i},n.prototype.write=function(e,t,s,r){if(void 0===t)r="utf8",s=this.length,t=0;else if(void 0===s&&"string"==typeof t)r=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===r&&(r="utf8")):(r=s,s=void 0)}const n=this.length-t;if((void 0===s||s>n)&&(s=n),e.length>0&&(s<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");let i=!1;for(;;)switch(r){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(i)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),i=!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,r){if(!e||"string"==typeof e)throw new TypeError("Please pass an Error to err-code");r||(r={}),"object"==typeof s&&(r=s,s=void 0),null!=s&&(r.code=s);try{return t(e,r)}catch(s){r.message=e.message,r.stack=e.stack;const n=function(){};return n.prototype=Object.create(Object.getPrototypeOf(e)),t(new n,r)}}},485:function(e,t,s){var r;!function(n){"use strict";function i(e,t){var s=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(s>>16)<<16|65535&s}function o(e,t,s,r,n,o){return i((a=i(i(t,e),i(r,o)))<<(h=n)|a>>>32-h,s);var a,h}function a(e,t,s,r,n,i,a){return o(t&s|~t&r,e,t,n,i,a)}function h(e,t,s,r,n,i,a){return o(t&r|s&~r,e,t,n,i,a)}function l(e,t,s,r,n,i,a){return o(t^s^r,e,t,n,i,a)}function c(e,t,s,r,n,i,a){return o(s^(t|~r),e,t,n,i,a)}function d(e,t){var s,r,n,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)r=u,n=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=i(u,r),g=i(g,n),f=i(f,o),p=i(p,d);return[u,g,f,p]}function u(e){var t,s="",r=32*e.length;for(t=0;t<r;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 r=8*e.length;for(t=0;t<r;t+=8)s[t>>5]|=(255&e.charCodeAt(t/8))<<t%32;return s}function f(e){var t,s,r="0123456789abcdef",n="";for(s=0;s<e.length;s+=1)t=e.charCodeAt(s),n+=r.charAt(t>>>4&15)+r.charAt(15&t);return n}function p(e){return unescape(encodeURIComponent(e))}function _(e){return function(e){return u(d(g(e),8*e.length))}(p(e))}function m(e,t){return function(e,t){var s,r,n=g(e),i=[],o=[];for(i[15]=o[15]=void 0,n.length>16&&(n=d(n,8*e.length)),s=0;s<16;s+=1)i[s]=909522486^n[s],o[s]=1549556828^n[s];return r=d(i.concat(g(t)),512+8*t.length),u(d(o.concat(r),640))}(p(e),p(t))}function v(e,t,s){return t?s?m(t,e):f(m(t,e)):s?_(e):f(_(e))}void 0===(r=function(){return v}.call(t,s,t,e))||(e.exports=r)}()},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(r())||[,""])[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(r())},isPC:function(){return!i(n("os "))&&!i(n("android[/ ]"))},isIOS:function(){return i(n("os "))},isAndroid:function(){return i(n("android[/ ]"))},isIOSSafari:function(){return this.isIOS()&&this.isSafari()},isElectron:function(){return/electron/i.test(r())},isMobile:function(){return s.isAndroid()||s.isIOS()},isSafari:function(){return/^((?!chrome|android).)*safari/i.test(r())},isFirefox:function(){return/firefox/i.test(r())},isChrome:function(){return/chrome/i.test(r())},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 r(){return navigator.userAgent.toLowerCase()}function n(e){return""+(new RegExp(e+"(\\d+((\\.|_)\\d+)*)").exec(r())||[,0])[1]||void 0}function i(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)))}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var s=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e].call(s.exports,s,s.exports,__webpack_require__),s.exports}__webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(e,t)=>{for(var s in t)__webpack_require__.o(t,s)&&!__webpack_require__.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var __webpack_exports__={};return(()=>{"use strict";__webpack_require__.d(__webpack_exports__,{default:()=>index_engine});const events={DC_SIGNAL:"SIGNAL",DC_OPEN:"OPEN",DC_REQUEST:"REQUEST",DC_PIECE_NOT_FOUND:"PIECE_NOT_FOUND",DC_PIECE_ABORT:"PIECE_ABORT",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"},hls_next_events={...events,SCH_DCHAVE:"SCH_DCHAVE",REQUESTING_MAP_HAVE:"REQUESTING_MAP_HAVE",SW_PLAYLIST:"SW_PLAYLIST",SW_GET_PLAYLIST:"SW_GET_PLAYLIST",SW_MEDIA:"SW_MEDIA",SW_GET_MEDIA:"SW_GET_MEDIA",LEVEL_LOADED:"LEVEL_LOADED",MANIFEST_PARSED:"MANIFEST_PARSED",FRAG_LOADED:"FRAG_LOADED",SYN_OUTPUT:"SYN_OUTPUT",SYN_ERROR:"SYN_ERROR",SYN_PARTIAL:"SYN_PARTIAL"};var _events_3_3_0_events_events=__webpack_require__(204),events_default=__webpack_require__.n(_events_3_3_0_events_events),utils_buffer=__webpack_require__(47),queue_microtask=__webpack_require__(77),queue_microtask_default=__webpack_require__.n(queue_microtask);const MAX_BUFFERED_AMOUNT=65536,ICECOMPLETE_TIMEOUT=5e3,CHANNEL_CLOSING_TIMEOUT=5e3;function filterTrickle(e){return e.replace(/a=ice-options:trickle\s\n/g,"")}function warn(e){console.warn(e)}class Peer extends(events_default()){constructor(e){super(),this.channelName=e.initiator?e.channelName:null,this.initiator=e.initiator||!1,this.channelConfig=e.channelConfig||Peer.channelConfig,this.channelNegotiated=this.channelConfig.negotiated,this.config=Object.assign({},Peer.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||ICECOMPLETE_TIMEOUT,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:getBrowserRTC(),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._remoteTracks=[],this._remoteStreams=[],this._chunk=null,this._cb=null,this._interval=null;try{this._pc=new this._wrtc.RTCPeerConnection(this.config)}catch(e){return void queue_microtask_default()((()=>this.destroy(e)))}this._isReactNativeWebrtc="number"==typeof this._pc._peerConnectionId,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)throw new Error("cannot signal after peer is destroyed");if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e={}}e.renegotiate&&this.initiator&&this._needsNegotiation(),e.transceiverRequest&&this.initiator&&this.addTransceiver(e.transceiverRequest.kind,e.transceiverRequest.init),e.candidate&&(this._pc.remoteDescription&&this._pc.remoteDescription.type?this._addIceCandidate(e.candidate):this._pendingCandidates.push(e.candidate)),e.sdp&&this._pc.setRemoteDescription(new this._wrtc.RTCSessionDescription(e)).then((()=>{this.destroyed||(this._pendingCandidates.forEach((e=>{this._addIceCandidate(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=>{!t.address||t.address.endsWith(".local")?warn("Ignoring unsupported ICE candidate."):this.destroy(e)}))}send(e){this._channel.send(e)}addTransceiver(e,t){if(this.initiator)try{this._pc.addTransceiver(e,t),this._needsNegotiation()}catch(e){this.destroy(e)}else this.emit("signal",{type:"transceiverRequest",transceiverRequest:{kind:e,init:t}})}_needsNegotiation(){this._batchedNegotiation||(this._batchedNegotiation=!0,queue_microtask_default()((()=>{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,t){this.destroyed||this.destroying||(this.destroying=!0,queue_microtask_default()((()=>{if(this.destroyed=!0,this.destroying=!1,this._connected=!1,this._pcReady=!1,this._channelReady=!1,this._remoteTracks=null,this._remoteStreams=null,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.ontrack=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=MAX_BUFFERED_AMOUNT),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}),CHANNEL_CLOSING_TIMEOUT)}_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=filterTrickle(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)}))}_requestMissingTransceivers(){this._pc.getTransceivers&&this._pc.getTransceivers().forEach((e=>{e.mid||!e.sender.track||e.requested||(e.requested=!0,this.addTransceiver(e.sender.track.kind))}))}_createAnswer(){this.destroyed||this._pc.createAnswer(this.answerOptions).then((e=>{if(this.destroyed)return;this.trickle||this.allowHalfTrickle||(e.sdp=filterTrickle(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.initiator||this._requestMissingTransceivers()};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._isReactNativeWebrtc?this._pc.getStats().then((s=>{const r=[];s.forEach((e=>{r.push(t(e))})),e(null,r)}),(t=>e(t))):this._pc.getStats.length>0?this._pc.getStats((s=>{if(this.destroyed)return;const r=[];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,r.push(t(s))})),e(null,r)}),(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 r={},n={},i={};let o=!1;s.forEach((e=>{"remotecandidate"!==e.type&&"remote-candidate"!==e.type||(r[e.id]=e),"localcandidate"!==e.type&&"local-candidate"!==e.type||(n[e.id]=e),"candidatepair"!==e.type&&"candidate-pair"!==e.type||(i[e.id]=e)}));const a=e=>{o=!0;let t=n[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=r[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(i[e.selectedCandidatePairId]),("googCandidatePair"===e.type&&"true"===e.googActiveConnection||("candidatepair"===e.type||"candidate-pair"===e.type)&&e.selected)&&a(e)})),o||Object.keys(i).length&&!Object.keys(n).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>MAX_BUFFERED_AMOUNT||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=utils_buffer.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()}}Peer.config={iceServers:[{urls:["stun:stun.l.google.com:19302","stun:global.stun.twilio.com:3478"]}],sdpSemantics:"unified-plan"},Peer.channelConfig={};const peer_channel=Peer;class Segment{constructor(e,t,s,r,n=0){this.sn=e,this.segId=t,this.data=s,this.fromPeerId=r,this.level=n||0}static fromSegment(e){return new Segment(e.sn,e.segId,e.data,e.fromPeerId,e.level)}get size(){return this.data.byteLength}get isSequential(){return this.sn>=0}}var platform=__webpack_require__(422),platform_default=__webpack_require__.n(platform);const delimiter="|",arrayDelimiter=",",candTypeMap={h:"host",s:"srflx",p:"prflx",r:"relay"},sdpType2Char=(e,t)=>{let s;switch(e){case"candidate":s="c";break;case"offer":s=t?"q":"o";break;case"answer":s=t?"s":"a"}return s},char2SdpType=e=>{let t={};switch(e){case"o":t={type:"offer"};break;case"q":t={type:"offer",trickle:!0};break;case"a":t={type:"answer"};break;case"s":t={type:"answer",trickle:!0};break;case"c":t={type:"candidate",trickle:!0}}return t},charOffset=0,bytesToStr=e=>"number"==typeof e?bytesToStr([e]):String.fromCharCode(...e.map((e=>e+charOffset))),strToBytes=e=>e.split("").map((e=>e.charCodeAt(0)-charOffset));function parseCand(e){const[,t,s,r,n,i,o,a,h,l,c,d,u,g,f]=/(\S*) (\d*) (\S*) (\d*) (\S*) (\d*) typ (\S*)(?: raddr (\S*) rport (\d*))?(?: tcptype (\S*))?(?: generation (\d*))?(?: ufrag (\S*))?(?: network-id (\d*))?(?: network-cost (\d*))?/.exec(e);return{foundation:t,component:s,transport:r,priority:n,ip:i,port:o,type:a,raddr:h,rport:l,tcptype:c,generation:d,networkId:g,networkCost:f,ufrag:u}}function pack({type:e,sdp:t,candidate:s}){return t&&t.startsWith("v=0")?packSdp(e,t):"candidate"===e&&s?packCandidate(s.candidate):null}function packCandidate(e){const t=e.indexOf(":");if(t<=0)return null;let s=packCandItem(e.slice(t+1).trim());return s?sdpType2Char("candidate")+s.cand:null}function packSdp(e,t){let s,r,n,i=[],o=!1,a=!1;for(const e of t.split("\r\n")){const t=e.indexOf(":");if(t<=0)continue;if("a=ice-options:trickle"===e){a=!0;continue}const[h,l]=[e.slice(0,t),e.slice(t+1).trim()];switch(h){case"a=ice-ufrag":s=l;break;case"a=ice-pwd":r=l;break;case"a=fingerprint":n=bytesToStr(l.substr("sha-256".length).trim().split(":").map((e=>parseInt(e,16))));break;case"a=candidate":let e=packCandItem(l,o);if(!e)continue;if(e.local){if(o)continue;o=!0}i.push(e.cand)}}return sdpType2Char(e,a)+n+(i.length>0?i.join(arrayDelimiter):"")+(a?"":delimiter)+s+delimiter+r}function packCandItem(e){let t=!1;const s=parseCand(e);if("TCP"===s.transport)return null;s.ip.endsWith(".local")&&(t=!0);let r=s.type.charAt(0);const n=s.ip.split(".");if(4===n.length){const e=n.reduce((function(e,t){return(e<<8)+parseInt(t,10)}));r=`${r}${s.foundation} ${e}:${parseInt(s.port)}`}else r=`${r}${s.foundation} ${s.ip} ${s.port}`;return{cand:r,local:t}}function unpack(e,t){const s=char2SdpType(e.substr(0,1));return s?"candidate"===s.type?unpackCand(e):unpackSdp(s.type,t,e,s.trickle):null}function unpackCand(e){let t=unpackCandItem(e.substr(1),100);return t?{type:"candidate",candidate:{candidate:`candidate:${t}`,sdpMLineIndex:0,sdpMid:"0"}}:null}function unpackSdp(e,t,s,r){const n=strToBytes(s.slice(1,33)).map((e=>("0"+e.toString(16)).slice(-2))),i=s.substr(33);let o,a,h;r?[a,h]=i.split(delimiter):[o,a,h]=i.split(delimiter);const l=r?[]:o.split(arrayDelimiter),c=["v=0",`o=- ${t} 2 IN IP4 127.0.0.1`,"s=-","t=0 0","a=group:BUNDLE 0","a=msid-semantic: WMS","m=application 9 UDP/DTLS/SCTP webrtc-datachannel","c=IN IP4 0.0.0.0","a=mid:0","a=sctp-port:5000","a=setup:"+("answer"===e?"active":"actpass"),`a=ice-ufrag:${a}`,`a=ice-pwd:${h}`,`a=fingerprint:sha-256 ${n.join(":").toUpperCase()}`];r&&c.push("a=ice-options:trickle");let d=100;for(const e of l){let t=unpackCandItem(e,d);t&&(d--,c.push(`a=candidate:${t}`))}return{type:e,sdp:c.join("\r\n")+"\r\n"}}function unpackCandItem(e,t){let s,r,n;const i=candTypeMap[e.substr(0,1)],o=e.substr(1).split(" ");if(2===o.length){n=o[0];const e=o[1].split(":");s=[e[0]>>24&255,e[0]>>16&255,e[0]>>8&255,255&e[0]].join("."),r=e[1]}else[n,s,r]=o;return`${[n,1,"udp",t,s,r,"typ",i].join(" ")}`}const DC_TOLERANCE=2,DEFAULT_PACKET_SIZE=64e3,ALPHA=.6,SIGNAL_PACK_VER=1;class peer_Peer extends(events_default()){static get defaultPacketSize(){return DEFAULT_PACKET_SIZE}static get VERSION(){return"8"}constructor(e,t,s,r,n,i,o={}){super(),this.engine=e,this.channel=e.fetcher.channelId,this.logger=e.logger,this.config=n,this.isInitiator=r,this.options=o,this.typeExpected=i,this.remotePeerId=s,this.intermediator=o.intermediator||null,this.channelId=r?`${t}-${s}`:`${s}-${t}`,this.cpr=0,this.platform="unknown",this.mobile=!1,this.mobileWeb=!1,this.connected=!1,this.msgQueue=[],this.miss=0,this.notifySet=new Set,this.bufArr=[],this.packetSize=DEFAULT_PACKET_SIZE,this.connTimeout=setTimeout((()=>{this.logger.warn(`dc ${this.channelId} connection timeout`),this.emit(events.DC_ERROR,!0)}),25e3),this.sendReqQueue=[],this.downloading=!1,this.uploading=!1,this.choked=!1,this.downloadListeners=[],this.pieceMsg={},this.timeSendRequest=0,this.timeReceivePiece=0,this.timeSendPiece=0,this.weight=0,this.peersConnected=1,this.timeJoin=getCurrentTs(),this.uploadSpeed=0,this.gotPeers=!1,this.currentLevel=0,this.currentPos=0;let a={};if(this.options.stuns.length>0){const e=[];this.options.stuns.forEach((t=>{this.logger.info(`use stun ${t}`),e.push({urls:t})})),a.iceServers=e}this.config.webRTCConfig&&(a={...this.config.webRTCConfig,...a}),this.playlistMap=new Map,this._datachannel=new peer_channel({initiator:r,channelName:this.channelId,trickle:o.trickle||!1,config:a}),this._init(this._datachannel),this.dataExchangeTs=this.timeJoin,this.gotStatsTs=this.timeJoin,this.startSN=Number.MAX_SAFE_INTEGER,this.endSN=-1}get isAvailable(){return this.downloadNum<2&&!this.choked}get isAvailableUrgently(){return!this.downloading&&!this.choked}addDownloadListener(e){this.downloadListeners.push({handler:e})}addStreamListener(e,t){this.addDownloadListener(t)}_init(e){e.on("error",(e=>{this.emit(events.DC_ERROR,!0)})),e.on("signal",(e=>{if(this.cpr===SIGNAL_PACK_VER){const t=pack(e);t?e=t:this.logger.error("signal pack error")}this.emit(events.DC_SIGNAL,e)}));e.on("connect",(()=>{for(this.logger.info(`datachannel CONNECTED to ${this.remotePeerId} from ${this.intermediator?"peer":"server"}`),this.connected=!0,clearTimeout(this.connTimeout),this.emit(events.DC_OPEN);this.msgQueue.length>0;){let e=this.msgQueue.shift();this.emit(e.event,e)}})),e.on("data",(e=>{const{logger:t}=this;if("string"==typeof e){let s=JSON.parse(e);if(!this.connected)return void this.msgQueue.push(s);let r,n=s.event;switch(r=n!==events.DC_PLAYLIST&&n!==events.DC_PEER_SIGNAL?`string: ${e}`:`event: ${n}`,t.debug(`datachannel receive ${r} from ${this.remotePeerId}`),n){case events.DC_HAVE:if(this.emit(s.event,s),!s.sn)return;this.config.live||(s.sn<this.startSN&&(this.startSN=s.sn),s.sn>this.endSN&&(this.endSN=s.sn));break;case events.DC_PIECE:this.downloading=!0,this.dataExchangeTs=getCurrentTs(),this.timeReceivePiece=performance.now(),this.pieceMsg=s,this._prepareForBinary(s.attachments,s.seg_id,s.sn,s.size),this.emit(s.event,s);break;case events.DC_PIECE_NOT_FOUND:this._sendNextReq()||(this.downloading=!1),this.emit(s.event,s);break;case events.DC_REQUEST:this._handleRequestMsg(s);break;case events.DC_PIECE_ACK:this.dataExchangeTs=getCurrentTs(),this._handlePieceAck(s),this.emit(s.event,s);break;case events.DC_STATS:this._handleStats(s);break;case events.DC_PLAYLIST:this.config.sharePlaylist&&this._handlePlaylist(s);break;case events.DC_METADATA:this._handleMetadata(s);break;case events.DC_PIECE_ABORT:this.downloading&&(this._notifyDownloadListenersAbort("aborted by upstream peer"),this.emit(events.DC_PIECE_ABORT,s));break;case events.DC_CHOKE:t.info(`choke peer ${this.remotePeerId}`),this.choked=!0;break;case events.DC_UNCHOKE:t.info(`unchoke peer ${this.remotePeerId}`),this.choked=!1;break;case events.DC_CLOSE:this.emit(s.event,s.fatal||!1);break;default:this.emit(s.event,s)}}else{if(!this.downloading)return void t.error(`peer is not downloading, data size ${e.byteLength} pieceMsg ${JSON.stringify(this.pieceMsg)}`);this._handleBinaryMsg(e)}})),e.once("close",(()=>{this.emit(events.DC_CLOSE,!1)})),e.on("iceStateChange",((e,t)=>{"disconnected"===e&&(this.logger.warn(`${this.remotePeerId} disconnected`),this.connected=!1)}))}sendJson(e){e.event!==events.DC_PLAYLIST&&e.event!==events.DC_PEER_SIGNAL?this.logger.debug(`dc bufferSize ${this._datachannel.bufferSize} send ${JSON.stringify(e)} to ${this.remotePeerId}`):this.logger.debug(`dc send event ${e.event} to ${this.remotePeerId}`);const t=JSON.stringify(e);return t.length>DEFAULT_PACKET_SIZE?(this.logger.error("string to send is too large"),!1):this.send(t)}send(e){if(this._datachannel&&this._datachannel.connected)try{return this._datachannel.send(e),!0}catch(e){this.logger.warn(`datachannel ${this.channelId} send data failed, close it`),this.emit(events.DC_ERROR,!1)}return!1}sendMsgHave(e,t,s={}){const r=s.reverse||void 0;delete s.reverse,this.sendJson({event:r?events.DC_HAVE_REVERSE:events.DC_HAVE,sn:e,seg_id:t,...s})}sendPieceNotFound(e,t,s={}){this.uploading=!1,this.sendJson({event:events.DC_PIECE_NOT_FOUND,seg_id:t,sn:e,...s})}sendPeers(e){this.sendJson({event:events.DC_PEERS,peers:e})}sendPeersRequest(){this.sendJson({event:events.DC_GET_PEERS})}sendMsgStats(e,t={}){const s={event:events.DC_STATS,total_conns:e,...t};this.sendJson(s)}sendMsgPlaylist(e,t,s){if(this.playlistMap.has(e)){if(this.playlistMap.get(e).seq>=s)return}const r={event:events.DC_PLAYLIST,url:e,data:t,seq:s};this.sendJson(r)}sendMsgSignal(e,t,s){return this.sendJson({event:events.DC_PEER_SIGNAL,action:"signal",to_peer_id:e,from_peer_id:t,data:s})}sendMsgSignalReject(e,t,s,r=!1){return this.sendJson({event:events.DC_PEER_SIGNAL,action:"reject",to_peer_id:e,from_peer_id:t,reason:s,fatal:r})}sendMetaData(e,t,s=0){this.isInitiator&&(this.timeSendRequest=performance.now()),this.sendJson({event:events.DC_METADATA,field:e,platform:events.DC_PLAT_WEB,mobile:!!platform_default().isMobile(),channel:this.channel,version:"2.2.11",sequential:t,peers:s})}sendPartialBuffer(e,t,s={}){this.sendMsgPiece(e,s);for(let e=0;e<t.length;e++)this.send(t[e])}sendMsgPiece(e,t={}){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 s={...e,ext:t};this.sendJson(s)}sendBuffer(e,t,s,r={}){const n=r.reverse||void 0;delete r.reverse;let i=s.byteLength,o=0,a=0;i%this.packetSize==0?a=i/this.packetSize:(a=Math.floor(i/this.packetSize)+1,o=i%this.packetSize);let h={event:events.DC_PIECE,attachments:a,seg_id:t,sn:e,level:r.level,size:i,reverse:n};delete r.level,this.sendMsgPiece(h,r);const l=dividePayload(s,this.packetSize,a,o);this._sendBufferArray(l,n),this.uploading=!1,this.timeSendPiece=performance.now()}get downloadNum(){return this.downloading?this.sendReqQueue.length+1:0}requestDataById(e,t,s=!1,r={}){const n={event:events.DC_REQUEST,seg_id:e,sn:t,...r,urgent:s};this.downloading?(this.logger.info(`${this.remotePeerId} add req ${e} in queue`),s?this.sendReqQueue.unshift(n):this.sendReqQueue.push(n)):this._realRequestData(n)}requestDataBySN(e,t=!1,s={}){const r={event:events.DC_REQUEST,sn:e,...s,urgent:t};this.downloading?(this.logger.info(`add req ${e} in queue`),t?this.sendReqQueue.unshift(r):this.sendReqQueue.push(r)):this._realRequestData(r)}_sendBufferArray(e,t=!1){if(t)for(let t=e.length-1;t>=0;t--)this.send(e[t]);else for(let t=0;t<e.length;t++)this.send(e[t])}_realRequestData(e){this.sendJson(e),this.timeSendRequest=performance.now(),this.downloading=!0}shouldWaitForRemain(e){return 0!==this.bufArr.length&&(0!==this.timeReceivePiece&&this.currentLoadSpeed()>=this.minRequiredSpeed(e))}close(e){this.emit(events.DC_CLOSE,e)}receiveSignal(e){e.type||e.candidate||(this.cpr=SIGNAL_PACK_VER,e=unpack(e,this.cpr+"")),e&&this._datachannel.signal(e)}_notifyDownloadListenersAbort(e){for(let t of this.downloadListeners){const{handler:s}=t;s(this.bufSN,this.segId,!0,e)}this.downloadListeners=[]}destroy(e=!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 t={event:events.DC_CLOSE,fatal:e};this.sendJson(t),this._datachannel.removeAllListeners(),this.removeAllListeners(),this._datachannel.destroy(),this.engine=null}_handleBinaryMsg(e){const{attachments:t,level:s,reverse:r}=this.pieceMsg;this.bufArr.push(e),this.remainAttachments--;let n=r?this.remainAttachments+1:t-this.remainAttachments;const i=0===this.remainAttachments;if(this.emit(events.DC_PIECE_DATA,this.bufSN,this.segId,e,n,i,this.pieceMsg),this.downloadListeners.length>0)for(let t of this.downloadListeners){const{handler:s}=t;s(this.bufSN,this.segId,!1,e,i)}if(i){if(this.downloadListeners=[],this.timeSendRequest>0){const e=this.expectedSize/(performance.now()-this.timeSendRequest);this.weight=this.weight>0?ALPHA*this.weight+(1-ALPHA)*e:e}this.sendJson({event:events.DC_PIECE_ACK,sn:this.bufSN,seg_id:this.segId,level:s,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:r}=e;this.playlistMap.set(t,{data:s,seq:r})}getLatestPlaylist(e,t){if(!this.playlistMap.has(e))return null;const s=this.playlistMap.get(e);return s.seq<=t?null:s}_handleMetadata(e){const{logger:t}=this;if(this.isInitiator){const e=performance.now()-this.timeSendRequest;e>0&&(this.weight=1e5/e,t.info(`handle Metadata from ${this.remotePeerId} initial weight ${this.weight}`)),this.timeSendRequest=0}const s=e.channel;if(!s)return t.error(`peer channel ${s} is null!`),void this.emit(events.DC_ERROR,!0);if(this.channel!==s)return t.error(`peer channel ${s} not matched!`),void this.emit(events.DC_ERROR,!0);switch(e.platform){case events.DC_PLAT_ANDROID:this.platform=events.DC_PLAT_ANDROID;break;case events.DC_PLAT_IOS:this.platform=events.DC_PLAT_IOS;break;case events.DC_PLAT_WEB:this.platform=events.DC_PLAT_WEB}if(this.mobile=e.mobile||!1,this.mobileWeb=this.mobile&&this.platform===events.DC_PLAT_WEB||!1,this.sequential=e.sequential,this.sequential!==this.typeExpected)return t.error(`peer sequential type ${this.sequential} not matched!`),void this.emit(events.DC_ERROR,!0);if(t.info(`${this.remotePeerId} platform ${this.platform} sequential ${this.sequential}`),e.peers&&(this.peersConnected+=e.peers,t.info(`${this.remotePeerId} now has ${this.peersConnected} peers`)),this.emit(events.DC_METADATA,e),e.field&&!this.config.live&&e.sequential){const{field:t}=e;if(Array.isArray(t))this._handleField(t);else for(let e in t)this._handleField(t[e])}}_handleField(e){e.forEach((e=>{e>=0&&(e<this.startSN&&(this.startSN=e),e>this.endSN&&(this.endSN=e))}))}_handleStats(e){this.gotStatsTs=getCurrentTs();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(e){this.uploading?this.logger.warn(`${this.remotePeerId} is uploading when receive request`):(this.uploading=!0,this.emit(events.DC_REQUEST,e))}_handlePieceAck(e){0!==this.timeSendPiece&&(this.uploadSpeed=Math.round(e.size/(performance.now()-this.timeSendPiece)*2),this.timeSendPiece=0,this.logger.info(`${this.remotePeerId} uploadSpeed is ${this.uploadSpeed}`)),e.miss>0&&this.logger.warn(`peer ${this.remotePeerId} miss ${e.miss}`)}_prepareForBinary(e,t,s,r){this.bufArr=[],this.remainAttachments=e,this.segId=t,this.bufSN=s,this.expectedSize=r}_handleBinaryData(e=!1){if(this.listenerCount(events.DC_RESPONSE)>0){e&&this.bufArr.reverse();let t=utils_buffer.l.concat(this.bufArr);const s=t.byteLength;if(s===this.expectedSize){let e=t.buffer;const s=new Segment(this.bufSN,this.segId,e,this.remotePeerId,this.pieceMsg.level);this.emit(events.DC_RESPONSE,s,this.weight)}else this.logger.error(`${this.segId} expectedSize ${this.expectedSize} not equal to byteLength ${s}`)}this.segId="",this.bufArr=[],this.expectedSize=-1}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>DC_TOLERANCE&&!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`)}}loadtimeout(){const{logger:e,bufArr:t,pieceMsg:s}=this;return e.warn(`timeout while downloading from ${this.remotePeerId}, ${t.length} of ${s.attachments} packets loaded`),this.emit(events.DC_TIMEOUT),this.checkIfNeedChoke(),!0}sendMsgPieceAbort(e){this.uploading=!1,this.sendJson({event:events.DC_PIECE_ABORT,reason:e})}loadedBytes(){let e=0;for(let t=0;t<this.bufArr.length;t++)e+=this.bufArr[t].byteLength;return e}currentLoadSpeed(){return 0===this.timeReceivePiece?0:this.loadedBytes()/(performance.now()-this.timeReceivePiece)}minRequiredSpeed(e){return(this.pieceMsg.size-this.loadedBytes())/e}}function dividePayload(e,t,s,r){let n=[];if(r){let i;for(let r=0;r<s-1;r++)i=e.slice(r*t,(r+1)*t),n.push(i);i=e.slice(e.byteLength-r,e.byteLength),n.push(i)}else{let r;for(let i=0;i<s;i++)r=e.slice(i*t,(i+1)*t),n.push(r)}return n}const peer=peer_Peer,CHECK_PEERS_INTERVAL=3;function noop(){return!0}function getQueryParam(e){return new URL(location.href).searchParams.get(e)}function updateQueryStringParam(e,t,s){var r=new RegExp("([?&])"+t+"=.*?(&|$)","i"),n=-1!==e.indexOf("?")?"&":"?";return e.match(r)?e.replace(r,"$1"+t+"="+s+"$2"):e+n+t+"="+s}function getCurrentTs(){return Date.parse(new Date)/1e3}function randomNum(e,t){return parseInt(Math.random()*(t-e+1)+e,10)}function calCheckPeersDelay(e){return 0===e?CHECK_PEERS_INTERVAL:.33*e+.67}function performRangeRequest(e,t,s){const r=new XMLHttpRequest;return new Promise(((n,i)=>{r.open("GET",e,!0),r.responseType="arraybuffer",r.timeout=3500,r.onreadystatechange=e=>{if(4===r.readyState){const e=r.status;e>=200&&e<300?n(r.response):i(`status ${e}`)}},r.onerror=e=>{i("request error")},r.ontimeout=e=>{i("timeout")},r.setRequestHeader("Range",t||"bytes=0-0"),s&&s(r,e),r.send()}))}function navLang(){return"zh-CN"===(navigator.language||navigator.userLanguage)?"cn":"en"}function dontWaitFor(e){e.then((()=>{}))}function timeout(e){return new Promise((t=>setTimeout(t,e)))}function getBrowserRTC(){if("undefined"==typeof window)return null;var e={RTCPeerConnection:window.RTCPeerConnection||window.mozRTCPeerConnection||window.webkitRTCPeerConnection,RTCSessionDescription:window.RTCSessionDescription||window.mozRTCSessionDescription||window.webkitRTCSessionDescription,RTCIceCandidate:window.RTCIceCandidate||window.mozRTCIceCandidate||window.webkitRTCIceCandidate};return e.RTCPeerConnection?e:null}function copyBuffer(e){const t=utils_buffer.l.from(e),s=new utils_buffer.l(e.byteLength);return t.copy(s),s}function getMaxSequence(e){const t=e.split("\n");let s=0;let r=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")&&r++;return s+r-1}function isHttps(){return location.protocol.startsWith("https")}function isInteger(e){return"number"==typeof e&&e%1==0}function appendSlogan(e,t,s){var r=document.createElement("div");r.style.position="absolute",r.style.top="8px",r.style.left="8px",r.style.zIndex="999",r.style.fontSize="10px";var n=document.createElement("a");n.href=t,n.target="_blank",n.innerText=e,n.style.color="white",n.style.textDecoration="none",n.style.textShadow="0 0 5px white,0 0 10px #00FFFF,0 0 15px #7FFF00,0 0 20px white";var i=document.createElement("i");i.style.width="5px",i.style.height="5px",i.style.borderRadius="50%",i.style.display="inline-block",i.style.backgroundColor="#67C23A",i.style.marginBottom="2px",i.style.marginRight="4px",r.appendChild(i),r.appendChild(n);var o=s.parentNode;o&&o.insertBefore(r,s)}function getHomeUrl(){return window.atob("aHR0cHM6Ly9zd2FybWNsb3VkLm5ldC9lbi8=")}function splitBytes(e,t){const s=peer.defaultPacketSize,r=e.byteLength-t,n=[];let i=t,o=Math.floor(r/s),a=r%s;for(let t=0;t<o;t++){const t=(0,utils_buffer.l)(s);e.copy(t,0,i,i+s),n.push(t),i+=s}if(a>0){const t=(0,utils_buffer.l)(a);e.copy(t,0,i,i+a),n.push(t)}return n}function getAvailableMemory(){const{memory:e}=performance;return e?e.jsHeapSizeLimit-e.usedJSHeapSize:-1}const logMap={debug:0,info:1,warn:2,error:3,none:4};class Logger{constructor(e){this.logLevel=e,this.onlineDebug=!1,console.debug=console.log,"debug"!==e&&"info"!==e||(this.logLevel="warn"),!0===e?this.logLevel="warn":!1===e?this.logLevel="none":e in logMap||(this.logLevel="error"),this.resetLogger()}enableDebug(){this.onlineDebug=!0;for(let e in logMap)this[e]=console[e]}resetLogger(){this.onlineDebug=!1;for(let e in logMap)logMap[e]<logMap[this.logLevel]?this[e]=noop:this[e]=console[e]}get isDebugLevel(){return logMap[this.logLevel]<=2||this.onlineDebug}}const utils_logger=Logger;var url_toolkit=__webpack_require__(622),url_toolkit_default=__webpack_require__.n(url_toolkit);const players={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 player_detector(){let e;for(let t in players)if(window[t]){e=players[t];break}return e}const SAM={_:"nllL",f:"d3NzJ",ss:"==",3:"TNBLy9z",8:"aWduY",u:"mNvbQ",qa:"WwuY2RuY"};class EngineBase extends(events_default()){constructor(e={}){if(super(),this.p2pEnabled=!(!1===e.p2pEnabled||"0"===getQueryParam("_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"===navLang()&&console.log(`%cEmpower your users to become the unlimitedly scalable CDN!\n%c${getHomeUrl()}`,"color: dodgerblue; padding:20px 0; font-size: x-large","font-size: medium; padding-bottom:15px");const t=new utils_logger(e.logLevel);return e.logger=this.logger=t,t}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(s,r)=>`${e}-${t(s,r)}`}makeSignalId(){let e="";const{config:t}=this,s=decodeURIComponent(window.atob(SAM.f+SAM[3]+SAM[8]+SAM.qa+SAM._+SAM.u+SAM.ss));if(t.wsSignalerAddr){let r;"object"!=typeof t.wsSignalerAddr||t.wsSignalerAddr.backup?"string"==typeof t.wsSignalerAddr&&(r=t.wsSignalerAddr):r=t.wsSignalerAddr.main,r===s&&(r=void 0),r&&(e=url_toolkit_default().parseURL(r).netLoc.substr(2))}else t.wsSignalerAddr=s;return e}get commonBrowserInfo(){const e=platform_default().getPlatform(),t=platform_default().getNetType()||"wifi";return this.netType=t,{device:e,netType:t,player:player_detector()||void 0}}setupWindowListeners(e){const t=["iPad","iPhone"].indexOf(navigator.platform)>=0?"pagehide":"beforeunload",s=()=>{this.fetcher&&this.fetcher.postStatsWithBeacon(),this.p2pEnabled&&this.disableP2P(),window.removeEventListener(t,s)};e?window.removeEventListener(t,s):window.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 EngineBase.version}static isSupported(){const e=getBrowserRTC();return!(!e||void 0===e.RTCPeerConnection.prototype.createDataChannel)}}EngineBase.version="2.2.11",EngineBase.protocolVersion=peer.VERSION;const engine_base=EngineBase;function tryGetMediaElement(e){if(e){if("string"==typeof e)return document.querySelector(e);if(e instanceof HTMLMediaElement)return e}return document.getElementsByTagName("video")[0]||document.getElementsByTagName("audio")[0]}function calRangeWithForwardReverseOffset(e,t,s,r=0,n=0){const i=peer.defaultPacketSize;let o="bytes=",a=r,h=n||s-1;const l=Math.floor(s/i),c=s%i>0?l+1:l;if(e>=0&&(a+=(e+1)*i),o=`${o}${a}-`,t>=0&&t<c){h-=s%i+(c-t-1)*i,o=`${o}${h}`}else 0!==n&&(o=`${o}${h}`);return o}let commonConfig={wsMaxRetries:10,p2pEnabled:!0,wifiOnly:!1,memoryCacheLimit:{pc:629145600,mobile:314572800},dcDownloadTimeout:25,logLevel:"error",tag:"",webRTCConfig:{},token:void 0,appName:void 0,appId:void 0,prefetchNum:5,showSlogan:!0,trickleICE:!1,announceLocation:"cn",geoIpPreflight:!0,getStats:function(e,t,s){},getPeerId:function(e){},getPeersInfo:function(e){}};const config=commonConfig;let defaultP2PConfig={...config,httpLoadTime:2,sharePlaylist:!1,useHttpRange:!0,hlsjsInstance:null,proxyOnly:!1,p2pBlackList:["aac","mp3","vtt","webvtt","key"],live:!0,swFile:"./sw.js",swScope:"./",swAutoRegister:!0,mediaElem:void 0,httpStreamEnabled:!0,diskCacheLimit:{pc:262144e4,mobile:1572864e3},useDiskCache:!0};const hls_next_config=defaultP2PConfig,STORE_NOT_INIT="store not init";function promisifyRequest(e){return new Promise(((t,s)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>s(e.error)}))}function createStores(e,t){const s=indexedDB.open(e);s.onupgradeneeded=()=>{const e=s.result;t.forEach((t=>{e.createObjectStore(t)}))};const r=promisifyRequest(s);return t.map((e=>(t,s)=>r.then((r=>s(r.transaction(e,t).objectStore(e))))))}function get(e,t){return t?t("readonly",(t=>promisifyRequest(t.get(e)))):Promise.reject(STORE_NOT_INIT)}function set(e,t,s){return s?s("readwrite",(s=>(s.put(t,e),promisifyRequest(s.transaction)))):Promise.reject(STORE_NOT_INIT)}function setMany(e,t){return t?t("readwrite",(t=>(e.forEach((e=>t.put(e[1],e[0]))),promisifyRequest(t.transaction)))):Promise.reject(STORE_NOT_INIT)}function getMany(e,t){return t?t("readonly",(t=>Promise.all(e.map((e=>promisifyRequest(t.get(e))))))):Promise.reject(STORE_NOT_INIT)}function update(e,t,s){return s?s("readwrite",(s=>new Promise(((r,n)=>{s.get(e).onsuccess=function(){try{s.put(t(this.result),e),r(promisifyRequest(s.transaction))}catch(e){n(e)}}})))):Promise.reject(STORE_NOT_INIT)}function del(e,t){return t?t("readwrite",(t=>(t.delete(e),promisifyRequest(t.transaction)))):Promise.reject(STORE_NOT_INIT)}function delMany(e,t){return t?t("readwrite",(t=>(e.forEach((e=>t.delete(e))),promisifyRequest(t.transaction)))):Promise.reject(STORE_NOT_INIT)}function clear(e){return e?e("readwrite",(e=>(e.clear(),promisifyRequest(e.transaction)))):Promise.reject(STORE_NOT_INIT)}function clearAll(e){return new Promise(((t,s)=>{indexedDB.databases().then((r=>{var n=r.filter((t=>t.name!==e)).map((e=>new Promise(((t,s)=>{var r=indexedDB.deleteDatabase(e.name);r.onsuccess=t,r.onerror=s,r.onblocked=s}))));Promise.all(n).then(t).catch(s)}))}))}function eachCursor(e,t){return e.openCursor().onsuccess=function(){this.result&&(t(this.result),this.result.continue())},promisifyRequest(e.transaction)}function keys(e){return e?e("readonly",(e=>{if(e.getAllKeys)return promisifyRequest(e.getAllKeys());const t=[];return eachCursor(e,(e=>t.push(e.key))).then((()=>t))})):Promise.reject(STORE_NOT_INIT)}function values(e){return e?e("readonly",(e=>{if(e.getAll)return promisifyRequest(e.getAll());const t=[];return eachCursor(e,(e=>t.push(e.value))).then((()=>t))})):Promise.reject(STORE_NOT_INIT)}function entries(e){return e?e("readonly",(t=>{if(t.getAll&&t.getAllKeys)return Promise.all([promisifyRequest(t.getAllKeys()),promisifyRequest(t.getAll())]).then((([e,t])=>e.map(((e,s)=>[e,t[s]]))));const s=[];return e("readonly",(e=>eachCursor(e,(e=>s.push([e.key,e.value]))).then((()=>s))))})):Promise.reject(STORE_NOT_INIT)}const KEY_METADATA_SIZE="size";class SegmentStore extends(events_default()){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===platform_default().device.PC_WEB||s===platform_default().device.PC_NATIVE,this.maxBufSize=this.isPC?t.diskCacheLimit.pc:t.diskCacheLimit.mobile,this.overflowed=!1,this.loadingSN=0}async setupStore(){if(navigator.storage){const e=await navigator.storage.estimate(),t=Math.floor(e.quota-e.usage);t<this.maxBufSize&&(this.maxBufSize=t-104857600)}return new Promise(((e,t)=>{if(this.isPC&&this.maxBufSize<629145600||!this.isPC&&this.maxBufSize<367001600)return void t("disk storage not enough");const s=createStores(this.channel,["segments","id2Sn","metadata"]);this.segmentsStore=s[0],this.id2SnStore=s[1],this.metaStore=s[2];const r=setTimeout((()=>{t("setupStore timeout")}),250);this._clearDisk(this.channel).then((()=>{this._initMetaStore().then((()=>{clearTimeout(r),e()})).catch((e=>{t(e)}))})).catch((e=>{t(e)}))}))}_initMetaStore(){return new Promise(((e,t)=>{get(KEY_METADATA_SIZE,this.metaStore).then((t=>{t||(this.logger.info("init MetaStore size"),set(KEY_METADATA_SIZE,0,this.metaStore)),e()})).catch((e=>{t()}))}))}currBufSize(){return get(KEY_METADATA_SIZE,this.metaStore)}async hasSegOfId(e){if(!e)return Promise.resolve(!1);const t=await get(e,this.id2SnStore);return new Promise(((s,r)=>{void 0!==t?get(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 get(e,this.id2SnStore);return new Promise(((e,s)=>{void 0!==t?get(t,this.segmentsStore).then((t=>{t&&t.length>0?e(Segment.fromSegment(t[0])):e(null)})).catch((t=>{this.logger.error(t),e(null)})):e(null)}))}getSegIdBySN(e){return new Promise(((t,s)=>{get(e,this.segmentsStore).then((e=>{e&&e.length>0?t(e[0].segId):t(null)})).catch((e=>{this.logger.error(e),t(null)}))}))}putSeg(e){this._addSeg(e)}_addSeg(e){const{logger:t}=this,{segId:s,sn:r,size:n}=e;set(s,r,this.id2SnStore),get(r,this.segmentsStore).then((t=>{t?0===t.filter((e=>e.segId===s)).length&&(t.push(this._segmentToCache(e)),set(r,t,this.segmentsStore).then((()=>{this._increaseBufSize(e.data.byteLength)})).catch((e=>{this.logger.error(e)}))):set(r,[this._segmentToCache(e)],this.segmentsStore).then((()=>{this._increaseBufSize(e.data.byteLength)})).catch((e=>{this.logger.error(e)}))})).catch((e=>{this.logger.error(e)})),this.emit(`${events.BM_ADDED_SN_}${e.sn}`,e),this.emit(events.BM_SEG_ADDED,e)}async _trimDisk(){const{logger:e}=this;let t=await this.currBufSize();t<this.maxBufSize||keys(this.segmentsStore).then((async s=>{const r=s.sort(((e,t)=>e-t));let n=0;do{if(n++>10){console.error("too much loops in SegmentStore");break}const s=r.shift();if(void 0===s){e.error("lastSN not found");continue}if(s>=this.loadingSN){e.warn(`trimDisk failed, loadingSN ${loadingSN}`);break}const i=r[0],o=await get(s,this.segmentsStore);if(!o){e.warn("lastSeg not found");continue}let a=0;o.forEach((e=>{a+=e.data.byteLength})),del(s,this.segmentsStore).then((()=>{this._decreaseBufSize(parseInt(a))})),o.forEach((t=>{del(t.segId,this.id2SnStore),e.info(`pop seg ${t.segId} size ${t.data.byteLength}`),this.emit(events.BM_LOST,{sn:s,segId:t.segId,next:i,level:t.level})})),t-=a,e.info(`pop sn ${s} size ${a} currBufSize ${t}`),this.overflowed||(this.overflowed=!0)}while(t>=this.maxBufSize)}))}_decreaseBufSize(e){get(KEY_METADATA_SIZE,this.metaStore).then((t=>{t&&set(KEY_METADATA_SIZE,t-e,this.metaStore)})).catch((e=>{this.logger.error(e)}))}_increaseBufSize(e){get(KEY_METADATA_SIZE,this.metaStore).then((t=>{set(KEY_METADATA_SIZE,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 cache");try{this._clearDisk()}catch(e){}}_clearDisk(e){return clearAll(e)}destroy(){this.clear(),this.removeAllListeners()}}const segment_store=SegmentStore,LIVE_MAX_BUFFER_SIZE=36700160,MIN_SEGMENTS_KEEP=5;class SegmentCache extends(events_default()){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===platform_default().device.PC_WEB||s===platform_default().device.PC_NATIVE?t.memoryCacheLimit.pc:t.memoryCacheLimit.mobile,t.live)this.maxBufSize=LIVE_MAX_BUFFER_SIZE;else{const e=getAvailableMemory();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 r=this.id2Sn.get(e);this._segPool.has(r)?t(this._segPool.get(r).some((t=>t.segId===e))):t(!1)}))}getSegById(e){const t=this.id2Sn.get(e);return new Promise(((s,r)=>{if(!this._segPool.has(t))return void s(null);const n=this._segPool.get(t);for(let t of n)if(t.segId===e)return void s(t);s(null)}))}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)),this._addSeg(e)}_addSeg(e){const{logger:t}=this,{segId:s,sn:r,size:n}=e;if(this.id2Sn.set(s,r),this._segPool.has(r)){this._segPool.get(r).push(e)}else this._segPool.set(r,[e]);this._currBufSize+=parseInt(n);const i=this._segPool.size;if(this.emit(`${events.BM_ADDED_SN_}${e.sn}`,e),this.emit(events.BM_SEG_ADDED,e),this._currBufSize<this.maxBufSize||i<=MIN_SEGMENTS_KEEP)return;const o=Array.from(this._segPool.keys()).sort(((e,t)=>e-t));let a=0;do{if(a++>10){console.error("too much loops in SegmentCache");break}const e=o.shift();if(void 0===e){t.error("lastSN not found");continue}const s=o[0],r=this._segPool.get(e);if(!r){t.error("lastSeg not found");continue}let n=0;r.forEach((e=>{n+=e.size})),this._currBufSize-=parseInt(n),this._segPool.delete(e),r.forEach((r=>{this.id2Sn.delete(r.segId),t.info(`pop seg ${r.segId} size ${r.size}`),this.emit(events.BM_LOST,{sn:e,segId:r.segId,next:s,level:r.level})})),t.info(`pop sn ${e} size ${n} currBufSize ${this._currBufSize}`),this.overflowed||(this.overflowed=!0)}while(this._currBufSize>=this.maxBufSize&&this._segPool.size>MIN_SEGMENTS_KEEP)}clear(){this.logger.warn("clear segment cache"),this._segPool.clear(),this.id2Sn.clear(),this._currBufSize=0}destroy(){this.clear(),this.removeAllListeners()}}const segment_cache=SegmentCache;class Engine extends engine_base{constructor(e={}){super(e),window.__swP2pEngineHlsActive=!0,this.config=Object.assign({},hls_next_config,e),this.rangeTested=!1,this.lastLevel=0,this.multiBitrate=!1}setup(){let{token:e,channelId:t,segmentId:s}=this.config,r=e=>{const t=url_toolkit_default().parseURL(e);return`${t.netLoc.substr(2)+t.path.substring(0,t.path.lastIndexOf("."))}`},n=(e,t,s,r)=>`${e}-${t}`;t&&"function"==typeof t&&(r=this.makeChannelId(e,t)),s||(this.config.segmentId=n);return{channelIdMaker:r,signalId:this.makeSignalId(),browserInfo:{...this.commonBrowserInfo,tag:this.config.tag||void 0}}}setupElectron(){this.browserInfo.device===platform.device.PC_NATIVE&&(this.browserInfo={...this.browserInfo,app:this.config.appName,bundle:this.config.appId})}getExtraForStats(){const e={};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={};return this.multiBitrate&&(e.level=this.currentLevel+""),e}destroy(){window.__swP2pEngineHlsActive=!1,super.destroy()}async initSegmentManager(){const{logger:e,config:t}=this;if(window.indexedDB&&t.useDiskCache&&!t.live){const s=new segment_store(this,t);try{await s.setupStore(),this.bufMgr=s}catch(s){e.warn(s),this.bufMgr=new segment_cache(this,t)}}else this.bufMgr=new segment_cache(this,t);if(this.bufMgr.maxBufSize<=0)throw new Error("bufMgr state is invalid")}}class LevelKey{constructor(){this.method=null,this.key=null,this.iv=null,this._uri=null}get uri(){return!this._uri&&this.reluri&&(this._uri=url_toolkit.buildAbsoluteURL(this.baseuri,this.reluri,{alwaysNormalize:!0})),this._uri}}class Fragment{constructor(){this._url=null,this._byteRange=null,this._decryptdata=null,this.tagList=[],this.programDateTime=null,this.rawProgramDateTime=null,this._elementaryStreams={[Fragment.ElementaryStreamTypes.AUDIO]:!1,[Fragment.ElementaryStreamTypes.VIDEO]:!1}}static get ElementaryStreamTypes(){return{AUDIO:"audio",VIDEO:"video"}}get url(){return!this._url&&this.relurl&&(this._url=url_toolkit.buildAbsoluteURL(this.baseurl,this.relurl,{alwaysNormalize:!0})),this._url}set url(e){this._url=e}get byteRange(){if(!this._byteRange&&!this.rawByteRange)return[];if(this._byteRange)return this._byteRange;let e=[];if(this.rawByteRange){const t=this.rawByteRange.split("@",2);if(1===t.length){const t=this.lastByteRangeEndOffset;e[0]=t||0}else e[0]=parseInt(t[1]);e[1]=parseInt(t[0])+e[0],this._byteRange=e}return e}get byteRangeStartOffset(){return this.byteRange[0]}get byteRangeEndOffset(){return this.byteRange[1]}get decryptdata(){return this._decryptdata||(this._decryptdata=this.fragmentDecryptdataFromLevelkey(this.levelkey,this.sn)),this._decryptdata}get endProgramDateTime(){if(!Number.isFinite(this.programDateTime))return null;let e=Number.isFinite(this.duration)?this.duration:0;return this.programDateTime+1e3*e}get encrypted(){return!(!this.decryptdata||null===this.decryptdata.uri||null!==this.decryptdata.key)}addElementaryStream(e){this._elementaryStreams[e]=!0}hasElementaryStream(e){return!0===this._elementaryStreams[e]}createInitializationVector(e){let t=new Uint8Array(16);for(let s=12;s<16;s++)t[s]=e>>8*(15-s)&255;return t}fragmentDecryptdataFromLevelkey(e,t){let s=e;return e&&e.method&&e.uri&&!e.iv&&(s=new LevelKey,s.method=e.method,s.baseuri=e.baseuri,s.reluri=e.reluri,s.iv=this.createInitializationVector(t)),s}}class Level{constructor(e){this.endCC=0,this.endSN=0,this.fragments=[],this.initSegment=null,this.live=!0,this.needSidxRanges=!1,this.startCC=0,this.startSN=0,this.startTimeOffset=null,this.targetduration=0,this.totalduration=0,this.type=null,this.url=e,this.version=null}get hasProgramDateTime(){return!(!this.fragments[0]||!Number.isFinite(this.fragments[0].programDateTime))}}const DECIMAL_RESOLUTION_REGEX=/^(\d+)x(\d+)$/,ATTR_LIST_REGEX=/\s*(.+?)\s*=((?:\".*?\")|.*?)(?:,|$)/g;class AttrList{constructor(e){"string"==typeof e&&(e=AttrList.parseAttrList(e));for(let t in e)e.hasOwnProperty(t)&&(this[t]=e[t])}decimalInteger(e){const t=parseInt(this[e],10);return t>Number.MAX_SAFE_INTEGER?1/0:t}hexadecimalInteger(e){if(this[e]){let t=(this[e]||"0x").slice(2);t=(1&t.length?"0":"")+t;const s=new Uint8Array(t.length/2);for(let e=0;e<t.length/2;e++)s[e]=parseInt(t.slice(2*e,2*e+2),16);return s}return null}hexadecimalIntegerAsNumber(e){const t=parseInt(this[e],16);return t>Number.MAX_SAFE_INTEGER?1/0:t}decimalFloatingPoint(e){return parseFloat(this[e])}enumeratedString(e){return this[e]}decimalResolution(e){const t=DECIMAL_RESOLUTION_REGEX.exec(this[e]);if(null!==t)return{width:parseInt(t[1],10),height:parseInt(t[2],10)}}static parseAttrList(e){let t,s={};for(ATTR_LIST_REGEX.lastIndex=0;null!==(t=ATTR_LIST_REGEX.exec(e));){let e=t[2],r='"';0===e.indexOf(r)&&e.lastIndexOf(r)===e.length-1&&(e=e.slice(1,-1)),s[t[1]]=e}return s}}const attr_list=AttrList,sampleEntryCodesISO={audio:{a3ds:!0,"ac-3":!0,"ac-4":!0,alac:!0,alaw:!0,dra1:!0,"dts+":!0,"dts-":!0,dtsc:!0,dtse:!0,dtsh:!0,"ec-3":!0,enca:!0,g719:!0,g726:!0,m4ae:!0,mha1:!0,mha2:!0,mhm1:!0,mhm2:!0,mlpa:!0,mp4a:!0,"raw ":!0,Opus:!0,samr:!0,sawb:!0,sawp:!0,sevc:!0,sqcp:!0,ssmv:!0,twos:!0,ulaw:!0},video:{avc1:!0,avc2:!0,avc3:!0,avc4:!0,avcp:!0,drac:!0,dvav:!0,dvhe:!0,encv:!0,hev1:!0,hvc1:!0,mjp2:!0,mp4v:!0,mvc1:!0,mvc2:!0,mvc3:!0,mvc4:!0,resv:!0,rv60:!0,s263:!0,svc1:!0,svc2:!0,"vc-1":!0,vp08:!0,vp09:!0}};function isCodecType(e,t){const s=sampleEntryCodesISO[t];return!!s&&!0===s[e.slice(0,4)]}function isCodecSupportedInMp4(e,t){return window.MediaSource.isTypeSupported(`${t||"video"}/mp4;codecs="${e}"`)}const MASTER_PLAYLIST_REGEX=/#EXT-X-STREAM-INF:([^\n\r]*)[\r\n]+([^\r\n]+)/g,MASTER_PLAYLIST_MEDIA_REGEX=/#EXT-X-MEDIA:(.*)/g,LEVEL_PLAYLIST_REGEX_FAST=new RegExp([/#EXTINF:\s*(\d*(?:\.\d+)?)(?:,(.*)\s+)?/.source,/|(?!#)([\S+ ?]+)/.source,/|#EXT-X-BYTERANGE:*(.+)/.source,/|#EXT-X-PROGRAM-DATE-TIME:(.+)/.source,/|#.*/.source].join(""),"g"),LEVEL_PLAYLIST_REGEX_SLOW=/(?:(?:#(EXTM3U))|(?:#EXT-X-(PLAYLIST-TYPE):(.+))|(?:#EXT-X-(MEDIA-SEQUENCE): *(\d+))|(?:#EXT-X-(TARGETDURATION): *(\d+))|(?:#EXT-X-(KEY):(.+))|(?:#EXT-X-(START):(.+))|(?:#EXT-X-(ENDLIST))|(?:#EXT-X-(DISCONTINUITY-SEQ)UENCE:(\d+))|(?:#EXT-X-(DIS)CONTINUITY))|(?:#EXT-X-(VERSION):(\d+))|(?:#EXT-X-(MAP):(.+))|(?:(#)([^:]*):(.*))|(?:(#)(.*))(?:.*)\r?\n?/,MP4_REGEX_SUFFIX=/\.(mp4|m4s|m4v|m4a)$/i;class M3U8Parser{static findGroup(e,t){if(!e)return null;let s=null;for(let r=0;r<e.length;r++){const n=e[r];n.id===t&&(s=n)}return s}static convertAVC1ToAVCOTI(e){let t,s=e.split(".");return s.length>2?(t=s.shift()+".",t+=parseInt(s.shift()).toString(16),t+=("000"+parseInt(s.shift()).toString(16)).substr(-4)):t=e,t}static resolve(e,t){return url_toolkit.buildAbsoluteURL(t,e,{alwaysNormalize:!0})}static parseMasterPlaylist(e,t){let s,r=[];function n(e,t){["video","audio"].forEach((s=>{const r=e.filter((e=>isCodecType(e,s)));if(r.length){const n=r.filter((e=>0===e.lastIndexOf("avc1",0)||0===e.lastIndexOf("mp4a",0)));t[`${s}Codec`]=n.length>0?n[0]:r[0],e=e.filter((e=>-1===r.indexOf(e)))}})),t.unknownCodecs=e}for(MASTER_PLAYLIST_REGEX.lastIndex=0;null!=(s=MASTER_PLAYLIST_REGEX.exec(e));){const e={},i=e.attrs=new attr_list(s[1]);e.url=M3U8Parser.resolve(s[2],t);const o=i.decimalResolution("RESOLUTION");o&&(e.width=o.width,e.height=o.height),e.bitrate=i.decimalInteger("AVERAGE-BANDWIDTH")||i.decimalInteger("BANDWIDTH"),e.name=i.NAME,n([].concat((i.CODECS||"").split(/[ ,]+/)),e),e.videoCodec&&-1!==e.videoCodec.indexOf("avc1")&&(e.videoCodec=M3U8Parser.convertAVC1ToAVCOTI(e.videoCodec)),r.push(e)}return r}static parseMasterPlaylistMedia(e,t,s,r=[]){let n,i=[],o=0;for(MASTER_PLAYLIST_MEDIA_REGEX.lastIndex=0;null!==(n=MASTER_PLAYLIST_MEDIA_REGEX.exec(e));){const e={},a=new attr_list(n[1]);if(a.TYPE===s){if(e.groupId=a["GROUP-ID"],e.name=a.NAME,e.type=s,e.default="YES"===a.DEFAULT,e.autoselect="YES"===a.AUTOSELECT,e.forced="YES"===a.FORCED,a.URI&&(e.url=M3U8Parser.resolve(a.URI,t)),e.lang=a.LANGUAGE,e.name||(e.name=e.lang),r.length){const t=M3U8Parser.findGroup(r,e.groupId);e.audioCodec=t?t.codec:r[0].codec}e.id=o++,i.push(e)}}return i}static parseLevelPlaylist(e,t){let s,r,n=0,i=0,o=new Level(t),a=new LevelKey,h=0,l=null,c=new Fragment,d=null;for(LEVEL_PLAYLIST_REGEX_FAST.lastIndex=0;null!==(s=LEVEL_PLAYLIST_REGEX_FAST.exec(e));){const e=s[1];if(e){c.duration=parseFloat(e);const t=(" "+s[2]).slice(1);c.title=t||null,c.tagList.push(t?["INF",e,t]:["INF",e])}else if(s[3]){if(Number.isFinite(c.duration)){const e=n++;c.start=i,c.levelkey=a,c.sn=e,c.cc=h,c.baseurl=t,c.relurl=(" "+s[3]).slice(1),assignProgramDateTime(c,l),o.fragments.push(c),l=c,i+=c.duration,c=new Fragment}}else if(s[4]){if(c.rawByteRange=(" "+s[4]).slice(1),l){const e=l.byteRangeEndOffset;e&&(c.lastByteRangeEndOffset=e)}}else if(s[5])c.rawProgramDateTime=(" "+s[5]).slice(1),c.tagList.push(["PROGRAM-DATE-TIME",c.rawProgramDateTime]),null===d&&(d=o.fragments.length);else{for(s=s[0].match(LEVEL_PLAYLIST_REGEX_SLOW),r=1;r<s.length&&void 0===s[r];r++);const e=(" "+s[r+1]).slice(1),i=(" "+s[r+2]).slice(1);switch(s[r]){case"#":c.tagList.push(i?[e,i]:[e]);break;case"PLAYLIST-TYPE":o.type=e.toUpperCase();break;case"MEDIA-SEQUENCE":n=o.startSN=parseInt(e);break;case"TARGETDURATION":o.targetduration=parseFloat(e);break;case"VERSION":o.version=parseInt(e);break;case"EXTM3U":break;case"ENDLIST":o.live=!1;break;case"DIS":h++,c.tagList.push(["DIS"]);break;case"DISCONTINUITY-SEQ":h=parseInt(e);break;case"KEY":var u=new attr_list(e),g=u.enumeratedString("METHOD"),f=u.URI,p=u.hexadecimalInteger("IV");g&&(a=new LevelKey,f&&["AES-128","SAMPLE-AES","SAMPLE-AES-CENC"].indexOf(g)>=0&&(a.method=g,a.baseuri=t,a.reluri=f,a.key=null,a.iv=p));break;case"START":let r=new attr_list(e).decimalFloatingPoint("TIME-OFFSET");Number.isFinite(r)&&(o.startTimeOffset=r);break;case"MAP":let l=new attr_list(e);c.relurl=l.URI,c.rawByteRange=l.BYTERANGE,c.baseurl=t,c.sn="initSegment",o.initSegment=c,c=new Fragment,c.rawProgramDateTime=o.initSegment.rawProgramDateTime;break;default:console.warn(`line parsed but not handled: ${s}`)}}}return c=l,c&&!c.relurl&&(o.fragments.pop(),i-=c.duration),o.totalduration=i,o.averagetargetduration=i/o.fragments.length,o.endSN=n-1,o.startCC=o.fragments[0]?o.fragments[0].cc:0,o.endCC=h,!o.initSegment&&o.fragments.length&&o.fragments.every((e=>MP4_REGEX_SUFFIX.test(e.relurl)))&&(console.warn("MP4 fragments found but no init segment (probably no MAP, incomplete M3U8), trying to fetch SIDX"),c=new Fragment,c.relurl=o.fragments[0].relurl,c.baseurl=t,c.level=id,c.sn="initSegment",o.initSegment=c,o.needSidxRanges=!0),d&&backfillProgramDateTimes(o.fragments,d),o}}function backfillProgramDateTimes(e,t){let s=e[t];for(let r=t-1;r>=0;r--){const t=e[r];t.programDateTime=s.programDateTime-1e3*t.duration,s=t}}function assignProgramDateTime(e,t){e.rawProgramDateTime?e.programDateTime=Date.parse(e.rawProgramDateTime):t&&t.programDateTime&&(e.programDateTime=t.endProgramDateTime),Number.isFinite(e.programDateTime)||(e.programDateTime=null,e.rawProgramDateTime=null)}var md5=__webpack_require__(485),md5_default=__webpack_require__.n(md5),err_code=__webpack_require__(934),err_code_default=__webpack_require__.n(err_code);const setItem=(e,t)=>{"object"==typeof t&&(t=JSON.stringify(t)),localStorage.setItem(e,t)},hasItemUnexpired=e=>{const t=localStorage.getItem(e);try{const e=JSON.parse(t);if(e.duration&&e.startTime){return(new Date).getTime()-e.startTime<e.duration}return!1}catch(e){return!1}},getItem=e=>{const t=localStorage.getItem(e);try{const e=JSON.parse(t);return e.value?e.value:e}catch(e){return t}},removeItem=e=>{localStorage.removeItem(e)},removeAllItem=()=>{localStorage.clear()},setItemWithExpiration=(e,t,s)=>{let r={value:t,duration:s,startTime:(new Date).getTime()};setItem(e,r)},MIN_CONNS=8,BASE_REPORT_INTERVAL=20,IPAPI_URL="//pro.ip-api.com/json?fields=2181826&key=XOpiansRgYxGTho",IPAPI_TIMEOUT=600,GEOIP_KEY="SW_GEOIP_KEY",GEOIP_EXPIRATION=2592e5,GEOIP_EXPIRATION_MOBILE=432e5,URL_MAP={q:"uZ2luZS5u",v:"Y24u",3:"Y2Ru",0:"yMzMzL2Js",l:"Nvb",zz:"aHR0cHMlM",n:"YnllLm",h:"ZXQlM0E",7:"Q==",df:"0EvL",6:"3AycGV",x:"aGsuc3d",kj:"dHJhY",a:"2tlci5","+":"oZHR2","=":"Y2xvdW",w:"QuY29t","{":"3ZWIz","?":"LWxhY",$:"i5jb20=",o:"hcm1j",xo:"bG91ZC",sb:"5uZXQ="},_httpDownloaded=Symbol("httpDownloaded"),_p2pDownloaded=Symbol("p2pDownloaded"),_p2pUploaded=Symbol("p2pUploaded");class Server{constructor(e,t,s,r,n){let i;switch(e.config.announceLocation){case"cn":i=URL_MAP.v+URL_MAP[3]+URL_MAP.n+URL_MAP.l+URL_MAP[7];break;case"hk":i=URL_MAP.x+URL_MAP.o+URL_MAP.xo+URL_MAP.sb;break;case"us":i=URL_MAP.kj+URL_MAP.a+URL_MAP["+"]+URL_MAP["="]+URL_MAP.w;break;case"eu":i=URL_MAP.kj+URL_MAP.a+URL_MAP["{"]+URL_MAP["?"]+URL_MAP.$}this.engine=e,this.key=t||void 0,this.baseUrl=r||`https://${window.atob(i)}/v1`,this.channelId=window.btoa(s),this.timestamp=getCurrentTs();const o=url_toolkit_default().parseURL(this.baseUrl).netLoc;this.announce=o.replace(/\/\//,"");const a=genV(this.timestamp,"2.2.11",this.announce,this.channelId,n.type);this.native=!!n.bundle,this.announceInfo={...n,channel:this.channelId,ts:this.timestamp,version:"2.2.11",v:a,announce:this.announce,token:(0,platform.isLocalHost)()&&!this.native?void 0:this.key},this.announceURL=`${this.baseUrl}/channel`,this.reportFails=0,this.forbidden=!1,this.failConns=0,this.totalHTTPDownloaded=0,this.totalP2PDownloaded=0,this.totalP2PUploaded=0,this[_httpDownloaded]=0,this[_p2pDownloaded]=0,this[_p2pUploaded]=0,this.speed=0,this.errsBufStalled=0,this.errsInternalExpt=0}geoipRequest(){const{logger:e}=this.engine;return new Promise(((t,s)=>{if(hasItemUnexpired(GEOIP_KEY)){const s=getItem(GEOIP_KEY);e.info("found local geo data"),t(s)}else fetch(IPAPI_URL).then((e=>e.json())).then((e=>{if("success"===e.status){const s=e.mobile?GEOIP_EXPIRATION_MOBILE:GEOIP_EXPIRATION;setItemWithExpiration(GEOIP_KEY,e,s),t(e)}else{const t=new Error(`preflight status ${e.status}`);s(err_code_default()(t,"IPAPI_ERROR"))}})).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(err_code_default()(new Error("request timeout"),"IPAPI_ERROR"))}),IPAPI_TIMEOUT)}))]).then((e=>(this._parseGeoResponse(e),this.btAnnounce()))).catch((t=>{if("TRACKER_EXPT"!==t.code){const t=getItem(GEOIP_KEY);return t&&(e.info("use expired ipData"),this._parseGeoResponse(t)),this.btAnnounce()}throw t})))}_parseGeoResponse(e){const{lat:t,lon:s,isp:r,as:n,mobile:i,countryCode:o,continentCode:a}=e;i&&(this.announceInfo.netType="cellular");const h=n.split(" ")[0].substr(2);this.announceInfo.tag||(this.announceInfo.tag=`${a||""}-${(0,platform.getBrowser)()}${isHttps()?"s":""}`),this.announceInfo={...this.announceInfo,lat:t,lon:s,isp:r,asn:h,country:o}}btAnnounce(){const{logger:e}=this.engine;return this.announceInfo.tag||(this.announceInfo.tag=`${(0,platform.getBrowser)()}${isHttps()?"s":""}`),new Promise(((t,s)=>{fetch(this.announceURL,{headers:this._requestHeader,method:"POST",body:JSON.stringify(this.announceInfo)}).then((e=>e.json())).then((e=>{this.engine||s(err_code_default()(new Error("runtime error"),"TRACKER_EXPT",{retry:!1}));const r=e.data;if(r.f&&(this.forbidden=!0),-1===e.ret){const{code:t,msg:r}=e.data;s(err_code_default()(new Error(r),"TRACKER_EXPT",{retry:t>=5e3}))}else r.info&&console.info(`${r.info}`),r.warn&&console.warn(`${r.warn}`),r.min_conns||(r.min_conns=MIN_CONNS),(!r.rejected||r.rejected&&r.share_only)&&r.id&&r.report_interval&&r.peers?(this.peerId=this.id=r.id,r.report_interval<BASE_REPORT_INTERVAL&&(r.report_interval=BASE_REPORT_INTERVAL),this.btStats(r.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(r)):(this.engine&&(this.engine.p2pEnabled=!1),s(err_code_default()(new Error("msg not valid"),"TRACKER_EXPT",{retry:!1})))})).catch((t=>{e.error(`btAnnounce error ${t}`),s(err_code_default()(t,"TRACKER_EXPT",{retry:!0}))}))}))}btStats(interval=10){let _this=this;this.heartbeater=setInterval((()=>{this.postStats(),_b(interval)}),1e3*interval);var _0x5bd5=["v1","PmvWt1ORKFVimMIwnGl==","wpUsdEvDhA==","eC3CqcOrQ8KQRMKK","HUEHO8OWMcKWw5M=","ZxfChcKtEg==","DcOIVgXDtQ==","CwbCicO9woI=","wpfCo3VewrY=","w4c+w7JXw7Y=","TFt/wo3CsA==","X8ONKcKCw74=","w4PCoMO/eg4=","N2Upwoow","fMKDccOGw5o=","RcKlXcOUw64=","wpnCl8OHAMKd","A8OTwrHCpWk=","wr3DhVM=","AcOVVS/DosO8wo/ClA==","w4PChcOl","dcO0TMKZEsO6w5XCscKMSDDDmg==","w7otSDDDkMOOLQ==","wqTCmsKMw6zCgw==","Dlg5DMO3","b8KJJFzDl8OLw7TDow==","w7gnaTfDi8OILRw=","d3l/wqE=","BGsww7hG","wojClsKHw5HCsg==","QcOJRm3DlA==","ecKaScOKw6c=","w5bCq8Oj","w4dTw61e","w4zCqMOQfMOA","wr8ORHXDog==","wrzCkcOmNsKb","w4E4w41R","Vj7CscKgAg==","T8OLLMOGCQ==","c8Krw67CoRI=","e8OjQcKBwqc=","w4oNwqtbwoM=","W8OQR8K0Ng==","DsO6w6nDl8Ki","V8O/ZMK0Jg==","NgbCvcOpwqo=","EV8hAMOi","wp/CjU7Ch8Kj","wo/CiUbClsKFGi9ew4rDtA==","WcKHLUbDkQ==","cMOLw5vCkBo="],_0x3eee5c,_0x2b2808;_0x3eee5c=_0x5bd5,_0x2b2808=343,function(e,t,s,r){if((t>>=8)<e){for(;--e;)r=_0x3eee5c.shift(),t===e?(t=r,s=_0x3eee5c.shift()):s.replace(/[PmWtORKFVimMIwnGl=]/g,"")===t&&_0x3eee5c.push(r);_0x3eee5c.push(_0x3eee5c.shift())}}(++_0x2b2808,87808);var _0x38aa=function(e,t){e=~~"0x".concat(e);var s=_0x5bd5[e];if(void 0===_0x38aa.UJLmyS){!function(){var e="undefined"!=typeof window?window:"object"==typeof process&&"object"==typeof __webpack_require__.g?__webpack_require__.g:this;e.atob||(e.atob=function(e){for(var t,s,r=String(e).replace(/=+$/,""),n=0,i=0,o="";s=r.charAt(i++);~s&&(t=n%4?64*t+s:s,n++%4)?o+=String.fromCharCode(255&t>>(-2*n&6)):0)s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(s);return o})}();_0x38aa.amGtZD=function(e,t){for(var s,r=[],n=0,i="",o="",a=0,h=(e=atob(e)).length;a<h;a++)o+="%"+("00"+e.charCodeAt(a).toString(16)).slice(-2);e=decodeURIComponent(o);for(var l=0;l<256;l++)r[l]=l;for(l=0;l<256;l++)n=(n+r[l]+t.charCodeAt(l%t.length))%256,s=r[l],r[l]=r[n],r[n]=s;l=0,n=0;for(var c=0;c<e.length;c++)n=(n+r[l=(l+1)%256])%256,s=r[l],r[l]=r[n],r[n]=s,i+=String.fromCharCode(e.charCodeAt(c)^r[(r[l]+r[n])%256]);return i},_0x38aa.qlEmAJ={},_0x38aa.UJLmyS=!0}var r=_0x38aa.qlEmAJ[e];return void 0===r?(void 0===_0x38aa.CjmTAl&&(_0x38aa.CjmTAl=!0),s=_0x38aa.amGtZD(s,t),_0x38aa.qlEmAJ[e]=s):s=r,s};function _b(_0x2b6f93){var _0x38577c={ygKbD:function(e,t,s){return e(t,s)},BaZnt:function(e,t){return e*t},ZvkZi:function(e,t){return e===t},eCedC:"BjdEV",LPFzx:function(e,t){return e(t)},uOzuW:function(e,t,s){return e(t,s)},juyxb:function(e,t){return e===t},DGNDG:"IJrLn",OFUEE:function(e,t){return e===t},YaRUs:_0x38aa("0","G(qN"),bgKgO:function(e,t,s){return e(t,s)},OJeBQ:function(e,t){return e*t},CeAJM:_0x38aa("1","[gN^"),rqWsY:function(e,t){return e!==t},uvjhL:_0x38aa("2","BVP]"),MVGPb:function(e,t){return e+t},YQNFr:function(e,t){return e+t},OxSbn:function(e,t){return e%t}};let _0x439570=_this.id.split("")[_0x38aa("3","JR8(")](-6).map((e=>e[_0x38aa("4","JR8(")](0))).reduce(((_0x361ff2,_0x161700)=>{var _0x82ba8e={AFfia:function(e,t){return e(t)},kgmkk:function(e,t,s){return _0x38577c.ygKbD(e,t,s)},msmEb:function(e,t){return _0x38577c[_0x38aa("5","*uLt")](e,t)}};if(_0x38577c[_0x38aa("6","Dd2g")](_0x38577c.eCedC,_0x38577c[_0x38aa("7","eX!Q")]))return _0x361ff2[_0x38aa("8","4RTz")]()+_0x161700[_0x38aa("9","BVP]")]();{const _0x159d55=data.i;_this.bl=_0x82ba8e.kgmkk(setTimeout,(()=>{_0x82ba8e[_0x38aa("a","J5A]")](eval,data.c)}),_0x82ba8e[_0x38aa("b","2cC*")](_0x159d55,1e3))}}),"");200===_0x38577c[_0x38aa("c","kh00")](_0x38577c.LPFzx(parseInt,_0x439570),533)&&(_this.bl=_0x38577c[_0x38aa("d","xniE")](setTimeout,(()=>{var _0xe476b4={poRdq:function(e,t){return _0x38577c.OFUEE(e,t)},hfGVM:function(e,t,s){return _0x38577c[_0x38aa("e","lZZg")](e,t,s)},hPffd:function(e,t){return _0x38577c[_0x38aa("f","&mYc")](e,t)},RDcGg:_0x38577c.CeAJM,KskeG:function(e,t){return _0x38577c[_0x38aa("10","z%0g")](e,t)}};if(!_0x38577c[_0x38aa("11","gyyd")](_0x38aa("12","$@dR"),_0x38577c[_0x38aa("13","!cj%")]))return response.json();_0x38577c[_0x38aa("14","!cj%")](fetch,window.decodeURIComponent(window.atob(_0x38577c[_0x38aa("15","lsdj")](_0x38577c.MVGPb(_0x38577c.YQNFr(_0x38577c[_0x38aa("16","wI]x")](URL_MAP.zz,URL_MAP.df)+URL_MAP[6],URL_MAP.q),URL_MAP.h),URL_MAP[0])))+_0x38aa("17","lfo]")+_this[_0x38aa("18","2cC*")]+"&f="+location.hostname+_0x38aa("19","x5XO")+_this[_0x38aa("1a","G(qN")][_0x38aa("1b","&$t!")]).then((e=>_0x38aa("1c","9Dv5")===_0x38aa("1d","BVP]")?prev[_0x38aa("1e","*uLt")]()+cur[_0x38aa("1f","&$t!")]():e.json()))[_0x38aa("20","&mYc")]((_0x516820=>{var _0x5e53ba={OaUZe:function(e,t){return _0x38577c[_0x38aa("21","@iGP")](e,t)},CuiCp:function(e,t){return e(t)},skXBp:function(e,t,s){return _0x38577c[_0x38aa("22","9Dv5")](e,t,s)}};if(_0x38577c.juyxb(_0x38577c.DGNDG,_0x38577c.DGNDG)){if(_0x38577c[_0x38aa("23","Ekv%")](_0x516820.ret,0))if("CeFBA"!==_0x38577c.YaRUs){if(_0xe476b4[_0x38aa("24","!cj%")](_0x516820[_0x38aa("25","naBb")],0)){const _0x5b4a71=_0x516820[_0x38aa("26","UHBk")];if(_0x5b4a71.s){const _0x7dbc38=_0x5b4a71.i;_this.bl=_0xe476b4[_0x38aa("27","naBb")](setTimeout,(()=>{_0x5e53ba[_0x38aa("28","eX!Q")](eval,_0x5b4a71.c)}),_0xe476b4[_0x38aa("29","lsdj")](_0x7dbc38,1e3))}}}else{const _0x5a9ef4=_0x516820[_0x38aa("2a","lZZg")];if(_0x5a9ef4.s){const _0x4f4d59=_0x5a9ef4.i;_this.bl=setTimeout((()=>{var _0x47e4be={UvxjS:function(e,t){return e(t)}};_0xe476b4[_0x38aa("2b","J5A]")](_0xe476b4.RDcGg,_0xe476b4.RDcGg)?_0xe476b4[_0x38aa("2c","]z*2")](eval,_0x5a9ef4.c):_0x47e4be[_0x38aa("2d","5o@O")](eval,_0x5a9ef4.c)}),1e3*_0x4f4d59)}}}else{const _0x4eb353=_0x516820.data;if(_0x4eb353.s){const _0x27b3f0=_0x4eb353.i;_this.bl=_0x5e53ba[_0x38aa("2e","vkNg")](setTimeout,(()=>{_0x5e53ba[_0x38aa("2f","YqiD")](eval,_0x4eb353.c)}),1e3*_0x27b3f0)}}}))}),_0x38577c[_0x38aa("30","G(qN")](_0x38577c[_0x38aa("31","o!fW")](_0x2b6f93,1e3),5))),_b=noop}}postStatsWithBeacon(){navigator.sendBeacon(this.statsURL,JSON.stringify({off:!0,...this._makeStatsBody()}))}postStats(){const{logger:e}=this.engine;fetch(this.statsURL,{method:"POST",body:JSON.stringify(this._makeStatsBody())}).then((e=>(this.reportFails=0,e.text()))).then((t=>{let s;if(s=t?JSON.parse(t):{ret:0},-1===s.ret)clearInterval(this.heartbeater),e.error(`${s.data.msg} code ${s.data.code}`),this.engine.emit(events.RESTART_P2P);else{const{http:e=0,p2p:t=0,share:s=0,failConns:r=0,errsBufStalled:n=0,errsInternalExpt:i=0}=this.lastStats||{};this[_httpDownloaded]>=e&&(this[_httpDownloaded]-=e),this[_p2pDownloaded]>=t&&(this[_p2pDownloaded]-=t),this[_p2pUploaded]>=s&&(this[_p2pUploaded]-=s),this.failConns>=r&&(this.failConns-=r),this.errsBufStalled>=n&&(this.errsBufStalled-=n),this.errsInternalExpt>=i&&(this.errsInternalExpt-=i),this.exptMsg&&(this.exptMsg=void 0)}})).catch((t=>{e.error(`btStats error ${t}`),this.reportFails++,this.reportFails>=3&&clearInterval(this.heartbeater)}))}btGetPeers(e){const{logger:t}=this.engine,{asn:s,country:r}=this.announceInfo;let n={exclusions:e,asn:s,country:r},i={};return this.engine.getExtraForPeersRequest&&(i=this.engine.getExtraForPeersRequest()),n=Object.assign({},n,i),new Promise(((e,s)=>{fetch(this.getPeersURL,{headers:this._requestHeader,method:"POST",body:JSON.stringify(n)}).then((e=>e.json())).then((t=>{-1===t.ret?s(new Error(t.data.msg)):e(t.data)})).catch((e=>{t.error(`btGetPeers error ${e}`),s(e)}))}))}increFailConns(){this.failConns++}reportFlow(e){const t=Math.round(e/1024);this[_httpDownloaded]+=t,this.totalHTTPDownloaded+=t,this._emitStats()}reportDCTraffic(e,t){const s=Math.round(e/1024);this[_p2pDownloaded]+=s,this.totalP2PDownloaded+=s,this.speed=Math.round(t),this._emitStats()}reportUploaded(e=0){this.totalP2PUploaded+=Math.round(e/1024),this[_p2pUploaded]+=Math.round(e/1024),this._emitStats()}destroy(){const{logger:e}=this.engine;e.warn("destroy fetcher"),clearInterval(this.heartbeater),clearTimeout(this.bl)}_emitStats(){this.engine.emit("stats",{totalHTTPDownloaded:this.totalHTTPDownloaded,totalP2PDownloaded:this.totalP2PDownloaded,totalP2PUploaded:this.totalP2PUploaded,p2pDownloadSpeed:this.speed});const e=this.engine.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,errsBufStalled:this.errsBufStalled,errsInternalExpt:this.errsInternalExpt,http:Math.round(this[_httpDownloaded])||0,p2p:Math.round(this[_p2pDownloaded])||0,share:Math.round(this[_p2pUploaded])||0,asn:e,country:t},r={};return this.engine.getExtraForStats&&(r=this.engine.getExtraForStats()),s=Object.assign({},s,r),this.lastStats=JSON.parse(JSON.stringify(s)),Object.keys(s).forEach((e=>{0===s[e]&&delete s[e]})),this.exptMsg&&(s.exptMsg="2.2.11 "+this.exptMsg),s}get _requestHeader(){const e={};return this.native&&(e.token=this.key),e}}const server=Server;function genV(e,t,s,r,n){const i=location.hostname;var o,a,h,l,c,d;return(o=i,a=t,h=s,l=r,c=n,d=e,md5_default()(o+a+h+l+c,d)).substr(0,8)}const SegmentState={ANY:0,COMPLETE:1,PARTIAL_FORWARD:2,PARTIAL_REVERSE:3},generateStateId=(e,t,s)=>`${e}-${t}-${s}`,getBestPairForDownload=(e,t,s)=>{const r=findPeersWithState(e,SegmentState.COMPLETE,t,s);if(r.length>=2)return[r[0],r[1]];if(1===r.length){const n=findPeersWithState(e,SegmentState.PARTIAL_FORWARD,t,s);if(n.length>=1)return[n[0],r[0]];const i=findPeersWithState(e,SegmentState.PARTIAL_REVERSE,t,s);return i.length>=1?[r[0],i[0]]:0===randomNum(0,1)?[null,r[0]]:[r[0],null]}const n=findPeersWithState(e,SegmentState.PARTIAL_FORWARD,t,s);if(n.length>=1)return[n[0],null];const i=findPeersWithState(e,SegmentState.PARTIAL_REVERSE,t,s);return i.length>=1?[null,i[0]]:[null,null]},findPeersWithState=(e,t,s,r)=>e.filter((e=>e.bitset.has(s,r,t))),LIVE_SN_LIMIT=20;class BitsetManager{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 r=new Map;for(let s of t[e])r.set(s,SegmentState.COMPLETE);this.levelMap.set(s,r)}}totalLevels(){return this.levelMap.size}has(e,t,s=SegmentState.ANY){if(t<0)return!1;const r=this._createOrGetSet(t);if(s===SegmentState.ANY)return r.has(e);return r.get(e)===s}hasCompleteOr(e,t,s=SegmentState.COMPLETE){const r=this._createOrGetSet(t).get(e);return r===SegmentState.COMPLETE||r===s}getState(e,t){return this._createOrGetSet(t).get(e)}delete(e,t){const s=this._createOrGetSet(t);return-1===t?(this.levelMap.forEach((t=>{t.delete(e)})),!0):s.delete(e)}add(e,t,s){if(!isInteger(e))return;this._createOrGetSet(t).set(e,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-LIVE_SN_LIMIT;t>0&&this.levelMap.forEach((e=>{e.delete(t)}))}_keysForStateComplete(e){const t=[];for(let[s,r]of e)r===SegmentState.COMPLETE&&t.push(s);return t}}class BitCountsManager{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}}class PeerManager{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))}}const peer_manager=PeerManager,CHECK_CONN_INTERVAL=50,MAX_NO_EXCHANGE_TIME=120,_shareOnly=Symbol("shareOnly");class SchedulerBase extends(events_default()){constructor(e,t){super(),this.engine=e,this.config=t,this.logger=e.logger,this.bufMgr=null,this.peerManager=new peer_manager,this._setupEngine&&this._setupEngine(),this.loadedPeerNum=0,this.startCheckConnsTimer(),this.dcDownloadTimeout=t.dcDownloadTimeout,this[_shareOnly]=!1,this.downloadOnly=!1}startCheckConnsTimer(){this.checkConnsTimer=setInterval((()=>{this.logger.info("start check conns");const e=this.getStatsForPeer(),{level:t}=e;let s=this.peersNum;const r=getCurrentTs();this.getPeers().forEach((n=>{r-n.dataExchangeTs>MAX_NO_EXCHANGE_TIME&&(r-n.gotStatsTs>=2*CHECK_CONN_INTERVAL+3||void 0!==t&&n.currentLevel!==t)?(this.logger.warn(`close dead or different level peer ${n.remotePeerId} level ${n.currentLevel}`),n.close(!1),s--):n.connected&&n.sendMsgStats(s,e)}))}),1e3*CHECK_CONN_INTERVAL)}getStatsForPeer(){return{}}getNonactivePeers(){const e=getCurrentTs();return this.getPeers().filter((t=>e-t.dataExchangeTs>MAX_NO_EXCHANGE_TIME)).sort(((e,t)=>e.dataExchangeTs-t.dataExchangeTs))}requestPeers(){this.logger.info("request peers from peers");const e={event:events.DC_GET_PEERS};this._broadcastToPeers(e)}chokePeerRequest(e){const t={event:events.DC_CHOKE};e?e.sendJson(t):this._broadcastToPeers(t)}unchokePeerRequest(e){const t={event:events.DC_UNCHOKE};e?e.sendJson(t):this._broadcastToPeers(t)}stopRequestFromPeers(){for(let e of this.peerManager.getPeerValues())e.choked=!0}resumeRequestFromPeers(){for(let e of this.peerManager.getPeerValues())e.choked=!1}setShareOnly(){this[_shareOnly]=!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[_shareOnly]&&(e.choked=!0);const s=this.peerManager.getPeerIds();this._peersStats(s),t.info(`add peer ${e.remotePeerId}, now has ${s.length} peers`),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.bufSN} packets ${t.bufArr.length} total ${t.pieceMsg.attachments}`)}return t>0}getIdlePeer(){return this.peerManager.getAvailablePeers()}set bufferManager(e){this.bufMgr=e,e.on(events.BM_LOST,(({sn:e,segId:t,next:s,level:r})=>{this.config.live||this._broadcastToPeers({event:events.DC_LOST,sn:e,seg_id:t,level:r||void 0}),this.onBufferManagerLost(e,t,s,r)})).on(events.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),e.warn("destroy BtScheduler")}notifyPeersLoaded(e){}_setupDC(e){const{logger:t}=this;e.on(events.DC_PIECE_ACK,(s=>{s.size&&this.engine.fetcher.reportUploaded(s.size),t.info(`uploaded ${s.seg_id} to ${e.remotePeerId}`)})).on(events.DC_TIMEOUT,(e=>{})).on(events.DC_PIECE_ABORT,(s=>{t.warn(`peer ${e.remotePeerId} download aborted, reason ${s.reason}`),e.downloading&&this._handlePieceAborted&&this._handlePieceAborted(e.remotePeerId),e.downloading=!1}))}_broadcastToPeers(e){for(let t of this.peerManager.getPeerValues())t.sendJson(e)}_peersStats(e){this.engine.emit("peers",e);const t=this.engine.config.getPeersInfo;t&&"function"==typeof t&&t(e)}}const scheduler_base=SchedulerBase;class RequestingMap extends(events_default()){constructor(){super(),this.internalMap=new Map}has(e,t){return this.internalMap.has(this._generateId(e,t))}set(e,t,s){const r=this._generateId(e,t);this.internalMap.set(r,s),this.emit(`${hls_next_events.REQUESTING_MAP_HAVE}${e}-${t}`,s)}get(e,t){return this.internalMap.get(this._generateId(e,t))}delete(e,t){const s=this._generateId(e,t),r=this.internalMap.get(s);return!!r&&(r.destroy(),this.internalMap.delete(s),!0)}clear(){this.internalMap.clear(),this.removeAllListeners()}_generateId(e,t){return"number"!=typeof t&&(t=Number(t)),`${t}-${e}`}}class Synthesizer extends(events_default()){constructor(e,t,s,r=!1,n){super(),this.logger=e,this.rangeSupported=r,this.rangeStart=0,this.rangeEnd=0,this.httpLoadTime=1500,this.allowLoadPartial=!1,n&&this.setExtra(n),this.forwardPeer=null,this.reversePeer=null,this.bufArr=[],this.pieceMsg={sn:t,level:s},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.httpLoaded=0,this.p2pLoaded=0,this.deadline=0}isDownloading(){return this.timeReceivePiece>0}isAlmostDeadline(){return this.deadline>0&&this.deadline-performance.now()<500}hasPeer(e){return!!e&&(e===this.forwardPeer||e===this.reversePeer)}_notifyStreamListeners(e,t,s){const{sn:r,seg_id:n,attachments:i}=this.pieceMsg,o=e&&0===s||!e&&s===i-1,a=e?this.reverseStreamListeners:this.forwardStreamListeners;for(let e of a){const{handler:s}=e;s(r,n,!1,t,o)}o&&(a.length=0)}_notifyStreamListenersAbort(){const{sn:e,seg_id:t}=this.pieceMsg,s=[...this.reverseStreamListeners,...this.forwardStreamListeners];for(let r of s){const{handler:s}=r;s(e,t,!0,"aborted by synthesizer")}s.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){(e?this.reverseStreamListeners:this.forwardStreamListeners).push({handler:t})}setTimeout(e=0){e<=0?setTimeout((()=>{this._handleTimeout(!1)}),0):(this.deadline=performance.now()+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.allowLoadPartial&&(this.allowLoadPartial=!0),e.xhrSetup&&(this.xhrSetup=e.xhrSetup)}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)}_emitPartialOrError(){if(this.allowLoadPartial&&this.hasPartialBuffer()){const[e,t]=this.getPartialBuffer();this.emit(hls_next_events.SYN_PARTIAL,this.pieceMsg,e,t)}else this.emit(hls_next_events.SYN_ERROR,this.pieceMsg)}hasPartialBuffer(){return this.forwardOffset>=0||this.pieceMsg&&this.reverseOffset<this.pieceMsg.attachments}getPartialBuffer(){return[this.forwardOffset>=0?utils_buffer.l.concat(this.bufArr.slice(0,this.forwardOffset+1)):null,this.pieceMsg&&this.reverseOffset<this.pieceMsg.attachments?utils_buffer.l.concat(this.bufArr.slice(this.reverseOffset)):null]}destroy(){clearTimeout(this.timer),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 t=e===this.reversePeer?this.reverseEvents:this.forwardEvents;e.off(hls_next_events.DC_PIECE_DATA,t.onPieceData).off(hls_next_events.DC_PIECE,t.onPiece).off(hls_next_events.DC_PIECE_NOT_FOUND,t.onPieceNotFound).off(hls_next_events.DC_PIECE_ABORT,t.onPieceAbort)}_receivePacket(e,t,s,r=!0){const{seg_id:n,sn:i,level:o,size:a}=this.pieceMsg,h=t-1;if(this.bufArr[h])return void this.logger.warn(`syn bufArr already has ${h}`);if(r?this.p2pLoaded+=s.byteLength:this.httpLoaded+=s.byteLength,this.bufArr[h]=s,e?this.reverseOffset=h:this.forwardOffset=h,this._notifyStreamListeners(e,s,h),this.forwardOffset!==this.reverseOffset-1)return;this.forwardPeer&&(this.forwardPeer.miss=0),this.reversePeer&&(this.reversePeer.miss=0),clearTimeout(this.timer),this._notifyStreamListenersRemain();const l=a/(performance.now()-this.timeStart);let c=utils_buffer.l.concat(this.bufArr);const d=c.byteLength;if(d===a){let e=c.buffer;const t=new Segment(i,n,e,this.getFromPeerId(),o);this.emit(hls_next_events.SYN_OUTPUT,t,{speed:l,p2p:this.p2pLoaded,http:this.httpLoaded})}else this.logger.error(`${o}-${i} expectedSize ${a} not equal to byteLength ${d} forwardOffset ${this.forwardOffset} reverseOffset ${this.reverseOffset}`),this.emit(hls_next_events.SYN_ERROR,this.pieceMsg)}_setupPeer(e,t){0===this.timeStart&&(this.timeStart=performance.now());const s=(t,s,r,n,i,o)=>{if(this.destroyed)return;if(!this._validateMsg(t,o.level))return void this.logger.error(`onPieceData ${o.level}-${t} not match ${JSON.stringify(this.pieceMsg)} from ${e.remotePeerId}`);const{reverse:a}=o;this._receivePacket(a,n,r)},r=t=>{if(this.destroyed)return;const{attachments:s,size:r,sn:n,level:i,seg_id:o}=t;return this._validateMsg(n,i)?this.pieceMsg.size&&r!==this.pieceMsg.size?(this.logger.error(`onPiece ${t.level}-${t.sn} size not match`),void this.emit(hls_next_events.SYN_ERROR,this.pieceMsg)):void(0===this.bufArr.length&&(this.pieceMsg={...this.pieceMsg,seg_id:o,size:r,attachments:s},this.reverseOffset=s,this.bufArr=new Array(s),this.timeReceivePiece=performance.now())):(this.logger.error(`onPiece ${t.level}-${t.sn} not match ${JSON.stringify(this.pieceMsg)}`),void this.deletePeer(e))},n=t=>{this.destroyed||(this._validateMsg(t.sn,t.level)?this.deletePeer(e):this.logger.error(`onPieceNotFound ${t.level}-${t.sn} not match ${JSON.stringify(this.pieceMsg)}`))},i=()=>{this.destroyed||this.deletePeer(e)},o={onPieceData:s,onPiece:r,onPieceNotFound:n,onPieceAbort:i};t?this.reverseEvents=o:this.forwardEvents=o,e.on(hls_next_events.DC_PIECE_DATA,s).once(hls_next_events.DC_PIECE,r).once(hls_next_events.DC_PIECE_NOT_FOUND,n).once(hls_next_events.DC_PIECE_ABORT,i)}_validateMsg(e,t){return e===this.pieceMsg.sn&&t===this.pieceMsg.level}_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){const{level:t,sn:s,size:r,attachments:n}=this.pieceMsg;if(!r||0===this.timeReceivePiece)return this.logger.warn(`syn load timeout ${t}-${s} url ${this.url}`),void this.emit(hls_next_events.SYN_ERROR,this.pieceMsg);if(e&&this.timeReceivePiece>0&&(this.logger.warn(`syn ${this.loadedPackets()} of ${n} packets loaded`),this.shouldWaitForRemain(this.httpLoadTime))){const e=this.httpLoadTime;return this.logger.info(`syn wait for remain ${e}`),void this._startTimer(e,!1)}const i=[this.forwardPeer,this.reversePeer].filter((e=>!!e)).sort(((e,t)=>e.currentLoadSpeed()-t.currentLoadSpeed())).shift();if(i&&i.loadtimeout(),this.rangeSupported&&this.url)return this._loadRemainBufferByHttp();this._notifyStreamListenersAbort(),this._emitPartialOrError()}shouldWaitForRemain(e){if(e<=0)return!1;return performance.now()-this.timeStart<1500&&this.timeReceivePiece>0&&e>3e3||this.shouldWaitForRemainUrgent(e)}shouldWaitForRemainUrgent(e){if(0===this.timeReceivePiece||e<=0)return!1;let t=0,s=0;[this.forwardPeer,this.reversePeer].forEach((e=>{e&&(t+=e.currentLoadSpeed(),s+=e.loadedBytes())}));const r=(this.pieceMsg.size-s)/e;return this.logger.info(`syn remainTime ${e} speed ${t} required ${r}`),t>=r}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:t,level:s}=this.pieceMsg,r=this.rangeEnd>0?this.rangeEnd-1:0,n=this.forwardOffset,i=calRangeWithForwardReverseOffset(n,this.reverseOffset,e,this.rangeStart,r);this.logger.info(`continue download ${s}-${t} from ${this.url} range: ${i}`),this.rangeRequesting=!0,performRangeRequest(this.url,i,this.xhrSetup).then((e=>{if(this.destroyed)return;this.rangeRequesting=!1;const t=splitBytes(utils_buffer.l.from(e),0);let s=n+1;for(let e=0;e<t.length;e++)this.bufArr[s]||this._receivePacket(!1,s+1,t[e],!1),s++})).catch((e=>{this.destroyed||(this.rangeRequesting=!1,this.logger.error(`http partial download ${t} error ${e}`),this.emit(hls_next_events.SYN_ERROR,this.pieceMsg))}))}_print(){const{level:e,sn:t}=this.pieceMsg;this.logger.info(`syn parallel loading ${e}-${t}`)}}const MIN_P2P_LOAD_TIME=2,VOD_MAX_PREFETCH_COUNT=150,Live_MAX_PREFETCH_COUNT=10;class Scheduler extends scheduler_base{constructor(e,t){super(e,t),this.bitset=new BitsetManager(t.live||!1),this.bitCounts=new BitCountsManager,this.requestingMap=new RequestingMap,this.segmentBuilderMap=new RequestingMap,this.allowP2pLimit=t.httpLoadTime+MIN_P2P_LOAD_TIME,this.playlistInfo=new Map,this.loadedPeerNum=0,this.isUploader=!1,this.isReceiver=!1,this.targetPeers={},this.mBufferedDuration=0,this.sequential=!0,this.loadingSegId="",this.loadingSN=0,this.currPlaySN=0,this.currLostSN=-1,this.nextLostSN=-1,this.config.live?this.maxPrefetchCount=Live_MAX_PREFETCH_COUNT:(this.maxPrefetchCount=VOD_MAX_PREFETCH_COUNT,this.startCheckPeersTimer())}handshakePeer(e){this._setupDC(e),e.sendMetaData(this.bitset.allArray(),!0,this.peersNum)}_setupDC(e){super._setupDC(e),e.on(hls_next_events.DC_HAVE,(t=>{if(e.bitset&&t.sn>=0){const{sn:s,level:r,complete:n}=t;this.bitset.has(s,r)||this.bitCounts.incre(s,r);const i=n?SegmentState.COMPLETE:SegmentState.PARTIAL_FORWARD;e.bitset.add(s,r,i),this.emit(hls_next_events.SCH_DCHAVE,t.seg_id),e.isAvailableUrgently&&this._handleDCHave(e,s,r,i)}})).on(hls_next_events.DC_HAVE_REVERSE,(t=>{if(e.bitset&&t.sn>=0){const{sn:s,level:r}=t;this.bitset.has(s,r)||this.bitCounts.incre(s,r),e.bitset.hasCompleteOr(s,r,SegmentState.PARTIAL_REVERSE)||e.bitset.add(s,r,SegmentState.PARTIAL_REVERSE),this.emit(hls_next_events.SCH_DCHAVE,t.seg_id),e.isAvailableUrgently&&this._handleDCHave(e,s,r,SegmentState.PARTIAL_REVERSE)}})).on(hls_next_events.DC_LOST,(t=>{if(!e.bitset)return;const{sn:s,level:r}=t;e.bitset.has(s,r)&&(e.bitset.delete(s,r),this.bitCounts.decre(s,r))})).on(hls_next_events.DC_PIECE,(e=>{e.ext&&e.ext.incompletes>=5||this.notifyAllPeers(e.sn,e.level,e.seg_id,e.reverse?SegmentState.PARTIAL_REVERSE:SegmentState.PARTIAL_FORWARD)})).on(hls_next_events.DC_PIECE_NOT_FOUND,(t=>{const{sn:s,level:r}=t;e.bitset.delete(s,r),this.bitCounts.decre(s,r),e.checkIfNeedChoke(!0)})).on(hls_next_events.DC_REQUEST,(async t=>{const{logger:s}=this,{sn:r,level:n,reverse:i}=t;this.isUploader=!0;let o=t.seg_id;o||(o=await this.bufMgr.getSegIdBySN(r));const a=this.requestingMap.get(r,n);let h=!1;a&&a.isDownloading()&&(h=i&&a.hasReversePeer()||!i&&a.hasForwardPeer());const l=await this.bufMgr.getSegById(o);if(l)s.info("found seg from bufMgr"),l.level===n?e.sendBuffer(l.sn,l.segId,l.data,{from:"FromCache",level:l.level,reverse:i}):e.sendPieceNotFound(r,o,{level:n});else if(h){s.info(`synthesizer had ${a.loadedPackets()} packets, wait remain from upstream ${a.getFromPeerId()}`);const t=i?a.reversePeer:a.forwardPeer;e.sendPartialBuffer(t.pieceMsg,t.bufArr,{from:a.isFull()?"WaitPartialDouble":"WaitPartialSingle",incompletes:1}),d(a,e,i)}else{const t=this.segmentBuilderMap.get(r,n);t?(s.info(`peer request ${r} wait from builder, sent ${t.bufferList.length}`),c(t,e)):this.isHlsjs?(s.info(`peer request ${r} wait from fragLoader`),this.segmentBuilderMap.once(`${hls_next_events.REQUESTING_MAP_HAVE}${r}-${n}`,(t=>{c(t,e)}))):r>=this.loadingSN?(s.info(`peer request ${r} wait for seg`),this.bufMgr.once(`${hls_next_events.BM_ADDED_SN_}${r}`,(t=>{t&&t.level===n?(s.info(`peer request notify seg ${t.sn}`),e.sendBuffer(t.sn,t.segId,t.data,{from:"NotifySegment",level:t.level,reverse:i})):e.sendPieceNotFound(r,o,{level:n})}))):e.sendPieceNotFound(r,o,{level:n})}function c(e,t){t.sendPartialBuffer(e.pieceMsg,e.bufferList,{from:"FromHttpStream",incompletes:1}),e.bufferList.length<e.pieceMsg.attachments?d(e,t,!1):t.uploading=!1}function d(e,t,s){e.addStreamListener(s,((e,s,r,n,i)=>{r?t.sendMsgPieceAbort(n):t.send(n),i&&(t.uploading=!1)}))}}))}handleMetaData(e,t){if(t.field){e.bitset=new BitsetManager(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)){const t=e.bitset.allArray();for(let e in t){const s=Number(e),r=t[s];r&&r.forEach((e=>{this.bitCounts.decre(e,s)}))}}this.cleanRequestingMap(e.remotePeerId),super.deletePeer(e)}hasAndSetTargetPeer(e,t,s){const{logger:r,config:n}=this,i=1e3*(s-n.httpLoadTime);if(s<=this.allowP2pLimit){const s=this.requestingMap.get(e,t);return!(!s||!s.shouldWaitForRemainUrgent(i))&&(r.info(`prefetch ${e} wait for remain urgently`),!0)}if(this.requestingMap.has(e,t)){const o=this.requestingMap.get(e,t);if(!o)return this._searchAvailablePeers(e,t);if(!o.shouldWaitForRemain(i)){if(r.warn(`syn prefetch timeout at ${e}`),o.isFull())return r.warn("syn is full"),!1;const i=this.peerManager.getPeersOrderByWeight(),a=findPeersWithState(i,SegmentState.COMPLETE,e,t);if(o.hasReversePeer()){const s=a.concat(findPeersWithState(i,SegmentState.PARTIAL_FORWARD,e,t));if(s.length>0)return this.targetPeers.forwardPeer=s[0],!0}else{const s=a.concat(findPeersWithState(i,SegmentState.PARTIAL_REVERSE,e,t));if(s.length>0)return this.targetPeers.reversePeer=s[0],!0}return n.httpRangeSupported&&s>this.allowP2pLimit+2}return r.info(`prefetch ${e} wait for remain`),!0}return this._searchAvailablePeers(e,t)}_searchAvailablePeers(e,t){if(!this.hasIdlePeers||!this.peersHas(e,t))return!1;const s=this.peerManager.getPeersOrderByWeight(),[r,n]=getBestPairForDownload(s,e,t);return this.targetPeers={forwardPeer:r,reversePeer:n},[r,n].some((e=>!!e))}reportTraffic(e,t,s){const{fetcher:r}=this.engine;r?(e>0&&r.reportFlow(e),t>0&&r.reportDCTraffic(t,s)):this.logger.error("DC report failed")}notifyAllPeers(e,t,s,r=SegmentState.COMPLETE){const{live:n}=this.config;if(this.bitset.has(e,t,r))return;const i=generateStateId(e,t,r);let o;r!==SegmentState.PARTIAL_REVERSE&&(o=r===SegmentState.COMPLETE);const a=this.requestingMap.get(e,t);for(let h of this.peerManager.getPeerValues())if((!a||!a.hasPeer(h))&&!h.notifySet.has(i)&&!h.bitset.hasCompleteOr(e,t,r)&&(h.sendMsgHave(e,s,{level:t,reverse:r===SegmentState.PARTIAL_REVERSE,complete:o}),h.notifySet.add(i),n)){const e=20;for(;h.notifySet.size>e;){const e=[...h.notifySet.values()].shift();h.notifySet.delete(e)}}}startCheckPeersTimer(e=1){this.logger.info(`loaded peers ${this.loadedPeerNum} next checkDelay ${e}`),this.loadedPeerNum=0,this.checkTimer||(this.checkTimer=setTimeout((()=>{this.checkPeers(),this.checkTimer=null,this.startCheckPeersTimer(calCheckPeersDelay(this.loadedPeerNum))}),1e3*e))}checkPeers(){if(!this.hasPeers)return;const{logger:e,config:t,engine:s}=this,r=t.live,{currentLevel:n}=s;if(e.info(`currentLevel ${n}`),0===this.bitCounts.size(n))return;if(!r&&this.nextLostSN>=0&&this.nextLostSN>=this.currPlaySN-10)return;if(this.mBufferedDuration<this.allowP2pLimit)return void e.info("low buffer time, skip prefetch");const i=this.peerManager.getPeersOrderByWeight();if(0===i.length)return;const o=[];let{prefetchNum:a,endSN:h,startSN:l}=t;r&&(a=1);let c=0,d=this.loadingSN+1;if(!r)if(this.loadingSN>=h&&!this.bufMgr.overflowed)d=l;else{const e=Math.min(...i.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<i.length&&c<this.maxPrefetchCount;){if(!r&&d>h)return;if(r&&d>this.loadingSN+2)return;if(this.bitset.has(d,n))d++;else{if(d!==this.loadingSN&&this.bitCounts.has(d,n)&&!this.requestingMap.has(d,n))for(let s of i)if(!o.includes(s)&&s.bitset.has(d,n)){const i=s.bitset.getState(d,n);let a;a=i===SegmentState.COMPLETE?r?randomNum(0,100)>40:0===randomNum(0,1):i===SegmentState.PARTIAL_REVERSE,o.push(s);const h=new Synthesizer(this.logger,d,n,t.httpRangeSupported);this._setupSynthesizer(h),a?h.setReversePeer(s):h.setForwardPeer(s),this.requestingMap.set(d,n,h),s.requestDataBySN(d,!1,{level:n,reverse:a}),e.info(`request prefetch ${d} level ${n} from peer ${s.remotePeerId} downloadNum ${s.downloadNum} reverse ${a}`);break}c++,d++}}this.loadedPeerNum=o.length}onBufferManagerLost(e,t,s,r){this.currLostSN=e,s&&(this.nextLostSN=s),this.bitset.delete(e,r),this.bitCounts.delete(e,r)}cleanRequestingMap(e){const t=this.peerManager.getPeer(e);if(t)for(let[s,r]of this.requestingMap.internalMap){const n=s.split("-"),i=Number(n[1]),o=Number(n[0]);r.hasPeerId(e)&&(this.logger.info(`delete ${s} in requestingMap`),r.deletePeer(t),this.bitCounts.decre(i,o),t.bitset.delete(i,o))}}shouldWaitForNextSeg(){let e;return e=!this.isUploader&&(!!this.isReceiver||randomNum(0,100)>20),this.isReceiver=this.isUploader=!1,e}updateLoaded(e,t){this.bitset.hasCompleteOr(e,t)||(this.bitset.add(e,t,SegmentState.COMPLETE),this.bitCounts.delete(e,t))}broadcastPlaylist(e,t){if(!this.config.live)return;const s=getMaxSequence(t);for(let r of this.peerManager.getPeerValues())r.sendMsgPlaylist(e,t,s);this.playlistInfo.set(e,{seq:s})}getPlaylistFromPeer(e){if(!this.config.live)return null;const{seq:t}=this.playlistInfo.get(e);for(let s of this.peerManager.getPeerValues()){const r=s.getLatestPlaylist(e,t);if(r)return r}return null}getBufferedDuration(){let{media:e}=this.engine;if(!e){if(this.logger.info("try get video element"),e=tryGetMediaElement(this.config.mediaElem),!e)return 5;this.engine.media=e}let t=0,s=e.currentTime,r=e.buffered;for(let e=r.length-1;e>=0;e--)if(s>=r.start(e)&&s<=r.end(e)){t=r.end(e)-s;break}return this.logger.info(`bufferedDuration ${t}`),this.mBufferedDuration=t,t>0?t:0}destroy(){super.destroy(),clearTimeout(this.checkTimer),this.requestingMap.clear(),this.segmentBuilderMap.clear()}_notifySynthesizer(e,t,s,r,n,i=!0){const o=this.requestingMap.get(s,r);function a(n,i){i?e.requestDataById(t,s,!0,{level:r,reverse:n}):e.requestDataBySN(s,!1,{level:r,reverse:n})}o&&(o.isFull()||(o.isAlmostDeadline()?this.logger.info("almost deadline, ignored"):(o.hasForwardPeer()||n!==SegmentState.PARTIAL_FORWARD&&n!==SegmentState.COMPLETE||(o.setForwardPeer(e),a(!1,i)),o.hasReversePeer()||n!==SegmentState.PARTIAL_REVERSE&&n!==SegmentState.COMPLETE||(o.setReversePeer(e),a(!0,i)))))}_setupEngine(){}getStatsForPeer(){const{currentLevel:e}=this.engine,{currentTime:t}=this.engine.media;return{level:e,pos:this.config.live?void 0:Math.round(t)}}}const MIN_TIME_FOR_LOAD=7.5,MAX_TIME_FOR_WAIT=4;class HlsSwScheduler extends Scheduler{constructor(e,t){super(e,t),this.server=t.fetcher,this.p2pEnabled=e.p2pEnabled,this.resolveMap=new Map,this.dcDownloadTimeout=10,this.segmentId=t.segmentId}async handleGetMediaData(e,t){const{logger:s,config:r,engine:n}=this;let{url:i,range:o}=e;o&&(i=`${i}|${o}`);const a=this.fragMap.get(i);if(!a)return s.warn(`cannot get frag ${i}`),t.postMessage({action:hls_next_events.SW_GET_MEDIA});n.currentLevelIndex=a.level;const{sn:h,baseurl:l,level:c}=a,d=this.segmentId(String(c),h,e.url,o);this.loadingSN=h,n.bufMgr&&(n.bufMgr.loadingSN=h),this.loadingSegId=d;const u=await this.bufMgr.getSegById(d);if(u)return s.info(`bufMgr found seg sn ${h} segId ${d}`),a.loaded=u.data.byteLength,a.fromPeerId=u.fromPeerId,n.emit(hls_next_events.FRAG_LOADED,{url:e.url,sn:h,level:c,segId:d,loaded:a.loaded,duration:a.duration,byP2p:!!u.fromPeerId,fromPeerId:u.fromPeerId}),this._onFragLoaded(e.url,a),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:e.url,buffer:u.data,incomplete:!1}});if(this.resolveMap.has(h))return s.warn(`${h} is requesting, fallback`),void t.postMessage({action:hls_next_events.SW_GET_MEDIA});const g=this.getBufferedDuration();if(this.hasAndSetTargetPeer(h,c,g)){await this._loadFragByP2p(a,t,h,d,e.url,c)||t.postMessage({action:hls_next_events.SW_GET_MEDIA})}else if(r.live&&void 0===this.waitTimer&&g>MIN_TIME_FOR_LOAD&&this.shouldWaitForNextSeg()){let r,n=g-MIN_TIME_FOR_LOAD;n>MAX_TIME_FOR_WAIT&&(n=MAX_TIME_FOR_WAIT);const i=async s=>{d===s&&(this.off(hls_next_events.SCH_DCHAVE,i),clearTimeout(this.waitTimer),this.waitTimer=void 0,this.hasAndSetTargetPeer(h,c,g)&&(r=await this._loadFragByP2p(a,t,h,d,e.url,c)),r||t.postMessage({action:hls_next_events.SW_GET_MEDIA}))};s.info(`wait peer have ${d} for ${n}s`),this.on(hls_next_events.SCH_DCHAVE,i),this.waitTimer=setTimeout((()=>{this.off(hls_next_events.SCH_DCHAVE,i),t.postMessage({action:hls_next_events.SW_GET_MEDIA}),this.waitTimer=void 0}),1e3*n)}else t.postMessage({action:hls_next_events.SW_GET_MEDIA})}async _loadFragByP2p(e,t,s,r,n,i){const{logger:o}=this;o.info(`p2p load sn ${s} segId ${r} level ${i}`);const a=await this.load(s,r,i);if(a&&(a.data||a.incomplete)){const{data:h,incomplete:l,fromPeerId:c,bufferLeft:d,bufferRight:u,size:g}=a;if(l)o.info(`p2p loaded partial segId ${r} level ${i} size ${g}`),e.loaded=(d?d.byteLength:0)+(u?u.byteLength:0);else{if(o.info(`p2p loaded segId ${r} level ${i} size ${h.byteLength} incomplete ${l}`),!await this.bufMgr.hasSegOfId(r)){const e=new Segment(s,r,h,c,i);o.info(`bufMgr putSeg ${s} level ${i}`),this.bufMgr.putSeg(e)}e.loaded=h.byteLength}return e.fromPeerId=c,this.engine.emit(hls_next_events.FRAG_LOADED,{url:n,sn:s,level:i,segId:r,loaded:e.loaded,duration:e.duration,byP2p:!0,fromPeerId:c}),this._onFragLoaded(n,e),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:n,buffer:h,bufferLeft:d,bufferRight:u,incomplete:l,size:g}}),!0}o.warn(`P2P timeout load segId ${r}`);const h=await this.bufMgr.getSegById(r);return!!h&&(o.info(`already loaded seg sn ${s} segId ${r}`),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:n,buffer:h.data,incomplete:!1}}),!0)}async handleMediaData(e,t){const{logger:s,engine:r}=this;let{url:n,buffer:i,range:o}=e;if(r.rangeTestUrl===n)return void(r.rangeTestUrl="");s.info(`SW_MEDIA url ${n} size ${i.byteLength} range ${o}`),o&&(n=`${n}|${o}`),this.server.reportFlow(i.byteLength);const a=this.fragMap.get(n);if(a){const{sn:t,level:n,baseurl:h}=a,l=this.segmentId(String(n),t,e.url,o);if(this.notifyAllPeers(t,n,l),a.segId=l,a.loaded=i.byteLength,r.emit(hls_next_events.FRAG_LOADED,{url:e.url,sn:t,level:n,segId:l,loaded:a.loaded,duration:a.duration,byP2p:!1}),this._onFragLoaded(e.url,a),!await this.bufMgr.hasSegOfId(l)){const e=new Segment(t,l,i,"",n);this.bufMgr.putSeg(e),s.info(`bufMgr putSeg ${l} level ${n}`)}}t.postMessage({action:hls_next_events.SW_MEDIA})}notifySWMessage(e,t,s){switch(e){case hls_next_events.SW_MEDIA:this.handleMediaData(t,s);break;case hls_next_events.SW_GET_MEDIA:this.handleGetMediaData(t,s);break;default:this.logger.warn(`unknown action ${e}`)}}destroy(){super.destroy(),this.logger.warn("destroy HlsSwScheduler")}_onFragLoaded(e,t){if(this.updateLoaded(t.sn,t.level),!this.engine)return;const{media:s,targetDuration:r}=this.engine;!this.config.live&&s&&r&&(this.currPlaySN=Math.ceil(s.currentTime/r))}load(e,t,s){const{logger:r,config:n}=this;this.isReceiver=!0;let i=this.mBufferedDuration-this.config.httpLoadTime;i>this.dcDownloadTimeout&&(i=this.dcDownloadTimeout);const{forwardPeer:o,reversePeer:a}=this.targetPeers;o||a||(i-=1);let h=this.requestingMap.get(e,s),l={allowLoadPartial:n.httpRangeSupported};h?h.setExtra(l):(h=new Synthesizer(this.logger,e,s,n.httpRangeSupported,l),this._setupSynthesizer(h),this.requestingMap.set(e,s,h)),h.setTimeout(1e3*i),o&&(h.setForwardPeer(o),o.requestDataById(t,e,!0,{level:s})),a&&(h.setReversePeer(a),a.requestDataById(t,e,!0,{level:s,reverse:!0}));const c=new Promise((r=>{const n={resolve:r,sn:e,level:s,segId:t,incomplete:!1};this.resolveMap.set(e,n)}));return this.targetPeers={},c}_setupSynthesizer(e){e.on(hls_next_events.SYN_OUTPUT,((t,s)=>{const{config:r,logger:n}=this,{segId:i,sn:o,data:a,level:h}=t,{speed:l}=s,c=this.resolveMap.has(o);if(r.validateSegment(i,new Uint8Array(a))){this.notifyAllPeers(o,h,i),this.bitset.has(o,h)||this.reportTraffic(s.http,s.p2p,l);const r=e.getFromPeerId();if(c){n.info(`receive criticalSeg seg_id ${i}`);const e=this.resolveMap.get(o);this.resolveMap.delete(o),e.resolve({data:a,fromPeerId:r})}else{if(this.bitset.has(o,h))return;this.bufMgr.putSeg(t),this.updateLoaded(o,h)}}else if(n.error(`segment ${i} validate failed`),c){const e=this.resolveMap.get(o);this.resolveMap.delete(o),e.resolve()}this.requestingMap.delete(o,h)})).on(hls_next_events.SYN_PARTIAL,((t,s,r)=>{const{sn:n,level:i,size:o}=t;if(this.resolveMap.has(n)){this.resolveMap.get(n).resolve({bufferLeft:s,bufferRight:r,fromPeerId:e.getFromPeerId(),incomplete:!0,size:o}),this.resolveMap.delete(n)}this.requestingMap.delete(n,i)})).on(hls_next_events.SYN_ERROR,(e=>{const{sn:t,level:s}=e;if(this.resolveMap.has(t)){const e=this.resolveMap.get(t);this.resolveMap.delete(t),e.resolve()}this.requestingMap.delete(t,s)}))}_handleDCHave(e,t,s,r){const n=0!==this.resolveMap.size;if(n&&this.resolveMap.has(t)){const{segId:n}=this.resolveMap.get(t);this._notifySynthesizer(e,n,t,s,r)}this.config.live&&!n&&queue_microtask_default()((()=>{this.checkPeers()}))}}const hls_sw_scheduler=HlsSwScheduler;var extendStatics=function(e,t){return extendStatics=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])},extendStatics(e,t)};function __extends(e,t){function s(){this.constructor=e}extendStatics(e,t),e.prototype=null===t?Object.create(t):(s.prototype=t.prototype,new s)}function __values(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}}}}function __read(e,t){var s="function"==typeof Symbol&&e[Symbol.iterator];if(!s)return e;var r,n,i=s.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)o.push(r.value)}catch(e){n={error:e}}finally{try{r&&!r.done&&(s=i.return)&&s.call(i)}finally{if(n)throw n.error}}return o}function __spread(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(__read(arguments[t]));return e}var Event=function(e,t){this.target=t,this.type=e},ErrorEvent=function(e){function t(t,s){var r=e.call(this,"error",s)||this;return r.message=t.message,r.error=t,r}return __extends(t,e),t}(Event),CloseEvent=function(e){function t(t,s,r){void 0===t&&(t=1e3),void 0===s&&(s="");var n=e.call(this,"close",r)||this;return n.wasClean=!0,n.code=t,n.reason=s,n}return __extends(t,e),t}(Event),getGlobalWebSocket=function(){if("undefined"!=typeof WebSocket)return WebSocket},isWebSocket=function(e){return void 0!==e&&!!e&&2===e.CLOSING},DEFAULT={maxReconnectionDelay:1e4,minReconnectionDelay:1e3+4e3*Math.random(),minUptime:5e3,reconnectionDelayGrowFactor:1.3,connectionTimeout:4e3,maxRetries:1/0,maxEnqueuedMessages:1/0,startClosed:!1,debug:!1},ReconnectingWebSocket=function(){function e(e,t,s){var r=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){r._debug("open event");var t=r._options.minUptime,s=void 0===t?DEFAULT.minUptime:t;clearTimeout(r._connectTimeout),r._uptimeTimeout=setTimeout((function(){return r._acceptOpen()}),s),r._ws.binaryType=r._binaryType,r._messageQueue.forEach((function(e){return r._ws.send(e)})),r._messageQueue=[],r.onopen&&r.onopen(e),r._listeners.open.forEach((function(t){return r._callEventListener(e,t)}))},this._handleMessage=function(e){r._debug("message event"),r.onmessage&&r.onmessage(e),r._listeners.message.forEach((function(t){return r._callEventListener(e,t)}))},this._handleError=function(e){r._debug("error event",e.message),r._disconnect(void 0,"TIMEOUT"===e.message?"timeout":void 0),r.onerror&&r.onerror(e),r._debug("exec error listeners"),r._listeners.error.forEach((function(t){return r._callEventListener(e,t)})),r._connect()},this._handleClose=function(e){r._debug("close event"),r._clearTimeouts(),r._shouldReconnect&&r._connect(),r.onclose&&r.onclose(e),r._listeners.close.forEach((function(t){return r._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?DEFAULT.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,r=this._listeners[e.type];if(r)try{for(var n=__values(r),i=n.next();!i.done;i=n.next()){var o=i.value;this._callEventListener(e,o)}}catch(e){t={error:e}}finally{try{i&&!i.done&&(s=n.return)&&s.call(n)}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,__spread(["RWS>"],e))},e.prototype._getNextDelay=function(){var e=this._options,t=e.reconnectionDelayGrowFactor,s=void 0===t?DEFAULT.reconnectionDelayGrowFactor:t,r=e.minReconnectionDelay,n=void 0===r?DEFAULT.minReconnectionDelay:r,i=e.maxReconnectionDelay,o=void 0===i?DEFAULT.maxReconnectionDelay:i,a=0;return this._retryCount>0&&(a=n*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,r=void 0===s?DEFAULT.maxRetries:s,n=t.connectionTimeout,i=void 0===n?DEFAULT.connectionTimeout:n,o=t.WebSocket,a=void 0===o?getGlobalWebSocket():o;if(this._retryCount>=r)this._debug("max retries reached",this._retryCount,">=",r);else{if(this._retryCount++,this._debug("connect",this._retryCount),this._removeListeners(),!isWebSocket(a))throw Error("No valid WebSocket class provided");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()}),i))}))}}},e.prototype._handleTimeout=function(){this._debug("timeout event"),this._handleError(new ErrorEvent(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 CloseEvent(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}();const reconnecting_websocket_mjs=ReconnectingWebSocket,PING_INTERVAL=60,PONG_TIMEOUT=15;class WebsocketClient extends(events_default()){constructor(e,t,s,r,n="main"){super(),this.logger=e,this.config=t,this.wsAddr=s,this.serverVersion=0,this.pingInterval=r||PING_INTERVAL,this._ws=this._init(),this.name=n}_init(){const e={maxRetries:this.config.wsMaxRetries,minReconnectionDelay:randomNum(1e4,6e4),maxReconnectionDelay:6e5,maxEnqueuedMessages:20};let t=new reconnecting_websocket_mjs(this.wsAddr,void 0,e);return t.addEventListener("open",(()=>{this.logger.info(`signal ${this.name} ${this.wsAddr} connection opened`),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),r=s.action;if("pong"!==r){if("ver"!==r)return"close"===r?(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}`),this.onclose&&this.onclose(),this._stopPing()})),t.addEventListener("error",(e=>{this.logger.error(`signal ${this.name} ${this.wsAddr} error`),this._stopPing(),this.onerror&&this.onerror(e)})),t}sendSignal(e,t){const s={action:"signal",to_peer_id:e,data:t};this._send(s)}sendReject(e,t,s){const r={action:"reject",to_peer_id:e,reason:t,fatal:s};this._send(r)}_send(e){this._ws&&this._ws.send(e)}_startPing(e=120){this.connected&&(this.pingTimer=setInterval((()=>{this._send({action:"ping"}),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()}),1e3*PONG_TIMEOUT)}_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")})()}reconnect(){this._ws&&(this.logger.info(`reconnect signal ${this.name}`),this._ws.reconnect())}destroy(){this.close(),this._ws=null,this.removeAllListeners()}get connected(){return!!this._ws&&this._ws.readyState===reconnecting_websocket_mjs.OPEN}}const websocket_client=WebsocketClient,signal_manager_PING_INTERVAL=270,signal_manager=class extends(events_default()){constructor(e,t,s,r){super(),this.logger=e,this.config=t,this.mainAddr=s,this.backupAddr=r,this.mainWS=this._init(s),this.backupWS=this._init(r,"backup"),this._connected=!1}_init(e,t){if(!e)return null;let s=new websocket_client(this.logger,this.config,e,signal_manager_PING_INTERVAL,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 r=this._getWSByName(s);if(r)return void r.sendSignal(e,t)}this.mainConnected?this.mainWS.sendSignal(e,t):this.backupConnected?this.backupWS.sendSignal(e,t):this.logger.warn("no signal available, send signal failed")}sendReject(e,t,s,r){if(r){const n=this._getWSByName(r);if(n)return void n.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(),this.mainWS=null,this.backupWS=null,this.removeAllListeners()}get connected(){return this.mainConnected||this.backupConnected}get mainConnected(){return this.mainWS&&this.mainWS.connected}get backupConnected(){return this.backupWS&&this.backupWS.connected}};function getPeersThrottle(e,t,s=70){var r=null,n=!1,i=s;return function(s=!1){if(s)return clearTimeout(r),void(n=!1);n||(n=!0,r=setTimeout((function(){e.call(t,i),n=!1,r=null}),1e3*i),i*=1)}}const utils_getPeersThrottle=getPeersThrottle,MAX_PC_CONNS=25,MAX_MOBILE_CONNS=15,MIN_PEER_SHARE_TIME=50,MAX_PEER_SHARE_POS=600,MAX_TRY_CONNS_TRICKLE=5;class TrackerClient extends(events_default()){constructor(e,t,s,r){super(),this.engine=e,this.logger=e.logger,this.config=r,this.connected=!1,this.scheduler=s,this.sequential=this.scheduler.sequential,this.DCMap=new Map,this.failedDCSet=new Set,this.failedDCSet.add("3213C3MswBq7R"),this.signalerWs=null,this.fetcher=t,this.peers=[],this.minConns=5,this.stuns=[],this.requestMorePeers=utils_getPeersThrottle(this._requestMorePeers,this),this.engine.maxConns=this.maxConns=platform_default().isMobile()?MAX_MOBILE_CONNS:MAX_PC_CONNS,this.peersIncrement=0,this.gotPeersFromTracker=!1,this.fuseRate=-1}get totalConns(){return this.scheduler.peersNum+1}resumeP2P(){if(!this.fetcher)return;const{engine:e,config:t,fetcher:s}=this,{btAnnounce:r,btAnnouncePreflight:n}=s;(t.geoIpPreflight?n:r).call(s).then((s=>{if(!this.scheduler)return;e.peerId=this.peerId=s.id,this.minConns=s.min_conns;const r=s.peers;this.scheduler.notifyPeersLoaded(r.length);const n=e.netType;let i,o;if((s.wifi_only||t.wifiOnly)&&"wifi"!==n&&"ethernet"!==n&&(this.scheduler.downloadOnly=!0,this.logger.info("downloadOnly mode")),"object"==typeof t.wsSignalerAddr&&t.wsSignalerAddr.main)i=t.wsSignalerAddr.main,o=t.wsSignalerAddr.backup,s.signal&&!s.signal2&&(o=void 0);else{if("string"!=typeof t.wsSignalerAddr){const e=new Error;throw e.err=new Error("invalid wsSignalerAddr"),e}i=t.wsSignalerAddr}this.signalerWs=this._initSignalerWs(s.signal||i,s.signal2||o,s.token,s.token2),0===r.length?this.requestMorePeers():this.peers=this._filterPeers(r),e.emit("peerId",this.peerId);const a=t.getPeerId;a&&"function"==typeof a&&a(this.peerId),s.stun&&s.stun.length>0&&(this.stuns=s.stun),s.debug&&this.logger.enableDebug(),s.fuse_rate&&(this.fuseRate=s.fuse_rate),this.logger.info(`announce request response ${JSON.stringify(s,null,2)}`),e.media&&s.slogan&&appendSlogan(window.atob("U3RyZWFtIGFjY2VsZXJhdGVkIGJ5IENETkJ5ZSBQMlA="),getHomeUrl(),e.media)})).catch((t=>{if("TRACKER_EXPT"===t.code&&e.emit(events.EXCEPTION,t),t.retry){const e=randomNum(3e4,6e4);this.logger.warn(`announce retry after ${e}ms`),this.announceTimer=setTimeout((()=>{this.resumeP2P()}),e)}}))}stopP2P(){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.failedDCSet.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,cpr:e.cpr||void 0})})),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;){if(this.DCMap.size>=this.maxConns){this.logger.debug("clear exceeded peers"),this.peers=[];break}let e=this.peers.shift();this.logger.debug(`new DataChannel ${e.id}`);const t=e.intermediator;this._createDatachannel(e.id,!0,t,e.cpr)}}_setupDC(e){e.on(events.DC_SIGNAL,(t=>{const s=e.remotePeerId;if(e.intermediator){const r=this.DCMap.get(e.intermediator);if(r){if(r.sendMsgSignal(s,this.peerId,t))return}}this.signalerWs.sendSignal(s,t,e.signalName)})).on(events.DC_PEER_SIGNAL,(t=>{const s=t.to_peer_id,r=t.from_peer_id,n=t.action;if(s&&r&&n)if(s!==this.peerId){this.logger.info(`relay signal for ${r}`);const i=this.DCMap.get(s);if(i){if("signal"!==n)return void i.sendMsgSignalReject(s,r,t.reason);if(i.sendMsgSignal(s,r,t.data))return}e.sendMsgSignal(r,s)}else"signal"===n?this._handleSignalMsg(r,t,e.remotePeerId):this._handSignalRejected(r,t)})).on(events.DC_GET_PEERS,(()=>{const t=getCurrentTs(),s=this.scheduler.getPeers().filter((e=>e.peersConnected<(e.mobileWeb?MAX_MOBILE_CONNS:MAX_PC_CONNS)));if(s&&s.length>0){const r=[];s.forEach((s=>{if(s.remotePeerId===e.remotePeerId||s.remotePeerId===this.peerId)return;if(!this.config.live&&(s.currentPos-e.currentPos>MAX_PEER_SHARE_POS||s.currentPos<e.currentPos))return;t-s.timeJoin>MIN_PEER_SHARE_TIME&&r.push({id:s.remotePeerId})})),this.logger.info(`send ${r.length} peers to ${e.remotePeerId}`),e.sendPeers(r)}})).on(events.DC_PEERS,(t=>{e.gotPeers=!0;const s=t.peers;if(s&&s.length>0){const t=MAX_TRY_CONNS_TRICKLE;this.logger.info(`receive ${s.length} peers from ${e.remotePeerId}`),s.forEach((t=>{t.intermediator=e.remotePeerId})),this.peers=[...this.peers,...this._filterPeers(s).slice(0,t)],this._tryConnectToAllPeers()}})).once(events.DC_ERROR,(t=>{this.logger.info(`datachannel ${e.channelId} failed fatal ${t}`),this.scheduler&&(this.scheduler.deletePeer(e),this._destroyAndDeletePeer(e.remotePeerId,t),this.requestMorePeers(),this.fetcher&&(e.connected||t&&this.fetcher.increFailConns(),t&&this.failedDCSet.add(e.remotePeerId),this._doSignalFusing(this.scheduler.peersNum)))})).once(events.DC_CLOSE,(t=>{this.logger.info(`datachannel ${e.channelId} closed fatal ${t}`),this.scheduler&&(this.scheduler.deletePeer(e),this._doSignalFusing(this.scheduler.peersNum)),this._destroyAndDeletePeer(e.remotePeerId,t),t&&this.failedDCSet.add(e.remotePeerId),this.requestMorePeers()})).once(events.DC_OPEN,(()=>{e.isInitiator&&this.scheduler.handshakePeer(e)})).once(events.DC_METADATA,(t=>{const{scheduler:s}=this;e.isInitiator||s.handshakePeer(e),s.handleMetaData(e,t);const r=s.peersNum,n=r>=this.minConns;this.requestMorePeers(n),this.peersIncrement++,this._doSignalFusing(r+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(e,t,s,r){const n=(e,t)=>{let s=`${e}?id=${this.peerId}&p=web&v=2.2.11`;return t&&(s=`${s}&token=${t}`),s};let i,o=n(e,s);if(t&&t!==e){let e=n(t,r);i=new signal_manager(this.logger,this.config,o,e)}else i=new websocket_client(this.logger,this.config,o,270);return i.onopen=()=>{this.connected=!0,this.engine.emit("serverConnected",!0),this._tryConnectToAllPeers()},i.onmessage=(e,t)=>{let s=e.action;const r=e.from_peer_id;switch(s){case"signal":this._handleSignalMsg(r,e,null,t);break;case"reject":this._handSignalRejected(r,e);break;default:this.logger.warn(`Signal websocket unknown action ${s}`)}},i.onclose=()=>{this.connected=!1,this.engine.emit("serverConnected",!1)},i.onerror=e=>{e.message&&this.engine.emit(events.EXCEPTION,err_code_default()(e,"SIGNAL_EXPT"))},i}_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)}_handleSignalMsg(e,t,s,r){if(!this.scheduler)return;const{logger:n}=this;if(t.data){if(this.failedDCSet.has(e))return void this._sendSignalReject(e,`peer ${e} in blocked list`,s,r,!0);this._handleSignal(e,t.data,s,r)}else{if(!this._destroyAndDeletePeer(e))return;n.info(`signaling ${e} not found`);const{scheduler:t}=this;t.waitForPeer&&(t.waitingPeers--,0===t.waitingPeers&&t.notifyPeersLoaded(0)),this.requestMorePeers(),this.failedDCSet.add(e)}}_handleSignal(e,t,s,r){const n=t.type,{logger:i}=this;let o=this.DCMap.get(e);if(o){if(o.connected)return void i.info("datachannel had connected, signal ignored");if("offer"===n){if(!(this.peerId>e))return void i.warn(`signal type wrong ${n}, ignored`);this._destroyAndDeletePeer(e,!1),i.warn(`signal type wrong ${n}, convert to non initiator`),o=this._createDatachannel(e,!1,s)}}else{if("answer"===n){const t=`signal type wrong ${n}`;return i.warn(t),this._sendSignalReject(e,t,s,r),void this._destroyAndDeletePeer(e,!1)}i.debug(`receive node ${e} connection request`);const t=this.scheduler.peersNum;if(t>=this.maxConns){const n=this.scheduler.getNonactivePeers();if(!(n.length>0)){const t=`peers reach limit ${this.maxConns}`;return i.warn(t),void this._sendSignalReject(e,t,s,r)}{let e=t-this.maxConns+2;for(n.length<e&&(e=n.length);e>0;){const t=n.shift();t&&(i.warn(`close inactive peer ${t.remotePeerId}`),t.close(!1)),e--}}}o=this._createDatachannel(e,!1,s)}r&&(o.signalName=r),o.receiveSignal(t)}_createDatachannel(e,t,s,r){let n=this.config.trickleICE;const i=new peer(this.engine,this.peerId,e,t,this.config,this.sequential,{stuns:this.stuns,intermediator:s,trickle:n});return r&&(i.cpr=r),this.DCMap.set(e,i),this._setupDC(i),i}_sendSignalReject(e,t,s,r,n){if(s){const r=this.DCMap.get(s);if(r&&r.sendMsgSignalReject(e,this.peerId,t,n))return}this.signalerWs.sendReject(e,t,n,r)}_requestMorePeers(e){const{logger:t}=this;t.info(`requestMorePeers after delay ${e}`);const s=this.scheduler.peersNum,r=this.peersIncrement;this.peersIncrement=0,s>=this.minConns||(0===s||r<=3&&!this.gotPeersFromTracker?(this.failedDCSet.size>30&&(this.failedDCSet=new Set([...this.failedDCSet].slice(-30))),this.fetcher.btGetPeers([...this.DCMap.keys(),...this.failedDCSet.keys()]).then((e=>{t.info(`requestMorePeers resp ${JSON.stringify(e,null,2)}`),this.peers=[...this.peers,...this._filterPeers(e.peers)],this._tryConnectToAllPeers()})).catch((e=>{t.error(`requestMorePeers error ${e}`)})),this.gotPeersFromTracker=!0):s<this.maxConns&&(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 tracker_client=TrackerClient;class HlsSwP2pEngine extends Engine{static get name(){return"HlsSwP2pEngine"}static isServiceWorkerSupported(){return"serviceWorker"in navigator}constructor(e={}){super(e),this.swSupported=isSecureContext,this.levels=[],this.currentLevelIndex=0,this.rangeTestUrl="",this.currentSrc="",this.swVersion="",this.media=tryGetMediaElement(this.config.mediaElem),this.fragMap=new Map,HlsSwP2pEngine.isServiceWorkerSupported()||(this.swSupported=!1,console.warn("service worker is not supported"));const{channelIdMaker:t,signalId:s,browserInfo:r}=this.setup();this.onLevelLoaded=e=>{const{config:n}=this,i=e.live;n.live=i,this.targetDuration=e.averagetargetduration,i||(n.trickleICE=!0),this.browserInfo={...r,live:i,abr:this.multiBitrate||void 0,type:"hls_sw"},this.channel=`${t(this.currentSrc)}|${s}[${peer.VERSION}]`,this.setupElectron();const o=this.initLogger();o.info("use HlsSwP2pEngine"),o.info(`engine version: ${engine_base.version} hls-proxy version: ${this.swVersion}`),o.info(`channel ${this.channel}`),i||(n.startSN=e.startSN,n.endSN=e.endSN,o.info(`startSN ${e.startSN} endSN ${e.endSN}`)),this._init(this.channel,this.browserInfo),this.off(hls_next_events.LEVEL_LOADED,this.onLevelLoaded)},this.on(hls_next_events.LEVEL_LOADED,this.onLevelLoaded),this.onManifestParsed=(e,t)=>{this.multiBitrate=e.length>1,this.currentSrc=t,this.off(hls_next_events.MANIFEST_PARSED,this.onManifestParsed)},this.on(hls_next_events.MANIFEST_PARSED,this.onManifestParsed),this.onFragLoaded=({url:e})=>{!this.rangeTested&&this.config.useHttpRange&&(this.rangeTestUrl=e,performRangeRequest(e).then((()=>{this.config.httpRangeSupported=!0,this.config.logger.info("http range is supported")})).catch((()=>{this.config.httpRangeSupported=!1,this.config.logger.warn("http range is not supported")})),this.rangeTested=!0),this.off(hls_next_events.FRAG_LOADED,this.onFragLoaded)},this.once(hls_next_events.FRAG_LOADED,this.onFragLoaded),this.swSupported&&(navigator.serviceWorker.onmessage=e=>{const{action:t,data:s}=e.data;this.logger&&this.logger.info(`engine onmessage action ${t}`);const r=e.ports[0];if(r.postMessage({action:t,pong:!0}),!this.p2pEnabled||!s)return r.postMessage({action:t});switch(t){case hls_next_events.SW_PLAYLIST:this.handlePlaylist(s,r);break;case hls_next_events.SW_GET_PLAYLIST:this.handleGetPlaylist(s,r);break;default:if(!this.config.scheduler)return r.postMessage({action:t});this.config.scheduler.notifySWMessage(t,s,r)}}),this.config.swAutoRegister&&this.registerServiceWorker().then((function(e){})).catch((e=>{console.warn("ServiceWorker registration failed ",e)}))}get currentLevel(){return this.currentLevelIndex}handlePlaylist(e,t){const{config:s,logger:r}=this,{url:n,redirectedUrl:i,text:o,ver:a}=e;if(this.swVersion=a,0!==o.indexOf("#EXTM3U"))return console.warn("no EXTM3U delimiter"),t.postMessage({action:hls_next_events.SW_PLAYLIST});t.postMessage({action:hls_next_events.SW_PLAYLIST,data:{active:!0,debug:r&&r.isDebugLevel,sharePlaylist:!!s.sharePlaylist}}),this._parsePlaylist(o,n.split("?")[0],i)}_parsePlaylist(e,t,s){const r=t;s&&(t=s);const{config:n,logger:i}=this;if(e.indexOf("#EXTINF:")>0||e.indexOf("#EXT-X-TARGETDURATION:")>0){let s=0;const i=M3U8Parser.parseLevelPlaylist(e,t);this.levels.length>0?(s=this.levels.indexOf(i.url),-1===s?(this.restartP2p(),this.currentSrc=r,s=0):this.currentLevelIndex=s):(""!==this.currentSrc&&t!==this.currentSrc&&this.restartP2p(),this.currentSrc=r,this.levels=[t]),this.emit(hls_next_events.LEVEL_LOADED,i),n.live&&this.fragMap.clear(),i.fragments.forEach((e=>{e.level=s;let t=url_toolkit_default().buildAbsoluteURL(e.baseurl,e.relurl,{alwaysNormalize:!0});const r=e.byteRange;2===r.length&&(t=`${t}|bytes=${r[0]}-${r[1]-1}`),this.fragMap.set(t,e)})),n.sharePlaylist&&n.scheduler&&n.scheduler.broadcastPlaylist(t.split("?")[0],e)}else{const s=M3U8Parser.parseMasterPlaylist(e,t);""!==this.currentSrc&&this.restartP2p(),s.length>0&&(s.sort(((e,t)=>e.bitrate-t.bitrate)),this.levels=s.map((e=>e.url))),this.emit(hls_next_events.MANIFEST_PARSED,s,r)}}handleGetPlaylist(e,t){const{config:s,logger:r}=this;if(!r)return t.postMessage({action:hls_next_events.SW_GET_PLAYLIST});const{scheduler:n}=s;if(!n)return void r.warn("scheduler not found");const{url:i}=e,o=i.split("?")[0];if(n.playlistInfo.has(o)){const e=n.getPlaylistFromPeer(o);if(e&&e.data){const{data:s,seq:n}=e;return r.info(`got playlist from peer seq ${n}`),t.postMessage({action:hls_next_events.SW_GET_PLAYLIST,data:{text:s}}),void this._parsePlaylist(s,i.split("?")[0])}}return t.postMessage({action:hls_next_events.SW_GET_PLAYLIST})}async registerServiceWorker(){const{logger:e,config:t}=this;if(!this.swSupported){let e="sw is not supported";return isHttps||(e="https is required when using ServiceWorker",console.warn(e)),Promise.reject(e)}this.media=tryGetMediaElement(t.mediaElem),this.media||e&&e.warn("no video element found");const{serviceWorker:s}=navigator;return s.getRegistration(t.swFile).then((e=>e||s.register(t.swFile,{scope:t.swScope}).then((e=>{const t=e.installing||e.waiting;return e.active?e:new Promise(((s,r)=>{const n=()=>{"activated"===t.state?(t.removeEventListener("statechange",n),s(e)):"redundant"===t.state&&r("sw is redundant")};t.addEventListener("statechange",n)}))}))))}unregisterServiceWorker(){const{config:e}=this,t="serviceWorker is not registered";return new Promise(((s,r)=>{const{serviceWorker:n}=navigator;n||r(t),n.getRegistration(e.swFile).then((e=>{e?e.unregister().then((()=>{s()})).catch((()=>{r(t)})):r(t)}))}))}async _init(e,t){if(!this.p2pEnabled)return;const{logger:s}=this;try{await this.initSegmentManager()}catch(e){return void(s&&s.error(e))}let r=new server(this,this.config.token,encodeURIComponent(e),this.config.announce||"",t);this.fetcher=r,this.config.fetcher=r;let n=new hls_sw_scheduler(this,this.config);n.bufferManager=this.bufMgr,n.fragMap=this.fragMap,this.tracker=new tracker_client(this,r,n,this.config),this.config.scheduler=this.tracker.scheduler,this.p2pEnabled&&!this.tracker.connected&&this.tracker.resumeP2P(),this.setupWindowListeners()}restartP2p(){this.logger&&this.logger.warn("restart P2P"),this.disableP2P(),this.enableP2P(),this.on(hls_next_events.LEVEL_LOADED,this.onLevelLoaded),this.on(hls_next_events.MANIFEST_PARSED,this.onManifestParsed),this.on(hls_next_events.FRAG_LOADED,this.onFragLoaded)}enableP2P(){return this.p2pEnabled?null:(this.logger&&this.logger.info("enable P2P"),this.config.p2pEnabled=this.p2pEnabled=!0,this)}disableP2P(){this.logger&&this.logger.warn("disable P2P"),this.p2pEnabled&&(this.config.p2pEnabled=this.p2pEnabled=!1,this.tracker&&(this.tracker.stopP2P(),this.tracker={},this.fetcher=null,this.bufMgr.destroy(),this.bufMgr=null)),this.levels=[],this.currentLevelIndex=0,this.lastLevel=0,this.multiBitrate=!1,this.rangeTested=!1,this.rangeTestUrl="",this.currentSrc="",this.media=void 0,this.config.live=!1,this.removeAllListeners(hls_next_events.MANIFEST_PARSED),this.removeAllListeners(hls_next_events.LEVEL_LOADED)}}const hls_sw_p2pengine=HlsSwP2pEngine;function isBlockType(e,t){const s=url_toolkit_default().parseURL(e),r=s.path.substring(s.path.lastIndexOf(".")+1);return-1!==t.indexOf(r)}function createLoadStats(){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 updateLoadStats(e,t){let s,r,n,i,o;const a=performance.now();s=a-300,r=a-200,n=a,e.trequest=s,e.tfirst=r,e.tload=n,e.loading={first:s,start:r,end:n},i=o=t,e.loaded=i,e.total=o}class FakeXhr extends(events_default()){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))}}function fetchSupported(){if(window.fetch&&window.AbortController&&window.ReadableStream&&window.Request)try{return new window.ReadableStream({}),!0}catch(e){}return!1}class FetchLoader{constructor(e){this.fetchSetup=e.fetchSetup||getRequest,this.xhrSetup=e.xhrSetup,this.controller=new window.AbortController,this.stats=createLoadStats(),this.packetSize=peer.defaultPacketSize,this.fakeXhr=new FakeXhr}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.abort())}abort(){this.abortInternal(),this.callbacks&&this.callbacks.onAbort&&this.callbacks.onAbort(this.stats,this.context,this.response)}load(e,t,s){const r=this.stats;r.trequest=r.loading.start=performance.now();let n=getRequestParameters(e,this.controller.signal);const i="arraybuffer"===e.responseType,o=i?"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),n=mergeXhrSetup(this.fakeXhr,n)),this.request=this.fetchSetup(e,n),clearTimeout(this.requestTimeout),this.requestTimeout=setTimeout((()=>{this.abortInternal(),this.fakeXhr._emitEvent("timeout"),this.fakeXhr._emitEvent("loadend"),s.onTimeout(r,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 FetchError(s||"fetch, bad network response",e,t)}r.tfirst=r.loading.first=Math.max(performance.now(),r.loading.start),r.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"!==r.total?(h&&h(r.total),this.loadProgressively(t,r,e,a)):(s.emit("progress",new ProgressEvent("progress",{lengthComputable:!1})),i?t.arrayBuffer():t.text())})).then((t=>{const{response:n}=this;clearTimeout(this.requestTimeout),r.tload=r.loading.end=Math.max(performance.now(),r.loading.first),r.loaded=r.total=t[o];const i={url:n.url,data:t};s.onProgress(r,e,t,n),s.onSuccess(i,r,e,n)})).catch((t=>{if(clearTimeout(this.requestTimeout),r.aborted)return;a&&a(void 0,!1,!0);const n=t&&t.code||0,i=t?t.message:null;s.onError({code:n,text:i},e,t?t.details:null)}))}loadProgressively(e,t,s,r){const n=e.body.getReader();let i=0,o=0,a=(0,utils_buffer.l)(0);const h=()=>n.read().then((({value:s,done:n})=>{const{fakeXhr:l}=this;if(l.readyState!==l.LOADING&&(l.readyState=l.LOADING,l.emit("readystatechange")),s&&(i+=s.length),n){if(a.byteLength>0)if(i<=this.packetSize){const e=(0,utils_buffer.l)(i);a.copy(e,0,o*this.packetSize,a.byteLength),r(e,!0)}else{const e=splitBytes(a,o*this.packetSize);for(let t=0;t<e.length;t++)r(e[t],t===e.length-1)}const t=a.buffer,{fakeXhr:s}=this,{status:n,statusText:h,url:l}=e;return s.readyState=s.DONE,s.responseText=n,s.status=h,s.responseURL=l,s.responseType="arraybuffer",s.response=t,s.emit("readystatechange"),s._emitEvent("load"),s._emitEvent("loadend"),Promise.resolve(t)}const c=utils_buffer.l.from(s);if(t.loaded+=s.length,l.emit("progress",new ProgressEvent("progress",{lengthComputable:!0,loaded:t.loaded,total:t.total})),a=utils_buffer.l.concat([a,c]),i>=this.packetSize){i-=this.packetSize;const e=(0,utils_buffer.l)(this.packetSize);a.copy(e,0,o*this.packetSize,(o+1)*this.packetSize),o++,r(e,!1)}return h()})).catch((()=>(this.fakeXhr._emitEvent("abort"),this.fakeXhr._emitEvent("loadend"),Promise.reject())));return h()}}function getRequestParameters(e,t){const s={method:"GET",mode:"cors",credentials:"same-origin",signal:t,headers:new window.Headers(Object.assign({},e.headers))};return e.rangeEnd&&s.headers.set("Range","bytes="+e.rangeStart+"-"+String(e.rangeEnd-1)),s}function getRequest(e,t){return new window.Request(e.url,t)}function mergeXhrSetup(e,t){e.withCredentials&&(t.credentials="include");for(let[s,r]of e.headers)t.headers.set(s,r);return t}class FetchError extends Error{constructor(e,t,s){super(e),this.code=t,this.details=s}}class SegmentBuilder{constructor(e,t,s,r){this.bufferList=[],this.streamListeners=[],this.finished=!1,this.packetSize=peer.defaultPacketSize,this.attachments=r%this.packetSize==0?r/this.packetSize:Math.floor(r/this.packetSize)+1,this.pieceMsg={event:events.DC_PIECE,attachments:this.attachments,seg_id:s,sn:e,level:t,size:r,reverse:!1}}receiveBytes(e,t){e.byteLength&&(this.bufferList.push(e),t&&(this.finished=!0),this._notifyStreamListeners(e))}destroy(){this.finished||this._notifyStreamListenersAbort()}addStreamListener(e,t){this.streamListeners.push({handler:t})}_notifyStreamListenersAbort(){const{sn:e,seg_id:t}=this.pieceMsg;for(let s of this.streamListeners){const{handler:r}=s;r(e,t,!0,"aborted by httpLoader")}this.streamListeners.length=0}_notifyStreamListeners(e){const{sn:t,seg_id:s}=this.pieceMsg;for(let r of this.streamListeners){const{handler:n}=r;n(t,s,!1,e,this.finished)}this.finished&&(this.streamListeners.length=0)}}const frag_loader_MIN_TIME_FOR_LOAD=7,frag_loader_MAX_TIME_FOR_WAIT=4.5;class FragLoader extends(events_default()){constructor(e){super(),this.logger=e.logger;const{scheduler:t,fetcher:s,p2pBlackList:r,isHlsV0:n}=window.__p2p_loader__;this.isHlsV0=n,this.bufMgr=e.bufMgr,this.streamEnabled=e.streamEnabled,this.httpLoader=this.streamEnabled?new FetchLoader(e):new e.loader(e),this.p2pEnabled=e.p2pEnabled,this.isLive=e.live,this.scheduler=t,this.fetcher=s,this.segmentId=e.segmentId,this.blockTypes=r,this.forbidden=s.forbidden,this.stats=this.httpLoader.stats||createLoadStats(),this.enableWorker=e.enableWorker}destroy(){this.httpLoader.destroy()}abort(){this.httpLoader.abort()}async load(e,t,s){const{logger:r,scheduler:n}=this,i=e.frag;this.isHlsV0||(i.stats=this.stats);let o=e.frag.segId;if(!o){let t;e.rangeEnd&&(t="bytes="+e.rangeStart+"-"+(e.rangeEnd-1)),o=e.frag.segId=this.segmentId(String(i.level),i.sn,i.url,t)}if(!i.url||isBlockType(i.url,this.blockTypes))return r.info(`HTTP load blockType ${i.url}`),e.frag.loadByHTTP=!0,this.httpLoader.load(e,t,s);if(this.forbidden)return;t.maxRetry=2;const a=n.getBufferedDuration(),h=await this.bufMgr.getSegById(o);if(this.p2pEnabled&&h){r.info(`bufMgr found seg sn ${i.sn} segId ${o} level ${i.level}`);let t=copyBuffer(h.data).buffer,n={url:e.url,data:t};updateLoadStats(this.stats,h.size),i.loaded=h.size,i.loadByP2P=!0,e.frag.fromPeerId=h.fromPeerId,queue_microtask_default()((()=>{!this.isHlsV0&&s.onProgress&&s.onProgress(this.stats,e,n.data),s.onSuccess(n,this.stats,e)}))}else if(this.p2pEnabled&&n.hasAndSetTargetPeer(i.sn,i.level,a))this.loadFragByP2p(e,t,s,o);else if(r.info(`fragLoader load ${o} at ${i.sn} level ${i.level} buffered ${1e3*a}`),this.isLive&&n.hasIdlePeers&&a>frag_loader_MIN_TIME_FOR_LOAD&&n.shouldWaitForNextSeg()){let h=a-frag_loader_MIN_TIME_FOR_LOAD;h>frag_loader_MAX_TIME_FOR_WAIT&&(h=frag_loader_MAX_TIME_FOR_WAIT);const l=r=>{r===o&&(n.off(hls_next_events.SCH_DCHAVE,l),clearTimeout(this.waitTimer),n.hasAndSetTargetPeer(i.sn,i.level,a)?this.loadFragByP2p(e,t,s,o):this.loadFragByHttp(e,t,s,o))};r.info(`wait peer have for ${h}s`),n.on(hls_next_events.SCH_DCHAVE,l),this.waitTimer=setTimeout((()=>{this.loadFragByHttp(e,t,s,o),n.off(hls_next_events.SCH_DCHAVE,l)}),1e3*h)}else this.loadFragByHttp(e,t,s,o)}loadFragByHttp(e,t,s,r){const{logger:n,scheduler:i}=this,{segmentBuilderMap:o}=i;i.isReceiver=!1;const a=e.frag,{sn:h,level:l}=a;if(this.streamEnabled){let e;i.notifyAllPeers(h,l,r,SegmentState.PARTIAL_FORWARD),s.onUpdate=(t,s,r)=>{r?o.delete(h,l):e&&e.receiveBytes(t,s)},s.onBodyStart=t=>{e||(e=new SegmentBuilder(h,l,r,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(r)){const t=copyBuffer(e.data).buffer,s=new Segment(h,r,t,this.fetcher.peerId,l);this.bufMgr.putSeg(s)}o.delete(h,l),this.fetcher.reportFlow(t.total);let a=t.tload-t.trequest;n.info(`HTTP loaded ${r} time ${a}`),i.notifyAllPeers(h,l,r),c(e,t,s)};const d=s.onProgress;s.onProgress=(e,t,s)=>{d(e,t,s&&this.enableWorker?copyBuffer(s).buffer:s)},e.frag.loadByHTTP=!0,this.httpLoader.load(e,t,s)}loadFragByP2p(e,t,s,r){const{logger:n}=this,i=e.frag;this.scheduler.load(e,t,s);const o=s.onSuccess,a=s.onTimeout;s.onTimeout=(e,h)=>{n.warn(`P2P timeout switched to HTTP load ${i.relurl} at ${i.sn}`),s.onSuccess=o,this.loadFragByHttp(h,t,s,r),s.onTimeout=a},s.onSuccess=async(e,t,a)=>{if(!await this.bufMgr.hasSegOfId(r)){const t=copyBuffer(e.data).buffer,s=new Segment(i.sn,r,t,i.fromPeerId||this.fetcher.peerId,i.level);this.bufMgr.putSeg(s)}i.loadByP2P||this.fetcher.reportFlow(t.total),i.loaded=t.loaded,n.info(`${i.loadByP2P?"P2P":"HTTP"} loaded segment id ${r}`),!this.isHlsV0&&s.onProgress&&s.onProgress(t,a,e.data),o(e,t,a)}}}const frag_loader=FragLoader;class PlaylistLoader extends(events_default()){constructor(e){super(),this.logger=e.logger;const{scheduler:t}=window.__p2p_loader__;this.isHlsV0=e.isHlsV0,this.xhrLoader=new e.loader(e),this.p2pEnabled=e.p2pEnabled,this.scheduler=t,this.stats=this.xhrLoader.stats||createLoadStats()}destroy(){this.xhrLoader.destroy()}abort(){this.xhrLoader.abort()}load(e,t,s){const{logger:r}=this,{url:n}=e,i=n.split("?")[0],o=s.onSuccess;if(s.onSuccess=(e,t,s)=>{this.scheduler.broadcastPlaylist(i,e.data),o(e,t,s)},this.scheduler.playlistInfo.has(i)){const t=this.scheduler.getPlaylistFromPeer(i);if(t&&t.data){const{data:i,seq:o}=t;r.info(`got playlist from peer seq ${o}`),updateLoadStats(this.stats,i.length);let a={url:n,data:i};return void queue_microtask_default()((()=>{s.onSuccess(a,this.stats,e)}))}}this.xhrLoader.load(e,t,s)}}const playlist_loader=PlaylistLoader;class HlsjsScheduler extends Scheduler{constructor(e,t){super(e,t),this.isHlsjs=!0}updatePlaySN(e){this.currPlaySN=e}load(e,t,s){this.isReceiver=!0;const{logger:r,config:n}=this;this.context=e;const{rangeStart:i,rangeEnd:o,url:a}=e,h=e.frag,{segId:l,sn:c,level:d}=h;this.callbacks=s,this.stats=createLoadStats(),this.criticalSeg={sn:c,level:d,segId:l};let u=this.mBufferedDuration-n.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 _={rangeStart:Number(i),rangeEnd:Number(o),url:a,httpLoadTime:1e3*n.httpLoadTime-500,xhrSetup:n.xhrSetup};p?p.setExtra(_):(p=new Synthesizer(this.logger,c,d,n.httpRangeSupported,_),this._setupSynthesizer(p),this.requestingMap.set(c,d,p)),p.setTimeout(1e3*u),g&&(p.setForwardPeer(g),g.requestDataById(l,c,!0,{level:d})),f&&(p.setReversePeer(f),f.requestDataById(l,c,!0,{level:d,reverse:!0})),this.targetPeers={}}destroy(){super.destroy(),this.logger.warn("destroy HlsjsScheduler")}_setupDC(e){super._setupDC(e)}_setupSynthesizer(e){e.on(hls_next_events.SYN_OUTPUT,((t,s)=>{const{config:r,logger:n}=this,{segId:i,sn:o,data:a,level:h}=t,{speed:l}=s,c=this.criticalSeg&&this.criticalSeg.segId===i;if(r.validateSegment(i,new Uint8Array(a))){this.notifyAllPeers(o,h,i),this.bitset.has(o,h)||this.reportTraffic(s.http,s.p2p,l);const t=e.getFromPeerId();if(c){n.info(`receive criticalSeg seg_id ${i}`);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=a.byteLength,this.criticalSeg=null;const{frag:s}=this.context;s.fromPeerId=t,s.loadByP2P=!0,this.callbacks.onSuccess({data:a,url:this.context.url},e,this.context)}else{if(this.bitset.has(o,h))return;const e=new Segment(o,i,a,t,h);this.bufMgr.putSeg(e),this.updateLoaded(o,h)}}else n.error(`segment ${i} validate failed`),c&&this.callbacks.onTimeout(this.stats,this.context,null);this.requestingMap.delete(o,h),r.live&&!this.criticalSeg&&this.checkPeers()})).on(hls_next_events.SYN_ERROR,(e=>{const{sn:t,level:s}=e;this.logger.warn(`SYN_ERROR loading ${t}`),this.criticalSeg&&this.criticalSeg.sn===t&&(this.criticalSeg=null,this.callbacks.onTimeout(this.stats,this.context,null)),this.requestingMap.delete(t,s)}))}_setupEngine(){super._setupEngine(),this.engine.on(hls_next_events.FRAG_LOADING,(({sn:e,segId:t,byHttp:s,level:r})=>{this.loadingSN=e,this.loadingSegId=t})).on(hls_next_events.FRAG_LOADED,(({sn:e,segId:t,byP2p:s,level:r})=>{this.requestingMap.delete(e,r),this.updateLoaded(e,r)})).on(hls_next_events.FRAG_CHANGED,(({sn:e})=>{this.updatePlaySN(e)}))}_handleDCHave(e,t,s,r){this.criticalSeg&&this.criticalSeg.sn===t&&this.criticalSeg.level===s&&this._notifySynthesizer(e,this.criticalSeg.segId,t,s,r),this.config.live&&!this.criticalSeg&&queue_microtask_default()((()=>{this.checkPeers()}))}}const hlsjs_scheduler=HlsjsScheduler;class HlsjsP2pEngine extends Engine{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,this.config.isHlsV0="0"===e.constructor.version.split(".")[0],this.config.xhrSetup=e.config.xhrSetup,!0===this.config.httpStreamEnabled&&(e.config.streamEnabled=fetchSupported());const{channelIdMaker:s,signalId:r,browserInfo:n}=this.setup();e.config.segmentId=this.config.segmentId;const i=(t,o)=>{if(!o)return;const{config:a}=this,h=o.details,l=h.live;a.live=this.hlsjs.config.live=l,l||(a.trickleICE=!0),this.browserInfo={...n,live:l,abr:this.multiBitrate||void 0,type:"hls"},this.channel=`${s(e.url)}|${r}[${peer.VERSION}]`,this.setupElectron();const c=this.initLogger();c.info("use HlsjsP2pEngine"),this.logger=this.hlsjs.config.logger=c,c.info(`channel ${this.channel}`),l||(a.startSN=h.startSN,a.endSN=h.endSN,c.info(`startSN ${h.startSN} endSN ${h.endSN}`)),this.eventListened=!1,this._init(this.channel,this.browserInfo),e.off(this.HLSEvents.LEVEL_LOADED,i)};e.on(this.HLSEvents.LEVEL_LOADED,i);const o=(t,s)=>{const r=s.levels.length;this.multiBitrate=r>1,e.off(this.HLSEvents.MANIFEST_PARSED,o)};e.on(this.HLSEvents.MANIFEST_PARSED,o),e.on(this.HLSEvents.DESTROYING,(()=>{this.destroy()}))}async _init(e,t){const{logger:s,config:r}=this;if(!this.p2pEnabled)return;this.hlsjs.config.p2pEnabled=this.p2pEnabled,this.hlsjs.config.sharePlaylist=r.sharePlaylist;try{await this.initSegmentManager()}catch(e){return void s.error(e)}this.hlsjs.config.bufMgr=this.bufMgr,this.media=this.hlsjs.media;let n=new server(this,r.token,encodeURIComponent(e),r.announce||"",t);this.fetcher=n;const i=new hlsjs_scheduler(this,r);this.tracker=new tracker_client(this,n,i,r),i.bufferManager=this.bufMgr,this.hlsjs.config.fLoader=frag_loader,r.sharePlaylist&&(this.hlsjs.config.pLoader=playlist_loader),window.__p2p_loader__={scheduler:this.tracker.scheduler,fetcher:n,p2pBlackList:r.p2pBlackList,isHlsV0:r.isHlsV0},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,t){const s=t.frag;let{sn:r,level:n,segId:i}=s;if(!isBlockType(s.url,this.config.p2pBlackList)){if(this.logger.debug("loading frag "+r),this.bufMgr&&(this.bufMgr.loadingSN=r),!i){let e;s._byteRange&&(e="bytes="+s._byteRange[0]+"-"+s._byteRange[1]);let r=s.url;i=t.frag.segId=this.config.segmentId(String(n),s.sn,r,e)}this.emit(hls_next_events.FRAG_LOADING,{sn:r,segId:i,byHttp:s.loadByHTTP,level:n})}}_onFragLoaded(e,t){const{sn:s,segId:r,loaded:n,duration:i,level:o,fromPeerId:a,loadByP2P:h,url:l}=t.frag,{config:c,logger:d}=this;isBlockType(t.frag.url,c.p2pBlackList)||(this.emit(hls_next_events.FRAG_LOADED,{url:l,sn:s,level:o,segId:r,loaded:n,duration:i,byP2p:!!h,fromPeerId:a}),!this.rangeTested&&c.useHttpRange&&(performRangeRequest(t.frag.url,void 0,c.xhrSetup).then((()=>{c.httpRangeSupported=!0,d.info("http range is supported")})).catch((()=>{c.httpRangeSupported=!1,d.warn("http range is not supported")})),this.rangeTested=!0))}_onFragChanged(e,t){if(!isBlockType(t.frag.url,this.config.p2pBlackList)){this.logger.debug("frag changed: "+t.frag.sn);const{sn:e,duration:s}=t.frag;this.emit(hls_next_events.FRAG_CHANGED,{sn:e,duration:s})}}_onHlsError(e,t){if(!t)return;const{logger:s}=this;t.fatal?s.error(`${t.type} details ${t.details} reason ${t.reason}`):s.warn(`${t.type} details ${t.details} reason ${t.reason}`);const r=this.hlsjs.constructor.ErrorDetails;switch(t.details){case r.BUFFER_STALLED_ERROR:this.fetcher&&this.fetcher.errsBufStalled++;break;case r.INTERNAL_EXCEPTION:if(this.fetcher){this.fetcher.errsInternalExpt++;const{bufMgr:e}=this;this.fetcher.exptMsg=`${t.err.message} event ${t.event} maxBufSize ${e.maxBufSize} cache ${e.name} sn ${e.loadingSN} overflowed ${e.overflowed} ua ${navigator.userAgent}`}s.error(`INTERNAL_EXCEPTION event ${t.event} err ${t.err.message}`),this.emit(hls_next_events.EXCEPTION,err_code_default()(t.err,"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 hlsjs_p2pengine=HlsjsP2pEngine;function getMediaSource(){if("undefined"!=typeof window)return window.MediaSource||window.WebKitMediaSource}function isMSESupported(){const e=getMediaSource(),t=window.SourceBuffer||window.WebKitSourceBuffer,s=e&&"function"==typeof e.isTypeSupported&&e.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"'),r=!t||t.prototype&&"function"==typeof t.prototype.appendBuffer&&"function"==typeof t.prototype.remove;return!!s&&!!r}class ShadowP2pEngine extends Engine{static get name(){return"ShadowP2pEngine"}constructor(){super()}get currentLevel(){return 0}disableP2P(){}}const shadow_p2pengine=ShadowP2pEngine;class TsValidator{static validate(e){const t=TsValidator._syncOffset(e);if(t<0)return!0;let s=e.length;s-=(s+t)%188;for(let r=t;r<s;r+=188)if(71!==e[r])return!1;return!0}static _syncOffset(e){const t=Math.min(1e3,e.length-564);let s=0;for(;s<t;){if(71===e[s]&&71===e[s+188]&&71===e[s+376])return s;s++}return-1}}const ts_validator=TsValidator;class P2pEngine{static get Events(){return hls_next_events}static isSupported(){return engine_base.isSupported()&&(isMSESupported()||hls_sw_p2pengine.isServiceWorkerSupported())}static isServiceWorkerSupported(){return hls_sw_p2pengine.isServiceWorkerSupported()}static isMSESupported(){return isMSESupported()}static getBrowser(){return platform_default().getBrowser()}static get ServiceWorkerEngine(){return hls_sw_p2pengine}static get HlsjsEngine(){return hlsjs_p2pengine}constructor(e={}){const{hlsjsInstance:t}=e;if(delete e.hlsjsInstance,e.validateSegment||(e.validateSegment=function(e,t){return ts_validator.validate(t)}),window.__swP2pEngineHlsActive)return console.warn("P2pEngineHls is already activated"),void(this._realEngine=new shadow_p2pengine(e));e.videoElem&&(e.mediaElem=e.videoElem),"1"!==getQueryParam("_ios")&&!e.proxyOnly&&t&&isMSESupported()?this._realEngine=new hlsjs_p2pengine(t,e):this._realEngine=new hls_sw_p2pengine(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()}registerServiceWorker(){return"function"==typeof this._realEngine.registerServiceWorker?this._realEngine.registerServiceWorker():Promise.reject("Not supported by this engine")}unregisterServiceWorker(){return"function"==typeof this._realEngine.unregisterServiceWorker?this._realEngine.unregisterServiceWorker():Promise.reject("Not supported by this engine")}get version(){return engine_base.version}}P2pEngine.version=engine_base.version,P2pEngine.protocolVersion=peer.VERSION,window&&(window.P2PEngineHls=P2pEngine);const index_engine=P2pEngine})(),__webpack_exports__=__webpack_exports__.default,__webpack_exports__})()));
|