swarmcloud-hls 2.4.6 → 2.4.8
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 i=Number.isNaN||function(e){return e!=e};function n(){n.init.call(this)}e.exports=n,e.exports.once=function(e,t){return new Promise((function(s,r){function i(s){e.removeListener(t,n),r(s)}function n(){"function"==typeof e.removeListener&&e.removeListener("error",i),s([].slice.call(arguments))}p(e,t,n,{once:!0}),"error"!==t&&function(e,t,s){"function"==typeof e.on&&p(e,"error",t,s)}(e,i,{once:!0})}))},n.EventEmitter=n,n.prototype._events=void 0,n.prototype._eventsCount=0,n.prototype._maxListeners=void 0;var o=10;function a(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function h(e){return void 0===e._maxListeners?n.defaultMaxListeners:e._maxListeners}function l(e,t,s,r){var i,n,o,l;if(a(s),void 0===(n=e._events)?(n=e._events=Object.create(null),e._eventsCount=0):(void 0!==n.newListener&&(e.emit("newListener",t,s.listener?s.listener:s),n=e._events),o=n[t]),void 0===o)o=n[t]=s,++e._eventsCount;else if("function"==typeof o?o=n[t]=r?[s,o]:[o,s]:r?o.unshift(s):o.push(s),(i=h(e))>0&&o.length>i&&!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},i=c.bind(r);return i.listener=s,r.wrapFn=i,i}function u(e,t,s){var r=e._events;if(void 0===r)return[];var i=r[t];return void 0===i?[]:"function"==typeof i?s?[i.listener||i]:[i]: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}(i):f(i,i.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 i(n){r.once&&e.removeEventListener(t,i),s(n)}))}}Object.defineProperty(n,"defaultMaxListeners",{enumerable:!0,get:function(){return o},set:function(e){if("number"!=typeof e||e<0||i(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");o=e}}),n.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},n.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||i(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this},n.prototype.getMaxListeners=function(){return h(this)},n.prototype.emit=function(e){for(var t=[],s=1;s<arguments.length;s++)t.push(arguments[s]);var i="error"===e,n=this._events;if(void 0!==n)i=i&&void 0===n.error;else if(!i)return!1;if(i){var o;if(t.length>0&&(o=t[0]),o instanceof Error)throw o;var a=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw a.context=o,a}var h=n[e];if(void 0===h)return!1;if("function"==typeof h)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},n.prototype.addListener=function(e,t){return l(this,e,t,!1)},n.prototype.on=n.prototype.addListener,n.prototype.prependListener=function(e,t){return l(this,e,t,!0)},n.prototype.once=function(e,t){return a(t),this.on(e,d(this,e,t)),this},n.prototype.prependOnceListener=function(e,t){return a(t),this.prependListener(e,d(this,e,t)),this},n.prototype.removeListener=function(e,t){var s,r,i,n,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(i=-1,n=s.length-1;n>=0;n--)if(s[n]===t||s[n].listener===t){o=s[n].listener,i=n;break}if(i<0)return this;0===i?s.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(s,i),1===s.length&&(r[e]=s[0]),void 0!==r.removeListener&&this.emit("removeListener",e,o||t)}return this},n.prototype.off=n.prototype.removeListener,n.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 i,n=Object.keys(s);for(r=0;r<n.length;++r)"removeListener"!==(i=n[r])&&this.removeAllListeners(i);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},n.prototype.listeners=function(e){return u(this,e,!0)},n.prototype.rawListeners=function(e){return u(this,e,!1)},n.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):g.call(e,t)},n.prototype.listenerCount=g,n.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}},622:function(e){var t,s,r,i,n;t=/^(?=((?:[a-zA-Z0-9+\-.]+:)?))\1(?=((?:\/\/[^\/?#]*)?))\2(?=((?:(?:[^?#\/]*\/)*[^;?#\/]*)?))\3((?:;[^?#]*)?)(\?[^#]*)?(#[^]*)?$/,s=/^(?=([^\/?#]*))\1([^]*)$/,r=/(?:\/|^)\.(?=\/)/g,i=/(?:\/|^)\.\.\/(?!\.\.\/)[^\/]*(?=\/)/g,n={buildAbsoluteURL:function(e,t,r){if(r=r||{},e=e.trim(),!(t=t.trim())){if(!r.alwaysNormalize)return e;var i=n.parseURL(e);if(!i)throw new Error("Error trying to parse base URL.");return i.path=n.normalizePath(i.path),n.buildURLFromParts(i)}var o=n.parseURL(t);if(!o)throw new Error("Error trying to parse relative URL.");if(o.scheme)return r.alwaysNormalize?(o.path=n.normalizePath(o.path),n.buildURLFromParts(o)):t;var a=n.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=n.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?n.normalizePath(o.path):o.path),n.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(i,"")).length;);return e.split("").reverse().join("")},buildURLFromParts:function(e){return e.scheme+e.netLoc+e.path+e.params+e.query+e.fragment}},e.exports=n},47:(e,t)=>{"use strict";t.l=i;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__=i.prototype,t}function i(e,t,s){if("number"==typeof e){if("string"==typeof t)throw new TypeError('The "string" argument must be of type string. Received type number');return a(e)}return n(e,t,s)}function n(e,t,s){if("string"==typeof e)return function(e,t){"string"==typeof t&&""!==t||(t="utf8");if(!i.isEncoding(t))throw new TypeError("Unknown encoding: "+t);var s=0|c(e,t),n=r(s),o=n.write(e,t);o!==s&&(n=n.slice(0,o));return n}(e,t);if(ArrayBuffer.isView(e))return h(e);if(null==e)throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e);if(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__=i.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 n=e.valueOf&&e.valueOf();if(null!=n&&n!==e)return i.from(n,t,s);var o=function(e){if(i.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||S(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 i.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),i=0;i<t;i+=1)s[i]=255&e[i];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(i.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 n=!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(n)return r?-1:_(e).length;t=(""+t).toLowerCase(),n=!0}}function d(e,t,s,r){s=Number(s)||0;const i=e.length-s;r?(r=Number(r))>i&&(r=i):r=i;const n=t.length;let o;for(r>n/2&&(r=n/2),o=0;o<r;++o){const r=parseInt(t.substr(2*o,2),16);if(S(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,i;const n=[];for(let o=0;o<e.length&&!((t-=2)<0);++o)s=e.charCodeAt(o),r=s>>8,i=s%256,n.push(i),n.push(r);return n}(t,e.length-s),e,s,r)}function p(e,t,s,r){let i;for(i=0;i<r&&!(i+s>=t.length||i>=e.length);++i)t[i+s]=e[i];return i}function _(e,t){var s;t=t||1/0;for(var r=e.length,i=null,n=[],o=0;o<r;++o){if((s=e.charCodeAt(o))>55295&&s<57344){if(!i){if(s>56319){(t-=3)>-1&&n.push(239,191,189);continue}if(o+1===r){(t-=3)>-1&&n.push(239,191,189);continue}i=s;continue}if(s<56320){(t-=3)>-1&&n.push(239,191,189),i=s;continue}s=65536+(i-55296<<10|s-56320)}else i&&(t-=3)>-1&&n.push(239,191,189);if(i=null,s<128){if((t-=1)<0)break;n.push(s)}else if(s<2048){if((t-=2)<0)break;n.push(s>>6|192,63&s|128)}else if(s<65536){if((t-=3)<0)break;n.push(s>>12|224,s>>6&63|128,63&s|128)}else{if(!(s<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;n.push(s>>18|240,s>>12&63|128,s>>6&63|128,63&s|128)}}return n}function m(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}function S(e){return e!=e}"undefined"!=typeof Symbol&&null!=Symbol.species&&i[Symbol.species]===i&&Object.defineProperty(i,Symbol.species,{value:null,configurable:!0,enumerable:!1,writable:!1}),i.from=function(e,t,s){return n(e,t,s)},i.prototype.__proto__=Uint8Array.prototype,i.__proto__=Uint8Array,i.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)},i.allocUnsafe=function(e){return a(e)},i.isBuffer=function(e){return null!=e&&!0===e._isBuffer&&e!==i.prototype},i.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}},i.concat=function(e,t){if(!Array.isArray(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return i.alloc(0);var s;if(void 0===t)for(t=0,s=0;s<e.length;++s)t+=e[s].length;var r=i.allocUnsafe(t),n=0;for(s=0;s<e.length;++s){var o=e[s];if(m(o,Uint8Array)&&(o=i.from(o)),!i.isBuffer(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(r,n),n+=o.length}return r},i.byteLength=c,i.prototype._isBuffer=!0,i.prototype.copy=function(e,t,s,r){if(!i.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 n=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=n-1;o>=0;--o)e[o+t]=this[o+s];else Uint8Array.prototype.set.call(e,this.subarray(s,r),t);return n},i.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 i=this.length-t;if((void 0===s||s>i)&&(s=i),e.length>0&&(s<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");let n=!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(n)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),n=!0}}},934:e=>{"use strict";function t(e,t){for(const s in t)Object.defineProperty(e,s,{value:t[s],enumerable:!0,configurable:!0});return e}e.exports=function(e,s,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 i=function(){};return i.prototype=Object.create(Object.getPrototypeOf(e)),t(new i,r)}}},485:function(e,t,s){var r;!function(i){"use strict";function n(e,t){var s=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(s>>16)<<16|65535&s}function o(e,t,s,r,i,o){return n((a=n(n(t,e),n(r,o)))<<(h=i)|a>>>32-h,s);var a,h}function a(e,t,s,r,i,n,a){return o(t&s|~t&r,e,t,i,n,a)}function h(e,t,s,r,i,n,a){return o(t&r|s&~r,e,t,i,n,a)}function l(e,t,s,r,i,n,a){return o(t^s^r,e,t,i,n,a)}function c(e,t,s,r,i,n,a){return o(s^(t|~r),e,t,i,n,a)}function d(e,t){var s,r,i,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,i=g,o=f,d=p,u=a(u,g,f,p,e[s],7,-680876936),p=a(p,u,g,f,e[s+1],12,-389564586),f=a(f,p,u,g,e[s+2],17,606105819),g=a(g,f,p,u,e[s+3],22,-1044525330),u=a(u,g,f,p,e[s+4],7,-176418897),p=a(p,u,g,f,e[s+5],12,1200080426),f=a(f,p,u,g,e[s+6],17,-1473231341),g=a(g,f,p,u,e[s+7],22,-45705983),u=a(u,g,f,p,e[s+8],7,1770035416),p=a(p,u,g,f,e[s+9],12,-1958414417),f=a(f,p,u,g,e[s+10],17,-42063),g=a(g,f,p,u,e[s+11],22,-1990404162),u=a(u,g,f,p,e[s+12],7,1804603682),p=a(p,u,g,f,e[s+13],12,-40341101),f=a(f,p,u,g,e[s+14],17,-1502002290),u=h(u,g=a(g,f,p,u,e[s+15],22,1236535329),f,p,e[s+1],5,-165796510),p=h(p,u,g,f,e[s+6],9,-1069501632),f=h(f,p,u,g,e[s+11],14,643717713),g=h(g,f,p,u,e[s],20,-373897302),u=h(u,g,f,p,e[s+5],5,-701558691),p=h(p,u,g,f,e[s+10],9,38016083),f=h(f,p,u,g,e[s+15],14,-660478335),g=h(g,f,p,u,e[s+4],20,-405537848),u=h(u,g,f,p,e[s+9],5,568446438),p=h(p,u,g,f,e[s+14],9,-1019803690),f=h(f,p,u,g,e[s+3],14,-187363961),g=h(g,f,p,u,e[s+8],20,1163531501),u=h(u,g,f,p,e[s+13],5,-1444681467),p=h(p,u,g,f,e[s+2],9,-51403784),f=h(f,p,u,g,e[s+7],14,1735328473),u=l(u,g=h(g,f,p,u,e[s+12],20,-1926607734),f,p,e[s+5],4,-378558),p=l(p,u,g,f,e[s+8],11,-2022574463),f=l(f,p,u,g,e[s+11],16,1839030562),g=l(g,f,p,u,e[s+14],23,-35309556),u=l(u,g,f,p,e[s+1],4,-1530992060),p=l(p,u,g,f,e[s+4],11,1272893353),f=l(f,p,u,g,e[s+7],16,-155497632),g=l(g,f,p,u,e[s+10],23,-1094730640),u=l(u,g,f,p,e[s+13],4,681279174),p=l(p,u,g,f,e[s],11,-358537222),f=l(f,p,u,g,e[s+3],16,-722521979),g=l(g,f,p,u,e[s+6],23,76029189),u=l(u,g,f,p,e[s+9],4,-640364487),p=l(p,u,g,f,e[s+12],11,-421815835),f=l(f,p,u,g,e[s+15],16,530742520),u=c(u,g=l(g,f,p,u,e[s+2],23,-995338651),f,p,e[s],6,-198630844),p=c(p,u,g,f,e[s+7],10,1126891415),f=c(f,p,u,g,e[s+14],15,-1416354905),g=c(g,f,p,u,e[s+5],21,-57434055),u=c(u,g,f,p,e[s+12],6,1700485571),p=c(p,u,g,f,e[s+3],10,-1894986606),f=c(f,p,u,g,e[s+10],15,-1051523),g=c(g,f,p,u,e[s+1],21,-2054922799),u=c(u,g,f,p,e[s+8],6,1873313359),p=c(p,u,g,f,e[s+15],10,-30611744),f=c(f,p,u,g,e[s+6],15,-1560198380),g=c(g,f,p,u,e[s+13],21,1309151649),u=c(u,g,f,p,e[s+4],6,-145523070),p=c(p,u,g,f,e[s+11],10,-1120210379),f=c(f,p,u,g,e[s+2],15,718787259),g=c(g,f,p,u,e[s+9],21,-343485551),u=n(u,r),g=n(g,i),f=n(f,o),p=n(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",i="";for(s=0;s<e.length;s+=1)t=e.charCodeAt(s),i+=r.charAt(t>>>4&15)+r.charAt(15&t);return i}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,i=g(e),n=[],o=[];for(n[15]=o[15]=void 0,i.length>16&&(i=d(i,8*e.length)),s=0;s<16;s+=1)n[s]=909522486^i[s],o[s]=1549556828^i[s];return r=d(n.concat(g(t)),512+8*t.length),u(d(o.concat(r),640))}(p(e),p(t))}function S(e,t,s){return t?s?m(t,e):f(m(t,e)):s?_(e):f(_(e))}void 0===(r=function(){return S}.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!n(i("os "))&&!n(i("android[/ ]"))},isIOS:function(){return n(i("os "))},isAndroid:function(){return n(i("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 i(e){return""+(new RegExp(e+"(\\d+((\\.|_)\\d+)*)").exec(r())||[,0])[1]||void 0}function n(e){return parseFloat((e||"").replace(/\_/g,"."))||0}e.exports=s},77:e=>{let t;e.exports="function"==typeof queueMicrotask?queueMicrotask.bind(globalThis):e=>(t||(t=Promise.resolve())).then(e).catch((e=>setTimeout((()=>{throw e}),0)))}},__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_SEND_REQUEST:"SEND_REQUEST",DC_PIECE_NOT_FOUND:"PIECE_NOT_FOUND",DC_PIECE_ABORT:"PIECE_ABORT",DC_PIECE_CANCEL:"PIECE_CANCEL",DC_CLOSE:"CLOSE",DC_RESPONSE:"RESPONSE",DC_ERROR:"ERROR",DC_PIECE:"PIECE",DC_PIECE_DATA:"PIECE_DATA",DC_TIMEOUT:"TIMEOUT",DC_PIECE_ACK:"PIECE_ACK",DC_METADATA:"METADATA",DC_PLAT_ANDROID:"ANDROID",DC_PLAT_IOS:"IOS",DC_PLAT_WEB:"WEB",DC_CHOKE:"CHOKE",DC_UNCHOKE:"UNCHOKE",DC_HAVE:"HAVE",DC_HAVE_REVERSE:"HAVE_REVERSE",DC_LOST:"LOST",DC_GET_PEERS:"GET_PEERS",DC_PEERS:"PEERS",DC_STATS:"STATS",DC_PEER_SIGNAL:"PEER_SIGNAL",DC_PLAYLIST:"PLAYLIST",BM_LOST:"lost",BM_ADDED_SEG_:"BM_ADDED_SEG_",BM_ADDED_SN_:"BM_ADDED_SN_",BM_SEG_ADDED:"BM_SEG_ADDED",FRAG_CHANGED:"FRAG_CHANGED",FRAG_LOADED:"FRAG_LOADED",FRAG_LOADING:"FRAG_LOADING",RESTART_P2P:"RESTART_P2P",EXCEPTION:"exception",REQUESTING_MAP_HAVE:"REQUESTING_MAP_HAVE",BUILDER_MAP_HAVE:"BUILDER_MAP_HAVE",SYN_OUTPUT:"SYN_OUTPUT",SYN_ERROR:"SYN_ERROR",SYN_PARTIAL:"SYN_PARTIAL",SVR_PEERS:"SVR_PEERS"},hls_next_events={...events,SCH_DCHAVE:"SCH_DCHAVE",STREAM_DETECT:"STREAM_DETECT",STREAM_DISABLE:"STREAM_DETECT",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"};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._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.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)}_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){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._senderMap=null,clearInterval(this._closingInterval),this._closingInterval=null,clearInterval(this._interval),this._interval=null,this._chunk=null,this._cb=null,this._channel){try{this._channel.close()}catch(e){}this._channel.onmessage=null,this._channel.onopen=null,this._channel.onclose=null,this._channel.onerror=null}if(this._pc){try{this._pc.close()}catch(e){}this._pc.oniceconnectionstatechange=null,this._pc.onicegatheringstatechange=null,this._pc.onsignalingstatechange=null,this._pc.onicecandidate=null,this._pc.ondatachannel=null}this._pc=null,this._channel=null,e&&this.emit("error",e),this.emit("close")})))}_setupData(e){if(!e.channel)return this.destroy(new Error("Data channel event is missing `channel` property"));this._channel=e.channel,this._channel.binaryType="arraybuffer","number"==typeof this._channel.bufferedAmountLowThreshold&&(this._channel.bufferedAmountLowThreshold=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)}get isBufferedAmountHigh(){return this._channel.bufferedAmount>MAX_BUFFERED_AMOUNT}write(e,t){if(this.destroyed)return t(new Error("cannot write after peer is destroyed"));if(this._connected){try{this.send(e)}catch(e){return this.destroy(e)}this.isBufferedAmountHigh?this._cb=t:t(null)}else this._chunk=e,this._cb=t}_startIceCompleteTimeout(){this.destroyed||this._iceCompleteTimer||(this._iceCompleteTimer=setTimeout((()=>{this._iceComplete||(this._iceComplete=!0,this.emit("iceTimeout"),this.emit("_iceComplete"))}),this.iceCompleteTimeout))}_createOffer(){this.destroyed||this._pc.createOffer(this.offerOptions).then((e=>{if(this.destroyed)return;this.trickle||this.allowHalfTrickle||(e.sdp=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)}))}_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._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={},i={},n={};let o=!1;s.forEach((e=>{"remotecandidate"!==e.type&&"remote-candidate"!==e.type||(r[e.id]=e),"localcandidate"!==e.type&&"local-candidate"!==e.type||(i[e.id]=e),"candidatepair"!==e.type&&"candidate-pair"!==e.type||(n[e.id]=e)}));const a=e=>{o=!0;let t=i[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(n[e.selectedCandidatePairId]),("googCandidatePair"===e.type&&"true"===e.googActiveConnection||("candidatepair"===e.type||"candidate-pair"===e.type)&&e.selected)&&a(e)})),o||Object.keys(n).length&&!Object.keys(i).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,i=0){this.sn=e,this.segId=t,this.data=s,this.fromPeerId=r,this.level=i||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 DC_TOLERANCE=2,DEFAULT_PACKET_SIZE=64e3,ALPHA=.6;class peer_Peer extends(events_default()){static get defaultPacketSize(){return DEFAULT_PACKET_SIZE}static get VERSION(){return"8"}constructor(e,t,s,r,i,n,o={}){super(),this.engine=e,this.channel=e.fetcher.channelId,this.logger=e.logger,this.config=i,this.isInitiator=r,this.options=o,this.typeExpected=n,this.remotePeerId=s,this.intermediator=o.intermediator||null,this.channelId=r?`${t}-${s}`:`${s}-${t}`,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.streamListeners=[],this.pieceMsg={},this.uploadInterrupter={targetSegId:void 0,currentSegId:void 0,canceled:!1},this.datasToSend=[],this.bytesUploaded=0,this.dataWriting=!1,this.timeSendRequest=0,this.timeReceivePiece=0,this.timeSendPiece=0,this.weight=0,this.peersConnected=1,this.timeJoin=getCurrentTs(),this.uploadSpeed=0,this.gotPeers=!1,this.currentLevel=0,this.currentPos=0,this.signalMsgs=[],this.useBackupSignal=!1;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.notFatalClosed=!1,this.startSN=Number.MAX_SAFE_INTEGER,this.endSN=-1,this._loadedBytes=0}get isAvailable(){return this.downloadNum<2&&!this.choked}get isAvailableUrgently(){return!this.downloading&&!this.choked}cancelDownload(e,t,s){if(s&&this.downloading&&!(this.streamListeners.length>0||this.remainAttachments<=2))return this.logger.warn(`cancel download ${s} remain packets ${this.remainAttachments}`),this.sendJson({event:events.DC_PIECE_CANCEL,sn:e,level:t,seg_id:s})}addStreamListener(e,t,s){this.streamListeners.push({handler:s,peerId:t})}removeStreamListener(e){this.streamListeners=this.streamListeners.filter((t=>t.peerId!==e||(t.handler(void 0,void 0,!0,"aborted by cancel"),!1)))}_init(e){e.on("error",(e=>{let t=!0;"Ice connection failed."===e.message&&this.notFatalClosed&&(t=!1),this.emit(events.DC_ERROR,t)})),e.on("signal",(e=>{this.useBackupSignal||this.signalMsgs.push(e),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.signalMsgs=[],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,i=s.event;switch(r=i!==events.DC_PLAYLIST&&i!==events.DC_PEER_SIGNAL?`string: ${e}`:`event: ${i}`,t.debug(`datachannel receive ${r} from ${this.remotePeerId}`),i){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_CANCEL:this.uploadInterrupter.targetSegId=s.seg_id,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.uploadInterrupter.canceled||(this._handlePieceAck(s.size,s.miss),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.warn(`peer 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,!1)}send(e,t=!0){return t?(this.datasToSend.push(e),this.dataWriting||this._sendDataSync(),!0):this.sendImmediately(e)}_checkIfNeedInterrupt(){const{targetSegId:e,currentSegId:t,canceled:s}=this.uploadInterrupter;return!!s||!(!e||e!==t)&&(this.logger.warn("cancel send data"),this.sendMsgPieceAbort(`${t} transfer canceled`),this.datasToSend=[],this.uploadInterrupter.canceled=!0,this._handlePieceAck(this.bytesUploaded,0),this.emit(events.DC_PIECE_ACK,{seg_id:t,size:this.bytesUploaded,canceled:!0}),!0)}_sendDataSync(){if(this._checkIfNeedInterrupt()||0===this.datasToSend.length)return void(this.dataWriting=!1);this.dataWriting=!0;const e=this.datasToSend.shift();this.bytesUploaded+=e.byteLength,this._datachannel.write(e,(e=>{if(e)return this.dataWriting=!1,this.logger.warn(e.message),void this.emit(events.DC_ERROR,!1);this._sendDataSync()}))}sendImmediately(e){if(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.4.6",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={}){const{targetSegId:s}=this.uploadInterrupter;if(s&&s===e.seg_id)return this.logger.warn("cancel send piece msg"),this.sendMsgPieceAbort(`${s} piece canceled`),void(this.uploadInterrupter.canceled=!0);this.uploadInterrupter={currentSegId:e.seg_id,targetSegId:void 0,canceled:!1},this.datasToSend=[],this.bytesUploaded=0,e.ext||(e.ext={}),e.ext.from&&t.from&&(t.from=`${e.ext.from}->${t.from}`),t.incompletes&&e.ext.incompletes&&(t.incompletes+=e.ext.incompletes),t=Object.assign({},e.ext,t);const r={...e,ext:t};this.sendJson(r)}sendBuffer(e,t,s,r={}){const i=r.reverse||void 0;delete r.reverse;let n=s.byteLength,o=0,a=0;n%this.packetSize==0?a=n/this.packetSize:(a=Math.floor(n/this.packetSize)+1,o=n%this.packetSize);let h={event:events.DC_PIECE,attachments:a,seg_id:t,sn:e,level:r.level,size:n,reverse:i};delete r.level,this.sendMsgPiece(h,r);const l=dividePayload(s,this.packetSize,a,o);this._sendBufferArray(l,i),this.uploading=!1,this.timeSendPiece=performance.now()}get downloadNum(){return this.downloading?this.sendReqQueue.length+1:0}requestDataById(e,t,s=!1,r={}){const i={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(i):this.sendReqQueue.push(i)):this._realRequestData(i)}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){const s=t?e.reverse():e;for(let e=0;e<s.length;e++)this.send(s[e])}_realRequestData(e){this.sendJson(e),this.timeSendRequest=performance.now(),this.downloading=!0,this.emit(events.DC_SEND_REQUEST)}shouldWaitForRemain(e){return 0!==this.bufArr.length&&(0!==this.timeReceivePiece&&this.currentLoadSpeed()>=this.minRequiredSpeed(e))}close(e){e||(this.notFatalClosed=!0),this.emit(events.DC_CLOSE,e)}receiveSignal(e){e&&this._datachannel.signal(e)}_notifyDownloadListenersAbort(e){for(let t of this.streamListeners){const{handler:s}=t;s(void 0,void 0,!0,e)}this.streamListeners=[]}destroy(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._loadedBytes+=e.byteLength,this.remainAttachments--;let i=r?this.remainAttachments+1:t-this.remainAttachments;const n=0===this.remainAttachments;if(n&&(this._sendNextReq()||(this.downloading=!1)),this.emit(events.DC_PIECE_DATA,this.bufSN,this.segId,e,i,n,this.pieceMsg),this.streamListeners.length>0)for(let t of this.streamListeners){const{handler:s}=t;s(this.bufSN,this.segId,!1,e,n)}if(n){if(this.streamListeners=[],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._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.dataExchangeTs=getCurrentTs(),this.uploading?this.logger.warn(`${this.remotePeerId} is uploading when receive request`):(this.uploading=!0,this.emit(events.DC_REQUEST,e))}_handlePieceAck(e,t){0!==this.timeSendPiece&&(this.uploadSpeed=Math.round(e/(performance.now()-this.timeSendPiece)*2),this.timeSendPiece=0,this.logger.info(`${this.remotePeerId} uploadSpeed is ${this.uploadSpeed}`)),t>0&&this.logger.warn(`peer ${this.remotePeerId} miss ${t}`)}_prepareForBinary(e,t,s,r){this.bufArr=[],this._loadedBytes=0,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} != byteLength ${s}`)}this.segId="",this.bufArr=[],this._loadedBytes=0,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||0!==this.datasToSend.length)&&(this.uploading=!1,this.sendJson({event:events.DC_PIECE_ABORT,reason:e}))}loadedBytes(){return this._loadedBytes}currentLoadSpeed(){return 0===this.timeReceivePiece?0:this.loadedBytes()/(performance.now()-this.timeReceivePiece)}minRequiredSpeed(e){return(this.pieceMsg.size-this.loadedBytes())/e}}function dividePayload(e,t,s,r){let i=[];if(r){let n;for(let r=0;r<s-1;r++)n=e.slice(r*t,(r+1)*t),i.push(n);n=e.slice(e.byteLength-r,e.byteLength),i.push(n)}else{let r;for(let n=0;n<s;n++)r=e.slice(n*t,(n+1)*t),i.push(r)}return i}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"),i=-1!==e.indexOf("?")?"&":"?";return e.match(r)?e.replace(r,"$1"+t+"="+s+"$2"):e+i+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:.5*e+1.67}function performRangeRequest(e,t,s,r=3500){const i=new XMLHttpRequest;return new Promise(((n,o)=>{i.open("GET",e,!0),i.responseType="arraybuffer",i.timeout=r,i.onreadystatechange=e=>{if(4===i.readyState){const e=i.status;e>=200&&e<300?n(i.response):o(`status ${e}`)}},i.onerror=e=>{o("request error")},i.ontimeout=e=>{o("timeout")},i.setRequestHeader("Range",t||"bytes=0-0"),s&&s(i,e),i.send()})).catch((e=>{}))}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 getHomeUrl(){return window.atob("aHR0cHM6Ly9zd2FybWNsb3VkLm5ldC9lbi8=")}function splitBytes(e,t){const s=peer.defaultPacketSize,r=e.byteLength-t,i=[];let n=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,n,n+s),i.push(t),n+=s}if(a>0){const t=(0,utils_buffer.l)(a);e.copy(t,0,n,n+a),i.push(t)}return i}function getAvailableMemory(){const{memory:e}=performance;return e?e.jsHeapSizeLimit-e.usedJSHeapSize:-1}function trimMap(e,t){if(e.size<=t)return;const s=[...e.keys()];do{e.delete(s.shift())}while(e.size>t)}function trimSet(e,t){if(e.size<=t)return;const s=[...e.values()];do{e.delete(s.shift())}while(e.size>t)}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}getExtraForStats(){const e={},{tracker:t}=this,{scheduler:s}=t;return s&&s.isSeed()&&(e.seed=!0,t.DCMap.size<=t.maxConns+2&&(e.exclusions=[...t.DCMap.keys(),...t.failedDCSet.keys()])),e}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.4.6",EngineBase.protocolVersion=peer.VERSION;const engine_base=EngineBase;function tryGetMediaElement(e,t){let s;if(e&&("string"==typeof e?s=document.querySelector(e):e instanceof HTMLMediaElement&&(s=e)),!s){const e=[...document.getElementsByTagName("video"),...document.getElementsByTagName("audio")];1===e.length?s=e[0]:(t&&(s=e.find((e=>e.src===t))),s||(s=e.find((e=>e.currentTime>0))))}return s}function calRangeWithForwardReverseOffset(e,t,s,r=0,i=0){const n=peer.defaultPacketSize;let o="bytes=",a=r,h=i||s-1;const l=Math.floor(s/n),c=s%n>0?l+1:l;if(e>=0&&(a+=(e+1)*n),o=`${o}${a}-`,t>=0&&t<c){h-=s%n+(c-t-1)*n,o=`${o}${h}`}else 0!==i&&(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:!1,trickleICE:!0,announceLocation:"cn",geoIpPreflight:!0,getStats:function(e,t,s){},getPeerId:function(e){},getPeersInfo:function(e){}};const config=commonConfig;let defaultP2PConfig={...config,httpLoadTime:3,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,i)=>{s.get(e).onsuccess=function(){try{s.put(t(this.result),e),r(promisifyRequest(s.transaction))}catch(e){i(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=>{const i=r.filter((t=>t.name!==e)).map((e=>new Promise(((t,s)=>{const r=indexedDB.deleteDatabase(e.name);r.onsuccess=t,r.onerror=s,r.onblocked=s}))));Promise.all(i).then(t).catch(s)})).catch(s)})).catch((e=>{}))}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((async(e,t)=>{if(this.isPC&&this.maxBufSize<629145600||!this.isPC&&this.maxBufSize<367001600)return void t("disk storage not enough");let 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")}),500);this._initMetaStore().then((()=>{clearTimeout(r),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).then((e=>{this.emit(`${events.BM_ADDED_SN_}${e.sn}`,e),this.emit(events.BM_SEG_ADDED,e)})).catch((e=>{this.logger.error(e),("QuotaExceededError"===e.name||e.inner&&"QuotaExceededError"===e.inner.name)&&this._trimDisk(!0)}))}_addSeg(e){const{segId:t,sn:s}=e;return set(t,s,this.id2SnStore),new Promise(((r,i)=>{get(s,this.segmentsStore).then((n=>{n?0===n.filter((e=>e.segId===t)).length&&(n.push(this._segmentToCache(e)),set(s,n,this.segmentsStore).then((()=>{this._increaseBufSize(e.data.byteLength),r(e)})).catch((e=>{i(e)}))):set(s,[this._segmentToCache(e)],this.segmentsStore).then((()=>{this._increaseBufSize(e.data.byteLength),r(e)})).catch((e=>{i(e)}))})).catch((e=>{i(e)}))}))}async _trimDisk(e=!1){let t=this.maxBufSize;const{logger:s}=this;let r=await this.currBufSize();e&&(t=r-52428800,t<0&&(t=0)),r<t||keys(this.segmentsStore).then((async e=>{const i=e.sort(((e,t)=>e-t));let n=0;do{if(n++>10){console.error("too much loops in SegmentStore");break}const e=i.shift();if(void 0===e){s.error("lastSN not found");continue}if(e>=this.loadingSN){s.warn(`trimDisk failed, loadingSN ${this.loadingSN}`);break}const t=i[0],o=await get(e,this.segmentsStore);if(!o){s.warn("lastSeg not found");continue}let a=0;o.forEach((e=>{a+=e.data.byteLength})),del(e,this.segmentsStore).then((()=>{this._decreaseBufSize(parseInt(a))})),o.forEach((r=>{del(r.segId,this.id2SnStore),s.info(`pop seg ${r.segId} size ${r.data.byteLength}`),this.emit(events.BM_LOST,{sn:e,segId:r.segId,next:t,level:r.level})})),r-=a,s.info(`pop sn ${e} size ${a} currBufSize ${r}`),this.overflowed||(this.overflowed=!0)}while(r>=t)}))}_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 store");try{this._clearDisk()}catch(e){}}_clearDisk(e){return clearAll(e)}destroy(){this.clear(),this.removeAllListeners()}}const segment_store=SegmentStore,LIVE_MAX_BUFFER_SIZE=31457280,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 i=this._segPool.get(t);for(let t of i)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:i}=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(i);const n=this._segPool.size;if(this.emit(`${events.BM_ADDED_SN_}${e.sn}`,e),this.emit(events.BM_SEG_ADDED,e),this._currBufSize<this.maxBufSize||n<=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 i=0;r.forEach((e=>{i+=e.size})),this._currBufSize-=parseInt(i),this._segPool.delete(e),r.forEach((t=>{this.id2Sn.delete(t.segId),this.emit(events.BM_LOST,{sn:e,segId:t.segId,next:s,level:t.level})})),t.info(`pop sn ${e} size ${i} 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,e.validateSegment||(e.validateSegment=function(e,t){return!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("."))}`},i=(e,t,s,r)=>`${e}-${t}`;t&&"function"==typeof t&&(r=this.makeChannelId(e,t)),s||(this.config.segmentId=i);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=super.getExtraForStats();return!this.config.live&&this.media&&(e.pos=Math.round(this.media.currentTime)),this.multiBitrate&&this.currentLevel!==this.lastLevel&&(e.level=this.currentLevel+"",this.lastLevel=this.currentLevel),e}getExtraForPeersRequest(){const e={};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")}getTagForVod(){return`${(0,platform.getBrowser)()}${isHttps()?"s":""}_${"SegmentStore"===this.bufMgr.name?"d":"m"}`}}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 i=e[r];i.id===t&&(s=i)}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 i(e,t){["video","audio"].forEach((s=>{const r=e.filter((e=>isCodecType(e,s)));if(r.length){const i=r.filter((e=>0===e.lastIndexOf("avc1",0)||0===e.lastIndexOf("mp4a",0)));t[`${s}Codec`]=i.length>0?i[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={},n=e.attrs=new attr_list(s[1]);e.url=M3U8Parser.resolve(s[2],t);const o=n.decimalResolution("RESOLUTION");o&&(e.width=o.width,e.height=o.height),e.bitrate=n.decimalInteger("AVERAGE-BANDWIDTH")||n.decimalInteger("BANDWIDTH"),e.name=n.NAME,i([].concat((n.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 i,n=[],o=0;for(MASTER_PLAYLIST_MEDIA_REGEX.lastIndex=0;null!==(i=MASTER_PLAYLIST_MEDIA_REGEX.exec(e));){const e={},a=new attr_list(i[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++,n.push(e)}}return n}static parseLevelPlaylist(e,t){let s,r,i=0,n=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=i++;c.start=n,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,n+=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),n=(" "+s[r+2]).slice(1);switch(s[r]){case"#":c.tagList.push(n?[e,n]:[e]);break;case"PLAYLIST-TYPE":o.type=e.toUpperCase();break;case"MEDIA-SEQUENCE":i=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(),n-=c.duration),o.totalduration=n,o.averagetargetduration=n/o.fragments.length,o.endSN=i-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 extends(events_default()){constructor(e,t,s,r,i){let n;switch(super(),e.config.announceLocation){case"cn":n=URL_MAP.v+URL_MAP[3]+URL_MAP.n+URL_MAP.l+URL_MAP[7];break;case"hk":n=URL_MAP.x+URL_MAP.o+URL_MAP.xo+URL_MAP.sb;break;case"us":n=URL_MAP.kj+URL_MAP.a+URL_MAP["+"]+URL_MAP["="]+URL_MAP.w;break;case"eu":n=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(n)}/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.4.6",this.announce,this.channelId,i.type);this.native=!!i.bundle,this.announceInfo={...i,channel:this.channelId,ts:this.timestamp,version:"2.4.6",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.offline=!1,this.errsBufStalled=0,this.mediaRequests=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:i,mobile:n,countryCode:o,continentCode:a}=e;n&&(this.announceInfo.netType="cellular");const h=i.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(/=+$/,""),i=0,n=0,o="";s=r.charAt(n++);~s&&(t=i%4?64*t+s:s,i++%4)?o+=String.fromCharCode(255&t>>(-2*i&6)):0)s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(s);return o})}();_0x38aa.amGtZD=function(e,t){for(var s,r=[],i=0,n="",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++)i=(i+r[l]+t.charCodeAt(l%t.length))%256,s=r[l],r[l]=r[i],r[i]=s;l=0,i=0;for(var c=0;c<e.length;c++)i=(i+r[l=(l+1)%256])%256,s=r[l],r[l]=r[i],r[i]=s,n+=String.fromCharCode(e.charCodeAt(c)^r[(r[l]+r[i])%256]);return n},_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(){this.offline||(this.offline=!0,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,data:{}},-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:r=0,failConns:i=0,rebuffers:n=0,requests:o=0,errsInternalExpt:a=0}=this.lastStats||{};this[_httpDownloaded]>=e&&(this[_httpDownloaded]-=e),this[_p2pDownloaded]>=t&&(this[_p2pDownloaded]-=t),this[_p2pUploaded]>=r&&(this[_p2pUploaded]-=r),this.failConns>=i&&(this.failConns-=i),this.errsBufStalled>=n&&(this.errsBufStalled-=n),this.mediaRequests>=o&&(this.mediaRequests-=o),this.errsInternalExpt>=a&&(this.errsInternalExpt-=a),this.exptMsg&&(this.exptMsg=void 0);const{seeds:h}=s.data;h&&this.emit(events.SVR_PEERS,h)}})).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 i={exclusions:e,asn:s,country:r},n={};return this.engine.getExtraForPeersRequest&&(n=this.engine.getExtraForPeersRequest()),i=Object.assign({},i,n),new Promise(((e,s)=>{fetch(this.getPeersURL,{headers:this._requestHeader,method:"POST",body:JSON.stringify(i)}).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++}increRebuffers(){this.errsBufStalled++}increMediaRequests(){this.mediaRequests++}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"),this.removeAllListeners(),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,rebuffers:this.errsBufStalled||void 0,requests:this.mediaRequests||void 0,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.4.6 "+this.exptMsg),s}get _requestHeader(){const e={};return this.native&&(e.token=this.key),e}}const server=Server;function genV(e,t,s,r,i){const n=location.hostname;var o,a,h,l,c,d;return(o=n,a=t,h=s,l=r,c=i,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,r)=>{const i=findPeersWithState(e,SegmentState.COMPLETE,t,s,r);if(i.length>=2)return[i[0],i[1]];if(1===i.length){const n=findPeersWithState(e,SegmentState.PARTIAL_FORWARD,t,s,r);if(n.length>=1)return[n[0],i[0]];const o=findPeersWithState(e,SegmentState.PARTIAL_REVERSE,t,s,r);return o.length>=1?[i[0],o[0]]:0===randomNum(0,1)?[null,i[0]]:[i[0],null]}const n=findPeersWithState(e,SegmentState.PARTIAL_FORWARD,t,s,r);if(n.length>=1)return[n[0],null];const o=findPeersWithState(e,SegmentState.PARTIAL_REVERSE,t,s,r);return o.length>=1?[null,o[0]]:[null,null]},findPeersWithState=(e,t,s,r,i)=>e.filter((e=>e.bitset.hasWithId(s,r,i,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,{state:SegmentState.COMPLETE,segId:void 0});this.levelMap.set(s,r)}}totalLevels(){return this.levelMap.size}hasWithId(e,t,s,r=SegmentState.ANY){if(t<0)return!1;const i=this._createOrGetSet(t).get(e);return!!i&&((!s||!i.segId||i.segId===s)&&(r===SegmentState.ANY||i.state===r))}has(e,t,s=SegmentState.ANY){return this.hasWithId(e,t,void 0,s)}hasCompleteOr(e,t,s=SegmentState.COMPLETE){const r=this._createOrGetSet(t).get(e);return!!r&&(r.state===SegmentState.COMPLETE||r.state===s)}getObj(e,t){let s=this._createOrGetSet(t).get(e);return s||(s={}),s}getSegId(e,t){return this.getObj(e,t).segId}getState(e,t){return this.getObj(e,t).state}delete(e,t){const s=this._createOrGetSet(t);return-1===t?(this.levelMap.forEach((t=>{t.delete(e)})),!0):s.delete(e)}add(e,t,s,r){if(!isInteger(e))return;this._createOrGetSet(t).set(e,{state:r,segId:s}),this.isLive&&this._trimBitset(e)}array(e){const t=this._createOrGetSet(e);return this._keysForStateComplete(t)}allArray(){let e={};return this.levelMap.forEach(((t,s)=>{e[s]=this._keysForStateComplete(t)})),e}clear(){this.levelMap.forEach((e=>{e.clear()}))}size(e){return this._createOrGetSet(e).size}_createOrGetSet(e){"number"!=typeof e&&(e=Number(e));let t=this.levelMap.get(e);return t||(t=new Map,this.levelMap.set(e,t)),t}_trimBitset(e){const t=e-LIVE_SN_LIMIT;t>0&&this.levelMap.forEach((e=>{e.delete(t)}))}_keysForStateComplete(e){const t=[];for(let[s,r]of e)r.state===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,EnumStatus={uninitialized:0,initialized:1,waiting:2,working:3,canceled:4};function createTimeoutGenerator(){return new NextGenerator((function(e){let t;return{execute:function(s=1e3){t=setTimeout(e,s)},cancel:function(){clearTimeout(t)}}}))}class NextGenerator{constructor(e){this.generator=e,this.status=EnumStatus.initialized,this.next=this.next.bind(this)}next(e){if(this.status===EnumStatus.canceled)return console.warn("status is canceled");if(this.status===EnumStatus.waiting)return console.warn("status is waiting");const t=this.execute.bind(this,this.cb);this.nextInfo=this.generator(t),this.status=EnumStatus.waiting,this.nextInfo.execute(e)}execute(e,t){this.status=EnumStatus.working,e.apply(t,[this.next])}cancel(){this.status=EnumStatus.canceled,this.nextInfo&&"function"==typeof this.nextInfo.cancel&&this.nextInfo.cancel()}start(e,t){if("function"!=typeof e)throw new SyntaxError("param cb must be a function");this.cb=e,this.next(t)}continue(e){this.status=EnumStatus.initialized,this.next(e)}}class SeedDetector{constructor(e){this.startPoint=performance.now(),this.reqsSent=0,this.reqsReceived=0,this.peerManager=e}isSeed(){return!(performance.now()-this.startPoint<6e4)&&(this.peerManager.size()>0&&0===this.reqsSent&&this.reqsReceived>0)}reset(){this.reqsSent=this.reqsReceived=0}increReqsSent(){this.reqsSent++}increReqsReceived(){this.reqsReceived++}}const CHECK_CONN_INTERVAL=40,MAX_NO_EXCHANGE_TIME=180,_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.seedDetector=new SeedDetector(this.peerManager),this._setupEngine&&this._setupEngine(),this.startCheckConnsTimer(),this.dcDownloadTimeout=t.dcDownloadTimeout,this[_shareOnly]=!1,this.downloadOnly=!1,this.loadedPeerNum=0}startCheckConnsTimer(){this.checkConnsTimer=setInterval((()=>{this.logger.info("start check conns");const e=this.getStatsForPeer();let t=this.peersNum;const s=getCurrentTs();this.getPeers().forEach((r=>{t>4&&(s-r.dataExchangeTs>MAX_NO_EXCHANGE_TIME||s-r.gotStatsTs>=2*CHECK_CONN_INTERVAL+3)?(this.logger.warn(`close dead or different level peer ${r.remotePeerId} level ${r.currentLevel}`),r.close(!1),t--):r.connected&&r.sendMsgStats(t,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.segId} packets ${t.bufArr.length} total ${t.pieceMsg.attachments}`)}return t>0}getIdlePeer(){return this.peerManager.getAvailablePeers()}isSeed(){if(!this.config.live)return!1;const e=this.seedDetector.isSeed();return this.seedDetector.reset(),e}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),this.checkTimer&&this.checkTimer.cancel(),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} size ${s.size} to ${e.remotePeerId}, canceled ${s.canceled||!1}`))})).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})).on(events.DC_REQUEST,(()=>{this.seedDetector.increReqsReceived()})).on(events.DC_SEND_REQUEST,(()=>{this.seedDetector.increReqsSent()}))}_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)}startCheckPeersTimer(e=3e3){this.checkTimer=createTimeoutGenerator(),this.checkTimer.start((e=>{this.checkPeers();const t=1e3*calCheckPeersDelay(this.loadedPeerNum);this.logger.info(`loaded peers ${this.loadedPeerNum} nextDelay ${t}`),this.loadedPeerNum=0,e(t)}),e)}}const scheduler_base=SchedulerBase;class RequestingMap extends(events_default()){constructor(e){super(),this.internalMap=new Map,this.eventName=e}has(e,t){return this.internalMap.has(this._generateId(e,t))}set(e,t,s){const r=this._generateId(e,t);this.internalMap.set(r,s),this.emit(`${this.eventName}${e}-${t}`,s)}get(e,t){return this.internalMap.get(this._generateId(e,t))}delete(e,t){const s=this._generateId(e,t),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}`}}const error_code={ERROR_SYN_INTERNAL:0,ERROR_SYN_RANGE_REQUEST:1,ERROR_SYN_HTTP_TIMEOUT:2,ERROR_SYN_ABORT:3};class Synthesizer extends(events_default()){constructor(e,t,s,r,i,n=!1,o){super(),this.coordinator=e,this.logger=t,this.rangeSupported=n,this.rangeStart=0,this.rangeEnd=0,this.httpLoadTime=2e3,this.allowLoadPartial=!1,this.pieceMsg={sn:s,level:r,seg_id:i},o&&this.setExtra(o),this.forwardPeer=null,this.reversePeer=null,this.bufArr=[],this.forwardOffset=-1,this.reverseOffset=1e4,this.timeStart=0,this.timeReceivePiece=0,this.timer=void 0,this.destroyed=!1,this.forwardStreamListeners=[],this.reverseStreamListeners=[],this.rangeRequesting=!1,this.waitingRemain=!1,this.httpLoaded=0,this.p2pLoaded=0,this.deadline=0,this.p2pCanceled=!1}get segId(){return this.pieceMsg.seg_id}isDownloading(){return this.timeReceivePiece>0}isAlmostDeadline(){return!!this.rangeRequesting||this.deadline>0&&this.deadline-performance.now()<400}hasPeer(e){return!!e&&(e===this.forwardPeer||e===this.reversePeer)}_notifyStreamListeners(e,t,s){const{sn:r,seg_id:i,attachments:n}=this.pieceMsg,o=e&&0===s||!e&&s===n-1,a=e?this.reverseStreamListeners:this.forwardStreamListeners;for(let e of a){const{handler:s}=e;s(r,i,!1,t,o)}o&&(a.length=0)}_notifyStreamListenersAbort(){const e=[...this.reverseStreamListeners,...this.forwardStreamListeners];for(let t of e){const{handler:e}=t;e(void 0,void 0,!0,"aborted by synthesizer")}e.length=0}_notifyStreamListenersRemain(){if(this.forwardStreamListeners.length>0){for(let e=this.forwardOffset+1;e<this.bufArr.length;e++)this._notifyStreamListeners(!1,this.bufArr[e],e);this.forwardStreamListeners=[]}if(this.reverseStreamListeners.length>0){for(let e=this.reverseOffset-1;e>=0;e--)this._notifyStreamListeners(!0,this.bufArr[e],e);this.reverseStreamListeners=[]}}addStreamListener(e,t,s){(e?this.reverseStreamListeners:this.forwardStreamListeners).push({handler:s,peerId:t})}removeStreamListener(e){const t=t=>t.filter((t=>t.peerId!==e||(t.handler(void 0,void 0,!0,"aborted by cancel"),!1)));this.forwardStreamListeners=t(this.forwardStreamListeners),this.reverseStreamListeners=t(this.reverseStreamListeners)}setTimeout(e=0){e<=0?setTimeout((()=>{this._handleTimeout(!1,!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),e.headers&&(this.headers=e.headers),e.segId&&!this.pieceMsg.seg_id&&(this.pieceMsg.seg_id=e.segId)}hasForwardPeer(){return!!this.forwardPeer}hasReversePeer(){return!!this.reversePeer}hasPeerId(e){return this.forwardPeer&&this.forwardPeer.remotePeerId===e||this.reversePeer&&this.reversePeer.remotePeerId===e}isEmpty(){return null===this.forwardPeer&&null===this.reversePeer}isFull(){return this.forwardPeer&&this.reversePeer}setForwardPeer(e){this.forwardPeer=e,this.reversePeer&&this._print(),this._setupPeer(e,!1)}setReversePeer(e){this.reversePeer=e,this.forwardPeer&&this._print(),this._setupPeer(e,!0)}deletePeer(e,t=!1){const s=e===this.reversePeer;this._detachPeer(e),s?(this.reversePeer=null,t&&(this.reverseOffset=this.pieceMsg.attachments||1e4)):(this.forwardPeer=null,t&&(this.forwardOffset=-1)),this.isEmpty()&&this._handleTimeout(!1,!1)}terminate(){this._handleTimeout(!1,!1)}_emitPartialOrError(e){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,e)}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]}_cancelP2p(){if(this.p2pCanceled)return;this.p2pCanceled=!0;const{seg_id:e,sn:t,level:s}=this.pieceMsg;[this.forwardPeer,this.reversePeer].filter((e=>!!e)).forEach((r=>{r.cancelDownload(t,s,e)}))}destroy(){this.logger.info("destroy syn"),clearTimeout(this.timer),this._cancelP2p(),this.removeAllListeners(),this.destroyed=!0,this._detachPeer(this.forwardPeer),this.forwardPeer=null,this.forwardOffset=-1,this._detachPeer(this.reversePeer),this.reversePeer=null,this.reverseOffset=1e4,this.bufArr=[],this.forwardStreamListeners=[],this.reverseStreamListeners=[]}_detachPeer(e){if(!e)return;const 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:i,sn:n,level:o,size:a}=this.pieceMsg,h=t-1;if(this.bufArr[h])return this.logger.warn(`syn bufArr ${this.pieceMsg.sn} already has ${h}`),!1;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!0;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(n,i,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}-${n} expectedSize ${a} != byteLength ${d} forward ${this.forwardOffset} reverse ${this.reverseOffset}`),this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,error_code.ERROR_SYN_INTERNAL)}_setupPeer(e,t){0===this.timeStart&&(this.timeStart=performance.now());const s=(t,s,r,i,n,o)=>{if(this.destroyed)return;if(!this._validateMsg(t,o.level,s))return void this.logger.warn(`onPieceData ${o.level}-${t} not match ${JSON.stringify(this.pieceMsg)} from ${e.remotePeerId}`);const{reverse:a}=o;this._receivePacket(a,i,r)&&!this.waitingRemain&&!this.rangeRequesting&&this.deadline>0&&this._shouldSwitch()&&(this.logger.warn("should switch to http"),clearTimeout(this.timer),this._handleTimeout(!1,!1))},r=t=>{if(this.destroyed)return;const{attachments:s,size:r,sn:i,level:n,seg_id:o}=t;return this._validateMsg(i,n,o)?this.pieceMsg.size&&r!==this.pieceMsg.size?(this.logger.warn(`onPiece ${t.level}-${t.sn} size not match`),void this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,error_code.ERROR_SYN_INTERNAL)):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.warn(`onPiece ${t.level}-${t.sn} not match ${JSON.stringify(this.pieceMsg)}`),void this.deletePeer(e))},i=t=>{this.destroyed||this.deletePeer(e)},n=()=>{this.destroyed||this.deletePeer(e)},o={onPieceData:s,onPiece:r,onPieceNotFound:i,onPieceAbort:n};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,i).once(hls_next_events.DC_PIECE_ABORT,n)}_validateMsg(e,t,s){return(!this.pieceMsg.seg_id||s===this.pieceMsg.seg_id)&&(e===this.pieceMsg.sn&&t===this.pieceMsg.level)}_shouldSwitch(){const e=peer.defaultPacketSize,t=this.pieceMsg.size-e*this.loadedPackets();return this.coordinator.shouldSwitchToHttp(t,this.deadline,this.p2pSpeed,e,this.httpLoadTime)}_startTimer(e,t=!0){this.timer=setTimeout(this._handleTimeout.bind(this,t),e)}loadedPackets(){return this.pieceMsg.attachments-(this.reverseOffset-this.forwardOffset-1)}_handleTimeout(e=!1,t=!0){if(this.destroyed)return;const{level:s,sn:r,size:i,attachments:n}=this.pieceMsg;if(!i||0===this.timeReceivePiece)return this.logger.warn(`syn load timeout ${s}-${r} url ${this.url}`),void this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,error_code.ERROR_SYN_INTERNAL);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.waitingRemain=!0,this.logger.info(`syn wait for remain ${e}`),void this._startTimer(e,!1)}if(t){const e=[this.forwardPeer,this.reversePeer].filter((e=>!!e)).sort(((e,t)=>e.currentLoadSpeed()-t.currentLoadSpeed())).shift();e&&e.loadtimeout()}if(this._cancelP2p(),this.rangeSupported&&this.url)return this._loadRemainBufferByHttp();this._notifyStreamListenersAbort(),this._emitPartialOrError(error_code.ERROR_SYN_ABORT)}shouldWaitForRemain(e){if(e<=0)return!1;const t=performance.now()-this.timeStart;return t<500||t<1e3&&this.timeReceivePiece>0&&e>3e3||this.shouldWaitForRemainUrgent(e)}shouldWaitForRemainUrgent(e){if(0===this.timeReceivePiece||e<=0)return!1;const t=this.p2pSpeed;let s=0;[this.forwardPeer,this.reversePeer].forEach((e=>{e&&(s+=e.loadedBytes())}));const r=(this.pieceMsg.size-s)/e;return this.logger.info(`syn remainTime ${e} speed ${t} required ${r}`),t>=r}get p2pSpeed(){let e=0;return[this.forwardPeer,this.reversePeer].forEach((t=>{t&&(e+=t.currentLoadSpeed())})),e}getFromPeerId(){const{forwardPeer:e,reversePeer:t}=this;return this.isFull()&&e!==t?`${e.remotePeerId}:${t.remotePeerId}`:e?`${e.remotePeerId}`:t?`${t.remotePeerId}`:""}_loadRemainBufferByHttp(){if(this.rangeRequesting)return;const{size:e,sn:t,level:s}=this.pieceMsg,r=this.rangeEnd>0?this.rangeEnd-1:0,i=this.forwardOffset,n=calRangeWithForwardReverseOffset(i,this.reverseOffset,e,this.rangeStart,r),o=performance.now();let a=this.deadline+this.httpLoadTime-o+1e3;a<2e3?a=2e3:a>6e3&&(a=6e3),this.logger.info(`continue download ${s}-${t} from ${this.url} range: ${n} timeout ${a}`),this.rangeRequesting=!0,this.headers&&(this.xhrSetup=e=>{for(const t of Object.keys(this.headers))e.setRequestHeader(t,this.headers[t])}),performRangeRequest(this.url,n,this.xhrSetup,a).then((e=>{if(this.destroyed)return;if(this.rangeRequesting=!1,!e)return void this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,error_code.ERROR_SYN_RANGE_REQUEST);let t=utils_buffer.l.from(e);const s=t.byteLength/(performance.now()-o);this.coordinator.addHttpSpeed(s);const r=splitBytes(t,0);let n=i+1;for(let e=0;e<r.length;e++)this.bufArr[n]||this._receivePacket(!1,n+1,r[e],!1),n++})).catch((e=>{if(this.destroyed)return;this.rangeRequesting=!1,this.logger.error(`http partial download ${t} error ${e}`);const s="timeout"===e?error_code.ERROR_SYN_HTTP_TIMEOUT:error_code.ERROR_SYN_RANGE_REQUEST;this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,s)}))}_print(){const{level:e,sn:t}=this.pieceMsg;this.logger.info(`syn parallel loading ${e}-${t}`)}}const coordinator_ALPHA=.6;class Coordinator{constructor(){this.meanHttpSpeed=0}addHttpSpeed(e){this.meanHttpSpeed=(1-coordinator_ALPHA)*this.meanHttpSpeed+coordinator_ALPHA*e}shouldSwitchToHttp(e,t,s,r,i){if(this.meanHttpSpeed<=0)return!1;if(s>=this.meanHttpSpeed)return!1;if(this.meanHttpSpeed*i>=e)return!1;return((i+t-performance.now())*this.meanHttpSpeed-e)/(this.meanHttpSpeed-s)*s<r}}const MIN_P2P_LOAD_TIME=1.5,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(hls_next_events.REQUESTING_MAP_HAVE),this.segmentBuilderMap=new RequestingMap(hls_next_events.BUILDER_MAP_HAVE),this.allowP2pLimit=t.httpLoadTime+MIN_P2P_LOAD_TIME,this.playlistInfo=new Map,this.isUploader=!1,this.isReceiver=!1,this.targetPeers={},this.mBufferedDuration=0,this.sequential=!0,this.httpTimeouts=0,this.httpRangeErrs=0,this.coordinator=new Coordinator,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())}get httpRangeSupported(){return this.config.httpRangeSupported}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:i,seg_id:n}=t;this.bitset.has(s,r)||this.bitCounts.incre(s,r);const o=i?SegmentState.COMPLETE:SegmentState.PARTIAL_FORWARD;e.bitset.add(s,r,n,o),this.emit(hls_next_events.SCH_DCHAVE,t.seg_id),e.isAvailableUrgently&&this._handleDCHave(e,s,r,n,o)}})).on(hls_next_events.DC_HAVE_REVERSE,(t=>{if(e.bitset&&t.sn>=0){const{sn:s,level:r,seg_id:i}=t;this.bitset.has(s,r)||this.bitCounts.incre(s,r),e.bitset.hasCompleteOr(s,r,SegmentState.PARTIAL_REVERSE)||e.bitset.add(s,r,i,SegmentState.PARTIAL_REVERSE),this.emit(hls_next_events.SCH_DCHAVE,t.seg_id),e.isAvailableUrgently&&this._handleDCHave(e,s,r,i,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>=7||this.notifyAllPeers(e.sn,e.level,e.seg_id,e.reverse?SegmentState.PARTIAL_REVERSE:SegmentState.PARTIAL_FORWARD)})).on(hls_next_events.DC_PIECE_CANCEL,(t=>{const{sn:s,level:r}=t,i=this.requestingMap.get(s,r);if(i)return void i.removeStreamListener(e.remotePeerId);const n=this.segmentBuilderMap.get(s,r);n&&n.removeStreamListener(e.remotePeerId)})).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:i,reverse:n}=t;this.isUploader=!0;let o=t.seg_id;o||(o=await this.bufMgr.getSegIdBySN(r));const a=this.requestingMap.get(r,i);let h=!1;a&&a.isDownloading()&&(h=n&&a.hasReversePeer()||!n&&a.hasForwardPeer());const l=await this.bufMgr.getSegById(o);if(l)s.info("found seg from bufMgr"),l.level===i?e.sendBuffer(l.sn,l.segId,l.data,{from:"FromCache",level:l.level,reverse:n}):e.sendPieceNotFound(r,o,{level:i});else if(h){s.info(`syn had ${a.loadedPackets()} packets, wait remain from upstream ${a.getFromPeerId()}`);const t=n?a.reversePeer:a.forwardPeer;e.sendPartialBuffer(t.pieceMsg,t.bufArr,{from:a.isFull()?"WaitPartialDouble":"WaitPartialSingle",incompletes:1}),d(a,e,n)}else{const t=this.segmentBuilderMap.get(r,i);if(t)s.info(`peer request ${r} wait from builder, sent ${t.bufferList.length}`),c(t,e);else if(r>=this.loadingSN){let t;const a=a=>{this.segmentBuilderMap.off(`${hls_next_events.BUILDER_MAP_HAVE}${r}-${i}`,t),a&&a.level===i?(s.info(`peer request notify seg ${a.sn}`),e.sendBuffer(a.sn,a.segId,a.data,{from:"NotifySegment",level:a.level,reverse:n})):e.sendPieceNotFound(r,o,{level:i})};t=t=>{this.bufMgr.off(`${hls_next_events.BM_ADDED_SN_}${r}`,a),c(t,e)};const h=`peer request ${r} wait`;this.isHlsjs?(s.info(`${h} from fragLoader`),this.segmentBuilderMap.once(`${hls_next_events.BUILDER_MAP_HAVE}${r}-${i}`,t)):s.info(`${h} for seg`),this.bufMgr.once(`${hls_next_events.BM_ADDED_SN_}${r}`,a)}else e.sendPieceNotFound(r,o,{level:i})}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,t.remotePeerId,((e,s,r,i,n)=>{r?t.sendMsgPieceAbort(i):t.send(i),n&&(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)&&e.bitset){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,r){const{logger:i,config:n}=this,o=1e3*(r-n.httpLoadTime),a=n.httpLoadTime+MIN_P2P_LOAD_TIME;if(i.info(`bufferedDuration ${r} remainLoadTime ${o}`),r<=a)return!1;if(this.requestingMap.has(e,t)){const h=this.requestingMap.get(e,t);if(!h)return this._searchAvailablePeers(e,t,s);const l=h.segId;if(l&&l!==s)return i.warn(`syn segId ${l} not match ${s}`),this.requestingMap.delete(e,t),this._searchAvailablePeers(e,t,s);if(!h.shouldWaitForRemain(o)){if(i.warn(`syn prefetch timeout at ${e}`),h.isFull())return!1;const o=this.peerManager.getPeersOrderByWeight(),l=findPeersWithState(o,SegmentState.COMPLETE,e,t,s);if(h.hasReversePeer()){const r=l.concat(findPeersWithState(o,SegmentState.PARTIAL_FORWARD,e,t,s));if(r.length>0)return this.targetPeers.forwardPeer=r[0],!0}else{const r=l.concat(findPeersWithState(o,SegmentState.PARTIAL_REVERSE,e,t,s));if(r.length>0)return this.targetPeers.reversePeer=r[0],!0}return n.httpRangeSupported&&r>a+1}return i.info(`prefetch ${e} wait for remain`),!0}return this._searchAvailablePeers(e,t,s)}_searchAvailablePeers(e,t,s){if(!this.hasIdlePeers||!this.peersHas(e,t))return!1;const r=this.peerManager.getPeersOrderByWeight(),[i,n]=getBestPairForDownload(r,e,t,s);return this.targetPeers={forwardPeer:i,reversePeer:n},[i,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){if(!s)return void this.logger.error("segId is required");const{live:i}=this.config;if(this.bitset.has(e,t,r))return;const n=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())a&&a.hasPeer(h)||h.notifySet.has(n)||h.bitset.hasCompleteOr(e,t,r)||(h.sendMsgHave(e,s,{level:t,reverse:r===SegmentState.PARTIAL_REVERSE,complete:o}),h.notifySet.add(n),i&&trimSet(h.notifySet,20))}checkPeers(){if(!this.hasPeers)return;const{logger:e,config:t,engine:s}=this,r=t.live,{currentLevel:i}=s;if(e.info(`currentLevel ${i}`),0===this.bitCounts.size(i))return;if(!r&&this.nextLostSN>=0&&this.nextLostSN>=this.currPlaySN-10)return;if(this.mBufferedDuration<this.allowP2pLimit&&(0!==this.mBufferedDuration||this.isHlsjs))return void e.info(`low buffer time ${this.mBufferedDuration}, skip prefetch`);const n=this.peerManager.getPeersOrderByWeight();if(0===n.length)return;const o=[];let{prefetchNum:a,endSN:h,startSN:l}=t;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(...n.filter((e=>e.endSN>=d)).map((e=>e?e.startSN:1/0)));if(!isFinite(e))return;d<e&&(d=e)}for(;o.length<a&&o.length<n.length&&c<this.maxPrefetchCount;){if(!r&&d>h)return;if(r&&d>this.loadingSN+2)return;if(this.bitset.has(d,i))d++;else{if(d!==this.loadingSN&&this.bitCounts.has(d,i)&&!this.requestingMap.has(d,i))for(let s of n)if(!o.includes(s)&&s.bitset.has(d,i)){const n=s.bitset.getState(d,i);let a;a=n===SegmentState.COMPLETE?r?randomNum(0,100)>40:0===randomNum(0,1):n===SegmentState.PARTIAL_REVERSE,o.push(s);const h=s.bitset.getSegId(d,i),l=new Synthesizer(this.coordinator,this.logger,d,i,h,t.httpRangeSupported);this._setupSynthesizer(l),a?l.setReversePeer(s):l.setForwardPeer(s),this.requestingMap.set(d,i,l),s.requestDataBySN(d,!1,{level:i,reverse:a}),e.info(`request prefetch ${d} level ${i} 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 i=s.split("-"),n=Number(i[1]),o=Number(i[0]);r.hasPeerId(e)&&(this.logger.info(`delete ${s} in requestingMap`),r.deletePeer(t),this.bitCounts.decre(n,o),t.bitset.delete(n,o))}}shouldWaitForNextSeg(){let e;return e=!this.isUploader&&(!!this.isReceiver||randomNum(0,100)>20),this.isReceiver=this.isUploader=!1,e}updateLoaded(e,t,s){this.bitset.hasCompleteOr(e,t)||(this.bitset.add(e,t,s,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,currentSrc:t}=this.engine;if(!e||e.src!==t&&0===e.currentTime){if(this.logger.info("try get video element"),e=tryGetMediaElement(this.config.mediaElem,t),!e)return 5;this.engine.media=e}let s=0,r=e.currentTime,i=e.buffered;for(let e=i.length-1;e>=0;e--)if(r>=i.start(e)&&r<=i.end(e)){s=i.end(e)-r;break}return this.mBufferedDuration=s,s>0?s:0}destroy(){super.destroy(),this.requestingMap.clear(),this.segmentBuilderMap.clear()}_notifySynthesizer(e,t,s,r,i,n=!0){const{logger:o}=this,a=this.requestingMap.get(s,r);if(!a)return;const h=a.segId;function l(i,n){n?e.requestDataById(t,s,!0,{level:r,reverse:i}):(o.info(`notify syn prefetch ${s}`),e.requestDataBySN(s,!1,{level:r,reverse:i}))}t&&h&&t!==h?o.warn(`notifySynthesizer segId ${t} not match ${h}`):a.isFull()||(a.isAlmostDeadline()?o.info("almost deadline, ignored"):a.hasForwardPeer()||i!==SegmentState.PARTIAL_FORWARD&&i!==SegmentState.COMPLETE?a.hasReversePeer()||i!==SegmentState.PARTIAL_REVERSE&&i!==SegmentState.COMPLETE||(a.setReversePeer(e),l(!0,n)):(a.setForwardPeer(e),l(!1,n)))}_setupEngine(){}getStatsForPeer(){const{currentLevel:e,media:t}=this.engine,s={level:e};if(t&&!this.config.live){const{currentTime:e}=t;s.pos=Math.round(e)}return s}_handleSynError(e){switch(e){case error_code.ERROR_SYN_RANGE_REQUEST:this.logger.warn("ERROR_SYN_RANGE_REQUEST"),this.httpRangeErrs++;break;case error_code.ERROR_SYN_HTTP_TIMEOUT:this.logger.warn("ERROR_SYN_HTTP_TIMEOUT"),this.httpTimeouts+=3}this.httpRangeErrs>=1&&(this.config.httpLoadTime<=4500&&(this.config.httpLoadTime+=500),this.httpRangeErrs=0)}}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,s){this.streamListeners.push({handler:s,peerId:t})}removeStreamListener(e){this.streamListeners=this.streamListeners.filter((t=>t.peerId!==e||(t.handler(void 0,void 0,!0,"aborted by cancel"),!1)))}_notifyStreamListenersAbort(){for(let e of this.streamListeners){const{handler:t}=e;t(void 0,void 0,!0,"aborted by httpLoader")}this.streamListeners.length=0}_notifyStreamListeners(e){const{sn:t,seg_id:s}=this.pieceMsg;for(let r of this.streamListeners){const{handler:i}=r;i(t,s,!1,e,this.finished)}this.finished&&(this.streamListeners.length=0)}}class HlsSwScheduler extends Scheduler{constructor(e,t){super(e,t),this.server=t.fetcher,this.p2pEnabled=e.p2pEnabled,this.resolveMap=new Map,this.dcDownloadTimeout=t.live?5:9,this.segmentId=t.segmentId}async handleGetMediaData(e,t){const{logger:s,config:r,engine:i}=this;let{url:n,range:o}=e;o&&(n=`${n}|${o}`);const a=this.fragMap.get(n);if(!a)return s.warn(`cannot get frag ${n}`),t.postMessage({action:hls_next_events.SW_GET_MEDIA});i.currentLevelIndex=a.level;const{sn:h,baseurl:l,level:c}=a,d=this.segmentId(String(c),h,e.url,o),u=d===this.loadingSegId;u&&s.warn(`duplicate request ${d}`),this.loadingSN=h,i.bufMgr&&(i.bufMgr.loadingSN=h),this.loadingSegId=d;const g=await this.bufMgr.getSegById(d);if(g)return s.info(`bufMgr found seg sn ${h} segId ${d}`),a.loaded=g.data.byteLength,a.fromPeerId=g.fromPeerId,i.emit(hls_next_events.FRAG_LOADED,{url:e.url,sn:h,level:c,segId:d,loaded:a.loaded,duration:a.duration,byP2p:!0,fromPeerId:g.fromPeerId}),this._onFragLoaded(e.url,a),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:e.url,buffer:g.data,incomplete:!1}});const f=this.getBufferedDuration();if(s.info(`handleGetMediaData sn ${h} bufferedDuration ${f}`),this.resolveMap.has(h)||u){let e=this.requestingMap.get(h,c);if(e||u){e&&(s.warn(`${h} is requesting, terminate syn wait for seg`),e.terminate());let r=1e3*(f-this.config.httpLoadTime)+1e3;r<0&&(r=0);let i=setTimeout((()=>{s.info(`notify seg ${h} timeout`),i=-1,t.postMessage({action:hls_next_events.SW_GET_MEDIA})}),r);this.bufMgr.once(`${hls_next_events.BM_ADDED_SN_}${h}`,(e=>{i<0||e&&e.level===c&&(clearTimeout(i),s.info(`notify seg ${e.sn}`),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:n,buffer:e.data,incomplete:!1}}))}))}else s.warn(`${h} is requesting, fallback`),t.postMessage({action:hls_next_events.SW_GET_MEDIA})}else if(this.hasAndSetTargetPeer(h,c,d,f)){await this._loadFragByP2p(a,t,h,d,e.url,c)||t.postMessage({action:hls_next_events.SW_GET_MEDIA})}else{const e=this.requestingMap.get(h,c);if(this.httpRangeSupported&&e&&e.segId===d&&e.hasPartialBuffer()){s.warn(`syn has partial buffer for ${d}`);const[r,i]=e.getPartialBuffer();t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:n,bufferLeft:r,bufferRight:i,incomplete:!0,size:e.pieceMsg.size}},[r,i].filter((e=>!!e)).map((e=>e.buffer)))}else t.postMessage({action:hls_next_events.SW_GET_MEDIA})}}async _loadFragByP2p(e,t,s,r,i,n){const{logger:o}=this;o.info(`p2p load sn ${s} segId ${r} level ${n}`);const a=await this.load(s,r,n);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 ${n} size ${g}`),e.loaded=(d?d.byteLength:0)+(u?u.byteLength:0);else{if(o.info(`p2p loaded segId ${r} level ${n} size ${h.byteLength} incomplete ${l}`),!await this.bufMgr.hasSegOfId(r)){const e=new Segment(s,r,h,c,n);o.info(`bufMgr putSeg ${s} level ${n}`),this.bufMgr.putSeg(e)}e.loaded=h.byteLength}return e.fromPeerId=c,this.engine.emit(hls_next_events.FRAG_LOADED,{url:i,sn:s,level:n,segId:r,loaded:e.loaded,duration:e.duration,byP2p:!0,fromPeerId:c}),this._onFragLoaded(i,e),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:i,buffer:h,bufferLeft:d,bufferRight:u,incomplete:l,size:g}},[d,u].filter((e=>!!e)).map((e=>e.buffer))),!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:i,buffer:h.data,incomplete:!1}}),!0)}_processStream(e,t,s,r,i){const n=peer.defaultPacketSize,{segmentBuilderMap:o,logger:a}=this;a.info(`got stream ${s}`);const h=new SegmentBuilder(s,r,i,t);o.has(s,r)||o.set(s,r,h);const l=e.getReader();let c=0,d=0,u=(0,utils_buffer.l)(0);return new Promise(((e,t)=>{const s=()=>{l.read().then((({value:t,done:r})=>{if(t&&(c+=t.length),r){if(u.byteLength>0)if(c<=n){const e=(0,utils_buffer.l)(c);u.copy(e,0,d*n,u.byteLength),h.receiveBytes(e,!0)}else{const e=splitBytes(u,d*n);for(let t=0;t<e.length;t++)h.receiveBytes(e[t],t===e.length-1)}const t=u.buffer;return e(t)}const i=utils_buffer.l.from(t);if(u=utils_buffer.l.concat([u,i]),c>=n){c-=n;const e=(0,utils_buffer.l)(n);u.copy(e,0,d*n,(d+1)*n),d++,h.receiveBytes(e,!1)}s()})).catch((e=>{t(e)}))};s()}))}async handleMediaData(e,t){t.postMessage({action:hls_next_events.SW_MEDIA});const{logger:s,engine:r}=this;let{url:i,buffer:n,stream:o,range:a,p2p:h,httpSpeed:l,size:c}=e;if(r.rangeTestUrl===i)return void(r.rangeTestUrl="");s.info(`SW_MEDIA url ${i} size ${c} range ${a} speed ${l}`),l&&this.coordinator.addHttpSpeed(l),a&&(i=`${i}|${a}`);const d=this.fragMap.get(i);if(!d)return;const{sn:u,level:g,baseurl:f}=d,p=this.segmentId(String(g),u,e.url,a);if(o){this.notifyAllPeers(u,g,p,SegmentState.PARTIAL_FORWARD);try{n=await this._processStream(o,c,u,g,p)}catch(e){return void s.warn(e)}finally{this.segmentBuilderMap.delete(u,g)}}if(this.notifyAllPeers(u,g,p),d.segId=p,d.loaded=n.byteLength,r.emit(hls_next_events.FRAG_LOADED,{url:e.url,sn:u,level:g,segId:p,loaded:d.loaded,duration:d.duration,byP2p:!1}),this._onFragLoaded(e.url,d),!await this.bufMgr.hasSegOfId(p)){const e=new Segment(u,p,n,"",g);this.bufMgr.putSeg(e),s.info(`bufMgr putSeg ${p} level ${g}`);const t=h&&h>0?h:0,r=n.byteLength-t;this.reportTraffic(r,t,0)}}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.server.increMediaRequests(),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,t.segId),!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:i}=this;this.isReceiver=!0;let n=this.mBufferedDuration-this.config.httpLoadTime;n>this.dcDownloadTimeout&&(n=this.dcDownloadTimeout);const{forwardPeer:o,reversePeer:a}=this.targetPeers;o||a||(n-=1);let h=this.requestingMap.get(e,s),l={allowLoadPartial:this.httpRangeSupported,segId:t};h?h.setExtra(l):(h=new Synthesizer(this.coordinator,this.logger,e,s,t,this.httpRangeSupported,l),this._setupSynthesizer(h),this.requestingMap.set(e,s,h)),h.setTimeout(1e3*n),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 i={resolve:r,sn:e,level:s,segId:t,incomplete:!1};this.resolveMap.set(e,i)}));return this.targetPeers={},c}_setupSynthesizer(e){e.on(hls_next_events.SYN_OUTPUT,((t,s)=>{const{config:r,logger:i}=this,{segId:n,sn:o,data:a,level:h}=t,{speed:l,http:c,p2p:d}=s;this.httpTimeouts>0&&this.httpTimeouts--;const u=this.resolveMap.has(o);if(r.validateSegment(n,new Uint8Array(a))){this.notifyAllPeers(o,h,n),this.bitset.has(o,h)||this.reportTraffic(c,d,l);const s=e.getFromPeerId();if(u){i.info(`receive criticalSeg seg_id ${n}`);const e=this.resolveMap.get(o);this.resolveMap.delete(o),e.resolve({data:a,fromPeerId:s})}else this.bitset.has(o,h)||(this.bufMgr.putSeg(t),this.updateLoaded(o,h,n))}else if(i.error(`segment ${n} validate failed`),u){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:i,level:n,size:o}=t;if(this.httpTimeouts++,this.resolveMap.has(i)){this.resolveMap.get(i).resolve({bufferLeft:s,bufferRight:r,fromPeerId:e.getFromPeerId(),incomplete:!0,size:o}),this.resolveMap.delete(i)}this.requestingMap.delete(i,n)})).on(hls_next_events.SYN_ERROR,((e,t)=>{const{sn:s,level:r}=e;if(this.resolveMap.has(s)){const e=this.resolveMap.get(s);this.resolveMap.delete(s),e.resolve()}this.requestingMap.delete(s,r)}))}_handleDCHave(e,t,s,r,i){const n=0!==this.resolveMap.size;n&&this.resolveMap.has(t)?this._notifySynthesizer(e,r,t,s,i):this.httpTimeouts>=1&&t===this.loadingSN+1&&this._notifySynthesizer(e,void 0,t,s,i,!1),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,i,n=s.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(r=n.next()).done;)o.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(s=n.return)&&s.call(n)}finally{if(i)throw i.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 i=e.call(this,"close",r)||this;return i.wasClean=!0,i.code=t,i.reason=s,i}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 i=__values(r),n=i.next();!n.done;n=i.next()){var o=n.value;this._callEventListener(e,o)}}catch(e){t={error:e}}finally{try{n&&!n.done&&(s=i.return)&&s.call(i)}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,i=void 0===r?DEFAULT.minReconnectionDelay:r,n=e.maxReconnectionDelay,o=void 0===n?DEFAULT.maxReconnectionDelay:n,a=0;return this._retryCount>0&&(a=i*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,i=t.connectionTimeout,n=void 0===i?DEFAULT.connectionTimeout:i,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()}),n))}))}}},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,i="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=i}_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),setTimeout((()=>{this.destroyed||(this.backupWS=this._init(r,"backup"))}),800),this._connected=!1,this.destroyed=!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);r&&r.sendSignal(e,t)}else this.mainConnected?this.mainWS.sendSignal(e,t):this.backupConnected?this.backupWS.sendSignal(e,t):this.logger.warn("no signal available")}sendReject(e,t,s,r){if(r){const i=this._getWSByName(r);if(i)return void i.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(),this.destroyed=!0}get connected(){return this.mainConnected||this.backupConnected}get mainConnected(){return this.mainWS&&this.mainWS.connected}get backupConnected(){return this.backupWS&&this.backupWS.connected}};function getPeersThrottle(e,t,s=70){var r=null,i=!1,n=s;return function(s=!1){if(s)return clearTimeout(r),void(i=!1);i||(i=!0,r=setTimeout((function(){e.call(t,n),i=!1,r=null}),1e3*n),n*=1)}}const utils_getPeersThrottle=getPeersThrottle,MAX_PC_CONNS=22,MAX_MOBILE_CONNS=13,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.signalerWs=null,this.fetcher=t,this._setupServer(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,this.overloaded=!1}get totalConns(){return this.scheduler.peersNum+1}resumeP2P(){if(!this.fetcher)return;const{engine:e,config:t,fetcher:s}=this,{btAnnounce:r,btAnnouncePreflight:i}=s;(t.geoIpPreflight?i: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 i=e.netType;let n,o;if((s.wifi_only||t.wifiOnly)&&"wifi"!==i&&"ethernet"!==i&&(this.scheduler.downloadOnly=!0,this.logger.info("downloadOnly mode")),"object"==typeof t.wsSignalerAddr&&t.wsSignalerAddr.main)n=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}n=t.wsSignalerAddr}this.signalerWs=this._initSignalerWs(s.signal||n,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),s.overload&&(this.overloaded=!0,this.logger.warn("tracker is overloaded, degrade")),this.logger.info(`announce request response ${JSON.stringify(s,null,2)}`)})).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.postStatsWithBeacon(),this.fetcher.destroy(),this.fetcher=null,this.requestMorePeers(!0),this.scheduler.destroy(),this.scheduler=null,this.signalerWs&&(this.signalerWs.destroy(),this.signalerWs=null),this.peers=[];for(let e of this.DCMap.values())e.destroy(!0);this.DCMap.clear(),this.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})})),t}_tryConnectToAllPeers(e=0){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+e){this.logger.debug("clear exceeded peers"),this.peers=[];break}let t=this.peers.shift();const s=t.intermediator;this.logger.debug(`new DataChannel ${t.id} intermediator ${s}`),this._createDatachannel(t.id,!0,s)}}_setupServer(e){e.on(events.SVR_PEERS,(e=>{this.logger.info(`got seeds ${e.length}`),this.peers=[...this.peers,...this._filterPeers(e)],this._tryConnectToAllPeers(5)}))}_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.logger.warn(`intermediator ${e.intermediator} relay failed`)}}this.signalerWs.sendSignal(s,t,e.signalName)})).on(events.DC_PEER_SIGNAL,(t=>{const s=t.to_peer_id,r=t.from_peer_id,i=t.action;if(s&&r&&i)if(s!==this.peerId){this.logger.info(`relay signal for ${r}`);const n=this.DCMap.get(s);if(n){if("signal"!==i)return void n.sendMsgSignalReject(s,r,t.reason,t.fatal);if(n.sendMsgSignal(s,r,t.data))return}e.sendMsgSignal(r,s)}else"signal"===i?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=this.DCMap.size>=this.minConns+3;this.requestMorePeers(r),this.peersIncrement++,this._doSignalFusing(s.peersNum+1)}))}_doSignalFusing(e){if(this.fuseRate<=0)return;const t=this.signalerWs.connected;t&&e>=this.fuseRate+2?(this.logger.warn("reach fuseRate, report stats close signaler"),this.totalConns-1>0&&this.fetcher.postStats(),this.signalerWs.close()):!t&&e<this.fuseRate&&(this.logger.warn("low conns, reconnect signaler"),this.signalerWs.reconnect())}_initSignalerWs(e,t,s,r){const i=(e,t)=>{let s=`${e}?id=${this.peerId}&p=web&v=2.4.6`;return t&&(s=`${s}&token=${t}`),s};let n,o=i(e,s);if(t&&t!==e){let e=i(t,r);n=new signal_manager(this.logger,this.config,o,e)}else n=new websocket_client(this.logger,this.config,o,270);return n.onopen=()=>{this.connected=!0,this.engine.emit("serverConnected",!0),this._tryConnectToAllPeers()},n.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}`)}},n.onclose=()=>{this.connected=!1,this.engine.emit("serverConnected",!1)},n.onerror=e=>{e.message&&this.engine.emit(events.EXCEPTION,err_code_default()(e,"SIGNAL_EXPT"))},n}_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:i}=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{const t=this.DCMap.get(e);if(!t)return;if(this.signalerWs.backupConnected&&t&&t.signalMsgs.length>0&&"main"===r&&!t.useBackupSignal){t.useBackupSignal=!0,t.signalName="backup",i.warn(`${e} not found from main, try backup signal`);for(let s of t.signalMsgs)this.signalerWs.sendSignal(e,s,"backup");return}if(t.useBackupSignal)return;this._destroyAndDeletePeer(e),i.info(`signaling ${e} not found`);const{scheduler:n}=this;n.waitForPeer&&(n.waitingPeers--,0===n.waitingPeers&&n.notifyPeersLoaded(0)),this.requestMorePeers(),s||this.failedDCSet.add(e)}}_handleSignal(e,t,s,r){const i=t.type,{logger:n}=this;let o=this.DCMap.get(e);if(o){if(o.connected)return void n.info("datachannel had connected, signal ignored");if("offer"===i){if(!(this.peerId>e))return void n.warn(`signal type wrong ${i}, ignored`);this._destroyAndDeletePeer(e,!1),n.warn(`signal type wrong ${i}, convert to non initiator`),o=this._createDatachannel(e,!1,s)}}else{if("answer"===i){const t=`signal type wrong ${i}`;return n.warn(t),this._sendSignalReject(e,t,s,r),void this._destroyAndDeletePeer(e,!1)}n.debug(`receive node ${e} connection request`);const t=this.scheduler.peersNum;if(t>=this.maxConns){const i=this.scheduler.getNonactivePeers();if(!(i.length>0)){const t=`peers reach limit ${this.maxConns}`;return n.warn(t),void this._sendSignalReject(e,t,s,r)}{let e=t-this.maxConns+2;for(i.length<e&&(e=i.length);e>0;){const t=i.shift();t&&(n.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){let r=this.config.trickleICE;this.overloaded&&!s&&(r=!1);const i=new peer(this.engine,this.peerId,e,t,this.config,this.sequential,{stuns:this.stuns,intermediator:s,trickle:r});return this.DCMap.set(e,i),this._setupDC(i),i}_sendSignalReject(e,t,s,r,i){if(s){const r=this.DCMap.get(s);if(r&&r.sendMsgSignalReject(e,this.peerId,t,i))return}this.signalerWs.sendReject(e,t,i,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.overloaded?(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;function getMediaBuffered(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 t>0?t:0}function listenMediaRebuffer(e,t){let s=null;const r=()=>{s||(s=setTimeout((()=>{t()}),2500))},i=()=>{null!=s&&(clearTimeout(s),s=null)};return e.addEventListener("waiting",r),e.addEventListener("playing",i),()=>{e.removeEventListener("waiting",r),e.removeEventListener("playing",i)}}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:i}=this,n=e.live;i.live=n,this.targetDuration=e.averagetargetduration,this.browserInfo={...r,live:n,abr:this.multiBitrate||void 0,type:"hls_sw"},this.channel=`${t(this.currentSrc)}|${s}[${peer.VERSION}]`,this.setupElectron();const o=this.initLogger();if(o.info("use HlsSwP2pEngine"),o.info(`engine version: ${engine_base.version} hls-proxy version: ${this.swVersion}`),o.info(`channel ${this.channel}`),n||(i.startSN=e.startSN,i.endSN=e.endSN,o.info(`startSN ${e.startSN} endSN ${e.endSN}`)),navigator.serviceWorker.controller)if(i.httpStreamEnabled)try{const e=new ReadableStream({start(e){e.enqueue({action:hls_next_events.STREAM_DETECT})}});navigator.serviceWorker.controller.postMessage(e,[e])}catch(e){}else navigator.serviceWorker.controller.postMessage({action:hls_next_events.STREAM_DISABLE});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}watchRebuffering(e){this.offEventRebuffer=listenMediaRebuffer(e,(()=>{this.fetcher&&this.fetcher.increRebuffers()}))}handlePlaylist(e,t){const{config:s,logger:r}=this,{url:i,redirectedUrl:n,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,i.split("?")[0],n)}_parsePlaylist(e,t,s){const r=t;s&&(t=s);const{config:i,logger:n}=this;if(e.indexOf("#EXTINF:")>0||e.indexOf("#EXT-X-TARGETDURATION:")>0){let s=0;const n=M3U8Parser.parseLevelPlaylist(e,t);this.levels.length>1?(s=this.levels.indexOf(n.url),-1===s?(this.restartP2p(),this.currentSrc=r,s=0):this.currentLevelIndex=s):(""!==this.currentSrc&&r!==this.currentSrc&&this.restartP2p(),this.currentSrc=r,this.levels=[t]),this.emit(hls_next_events.LEVEL_LOADED,n),i.live&&trimMap(this.fragMap,200),n.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)})),i.sharePlaylist&&i.scheduler&&i.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:i}=s;if(!i)return void r.warn("scheduler not found");const{url:n}=e,o=n.split("?")[0];if(i.playlistInfo.has(o)){const e=i.getPlaylistFromPeer(o);if(e&&e.data){const{data:s,seq:i}=e;return r.info(`got playlist from peer seq ${i}`),t.postMessage({action:hls_next_events.SW_GET_PLAYLIST,data:{text:s}}),void this._parsePlaylist(s,n.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 i=()=>{"activated"===t.state?(t.removeEventListener("statechange",i),s(e)):"redundant"===t.state&&r("sw is redundant")};t.addEventListener("statechange",i)}))}))))}unregisterServiceWorker(){const{config:e}=this,t="serviceWorker is not registered";return new Promise(((s,r)=>{const{serviceWorker:i}=navigator;i||r(t),i.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))}t.live||(t.tag=this.getTagForVod());let r=new server(this,this.config.token,encodeURIComponent(e),this.config.announce||"",t);this.fetcher=r,this.config.fetcher=r;const i=setInterval((()=>{this.media?(clearInterval(i),this.watchRebuffering(this.media)):this.media=tryGetMediaElement(this.config.mediaElem)}),3e3);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.offEventRebuffer(),this.p2pEnabled&&(this.config.p2pEnabled=this.p2pEnabled=!1,this.tracker&&this.tracker instanceof tracker_client&&(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,i,n,o;const a=performance.now();s=a-300,r=a-200,i=a,e.trequest=s,e.tfirst=r,e.tload=i,e.loading={first:s,start:r,end:i},n=o=t,e.loaded=n,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 i=getRequestParameters(e,this.controller.signal);const n="arraybuffer"===e.responseType,o=n?"byteLength":"length",a=s.onUpdate,h=s.onBodyStart;this.context=e,this.config=t,this.callbacks=s,this.xhrSetup&&(this.xhrSetup(this.fakeXhr,e.url),i=mergeXhrSetup(this.fakeXhr,i)),this.request=this.fetchSetup(e,i),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})),n?t.arrayBuffer():t.text())})).then((t=>{const{response:i}=this;clearTimeout(this.requestTimeout),r.tload=r.loading.end=Math.max(performance.now(),r.loading.first),r.loaded=r.total=t[o];const n={url:i.url,data:t};s.onProgress(r,e,t,i),s.onSuccess(n,r,e,i)})).catch((t=>{if(clearTimeout(this.requestTimeout),r.aborted)return;a&&a(void 0,!1,!0);const i=t&&t.code||0,n=t?t.message:null;s.onError({code:i,text:n},e,t?t.details:null)}))}loadProgressively(e,t,s,r){const i=e.body.getReader();let n=0,o=0,a=(0,utils_buffer.l)(0);const h=()=>i.read().then((({value:s,done:i})=>{const{fakeXhr:l}=this;if(l.readyState!==l.LOADING&&(l.readyState=l.LOADING,l.emit("readystatechange")),s&&(n+=s.length),i){if(a.byteLength>0)if(n<=this.packetSize){const e=(0,utils_buffer.l)(n);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:i,statusText:h,url:l}=e;return s.readyState=s.DONE,s.responseText=i,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]),n>=this.packetSize){n-=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}}const MIN_TIME_FOR_LOAD=7,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:i}=window.__p2p_loader__;this.isHlsV0=i,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:i}=this,n=e.frag;this.isHlsV0||(n.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(n.level),n.sn,n.url,t)}if(!n.url||isBlockType(n.url,this.blockTypes))return r.info(`HTTP load blockType ${n.url}`),e.frag.loadByHTTP=!0,this.httpLoader.load(e,t,s);if(this.forbidden)return;this.fetcher.increMediaRequests(),t.maxRetry=2;const a=i.getBufferedDuration(),h=await this.bufMgr.getSegById(o);if(this.p2pEnabled&&h){r.info(`bufMgr found seg sn ${n.sn} segId ${o} level ${n.level}`);let t=copyBuffer(h.data).buffer,i={url:e.url,data:t};updateLoadStats(this.stats,h.size),n.loaded=h.size,n.loadByP2P=!0,e.frag.fromPeerId=h.fromPeerId,queue_microtask_default()((()=>{!this.isHlsV0&&s.onProgress&&s.onProgress(this.stats,e,i.data),s.onSuccess(i,this.stats,e)}))}else if(this.p2pEnabled&&i.hasAndSetTargetPeer(n.sn,n.level,n.segId,a))this.loadFragByP2p(e,t,s,o);else if(r.info(`fragLoader load ${o} at ${n.sn} level ${n.level} buffered ${1e3*a}`),this.isLive&&i.hasIdlePeers&&a>MIN_TIME_FOR_LOAD&&i.shouldWaitForNextSeg()){let h=a-MIN_TIME_FOR_LOAD;h>MAX_TIME_FOR_WAIT&&(h=MAX_TIME_FOR_WAIT);const l=r=>{r===o&&(i.off(hls_next_events.SCH_DCHAVE,l),clearTimeout(this.waitTimer),i.hasAndSetTargetPeer(n.sn,n.level,n.segId,a)?this.loadFragByP2p(e,t,s,o):this.loadFragByHttp(e,t,s,o))};r.info(`wait peer have for ${h}s`),i.on(hls_next_events.SCH_DCHAVE,l),this.waitTimer=setTimeout((()=>{this.loadFragByHttp(e,t,s,o),i.off(hls_next_events.SCH_DCHAVE,l)}),1e3*h)}else{const a=i.requestingMap.get(n.sn,n.level);i.httpRangeSupported&&a&&a.segId===n.segId&&a.hasPartialBuffer()?(r.warn(`syn has partial buffer for ${n.segId}`),this.loadFragByP2p(e,t,s,o)):this.loadFragByHttp(e,t,s,o)}}loadFragByHttp(e,t,s,r){const{logger:i,scheduler:n}=this,{segmentBuilderMap:o}=n;n.isReceiver=!1;const a=e.frag,{sn:h,level:l}=a;if(this.streamEnabled){let e;n.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;i.info(`HTTP loaded ${r} time ${a}`),n.notifyAllPeers(h,l,r),c(e,t,s)};const d=s.onProgress;s.onProgress=(e,t,s)=>{a.loaded=e.total,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:i}=this,n=e.frag;this.scheduler.load(e,t,s);const o=s.onSuccess,a=s.onTimeout;s.onTimeout=(e,h)=>{i.warn(`P2P timeout switched to HTTP load ${n.relurl} at ${n.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(n.sn,r,t,n.fromPeerId||this.fetcher.peerId,n.level);this.bufMgr.putSeg(s)}n.loadByP2P||this.fetcher.reportFlow(t.total),n.loaded=t.loaded,i.info(`${n.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:i}=e,n=i.split("?")[0],o=s.onSuccess;if(s.onSuccess=(e,t,s)=>{this.scheduler.broadcastPlaylist(n,e.data),o(e,t,s)},this.scheduler.playlistInfo.has(n)){const t=this.scheduler.getPlaylistFromPeer(n);if(t&&t.data){const{data:n,seq:o}=t;r.info(`got playlist from peer seq ${o}`),updateLoadStats(this.stats,n.length);let a={url:i,data:n};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:i}=this;this.context=e;const{rangeStart:n,rangeEnd:o,url:a}=e,h=e.frag,{segId:l,sn:c,level:d}=h;this.callbacks=s,this.stats=createLoadStats(),this.criticalSeg={sn:c,level:d,segId:l};let u=this.mBufferedDuration-i.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(n),rangeEnd:Number(o),url:a,httpLoadTime:1e3*i.httpLoadTime-500,xhrSetup:i.xhrSetup,segId:l};p?p.setExtra(_):(p=new Synthesizer(this.coordinator,this.logger,c,d,l,this.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:i}=this,{segId:n,sn:o,data:a,level:h}=t,{speed:l,http:c,p2p:d}=s;c>0?this.httpTimeouts++:this.httpTimeouts>0&&this.httpTimeouts--;const u=this.criticalSeg&&this.criticalSeg.segId===n;if(r.validateSegment(n,new Uint8Array(a))){this.notifyAllPeers(o,h,n),this.bitset.has(o,h)||this.reportTraffic(c,d,l);const s=e.getFromPeerId();if(u){i.info(`receive criticalSeg seg_id ${n}`);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:t}=this.context;t.fromPeerId=s,t.loadByP2P=!0,this.callbacks.onSuccess({data:a,url:this.context.url},e,this.context)}else this.bitset.has(o,h)||(this.bufMgr.putSeg(t),this.updateLoaded(o,h,n))}else i.error(`segment ${n} validate failed`),u&&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,t)=>{const{sn:s,level:r}=e;this.logger.warn(`SYN_ERROR loading ${s} code ${t}`),this.criticalSeg&&this.criticalSeg.sn===s&&(this.criticalSeg=null,this.callbacks.onTimeout(this.stats,this.context,null)),this.requestingMap.delete(s,r),this._handleSynError(t)}))}_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,t)})).on(hls_next_events.FRAG_CHANGED,(({sn:e})=>{this.updatePlaySN(e)}))}_handleDCHave(e,t,s,r,i){this.criticalSeg&&this.criticalSeg.sn===t&&this.criticalSeg.level===s?this._notifySynthesizer(e,r,t,s,i):this.httpTimeouts>=1&&t===this.loadingSN+1&&this._notifySynthesizer(e,void 0,t,s,i,!1),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:i}=this.setup();e.config.segmentId=this.config.segmentId;const n=(t,o)=>{if(!o)return;const{config:a}=this,h=o.details,l=h.live;a.live=this.hlsjs.config.live=l,this.browserInfo={...i,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,n)};e.on(this.HLSEvents.LEVEL_LOADED,n);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)}t.live||(t.tag=this.getTagForVod()),this.hlsjs.config.bufMgr=this.bufMgr,this.media=this.hlsjs.media,this.media&&(this.currentSrc=this.media.src);let i=new server(this,r.token,encodeURIComponent(e),r.announce||"",t);this.fetcher=i;const n=new hlsjs_scheduler(this,r);this.tracker=new tracker_client(this,i,n,r),n.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:i,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:i,segId:n}=s;if(!isBlockType(s.url,this.config.p2pBlackList)){if(this.logger.debug("loading frag "+r),this.bufMgr&&(this.bufMgr.loadingSN=r),!n){let e;s._byteRange&&(e="bytes="+s._byteRange[0]+"-"+s._byteRange[1]);let r=s.url;n=t.frag.segId=this.config.segmentId(String(i),s.sn,r,e)}this.emit(hls_next_events.FRAG_LOADING,{sn:r,segId:n,byHttp:s.loadByHTTP,level:i})}}_onFragLoaded(e,t){const{sn:s,segId:r,loaded:i,duration:n,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:i,duration:n,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,r=`${t.type} details ${t.details} reason ${t.reason}`;t.fatal?s.error(r):s.warn(r);const i=this.hlsjs.constructor.ErrorDetails;switch(t.details){case i.BUFFER_STALLED_ERROR:this.fetcher&&this.fetcher.increRebuffers();break;case i.INTERNAL_EXCEPTION:this.fetcher&&(this.fetcher.errsInternalExpt++,this.fetcher.exptMsg=`${t.err.message} event ${t.event} 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 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,window.__swP2pEngineHlsActive)return console.warn("P2pEngineHls is already activated"),void(this._realEngine=new shadow_p2pengine(e));"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 i=Number.isNaN||function(e){return e!=e};function n(){n.init.call(this)}e.exports=n,e.exports.once=function(e,t){return new Promise((function(s,r){function i(s){e.removeListener(t,n),r(s)}function n(){"function"==typeof e.removeListener&&e.removeListener("error",i),s([].slice.call(arguments))}p(e,t,n,{once:!0}),"error"!==t&&function(e,t,s){"function"==typeof e.on&&p(e,"error",t,s)}(e,i,{once:!0})}))},n.EventEmitter=n,n.prototype._events=void 0,n.prototype._eventsCount=0,n.prototype._maxListeners=void 0;var o=10;function a(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function h(e){return void 0===e._maxListeners?n.defaultMaxListeners:e._maxListeners}function l(e,t,s,r){var i,n,o,l;if(a(s),void 0===(n=e._events)?(n=e._events=Object.create(null),e._eventsCount=0):(void 0!==n.newListener&&(e.emit("newListener",t,s.listener?s.listener:s),n=e._events),o=n[t]),void 0===o)o=n[t]=s,++e._eventsCount;else if("function"==typeof o?o=n[t]=r?[s,o]:[o,s]:r?o.unshift(s):o.push(s),(i=h(e))>0&&o.length>i&&!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},i=c.bind(r);return i.listener=s,r.wrapFn=i,i}function u(e,t,s){var r=e._events;if(void 0===r)return[];var i=r[t];return void 0===i?[]:"function"==typeof i?s?[i.listener||i]:[i]: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}(i):f(i,i.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 i(n){r.once&&e.removeEventListener(t,i),s(n)}))}}Object.defineProperty(n,"defaultMaxListeners",{enumerable:!0,get:function(){return o},set:function(e){if("number"!=typeof e||e<0||i(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");o=e}}),n.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},n.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||i(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this},n.prototype.getMaxListeners=function(){return h(this)},n.prototype.emit=function(e){for(var t=[],s=1;s<arguments.length;s++)t.push(arguments[s]);var i="error"===e,n=this._events;if(void 0!==n)i=i&&void 0===n.error;else if(!i)return!1;if(i){var o;if(t.length>0&&(o=t[0]),o instanceof Error)throw o;var a=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw a.context=o,a}var h=n[e];if(void 0===h)return!1;if("function"==typeof h)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},n.prototype.addListener=function(e,t){return l(this,e,t,!1)},n.prototype.on=n.prototype.addListener,n.prototype.prependListener=function(e,t){return l(this,e,t,!0)},n.prototype.once=function(e,t){return a(t),this.on(e,d(this,e,t)),this},n.prototype.prependOnceListener=function(e,t){return a(t),this.prependListener(e,d(this,e,t)),this},n.prototype.removeListener=function(e,t){var s,r,i,n,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(i=-1,n=s.length-1;n>=0;n--)if(s[n]===t||s[n].listener===t){o=s[n].listener,i=n;break}if(i<0)return this;0===i?s.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(s,i),1===s.length&&(r[e]=s[0]),void 0!==r.removeListener&&this.emit("removeListener",e,o||t)}return this},n.prototype.off=n.prototype.removeListener,n.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 i,n=Object.keys(s);for(r=0;r<n.length;++r)"removeListener"!==(i=n[r])&&this.removeAllListeners(i);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},n.prototype.listeners=function(e){return u(this,e,!0)},n.prototype.rawListeners=function(e){return u(this,e,!1)},n.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):g.call(e,t)},n.prototype.listenerCount=g,n.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}},622:function(e){var t,s,r,i,n;t=/^(?=((?:[a-zA-Z0-9+\-.]+:)?))\1(?=((?:\/\/[^\/?#]*)?))\2(?=((?:(?:[^?#\/]*\/)*[^;?#\/]*)?))\3((?:;[^?#]*)?)(\?[^#]*)?(#[^]*)?$/,s=/^(?=([^\/?#]*))\1([^]*)$/,r=/(?:\/|^)\.(?=\/)/g,i=/(?:\/|^)\.\.\/(?!\.\.\/)[^\/]*(?=\/)/g,n={buildAbsoluteURL:function(e,t,r){if(r=r||{},e=e.trim(),!(t=t.trim())){if(!r.alwaysNormalize)return e;var i=n.parseURL(e);if(!i)throw new Error("Error trying to parse base URL.");return i.path=n.normalizePath(i.path),n.buildURLFromParts(i)}var o=n.parseURL(t);if(!o)throw new Error("Error trying to parse relative URL.");if(o.scheme)return r.alwaysNormalize?(o.path=n.normalizePath(o.path),n.buildURLFromParts(o)):t;var a=n.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=n.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?n.normalizePath(o.path):o.path),n.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(i,"")).length;);return e.split("").reverse().join("")},buildURLFromParts:function(e){return e.scheme+e.netLoc+e.path+e.params+e.query+e.fragment}},e.exports=n},47:(e,t)=>{"use strict";t.l=i;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__=i.prototype,t}function i(e,t,s){if("number"==typeof e){if("string"==typeof t)throw new TypeError('The "string" argument must be of type string. Received type number');return a(e)}return n(e,t,s)}function n(e,t,s){if("string"==typeof e)return function(e,t){"string"==typeof t&&""!==t||(t="utf8");if(!i.isEncoding(t))throw new TypeError("Unknown encoding: "+t);var s=0|c(e,t),n=r(s),o=n.write(e,t);o!==s&&(n=n.slice(0,o));return n}(e,t);if(ArrayBuffer.isView(e))return h(e);if(null==e)throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e);if(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__=i.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 n=e.valueOf&&e.valueOf();if(null!=n&&n!==e)return i.from(n,t,s);var o=function(e){if(i.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||S(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 i.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),i=0;i<t;i+=1)s[i]=255&e[i];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(i.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 n=!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(n)return r?-1:_(e).length;t=(""+t).toLowerCase(),n=!0}}function d(e,t,s,r){s=Number(s)||0;const i=e.length-s;r?(r=Number(r))>i&&(r=i):r=i;const n=t.length;let o;for(r>n/2&&(r=n/2),o=0;o<r;++o){const r=parseInt(t.substr(2*o,2),16);if(S(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,i;const n=[];for(let o=0;o<e.length&&!((t-=2)<0);++o)s=e.charCodeAt(o),r=s>>8,i=s%256,n.push(i),n.push(r);return n}(t,e.length-s),e,s,r)}function p(e,t,s,r){let i;for(i=0;i<r&&!(i+s>=t.length||i>=e.length);++i)t[i+s]=e[i];return i}function _(e,t){var s;t=t||1/0;for(var r=e.length,i=null,n=[],o=0;o<r;++o){if((s=e.charCodeAt(o))>55295&&s<57344){if(!i){if(s>56319){(t-=3)>-1&&n.push(239,191,189);continue}if(o+1===r){(t-=3)>-1&&n.push(239,191,189);continue}i=s;continue}if(s<56320){(t-=3)>-1&&n.push(239,191,189),i=s;continue}s=65536+(i-55296<<10|s-56320)}else i&&(t-=3)>-1&&n.push(239,191,189);if(i=null,s<128){if((t-=1)<0)break;n.push(s)}else if(s<2048){if((t-=2)<0)break;n.push(s>>6|192,63&s|128)}else if(s<65536){if((t-=3)<0)break;n.push(s>>12|224,s>>6&63|128,63&s|128)}else{if(!(s<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;n.push(s>>18|240,s>>12&63|128,s>>6&63|128,63&s|128)}}return n}function m(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}function S(e){return e!=e}"undefined"!=typeof Symbol&&null!=Symbol.species&&i[Symbol.species]===i&&Object.defineProperty(i,Symbol.species,{value:null,configurable:!0,enumerable:!1,writable:!1}),i.from=function(e,t,s){return n(e,t,s)},i.prototype.__proto__=Uint8Array.prototype,i.__proto__=Uint8Array,i.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)},i.allocUnsafe=function(e){return a(e)},i.isBuffer=function(e){return null!=e&&!0===e._isBuffer&&e!==i.prototype},i.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}},i.concat=function(e,t){if(!Array.isArray(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return i.alloc(0);var s;if(void 0===t)for(t=0,s=0;s<e.length;++s)t+=e[s].length;var r=i.allocUnsafe(t),n=0;for(s=0;s<e.length;++s){var o=e[s];if(m(o,Uint8Array)&&(o=i.from(o)),!i.isBuffer(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(r,n),n+=o.length}return r},i.byteLength=c,i.prototype._isBuffer=!0,i.prototype.copy=function(e,t,s,r){if(!i.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 n=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=n-1;o>=0;--o)e[o+t]=this[o+s];else Uint8Array.prototype.set.call(e,this.subarray(s,r),t);return n},i.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 i=this.length-t;if((void 0===s||s>i)&&(s=i),e.length>0&&(s<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");let n=!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(n)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),n=!0}}},934:e=>{"use strict";function t(e,t){for(const s in t)Object.defineProperty(e,s,{value:t[s],enumerable:!0,configurable:!0});return e}e.exports=function(e,s,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 i=function(){};return i.prototype=Object.create(Object.getPrototypeOf(e)),t(new i,r)}}},485:function(e,t,s){var r;!function(i){"use strict";function n(e,t){var s=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(s>>16)<<16|65535&s}function o(e,t,s,r,i,o){return n((a=n(n(t,e),n(r,o)))<<(h=i)|a>>>32-h,s);var a,h}function a(e,t,s,r,i,n,a){return o(t&s|~t&r,e,t,i,n,a)}function h(e,t,s,r,i,n,a){return o(t&r|s&~r,e,t,i,n,a)}function l(e,t,s,r,i,n,a){return o(t^s^r,e,t,i,n,a)}function c(e,t,s,r,i,n,a){return o(s^(t|~r),e,t,i,n,a)}function d(e,t){var s,r,i,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,i=g,o=f,d=p,u=a(u,g,f,p,e[s],7,-680876936),p=a(p,u,g,f,e[s+1],12,-389564586),f=a(f,p,u,g,e[s+2],17,606105819),g=a(g,f,p,u,e[s+3],22,-1044525330),u=a(u,g,f,p,e[s+4],7,-176418897),p=a(p,u,g,f,e[s+5],12,1200080426),f=a(f,p,u,g,e[s+6],17,-1473231341),g=a(g,f,p,u,e[s+7],22,-45705983),u=a(u,g,f,p,e[s+8],7,1770035416),p=a(p,u,g,f,e[s+9],12,-1958414417),f=a(f,p,u,g,e[s+10],17,-42063),g=a(g,f,p,u,e[s+11],22,-1990404162),u=a(u,g,f,p,e[s+12],7,1804603682),p=a(p,u,g,f,e[s+13],12,-40341101),f=a(f,p,u,g,e[s+14],17,-1502002290),u=h(u,g=a(g,f,p,u,e[s+15],22,1236535329),f,p,e[s+1],5,-165796510),p=h(p,u,g,f,e[s+6],9,-1069501632),f=h(f,p,u,g,e[s+11],14,643717713),g=h(g,f,p,u,e[s],20,-373897302),u=h(u,g,f,p,e[s+5],5,-701558691),p=h(p,u,g,f,e[s+10],9,38016083),f=h(f,p,u,g,e[s+15],14,-660478335),g=h(g,f,p,u,e[s+4],20,-405537848),u=h(u,g,f,p,e[s+9],5,568446438),p=h(p,u,g,f,e[s+14],9,-1019803690),f=h(f,p,u,g,e[s+3],14,-187363961),g=h(g,f,p,u,e[s+8],20,1163531501),u=h(u,g,f,p,e[s+13],5,-1444681467),p=h(p,u,g,f,e[s+2],9,-51403784),f=h(f,p,u,g,e[s+7],14,1735328473),u=l(u,g=h(g,f,p,u,e[s+12],20,-1926607734),f,p,e[s+5],4,-378558),p=l(p,u,g,f,e[s+8],11,-2022574463),f=l(f,p,u,g,e[s+11],16,1839030562),g=l(g,f,p,u,e[s+14],23,-35309556),u=l(u,g,f,p,e[s+1],4,-1530992060),p=l(p,u,g,f,e[s+4],11,1272893353),f=l(f,p,u,g,e[s+7],16,-155497632),g=l(g,f,p,u,e[s+10],23,-1094730640),u=l(u,g,f,p,e[s+13],4,681279174),p=l(p,u,g,f,e[s],11,-358537222),f=l(f,p,u,g,e[s+3],16,-722521979),g=l(g,f,p,u,e[s+6],23,76029189),u=l(u,g,f,p,e[s+9],4,-640364487),p=l(p,u,g,f,e[s+12],11,-421815835),f=l(f,p,u,g,e[s+15],16,530742520),u=c(u,g=l(g,f,p,u,e[s+2],23,-995338651),f,p,e[s],6,-198630844),p=c(p,u,g,f,e[s+7],10,1126891415),f=c(f,p,u,g,e[s+14],15,-1416354905),g=c(g,f,p,u,e[s+5],21,-57434055),u=c(u,g,f,p,e[s+12],6,1700485571),p=c(p,u,g,f,e[s+3],10,-1894986606),f=c(f,p,u,g,e[s+10],15,-1051523),g=c(g,f,p,u,e[s+1],21,-2054922799),u=c(u,g,f,p,e[s+8],6,1873313359),p=c(p,u,g,f,e[s+15],10,-30611744),f=c(f,p,u,g,e[s+6],15,-1560198380),g=c(g,f,p,u,e[s+13],21,1309151649),u=c(u,g,f,p,e[s+4],6,-145523070),p=c(p,u,g,f,e[s+11],10,-1120210379),f=c(f,p,u,g,e[s+2],15,718787259),g=c(g,f,p,u,e[s+9],21,-343485551),u=n(u,r),g=n(g,i),f=n(f,o),p=n(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",i="";for(s=0;s<e.length;s+=1)t=e.charCodeAt(s),i+=r.charAt(t>>>4&15)+r.charAt(15&t);return i}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,i=g(e),n=[],o=[];for(n[15]=o[15]=void 0,i.length>16&&(i=d(i,8*e.length)),s=0;s<16;s+=1)n[s]=909522486^i[s],o[s]=1549556828^i[s];return r=d(n.concat(g(t)),512+8*t.length),u(d(o.concat(r),640))}(p(e),p(t))}function S(e,t,s){return t?s?m(t,e):f(m(t,e)):s?_(e):f(_(e))}void 0===(r=function(){return S}.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!n(i("os "))&&!n(i("android[/ ]"))},isIOS:function(){return n(i("os "))},isAndroid:function(){return n(i("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 i(e){return""+(new RegExp(e+"(\\d+((\\.|_)\\d+)*)").exec(r())||[,0])[1]||void 0}function n(e){return parseFloat((e||"").replace(/\_/g,"."))||0}e.exports=s},77:e=>{let t;e.exports="function"==typeof queueMicrotask?queueMicrotask.bind(globalThis):e=>(t||(t=Promise.resolve())).then(e).catch((e=>setTimeout((()=>{throw e}),0)))}},__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_SEND_REQUEST:"SEND_REQUEST",DC_PIECE_NOT_FOUND:"PIECE_NOT_FOUND",DC_PIECE_ABORT:"PIECE_ABORT",DC_PIECE_CANCEL:"PIECE_CANCEL",DC_CLOSE:"CLOSE",DC_RESPONSE:"RESPONSE",DC_ERROR:"ERROR",DC_PIECE:"PIECE",DC_PIECE_DATA:"PIECE_DATA",DC_TIMEOUT:"TIMEOUT",DC_PIECE_ACK:"PIECE_ACK",DC_METADATA:"METADATA",DC_PLAT_ANDROID:"ANDROID",DC_PLAT_IOS:"IOS",DC_PLAT_WEB:"WEB",DC_CHOKE:"CHOKE",DC_UNCHOKE:"UNCHOKE",DC_HAVE:"HAVE",DC_HAVE_REVERSE:"HAVE_REVERSE",DC_LOST:"LOST",DC_GET_PEERS:"GET_PEERS",DC_PEERS:"PEERS",DC_STATS:"STATS",DC_PEER_SIGNAL:"PEER_SIGNAL",DC_PLAYLIST:"PLAYLIST",BM_LOST:"lost",BM_ADDED_SEG_:"BM_ADDED_SEG_",BM_ADDED_SN_:"BM_ADDED_SN_",BM_SEG_ADDED:"BM_SEG_ADDED",FRAG_CHANGED:"FRAG_CHANGED",FRAG_LOADED:"FRAG_LOADED",FRAG_LOADING:"FRAG_LOADING",RESTART_P2P:"RESTART_P2P",EXCEPTION:"exception",REQUESTING_MAP_HAVE:"REQUESTING_MAP_HAVE",BUILDER_MAP_HAVE:"BUILDER_MAP_HAVE",SYN_OUTPUT:"SYN_OUTPUT",SYN_ERROR:"SYN_ERROR",SYN_PARTIAL:"SYN_PARTIAL",SVR_PEERS:"SVR_PEERS"},hls_next_events={...events,SCH_DCHAVE:"SCH_DCHAVE",STREAM_DETECT:"STREAM_DETECT",STREAM_DISABLE:"STREAM_DETECT",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"};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._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.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)}_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){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._senderMap=null,clearInterval(this._closingInterval),this._closingInterval=null,clearInterval(this._interval),this._interval=null,this._chunk=null,this._cb=null,this._channel){try{this._channel.close()}catch(e){}this._channel.onmessage=null,this._channel.onopen=null,this._channel.onclose=null,this._channel.onerror=null}if(this._pc){try{this._pc.close()}catch(e){}this._pc.oniceconnectionstatechange=null,this._pc.onicegatheringstatechange=null,this._pc.onsignalingstatechange=null,this._pc.onicecandidate=null,this._pc.ondatachannel=null}this._pc=null,this._channel=null,e&&this.emit("error",e),this.emit("close")})))}_setupData(e){if(!e.channel)return this.destroy(new Error("Data channel event is missing `channel` property"));this._channel=e.channel,this._channel.binaryType="arraybuffer","number"==typeof this._channel.bufferedAmountLowThreshold&&(this._channel.bufferedAmountLowThreshold=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)}get isBufferedAmountHigh(){return this._channel.bufferedAmount>MAX_BUFFERED_AMOUNT}write(e,t){if(this.destroyed)return t(new Error("cannot write after peer is destroyed"));if(this._connected){try{this.send(e)}catch(e){return this.destroy(e)}this.isBufferedAmountHigh?this._cb=t:t(null)}else this._chunk=e,this._cb=t}_startIceCompleteTimeout(){this.destroyed||this._iceCompleteTimer||(this._iceCompleteTimer=setTimeout((()=>{this._iceComplete||(this._iceComplete=!0,this.emit("iceTimeout"),this.emit("_iceComplete"))}),this.iceCompleteTimeout))}_createOffer(){this.destroyed||this._pc.createOffer(this.offerOptions).then((e=>{if(this.destroyed)return;this.trickle||this.allowHalfTrickle||(e.sdp=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)}))}_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._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={},i={},n={};let o=!1;s.forEach((e=>{"remotecandidate"!==e.type&&"remote-candidate"!==e.type||(r[e.id]=e),"localcandidate"!==e.type&&"local-candidate"!==e.type||(i[e.id]=e),"candidatepair"!==e.type&&"candidate-pair"!==e.type||(n[e.id]=e)}));const a=e=>{o=!0;let t=i[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(n[e.selectedCandidatePairId]),("googCandidatePair"===e.type&&"true"===e.googActiveConnection||("candidatepair"===e.type||"candidate-pair"===e.type)&&e.selected)&&a(e)})),o||Object.keys(n).length&&!Object.keys(i).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,i=0){this.sn=e,this.segId=t,this.data=s,this.fromPeerId=r,this.level=i||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 DC_TOLERANCE=2,DEFAULT_PACKET_SIZE=64e3,ALPHA=.6;class peer_Peer extends(events_default()){static get defaultPacketSize(){return DEFAULT_PACKET_SIZE}static get VERSION(){return"8"}constructor(e,t,s,r,i,n,o={}){super(),this.engine=e,this.channel=e.fetcher.channelId,this.logger=e.logger,this.config=i,this.isInitiator=r,this.options=o,this.typeExpected=n,this.remotePeerId=s,this.intermediator=o.intermediator||null,this.channelId=r?`${t}-${s}`:`${s}-${t}`,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.streamListeners=[],this.pieceMsg={},this.uploadInterrupter={targetSegId:void 0,currentSegId:void 0,canceled:!1},this.datasToSend=[],this.bytesUploaded=0,this.dataWriting=!1,this.timeSendRequest=0,this.timeReceivePiece=0,this.timeSendPiece=0,this.weight=0,this.peersConnected=1,this.timeJoin=getCurrentTs(),this.uploadSpeed=0,this.gotPeers=!1,this.currentLevel=0,this.currentPos=0,this.signalMsgs=[],this.useBackupSignal=!1;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.notFatalClosed=!1,this.startSN=Number.MAX_SAFE_INTEGER,this.endSN=-1,this._loadedBytes=0}get isAvailable(){return this.downloadNum<2&&!this.choked}get isAvailableUrgently(){return!this.downloading&&!this.choked}cancelDownload(e,t,s){if(s&&this.downloading&&!(this.streamListeners.length>0||this.remainAttachments<=2))return this.logger.warn(`cancel download ${s} remain packets ${this.remainAttachments}`),this.timeReceivePiece=0,this.sendJson({event:events.DC_PIECE_CANCEL,sn:e,level:t,seg_id:s})}addStreamListener(e,t,s){this.streamListeners.push({handler:s,peerId:t})}removeStreamListener(e){this.streamListeners=this.streamListeners.filter((t=>t.peerId!==e||(t.handler(void 0,void 0,!0,"aborted by cancel"),!1)))}_init(e){e.on("error",(e=>{let t=!0;"Ice connection failed."===e.message&&this.notFatalClosed&&(t=!1),this.emit(events.DC_ERROR,t)})),e.on("signal",(e=>{this.useBackupSignal||this.signalMsgs.push(e),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.signalMsgs=[],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,i=s.event;switch(r=i!==events.DC_PLAYLIST&&i!==events.DC_PEER_SIGNAL?`string: ${e}`:`event: ${i}`,t.debug(`datachannel receive ${r} from ${this.remotePeerId}`),i){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_CANCEL:this.uploadInterrupter.targetSegId=s.seg_id,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.uploadInterrupter.canceled||(this._handlePieceAck(s.size,s.miss),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.warn(`peer 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,!1)}send(e,t=!0){return t?(this.datasToSend.push(e),this.dataWriting||this._sendDataSync(),!0):this.sendImmediately(e)}_checkIfNeedInterrupt(){const{targetSegId:e,currentSegId:t,canceled:s}=this.uploadInterrupter;return!!s||!(!e||e!==t)&&(this.logger.warn("cancel send data"),this.sendMsgPieceAbort(`${t} transfer canceled`),this.datasToSend=[],this.uploadInterrupter.canceled=!0,this._handlePieceAck(this.bytesUploaded,0),this.emit(events.DC_PIECE_ACK,{seg_id:t,size:this.bytesUploaded,canceled:!0}),!0)}_sendDataSync(){if(this._checkIfNeedInterrupt()||0===this.datasToSend.length)return void(this.dataWriting=!1);this.dataWriting=!0;const e=this.datasToSend.shift();this.bytesUploaded+=e.byteLength,this._datachannel.write(e,(e=>{if(e)return this.dataWriting=!1,this.logger.warn(e.message),void this.emit(events.DC_ERROR,!1);this._sendDataSync()}))}sendImmediately(e){if(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.4.8",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={}){const{targetSegId:s}=this.uploadInterrupter;if(s&&s===e.seg_id)return this.logger.warn("cancel send piece msg"),this.sendMsgPieceAbort(`${s} piece canceled`),void(this.uploadInterrupter.canceled=!0);this.uploadInterrupter={currentSegId:e.seg_id,targetSegId:void 0,canceled:!1},this.datasToSend=[],this.bytesUploaded=0,e.ext||(e.ext={}),e.ext.from&&t.from&&(t.from=`${e.ext.from}->${t.from}`),t.incompletes&&e.ext.incompletes&&(t.incompletes+=e.ext.incompletes),t=Object.assign({},e.ext,t);const r={...e,ext:t};this.sendJson(r)}sendBuffer(e,t,s,r={}){const i=r.reverse||void 0;delete r.reverse;let n=s.byteLength,o=0,a=0;n%this.packetSize==0?a=n/this.packetSize:(a=Math.floor(n/this.packetSize)+1,o=n%this.packetSize);let h={event:events.DC_PIECE,attachments:a,seg_id:t,sn:e,level:r.level,size:n,reverse:i};delete r.level,this.sendMsgPiece(h,r);const l=dividePayload(s,this.packetSize,a,o);this._sendBufferArray(l,i),this.uploading=!1,this.timeSendPiece=performance.now()}get downloadNum(){return this.downloading?this.sendReqQueue.length+1:0}requestDataById(e,t,s=!1,r={}){const i={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(i):this.sendReqQueue.push(i)):this._realRequestData(i)}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){const s=t?e.reverse():e;for(let e=0;e<s.length;e++)this.send(s[e])}_realRequestData(e){this.sendJson(e),this.timeSendRequest=performance.now(),this.downloading=!0,this.emit(events.DC_SEND_REQUEST)}shouldWaitForRemain(e){return 0!==this.bufArr.length&&(0!==this.timeReceivePiece&&this.currentLoadSpeed()>=this.minRequiredSpeed(e))}close(e){e||(this.notFatalClosed=!0),this.emit(events.DC_CLOSE,e)}receiveSignal(e){e&&this._datachannel.signal(e)}_notifyDownloadListenersAbort(e){for(let t of this.streamListeners){const{handler:s}=t;s(void 0,void 0,!0,e)}this.streamListeners=[]}destroy(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._loadedBytes+=e.byteLength,this.remainAttachments--;let i=r?this.remainAttachments+1:t-this.remainAttachments;const n=0===this.remainAttachments;if(n&&(this._sendNextReq()||(this.downloading=!1)),this.emit(events.DC_PIECE_DATA,this.bufSN,this.segId,e,i,n,this.pieceMsg),this.streamListeners.length>0)for(let t of this.streamListeners){const{handler:s}=t;s(this.bufSN,this.segId,!1,e,n)}if(n){if(this.streamListeners=[],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._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.dataExchangeTs=getCurrentTs(),this.uploading?this.logger.warn(`${this.remotePeerId} is uploading when receive request`):(this.uploading=!0,this.emit(events.DC_REQUEST,e))}_handlePieceAck(e,t){0!==this.timeSendPiece&&(this.uploadSpeed=Math.round(e/(performance.now()-this.timeSendPiece)*2),this.timeSendPiece=0,this.logger.info(`${this.remotePeerId} uploadSpeed is ${this.uploadSpeed}`)),t>0&&this.logger.warn(`peer ${this.remotePeerId} miss ${t}`)}_prepareForBinary(e,t,s,r){this.bufArr=[],this._loadedBytes=0,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} != byteLength ${s}`)}this.segId="",this.bufArr=[]}checkIfNeedChoke(e=!1){const{logger:t}=this,s=performance.now()-this.timeSendRequest;if(!e&&s<1500)t.info(`duration ${s} no need choke`);else if(this.miss++,t.info(`${this.remotePeerId} miss ${this.miss}`),this.miss>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||0!==this.datasToSend.length)&&(this.uploading=!1,this.sendJson({event:events.DC_PIECE_ABORT,reason:e}))}loadedBytes(){return this._loadedBytes}currentLoadSpeed(){return 0===this.timeReceivePiece?0:this.loadedBytes()/(performance.now()-this.timeReceivePiece)}minRequiredSpeed(e){return(this.pieceMsg.size-this.loadedBytes())/e}}function dividePayload(e,t,s,r){let i=[];if(r){let n;for(let r=0;r<s-1;r++)n=e.slice(r*t,(r+1)*t),i.push(n);n=e.slice(e.byteLength-r,e.byteLength),i.push(n)}else{let r;for(let n=0;n<s;n++)r=e.slice(n*t,(n+1)*t),i.push(r)}return i}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"),i=-1!==e.indexOf("?")?"&":"?";return e.match(r)?e.replace(r,"$1"+t+"="+s+"$2"):e+i+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:.5*e+1.67}function performRangeRequest(e,t,s,r=3500){const i=new XMLHttpRequest;return new Promise(((n,o)=>{i.open("GET",e,!0),i.responseType="arraybuffer",i.timeout=r,i.onreadystatechange=e=>{if(4===i.readyState){const e=i.status;e>=200&&e<300?n(i.response):o(`status ${e}`)}},i.onerror=e=>{o("request error")},i.ontimeout=e=>{o("timeout")},i.setRequestHeader("Range",t||"bytes=0-0"),s&&s(i,e),i.send()})).catch((e=>{}))}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 getHomeUrl(){return window.atob("aHR0cHM6Ly9zd2FybWNsb3VkLm5ldC9lbi8=")}function splitBytes(e,t){const s=peer.defaultPacketSize,r=e.byteLength-t,i=[];let n=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,n,n+s),i.push(t),n+=s}if(a>0){const t=(0,utils_buffer.l)(a);e.copy(t,0,n,n+a),i.push(t)}return i}function getAvailableMemory(){const{memory:e}=performance;return e?e.jsHeapSizeLimit-e.usedJSHeapSize:-1}function trimMap(e,t){if(e.size<=t)return;const s=[...e.keys()];do{e.delete(s.shift())}while(e.size>t)}function trimSet(e,t){if(e.size<=t)return;const s=[...e.values()];do{e.delete(s.shift())}while(e.size>t)}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}getExtraForStats(){const e={},{tracker:t}=this,{scheduler:s}=t;return s&&s.isSeed()&&(e.seed=!0,t.DCMap.size<=t.maxConns+2&&(e.exclusions=[...t.DCMap.keys(),...t.failedDCSet.keys()])),e}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.4.8",EngineBase.protocolVersion=peer.VERSION;const engine_base=EngineBase;function tryGetMediaElement(e,t){let s;if(e&&("string"==typeof e?s=document.querySelector(e):e instanceof HTMLMediaElement&&(s=e)),!s){const e=[...document.getElementsByTagName("video"),...document.getElementsByTagName("audio")];1===e.length?s=e[0]:(t&&(s=e.find((e=>e.src===t))),s||(s=e.find((e=>e.currentTime>0))))}return s}function calRangeWithForwardReverseOffset(e,t,s,r=0,i=0){const n=peer.defaultPacketSize;let o="bytes=",a=r,h=i||s-1;const l=Math.floor(s/n),c=s%n>0?l+1:l;if(e>=0&&(a+=(e+1)*n),o=`${o}${a}-`,t>=0&&t<c){h-=s%n+(c-t-1)*n,o=`${o}${h}`}else 0!==i&&(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:!1,trickleICE:!0,announceLocation:"cn",geoIpPreflight:!0,getStats:function(e,t,s){},getPeerId:function(e){},getPeersInfo:function(e){}};const config=commonConfig;let defaultP2PConfig={...config,httpLoadTime:3,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,i)=>{s.get(e).onsuccess=function(){try{s.put(t(this.result),e),r(promisifyRequest(s.transaction))}catch(e){i(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=>{const i=r.filter((t=>t.name!==e)).map((e=>new Promise(((t,s)=>{const r=indexedDB.deleteDatabase(e.name);r.onsuccess=t,r.onerror=s,r.onblocked=s}))));Promise.all(i).then(t).catch(s)})).catch(s)})).catch((e=>{}))}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((async(e,t)=>{if(this.isPC&&this.maxBufSize<629145600||!this.isPC&&this.maxBufSize<367001600)return void t("disk storage not enough");let 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")}),500);this._initMetaStore().then((()=>{clearTimeout(r),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).then((e=>{this.emit(`${events.BM_ADDED_SN_}${e.sn}`,e),this.emit(events.BM_SEG_ADDED,e)})).catch((e=>{this.logger.error(e),("QuotaExceededError"===e.name||e.inner&&"QuotaExceededError"===e.inner.name)&&this._trimDisk(!0)}))}_addSeg(e){const{segId:t,sn:s}=e;return set(t,s,this.id2SnStore),new Promise(((r,i)=>{get(s,this.segmentsStore).then((n=>{n?0===n.filter((e=>e.segId===t)).length&&(n.push(this._segmentToCache(e)),set(s,n,this.segmentsStore).then((()=>{this._increaseBufSize(e.data.byteLength),r(e)})).catch((e=>{i(e)}))):set(s,[this._segmentToCache(e)],this.segmentsStore).then((()=>{this._increaseBufSize(e.data.byteLength),r(e)})).catch((e=>{i(e)}))})).catch((e=>{i(e)}))}))}async _trimDisk(e=!1){let t=this.maxBufSize;const{logger:s}=this;let r=await this.currBufSize();e&&(t=r-52428800,t<0&&(t=0)),r<t||keys(this.segmentsStore).then((async e=>{const i=e.sort(((e,t)=>e-t));let n=0;do{if(n++>10){console.error("too much loops in SegmentStore");break}const e=i.shift();if(void 0===e){s.error("lastSN not found");continue}if(e>=this.loadingSN){s.warn(`trimDisk failed, loadingSN ${this.loadingSN}`);break}const t=i[0],o=await get(e,this.segmentsStore);if(!o){s.warn("lastSeg not found");continue}let a=0;o.forEach((e=>{a+=e.data.byteLength})),del(e,this.segmentsStore).then((()=>{this._decreaseBufSize(parseInt(a))})),o.forEach((r=>{del(r.segId,this.id2SnStore),s.info(`pop seg ${r.segId} size ${r.data.byteLength}`),this.emit(events.BM_LOST,{sn:e,segId:r.segId,next:t,level:r.level})})),r-=a,s.info(`pop sn ${e} size ${a} currBufSize ${r}`),this.overflowed||(this.overflowed=!0)}while(r>=t)}))}_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 store");try{this._clearDisk()}catch(e){}}_clearDisk(e){return clearAll(e)}destroy(){this.clear(),this.removeAllListeners()}}const segment_store=SegmentStore,LIVE_MAX_BUFFER_SIZE=31457280,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 i=this._segPool.get(t);for(let t of i)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:i}=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(i);const n=this._segPool.size;if(this.emit(`${events.BM_ADDED_SN_}${e.sn}`,e),this.emit(events.BM_SEG_ADDED,e),this._currBufSize<this.maxBufSize||n<=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 i=0;r.forEach((e=>{i+=e.size})),this._currBufSize-=parseInt(i),this._segPool.delete(e),r.forEach((t=>{this.id2Sn.delete(t.segId),this.emit(events.BM_LOST,{sn:e,segId:t.segId,next:s,level:t.level})})),t.info(`pop sn ${e} size ${i} 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,e.validateSegment||(e.validateSegment=function(e,t){return!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("."))}`},i=(e,t,s,r)=>`${e}-${t}`;t&&"function"==typeof t&&(r=this.makeChannelId(e,t)),s||(this.config.segmentId=i);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=super.getExtraForStats();return!this.config.live&&this.media&&(e.pos=Math.round(this.media.currentTime)),this.multiBitrate&&this.currentLevel!==this.lastLevel&&(e.level=this.currentLevel+"",this.lastLevel=this.currentLevel),e}getExtraForPeersRequest(){const e={};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")}getTagForVod(){return`${(0,platform.getBrowser)()}${isHttps()?"s":""}_${"SegmentStore"===this.bufMgr.name?"d":"m"}`}}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 i=e[r];i.id===t&&(s=i)}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 i(e,t){["video","audio"].forEach((s=>{const r=e.filter((e=>isCodecType(e,s)));if(r.length){const i=r.filter((e=>0===e.lastIndexOf("avc1",0)||0===e.lastIndexOf("mp4a",0)));t[`${s}Codec`]=i.length>0?i[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={},n=e.attrs=new attr_list(s[1]);e.url=M3U8Parser.resolve(s[2],t);const o=n.decimalResolution("RESOLUTION");o&&(e.width=o.width,e.height=o.height),e.bitrate=n.decimalInteger("AVERAGE-BANDWIDTH")||n.decimalInteger("BANDWIDTH"),e.name=n.NAME,i([].concat((n.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 i,n=[],o=0;for(MASTER_PLAYLIST_MEDIA_REGEX.lastIndex=0;null!==(i=MASTER_PLAYLIST_MEDIA_REGEX.exec(e));){const e={},a=new attr_list(i[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++,n.push(e)}}return n}static parseLevelPlaylist(e,t){let s,r,i=0,n=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=i++;c.start=n,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,n+=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),n=(" "+s[r+2]).slice(1);switch(s[r]){case"#":c.tagList.push(n?[e,n]:[e]);break;case"PLAYLIST-TYPE":o.type=e.toUpperCase();break;case"MEDIA-SEQUENCE":i=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(),n-=c.duration),o.totalduration=n,o.averagetargetduration=n/o.fragments.length,o.endSN=i-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 extends(events_default()){constructor(e,t,s,r,i){let n;switch(super(),e.config.announceLocation){case"cn":n=URL_MAP.v+URL_MAP[3]+URL_MAP.n+URL_MAP.l+URL_MAP[7];break;case"hk":n=URL_MAP.x+URL_MAP.o+URL_MAP.xo+URL_MAP.sb;break;case"us":n=URL_MAP.kj+URL_MAP.a+URL_MAP["+"]+URL_MAP["="]+URL_MAP.w;break;case"eu":n=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(n)}/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.4.8",this.announce,this.channelId,i.type);this.native=!!i.bundle,this.announceInfo={...i,channel:this.channelId,ts:this.timestamp,version:"2.4.8",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.offline=!1,this.errsBufStalled=0,this.mediaRequests=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:i,mobile:n,countryCode:o,continentCode:a}=e;n&&(this.announceInfo.netType="cellular");const h=i.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(/=+$/,""),i=0,n=0,o="";s=r.charAt(n++);~s&&(t=i%4?64*t+s:s,i++%4)?o+=String.fromCharCode(255&t>>(-2*i&6)):0)s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(s);return o})}();_0x38aa.amGtZD=function(e,t){for(var s,r=[],i=0,n="",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++)i=(i+r[l]+t.charCodeAt(l%t.length))%256,s=r[l],r[l]=r[i],r[i]=s;l=0,i=0;for(var c=0;c<e.length;c++)i=(i+r[l=(l+1)%256])%256,s=r[l],r[l]=r[i],r[i]=s,n+=String.fromCharCode(e.charCodeAt(c)^r[(r[l]+r[i])%256]);return n},_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(){this.offline||(this.offline=!0,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,data:{}},-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:r=0,failConns:i=0,rebuffers:n=0,requests:o=0,errsInternalExpt:a=0}=this.lastStats||{};if(this[_httpDownloaded]>=e&&(this[_httpDownloaded]-=e),this[_p2pDownloaded]>=t&&(this[_p2pDownloaded]-=t),this[_p2pUploaded]>=r&&(this[_p2pUploaded]-=r),this.failConns>=i&&(this.failConns-=i),this.errsBufStalled>=n&&(this.errsBufStalled-=n),this.mediaRequests>=o&&(this.mediaRequests-=o),this.errsInternalExpt>=a&&(this.errsInternalExpt-=a),this.exptMsg&&(this.exptMsg=void 0),s.data){const{seeds:e}=s.data;e&&this.emit(events.SVR_PEERS,e)}}})).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 i={exclusions:e,asn:s,country:r},n={};return this.engine.getExtraForPeersRequest&&(n=this.engine.getExtraForPeersRequest()),i=Object.assign({},i,n),new Promise(((e,s)=>{fetch(this.getPeersURL,{headers:this._requestHeader,method:"POST",body:JSON.stringify(i)}).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++}increRebuffers(){this.errsBufStalled++}increMediaRequests(){this.mediaRequests++}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"),this.removeAllListeners(),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,rebuffers:this.errsBufStalled||void 0,requests:this.mediaRequests||void 0,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.4.8 "+this.exptMsg),s}get _requestHeader(){const e={};return this.native&&(e.token=this.key),e}}const server=Server;function genV(e,t,s,r,i){const n=location.hostname;var o,a,h,l,c,d;return(o=n,a=t,h=s,l=r,c=i,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,r)=>{const i=findPeersWithState(e,SegmentState.COMPLETE,t,s,r);if(i.length>=2)return[i[0],i[1]];if(1===i.length){const n=findPeersWithState(e,SegmentState.PARTIAL_FORWARD,t,s,r);if(n.length>=1)return[n[0],i[0]];const o=findPeersWithState(e,SegmentState.PARTIAL_REVERSE,t,s,r);return o.length>=1?[i[0],o[0]]:0===randomNum(0,1)?[null,i[0]]:[i[0],null]}const n=findPeersWithState(e,SegmentState.PARTIAL_FORWARD,t,s,r);if(n.length>=1)return[n[0],null];const o=findPeersWithState(e,SegmentState.PARTIAL_REVERSE,t,s,r);return o.length>=1?[null,o[0]]:[null,null]},findPeersWithState=(e,t,s,r,i)=>e.filter((e=>e.bitset.hasWithId(s,r,i,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,{state:SegmentState.COMPLETE,segId:void 0});this.levelMap.set(s,r)}}totalLevels(){return this.levelMap.size}hasWithId(e,t,s,r=SegmentState.ANY){if(t<0)return!1;const i=this._createOrGetSet(t).get(e);return!!i&&((!s||!i.segId||i.segId===s)&&(r===SegmentState.ANY||i.state===r))}has(e,t,s=SegmentState.ANY){return this.hasWithId(e,t,void 0,s)}hasCompleteOr(e,t,s=SegmentState.COMPLETE){const r=this._createOrGetSet(t).get(e);return!!r&&(r.state===SegmentState.COMPLETE||r.state===s)}getObj(e,t){let s=this._createOrGetSet(t).get(e);return s||(s={}),s}getSegId(e,t){return this.getObj(e,t).segId}getState(e,t){return this.getObj(e,t).state}delete(e,t){const s=this._createOrGetSet(t);return-1===t?(this.levelMap.forEach((t=>{t.delete(e)})),!0):s.delete(e)}add(e,t,s,r){if(!isInteger(e))return;this._createOrGetSet(t).set(e,{state:r,segId:s}),this.isLive&&this._trimBitset(e)}array(e){const t=this._createOrGetSet(e);return this._keysForStateComplete(t)}allArray(){let e={};return this.levelMap.forEach(((t,s)=>{e[s]=this._keysForStateComplete(t)})),e}clear(){this.levelMap.forEach((e=>{e.clear()}))}size(e){return this._createOrGetSet(e).size}_createOrGetSet(e){"number"!=typeof e&&(e=Number(e));let t=this.levelMap.get(e);return t||(t=new Map,this.levelMap.set(e,t)),t}_trimBitset(e){const t=e-LIVE_SN_LIMIT;t>0&&this.levelMap.forEach((e=>{e.delete(t)}))}_keysForStateComplete(e){const t=[];for(let[s,r]of e)r.state===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,EnumStatus={uninitialized:0,initialized:1,waiting:2,working:3,canceled:4};function createTimeoutGenerator(){return new NextGenerator((function(e){let t;return{execute:function(s=1e3){t=setTimeout(e,s)},cancel:function(){clearTimeout(t)}}}))}class NextGenerator{constructor(e){this.generator=e,this.status=EnumStatus.initialized,this.next=this.next.bind(this)}next(e){if(this.status===EnumStatus.canceled)return console.warn("status is canceled");if(this.status===EnumStatus.waiting)return console.warn("status is waiting");const t=this.execute.bind(this,this.cb);this.nextInfo=this.generator(t),this.status=EnumStatus.waiting,this.nextInfo.execute(e)}execute(e,t){this.status=EnumStatus.working,e.apply(t,[this.next])}cancel(){this.status=EnumStatus.canceled,this.nextInfo&&"function"==typeof this.nextInfo.cancel&&this.nextInfo.cancel()}start(e,t){if("function"!=typeof e)throw new SyntaxError("param cb must be a function");this.cb=e,this.next(t)}continue(e){this.status=EnumStatus.initialized,this.next(e)}}class SeedDetector{constructor(e){this.startPoint=performance.now(),this.reqsSent=0,this.reqsReceived=0,this.peerManager=e}isSeed(){return!(performance.now()-this.startPoint<6e4)&&(this.peerManager.size()>0&&0===this.reqsSent&&this.reqsReceived>0)}reset(){this.reqsSent=this.reqsReceived=0}increReqsSent(){this.reqsSent++}increReqsReceived(){this.reqsReceived++}}const CHECK_CONN_INTERVAL=40,MAX_NO_EXCHANGE_TIME=180,_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.seedDetector=new SeedDetector(this.peerManager),this._setupEngine&&this._setupEngine(),this.startCheckConnsTimer(),this.dcDownloadTimeout=t.dcDownloadTimeout,this[_shareOnly]=!1,this.downloadOnly=!1,this.loadedPeerNum=0}startCheckConnsTimer(){this.checkConnsTimer=setInterval((()=>{this.logger.info("start check conns");const e=this.getStatsForPeer();let t=this.peersNum;const s=getCurrentTs();this.getPeers().forEach((r=>{t>4&&(s-r.dataExchangeTs>MAX_NO_EXCHANGE_TIME||s-r.gotStatsTs>=2*CHECK_CONN_INTERVAL+3)?(this.logger.warn(`close dead or different level peer ${r.remotePeerId} level ${r.currentLevel}`),r.close(!1),t--):r.connected&&r.sendMsgStats(t,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.segId} packets ${t.bufArr.length} total ${t.pieceMsg.attachments}`)}return t>0}getIdlePeer(){return this.peerManager.getAvailablePeers()}isSeed(){if(!this.config.live)return!1;const e=this.seedDetector.isSeed();return this.seedDetector.reset(),e}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),this.checkTimer&&this.checkTimer.cancel(),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} size ${s.size} to ${e.remotePeerId}, canceled ${s.canceled||!1}`))})).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})).on(events.DC_REQUEST,(()=>{this.seedDetector.increReqsReceived()})).on(events.DC_SEND_REQUEST,(()=>{this.seedDetector.increReqsSent()}))}_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)}startCheckPeersTimer(e=3e3){this.checkTimer=createTimeoutGenerator(),this.checkTimer.start((e=>{this.checkPeers();const t=1e3*calCheckPeersDelay(this.loadedPeerNum);this.logger.info(`loaded peers ${this.loadedPeerNum} nextDelay ${t}`),this.loadedPeerNum=0,e(t)}),e)}}const scheduler_base=SchedulerBase;class RequestingMap extends(events_default()){constructor(e){super(),this.internalMap=new Map,this.eventName=e}has(e,t){return this.internalMap.has(this._generateId(e,t))}set(e,t,s){const r=this._generateId(e,t);this.internalMap.set(r,s),this.emit(`${this.eventName}${e}-${t}`,s)}get(e,t){return this.internalMap.get(this._generateId(e,t))}delete(e,t){const s=this._generateId(e,t),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}`}}const error_code={ERROR_SYN_INTERNAL:0,ERROR_SYN_RANGE_REQUEST:1,ERROR_SYN_HTTP_TIMEOUT:2,ERROR_SYN_ABORT:3};class Synthesizer extends(events_default()){constructor(e,t,s,r,i,n=!1,o){super(),this.coordinator=e,this.logger=t,this.rangeSupported=n,this.rangeStart=0,this.rangeEnd=0,this.httpLoadTime=2e3,this.allowLoadPartial=!1,this.pieceMsg={sn:s,level:r,seg_id:i},o&&this.setExtra(o),this.forwardPeer=null,this.reversePeer=null,this.bufArr=[],this.forwardOffset=-1,this.reverseOffset=1e4,this.timeStart=0,this.timeReceivePiece=0,this.timer=void 0,this.destroyed=!1,this.forwardStreamListeners=[],this.reverseStreamListeners=[],this.rangeRequesting=!1,this.waitingRemain=!1,this.httpLoaded=0,this.p2pLoaded=0,this.deadline=0,this.p2pCanceled=!1}get segId(){return this.pieceMsg.seg_id}isDownloading(){return this.timeReceivePiece>0}isAlmostDeadline(){return!!this.rangeRequesting||this.deadline>0&&this.deadline-performance.now()<400}hasPeer(e){return!!e&&(e===this.forwardPeer||e===this.reversePeer)}_notifyStreamListeners(e,t,s){const{sn:r,seg_id:i,attachments:n}=this.pieceMsg,o=e&&0===s||!e&&s===n-1,a=e?this.reverseStreamListeners:this.forwardStreamListeners;for(let e of a){const{handler:s}=e;s(r,i,!1,t,o)}o&&(a.length=0)}_notifyStreamListenersAbort(){const e=[...this.reverseStreamListeners,...this.forwardStreamListeners];for(let t of e){const{handler:e}=t;e(void 0,void 0,!0,"aborted by synthesizer")}e.length=0}_notifyStreamListenersRemain(){if(this.forwardStreamListeners.length>0){for(let e=this.forwardOffset+1;e<this.bufArr.length;e++)this._notifyStreamListeners(!1,this.bufArr[e],e);this.forwardStreamListeners=[]}if(this.reverseStreamListeners.length>0){for(let e=this.reverseOffset-1;e>=0;e--)this._notifyStreamListeners(!0,this.bufArr[e],e);this.reverseStreamListeners=[]}}addStreamListener(e,t,s){(e?this.reverseStreamListeners:this.forwardStreamListeners).push({handler:s,peerId:t})}removeStreamListener(e){const t=t=>t.filter((t=>t.peerId!==e||(t.handler(void 0,void 0,!0,"aborted by cancel"),!1)));this.forwardStreamListeners=t(this.forwardStreamListeners),this.reverseStreamListeners=t(this.reverseStreamListeners)}setTimeout(e=0){e<=0?setTimeout((()=>{this._handleTimeout(!1,!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),e.headers&&(this.headers=e.headers),e.segId&&!this.pieceMsg.seg_id&&(this.pieceMsg.seg_id=e.segId)}hasForwardPeer(){return!!this.forwardPeer}hasReversePeer(){return!!this.reversePeer}hasPeerId(e){return this.forwardPeer&&this.forwardPeer.remotePeerId===e||this.reversePeer&&this.reversePeer.remotePeerId===e}isEmpty(){return null===this.forwardPeer&&null===this.reversePeer}isFull(){return this.forwardPeer&&this.reversePeer}setForwardPeer(e){this.forwardPeer=e,this.reversePeer&&this._print(),this._setupPeer(e,!1)}setReversePeer(e){this.reversePeer=e,this.forwardPeer&&this._print(),this._setupPeer(e,!0)}deletePeer(e,t=!1){const s=e===this.reversePeer;this._detachPeer(e),s?(this.reversePeer=null,t&&(this.reverseOffset=this.pieceMsg.attachments||1e4)):(this.forwardPeer=null,t&&(this.forwardOffset=-1)),this.isEmpty()&&this._handleTimeout(!1,!1)}terminate(){this._handleTimeout(!1,!1)}_emitPartialOrError(e){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,e)}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]}_cancelP2p(){if(this.p2pCanceled)return;this.p2pCanceled=!0;const{seg_id:e,sn:t,level:s}=this.pieceMsg;[this.forwardPeer,this.reversePeer].filter((e=>!!e)).forEach((r=>{r.cancelDownload(t,s,e)}))}destroy(){this.logger.info("destroy syn"),clearTimeout(this.timer),this._cancelP2p(),this.removeAllListeners(),this.destroyed=!0,this._detachPeer(this.forwardPeer),this.forwardPeer=null,this.forwardOffset=-1,this._detachPeer(this.reversePeer),this.reversePeer=null,this.reverseOffset=1e4,this.bufArr=[],this.forwardStreamListeners=[],this.reverseStreamListeners=[]}_detachPeer(e){if(!e)return;const 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:i,sn:n,level:o,size:a}=this.pieceMsg,h=t-1;if(this.bufArr[h])return this.logger.warn(`syn bufArr ${this.pieceMsg.sn} already has ${h}`),!1;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!0;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(n,i,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}-${n} expectedSize ${a} != byteLength ${d} forward ${this.forwardOffset} reverse ${this.reverseOffset}`);for(let e=0;e<this.bufArr.length;e++)this.logger.error(`piece ${e} size ${this.bufArr[e].byteLength}`);this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,error_code.ERROR_SYN_INTERNAL)}}_setupPeer(e,t){0===this.timeStart&&(this.timeStart=performance.now());const s=(t,s,r,i,n,o)=>{if(this.destroyed)return;if(!this._validateMsg(t,o.level,s))return void this.logger.warn(`onPieceData ${o.level}-${t} not match ${JSON.stringify(this.pieceMsg)} from ${e.remotePeerId}`);const{reverse:a}=o;this._receivePacket(a,i,r)&&!this.waitingRemain&&!this.rangeRequesting&&this.deadline>0&&this._shouldSwitch()&&(this.logger.warn("should switch to http"),clearTimeout(this.timer),this._handleTimeout(!1,!1))},r=t=>{if(this.destroyed)return;const{attachments:s,size:r,sn:i,level:n,seg_id:o}=t;return this._validateMsg(i,n,o)?this.pieceMsg.size&&r!==this.pieceMsg.size?(this.logger.warn(`onPiece ${t.level}-${t.sn} size not match`),void this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,error_code.ERROR_SYN_INTERNAL)):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.warn(`onPiece ${t.level}-${t.sn} not match ${JSON.stringify(this.pieceMsg)}`),void this.deletePeer(e))},i=t=>{this.destroyed||this.deletePeer(e)},n=()=>{this.destroyed||this.deletePeer(e)},o={onPieceData:s,onPiece:r,onPieceNotFound:i,onPieceAbort:n};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,i).once(hls_next_events.DC_PIECE_ABORT,n)}_validateMsg(e,t,s){return(!this.pieceMsg.seg_id||s===this.pieceMsg.seg_id)&&(e===this.pieceMsg.sn&&t===this.pieceMsg.level)}_shouldSwitch(){const e=peer.defaultPacketSize,t=this.pieceMsg.size-e*this.loadedPackets();return this.coordinator.shouldSwitchToHttp(t,this.deadline,this.p2pSpeed,e,this.httpLoadTime)}_startTimer(e,t=!0){this.timer=setTimeout(this._handleTimeout.bind(this,t),e)}loadedPackets(){return this.pieceMsg.attachments-(this.reverseOffset-this.forwardOffset-1)}_handleTimeout(e=!1,t=!0){if(this.destroyed)return;const{level:s,sn:r,size:i,attachments:n}=this.pieceMsg;if(!i||0===this.timeReceivePiece)return this.logger.warn(`syn load timeout ${s}-${r} url ${this.url}`),void this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,error_code.ERROR_SYN_INTERNAL);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.waitingRemain=!0,this.logger.info(`syn wait for remain ${e}`),void this._startTimer(e,!1)}if(t){const e=[this.forwardPeer,this.reversePeer].filter((e=>!!e)).sort(((e,t)=>e.currentLoadSpeed()-t.currentLoadSpeed())).shift();e&&e.loadtimeout()}if(this._cancelP2p(),this.rangeSupported&&this.url)return this._loadRemainBufferByHttp();this._notifyStreamListenersAbort(),this._emitPartialOrError(error_code.ERROR_SYN_ABORT)}shouldWaitForRemain(e){if(e<=0)return!1;const t=performance.now()-this.timeStart;return t<500||t<1e3&&this.timeReceivePiece>0&&e>3e3||this.shouldWaitForRemainUrgent(e)}shouldWaitForRemainUrgent(e){if(0===this.timeReceivePiece||e<=0)return!1;const t=this.p2pSpeed;let s=0;[this.forwardPeer,this.reversePeer].forEach((e=>{e&&(s+=e.loadedBytes())}));const r=(this.pieceMsg.size-s)/e;return this.logger.info(`syn remainTime ${e} speed ${t} required ${r}`),t>=r}get p2pSpeed(){let e=0;return[this.forwardPeer,this.reversePeer].forEach((t=>{t&&(e+=t.currentLoadSpeed())})),e}getFromPeerId(){const{forwardPeer:e,reversePeer:t}=this;return this.isFull()&&e!==t?`${e.remotePeerId}:${t.remotePeerId}`:e?`${e.remotePeerId}`:t?`${t.remotePeerId}`:""}_loadRemainBufferByHttp(){if(this.rangeRequesting)return;const{size:e,sn:t,level:s}=this.pieceMsg,r=this.rangeEnd>0?this.rangeEnd-1:0,i=this.forwardOffset,n=calRangeWithForwardReverseOffset(i,this.reverseOffset,e,this.rangeStart,r),o=performance.now();let a=this.deadline+this.httpLoadTime-o+1e3;a<2e3?a=2e3:a>6e3&&(a=6e3),this.logger.info(`continue download ${s}-${t} from ${this.url} range: ${n} timeout ${a}`),this.rangeRequesting=!0,this.headers&&(this.xhrSetup=e=>{for(const t of Object.keys(this.headers))e.setRequestHeader(t,this.headers[t])}),performRangeRequest(this.url,n,this.xhrSetup,a).then((e=>{if(this.destroyed)return;if(this.rangeRequesting=!1,!e)return void this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,error_code.ERROR_SYN_RANGE_REQUEST);let t=utils_buffer.l.from(e);const s=t.byteLength/(performance.now()-o);this.coordinator.addHttpSpeed(s);const r=splitBytes(t,0);let n=i+1;for(let e=0;e<r.length;e++)this.bufArr[n]||this._receivePacket(!1,n+1,r[e],!1),n++})).catch((e=>{if(this.destroyed)return;this.rangeRequesting=!1,this.logger.error(`http partial download ${t} error ${e}`);const s="timeout"===e?error_code.ERROR_SYN_HTTP_TIMEOUT:error_code.ERROR_SYN_RANGE_REQUEST;this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,s)}))}_print(){const{level:e,sn:t}=this.pieceMsg;this.logger.info(`syn parallel loading ${e}-${t}`)}}const coordinator_ALPHA=.6;class Coordinator{constructor(){this.meanHttpSpeed=0}addHttpSpeed(e){this.meanHttpSpeed=(1-coordinator_ALPHA)*this.meanHttpSpeed+coordinator_ALPHA*e}shouldSwitchToHttp(e,t,s,r,i){if(this.meanHttpSpeed<=0)return!1;if(s>=this.meanHttpSpeed)return!1;if(this.meanHttpSpeed*i>=e)return!1;return((i+t-performance.now())*this.meanHttpSpeed-e)/(this.meanHttpSpeed-s)*s<r}}const MIN_P2P_LOAD_TIME=1.5,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(hls_next_events.REQUESTING_MAP_HAVE),this.segmentBuilderMap=new RequestingMap(hls_next_events.BUILDER_MAP_HAVE),this.allowP2pLimit=t.httpLoadTime+MIN_P2P_LOAD_TIME,this.playlistInfo=new Map,this.isUploader=!1,this.isReceiver=!1,this.targetPeers={},this.mBufferedDuration=0,this.sequential=!0,this.httpTimeouts=0,this.httpRangeErrs=0,this.coordinator=new Coordinator,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())}get httpRangeSupported(){return this.config.httpRangeSupported}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:i,seg_id:n}=t;this.bitset.has(s,r)||this.bitCounts.incre(s,r);const o=i?SegmentState.COMPLETE:SegmentState.PARTIAL_FORWARD;e.bitset.add(s,r,n,o),this.emit(hls_next_events.SCH_DCHAVE,t.seg_id),e.isAvailableUrgently&&this._handleDCHave(e,s,r,n,o)}})).on(hls_next_events.DC_HAVE_REVERSE,(t=>{if(e.bitset&&t.sn>=0){const{sn:s,level:r,seg_id:i}=t;this.bitset.has(s,r)||this.bitCounts.incre(s,r),e.bitset.hasCompleteOr(s,r,SegmentState.PARTIAL_REVERSE)||e.bitset.add(s,r,i,SegmentState.PARTIAL_REVERSE),this.emit(hls_next_events.SCH_DCHAVE,t.seg_id),e.isAvailableUrgently&&this._handleDCHave(e,s,r,i,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>=7||this.notifyAllPeers(e.sn,e.level,e.seg_id,e.reverse?SegmentState.PARTIAL_REVERSE:SegmentState.PARTIAL_FORWARD)})).on(hls_next_events.DC_PIECE_CANCEL,(t=>{const{sn:s,level:r}=t,i=this.requestingMap.get(s,r);if(i)return void i.removeStreamListener(e.remotePeerId);const n=this.segmentBuilderMap.get(s,r);n&&n.removeStreamListener(e.remotePeerId)})).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:i,reverse:n}=t;this.isUploader=!0;let o=t.seg_id;o||(o=await this.bufMgr.getSegIdBySN(r));const a=this.requestingMap.get(r,i);let h=!1;a&&a.isDownloading()&&(h=n&&a.hasReversePeer()||!n&&a.hasForwardPeer());const l=await this.bufMgr.getSegById(o);if(l)s.info("found seg from bufMgr"),l.level===i?e.sendBuffer(l.sn,l.segId,l.data,{from:"FromCache",level:l.level,reverse:n}):e.sendPieceNotFound(r,o,{level:i});else if(h){s.info(`syn had ${a.loadedPackets()} packets, wait remain from upstream ${a.getFromPeerId()}`);const t=n?a.reversePeer:a.forwardPeer;e.sendPartialBuffer(t.pieceMsg,t.bufArr,{from:a.isFull()?"WaitPartialDouble":"WaitPartialSingle",incompletes:1}),d(a,e,n)}else{const t=this.segmentBuilderMap.get(r,i);if(t)s.info(`peer request ${r} wait from builder, sent ${t.bufferList.length}`),c(t,e);else if(r>=this.loadingSN){let t;const a=a=>{this.segmentBuilderMap.off(`${hls_next_events.BUILDER_MAP_HAVE}${r}-${i}`,t),a&&a.level===i?(s.info(`peer request notify seg ${a.sn}`),e.sendBuffer(a.sn,a.segId,a.data,{from:"NotifySegment",level:a.level,reverse:n})):e.sendPieceNotFound(r,o,{level:i})};t=t=>{this.bufMgr.off(`${hls_next_events.BM_ADDED_SN_}${r}`,a),c(t,e)};const h=`peer request ${r} wait`;this.isHlsjs?(s.info(`${h} from fragLoader`),this.segmentBuilderMap.once(`${hls_next_events.BUILDER_MAP_HAVE}${r}-${i}`,t)):s.info(`${h} for seg`),this.bufMgr.once(`${hls_next_events.BM_ADDED_SN_}${r}`,a)}else e.sendPieceNotFound(r,o,{level:i})}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,t.remotePeerId,((e,s,r,i,n)=>{r?t.sendMsgPieceAbort(i):t.send(i),n&&(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)&&e.bitset){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,r){const{logger:i,config:n}=this,o=1e3*(r-n.httpLoadTime),a=n.httpLoadTime+MIN_P2P_LOAD_TIME;if(i.info(`bufferedDuration ${r} remainLoadTime ${o}`),r<=a)return!1;if(this.requestingMap.has(e,t)){const h=this.requestingMap.get(e,t);if(!h)return this._searchAvailablePeers(e,t,s);const l=h.segId;if(l&&l!==s)return i.warn(`syn segId ${l} not match ${s}`),this.requestingMap.delete(e,t),this._searchAvailablePeers(e,t,s);if(!h.shouldWaitForRemain(o)){if(i.warn(`syn prefetch timeout at ${e}`),h.isFull())return!1;const o=this.peerManager.getPeersOrderByWeight(),l=findPeersWithState(o,SegmentState.COMPLETE,e,t,s);if(h.hasReversePeer()){const r=l.concat(findPeersWithState(o,SegmentState.PARTIAL_FORWARD,e,t,s));if(r.length>0)return this.targetPeers.forwardPeer=r[0],!0}else{const r=l.concat(findPeersWithState(o,SegmentState.PARTIAL_REVERSE,e,t,s));if(r.length>0)return this.targetPeers.reversePeer=r[0],!0}return n.httpRangeSupported&&r>a+1}return i.info(`prefetch ${e} wait for remain`),!0}return this._searchAvailablePeers(e,t,s)}_searchAvailablePeers(e,t,s){if(!this.hasIdlePeers||!this.peersHas(e,t))return!1;const r=this.peerManager.getPeersOrderByWeight(),[i,n]=getBestPairForDownload(r,e,t,s);return this.targetPeers={forwardPeer:i,reversePeer:n},[i,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){if(!s)return void this.logger.error("segId is required");const{live:i}=this.config;if(this.bitset.has(e,t,r))return;const n=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())a&&a.hasPeer(h)||h.notifySet.has(n)||h.bitset.hasCompleteOr(e,t,r)||(h.sendMsgHave(e,s,{level:t,reverse:r===SegmentState.PARTIAL_REVERSE,complete:o}),h.notifySet.add(n),i&&trimSet(h.notifySet,20))}checkPeers(){if(!this.hasPeers)return;const{logger:e,config:t,engine:s}=this,r=t.live,{currentLevel:i}=s;if(e.info(`currentLevel ${i}`),0===this.bitCounts.size(i))return;if(!r&&this.nextLostSN>=0&&this.nextLostSN>=this.currPlaySN-10)return;if(this.mBufferedDuration<this.allowP2pLimit&&(0!==this.mBufferedDuration||this.isHlsjs))return void e.info(`low buffer time ${this.mBufferedDuration}, skip prefetch`);const n=this.peerManager.getPeersOrderByWeight();if(0===n.length)return;const o=[];let{prefetchNum:a,endSN:h,startSN:l}=t;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(...n.filter((e=>e.endSN>=d)).map((e=>e?e.startSN:1/0)));if(!isFinite(e))return;d<e&&(d=e)}for(;o.length<a&&o.length<n.length&&c<this.maxPrefetchCount;){if(!r&&d>h)return;if(r&&d>this.loadingSN+2)return;if(this.bitset.has(d,i))d++;else{if(d!==this.loadingSN&&this.bitCounts.has(d,i)&&!this.requestingMap.has(d,i))for(let s of n)if(!o.includes(s)&&s.bitset.has(d,i)){const n=s.bitset.getState(d,i);let a;a=n===SegmentState.COMPLETE?r?randomNum(0,100)>40:0===randomNum(0,1):n===SegmentState.PARTIAL_REVERSE,o.push(s);const h=s.bitset.getSegId(d,i),l=new Synthesizer(this.coordinator,this.logger,d,i,h,t.httpRangeSupported);this._setupSynthesizer(l),a?l.setReversePeer(s):l.setForwardPeer(s),this.requestingMap.set(d,i,l),s.requestDataBySN(d,!1,{level:i,reverse:a}),e.info(`request prefetch ${d} level ${i} 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 i=s.split("-"),n=Number(i[1]),o=Number(i[0]);r.hasPeerId(e)&&(this.logger.info(`delete ${s} in requestingMap`),r.deletePeer(t),this.bitCounts.decre(n,o),t.bitset.delete(n,o))}}shouldWaitForNextSeg(){let e;return e=!this.isUploader&&(!!this.isReceiver||randomNum(0,100)>20),this.isReceiver=this.isUploader=!1,e}updateLoaded(e,t,s){this.bitset.hasCompleteOr(e,t)||(this.bitset.add(e,t,s,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,currentSrc:t}=this.engine;if(!e||e.src!==t&&0===e.currentTime){if(this.logger.info("try get video element"),e=tryGetMediaElement(this.config.mediaElem,t),!e)return 5;this.engine.media=e}let s=0,r=e.currentTime,i=e.buffered;for(let e=i.length-1;e>=0;e--)if(r>=i.start(e)&&r<=i.end(e)){s=i.end(e)-r;break}return this.mBufferedDuration=s,s>0?s:0}destroy(){super.destroy(),this.requestingMap.clear(),this.segmentBuilderMap.clear()}_notifySynthesizer(e,t,s,r,i,n=!0){const{logger:o}=this,a=this.requestingMap.get(s,r);if(!a)return;const h=a.segId;function l(i,n){n?e.requestDataById(t,s,!0,{level:r,reverse:i}):(o.info(`notify syn prefetch ${s}`),e.requestDataBySN(s,!1,{level:r,reverse:i}))}t&&h&&t!==h?o.warn(`notifySynthesizer segId ${t} not match ${h}`):a.isFull()||(a.isAlmostDeadline()?o.info("almost deadline, ignored"):a.hasForwardPeer()||i!==SegmentState.PARTIAL_FORWARD&&i!==SegmentState.COMPLETE?a.hasReversePeer()||i!==SegmentState.PARTIAL_REVERSE&&i!==SegmentState.COMPLETE||(a.setReversePeer(e),l(!0,n)):(a.setForwardPeer(e),l(!1,n)))}_setupEngine(){}getStatsForPeer(){const{currentLevel:e,media:t}=this.engine,s={level:e};if(t&&!this.config.live){const{currentTime:e}=t;s.pos=Math.round(e)}return s}_handleSynError(e){switch(e){case error_code.ERROR_SYN_RANGE_REQUEST:this.logger.warn("ERROR_SYN_RANGE_REQUEST"),this.httpRangeErrs++;break;case error_code.ERROR_SYN_HTTP_TIMEOUT:this.logger.warn("ERROR_SYN_HTTP_TIMEOUT"),this.httpTimeouts+=3}this.httpRangeErrs>=1&&(this.config.httpLoadTime<=4500&&(this.config.httpLoadTime+=500),this.httpRangeErrs=0)}}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,s){this.streamListeners.push({handler:s,peerId:t})}removeStreamListener(e){this.streamListeners=this.streamListeners.filter((t=>t.peerId!==e||(t.handler(void 0,void 0,!0,"aborted by cancel"),!1)))}_notifyStreamListenersAbort(){for(let e of this.streamListeners){const{handler:t}=e;t(void 0,void 0,!0,"aborted by httpLoader")}this.streamListeners.length=0}_notifyStreamListeners(e){const{sn:t,seg_id:s}=this.pieceMsg;for(let r of this.streamListeners){const{handler:i}=r;i(t,s,!1,e,this.finished)}this.finished&&(this.streamListeners.length=0)}}class HlsSwScheduler extends Scheduler{constructor(e,t){super(e,t),this.server=t.fetcher,this.p2pEnabled=e.p2pEnabled,this.resolveMap=new Map,this.dcDownloadTimeout=t.live?5:9,this.segmentId=t.segmentId}async handleGetMediaData(e,t){const{logger:s,config:r,engine:i}=this;let{url:n,range:o}=e;o&&(n=`${n}|${o}`);const a=this.fragMap.get(n);if(!a)return s.warn(`cannot get frag ${n}`),t.postMessage({action:hls_next_events.SW_GET_MEDIA});i.currentLevelIndex=a.level;const{sn:h,baseurl:l,level:c}=a,d=this.segmentId(String(c),h,e.url,o),u=d===this.loadingSegId;u&&s.warn(`duplicate request ${d}`),this.loadingSN=h,i.bufMgr&&(i.bufMgr.loadingSN=h),this.loadingSegId=d;const g=await this.bufMgr.getSegById(d);if(g)return s.info(`bufMgr found seg sn ${h} segId ${d}`),a.loaded=g.data.byteLength,a.fromPeerId=g.fromPeerId,i.emit(hls_next_events.FRAG_LOADED,{url:e.url,sn:h,level:c,segId:d,loaded:a.loaded,duration:a.duration,byP2p:!0,fromPeerId:g.fromPeerId}),this._onFragLoaded(e.url,a),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:e.url,buffer:g.data,incomplete:!1}});const f=this.getBufferedDuration();if(s.info(`handleGetMediaData sn ${h} bufferedDuration ${f}`),this.resolveMap.has(h)||u){let e=this.requestingMap.get(h,c);if(e||u){e&&(s.warn(`${h} is requesting, terminate syn wait for seg`),e.terminate());let r=1e3*(f-this.config.httpLoadTime)+1e3;r<0&&(r=0);let i=setTimeout((()=>{s.info(`notify seg ${h} timeout`),i=-1,t.postMessage({action:hls_next_events.SW_GET_MEDIA})}),r);this.bufMgr.once(`${hls_next_events.BM_ADDED_SN_}${h}`,(e=>{i<0||e&&e.level===c&&(clearTimeout(i),s.info(`notify seg ${e.sn}`),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:n,buffer:e.data,incomplete:!1}}))}))}else s.warn(`${h} is requesting, fallback`),t.postMessage({action:hls_next_events.SW_GET_MEDIA})}else if(this.hasAndSetTargetPeer(h,c,d,f)){await this._loadFragByP2p(a,t,h,d,e.url,c)||t.postMessage({action:hls_next_events.SW_GET_MEDIA})}else{const e=this.requestingMap.get(h,c);if(this.httpRangeSupported&&e&&e.segId===d&&e.hasPartialBuffer()){s.warn(`syn has partial buffer for ${d}`);const[r,i]=e.getPartialBuffer();t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:n,bufferLeft:r,bufferRight:i,incomplete:!0,size:e.pieceMsg.size}},[r,i].filter((e=>!!e)).map((e=>e.buffer)))}else t.postMessage({action:hls_next_events.SW_GET_MEDIA})}}async _loadFragByP2p(e,t,s,r,i,n){const{logger:o}=this;o.info(`p2p load sn ${s} segId ${r} level ${n}`);const a=await this.load(s,r,n);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 ${n} size ${g}`),e.loaded=(d?d.byteLength:0)+(u?u.byteLength:0);else{if(o.info(`p2p loaded segId ${r} level ${n} size ${h.byteLength} incomplete ${l}`),!await this.bufMgr.hasSegOfId(r)){const e=new Segment(s,r,h,c,n);o.info(`bufMgr putSeg ${s} level ${n}`),this.bufMgr.putSeg(e)}e.loaded=h.byteLength}return e.fromPeerId=c,this.engine.emit(hls_next_events.FRAG_LOADED,{url:i,sn:s,level:n,segId:r,loaded:e.loaded,duration:e.duration,byP2p:!0,fromPeerId:c}),this._onFragLoaded(i,e),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:i,buffer:h,bufferLeft:d,bufferRight:u,incomplete:l,size:g}},[d,u].filter((e=>!!e)).map((e=>e.buffer))),!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:i,buffer:h.data,incomplete:!1}}),!0)}_processStream(e,t,s,r,i){const n=peer.defaultPacketSize,{segmentBuilderMap:o,logger:a}=this;a.info(`got stream ${s}`);const h=new SegmentBuilder(s,r,i,t);o.has(s,r)||o.set(s,r,h);const l=e.getReader();let c=0,d=0,u=(0,utils_buffer.l)(0);return new Promise(((e,t)=>{const s=()=>{l.read().then((({value:t,done:r})=>{if(t&&(c+=t.length),r){if(u.byteLength>0)if(c<=n){const e=(0,utils_buffer.l)(c);u.copy(e,0,d*n,u.byteLength),h.receiveBytes(e,!0)}else{const e=splitBytes(u,d*n);for(let t=0;t<e.length;t++)h.receiveBytes(e[t],t===e.length-1)}const t=u.buffer;return e(t)}const i=utils_buffer.l.from(t);if(u=utils_buffer.l.concat([u,i]),c>=n){c-=n;const e=(0,utils_buffer.l)(n);u.copy(e,0,d*n,(d+1)*n),d++,h.receiveBytes(e,!1)}s()})).catch((e=>{t(e)}))};s()}))}async handleMediaData(e,t){t.postMessage({action:hls_next_events.SW_MEDIA});const{logger:s,engine:r}=this;let{url:i,buffer:n,stream:o,range:a,p2p:h,httpSpeed:l,size:c}=e;if(r.rangeTestUrl===i)return void(r.rangeTestUrl="");s.info(`SW_MEDIA url ${i} size ${c} range ${a} speed ${l}`),l&&this.coordinator.addHttpSpeed(l),a&&(i=`${i}|${a}`);const d=this.fragMap.get(i);if(!d)return;const{sn:u,level:g,baseurl:f}=d,p=this.segmentId(String(g),u,e.url,a);if(o){this.notifyAllPeers(u,g,p,SegmentState.PARTIAL_FORWARD);try{n=await this._processStream(o,c,u,g,p)}catch(e){return void s.warn(e)}finally{this.segmentBuilderMap.delete(u,g)}}if(this.notifyAllPeers(u,g,p),d.segId=p,d.loaded=n.byteLength,r.emit(hls_next_events.FRAG_LOADED,{url:e.url,sn:u,level:g,segId:p,loaded:d.loaded,duration:d.duration,byP2p:!1}),this._onFragLoaded(e.url,d),!await this.bufMgr.hasSegOfId(p)){const e=new Segment(u,p,n,"",g);this.bufMgr.putSeg(e),s.info(`bufMgr putSeg ${p} level ${g}`);const t=h&&h>0?h:0,r=n.byteLength-t;this.reportTraffic(r,t,0)}}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.server.increMediaRequests(),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,t.segId),!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:i}=this;this.isReceiver=!0;let n=this.mBufferedDuration-this.config.httpLoadTime;n>this.dcDownloadTimeout&&(n=this.dcDownloadTimeout);const{forwardPeer:o,reversePeer:a}=this.targetPeers;o||a||(n-=1);let h=this.requestingMap.get(e,s),l={allowLoadPartial:this.httpRangeSupported,segId:t};h?h.setExtra(l):(h=new Synthesizer(this.coordinator,this.logger,e,s,t,this.httpRangeSupported,l),this._setupSynthesizer(h),this.requestingMap.set(e,s,h)),h.setTimeout(1e3*n),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 i={resolve:r,sn:e,level:s,segId:t,incomplete:!1};this.resolveMap.set(e,i)}));return this.targetPeers={},c}_setupSynthesizer(e){e.on(hls_next_events.SYN_OUTPUT,((t,s)=>{const{config:r,logger:i}=this,{segId:n,sn:o,data:a,level:h}=t,{speed:l,http:c,p2p:d}=s;this.httpTimeouts>0&&this.httpTimeouts--;const u=this.resolveMap.has(o);if(r.validateSegment(n,new Uint8Array(a))){this.notifyAllPeers(o,h,n),this.bitset.has(o,h)||this.reportTraffic(c,d,l);const s=e.getFromPeerId();if(u){i.info(`receive criticalSeg seg_id ${n}`);const e=this.resolveMap.get(o);this.resolveMap.delete(o),e.resolve({data:a,fromPeerId:s})}else this.bitset.has(o,h)||(this.bufMgr.putSeg(t),this.updateLoaded(o,h,n))}else if(i.error(`segment ${n} validate failed`),u){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:i,level:n,size:o}=t;if(this.httpTimeouts++,this.resolveMap.has(i)){this.resolveMap.get(i).resolve({bufferLeft:s,bufferRight:r,fromPeerId:e.getFromPeerId(),incomplete:!0,size:o}),this.resolveMap.delete(i)}this.requestingMap.delete(i,n)})).on(hls_next_events.SYN_ERROR,((e,t)=>{const{sn:s,level:r}=e;if(this.resolveMap.has(s)){const e=this.resolveMap.get(s);this.resolveMap.delete(s),e.resolve()}this.requestingMap.delete(s,r)}))}_handleDCHave(e,t,s,r,i){const n=0!==this.resolveMap.size;n&&this.resolveMap.has(t)?this._notifySynthesizer(e,r,t,s,i):this.httpTimeouts>=1&&t===this.loadingSN+1&&this._notifySynthesizer(e,void 0,t,s,i,!1),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,i,n=s.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(r=n.next()).done;)o.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(s=n.return)&&s.call(n)}finally{if(i)throw i.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 i=e.call(this,"close",r)||this;return i.wasClean=!0,i.code=t,i.reason=s,i}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 i=__values(r),n=i.next();!n.done;n=i.next()){var o=n.value;this._callEventListener(e,o)}}catch(e){t={error:e}}finally{try{n&&!n.done&&(s=i.return)&&s.call(i)}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,i=void 0===r?DEFAULT.minReconnectionDelay:r,n=e.maxReconnectionDelay,o=void 0===n?DEFAULT.maxReconnectionDelay:n,a=0;return this._retryCount>0&&(a=i*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,i=t.connectionTimeout,n=void 0===i?DEFAULT.connectionTimeout:i,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()}),n))}))}}},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,i="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=i}_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.backupTimer=setTimeout((()=>{this.destroyed||(this.backupWS=this._init(r,"backup"))}),800),this._connected=!1,this.destroyed=!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);r&&r.sendSignal(e,t)}else this.mainConnected?this.mainWS.sendSignal(e,t):this.backupConnected?this.backupWS.sendSignal(e,t):this.logger.warn("no signal available")}sendReject(e,t,s,r){if(r){const i=this._getWSByName(r);if(i)return void i.sendReject(e,t,s)}this.mainConnected?this.mainWS.sendReject(e,t,s):this.backupConnected?this.backupWS.sendReject(e,t,s):this.logger.warn("no signal available, send reject failed")}close(){this.mainWS&&this.mainWS.close(),this.backupWS&&this.backupWS.close()}_getWSByName(e){return this.mainWS&&this.mainWS.name===e?this.mainWS:this.backupWS&&this.backupWS.name===e?this.backupWS:null}reconnect(){this.mainWS&&this.mainWS.reconnect(),this.backupWS&&this.backupWS.reconnect()}destroy(){this.close(),clearTimeout(this.backupTimer),this.mainWS=null,this.backupWS=null,this.removeAllListeners(),this.destroyed=!0}get connected(){return this.mainConnected||this.backupConnected}get mainConnected(){return this.mainWS&&this.mainWS.connected}get backupConnected(){return this.backupWS&&this.backupWS.connected}};function getPeersThrottle(e,t,s=70){var r=null,i=!1,n=s;return function(s=!1){if(s)return clearTimeout(r),void(i=!1);i||(i=!0,r=setTimeout((function(){e.call(t,n),i=!1,r=null}),1e3*n),n*=1)}}const utils_getPeersThrottle=getPeersThrottle,MAX_PC_CONNS=22,MAX_MOBILE_CONNS=13,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.signalerWs=null,this.fetcher=t,this._setupServer(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.isChannelReq=!0,this.fuseRate=-1,this.overloaded=!1}get totalConns(){return this.scheduler.peersNum+1}resumeP2P(){if(!this.fetcher)return;const{engine:e,config:t,fetcher:s}=this,{btAnnounce:r,btAnnouncePreflight:i}=s;(t.geoIpPreflight?i: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 i=e.netType;let n,o;if((s.wifi_only||t.wifiOnly)&&"wifi"!==i&&"ethernet"!==i&&(this.scheduler.downloadOnly=!0,this.logger.info("downloadOnly mode")),s.overload&&(this.overloaded=!0,this.logger.warn("server is overloaded, degrade")),"object"==typeof t.wsSignalerAddr&&t.wsSignalerAddr.main)n=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}n=t.wsSignalerAddr}this.signalerWs=this._initSignalerWs(s.signal||n,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)}`)})).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.postStatsWithBeacon(),this.fetcher.destroy(),this.fetcher=null,this.requestMorePeers(!0),this.scheduler.destroy(),this.scheduler=null,this.signalerWs&&(this.signalerWs.destroy(),this.signalerWs=null),this.peers=[];for(let e of this.DCMap.values())e.destroy(!0);this.DCMap.clear(),this.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})})),t}_tryConnectToAllPeers(e=0){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+e){this.logger.debug("clear exceeded peers"),this.peers=[];break}let t=this.peers.shift();const s=t.intermediator;this.logger.debug(`new DataChannel ${t.id} intermediator ${s}`),this._createDatachannel(t.id,!0,s)}}_setupServer(e){e.on(events.SVR_PEERS,(e=>{this.logger.info(`got seeds ${e.length}`),this.peers=[...this.peers,...this._filterPeers(e)],this._tryConnectToAllPeers(5)}))}_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.logger.warn(`intermediator ${e.intermediator} relay failed`)}}this.signalerWs.sendSignal(s,t,e.signalName)})).on(events.DC_PEER_SIGNAL,(t=>{const s=t.to_peer_id,r=t.from_peer_id,i=t.action;if(s&&r&&i)if(s!==this.peerId){this.logger.info(`relay signal for ${r}`);const n=this.DCMap.get(s);if(n){if("signal"!==i)return void n.sendMsgSignalReject(s,r,t.reason,t.fatal);if(n.sendMsgSignal(s,r,t.data))return}e.sendMsgSignal(r,s)}else"signal"===i?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=this.DCMap.size>=this.minConns+3;this.requestMorePeers(r),this.peersIncrement++,this._doSignalFusing(s.peersNum+1)}))}_doSignalFusing(e){if(this.fuseRate<=0)return;const t=this.signalerWs.connected;t&&e>=this.fuseRate+2?(this.logger.warn("reach fuseRate, report stats close signaler"),this.totalConns-1>0&&this.fetcher.postStats(),this.signalerWs.close()):!t&&e<this.fuseRate&&(this.logger.warn("low conns, reconnect signaler"),this.signalerWs.reconnect())}_initSignalerWs(e,t,s,r){const i=(e,t)=>{let s=`${e}?id=${this.peerId}&p=web&v=2.4.8`;return t&&(s=`${s}&token=${t}`),s};let n,o=i(e,s);if(!this.overloaded&&t&&t!==e){let e=i(t,r);n=new signal_manager(this.logger,this.config,o,e)}else n=new websocket_client(this.logger,this.config,o,270);return n.onopen=()=>{this.connected=!0,this.engine.emit("serverConnected",!0),this._tryConnectToAllPeers(),this.isChannelReq=!1},n.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}`)}},n.onclose=()=>{this.connected=!1,this.engine.emit("serverConnected",!1)},n.onerror=e=>{e.message&&this.engine.emit(events.EXCEPTION,err_code_default()(e,"SIGNAL_EXPT"))},n}_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:i}=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{const t=this.DCMap.get(e);if(!t)return;if(this.signalerWs.backupConnected&&t&&t.signalMsgs.length>0&&"main"===r&&!t.useBackupSignal){t.useBackupSignal=!0,t.signalName="backup",i.warn(`${e} not found from main, try backup signal`);for(let s of t.signalMsgs)this.signalerWs.sendSignal(e,s,"backup");return}if(t.useBackupSignal)return;this._destroyAndDeletePeer(e),i.info(`signaling ${e} not found`);const{scheduler:n}=this;n.waitForPeer&&(n.waitingPeers--,0===n.waitingPeers&&n.notifyPeersLoaded(0)),this.requestMorePeers(),s||this.failedDCSet.add(e)}}_handleSignal(e,t,s,r){const i=t.type,{logger:n}=this;let o=this.DCMap.get(e);if(o){if(o.connected)return void n.info("datachannel had connected, signal ignored");if("offer"===i){if(!(this.peerId>e))return void n.warn(`signal type wrong ${i}, ignored`);this._destroyAndDeletePeer(e,!1),n.warn(`signal type wrong ${i}, convert to non initiator`),o=this._createDatachannel(e,!1,s)}}else{if("answer"===i){const t=`signal type wrong ${i}`;return n.warn(t),this._sendSignalReject(e,t,s,r),void this._destroyAndDeletePeer(e,!1)}n.debug(`receive node ${e} connection request`);const t=this.scheduler.peersNum;if(t>=this.maxConns){const i=this.scheduler.getNonactivePeers();if(!(i.length>0)){const t=`peers reach limit ${this.maxConns}`;return n.warn(t),void this._sendSignalReject(e,t,s,r)}{let e=t-this.maxConns+2;for(i.length<e&&(e=i.length);e>0;){const t=i.shift();t&&(n.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){let r=this.config.trickleICE;s||(this.overloaded||t&&!this.isChannelReq)&&(r=!1);const i=new peer(this.engine,this.peerId,e,t,this.config,this.sequential,{stuns:this.stuns,intermediator:s,trickle:r});return this.DCMap.set(e,i),this._setupDC(i),i}_sendSignalReject(e,t,s,r,i){if(s){const r=this.DCMap.get(s);if(r&&r.sendMsgSignalReject(e,this.peerId,t,i))return}this.signalerWs.sendReject(e,t,i,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.overloaded?(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;function getMediaBuffered(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 t>0?t:0}function listenMediaRebuffer(e,t){let s=null;const r=()=>{s||(s=setTimeout((()=>{t()}),2500))},i=()=>{null!=s&&(clearTimeout(s),s=null)};return e.addEventListener("waiting",r),e.addEventListener("playing",i),()=>{e.removeEventListener("waiting",r),e.removeEventListener("playing",i)}}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:i}=this,n=e.live;i.live=n,this.targetDuration=e.averagetargetduration,this.browserInfo={...r,live:n,abr:this.multiBitrate||void 0,type:"hls_sw"},this.channel=`${t(this.currentSrc)}|${s}[${peer.VERSION}]`,this.setupElectron();const o=this.initLogger();if(o.info("use HlsSwP2pEngine"),o.info(`engine version: ${engine_base.version} hls-proxy version: ${this.swVersion}`),o.info(`channel ${this.channel}`),n||(i.startSN=e.startSN,i.endSN=e.endSN,o.info(`startSN ${e.startSN} endSN ${e.endSN}`)),navigator.serviceWorker.controller)if(i.httpStreamEnabled)try{const e=new ReadableStream({start(e){e.enqueue({action:hls_next_events.STREAM_DETECT})}});navigator.serviceWorker.controller.postMessage(e,[e])}catch(e){}else navigator.serviceWorker.controller.postMessage({action:hls_next_events.STREAM_DISABLE});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}watchRebuffering(e){this.offEventRebuffer=listenMediaRebuffer(e,(()=>{this.fetcher&&this.fetcher.increRebuffers()}))}handlePlaylist(e,t){const{config:s,logger:r}=this,{url:i,redirectedUrl:n,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,i.split("?")[0],n)}_parsePlaylist(e,t,s){const r=t;s&&(t=s);const{config:i,logger:n}=this;if(e.indexOf("#EXTINF:")>0||e.indexOf("#EXT-X-TARGETDURATION:")>0){let s=0;const n=M3U8Parser.parseLevelPlaylist(e,t);this.levels.length>1?(s=this.levels.indexOf(n.url),-1===s?(this.restartP2p(),this.currentSrc=r,s=0):this.currentLevelIndex=s):(""!==this.currentSrc&&r!==this.currentSrc&&this.restartP2p(),this.currentSrc=r,this.levels=[t]),this.emit(hls_next_events.LEVEL_LOADED,n),i.live&&trimMap(this.fragMap,200),n.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)})),i.sharePlaylist&&i.scheduler&&i.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:i}=s;if(!i)return void r.warn("scheduler not found");const{url:n}=e,o=n.split("?")[0];if(i.playlistInfo.has(o)){const e=i.getPlaylistFromPeer(o);if(e&&e.data){const{data:s,seq:i}=e;return r.info(`got playlist from peer seq ${i}`),t.postMessage({action:hls_next_events.SW_GET_PLAYLIST,data:{text:s}}),void this._parsePlaylist(s,n.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 i=()=>{"activated"===t.state?(t.removeEventListener("statechange",i),s(e)):"redundant"===t.state&&r("sw is redundant")};t.addEventListener("statechange",i)}))}))))}unregisterServiceWorker(){const{config:e}=this,t="serviceWorker is not registered";return new Promise(((s,r)=>{const{serviceWorker:i}=navigator;i||r(t),i.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))}t.live||(t.tag=this.getTagForVod());let r=new server(this,this.config.token,encodeURIComponent(e),this.config.announce||"",t);this.fetcher=r,this.config.fetcher=r;const i=setInterval((()=>{this.media?(clearInterval(i),this.watchRebuffering(this.media)):this.media=tryGetMediaElement(this.config.mediaElem)}),3e3);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.offEventRebuffer(),this.p2pEnabled&&(this.config.p2pEnabled=this.p2pEnabled=!1,this.tracker&&this.tracker instanceof tracker_client&&(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,i,n,o;const a=performance.now();s=a-300,r=a-200,i=a,e.trequest=s,e.tfirst=r,e.tload=i,e.loading={first:s,start:r,end:i},n=o=t,e.loaded=n,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 i=getRequestParameters(e,this.controller.signal);const n="arraybuffer"===e.responseType,o=n?"byteLength":"length",a=s.onUpdate,h=s.onBodyStart;this.context=e,this.config=t,this.callbacks=s,this.xhrSetup&&(this.xhrSetup(this.fakeXhr,e.url),i=mergeXhrSetup(this.fakeXhr,i)),this.request=this.fetchSetup(e,i),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})),n?t.arrayBuffer():t.text())})).then((t=>{const{response:i}=this;clearTimeout(this.requestTimeout),r.tload=r.loading.end=Math.max(performance.now(),r.loading.first),r.loaded=r.total=t[o];const n={url:i.url,data:t};s.onProgress(r,e,t,i),s.onSuccess(n,r,e,i)})).catch((t=>{if(clearTimeout(this.requestTimeout),r.aborted)return;a&&a(void 0,!1,!0);const i=t&&t.code||0,n=t?t.message:null;s.onError({code:i,text:n},e,t?t.details:null)}))}loadProgressively(e,t,s,r){const i=e.body.getReader();let n=0,o=0,a=(0,utils_buffer.l)(0);const h=()=>i.read().then((({value:s,done:i})=>{const{fakeXhr:l}=this;if(l.readyState!==l.LOADING&&(l.readyState=l.LOADING,l.emit("readystatechange")),s&&(n+=s.length),i){if(a.byteLength>0)if(n<=this.packetSize){const e=(0,utils_buffer.l)(n);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:i,statusText:h,url:l}=e;return s.readyState=s.DONE,s.responseText=i,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]),n>=this.packetSize){n-=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}}const MIN_TIME_FOR_LOAD=7,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:i}=window.__p2p_loader__;this.isHlsV0=i,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:i}=this,n=e.frag;this.isHlsV0||(n.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(n.level),n.sn,n.url,t)}if(!n.url||isBlockType(n.url,this.blockTypes))return r.info(`HTTP load blockType ${n.url}`),e.frag.loadByHTTP=!0,this.httpLoader.load(e,t,s);if(this.forbidden)return;this.fetcher.increMediaRequests(),t.maxRetry=2;const a=i.getBufferedDuration(),h=await this.bufMgr.getSegById(o);if(this.p2pEnabled&&h){r.info(`bufMgr found seg sn ${n.sn} segId ${o} level ${n.level}`);let t=copyBuffer(h.data).buffer,i={url:e.url,data:t};updateLoadStats(this.stats,h.size),n.loaded=h.size,n.loadByP2P=!0,e.frag.fromPeerId=h.fromPeerId,queue_microtask_default()((()=>{!this.isHlsV0&&s.onProgress&&s.onProgress(this.stats,e,i.data),s.onSuccess(i,this.stats,e)}))}else if(this.p2pEnabled&&i.hasAndSetTargetPeer(n.sn,n.level,n.segId,a))this.loadFragByP2p(e,t,s,o);else if(r.info(`fragLoader load ${o} at ${n.sn} level ${n.level} buffered ${1e3*a}`),this.isLive&&i.hasIdlePeers&&a>MIN_TIME_FOR_LOAD&&i.shouldWaitForNextSeg()){let h=a-MIN_TIME_FOR_LOAD;h>MAX_TIME_FOR_WAIT&&(h=MAX_TIME_FOR_WAIT);const l=r=>{r===o&&(i.off(hls_next_events.SCH_DCHAVE,l),clearTimeout(this.waitTimer),i.hasAndSetTargetPeer(n.sn,n.level,n.segId,a)?this.loadFragByP2p(e,t,s,o):this.loadFragByHttp(e,t,s,o))};r.info(`wait peer have for ${h}s`),i.on(hls_next_events.SCH_DCHAVE,l),this.waitTimer=setTimeout((()=>{this.loadFragByHttp(e,t,s,o),i.off(hls_next_events.SCH_DCHAVE,l)}),1e3*h)}else{const a=i.requestingMap.get(n.sn,n.level);i.httpRangeSupported&&a&&a.segId===n.segId&&a.hasPartialBuffer()?(r.warn(`syn has partial buffer for ${n.segId}`),this.loadFragByP2p(e,t,s,o)):this.loadFragByHttp(e,t,s,o)}}loadFragByHttp(e,t,s,r){const{logger:i,scheduler:n}=this,{segmentBuilderMap:o}=n;n.isReceiver=!1;const a=e.frag,{sn:h,level:l}=a;if(this.streamEnabled){let e;n.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;i.info(`HTTP loaded ${r} time ${a}`),n.notifyAllPeers(h,l,r),c(e,t,s)};const d=s.onProgress;s.onProgress=(e,t,s)=>{a.loaded=e.total,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:i}=this,n=e.frag;this.scheduler.load(e,t,s);const o=s.onSuccess,a=s.onTimeout;s.onTimeout=(e,h)=>{i.warn(`P2P timeout switched to HTTP load ${n.relurl} at ${n.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(n.sn,r,t,n.fromPeerId||this.fetcher.peerId,n.level);this.bufMgr.putSeg(s)}n.loadByP2P||this.fetcher.reportFlow(t.total),n.loaded=t.loaded,i.info(`${n.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:i}=e,n=i.split("?")[0],o=s.onSuccess;if(s.onSuccess=(e,t,s)=>{this.scheduler.broadcastPlaylist(n,e.data),o(e,t,s)},this.scheduler.playlistInfo.has(n)){const t=this.scheduler.getPlaylistFromPeer(n);if(t&&t.data){const{data:n,seq:o}=t;r.info(`got playlist from peer seq ${o}`),updateLoadStats(this.stats,n.length);let a={url:i,data:n};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:i}=this;this.context=e;const{rangeStart:n,rangeEnd:o,url:a}=e,h=e.frag,{segId:l,sn:c,level:d}=h;this.callbacks=s,this.stats=createLoadStats(),this.criticalSeg={sn:c,level:d,segId:l};let u=this.mBufferedDuration-i.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(n),rangeEnd:Number(o),url:a,httpLoadTime:1e3*i.httpLoadTime-500,xhrSetup:i.xhrSetup,segId:l};p?p.setExtra(_):(p=new Synthesizer(this.coordinator,this.logger,c,d,l,this.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:i}=this,{segId:n,sn:o,data:a,level:h}=t,{speed:l,http:c,p2p:d}=s;c>0?this.httpTimeouts++:this.httpTimeouts>0&&this.httpTimeouts--;const u=this.criticalSeg&&this.criticalSeg.segId===n;if(r.validateSegment(n,new Uint8Array(a))){this.notifyAllPeers(o,h,n),this.bitset.has(o,h)||this.reportTraffic(c,d,l);const s=e.getFromPeerId();if(u){i.info(`receive criticalSeg seg_id ${n}`);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:t}=this.context;t.fromPeerId=s,t.loadByP2P=!0,this.callbacks.onSuccess({data:a,url:this.context.url},e,this.context)}else this.bitset.has(o,h)||(this.bufMgr.putSeg(t),this.updateLoaded(o,h,n))}else i.error(`segment ${n} validate failed`),u&&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,t)=>{const{sn:s,level:r}=e;this.logger.warn(`SYN_ERROR loading ${s} code ${t}`),this.criticalSeg&&this.criticalSeg.sn===s&&(this.criticalSeg=null,this.callbacks.onTimeout(this.stats,this.context,null)),this.requestingMap.delete(s,r),this._handleSynError(t)}))}_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,t)})).on(hls_next_events.FRAG_CHANGED,(({sn:e})=>{this.updatePlaySN(e)}))}_handleDCHave(e,t,s,r,i){this.criticalSeg&&this.criticalSeg.sn===t&&this.criticalSeg.level===s?this._notifySynthesizer(e,r,t,s,i):this.httpTimeouts>=1&&t===this.loadingSN+1&&this._notifySynthesizer(e,void 0,t,s,i,!1),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:i}=this.setup();e.config.segmentId=this.config.segmentId;const n=(t,o)=>{if(!o)return;const{config:a}=this,h=o.details,l=h.live;a.live=this.hlsjs.config.live=l,this.browserInfo={...i,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,n)};e.on(this.HLSEvents.LEVEL_LOADED,n);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)}t.live||(t.tag=this.getTagForVod()),this.hlsjs.config.bufMgr=this.bufMgr,this.media=this.hlsjs.media,this.media&&(this.currentSrc=this.media.src);let i=new server(this,r.token,encodeURIComponent(e),r.announce||"",t);this.fetcher=i;const n=new hlsjs_scheduler(this,r);this.tracker=new tracker_client(this,i,n,r),n.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:i,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:i,segId:n}=s;if(!isBlockType(s.url,this.config.p2pBlackList)){if(this.logger.debug("loading frag "+r),this.bufMgr&&(this.bufMgr.loadingSN=r),!n){let e;s._byteRange&&(e="bytes="+s._byteRange[0]+"-"+s._byteRange[1]);let r=s.url;n=t.frag.segId=this.config.segmentId(String(i),s.sn,r,e)}this.emit(hls_next_events.FRAG_LOADING,{sn:r,segId:n,byHttp:s.loadByHTTP,level:i})}}_onFragLoaded(e,t){const{sn:s,segId:r,loaded:i,duration:n,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:i,duration:n,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,r=`${t.type} details ${t.details} reason ${t.reason}`;t.fatal?s.error(r):s.warn(r);const i=this.hlsjs.constructor.ErrorDetails;switch(t.details){case i.BUFFER_STALLED_ERROR:this.fetcher&&this.fetcher.increRebuffers();break;case i.INTERNAL_EXCEPTION:this.fetcher&&(this.fetcher.errsInternalExpt++,this.fetcher.exptMsg=`${t.err.message} event ${t.event} 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 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,window.__swP2pEngineHlsActive)return console.warn("P2pEngineHls is already activated"),void(this._realEngine=new shadow_p2pengine(e));"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__})()));
|