swarmcloud-hls 2.0.3 → 2.1.4
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 -94
- package/dist/hls.min.js +1 -99
- package/dist/p2p-engine.min.js +1 -16
- package/package.json +2 -2
package/dist/p2p-engine.min.js
CHANGED
|
@@ -1,16 +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,n=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 r(){r.init.call(this)}e.exports=r,e.exports.once=function(e,t){return new Promise((function(s,n){function i(s){e.removeListener(t,r),n(s)}function r(){"function"==typeof e.removeListener&&e.removeListener("error",i),s([].slice.call(arguments))}p(e,t,r,{once:!0}),"error"!==t&&function(e,t,s){"function"==typeof e.on&&p(e,"error",t,s)}(e,i,{once:!0})}))},r.EventEmitter=r,r.prototype._events=void 0,r.prototype._eventsCount=0,r.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 l(e){return void 0===e._maxListeners?r.defaultMaxListeners:e._maxListeners}function h(e,t,s,n){var i,r,o,h;if(a(s),void 0===(r=e._events)?(r=e._events=Object.create(null),e._eventsCount=0):(void 0!==r.newListener&&(e.emit("newListener",t,s.listener?s.listener:s),r=e._events),o=r[t]),void 0===o)o=r[t]=s,++e._eventsCount;else if("function"==typeof o?o=r[t]=n?[s,o]:[o,s]:n?o.unshift(s):o.push(s),(i=l(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,h=c,console&&console.warn&&console.warn(h)}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 n={fired:!1,wrapFn:void 0,target:e,type:t,listener:s},i=c.bind(n);return i.listener=s,n.wrapFn=i,i}function u(e,t,s){var n=e._events;if(void 0===n)return[];var i=n[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),n=0;n<t;++n)s[n]=e[n];return s}function p(e,t,s,n){if("function"==typeof e.on)n.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(r){n.once&&e.removeEventListener(t,i),s(r)}))}}Object.defineProperty(r,"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}}),r.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},r.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},r.prototype.getMaxListeners=function(){return l(this)},r.prototype.emit=function(e){for(var t=[],s=1;s<arguments.length;s++)t.push(arguments[s]);var i="error"===e,r=this._events;if(void 0!==r)i=i&&void 0===r.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 l=r[e];if(void 0===l)return!1;if("function"==typeof l)n(l,this,t);else{var h=l.length,c=f(l,h);for(s=0;s<h;++s)n(c[s],this,t)}return!0},r.prototype.addListener=function(e,t){return h(this,e,t,!1)},r.prototype.on=r.prototype.addListener,r.prototype.prependListener=function(e,t){return h(this,e,t,!0)},r.prototype.once=function(e,t){return a(t),this.on(e,d(this,e,t)),this},r.prototype.prependOnceListener=function(e,t){return a(t),this.prependListener(e,d(this,e,t)),this},r.prototype.removeListener=function(e,t){var s,n,i,r,o;if(a(t),void 0===(n=this._events))return this;if(void 0===(s=n[e]))return this;if(s===t||s.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete n[e],n.removeListener&&this.emit("removeListener",e,s.listener||t));else if("function"!=typeof s){for(i=-1,r=s.length-1;r>=0;r--)if(s[r]===t||s[r].listener===t){o=s[r].listener,i=r;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&&(n[e]=s[0]),void 0!==n.removeListener&&this.emit("removeListener",e,o||t)}return this},r.prototype.off=r.prototype.removeListener,r.prototype.removeAllListeners=function(e){var t,s,n;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,r=Object.keys(s);for(n=0;n<r.length;++n)"removeListener"!==(i=r[n])&&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(n=t.length-1;n>=0;n--)this.removeListener(e,t[n]);return this},r.prototype.listeners=function(e){return u(this,e,!0)},r.prototype.rawListeners=function(e){return u(this,e,!1)},r.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):g.call(e,t)},r.prototype.listenerCount=g,r.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}},622:function(e){var t,s,n,i,r;t=/^(?=((?:[a-zA-Z0-9+\-.]+:)?))\1(?=((?:\/\/[^\/?#]*)?))\2(?=((?:(?:[^?#\/]*\/)*[^;?#\/]*)?))\3((?:;[^?#]*)?)(\?[^#]*)?(#[^]*)?$/,s=/^(?=([^\/?#]*))\1([^]*)$/,n=/(?:\/|^)\.(?=\/)/g,i=/(?:\/|^)\.\.\/(?!\.\.\/)[^\/]*(?=\/)/g,r={buildAbsoluteURL:function(e,t,n){if(n=n||{},e=e.trim(),!(t=t.trim())){if(!n.alwaysNormalize)return e;var i=r.parseURL(e);if(!i)throw new Error("Error trying to parse base URL.");return i.path=r.normalizePath(i.path),r.buildURLFromParts(i)}var o=r.parseURL(t);if(!o)throw new Error("Error trying to parse relative URL.");if(o.scheme)return n.alwaysNormalize?(o.path=r.normalizePath(o.path),r.buildURLFromParts(o)):t;var a=r.parseURL(e);if(!a)throw new Error("Error trying to parse base URL.");if(!a.netLoc&&a.path&&"/"!==a.path[0]){var l=s.exec(a.path);a.netLoc=l[1],a.path=l[2]}a.netLoc&&!a.path&&(a.path="/");var h={scheme:a.scheme,netLoc:o.netLoc,path:null,params:o.params,query:o.query,fragment:o.fragment};if(!o.netLoc&&(h.netLoc=a.netLoc,"/"!==o.path[0]))if(o.path){var c=a.path,d=c.substring(0,c.lastIndexOf("/")+1)+o.path;h.path=r.normalizePath(d)}else h.path=a.path,o.params||(h.params=a.params,o.query||(h.query=a.query));return null===h.path&&(h.path=n.alwaysNormalize?r.normalizePath(o.path):o.path),r.buildURLFromParts(h)},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(n,"");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=r},47:(e,t)=>{"use strict";t.l=i;var s=2147483647;function n(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 r(e,t,s)}function r(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),r=n(s),o=r.write(e,t);o!==s&&(r=r.slice(0,o));return r}(e,t);if(ArrayBuffer.isView(e))return l(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(u(e,ArrayBuffer)||e&&u(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 n;n=void 0===t&&void 0===s?new Uint8Array(e):void 0===s?new Uint8Array(e,t):new Uint8Array(e,t,s);return n.__proto__=i.prototype,n}(e,t,s);if("number"==typeof e)throw new TypeError('The "value" argument must not be of type number. Received type number');var r=e.valueOf&&e.valueOf();if(null!=r&&r!==e)return i.from(r,t,s);var o=function(e){if(i.isBuffer(e)){var t=0|h(e.length),s=n(t);return 0===s.length||e.copy(s,0,0,t),s}if(void 0!==e.length)return"number"!=typeof e.length||function(e){return e!=e}(e.length)?n(0):l(e);if("Buffer"===e.type&&Array.isArray(e.data))return l(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),n(e<0?0:0|h(e))}function l(e){for(var t=e.length<0?0:0|h(e.length),s=n(t),i=0;i<t;i+=1)s[i]=255&e[i];return s}function h(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)||u(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,n=arguments.length>2&&!0===arguments[2];if(!n&&0===s)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return s;case"utf8":case"utf-8":return d(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*s;case"hex":return s>>>1;default:if(r)return n?-1:d(e).length;t=(""+t).toLowerCase(),r=!0}}function d(e,t){var s;t=t||1/0;for(var n=e.length,i=null,r=[],o=0;o<n;++o){if((s=e.charCodeAt(o))>55295&&s<57344){if(!i){if(s>56319){(t-=3)>-1&&r.push(239,191,189);continue}if(o+1===n){(t-=3)>-1&&r.push(239,191,189);continue}i=s;continue}if(s<56320){(t-=3)>-1&&r.push(239,191,189),i=s;continue}s=65536+(i-55296<<10|s-56320)}else i&&(t-=3)>-1&&r.push(239,191,189);if(i=null,s<128){if((t-=1)<0)break;r.push(s)}else if(s<2048){if((t-=2)<0)break;r.push(s>>6|192,63&s|128)}else if(s<65536){if((t-=3)<0)break;r.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;r.push(s>>18|240,s>>12&63|128,s>>6&63|128,63&s|128)}}return r}function u(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}"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 r(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?n(e):void 0!==t?"string"==typeof s?n(e).fill(t,s):n(e).fill(t):n(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 n=i.allocUnsafe(t),r=0;for(s=0;s<e.length;++s){var o=e[s];if(u(o,Uint8Array)&&(o=i.from(o)),!i.isBuffer(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(n,r),r+=o.length}return n},i.byteLength=c,i.prototype._isBuffer=!0,i.prototype.copy=function(e,t,s,n){if(!i.isBuffer(e))throw new TypeError("argument should be a Buffer");if(s||(s=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&n<s&&(n=s),n===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(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-t<n-s&&(n=e.length-t+s);var r=n-s;if(this===e&&"function"==typeof Uint8Array.prototype.copyWithin)this.copyWithin(t,s,n);else if(this===e&&s<t&&t<n)for(var o=r-1;o>=0;--o)e[o+t]=this[o+s];else Uint8Array.prototype.set.call(e,this.subarray(s,n),t);return r}},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,n){if(!e||"string"==typeof e)throw new TypeError("Please pass an Error to err-code");n||(n={}),"object"==typeof s&&(n=s,s=void 0),null!=s&&(n.code=s);try{return t(e,n)}catch(s){n.message=e.message,n.stack=e.stack;const i=function(){};return i.prototype=Object.create(Object.getPrototypeOf(e)),t(new i,n)}}},485:function(e,t,s){var n;!function(i){"use strict";function r(e,t){var s=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(s>>16)<<16|65535&s}function o(e,t,s,n,i,o){return r((a=r(r(t,e),r(n,o)))<<(l=i)|a>>>32-l,s);var a,l}function a(e,t,s,n,i,r,a){return o(t&s|~t&n,e,t,i,r,a)}function l(e,t,s,n,i,r,a){return o(t&n|s&~n,e,t,i,r,a)}function h(e,t,s,n,i,r,a){return o(t^s^n,e,t,i,r,a)}function c(e,t,s,n,i,r,a){return o(s^(t|~n),e,t,i,r,a)}function d(e,t){var s,n,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)n=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=l(u,g=a(g,f,p,u,e[s+15],22,1236535329),f,p,e[s+1],5,-165796510),p=l(p,u,g,f,e[s+6],9,-1069501632),f=l(f,p,u,g,e[s+11],14,643717713),g=l(g,f,p,u,e[s],20,-373897302),u=l(u,g,f,p,e[s+5],5,-701558691),p=l(p,u,g,f,e[s+10],9,38016083),f=l(f,p,u,g,e[s+15],14,-660478335),g=l(g,f,p,u,e[s+4],20,-405537848),u=l(u,g,f,p,e[s+9],5,568446438),p=l(p,u,g,f,e[s+14],9,-1019803690),f=l(f,p,u,g,e[s+3],14,-187363961),g=l(g,f,p,u,e[s+8],20,1163531501),u=l(u,g,f,p,e[s+13],5,-1444681467),p=l(p,u,g,f,e[s+2],9,-51403784),f=l(f,p,u,g,e[s+7],14,1735328473),u=h(u,g=l(g,f,p,u,e[s+12],20,-1926607734),f,p,e[s+5],4,-378558),p=h(p,u,g,f,e[s+8],11,-2022574463),f=h(f,p,u,g,e[s+11],16,1839030562),g=h(g,f,p,u,e[s+14],23,-35309556),u=h(u,g,f,p,e[s+1],4,-1530992060),p=h(p,u,g,f,e[s+4],11,1272893353),f=h(f,p,u,g,e[s+7],16,-155497632),g=h(g,f,p,u,e[s+10],23,-1094730640),u=h(u,g,f,p,e[s+13],4,681279174),p=h(p,u,g,f,e[s],11,-358537222),f=h(f,p,u,g,e[s+3],16,-722521979),g=h(g,f,p,u,e[s+6],23,76029189),u=h(u,g,f,p,e[s+9],4,-640364487),p=h(p,u,g,f,e[s+12],11,-421815835),f=h(f,p,u,g,e[s+15],16,530742520),u=c(u,g=h(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=r(u,n),g=r(g,i),f=r(f,o),p=r(p,d);return[u,g,f,p]}function u(e){var t,s="",n=32*e.length;for(t=0;t<n;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 n=8*e.length;for(t=0;t<n;t+=8)s[t>>5]|=(255&e.charCodeAt(t/8))<<t%32;return s}function f(e){var t,s,n="0123456789abcdef",i="";for(s=0;s<e.length;s+=1)t=e.charCodeAt(s),i+=n.charAt(t>>>4&15)+n.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,n,i=g(e),r=[],o=[];for(r[15]=o[15]=void 0,i.length>16&&(i=d(i,8*e.length)),s=0;s<16;s+=1)r[s]=909522486^i[s],o[s]=1549556828^i[s];return n=d(r.concat(g(t)),512+8*t.length),u(d(o.concat(n),640))}(p(e),p(t))}function v(e,t,s){return t?s?m(t,e):f(m(t,e)):s?_(e):f(_(e))}void 0===(n=function(){return v}.call(t,s,t,e))||(e.exports=n)}()},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(n())||[,""])[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(n())},isPC:function(){return!r(i("os "))&&!r(i("android[/ ]"))},isIOS:function(){return r(i("os "))},isAndroid:function(){return r(i("android[/ ]"))},isIOSSafari:function(){return this.isIOS()&&this.isSafari()},isElectron:function(){return/electron/i.test(n())},isMobile:function(){return s.isAndroid()||s.isIOS()},isSafari:function(){return/^((?!chrome|android).)*safari/i.test(n())},isFirefox:function(){return/firefox/i.test(n())},isChrome:function(){return/chrome/i.test(n())},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 n(){return navigator.userAgent.toLowerCase()}function i(e){return""+(new RegExp(e+"(\\d+((\\.|_)\\d+)*)").exec(n())||[,0])[1]||void 0}function r(e){return parseFloat((e||"").replace(/\_/g,"."))||0}e.exports=s},77:e=>{let t;e.exports="function"==typeof queueMicrotask?queueMicrotask.bind(globalThis):e=>(t||(t=Promise.resolve())).then(e).catch((e=>setTimeout((()=>{throw e}),0)))}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var s=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e].call(s.exports,s,s.exports,__webpack_require__),s.exports}__webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(e,t)=>{for(var s in t)__webpack_require__.o(t,s)&&!__webpack_require__.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var __webpack_exports__={};return(()=>{"use strict";__webpack_require__.d(__webpack_exports__,{default:()=>index_engine});const events={DC_SIGNAL:"SIGNAL",DC_OPEN:"OPEN",DC_REQUEST:"REQUEST",DC_PIECE_NOT_FOUND:"PIECE_NOT_FOUND",DC_PIECE_ABORT:"PIECE_ABORT",DC_CLOSE:"CLOSE",DC_RESPONSE:"RESPONSE",DC_ERROR:"ERROR",DC_PIECE:"PIECE",DC_PIECE_DATA:"PIECE_DATA",DC_TIMEOUT:"TIMEOUT",DC_PIECE_ACK:"PIECE_ACK",DC_METADATA:"METADATA",DC_PLAT_ANDROID:"ANDROID",DC_PLAT_IOS:"IOS",DC_PLAT_WEB:"WEB",DC_CHOKE:"CHOKE",DC_UNCHOKE:"UNCHOKE",DC_HAVE:"HAVE",DC_LOST:"LOST",DC_GET_PEERS:"GET_PEERS",DC_PEERS:"PEERS",DC_STATS:"STATS",DC_SUBSCRIBE:"SUBSCRIBE",DC_UNSUBSCRIBE:"UNSUBSCRIBE",DC_SUBSCRIBE_ACCEPT:"SUBSCRIBE_ACCEPT",DC_SUBSCRIBE_REJECT:"SUBSCRIBE_REJECT",DC_SUBSCRIBE_LEVEL:"SUBSCRIBE_LEVEL",DC_PEER_SIGNAL:"PEER_SIGNAL",DC_PLAYLIST:"PLAYLIST",BM_LOST:"lost",BM_ADDED_SEG_:"BM_ADDED_SEG_",BM_ADDED_SN_:"BM_ADDED_SN_",BM_SEG_ADDED:"BM_SEG_ADDED",FRAG_CHANGED:"FRAG_CHANGED",FRAG_LOADED:"FRAG_LOADED",FRAG_LOADING:"FRAG_LOADING",RESTART_P2P:"RESTART_P2P",EXCEPTION:"exception"},hls_de_events={...events,SCH_DCHAVE:"SCH_DCHAVE",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);const CHECK_PEERS_INTERVAL=3;function noop(){return!0}function getQueryParam(e){var t=new RegExp("(^|&)"+e+"=([^&]*)(&|$)"),s=window.location.search.substr(1).match(t);return null!=s&&""!==s[2]?s[2].toString():""}function updateQueryStringParam(e,t,s){var n=new RegExp("([?&])"+t+"=.*?(&|$)","i"),i=-1!==e.indexOf("?")?"&":"?";return e.match(n)?e.replace(n,"$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:.33*e+.67}function performRangeRequest(e){const t=new XMLHttpRequest;return new Promise(((s,n)=>{t.open("GET",e,!0),t.responseType="arraybuffer",t.timeout=3e3,t.onload=e=>{206===t.status?s():n()},t.onerror=e=>{n()},t.ontimeout=e=>{n()},t.setRequestHeader("Range","bytes=0-0"),t.send()}))}function navLang(){return"zh-CN"===(navigator.language||navigator.userLanguage)?"cn":"en"}function dontWaitFor(e){e.then((()=>{}))}function timeout(e){return new Promise((t=>setTimeout(t,e)))}function getBrowserRTC(){if("undefined"==typeof window)return null;var e={RTCPeerConnection:window.RTCPeerConnection||window.mozRTCPeerConnection||window.webkitRTCPeerConnection,RTCSessionDescription:window.RTCSessionDescription||window.mozRTCSessionDescription||window.webkitRTCSessionDescription,RTCIceCandidate:window.RTCIceCandidate||window.mozRTCIceCandidate||window.webkitRTCIceCandidate};return e.RTCPeerConnection?e:null}function copyBuffer(e){const t=utils_buffer.l.from(e),s=new utils_buffer.l(e.byteLength);return t.copy(s),s}function getMaxSequence(e){const t=e.split("\n");let s=0;let n=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")&&n++;return s+n-1}function isHttps(){return location.protocol.startsWith("https")}function isInteger(e){return"number"==typeof e&&e%1==0}function appendSlogan(e,t,s){var n=document.createElement("div");n.style.position="absolute",n.style.top="8px",n.style.left="8px",n.style.zIndex="999",n.style.fontSize="10px";var i=document.createElement("a");i.href=t,i.target="_blank",i.innerText=e,i.style.color="white",i.style.textDecoration="none",i.style.textShadow="0 0 5px white,0 0 10px #00FFFF,0 0 15px #7FFF00,0 0 20px white";var r=document.createElement("i");r.style.width="5px",r.style.height="5px",r.style.borderRadius="50%",r.style.display="inline-block",r.style.backgroundColor="#67C23A",r.style.marginBottom="2px",r.style.marginRight="4px",n.appendChild(r),n.appendChild(i);var o=s.parentNode;o&&o.insertBefore(n,s)}function getHomeUrl(){return window.atob("aHR0cHM6Ly9zd2FybWNsb3VkLm5ldC9lbi8=")}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),queue_microtask=__webpack_require__(77),queue_microtask_default=__webpack_require__.n(queue_microtask);const MAX_BUFFERED_AMOUNT=65536,ICECOMPLETE_TIMEOUT=5e3,CHANNEL_CLOSING_TIMEOUT=5e3;function filterTrickle(e){return e.replace(/a=ice-options:trickle\s\n/g,"")}function warn(e){console.warn(e)}class Peer extends(events_default()){constructor(e){super(),this.channelName=e.initiator?e.channelName:null,this.initiator=e.initiator||!1,this.channelConfig=e.channelConfig||Peer.channelConfig,this.channelNegotiated=this.channelConfig.negotiated,this.config=Object.assign({},Peer.config,e.config),this.offerOptions=e.offerOptions||{},this.answerOptions=e.answerOptions||{},this.sdpTransform=e.sdpTransform||(e=>e),this.trickle=void 0===e.trickle||e.trickle,this.allowHalfTrickle=void 0!==e.allowHalfTrickle&&e.allowHalfTrickle,this.iceCompleteTimeout=e.iceCompleteTimeout||ICECOMPLETE_TIMEOUT,this.destroyed=!1,this.destroying=!1,this._connected=!1,this.remoteAddress=void 0,this.remoteFamily=void 0,this.remotePort=void 0,this.localAddress=void 0,this.localFamily=void 0,this.localPort=void 0,this._wrtc=e.wrtc&&"object"==typeof e.wrtc?e.wrtc:getBrowserRTC(),this._pcReady=!1,this._channelReady=!1,this._iceComplete=!1,this._iceCompleteTimer=null,this._channel=null,this._pendingCandidates=[],this._isNegotiating=!1,this._firstNegotiation=!0,this._batchedNegotiation=!1,this._queuedNegotiation=!1,this._sendersAwaitingStable=[],this._senderMap=new Map,this._closingInterval=null,this._remoteTracks=[],this._remoteStreams=[],this._chunk=null,this._cb=null,this._interval=null;try{this._pc=new this._wrtc.RTCPeerConnection(this.config)}catch(e){return void queue_microtask_default()((()=>this.destroy(e)))}this._isReactNativeWebrtc="number"==typeof this._pc._peerConnectionId,this._pc.oniceconnectionstatechange=()=>{this._onIceStateChange()},this._pc.onicegatheringstatechange=()=>{this._onIceStateChange()},this._pc.onconnectionstatechange=()=>{this._onConnectionStateChange()},this._pc.onsignalingstatechange=()=>{this._onSignalingStateChange()},this._pc.onicecandidate=e=>{this._onIceCandidate(e)},this.initiator||this.channelNegotiated?this._setupData({channel:this._pc.createDataChannel(this.channelName,this.channelConfig)}):this._pc.ondatachannel=e=>{this._setupData(e)},this._needsNegotiation()}get bufferSize(){return this._channel&&this._channel.bufferedAmount||0}get connected(){return this._connected&&"open"===this._channel.readyState}signal(e){if(this.destroyed)throw new Error("cannot signal after peer is destroyed");if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e={}}e.renegotiate&&this.initiator&&this._needsNegotiation(),e.transceiverRequest&&this.initiator&&this.addTransceiver(e.transceiverRequest.kind,e.transceiverRequest.init),e.candidate&&(this._pc.remoteDescription&&this._pc.remoteDescription.type?this._addIceCandidate(e.candidate):this._pendingCandidates.push(e.candidate)),e.sdp&&this._pc.setRemoteDescription(new this._wrtc.RTCSessionDescription(e)).then((()=>{this.destroyed||(this._pendingCandidates.forEach((e=>{this._addIceCandidate(e)})),this._pendingCandidates=[],"offer"===this._pc.remoteDescription.type&&this._createAnswer())})).catch((e=>{this.destroy(e)})),e.sdp||e.candidate||e.renegotiate||e.transceiverRequest||this.destroy(new Error("signal() called with invalid signal data"))}_addIceCandidate(e){const t=new this._wrtc.RTCIceCandidate(e);this._pc.addIceCandidate(t).catch((e=>{!t.address||t.address.endsWith(".local")?warn("Ignoring unsupported ICE candidate."):this.destroy(e)}))}send(e){this._channel.send(e)}addTransceiver(e,t){if(this.initiator)try{this._pc.addTransceiver(e,t),this._needsNegotiation()}catch(e){this.destroy(e)}else this.emit("signal",{type:"transceiverRequest",transceiverRequest:{kind:e,init:t}})}_needsNegotiation(){this._batchedNegotiation||(this._batchedNegotiation=!0,queue_microtask_default()((()=>{this._batchedNegotiation=!1,!this.initiator&&this._firstNegotiation||this.negotiate(),this._firstNegotiation=!1})))}negotiate(){this.initiator?this._isNegotiating?this._queuedNegotiation=!0:setTimeout((()=>{this._createOffer()}),0):this._isNegotiating?this._queuedNegotiation=!0:this.emit("signal",{type:"renegotiate",renegotiate:!0}),this._isNegotiating=!0}destroy(e){this._destroy(e,(()=>{}))}_destroy(e,t){this.destroyed||this.destroying||(this.destroying=!0,queue_microtask_default()((()=>{if(this.destroyed=!0,this.destroying=!1,this._connected=!1,this._pcReady=!1,this._channelReady=!1,this._remoteTracks=null,this._remoteStreams=null,this._senderMap=null,clearInterval(this._closingInterval),this._closingInterval=null,clearInterval(this._interval),this._interval=null,this._chunk=null,this._cb=null,this._channel){try{this._channel.close()}catch(e){}this._channel.onmessage=null,this._channel.onopen=null,this._channel.onclose=null,this._channel.onerror=null}if(this._pc){try{this._pc.close()}catch(e){}this._pc.oniceconnectionstatechange=null,this._pc.onicegatheringstatechange=null,this._pc.onsignalingstatechange=null,this._pc.onicecandidate=null,this._pc.ontrack=null,this._pc.ondatachannel=null}this._pc=null,this._channel=null,e&&this.emit("error",e),this.emit("close")})))}_setupData(e){if(!e.channel)return this.destroy(new Error("Data channel event is missing `channel` property"));this._channel=e.channel,this._channel.binaryType="arraybuffer","number"==typeof this._channel.bufferedAmountLowThreshold&&(this._channel.bufferedAmountLowThreshold=MAX_BUFFERED_AMOUNT),this.channelName=this._channel.label,this._channel.onmessage=e=>{this._onChannelMessage(e)},this._channel.onbufferedamountlow=()=>{this._onChannelBufferedAmountLow()},this._channel.onopen=()=>{this._onChannelOpen()},this._channel.onclose=()=>{this._onChannelClose()},this._channel.onerror=e=>{this.destroy(e)};let t=!1;this._closingInterval=setInterval((()=>{this._channel&&"closing"===this._channel.readyState?(t&&this._onChannelClose(),t=!0):t=!1}),CHANNEL_CLOSING_TIMEOUT)}_startIceCompleteTimeout(){this.destroyed||this._iceCompleteTimer||(this._iceCompleteTimer=setTimeout((()=>{this._iceComplete||(this._iceComplete=!0,this.emit("iceTimeout"),this.emit("_iceComplete"))}),this.iceCompleteTimeout))}_createOffer(){this.destroyed||this._pc.createOffer(this.offerOptions).then((e=>{if(this.destroyed)return;this.trickle||this.allowHalfTrickle||(e.sdp=filterTrickle(e.sdp)),e.sdp=this.sdpTransform(e.sdp);const t=()=>{if(this.destroyed)return;const t=this._pc.localDescription||e;this.emit("signal",{type:t.type,sdp:t.sdp})};this._pc.setLocalDescription(e).then((()=>{this.destroyed||(this.trickle||this._iceComplete?t():this.once("_iceComplete",t))})).catch((e=>{this.destroy(e)}))})).catch((e=>{this.destroy(e)}))}_requestMissingTransceivers(){this._pc.getTransceivers&&this._pc.getTransceivers().forEach((e=>{e.mid||!e.sender.track||e.requested||(e.requested=!0,this.addTransceiver(e.sender.track.kind))}))}_createAnswer(){this.destroyed||this._pc.createAnswer(this.answerOptions).then((e=>{if(this.destroyed)return;this.trickle||this.allowHalfTrickle||(e.sdp=filterTrickle(e.sdp)),e.sdp=this.sdpTransform(e.sdp);const t=()=>{if(this.destroyed)return;const t=this._pc.localDescription||e;this.emit("signal",{type:t.type,sdp:t.sdp}),this.initiator||this._requestMissingTransceivers()};this._pc.setLocalDescription(e).then((()=>{this.destroyed||(this.trickle||this._iceComplete?t():this.once("_iceComplete",t))})).catch((e=>{this.destroy(e)}))})).catch((e=>{this.destroy(e)}))}_onConnectionStateChange(){this.destroyed||"failed"===this._pc.connectionState&&this.destroy(new Error("Connection failed."))}_onIceStateChange(){if(this.destroyed)return;const e=this._pc.iceConnectionState,t=this._pc.iceGatheringState;this.emit("iceStateChange",e,t),"connected"!==e&&"completed"!==e||(this._pcReady=!0,this._maybeReady()),"failed"===e&&this.destroy(new Error("Ice connection failed.")),"closed"===e&&this.destroy(new Error("Ice connection closed."))}getStats(e){const t=e=>("[object Array]"===Object.prototype.toString.call(e.values)&&e.values.forEach((t=>{Object.assign(e,t)})),e);0===this._pc.getStats.length||this._isReactNativeWebrtc?this._pc.getStats().then((s=>{const n=[];s.forEach((e=>{n.push(t(e))})),e(null,n)}),(t=>e(t))):this._pc.getStats.length>0?this._pc.getStats((s=>{if(this.destroyed)return;const n=[];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,n.push(t(s))})),e(null,n)}),(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 n={},i={},r={};let o=!1;s.forEach((e=>{"remotecandidate"!==e.type&&"remote-candidate"!==e.type||(n[e.id]=e),"localcandidate"!==e.type&&"local-candidate"!==e.type||(i[e.id]=e),"candidatepair"!==e.type&&"candidate-pair"!==e.type||(r[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=n[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(r[e.selectedCandidatePairId]),("googCandidatePair"===e.type&&"true"===e.googActiveConnection||("candidatepair"===e.type||"candidate-pair"===e.type)&&e.selected)&&a(e)})),o||Object.keys(r).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,core_segment=class{constructor(e,t,s,n,i=0){this._sn=e,this._segId=t,this._data=s,this._fromPeerId=n,this._level=i}get size(){return this._data.byteLength}get sn(){return this._sn}get segId(){return this._segId}get data(){return this._data}get fromPeerId(){return this._fromPeerId}get level(){return this._level||0}get isSequential(){return this._sn>=0}};var platform=__webpack_require__(422),platform_default=__webpack_require__.n(platform);const delimiter="|",arrayDelimiter=",",candTypeMap={h:"host",s:"srflx",p:"prflx",r:"relay"},sdpType2Char=(e,t)=>{let s;switch(e){case"candidate":s="c";break;case"offer":s=t?"q":"o";break;case"answer":s=t?"s":"a"}return s},char2SdpType=e=>{let t={};switch(e){case"o":t={type:"offer"};break;case"q":t={type:"offer",trickle:!0};break;case"a":t={type:"answer"};break;case"s":t={type:"answer",trickle:!0};break;case"c":t={type:"candidate",trickle:!0}}return t},charOffset=0,bytesToStr=e=>"number"==typeof e?bytesToStr([e]):String.fromCharCode(...e.map((e=>e+charOffset))),strToBytes=e=>e.split("").map((e=>e.charCodeAt(0)-charOffset));function parseCand(e){const[,t,s,n,i,r,o,a,l,h,c,d,u,g,f]=/(\S*) (\d*) (\S*) (\d*) (\S*) (\d*) typ (\S*)(?: raddr (\S*) rport (\d*))?(?: tcptype (\S*))?(?: generation (\d*))?(?: ufrag (\S*))?(?: network-id (\d*))?(?: network-cost (\d*))?/.exec(e);return{foundation:t,component:s,transport:n,priority:i,ip:r,port:o,type:a,raddr:l,rport:h,tcptype:c,generation:d,networkId:g,networkCost:f,ufrag:u}}function pack({type:e,sdp:t,candidate:s}){return t&&t.startsWith("v=0")?packSdp(e,t):"candidate"===e&&s?packCandidate(s.candidate):null}function packCandidate(e){const t=e.indexOf(":");if(t<=0)return null;let s=packCandItem(e.slice(t+1).trim());return s?sdpType2Char("candidate")+s.cand:null}function packSdp(e,t){let s,n,i,r=[],o=!1,a=!1;for(const e of t.split("\r\n")){const t=e.indexOf(":");if(t<=0)continue;if("a=ice-options:trickle"===e){a=!0;continue}const[l,h]=[e.slice(0,t),e.slice(t+1).trim()];switch(l){case"a=ice-ufrag":s=h;break;case"a=ice-pwd":n=h;break;case"a=fingerprint":i=bytesToStr(h.substr("sha-256".length).trim().split(":").map((e=>parseInt(e,16))));break;case"a=candidate":let e=packCandItem(h,o);if(!e)continue;if(e.local){if(o)continue;o=!0}r.push(e.cand)}}return sdpType2Char(e,a)+i+(r.length>0?r.join(arrayDelimiter):"")+(a?"":delimiter)+s+delimiter+n}function packCandItem(e){let t=!1;const s=parseCand(e);if("TCP"===s.transport)return null;s.ip.endsWith(".local")&&(t=!0);let n=s.type.charAt(0);const i=s.ip.split(".");if(4===i.length){const e=i.reduce((function(e,t){return(e<<8)+parseInt(t,10)}));n=`${n}${s.foundation} ${e}:${parseInt(s.port)}`}else n=`${n}${s.foundation} ${s.ip} ${s.port}`;return{cand:n,local:t}}function unpack(e,t){const s=char2SdpType(e.substr(0,1));return s?"candidate"===s.type?unpackCand(e):unpackSdp(s.type,t,e,s.trickle):null}function unpackCand(e){let t=unpackCandItem(e.substr(1),100);return t?{type:"candidate",candidate:{candidate:`candidate:${t}`,sdpMLineIndex:0,sdpMid:"0"}}:null}function unpackSdp(e,t,s,n){const i=strToBytes(s.slice(1,33)).map((e=>("0"+e.toString(16)).slice(-2))),r=s.substr(33);let o,a,l;n?[a,l]=r.split(delimiter):[o,a,l]=r.split(delimiter);const h=n?[]:o.split(arrayDelimiter),c=["v=0",`o=- ${t} 2 IN IP4 127.0.0.1`,"s=-","t=0 0","a=group:BUNDLE 0","a=msid-semantic: WMS","m=application 9 UDP/DTLS/SCTP webrtc-datachannel","c=IN IP4 0.0.0.0","a=mid:0","a=sctp-port:5000","a=setup:"+("answer"===e?"active":"actpass"),`a=ice-ufrag:${a}`,`a=ice-pwd:${l}`,`a=fingerprint:sha-256 ${i.join(":").toUpperCase()}`];n&&c.push("a=ice-options:trickle");let d=100;for(const e of h){let t=unpackCandItem(e,d);t&&(d--,c.push(`a=candidate:${t}`))}return{type:e,sdp:c.join("\r\n")+"\r\n"}}function unpackCandItem(e,t){let s,n,i;const r=candTypeMap[e.substr(0,1)],o=e.substr(1).split(" ");if(2===o.length){i=o[0];const e=o[1].split(":");s=[e[0]>>24&255,e[0]>>16&255,e[0]>>8&255,255&e[0]].join("."),n=e[1]}else[i,s,n]=o;return`${[i,1,"udp",t,s,n,"typ",r].join(" ")}`}const DC_TOLERANCE=2,DEFAULT_PACKET_SIZE=64e3,ALPHA=.6,SIGNAL_PACK_VER=1;class peer_Peer extends(events_default()){static get VERSION(){return"6"}constructor(e,t,s,n,i,r,o={}){super(),this.engine=e,this.channel=e.fetcher.channelId,this.logger=e.logger,this.config=i,this.isInitiator=n,this.options=o,this.typeExpected=r,this.remotePeerId=s,this.intermediator=o.intermediator||null,this.channelId=n?`${t}-${s}`:`${s}-${t}`,this.cpr=0,this.platform="unknown",this.mobile=!1,this.mobileWeb=!1,this.connected=!1,this.msgQueue=[],this.miss=0,this.notifySet=new Set,this.bufArr=[],this.packetSize=DEFAULT_PACKET_SIZE,this.connTimeout=setTimeout((()=>{this.logger.warn(`dc ${this.channelId} connection timeout`),this.emit(events.DC_ERROR,!0)}),25e3),this.sendReqQueue=[],this.downloading=!1,this.uploading=!1,this.choked=!1,this.downloadListeners=[],this.pieceMsg={},this.timeSendRequest=0,this.timeReceivePiece=0,this.timeSendPiece=0,this.weight=0,this.peersConnected=1,this.timeJoin=getCurrentTs(),this.continuousHits=0,this.uploadSpeed=0,this.gotPeers=!1,this.currentLevel=0;let a={};if(this.options.stuns.length>0){const e=[];this.options.stuns.forEach((t=>{this.logger.info(`use stun ${t}`),e.push({urls:t})})),a.iceServers=e}this.config.webRTCConfig&&(a={...this.config.webRTCConfig,...a}),this.playlistMap=new Map,this._datachannel=new peer_channel({initiator:n,channelName:this.channelId,trickle:o.trickle||!1,config:a}),this._init(this._datachannel),this.dataExchangeTs=this.timeJoin,this.gotStatsTs=this.timeJoin,this.startSN=Number.MAX_SAFE_INTEGER,this.endSN=-1,this.liveEdgeSN=0,this.subscribeEdgeSN=0}get isAvailable(){return this.downloadNum<2&&!this.choked}get isAvailableUrgently(){return!this.downloading&&!this.choked}addDownloadListener(e){this.downloadListeners.push({handler:e})}_init(e){e.on("error",(e=>{this.emit(events.DC_ERROR,!0)})),e.on("signal",(e=>{if(this.cpr===SIGNAL_PACK_VER){const t=pack(e);t?e=t:this.logger.error("signal pack error")}this.emit(events.DC_SIGNAL,e)}));e.once("connect",(()=>{for(this.logger.info(`datachannel CONNECTED to ${this.remotePeerId} from ${this.intermediator?"peer":"server"}`),this.connected=!0,clearTimeout(this.connTimeout),this.emit(events.DC_OPEN);this.msgQueue.length>0;){let e=this.msgQueue.shift();this.emit(e.event,e)}})),e.on("data",(e=>{const{logger:t}=this;if("string"==typeof e){let s=JSON.parse(e);if(!this.connected)return void this.msgQueue.push(s);let n,i=s.event;switch(n=i!==events.DC_PLAYLIST&&i!==events.DC_PEER_SIGNAL?`string: ${e}`:`event: ${i}`,t.debug(`datachannel receive ${n} from ${this.remotePeerId}`),i){case events.DC_HAVE:if(this.emit(s.event,s),!s.sn)return;this.config.live?this.liveEdgeSN=s.sn:(s.sn<this.startSN&&(this.startSN=s.sn),s.sn>this.endSN&&(this.endSN=s.sn));break;case events.DC_PIECE:this.downloading=!0,this.dataExchangeTs=getCurrentTs(),this.timeReceivePiece=performance.now(),this.pieceMsg=s,this._prepareForBinary(s.attachments,s.seg_id,s.sn,s.size),this.emit(s.event,s);break;case events.DC_PIECE_NOT_FOUND:this._sendNextReq()||(this.downloading=!1),this.emit(s.event,s);break;case events.DC_REQUEST:this._handleRequestMsg(s);break;case events.DC_PIECE_ACK:this.dataExchangeTs=getCurrentTs(),this._handlePieceAck(s),this.emit(s.event,s);break;case events.DC_STATS:this._handleStats(s);break;case events.DC_PLAYLIST:this.config.sharePlaylist&&this._handlePlaylist(s);break;case events.DC_METADATA:this._handleMetadata(s);break;case events.DC_PIECE_ABORT:if(this.downloading){if(this.downloadListeners.length>0){for(let e of this.downloadListeners){const{handler:t}=e;t(this.bufSN,this.segId,!0,"aborted by upstream peer")}this.downloadListeners=[]}this.emit(events.DC_PIECE_ABORT,s)}break;case events.DC_CHOKE:t.info(`choke peer ${this.remotePeerId}`),this.choked=!0;break;case events.DC_UNCHOKE:t.info(`unchoke peer ${this.remotePeerId}`),this.choked=!1;break;case events.DC_CLOSE:this.emit(s.event,s.fatal||!1);break;default:this.emit(s.event,s)}}else{if(!this.downloading)return void t.error(`peer is not downloading, data size ${e.byteLength} pieceMsg ${JSON.stringify(this.pieceMsg)}`);this._handleBinaryMsg(e)}})),e.once("close",(()=>{this.emit(events.DC_CLOSE,!1)})),e.on("iceStateChange",((e,t)=>{"disconnected"===e&&(this.logger.warn(`${this.remotePeerId} disconnected`),this.connected=!1)}))}sendJson(e){e.event!==events.DC_PLAYLIST&&e.event!==events.DC_PEER_SIGNAL?this.logger.debug(`dc bufferSize ${this._datachannel.bufferSize} send ${JSON.stringify(e)} to ${this.remotePeerId}`):this.logger.debug(`dc send event ${e.event} to ${this.remotePeerId}`);const t=JSON.stringify(e);return t.length>DEFAULT_PACKET_SIZE?(this.logger.error("string to send is too large"),!1):this.send(t)}send(e){if(this._datachannel&&this._datachannel.connected)try{return this._datachannel.send(e),!0}catch(e){this.logger.warn(`datachannel ${this.channelId} send data failed, close it`),this.emit(events.DC_ERROR,!1)}return!1}sendMsgHave(e,t,s={}){this.sendJson({event: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})}sendSubscribe(){this.sendJson({event:events.DC_SUBSCRIBE})}sendUnsubscribe(e){this.resetContinuousHits(),this.sendJson({event:events.DC_UNSUBSCRIBE,reason:e})}sendSubscribeReject(e){this.sendJson({event:events.DC_SUBSCRIBE_REJECT,reason:e})}sendSubscribeAccept(e){this.sendJson({event:events.DC_SUBSCRIBE_ACCEPT,level:e})}sendSubscribeLevel(e){this.sendJson({event:events.DC_SUBSCRIBE_LEVEL,level:e})}sendMsgStats(e,t,s=0){const n={event:events.DC_STATS,total_conns:e,children:t,level:s};this.sendJson(n)}sendMsgPlaylist(e,t,s){if(this.playlistMap.has(e)){if(this.playlistMap.get(e).seq>=s)return}const n={event:events.DC_PLAYLIST,url:e,data:t,seq:s};this.sendJson(n)}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,n=!1){return this.sendJson({event:events.DC_PEER_SIGNAL,action:"reject",to_peer_id:e,from_peer_id:t,reason:s,fatal:n})}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.0.3",sequential:t,peers:s})}sendPartialBuffer(e,t,s={}){this.sendMsgPiece(e,s);for(let e=0;e<t.length;e++)this.send(t[e])}sendMsgPiece(e,t={}){e.ext||(e.ext={}),e.ext.from&&t.from&&(t.from=`${e.ext.from}->${t.from}`),t.incompletes&&e.ext.incompletes&&(t.incompletes+=e.ext.incompletes),t=Object.assign({},e.ext,t);const s={...e,ext:t};this.sendJson(s)}sendBuffer(e,t,s,n={}){let i=s.byteLength,r=0,o=0;i%this.packetSize==0?o=i/this.packetSize:(o=Math.floor(i/this.packetSize)+1,r=i%this.packetSize);let a={event:events.DC_PIECE,attachments:o,seg_id:t,sn:e,level:n.level,size:i};delete n.level,this.sendMsgPiece(a,n);const l=dividePayload(s,this.packetSize,o,r);for(let e=0;e<l.length;e++)this.send(l[e]);this.uploading=!1,this.timeSendPiece=performance.now()}get downloadNum(){return this.downloading?this.sendReqQueue.length+1:0}requestDataById(e,t,s=!1,n={}){const i={event:events.DC_REQUEST,seg_id:e,sn:t,...n,urgent:s};this.downloading?(this.logger.info(`add req ${e} in queue`),s?this.sendReqQueue.unshift(i):this.sendReqQueue.push(i)):this._realRequestData(i)}requestDataBySN(e,t=!1,s={}){const n={event:events.DC_REQUEST,sn:e,...s,urgent:t};this.downloading?(this.logger.info(`add req ${e} in queue`),t?this.sendReqQueue.unshift(n):this.sendReqQueue.push(n)):this._realRequestData(n)}_realRequestData(e){this.sendJson(e),this.timeSendRequest=performance.now(),this.downloading=!0}shouldWaitForRemain(e){if(0===this.bufArr.length)return!1;if(0===this.timeReceivePiece)return!1;this.logger.warn(`${this.bufArr.length} of ${this.pieceMsg.attachments} packets loaded`);let t=0;for(let e=0;e<this.bufArr.length;e++)t+=this.bufArr[e].byteLength;return t/(performance.now()-this.timeReceivePiece)>=(this.expectedSize-t)/e}close(e){this.emit(events.DC_CLOSE,e)}receiveSignal(e){e.type||e.candidate||(this.cpr=SIGNAL_PACK_VER,e=unpack(e,this.cpr+"")),e&&this._datachannel.signal(e)}resetContinuousHits(e=0){this.logger.info(`reset ${this.remotePeerId} continuousHits`),this.continuousHits=e}increContinuousHits(){this.continuousHits++}destroy(e=!0){if(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.downloadListeners.length>0){for(let e of this.downloadListeners){const{handler:t}=e;t(this.bufSN,this.segId,!0,"upstream peer is closed")}this.downloadListeners=[]}let t={event:events.DC_CLOSE,fatal:e};this.sendJson(t),this._datachannel.removeAllListeners(),this.removeAllListeners(),this._datachannel.destroy(),this.engine=null}_handleBinaryMsg(e){if(this.bufArr.push(e),this.remainAttachments--,this.emit(events.DC_PIECE_DATA,this.bufSN,this.segId,e,this.pieceMsg.attachments-this.remainAttachments,0===this.remainAttachments,this.pieceMsg),this.downloadListeners.length>0)for(let t of this.downloadListeners){const{handler:s}=t;s(this.bufSN,this.segId,!1,e,0===this.remainAttachments)}if(0===this.remainAttachments){if(this.downloadListeners=[],this.timeSendRequest>0){const e=this.expectedSize/(performance.now()-this.timeSendRequest);this.weight=this.weight>0?ALPHA*this.weight+(1-ALPHA)*e:e}this.sendJson({event:events.DC_PIECE_ACK,sn:this.bufSN,seg_id:this.segId,size:this.expectedSize}),this.timeSendRequest=0,this.timeReceivePiece=0,this._sendNextReq()||(this.downloading=!1),this._handleBinaryData()}}_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:n}=e;this.playlistMap.set(t,{data:s,seq:n})}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)}_handleRequestMsg(e){this.uploading?this.logger.warn(`${this.remotePeerId} is uploading when receive request`):(this.uploading=!0,this.emit(events.DC_REQUEST,e))}_handlePieceAck(e){0!==this.timeSendPiece&&(this.uploadSpeed=Math.round(e.size/(performance.now()-this.timeSendPiece)*2),this.timeSendPiece=0,this.logger.info(`${this.remotePeerId} uploadSpeed is ${this.uploadSpeed}`))}_prepareForBinary(e,t,s,n){this.bufArr=[],this.remainAttachments=e,this.segId=t,this.bufSN=s,this.expectedSize=n}_handleBinaryData(){let e=utils_buffer.l.concat(this.bufArr);const t=e.byteLength;if(t===this.expectedSize){let t=new Uint8Array(e).buffer;const s=new core_segment(this.bufSN,this.segId,t,this.remotePeerId,this.pieceMsg.level);this.emit(events.DC_RESPONSE,s,this.weight)}else this.logger.error(`${this.segId} expectedSize ${this.expectedSize} not equal to byteLength ${t}`);this.segId="",this.bufArr=[],this.expectedSize=-1}checkIfNeedChoke(){const{logger:e}=this;if(this.miss++,e.info(`${this.channelId} miss ${this.miss}`),this.miss>DC_TOLERANCE&&!this.choked){this.choked=!0;const t=30*this.miss;t<=150?(e.warn(`datachannel ${this.channelId} is choked`),this.chokeTimer=setTimeout((()=>{this.choked=!1,e.warn(`datachannel ${this.channelId} is unchoked`)}),1e3*t)):e.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`),t.length>0&&t.length===s.attachments?(this._handleBinaryData(),!1):(this.emit(events.DC_TIMEOUT),this.checkIfNeedChoke(),!0)}sendMsgPieceAbort(e){this.uploading=!1,this.sendJson({event:events.DC_PIECE_ABORT,reason:e})}}function dividePayload(e,t,s,n){let i=[];if(n){let r;for(let n=0;n<s-1;n++)r=e.slice(n*t,(n+1)*t),i.push(r);r=e.slice(e.byteLength-n,e.byteLength),i.push(r)}else{let n;for(let r=0;r<s;r++)n=e.slice(r*t,(r+1)*t),i.push(n)}return i}const peer=peer_Peer,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"};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");if(e.simultaneousTargetPeers<=0)throw new Error("simultaneousTargetPeers must >= 1")}initLogger(){const{config:e}=this;e.showSlogan&&"en"===navLang()&&console.log(`%cEmpower your users to become the unlimitedly scalable CDN!\n%c${getHomeUrl()}`,"color: dodgerblue; padding:20px 0; font-size: x-large","font-size: medium; padding-bottom:15px");const t=new utils_logger(e.logLevel);return e.logger=this.logger=t,t}makeChannelId(e,t){if(!e||"string"!=typeof e){const e="token is required while using customized channelId!";throw console.error(e),new Error(e)}return(s,n)=>`${e}-${t(s,n)}`}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 n;"object"!=typeof t.wsSignalerAddr||t.wsSignalerAddr.backup?"string"==typeof t.wsSignalerAddr&&(n=t.wsSignalerAddr):n=t.wsSignalerAddr.main,n===s&&(n=void 0),n&&(e=url_toolkit_default().parseURL(n).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.p2pEnabled&&this.disableP2P(),window.removeEventListener(t,s)};e?window.removeEventListener(t,s):window.addEventListener(t,s)}destroy(){this.disableP2P(),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.0.3",EngineBase.protocolVersion=peer.VERSION;const engine_base=EngineBase;function tryGetVideoElement(e){if(e){if("string"==typeof e)return document.querySelector(e);if("[object HTMLVideoElement]"===Object.prototype.toString.call(e))return e}return document.getElementsByTagName("video")[0]}class Engine extends engine_base{constructor(e={}){super(e),window.__swP2pEngineHlsActive=!0,this.config=e,this.rangeTested=!1,this.lastLevel=0,this.multiBitrate=!1}setup(){let{token:e,channelId:t,segmentId:s}=this.config,n=e=>{const t=url_toolkit_default().parseURL(e);return`${t.netLoc.substr(2)+t.path.substring(0,t.path.lastIndexOf("."))}`},i=(e,t,s,n)=>{let i=s.split("?")[0];return i.startsWith("http")&&(i=i.split("://")[1]),n?`${i}|${n}`:`${i}`};t&&"function"==typeof t&&(n=this.makeChannelId(e,t),s||(i=(e,t,s,n)=>`${t}`)),s||(this.config.segmentId=i);return{channelIdMaker:n,signalId:this.makeSignalId(),browserInfo:{...this.commonBrowserInfo,tag:this.config.tag||void 0,abr:this.multiBitrate||void 0}}}setupElectron(){this.browserInfo.device===platform.device.PC_NATIVE&&(this.browserInfo={...this.browserInfo,app:this.config.appName,bundle:this.config.appId})}getExtraForStats(){const e={};return!this.config.live&&this.media&&(e.pos=Math.round(this.media.currentTime)),this.multiBitrate&&this.currentLevel!==this.lastLevel&&(e.level=this.currentLevel+"",this.lastLevel=this.currentLevel),e}getExtraForPeersRequest(){const e={};return this.multiBitrate&&(e.level=this.currentLevel+""),e}destroy(){window.__swP2pEngineHlsActive=!1,super.destroy()}}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],n='"';0===e.indexOf(n)&&e.lastIndexOf(n)===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 n=0;n<e.length;n++){const i=e[n];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,n=[];function i(e,t){["video","audio"].forEach((s=>{const n=e.filter((e=>isCodecType(e,s)));if(n.length){const i=n.filter((e=>0===e.lastIndexOf("avc1",0)||0===e.lastIndexOf("mp4a",0)));t[`${s}Codec`]=i.length>0?i[0]:n[0],e=e.filter((e=>-1===n.indexOf(e)))}})),t.unknownCodecs=e}for(MASTER_PLAYLIST_REGEX.lastIndex=0;null!=(s=MASTER_PLAYLIST_REGEX.exec(e));){const e={},r=e.attrs=new attr_list(s[1]);e.url=M3U8Parser.resolve(s[2],t);const o=r.decimalResolution("RESOLUTION");o&&(e.width=o.width,e.height=o.height),e.bitrate=r.decimalInteger("AVERAGE-BANDWIDTH")||r.decimalInteger("BANDWIDTH"),e.name=r.NAME,i([].concat((r.CODECS||"").split(/[ ,]+/)),e),e.videoCodec&&-1!==e.videoCodec.indexOf("avc1")&&(e.videoCodec=M3U8Parser.convertAVC1ToAVCOTI(e.videoCodec)),n.push(e)}return n}static parseMasterPlaylistMedia(e,t,s,n=[]){let i,r=[],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),n.length){const t=M3U8Parser.findGroup(n,e.groupId);e.audioCodec=t?t.codec:n[0].codec}e.id=o++,r.push(e)}}return r}static parseLevelPlaylist(e,t){let s,n,i=0,r=0,o=new Level(t),a=new LevelKey,l=0,h=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=r,c.levelkey=a,c.sn=e,c.cc=l,c.baseurl=t,c.relurl=(" "+s[3]).slice(1),assignProgramDateTime(c,h),o.fragments.push(c),h=c,r+=c.duration,c=new Fragment}}else if(s[4]){if(c.rawByteRange=(" "+s[4]).slice(1),h){const e=h.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),n=1;n<s.length&&void 0===s[n];n++);const e=(" "+s[n+1]).slice(1),r=(" "+s[n+2]).slice(1);switch(s[n]){case"#":c.tagList.push(r?[e,r]:[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":l++,c.tagList.push(["DIS"]);break;case"DISCONTINUITY-SEQ":l=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 n=new attr_list(e).decimalFloatingPoint("TIME-OFFSET");Number.isFinite(n)&&(o.startTimeOffset=n);break;case"MAP":let h=new attr_list(e);c.relurl=h.URI,c.rawByteRange=h.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=h,c&&!c.relurl&&(o.fragments.pop(),r-=c.duration),o.totalduration=r,o.averagetargetduration=r/o.fragments.length,o.endSN=i-1,o.startCC=o.fragments[0]?o.fragments[0].cc:0,o.endCC=l,!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 n=t-1;n>=0;n--){const t=e[n];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)}const LIVE_MAX_BUFFER_SIZE=36700160,MIN_SEGMENTS_KEEP=5;class SegmentCache extends(events_default()){constructor(e,t){super(),this.logger=t.logger;const s=e.browserInfo.device;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),this._segPool=new Map,this._currBufSize=0,this.id2Sn=new Map,this.overflowed=!1}get currBufSize(){return this._currBufSize}hasSegOfId(e){const t=this.id2Sn.get(e);return!!this._segPool.has(t)&&this._segPool.get(t).some((t=>t.segId===e))}getSegById(e){const t=this.id2Sn.get(e);if(!this._segPool.has(t))return null;const s=this._segPool.get(t);for(let t of s)if(t.segId===e)return t;return null}getSegIdBySN(e){if(this._segPool.has(e)){return this._segPool.get(e)[0].segId}return 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:n,size:i}=e;if(this.id2Sn.set(s,n),this._segPool.has(n)){this._segPool.get(n).push(e)}else this._segPool.set(n,[e]);this._currBufSize+=parseInt(i);const r=this._segPool.size;if(this.emit(`${events.BM_ADDED_SN_}${e.sn}`,e),this.emit(events.BM_SEG_ADDED,e),this._currBufSize<this.maxBufSize||r<=MIN_SEGMENTS_KEEP)return;let o=Array.from(this._segPool.keys()).sort(((e,t)=>e-t)),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],n=this._segPool.get(e);if(!n){t.error("lastSeg not found");continue}let i=0;n.forEach((e=>{i+=e.size})),this._currBufSize-=parseInt(i),this._segPool.delete(e),n.forEach((n=>{this.id2Sn.delete(n.segId),t.info(`pop seg ${n.segId} size ${n.size}`),this.emit(events.BM_LOST,{sn:e,segId:n.segId,next:s,level:n.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;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)),window.localStorage.setItem(e,t)},getItem=e=>{const t=window.localStorage.getItem(e);try{const s=JSON.parse(t);if(s.duration&&s.startTime){return(new Date).getTime()-s.startTime>s.duration?(removeItem(e),null):s.value}return s}catch(e){return t}},removeItem=e=>{window.localStorage.removeItem(e)},removeAllItem=()=>{window.localStorage.clear()},setItemWithExpiration=(e,t,s)=>{let n={value:t,duration:s,startTime:(new Date).getTime()};setItem(e,n)},MIN_CONNS=8,BASE_REPORT_INTERVAL=20,IPAPI_URL="//pro.ip-api.com/json?fields=2181826&key=XOpiansRgYxGTho",IPAPI_TIMEOUT=500,GEOIP_KEY="SW_GEOIP_KEY",GEOIP_EXPIRATION=2592e5,GEOIP_EXPIRATION_MOBILE=432e5,URL_MAP={q:"uZ2luZS5u",v:"Y24u",3:"Y2Ru",0:"yMzMzL2Js",l:"Nvb",zz:"aHR0cHMlM",n:"YnllLm",h:"ZXQlM0E",7:"Q==",df:"0EvL",6:"3AycGV",x:"aGsuc3d",kj:"dHJhY",a:"2tlci5","+":"oZHR2","=":"Y2xvdW",w:"QuY29t","{":"3ZWIz","?":"LWxhY",$:"i5jb20=",o:"hcm1j",xo:"bG91ZC",sb:"5uZXQ="},_httpDownloaded=Symbol("httpDownloaded"),_p2pDownloaded=Symbol("p2pDownloaded"),_p2pUploaded=Symbol("p2pUploaded");class Server{constructor(e,t,s,n,i){let r;switch(e.config.announceLocation){case"cn":r=URL_MAP.v+URL_MAP[3]+URL_MAP.n+URL_MAP.l+URL_MAP[7];break;case"hk":r=URL_MAP.x+URL_MAP.o+URL_MAP.xo+URL_MAP.sb;break;case"us":r=URL_MAP.kj+URL_MAP.a+URL_MAP["+"]+URL_MAP["="]+URL_MAP.w;break;case"eu":r=URL_MAP.kj+URL_MAP.a+URL_MAP["{"]+URL_MAP["?"]+URL_MAP.$}this.engine=e,this.key=t||void 0,this.baseUrl=n||`https://${window.atob(r)}/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.0.3",this.announce,this.channelId,i.type);this.native=!!i.bundle,this.announceInfo={...i,channel:this.channelId,ts:this.timestamp,version:"2.0.3",v:a,announce:this.announce,token:(0,platform.isLocalHost)()&&!this.native?void 0:this.key},this.announceURL=`${this.baseUrl}/channel`,this.reportFails=0,this.forbidden=!1,this.failConns=0,this.totalHTTPDownloaded=0,this.totalP2PDownloaded=0,this.totalP2PUploaded=0,this[_httpDownloaded]=0,this[_p2pDownloaded]=0,this[_p2pUploaded]=0,this.speed=0,this.errsBufStalled=0,this.errsInternalExpt=0}geoipRequest(){const{logger:e}=this.engine;return new Promise(((t,s)=>{const n=getItem(GEOIP_KEY);n?(e.info("found local geo data"),t(n)):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=>{const{lat:t,lon:s,isp:n,as:i,mobile:r,countryCode:o,continentCode:a}=e;r&&(this.announceInfo.netType="cellular");const l=i.split(" ")[0].substr(2);return this.announceInfo.tag||(this.announceInfo.tag=`${a||""}-${(0,platform.getBrowser)()}${isHttps()?"s":""}`),this.announceInfo={...this.announceInfo,lat:t,lon:s,isp:n,asn:l,country:o},this.btAnnounce()})).catch((t=>{if(e.error(`preflight error ${t}`),"TRACKER_EXPT"!==t.code)return this.btAnnounce();throw t})))}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 n=e.data;if(n.f&&(this.forbidden=!0),-1===e.ret){const{code:t,msg:n}=e.data;s(err_code_default()(new Error(n),"TRACKER_EXPT",{retry:t>=5e3}))}else n.info&&console.info(`${n.info}`),n.warn&&console.warn(`${n.warn}`),n.min_conns||(n.min_conns=MIN_CONNS),(!n.rejected||n.rejected&&n.share_only)&&n.id&&n.report_interval&&n.peers?(this.peerId=this.id=n.id,n.report_interval<BASE_REPORT_INTERVAL&&(n.report_interval=BASE_REPORT_INTERVAL),this.btStats(n.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(n)):(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,n){if((t>>=8)<e){for(;--e;)n=_0x3eee5c.shift(),t===e?(t=n,s=_0x3eee5c.shift()):s.replace(/[PmWtORKFVimMIwnGl=]/g,"")===t&&_0x3eee5c.push(n);_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,n=String(e).replace(/=+$/,""),i=0,r=0,o="";s=n.charAt(r++);~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,n=[],i=0,r="",o="",a=0,l=(e=atob(e)).length;a<l;a++)o+="%"+("00"+e.charCodeAt(a).toString(16)).slice(-2);e=decodeURIComponent(o);for(var h=0;h<256;h++)n[h]=h;for(h=0;h<256;h++)i=(i+n[h]+t.charCodeAt(h%t.length))%256,s=n[h],n[h]=n[i],n[i]=s;h=0,i=0;for(var c=0;c<e.length;c++)i=(i+n[h=(h+1)%256])%256,s=n[h],n[h]=n[i],n[i]=s,r+=String.fromCharCode(e.charCodeAt(c)^n[(n[h]+n[i])%256]);return r},_0x38aa.qlEmAJ={},_0x38aa.UJLmyS=!0}var n=_0x38aa.qlEmAJ[e];return void 0===n?(void 0===_0x38aa.CjmTAl&&(_0x38aa.CjmTAl=!0),s=_0x38aa.amGtZD(s,t),_0x38aa.qlEmAJ[e]=s):s=n,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}}postStats(){const{logger:e}=this.engine;fetch(this.statsURL,{method:"POST",body:JSON.stringify(this._makeStatsBody())}).then((e=>(this.reportFails=0,e.text()))).then((t=>{let s;if(s=t?JSON.parse(t):{ret:0},-1===s.ret)clearInterval(this.heartbeater),e.error(`${s.data.msg} code ${s.data.code}`),this.engine.emit(events.RESTART_P2P);else{const{http:e=0,p2p:t=0,share:s=0,failConns:n=0,errsBufStalled:i=0,errsInternalExpt:r=0}=this.lastStats||{};this[_httpDownloaded]>=e&&(this[_httpDownloaded]-=e),this[_p2pDownloaded]>=t&&(this[_p2pDownloaded]-=t),this[_p2pUploaded]>=s&&(this[_p2pUploaded]-=s),this.failConns>=n&&(this.failConns-=n),this.errsBufStalled>=i&&(this.errsBufStalled-=i),this.errsInternalExpt>=r&&(this.errsInternalExpt-=r),this.exptMsg&&(this.exptMsg=void 0)}})).catch((t=>{e.error(`btStats error ${t}`),this.reportFails++,this.reportFails>=3&&clearInterval(this.heartbeater)}))}btGetPeers(e){const{logger:t}=this.engine,{asn:s,country:n}=this.announceInfo;let i={exclusions:e,asn:s,country:n},r={};return this.engine.getExtraForPeersRequest&&(r=this.engine.getExtraForPeersRequest()),i=Object.assign({},i,r),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++}reportFlow(e){const t=Math.round(e/1024);this[_httpDownloaded]+=t,this.totalHTTPDownloaded+=t,this._emitStats()}reportDCTraffic(e,t){const s=Math.round(e/1024);this[_p2pDownloaded]+=s,this.totalP2PDownloaded+=s,this.speed=Math.round(t),this._emitStats()}reportUploaded(e=0){this.totalP2PUploaded+=Math.round(e/1024),this[_p2pUploaded]+=Math.round(e/1024),this._emitStats()}destroy(){const{logger:e}=this.engine;e.warn("destroy fetcher"),clearInterval(this.heartbeater),clearTimeout(this.bl)}_emitStats(){this.engine.emit("stats",{totalHTTPDownloaded:this.totalHTTPDownloaded,totalP2PDownloaded:this.totalP2PDownloaded,totalP2PUploaded:this.totalP2PUploaded,p2pDownloadSpeed:this.speed});const e=this.engine.config.getStats;e&&"function"==typeof e&&e(this.totalP2PDownloaded,this.totalP2PUploaded,this.totalHTTPDownloaded,this.speed)}_makeStatsBody(){const{asn:e,country:t}=this.announceInfo;let s={totalConns:this.engine.tracker.totalConns,failConns:this.failConns,errsBufStalled:this.errsBufStalled,errsInternalExpt:this.errsInternalExpt,http:Math.round(this[_httpDownloaded])||0,p2p:Math.round(this[_p2pDownloaded])||0,share:Math.round(this[_p2pUploaded])||0,asn:e,country:t},n={};return this.engine.getExtraForStats&&(n=this.engine.getExtraForStats()),s=Object.assign({},s,n),this.lastStats=JSON.parse(JSON.stringify(s)),Object.keys(s).forEach((e=>{0===s[e]&&delete s[e]})),this.exptMsg&&(s.exptMsg="2.0.3 "+this.exptMsg),s}get _requestHeader(){const e={};return this.native&&(e.token=this.key),e}}const server=Server;function genV(e,t,s,n,i){const r=window.location.hostname;var o,a,l,h,c,d;return(o=r,a=t,l=s,h=n,c=i,d=e,md5_default()(o+a+l+h+c,d)).substr(0,8)}const LIVE_SN_LIMIT=20;class BitsetManager{constructor(e=!1,t){this.isLive=e,this.levelMap=new Map;for(let e in t){const s=new Set(t[e]);this.levelMap.set(Number(e),s)}}totalLevels(){return this.levelMap.size}has(e,t){const s=this._createOrGetSet(t);return-1===t?s.some((t=>t.has(e))):s.has(e)}delete(e,t){const s=this._createOrGetSet(t);return-1===t?(this.levelMap.forEach((t=>{t.delete(e)})),!0):s.delete(e)}add(e,t){this._createOrGetSet(t).add(e),this.isLive&&this._trimBitset(e)}array(e,t){const s=this._createOrGetSet(t);return Array.from(s)}allArray(){let e={};return this.levelMap.forEach(((t,s)=>{e[s]=Array.from(t)})),e}clear(){this.levelMap.forEach((e=>{e.clear()}))}size(e){return this._createOrGetSet(e).size}_createOrGetSet(e){if(void 0===e?(console.error("bitset level is undefined"),e=0):"number"!=typeof e&&(console.error("bitset level is not number"),e=Number(e)),-1===e)return this.levelMap.values();let t=this.levelMap.get(e);return t||(t=new Set,this.levelMap.set(e,t)),t}_trimBitset(e){const t=e-LIVE_SN_LIMIT;t>0&&this.levelMap.forEach((e=>{e.delete(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){void 0===e?(console.error("bitCounts level is undefined"),e=0):"number"!=typeof e&&(console.error("bitCounts level is not number"),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.getPeers().filter((e=>e.isAvailableUrgently));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.isAvailable))}}const peer_manager=PeerManager,CHECK_CONN_INTERVAL=50,MAX_NO_EXCHANGE_TIME=120,_shareOnly=Symbol("shareOnly");class SchedulerBase extends(events_default()){constructor(e,t){super(),this.engine=e,this.config=t,this.logger=e.logger,this.bufMgr=null,this.peerManager=new peer_manager,this._setupEngine&&this._setupEngine(),this.loadedPeerNum=0,this.startCheckConnsTimer(),this.dcDownloadTimeout=t.dcDownloadTimeout,this[_shareOnly]=!1,this.downloadOnly=!1}startCheckConnsTimer(){this.checkConnsTimer=setInterval((()=>{this.logger.info("start check conns");const{currentLevel:e}=this.engine;let t=this.peersNum;const s=this.subscribers,n=s&&s.length>0?s.length:void 0,i=getCurrentTs();this.getPeers().forEach((s=>{i-s.dataExchangeTs>MAX_NO_EXCHANGE_TIME&&(i-s.gotStatsTs>=2*CHECK_CONN_INTERVAL+2||void 0!==e&&s.currentLevel!==e)?(this.logger.warn(`close dead or different level peer ${s.remotePeerId} level ${s.currentLevel}`),s.close(!1),t--):s.connected&&s.sendMsgStats(t,n,e||0)}))}),1e3*CHECK_CONN_INTERVAL)}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 e=this._getIdlePeer().length;return this.logger.info(`peers: ${this.peersNum} idle peers: ${e}`),e>0}set bufferManager(e){this.bufMgr=e,e.on(events.BM_LOST,(({sn:e,segId:t,next:s,level:n})=>{this.config.live||this._broadcastToPeers({event:events.DC_LOST,sn:e,seg_id:t,level:n||void 0}),this.onBufferManagerLost(e,t,s,n)})).on(events.BM_SEG_ADDED,(e=>{this.onBufferManagerSegAdded(e)}))}onBufferManagerSegAdded(e){}destroy(){const{logger:e}=this;this.peersNum>0&&this.peerManager.clear(),this.removeAllListeners(),clearInterval(this.checkConnsTimer),e.warn("destroy BtScheduler")}notifyPeersLoaded(e){}_setupDC(e){const{logger:t}=this;e.on(events.DC_PIECE_ACK,(s=>{s.size&&this.engine.fetcher.reportUploaded(s.size),t.info(`uploaded ${s.seg_id} to ${e.remotePeerId}`)})).on(events.DC_TIMEOUT,(e=>{})).on(events.DC_PIECE_ABORT,(s=>{t.warn(`peer ${e.remotePeerId} download aborted, reason ${s.reason}`),e.downloading&&this._handlePieceAborted&&this._handlePieceAborted(e.remotePeerId),e.downloading=!1}))}_broadcastToPeers(e){for(let t of this.peerManager.getPeerValues())t.sendJson(e)}_getIdlePeer(){return this.peerManager.getAvailablePeers()}_peersStats(e){this.engine.emit("peers",e);const t=this.engine.config.getPeersInfo;t&&"function"==typeof t&&t(e)}}const scheduler_base=SchedulerBase;class RequestingMap{constructor(){this.internalMap=new Map}has(e,t){return this.internalMap.has(this._generateId(e,t))}set(e,t,s){const n=this._generateId(e,t);if(this.internalMap.has(n)){const e=this.internalMap.get(n);if(e&&!e.includes(s))return void e.push(s)}this.internalMap.set(n,[s])}getAllPeerIds(e,t){const s=this.internalMap.get(this._generateId(e,t));return s||[]}getOnePeerId(e,t){const s=this._generateId(e,t);if(this.internalMap.has(s)){if(this.internalMap.get(s))return this.internalMap.get(s)[0]}return null}delete(e,t){this.internalMap.delete(this._generateId(e,t))}_generateId(e,t){return void 0===t?(console.error("RequestingMap level is undefined"),t=0):"number"!=typeof t&&(console.error("RequestingMap level is not number"),t=Number(t)),`${t}-${e}`}}const MIN_P2P_LOAD_TIME=2,VOD_MAX_PREFETCH_COUNT=150,Live_MAX_PREFETCH_COUNT=3;class Scheduler extends scheduler_base{constructor(e,t){super(e,t),this.bitset=new BitsetManager(t.live||!1),this.bitCounts=new BitCountsManager,this.requestingMap=new RequestingMap,this.sequential=!0,this.allowP2pLimit=t.httpLoadTime+MIN_P2P_LOAD_TIME,this.playlistInfo=new Map,this.loadedPeerNum=0,this.isUploader=!1,this.isReceiver=!1,this.targetPeers=[],this.mBufferedDuration=0,this.loadingSegId="",this.loadingSN=0,this.currPlaySN=0,this.currLostSN=-1,this.nextLostSN=-1,this.config.live?this.maxPrefetchCount=Live_MAX_PREFETCH_COUNT:(this.maxPrefetchCount=VOD_MAX_PREFETCH_COUNT,this.startCheckPeersTimer())}handshakePeer(e){this._setupDC(e),e.sendMetaData(this.bitset.allArray(),this.sequential,this.peersNum)}_setupDC(e){super._setupDC(e),e.on(hls_de_events.DC_HAVE,(t=>{if(t.sn&&e.bitset&&t.sn&&t.sn>=0){const{sn:s,level:n}=t;e.bitset.has(s,n)||(e.bitset.add(s,n),this.bitset.has(s,n)||this.bitCounts.incre(s,n)),this.emit(hls_de_events.SCH_DCHAVE,t.seg_id)}})).on(hls_de_events.DC_LOST,(t=>{if(!t.sn||!e.bitset)return;const{sn:s,level:n}=t;e.bitset.has(s,n)&&(e.bitset.delete(s,n),this.bitCounts.decre(s,n))})).on(hls_de_events.DC_PIECE_DATA,((t,s,n,i,r,o)=>{1===i&&e.pieceMsg.ext&&e.pieceMsg.ext.incompletes>=2&&this.notifyAllPeers(t,o.level,s)})).on(hls_de_events.DC_PIECE,(e=>{e.ext&&e.ext.incompletes>=2||this.notifyAllPeers(e.sn,e.level,e.seg_id)})).on(hls_de_events.DC_PIECE_NOT_FOUND,(t=>{const{sn:s,level:n}=t;e.bitset.delete(s,n),this.requestingMap.delete(s,n),this.bitCounts.decre(s,n),e.checkIfNeedChoke()})).on(hls_de_events.DC_REQUEST,(t=>{const{logger:s}=this,{sn:n,level:i}=t;this.isUploader=!0;let r=t.seg_id;r||(r=this.bufMgr.getSegIdBySN(n));let o=null;this.requestingMap.has(n,i)&&(o=this.getPeerLoadedMore(n,i));const a=this.bufMgr.getSegById(r);a?(s.info("found seg from bufMgr"),a.level===i?e.sendBuffer(a.sn,a.segId,a.data,{from:"SegmentFromCache",level:a.level}):e.sendPieceNotFound(n,r,{level:i})):o&&o.downloading&&o.pieceMsg.sn===n&&o.pieceMsg.level===i?(s.info(`target had ${o.bufArr.length} packets, wait for remain from upstream ${o.remotePeerId}`),e.sendPartialBuffer(o.pieceMsg,o.bufArr,{from:"WaitForPartial",incompletes:1}),function(e,t){e.addDownloadListener(((e,s,n,i,r)=>{n?t.sendMsgPieceAbort(i):t.send(i),r&&(t.uploading=!1)}))}(o,e)):(s.info(`peer request ${n} wait for seg`),this.bufMgr.once(`${hls_de_events.BM_ADDED_SN_}${n}`,(t=>{t&&t.level===i?(s.info(`peer request notify seg ${t.sn}`),e.sendBuffer(t.sn,t.segId,t.data,{from:"NotifySegment",level:t.level})):e.sendPieceNotFound(n,r,{level:i})})))}))}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);t.field[s].forEach((e=>{this.bitset.has(e,s)||this.bitCounts.incre(e,s)}))}this.addPeer(e),this.downloadOnly&&this.chokePeerRequest(e)}}peersHas(e,t){return this.bitCounts.has(e,t)}deletePeer(e){if(this.peerManager.hasPeer(e.remotePeerId)){const t=e.bitset.allArray();for(let e in t){const s=Number(e),n=t[s];n&&n.forEach((e=>{this.bitCounts.decre(e,s)}))}}this.cleanRequestingMap(e.remotePeerId),super.deletePeer(e)}hasAndSetTargetPeer(e,t,s){const{logger:n,config:i}=this;if(s<=this.allowP2pLimit)return!1;if(this.requestingMap.has(e,t)){const r=this.requestingMap.getOnePeerId(e,t),o=this.peerManager.getPeer(r);return o?!(performance.now()-o.timeSendRequest>3e3&&!o.shouldWaitForRemain(1e3*(s-i.httpLoadTime))&&this._searchAvailablePeers(e,t,1))||(n.warn(`${r} prefetch timeout at ${e}`),this.targetPeers.push(o),this.requestingMap.delete(e,t),!0):this._searchAvailablePeers(e,t)}return this._searchAvailablePeers(e,t)}_searchAvailablePeers(e,t,s=5){if(!this.hasIdlePeers||!this.peersHas(e,t))return!1;let n=0;for(let i of this.peerManager.getPeersOrderByWeight())if(i.bitset.has(e,t)&&(this.logger.info(`found ${e} from peer ${i.remotePeerId}`),this.targetPeers.push(i),n++,n===s||n===this.config.simultaneousTargetPeers))return!0;return this.targetPeers.length>0}reportDCTraffic(e,t,s,n){if(!this.engine.fetcher)return void this.logger.error("DC report failed");const{fetcher:i}=this.engine;let r=s;this.bitset.has(e,t)||i.reportDCTraffic(r,n)}notifyAllPeers(e,t,s,n=[]){const{live:i}=this.config;if(!this.bitset.has(e,t))for(let r of this.peerManager.getPeerValues())if(!r.notifySet.has(e)&&!r.bitset.has(e,t)&&!n.includes(r.remotePeerId)&&(r.sendMsgHave(e,s,{level:t}),r.notifySet.add(e),i)){const t=e-20;t>0&&r.notifySet.delete(t)}}startCheckPeersTimer(e=1){this.logger.info(`loaded peers ${this.loadedPeerNum} next checkDelay is ${e}`),this.loadedPeerNum=0,this.checkTimer||(this.checkTimer=setTimeout((()=>{this.checkPeers(),this.checkTimer=null,this.startCheckPeersTimer(calCheckPeersDelay(this.loadedPeerNum))}),1e3*e))}checkPeers(){const{logger:e,config:t,engine:s}=this,n=t.live,{currentLevel:i}=s;if(e.info(`currentLevel ${i}`),0===this.bitCounts.size(i))return;if(!n&&this.nextLostSN>=0&&this.nextLostSN>=this.currPlaySN-10)return;if(!this.hasPeers)return;if(this.mBufferedDuration<this.allowP2pLimit)return void e.info("low buffer time, skip prefetch");const r=this.peerManager.getPeersOrderByWeight();if(0===r.length)return;const o=[],{prefetchNum:a,endSN:l,startSN:h}=t;let c=0,d=n?this.loadingSN+1:this.loadingSN+2;if(!n)if(this.loadingSN>=l&&!this.bufMgr.overflowed)d=h;else{const e=Math.min(...r.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<r.length&&c<this.maxPrefetchCount;){if(!n&&d>l)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 t of r)if(!o.includes(t)&&t.bitset.has(d,i)){t.requestDataBySN(d,!1,{level:i}),e.info(`request prefetch ${d} level ${i} from peer ${t.remotePeerId} downloadNum ${t.downloadNum}`),o.push(t),this.requestingMap.set(d,i,t.remotePeerId);break}c++,d++}}this.loadedPeerNum=o.length}onBufferManagerLost(e,t,s,n){this.currLostSN=e,s&&(this.nextLostSN=s),this.bitset.delete(e,n),this.bitCounts.delete(e,n)}cleanRequestingMap(e){const t=this.peerManager.getPeer(e);for(let[s,n]of this.requestingMap.internalMap){const i=s.split("-"),r=Number(i[1]),o=Number(i[0]);n&&n.includes(e)&&(this.logger.info(`delete ${s} in requestingMap`),this.requestingMap.delete(r,o),this.bitCounts.decre(r,o),t&&t.bitset.delete(r,o))}}shouldWaitForNextSeg(){let e;return e=!this.isUploader&&(!!this.isReceiver||randomNum(0,100)>20),this.isReceiver=this.isUploader=!1,e}getPeerLoadedMore(e,t){if(!this.requestingMap.has(e,t))return null;const s=this.requestingMap.getAllPeerIds(e,t);if(0===s.length)return null;let n=this.peerManager.getPeer(s[0]);if(!n)return null;if(s.length>1)for(let e=1;e<s.length;e++){const t=this.peerManager.getPeer(s[e]);t&&t.bufArr.length>n.bufArr.length&&(n=t)}return n}updateLoaded(e,t){this.bitset.has(e,t)||(this.bitset.add(e,t),this.bitCounts.has(e,t)&&this.bitCounts.delete(e,t))}broadcastPlaylist(e,t){if(!this.config.live)return;const s=getMaxSequence(t);for(let n of this.peerManager.getPeerValues())n.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 n=s.getLatestPlaylist(e,t);if(n)return n}return null}getBufferedDuration(){let{media:e}=this.engine;if(!e){if(this.logger.info("try get video element"),e=tryGetVideoElement(this.config.videoElem),!e)return 5;this.engine.media=e}let t=0,s=e.currentTime,n=e.buffered;for(let e=n.length-1;e>=0;e--)if(s>=n.start(e)&&s<=n.end(e)){t=n.end(e)-s;break}return this.logger.info(`bufferedDuration ${t}`),this.mBufferedDuration=t,t>0?t:0}destroy(){super.destroy(),clearTimeout(this.checkTimer)}}const MIN_TIME_FOR_LOAD=7.5,MAX_TIME_FOR_WAIT=4;class HlsSwScheduler extends Scheduler{constructor(e,t){super(e,t),this.server=t.fetcher,this.p2pEnabled=e.p2pEnabled,this.resolveMap=new Map,this.dcDownloadTimeout=10,this.fragMap=new Map,this.segmentId=t.segmentId}async handleGetMediaData(e,t){const{logger:s,config:n}=this;let{url:i,range:r}=e;r&&(i=`${i}|${r}`);const o=this.fragMap.get(i);if(!o)return s.info(`cannot get frag ${i}`),t.postMessage({action:hls_de_events.SW_GET_MEDIA});this.engine.currentLevelIndex=o.level;const{sn:a,baseurl:l,level:h}=o,c=this.segmentId(l,a,e.url,r);this.loadingSN=a,this.loadingSegId=c;const d=this.bufMgr.getSegById(c);if(d)return s.info(`bufMgr found seg sn ${a} segId ${c}`),o.loaded=d.data.byteLength,o.fromPeerId=d.fromPeerId,this.engine.emit(hls_de_events.FRAG_LOADED,{url:e.url,sn:a,level:h,segId:c,loaded:o.loaded,duration:o.duration,byP2p:!!d.fromPeerId,fromPeerId:d.fromPeerId}),this._onFragLoaded(e.url,o),t.postMessage({action:hls_de_events.SW_GET_MEDIA,data:{url:e.url,buffer:d.data,incomplete:!1}});if(this.resolveMap.has(a))return s.warn(`${a} is requesting, fallback`),void t.postMessage({action:hls_de_events.SW_GET_MEDIA});const u=this.getBufferedDuration();if(this.hasAndSetTargetPeer(a,h,u)){await this._loadFragByP2p(o,t,a,c,e.url,h)||(this.notifyAllPeers(a,h,c),t.postMessage({action:hls_de_events.SW_GET_MEDIA}))}else if(n.live&&void 0===this.waitTimer&&u>MIN_TIME_FOR_LOAD&&this.shouldWaitForNextSeg()){let n,i=u-MIN_TIME_FOR_LOAD;i>MAX_TIME_FOR_WAIT&&(i=MAX_TIME_FOR_WAIT);const r=async s=>{c===s&&(this.off(hls_de_events.SCH_DCHAVE,r),clearTimeout(this.waitTimer),this.waitTimer=void 0,this.hasAndSetTargetPeer(a,h,u)&&(n=await this._loadFragByP2p(o,t,a,c,e.url,h)),n||(this.notifyAllPeers(a,h,c),t.postMessage({action:hls_de_events.SW_GET_MEDIA})))};s.info(`wait peer have ${c} for ${i}s`),this.on(hls_de_events.SCH_DCHAVE,r),this.waitTimer=setTimeout((()=>{this.off(hls_de_events.SCH_DCHAVE,r),this.notifyAllPeers(a,h,c),t.postMessage({action:hls_de_events.SW_GET_MEDIA}),this.waitTimer=void 0}),1e3*i)}else t.postMessage({action:hls_de_events.SW_GET_MEDIA}),this.notifyAllPeers(a,h,c)}async _loadFragByP2p(e,t,s,n,i,r){const{logger:o}=this;o.info(`p2p load sn ${s} segId ${n} level ${r}`);const a=await this.load(s,n,r);if(a&&a.data){const{data:l,incomplete:h,fromPeerId:c}=a;if(!h&&!this.bufMgr.hasSegOfId(n)){const e=new core_segment(s,n,l,c,r);o.info(`bufMgr putSeg ${s} level ${r}`),this.bufMgr.putSeg(e)}return o.info(`p2p loaded segId ${n} level ${r} size ${l.byteLength} incomplete ${h}`),e.loaded=l.byteLength,e.fromPeerId=c,this.engine.emit(hls_de_events.FRAG_LOADED,{url:i,sn:s,level:r,segId:n,loaded:e.loaded,duration:e.duration,byP2p:!0,fromPeerId:c}),this._onFragLoaded(l.url,e),t.postMessage({action:hls_de_events.SW_GET_MEDIA,data:{url:l.url,buffer:l,incomplete:h}}),!0}o.warn(`P2P timeout load segId ${n}`);const l=this.bufMgr.getSegById(n);return!!l&&(o.info(`already loaded seg sn ${s} segId ${n}`),t.postMessage({action:hls_de_events.SW_GET_MEDIA,data:{url:i,buffer:l.data,incomplete:!1}}),!0)}handleMediaData(e,t){const{config:s,logger:n,engine:i}=this;let{url:r,buffer:o,range:a}=e;if(i.rangeTestUrl===r)return void(i.rangeTestUrl="");n.info(`SW_MEDIA url ${r} size ${o.byteLength} range ${a}`),a&&(r=`${r}|${a}`),this.server.reportFlow(o.byteLength);const l=this.fragMap.get(r);if(l){const{sn:t,level:s,baseurl:r}=l,h=this.segmentId(r,t,e.url,a);if(l.segId=h,l.loaded=o.byteLength,i.emit(hls_de_events.FRAG_LOADED,{url:e.url,sn:t,level:s,segId:h,loaded:l.loaded,duration:l.duration,byP2p:!1}),this._onFragLoaded(e.url,l),!this.bufMgr.hasSegOfId(h)){const e=new core_segment(t,h,o,"",s);this.bufMgr.putSeg(e),n.info(`bufMgr putSeg ${h} level ${s}`)}}t.postMessage({action:hls_de_events.SW_MEDIA})}_setupEngine(){}notifySWMessage(e,t,s){switch(e){case hls_de_events.SW_MEDIA:this.handleMediaData(t,s);break;case hls_de_events.SW_GET_MEDIA:this.handleGetMediaData(t,s);break;default:this.logger.warn(`unknown action ${e}`)}}destroy(){super.destroy();for(let e of this.resolveMap.values())e.criticaltimeouter&&clearTimeout(e.criticaltimeouter);this.logger.warn("destroy HlsSwScheduler")}_criticaltimeout(e,t=!1){const{logger:s,config:n}=this,i=this.resolveMap.get(e);if(!i)return void s.warn("_criticaltimeout no promise");const{level:r}=i;let o;s.info(`critical request ${e} level ${r} timeout`),this.requestingMap.has(e,r)&&(o=this.getPeerLoadedMore(e,r));let a=!1;if(o&&(a=!o.loadtimeout()),a)return void s.info("p2p download completed");const l=1e3*n.httpLoadTime-500;if(t&&o&&o.shouldWaitForRemain(l))return s.info(`wait for peer load remain of ${e}`),void(this.criticaltimeouter=window.setTimeout(this._criticaltimeout.bind(this,e),l+200));if(n.httpRangeSupported&&o&&o.bufArr.length>0){let e=utils_buffer.l.concat(o.bufArr);i.resolve({data:e,fromPeerId:o.remotePeerId,incomplete:!0})}else i.resolve();this.resolveMap.delete(e)}_handlePieceAborted(e){for(let[t,s]of this.requestingMap.internalMap)if(s&&s.includes(e)){const n=t.split("-"),i=Number(n[1]),r=Number(n[0]);if(1===s.length){if(this.resolveMap.has(i)){const e=this.resolveMap.get(i);window.clearTimeout(e.criticaltimeouter),this._criticaltimeout(i),this.resolveMap.delete(i)}this.logger.info(`delete ${i} in requestingMap`),this.requestingMap.delete(i,r)}else this.requestingMap.internalMap.set(t,s.filter((t=>t!==e)))}}_onFragLoaded(e,t){if(this.updateLoaded(t.sn,t.level),!this.engine)return;const{media:s,targetDuration:n}=this.engine;!this.config.live&&s&&n&&(this.currPlaySN=Math.ceil(s.currentTime/n))}load(e,t,s){const{logger:n}=this;this.isReceiver=!0;let i=this.mBufferedDuration-this.config.httpLoadTime;i>this.dcDownloadTimeout&&(i=this.dcDownloadTimeout);const r=new Promise((t=>{const n={resolve:t,sn:e,level:s,incomplete:!1,criticaltimeouter:window.setTimeout(this._criticaltimeout.bind(this,e,!1),1e3*i),numPeer:this.targetPeers.length||1};this.resolveMap.set(e,n)}));if(this.requestingMap.has(e,s))n.info(`wait for criticalSeg sn ${e} timeout ${i}`);else for(let r of this.targetPeers)r.requestDataById(t,e,!0,{level:s}),this.requestingMap.set(e,s,r.remotePeerId),n.info(`request criticalSeg sn ${e} level ${s} from ${r.remotePeerId} timeout ${i}`);return this.targetPeers=[],r}_setupDC(e){super._setupDC(e);const{logger:t,config:s}=this;e.on(hls_de_events.DC_HAVE,(e=>{queue_microtask_default()((()=>{s.live&&0===this.resolveMap.size&&this.checkPeers()}))})).on(hls_de_events.DC_PIECE,(t=>{this.requestingMap.set(t.sn,t.level,e.remotePeerId)})).on(hls_de_events.DC_PIECE_NOT_FOUND,(e=>{const{sn:s,level:n}=e;if(this.resolveMap.has(s)){const e=this.resolveMap.get(s);1===e.numPeer?(this.resolveMap.delete(s),clearTimeout(e.criticaltimeouter),t.info(`DC_PIECE_NOT_FOUND ${s}`),e.resolve()):e.numPeer>1&&e.numPeer--}})).on(hls_de_events.DC_RESPONSE,((s,n)=>{const{config:i}=this,{segId:r,sn:o,data:a,level:l}=s,h=this.resolveMap.has(o);if(i.validateSegment(r,a))if(this.notifyAllPeers(o,l,r),super.reportDCTraffic(o,l,s.size,n),h){t.info(`receive criticalSeg seg_id ${r}`);const s=this.resolveMap.get(o);this.resolveMap.delete(o),window.clearTimeout(s.criticaltimeouter),e.miss=0,s.resolve({data:a,fromPeerId:e.remotePeerId})}else{if(this.bitset.has(o,l))return;const t=new core_segment(o,r,a,e.remotePeerId,l);this.bufMgr.putSeg(t),this.updateLoaded(o,l)}else if(t.warn(`segment ${r} validate failed`),h){const e=this.resolveMap.get(o);this.resolveMap.delete(o),window.clearTimeout(e.criticaltimeouter),e.resolve()}this.requestingMap.delete(o,l),i.live&&0===this.resolveMap.size&&this.checkPeers()}))}}const hls_sw_scheduler=HlsSwScheduler;
|
|
2
|
-
/*! *****************************************************************************
|
|
3
|
-
Copyright (c) Microsoft Corporation. All rights reserved.
|
|
4
|
-
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
|
|
5
|
-
this file except in compliance with the License. You may obtain a copy of the
|
|
6
|
-
License at http://www.apache.org/licenses/LICENSE-2.0
|
|
7
|
-
|
|
8
|
-
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
9
|
-
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
|
|
10
|
-
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
|
|
11
|
-
MERCHANTABLITY OR NON-INFRINGEMENT.
|
|
12
|
-
|
|
13
|
-
See the Apache Version 2.0 License for specific language governing permissions
|
|
14
|
-
and limitations under the License.
|
|
15
|
-
***************************************************************************** */
|
|
16
|
-
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 n,i,r=s.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(n=r.next()).done;)o.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(s=r.return)&&s.call(r)}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 n=e.call(this,"error",s)||this;return n.message=t.message,n.error=t,n}return __extends(t,e),t}(Event),CloseEvent=function(e){function t(t,s,n){void 0===t&&(t=1e3),void 0===s&&(s="");var i=e.call(this,"close",n)||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 n=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){n._debug("open event");var t=n._options.minUptime,s=void 0===t?DEFAULT.minUptime:t;clearTimeout(n._connectTimeout),n._uptimeTimeout=setTimeout((function(){return n._acceptOpen()}),s),n._ws.binaryType=n._binaryType,n._messageQueue.forEach((function(e){return n._ws.send(e)})),n._messageQueue=[],n.onopen&&n.onopen(e),n._listeners.open.forEach((function(t){return n._callEventListener(e,t)}))},this._handleMessage=function(e){n._debug("message event"),n.onmessage&&n.onmessage(e),n._listeners.message.forEach((function(t){return n._callEventListener(e,t)}))},this._handleError=function(e){n._debug("error event",e.message),n._disconnect(void 0,"TIMEOUT"===e.message?"timeout":void 0),n.onerror&&n.onerror(e),n._debug("exec error listeners"),n._listeners.error.forEach((function(t){return n._callEventListener(e,t)})),n._connect()},this._handleClose=function(e){n._debug("close event"),n._clearTimeouts(),n._shouldReconnect&&n._connect(),n.onclose&&n.onclose(e),n._listeners.close.forEach((function(t){return n._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,n=this._listeners[e.type];if(n)try{for(var i=__values(n),r=i.next();!r.done;r=i.next()){var o=r.value;this._callEventListener(e,o)}}catch(e){t={error:e}}finally{try{r&&!r.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,n=e.minReconnectionDelay,i=void 0===n?DEFAULT.minReconnectionDelay:n,r=e.maxReconnectionDelay,o=void 0===r?DEFAULT.maxReconnectionDelay:r,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,n=void 0===s?DEFAULT.maxRetries:s,i=t.connectionTimeout,r=void 0===i?DEFAULT.connectionTimeout:i,o=t.WebSocket,a=void 0===o?getGlobalWebSocket():o;if(this._retryCount>=n)this._debug("max retries reached",this._retryCount,">=",n);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()}),r))}))}}},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,n,i="main"){super(),this.logger=e,this.config=t,this.wsAddr=s,this.serverVersion=0,this.pingInterval=n||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),n=s.action;if("pong"!==n){if("ver"!==n)return"close"===n?(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 n={action:"reject",to_peer_id:e,reason:t,fatal:s};this._send(n)}_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,n){super(),this.logger=e,this.config=t,this.mainAddr=s,this.backupAddr=n,this.mainWS=this._init(s),this.backupWS=this._init(n,"backup"),this._connected=!1}_init(e,t){if(!e)return null;let s=new websocket_client(this.logger,this.config,e,signal_manager_PING_INTERVAL,t);return s.onopen=()=>{!this._connected&&this.onopen&&(this._connected=!0,this.onopen())},s.onmessage=e=>{this.onmessage&&this.onmessage(e,s.name)},s.onclose=()=>{this._connected&&!this.connected&&this.onclose&&(this._connected=!1,this.onclose())},s.onerror=e=>{this.onerror&&this.onerror(e)},s}sendSignal(e,t,s){if(s){const n=this._getWSByName(s);if(n)return void n.sendSignal(e,t)}this.mainConnected?this.mainWS.sendSignal(e,t):this.backupConnected?this.backupWS.sendSignal(e,t):this.logger.warn("no signal available, send signal failed")}sendReject(e,t,s,n){if(n){const i=this._getWSByName(n);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()}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 n=null,i=!1,r=s;return function(s=!1){if(s)return clearTimeout(n),void(i=!1);i||(i=!0,n=setTimeout((function(){e.call(t,r),i=!1,n=null}),1e3*r),r*=1)}}const utils_getPeersThrottle=getPeersThrottle,MAX_PC_CONNS=25,MAX_MOBILE_CONNS=15,MIN_PEER_SHARE_TIME=30,MAX_TRY_CONNS_TRICKLE=5;class TrackerClient extends(events_default()){constructor(e,t,s,n){super(),this.engine=e,this.logger=e.logger,this.config=n,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.peers=[],this.minConns=5,this.stuns=[],this.requestMorePeers=utils_getPeersThrottle(this._requestMorePeers,this),this.engine.maxConns=this.maxConns=platform_default().isMobile()?MAX_MOBILE_CONNS:MAX_PC_CONNS,this.peersIncrement=0,this.gotPeersFromTracker=!1,this.fuseRate=-1}get totalConns(){return this.scheduler.peersNum+1}resumeP2P(){if(!this.fetcher)return;const{engine:e,config:t,fetcher:s}=this,{btAnnounce:n,btAnnouncePreflight:i}=s;(t.geoIpPreflight?i:n).call(s).then((s=>{if(!this.scheduler)return;e.peerId=this.peerId=s.id,this.minConns=s.min_conns,s.share_only&&this.scheduler.setShareOnly();const n=s.peers;this.scheduler.notifyPeersLoaded(n.length);const i=e.netType;let r,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)r=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}r=t.wsSignalerAddr}this.signalerWs=this._initSignalerWs(s.signal||r,s.signal2||o,s.token,s.token2),0===n.length?this.requestMorePeers():this.peers=this._filterPeers(n),e.emit("peerId",this.peerId);const a=t.getPeerId;a&&"function"==typeof a&&a(this.peerId),s.stun&&s.stun.length>0&&(this.stuns=s.stun),s.debug&&this.logger.enableDebug(),s.fuse_rate&&(this.fuseRate=s.fuse_rate),this.logger.info(`announce request response ${JSON.stringify(s,null,2)}`),e.media&&s.slogan&&appendSlogan(window.atob("U3RyZWFtIGFjY2VsZXJhdGVkIGJ5IENETkJ5ZSBQMlA="),getHomeUrl(),e.media)})).catch((t=>{if("TRACKER_EXPT"===t.code&&e.emit(events.EXCEPTION,t),t.retry){const e=randomNum(3e4,6e4);this.logger.warn(`announce retry after ${e}ms`),this.announceTimer=setTimeout((()=>{this.resumeP2P()}),e)}}))}stopP2P(){this.fetcher.destroy(),this.fetcher=null,this.requestMorePeers(!0),this.scheduler.destroy(),this.scheduler=null,this.signalerWs&&(this.signalerWs.destroy(),this.signalerWs=null),this.peers=[];for(let e of this.DCMap.values())e.destroy(!0);this.DCMap.clear(),this.failedDCSet.clear(),this.logger.warn("tracker stop p2p")}destroy(){this.stopP2P(),this.removeAllListeners(),clearTimeout(this.announceTimer);const{config:e}=this;e.getStats=e.getPeerId=e.getPeersInfo=null,this.logger.warn("destroy tracker")}_filterPeers(e){const t=[],s=[...this.DCMap.keys(),...this.failedDCSet.keys(),this.peerId];return e.filter((e=>!s.includes(e.id))).forEach((e=>{t.push({id:e.id,intermediator:e.intermediator,cpr:e.cpr||void 0})})),t}_tryConnectToAllPeers(){if(0!==this.peers.length&&this.signalerWs.connected)for(this.logger.info(`try connect to ${this.peers.length} peers`);this.peers.length>0;){if(this.DCMap.size>=this.maxConns){this.logger.debug("clear exceeded peers"),this.peers=[];break}let e=this.peers.shift();this.logger.debug(`new DataChannel ${e.id}`);const t=e.intermediator;this._createDatachannel(e.id,!0,t,e.cpr)}}_setupDC(e){e.on(events.DC_SIGNAL,(t=>{const s=e.remotePeerId;if(e.intermediator){const n=this.DCMap.get(e.intermediator);if(n){if(n.sendMsgSignal(s,this.peerId,t))return}}this.signalerWs.sendSignal(s,t,e.signalName)})).on(events.DC_PEER_SIGNAL,(t=>{const s=t.to_peer_id,n=t.from_peer_id,i=t.action;if(s&&n&&i)if(s!==this.peerId){this.logger.info(`relay signal for ${n}`);const r=this.DCMap.get(s);if(r){if("signal"!==i)return void r.sendMsgSignalReject(s,n,t.reason);if(r.sendMsgSignal(s,n,t.data))return}e.sendMsgSignal(n,s)}else"signal"===i?this._handleSignalMsg(n,t,e.remotePeerId):this._handSignalRejected(n,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 n=[];s.forEach((s=>{const i=t-s.timeJoin;s.remotePeerId!==e.remotePeerId&&s.remotePeerId!==this.peerId&&i>MIN_PEER_SHARE_TIME&&n.push({id:s.remotePeerId})})),this.logger.info(`send ${n.length} peers to ${e.remotePeerId}`),e.sendPeers(n)}})).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 n=s.peersNum,i=n>=this.minConns;this.requestMorePeers(i),this.peersIncrement++,this._doSignalFusing(n+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,n){const i=`?id=${this.peerId}&p=web&d=${location.hostname}&v=2.0.3`;let r,o=`${e}${i}`;if(s&&(o=`${o}&token=${s}`),t&&t!==e){let e=`${t}${i}`;n&&(e=`${e}&token=${n}`),r=new signal_manager(this.logger,this.config,o,e)}else r=new websocket_client(this.logger,this.config,o,270);return r.onopen=()=>{this.connected=!0,this.engine.emit("serverConnected",!0),this._tryConnectToAllPeers()},r.onmessage=(e,t)=>{let s=e.action;const n=e.from_peer_id;switch(s){case"signal":this._handleSignalMsg(n,e,null,t);break;case"reject":this._handSignalRejected(n,e);break;default:this.logger.warn(`Signal websocket unknown action ${s}`)}},r.onclose=()=>{this.connected=!1,this.engine.emit("serverConnected",!1)},r.onerror=e=>{e.message&&this.engine.emit(events.EXCEPTION,err_code_default()(e,"SIGNAL_EXPT"))},r}_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,n){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,n,!0);this._handleSignal(e,t.data,s,n)}else{if(!this._destroyAndDeletePeer(e))return;i.info(`signaling ${e} not found`);const{scheduler:t}=this;t.waitForPeer&&(t.waitingPeers--,0===t.waitingPeers&&t.notifyPeersLoaded(0)),this.requestMorePeers(),this.failedDCSet.add(e)}}_handleSignal(e,t,s,n){const i=t.type,{logger:r}=this;let o=this.DCMap.get(e);if(o){if(o.connected)return void r.info("datachannel had connected, signal ignored");if("offer"===i){if(!(this.peerId>e))return void r.warn(`signal type wrong ${i}, ignored`);this._destroyAndDeletePeer(e,!1),r.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 r.warn(t),this._sendSignalReject(e,t,s,n),void this._destroyAndDeletePeer(e,!1)}r.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 r.warn(t),void this._sendSignalReject(e,t,s,n)}{let e=t-this.maxConns+2;for(i.length<e&&(e=i.length);e>0;){const t=i.shift();t&&(r.warn(`close inactive peer ${t.remotePeerId}`),t.close(!1)),e--}}}o=this._createDatachannel(e,!1,s)}n&&(o.signalName=n),o.receiveSignal(t)}_createDatachannel(e,t,s,n){let i=this.config.trickleICE;const r=new peer(this.engine,this.peerId,e,t,this.config,this.sequential,{stuns:this.stuns,intermediator:s,trickle:i});return n&&(r.cpr=n),this.DCMap.set(e,r),this._setupDC(r),r}_sendSignalReject(e,t,s,n,i){if(s){const n=this.DCMap.get(s);if(n&&n.sendMsgSignalReject(e,this.peerId,t,i))return}this.signalerWs.sendReject(e,t,i,n)}_requestMorePeers(e){const{logger:t}=this;t.info(`requestMorePeers after delay ${e}`);const s=this.scheduler.peersNum,n=this.peersIncrement;this.peersIncrement=0,s>=this.minConns||(0===s||n<=3&&!this.gotPeersFromTracker?(this.failedDCSet.size>30&&(this.failedDCSet=new Set([...this.failedDCSet].slice(-30))),this.fetcher.btGetPeers([...this.DCMap.keys(),...this.failedDCSet.keys()]).then((e=>{t.info(`requestMorePeers resp ${JSON.stringify(e,null,2)}`),this.peers=[...this.peers,...this._filterPeers(e.peers)],this._tryConnectToAllPeers()})).catch((e=>{t.error(`requestMorePeers error ${e}`)})),this.gotPeersFromTracker=!0):s<this.maxConns&&(this.scheduler.requestPeers(),this.gotPeersFromTracker=!1))}_destroyAndDeletePeer(e,t=!0){const s=this.DCMap.get(e);return!!s&&(s.destroy(t),this.DCMap.delete(e),!0)}}const tracker_client=TrackerClient;class HlsSwP2pEngine extends Engine{static get name(){return"HlsSwP2pEngine"}static isSeviceWorkerSupported(){return"serviceWorker"in navigator}constructor(e={}){super(e),this.swSupported=window.isSecureContext,this.levels=[],this.currentLevelIndex=0,this.rangeTestUrl="",this.currentSrc="",this.swVersion="",this.media=tryGetVideoElement(this.config.videoElem),HlsSwP2pEngine.isSeviceWorkerSupported()||(this.swSupported=!1,console.warn("service worker is not supported"));const{channelIdMaker:t,signalId:s,browserInfo:n}=this.setup();this.onLevelLoaded=e=>{const{config:i}=this,r=e.live;i.live=r,this.targetDuration=e.averagetargetduration,r||(i.trickleICE=!0),this.browserInfo={...n,live:r,type:"hls_sw"},this.channel=`${t(this.currentSrc)}|${s}[${peer.VERSION}]`,this.setupElectron();const o=this.initLogger();o.info("use HlsSwP2pEngine"),o.info(`engine version: ${engine_base.version} hls-proxy version: ${this.swVersion}`),o.info(`channel ${this.channel}`),r||(i.startSN=e.startSN,i.endSN=e.endSN,o.info(`startSN ${e.startSN} endSN ${e.endSN}`)),this._init(this.channel,this.browserInfo),this.off(hls_de_events.LEVEL_LOADED,this.onLevelLoaded)},this.on(hls_de_events.LEVEL_LOADED,this.onLevelLoaded),this.onManifestParsed=(e,t)=>{this.multiBitrate=e.length>1,this.currentSrc=t,this.off(hls_de_events.MANIFEST_PARSED,this.onManifestParsed)},this.on(hls_de_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_de_events.FRAG_LOADED,this.onFragLoaded)},this.once(hls_de_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 n=e.ports[0];if(n.postMessage({action:t,pong:!0}),!this.p2pEnabled||!s)return n.postMessage({action:t});switch(t){case hls_de_events.SW_PLAYLIST:this.handlePlaylist(s,n);break;case hls_de_events.SW_GET_PLAYLIST:this.handleGetPlaylist(s,n);break;default:this.config.scheduler&&this.config.scheduler.notifySWMessage(t,s,n)}}),this.config.swAutoRegister&&this.registerServiceWorker().then((function(e){})).catch((e=>{console.warn("ServiceWorker registration failed ",e)}))}get currentLevel(){return this.currentLevelIndex}handlePlaylist(e,t){const{config:s,logger:n}=this,{url:i,text:r,ver:o}=e;if(this.swVersion=o,0!==r.indexOf("#EXTM3U"))return console.warn("no EXTM3U delimiter"),t.postMessage({action:hls_de_events.SW_PLAYLIST});t.postMessage({action:hls_de_events.SW_PLAYLIST,data:{active:!0,debug:n&&n.isDebugLevel,sharePlaylist:!!s.sharePlaylist}}),this._parsePlaylist(r,i.split("?")[0])}_parsePlaylist(e,t){const{config:s,logger:n}=this;if(e.indexOf("#EXTINF:")>0||e.indexOf("#EXT-X-TARGETDURATION:")>0){let n=0;const i=M3U8Parser.parseLevelPlaylist(e,t);this.levels.length>0?(n=this.levels.indexOf(i.url),-1===n?(this.restartP2p(),this.currentSrc=t,n=0):this.currentLevelIndex=n):(""!==this.currentSrc&&t!==this.currentSrc&&this.restartP2p(),this.currentSrc=t,this.levels=[t]),this.emit(hls_de_events.LEVEL_LOADED,i);const{fragMap:r}=s.scheduler;s.live&&r.clear(),i.fragments.forEach((e=>{e.level=n;let t=url_toolkit_default().buildAbsoluteURL(e.baseurl,e.relurl,{alwaysNormalize:!0});const s=e.byteRange;2===s.length&&(t=`${t}|bytes=${s[0]}-${s[1]-1}`),r.set(t,e)})),s.sharePlaylist&&s.scheduler&&s.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_de_events.MANIFEST_PARSED,s,t)}}handleGetPlaylist(e,t){const{config:s,logger:n}=this;if(!n)return t.postMessage({action:hls_de_events.SW_GET_PLAYLIST});const{scheduler:i}=s;if(!i)return void n.warn("scheduler not found");const{url:r}=e,o=r.split("?")[0];if(i.playlistInfo.has(o)){const e=i.getPlaylistFromPeer(o);if(e&&e.data){const{data:s,seq:i}=e;return n.info(`got playlist from peer seq ${i}`),t.postMessage({action:hls_de_events.SW_GET_PLAYLIST,data:{text:s}}),void this._parsePlaylist(s,r)}}return t.postMessage({action:hls_de_events.SW_GET_PLAYLIST})}async registerServiceWorker(){const{logger:e,config:t}=this;if(!this.swSupported){let t="sw is not supported";return isHttps||(t="https is required when using ServiceWorker",e.error(t)),Promise.reject(t)}this.media=tryGetVideoElement(this.config.videoElem),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,n)=>{const i=()=>{"activated"===t.state?(t.removeEventListener("statechange",i),s(e)):"redundant"===t.state&&n("sw is redundant")};t.addEventListener("statechange",i)}))}))))}unregisterServiceWorker(){const{config:e}=this,t="serviceWorker is not registered";return new Promise(((s,n)=>{const{serviceWorker:i}=navigator;i||n(t),i.getRegistration(e.swFile).then((e=>{e?e.unregister().then((()=>{s()})).catch((()=>{n(t)})):n(t)}))}))}_init(e,t){if(!this.p2pEnabled)return;this.bufMgr=new segment_cache(this,this.config);let s=new server(this,this.config.token,window.encodeURIComponent(e),this.config.announce||"",t);this.fetcher=s,this.config.fetcher=s;let n=new hls_sw_scheduler(this,this.config);n.bufferManager=this.bufMgr,this.tracker=new tracker_client(this,s,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_de_events.LEVEL_LOADED,this.onLevelLoaded),this.on(hls_de_events.MANIFEST_PARSED,this.onManifestParsed),this.on(hls_de_events.FRAG_LOADED,this.onFragLoaded)}enableP2P(){return this.p2pEnabled?null:(this.logger&&this.logger.info("enable P2P"),this.config.p2pEnabled=this.p2pEnabled=!0,this)}disableP2P(){this.logger&&this.logger.warn("disable P2P"),this.p2pEnabled&&(this.config.p2pEnabled=this.p2pEnabled=!1,this.tracker&&(this.tracker.stopP2P(),this.tracker={},this.fetcher=null,this.bufMgr.destroy(),this.bufMgr=null)),this.levels=[],this.currentLevelIndex=0,this.lastLevel=0,this.multiBitrate=!1,this.rangeTested=!1,this.rangeTestUrl="",this.currentSrc="",this.media=void 0,this.config.live=!1,this.removeAllListeners(hls_de_events.MANIFEST_PARSED)}}const hls_sw_p2pengine=HlsSwP2pEngine;function isBlockType(e,t){const s=url_toolkit_default().parseURL(e),n=s.path.substring(s.path.lastIndexOf(".")+1);return-1!==t.indexOf(n)}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,n,i,r,o;const a=performance.now();s=a-300,n=a-200,i=a,e.trequest=s,e.tfirst=n,e.tload=i,e.loading={first:s,start:n,end:i},r=o=t,e.loaded=r,e.total=o}const frag_loader_MIN_TIME_FOR_LOAD=6.5,frag_loader_MAX_TIME_FOR_WAIT=5.5;class FragLoader extends(events_default()){constructor(e){super(),this.logger=e.logger;const{scheduler:t,fetcher:s,p2pBlackList:n,isHlsV0:i}=window.__p2p_loader__;this.isHlsV0=i,this.bufMgr=e.bufMgr,this.xhrLoader=new e.loader(e),this.p2pEnabled=e.p2pEnabled,this.isLive=e.live,this.scheduler=t,this.fetcher=s,this.segmentId=e.segmentId,this.blockTypes=n,this.forbidden=s.forbidden,this.stats=this.xhrLoader.stats||createLoadStats()}destroy(){this.xhrLoader.destroy()}abort(){this.xhrLoader.abort()}load(e,t,s){const{logger:n,scheduler:i}=this,r=e.frag;this.isHlsV0||(r.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(r.baseurl,r.sn,r.url,t)}if(!r.url||isBlockType(r.url,this.blockTypes))return n.info(`HTTP load blockType ${r.url}`),e.frag.loadByHTTP=!0,this.xhrLoader.load(e,t,s);if(this.forbidden)return;t.maxRetry=2;const a=i.getBufferedDuration();if(this.p2pEnabled&&this.bufMgr.hasSegOfId(o)){n.info(`bufMgr found seg sn ${r.sn} segId ${o}`);let t=this.bufMgr.getSegById(o);const i=copyBuffer(t.data);let a=new Uint8Array(i).buffer,l={url:e.url,data:a};updateLoadStats(this.stats,t.size),r.loaded=t.size,r.loadByP2P=!0,e.frag.fromPeerId=t.fromPeerId,queue_microtask_default()((()=>{!this.isHlsV0&&s.onProgress&&s.onProgress(this.stats,e,l.data),s.onSuccess(l,this.stats,e)}))}else if(this.p2pEnabled&&i.hasAndSetTargetPeer(r.sn,r.level,a))this.loadFragByP2p(e,t,s,o);else if(n.info(`fragLoader load ${o} at ${r.sn} level ${r.level} buffered ${a}`),this.isLive&&i.hasIdlePeers&&a>frag_loader_MIN_TIME_FOR_LOAD&&i.shouldWaitForNextSeg()){let l=a-frag_loader_MIN_TIME_FOR_LOAD;l>frag_loader_MAX_TIME_FOR_WAIT&&(l=frag_loader_MAX_TIME_FOR_WAIT);const h=n=>{o===n&&(i.off(hls_de_events.SCH_DCHAVE,h),clearTimeout(this.waitTimer),i.hasAndSetTargetPeer(r.sn,r.level,a)?this.loadFragByP2p(e,t,s,o):this.loadFragByHttp(e,t,s,o))};n.info(`wait peer have for ${l}s`),i.on(hls_de_events.SCH_DCHAVE,h),this.waitTimer=setTimeout((()=>{i.notifyAllPeers(r.sn,r.level,o),this.loadFragByHttp(e,t,s,o),i.off(hls_de_events.SCH_DCHAVE,h)}),1e3*l)}else this.loadFragByHttp(e,t,s,o)}loadFragByHttp(e,t,s,n){this.scheduler.isReceiver=!1;const{logger:i}=this,r=e.frag;if(this.isHlsV0){const e=s.onSuccess;s.onSuccess=(t,s,o)=>{if(!this.bufMgr.hasSegOfId(n)){const e=copyBuffer(t.data),s=new core_segment(r.sn,n,e,this.fetcher.peerId,r.level);this.bufMgr.putSeg(s)}this.fetcher.reportFlow(s.total);let a=s.tload-s.trequest;i.info(`HTTP loaded ${n} time ${a}ms`),e(t,s,o)}}else if(s.onProgress){const e=s.onProgress;s.onProgress=(t,s,o)=>{if(!this.bufMgr.hasSegOfId(n)){const e=copyBuffer(o),t=new core_segment(r.sn,n,e,this.fetcher.peerId,r.level);this.bufMgr.putSeg(t)}this.fetcher.reportFlow(t.total),r.loaded=t.total;let a=t.loading.end-t.loading.start;i.info(`HTTP loaded ${n} time ${a}ms`),e(t,s,o)}}e.frag.loadByHTTP=!0,this.xhrLoader.load(e,t,s)}loadFragByP2p(e,t,s,n){const{logger:i}=this,r=e.frag;this.scheduler.load(e,t,s);const o=s.onSuccess,a=s.onTimeout;s.onTimeout=(e,l)=>{i.warn(`P2P timeout switched to HTTP load ${r.relurl} at ${r.sn}`),s.onSuccess=o,this.loadFragByHttp(l,t,s,n),s.onTimeout=a},s.onSuccess=(e,t,a)=>{if(!this.bufMgr.hasSegOfId(n)){const t=copyBuffer(e.data),s=new core_segment(r.sn,n,t,r.fromPeerId||this.fetcher.peerId,r.level);this.bufMgr.putSeg(s)}r.loadByP2P||this.fetcher.reportFlow(t.total),r.loaded=t.loaded,i.info(`${r.loadByP2P?"P2P":"HTTP"} loaded segment id ${n}`),!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:n}=this,{url:i}=e,r=i.split("?")[0],o=s.onSuccess;if(s.onSuccess=(e,t,s)=>{this.scheduler.broadcastPlaylist(r,e.data),o(e,t,s)},this.scheduler.playlistInfo.has(r)){const t=this.scheduler.getPlaylistFromPeer(r);if(t&&t.data){const{data:r,seq:o}=t;n.info(`got playlist from peer seq ${o}`),updateLoadStats(this.stats,r.length);let a={url:i,data:r};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.isHlsV0=t.isHlsV0}loadRemainBufferByHttp(e,t,s){const{url:n}=this.context.frag;let i=utils_buffer.l.concat(e.bufArr);super.reportDCTraffic(t,s,i.byteLength,0);let r="bytes=";if(this.context.rangeEnd){const e=Number(this.context.rangeStart),t=Number(this.context.rangeEnd);r=`${r}${e+i.byteLength}-${t-1}`}else r=`${r}${i.byteLength}-`;this.logger.info(`continue download from ${n} range: ${r}`),fetch(n,{headers:{Range:r}}).then((e=>e.arrayBuffer())).then((t=>{let s=utils_buffer.l.from(t);this.engine.fetcher.reportFlow(s.byteLength);let n=utils_buffer.l.concat([i,s]),r=new Uint8Array(n).buffer,o=this.stats;o.tfirst=o.loading.first=Math.max(o.trequest,performance.now()),o.tload=o.loading.end=o.tfirst,o.loaded=o.total=n.byteLength;const a=this.context.frag;a.fromPeerId=e.remotePeerId,a.loadByP2P=!0,this.callbacks.onSuccess({data:r},o,this.context)})).catch((e=>{this.logger.error(`http partial download error ${e}`),this.callbacks.onTimeout(this.stats,this.context,null)}))}_handlePieceAborted(e){this.criticalSeg&&this.criticalSeg.targetPeers.includes(e)?1===this.criticalSeg.targetPeers.length?(clearTimeout(this.criticaltimeouter),this.criticaltimeout(),this.cleanRequestingMap(e)):this.criticalSeg.targetPeers=this.criticalSeg.targetPeers.filter((t=>t!==e)):this.cleanRequestingMap(e)}criticaltimeout(e=!1){const{logger:t,config:s}=this;if(!this.criticalSeg)return;const n=this.criticalSeg.sn,i=this.criticalSeg.level;let r;t.info(`critical request sn ${n} timeout`),this.requestingMap.has(n,i)&&(r=this.getPeerLoadedMore(n,i));let o=!1;if(r&&(o=!r.loadtimeout()),o)return void t.info("p2p download completed");const a=1e3*s.httpLoadTime-500;if(e&&r&&r.shouldWaitForRemain(a))return t.info(`wait for peer load remain of ${n}`),void(this.criticaltimeouter=setTimeout(this.criticaltimeout.bind(this),a+200));s.httpRangeSupported&&r&&r.bufArr.length>0&&r.segId===this.criticalSeg.segId?this.loadRemainBufferByHttp(r,n,i):this.callbacks.onTimeout(this.stats,this.context,null),this.requestingMap.delete(n,i),s.live&&r&&r.resetContinuousHits(),this.criticalSeg=null,this.criticaltimeouter=null}updatePlaySN(e){this.currPlaySN=e}load(e,t,s){this.isReceiver=!0;const{logger:n,config:i}=this;this.context=e;const r=e.frag,{segId:o,sn:a,level:l}=r;this.callbacks=s,this.stats=createLoadStats(),this.criticalSeg={sn:a,level:l,segId:o},this.targetPeers.length>0?this.criticalSeg.targetPeers=[...this.targetPeers.map((e=>e.remotePeerId))]:this.criticalSeg.targetPeers=[...this.requestingMap.getAllPeerIds(a,l)];let h=this.mBufferedDuration-i.httpLoadTime;if(h>this.dcDownloadTimeout&&(h=this.dcDownloadTimeout),this.requestingMap.has(a,l))n.info(`wait for criticalSeg segId ${o} at ${a} timeout ${h}`);else for(let e of this.targetPeers)e.downloading||(n.info(`request criticalSeg segId ${o} at ${a} from ${e.remotePeerId} timeout ${h}`),e.requestDataById(o,a,!0,{level:l})),this.requestingMap.set(a,l,e.remotePeerId);this.criticaltimeouter=setTimeout(this.criticaltimeout.bind(this,!0),1e3*h),this.targetPeers=[]}destroy(){super.destroy(),this.logger.warn("destroy HlsjsScheduler")}_setupDC(e){super._setupDC(e);const{logger:t,config:s}=this;e.on(hls_de_events.DC_HAVE,(e=>{queue_microtask_default()((()=>{s.live&&!this.criticalSeg&&this.checkPeers()}))})).on(hls_de_events.DC_PIECE,(e=>{this.criticalSeg&&this.criticalSeg.segId===e.seg_id&&(this.stats.tfirst=Math.max(performance.now(),this.stats.trequest))})).on(hls_de_events.DC_PIECE_NOT_FOUND,(s=>{const{sn:n}=s;this.criticalSeg&&this.criticalSeg.sn===n&&(1===this.criticalSeg.targetPeers.length?(clearTimeout(this.criticaltimeouter),t.info(`DC_PIECE_NOT_FOUND ${n}`),this.criticalSeg=null,this.callbacks.onTimeout(this.stats,this.context,null)):this.criticalSeg.targetPeers=this.criticalSeg.targetPeers.filter((t=>t!==e.remotePeerId)))})).on(hls_de_events.DC_RESPONSE,((s,n)=>{const{config:i}=this,{segId:r,sn:o,data:a,level:l}=s,h=this.criticalSeg&&this.criticalSeg.segId===r;if(i.validateSegment(r,a))if(this.notifyAllPeers(o,l,r),super.reportDCTraffic(o,l,s.size,n),h){t.info(`receive criticalSeg seg_id ${r}`),clearTimeout(this.criticaltimeouter),this.criticaltimeouter=null,e.miss=0;let s=this.stats;s.tfirst=s.loading.first=Math.max(s.trequest,performance.now()),s.tload=s.loading.end=s.tfirst,s.loaded=s.total=a.byteLength,this.criticalSeg=null;const{frag:n}=this.context;n.fromPeerId=e.remotePeerId,n.loadByP2P=!0,this.callbacks.onSuccess({data:a,url:this.context.url},s,this.context)}else{if(this.bitset.has(o,l))return;const t=new core_segment(o,r,a,e.remotePeerId,l);this.bufMgr.putSeg(t),this.updateLoaded(o,l)}else t.warn(`segment ${r} validate failed`),h&&(clearTimeout(this.criticaltimeouter),this.criticaltimeout());this.requestingMap.delete(o,l),i.live&&!this.criticalSeg&&this.checkPeers()}))}_setupEngine(){this.engine.on(hls_de_events.FRAG_LOADING,(({sn:e,segId:t,byHttp:s,level:n})=>{this.loadingSN=e,this.loadingSegId=t,this.isHlsV0&&s&&this.notifyAllPeers(e,n,t)})).on(hls_de_events.FRAG_LOADED,(({sn:e,segId:t,byP2p:s,level:n})=>{this.isHlsV0||s||this.notifyAllPeers(e,n,t),this.updateLoaded(e,n)})).on(hls_de_events.FRAG_CHANGED,(({sn:e})=>{this.updatePlaySN(e)}))}}const hlsjs_scheduler=HlsjsScheduler;class HlsjsP2pEngine extends Engine{static get name(){return"HlsjsP2pEngine"}constructor(e,t={}){super(t),this.hlsjs=e,this.HLSEvents=e.constructor.Events,this.config.isHlsV0="0"===e.constructor.version.split(".")[0];const{channelIdMaker:s,signalId:n,browserInfo:i}=this.setup();e.config.segmentId=this.config.segmentId;const r=(t,o)=>{const{config:a}=this,l=o.details,h=l.live;a.live=this.hlsjs.config.live=h,h||(a.trickleICE=!0),this.browserInfo={...i,live:h,type:"hls"},this.channel=`${s(e.url)}|${n}[${peer.VERSION}]`,this.setupElectron();const c=this.initLogger();c.info("use HlsjsP2pEngine"),this.logger=this.hlsjs.config.logger=c,c.info(`channel ${this.channel}`),h||(a.startSN=l.startSN,a.endSN=l.endSN,c.info(`startSN ${l.startSN} endSN ${l.endSN}`)),this.eventListened=!1,this._init(this.channel,this.browserInfo),e.off(this.HLSEvents.LEVEL_LOADED,r)};e.on(this.HLSEvents.LEVEL_LOADED,r);const o=(t,s)=>{const n=s.levels.length;this.multiBitrate=n>1,e.off(this.HLSEvents.MANIFEST_PARSED,o)};e.on(this.HLSEvents.MANIFEST_PARSED,o)}_init(e,t){if(!this.p2pEnabled)return;this.hlsjs.config.p2pEnabled=this.p2pEnabled,this.hlsjs.config.sharePlaylist=this.config.sharePlaylist,this.bufMgr=new segment_cache(this,this.config),this.hlsjs.config.bufMgr=this.bufMgr,this.media=this.hlsjs.media;let s=new server(this,this.config.token,encodeURIComponent(e),this.config.announce||"",t);this.fetcher=s;const n=new hlsjs_scheduler(this,this.config);this.tracker=new tracker_client(this,s,n,this.config),n.bufferManager=this.bufMgr,this.hlsjs.config.fLoader=frag_loader,this.config.sharePlaylist&&(this.hlsjs.config.pLoader=playlist_loader),window.__p2p_loader__={scheduler:this.tracker.scheduler,fetcher:s,p2pBlackList:this.config.p2pBlackList,isHlsV0:this.config.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||!this.config.p2pEnabled||(this.tracker.resumeP2P(),this.trackerTried=!0)}_onFragLoading(e,t){const s=t.frag;let{sn:n,level:i,segId:r}=s;if(!isBlockType(s.url,this.config.p2pBlackList)){if(this.logger.debug("loading frag "+n),!r){let e;s._byteRange&&(e="bytes="+s._byteRange[0]+"-"+s._byteRange[1]);let n=s.url;r=t.frag.segId=this.config.segmentId(s.baseurl,s.sn,n,e)}this.emit(hls_de_events.FRAG_LOADING,{sn:n,segId:r,byHttp:s.loadByHTTP,level:i})}}_onFragLoaded(e,t){const{sn:s,segId:n,loaded:i,duration:r,level:o,fromPeerId:a,loadByP2P:l,url:h}=t.frag,{config:c,logger:d}=this;isBlockType(t.frag.url,c.p2pBlackList)||(this.emit(hls_de_events.FRAG_LOADED,{url:h,sn:s,level:o,segId:n,loaded:i,duration:r,byP2p:!!l,fromPeerId:a}),!this.rangeTested&&c.useHttpRange&&(performRangeRequest(t.frag.url).then((()=>{c.httpRangeSupported=!0,d.info("http range is supported"),c.httpLoadTime-=1.5,c.httpLoadTime<1.5&&(c.httpLoadTime=1.5),c.simultaneousTargetPeers=1})).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_de_events.FRAG_CHANGED,{sn:e,duration:s})}}_onHlsError(e,t){const{logger:s}=this;t.fatal?s.error(`${t.type} details ${t.details} reason ${t.reason}`):s.warn(`${t.type} details ${t.details} reason ${t.reason}`);const n=this.hlsjs.constructor.ErrorDetails;switch(t.details){case n.BUFFER_STALLED_ERROR:this.fetcher&&this.fetcher.errsBufStalled++;break;case n.INTERNAL_EXCEPTION:this.fetcher&&(this.fetcher.errsInternalExpt++,this.fetcher.exptMsg=t.err.message),s.error(`INTERNAL_EXCEPTION event ${t.event} err ${t.err.message}`),this.emit(hls_de_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"'),n=!t||t.prototype&&"function"==typeof t.prototype.appendBuffer&&"function"==typeof t.prototype.remove;return!!s&&!!n}let commonConfig={wsMaxRetries:10,p2pEnabled:!0,wifiOnly:!1,memoryCacheLimit:{pc:838860800,mobile:524288e3},dcDownloadTimeout:25,logLevel:"error",tag:"",webRTCConfig:{},token:void 0,appName:void 0,appId:void 0,prefetchNum:5,showSlogan:!0,trickleICE:!1,simultaneousTargetPeers:2,announceLocation:"cn",geoIpPreflight:!0,validateSegment:function(e,t){return!0},getStats:function(e,t,s){},getPeerId:function(e){},getPeersInfo:function(e){}};const config=commonConfig;let defaultP2PConfig={...config,httpLoadTime:2,sharePlaylist:!1,useHttpRange:!0,hlsjsInstance:null,proxyOnly:!1,p2pBlackList:["aac","mp3","vtt","webvtt","key"],live:!0,swFile:"./sw.js",swScope:"./",swAutoRegister:!0};const hls_de_config=defaultP2PConfig;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_de_events}static isSupported(){return engine_base.isSupported()&&(isMSESupported()||hls_sw_p2pengine.isSeviceWorkerSupported())}static isSeviceWorkerSupported(){return hls_sw_p2pengine.isSeviceWorkerSupported()}static isMSESupported(){return isMSESupported()}static getBrowser(){return platform_default().getBrowser()}static get HlsSwP2pEngine(){return hls_sw_p2pengine}static get HlsjsP2pEngine(){return hlsjs_p2pengine}constructor(e={}){const{hlsjsInstance:t}=e;delete e.hlsjsInstance;const s=Object.assign({},hls_de_config,e);if(window.__swP2pEngineHlsActive)return console.warn("P2pEngineHls is already activated"),void(this._realEngine=new shadow_p2pengine(s));"1"!==getQueryParam("_ios")&&!s.proxyOnly&&t&&isMSESupported()?this._realEngine=new hlsjs_p2pengine(t,s):this._realEngine=new hls_sw_p2pengine(s)}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(){"function"==typeof this._realEngine.registerServiceWorker&&this._realEngine.registerServiceWorker()}unregisterServiceWorker(){"function"==typeof this._realEngine.unregisterServiceWorker&&this._realEngine.unregisterServiceWorker()}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,n=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 r(){r.init.call(this)}e.exports=r,e.exports.once=function(e,t){return new Promise((function(s,n){function i(s){e.removeListener(t,r),n(s)}function r(){"function"==typeof e.removeListener&&e.removeListener("error",i),s([].slice.call(arguments))}_(e,t,r,{once:!0}),"error"!==t&&function(e,t,s){"function"==typeof e.on&&_(e,"error",t,s)}(e,i,{once:!0})}))},r.EventEmitter=r,r.prototype._events=void 0,r.prototype._eventsCount=0,r.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 l(e){return void 0===e._maxListeners?r.defaultMaxListeners:e._maxListeners}function h(e,t,s,n){var i,r,o,h;if(a(s),void 0===(r=e._events)?(r=e._events=Object.create(null),e._eventsCount=0):(void 0!==r.newListener&&(e.emit("newListener",t,s.listener?s.listener:s),r=e._events),o=r[t]),void 0===o)o=r[t]=s,++e._eventsCount;else if("function"==typeof o?o=r[t]=n?[s,o]:[o,s]:n?o.unshift(s):o.push(s),(i=l(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,h=c,console&&console.warn&&console.warn(h)}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 n={fired:!1,wrapFn:void 0,target:e,type:t,listener:s},i=c.bind(n);return i.listener=s,n.wrapFn=i,i}function u(e,t,s){var n=e._events;if(void 0===n)return[];var i=n[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),n=0;n<t;++n)s[n]=e[n];return s}function _(e,t,s,n){if("function"==typeof e.on)n.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(r){n.once&&e.removeEventListener(t,i),s(r)}))}}Object.defineProperty(r,"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}}),r.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},r.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},r.prototype.getMaxListeners=function(){return l(this)},r.prototype.emit=function(e){for(var t=[],s=1;s<arguments.length;s++)t.push(arguments[s]);var i="error"===e,r=this._events;if(void 0!==r)i=i&&void 0===r.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 l=r[e];if(void 0===l)return!1;if("function"==typeof l)n(l,this,t);else{var h=l.length,c=f(l,h);for(s=0;s<h;++s)n(c[s],this,t)}return!0},r.prototype.addListener=function(e,t){return h(this,e,t,!1)},r.prototype.on=r.prototype.addListener,r.prototype.prependListener=function(e,t){return h(this,e,t,!0)},r.prototype.once=function(e,t){return a(t),this.on(e,d(this,e,t)),this},r.prototype.prependOnceListener=function(e,t){return a(t),this.prependListener(e,d(this,e,t)),this},r.prototype.removeListener=function(e,t){var s,n,i,r,o;if(a(t),void 0===(n=this._events))return this;if(void 0===(s=n[e]))return this;if(s===t||s.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete n[e],n.removeListener&&this.emit("removeListener",e,s.listener||t));else if("function"!=typeof s){for(i=-1,r=s.length-1;r>=0;r--)if(s[r]===t||s[r].listener===t){o=s[r].listener,i=r;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&&(n[e]=s[0]),void 0!==n.removeListener&&this.emit("removeListener",e,o||t)}return this},r.prototype.off=r.prototype.removeListener,r.prototype.removeAllListeners=function(e){var t,s,n;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,r=Object.keys(s);for(n=0;n<r.length;++n)"removeListener"!==(i=r[n])&&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(n=t.length-1;n>=0;n--)this.removeListener(e,t[n]);return this},r.prototype.listeners=function(e){return u(this,e,!0)},r.prototype.rawListeners=function(e){return u(this,e,!1)},r.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):g.call(e,t)},r.prototype.listenerCount=g,r.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}},622:function(e){var t,s,n,i,r;t=/^(?=((?:[a-zA-Z0-9+\-.]+:)?))\1(?=((?:\/\/[^\/?#]*)?))\2(?=((?:(?:[^?#\/]*\/)*[^;?#\/]*)?))\3((?:;[^?#]*)?)(\?[^#]*)?(#[^]*)?$/,s=/^(?=([^\/?#]*))\1([^]*)$/,n=/(?:\/|^)\.(?=\/)/g,i=/(?:\/|^)\.\.\/(?!\.\.\/)[^\/]*(?=\/)/g,r={buildAbsoluteURL:function(e,t,n){if(n=n||{},e=e.trim(),!(t=t.trim())){if(!n.alwaysNormalize)return e;var i=r.parseURL(e);if(!i)throw new Error("Error trying to parse base URL.");return i.path=r.normalizePath(i.path),r.buildURLFromParts(i)}var o=r.parseURL(t);if(!o)throw new Error("Error trying to parse relative URL.");if(o.scheme)return n.alwaysNormalize?(o.path=r.normalizePath(o.path),r.buildURLFromParts(o)):t;var a=r.parseURL(e);if(!a)throw new Error("Error trying to parse base URL.");if(!a.netLoc&&a.path&&"/"!==a.path[0]){var l=s.exec(a.path);a.netLoc=l[1],a.path=l[2]}a.netLoc&&!a.path&&(a.path="/");var h={scheme:a.scheme,netLoc:o.netLoc,path:null,params:o.params,query:o.query,fragment:o.fragment};if(!o.netLoc&&(h.netLoc=a.netLoc,"/"!==o.path[0]))if(o.path){var c=a.path,d=c.substring(0,c.lastIndexOf("/")+1)+o.path;h.path=r.normalizePath(d)}else h.path=a.path,o.params||(h.params=a.params,o.query||(h.query=a.query));return null===h.path&&(h.path=n.alwaysNormalize?r.normalizePath(o.path):o.path),r.buildURLFromParts(h)},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(n,"");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=r},47:(e,t)=>{"use strict";t.l=i;var s=2147483647;function n(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 r(e,t,s)}function r(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),r=n(s),o=r.write(e,t);o!==s&&(r=r.slice(0,o));return r}(e,t);if(ArrayBuffer.isView(e))return l(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(u(e,ArrayBuffer)||e&&u(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 n;n=void 0===t&&void 0===s?new Uint8Array(e):void 0===s?new Uint8Array(e,t):new Uint8Array(e,t,s);return n.__proto__=i.prototype,n}(e,t,s);if("number"==typeof e)throw new TypeError('The "value" argument must not be of type number. Received type number');var r=e.valueOf&&e.valueOf();if(null!=r&&r!==e)return i.from(r,t,s);var o=function(e){if(i.isBuffer(e)){var t=0|h(e.length),s=n(t);return 0===s.length||e.copy(s,0,0,t),s}if(void 0!==e.length)return"number"!=typeof e.length||function(e){return e!=e}(e.length)?n(0):l(e);if("Buffer"===e.type&&Array.isArray(e.data))return l(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),n(e<0?0:0|h(e))}function l(e){for(var t=e.length<0?0:0|h(e.length),s=n(t),i=0;i<t;i+=1)s[i]=255&e[i];return s}function h(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)||u(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,n=arguments.length>2&&!0===arguments[2];if(!n&&0===s)return 0;for(var r=!1;;)switch(t){case"ascii":case"latin1":case"binary":return s;case"utf8":case"utf-8":return d(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*s;case"hex":return s>>>1;default:if(r)return n?-1:d(e).length;t=(""+t).toLowerCase(),r=!0}}function d(e,t){var s;t=t||1/0;for(var n=e.length,i=null,r=[],o=0;o<n;++o){if((s=e.charCodeAt(o))>55295&&s<57344){if(!i){if(s>56319){(t-=3)>-1&&r.push(239,191,189);continue}if(o+1===n){(t-=3)>-1&&r.push(239,191,189);continue}i=s;continue}if(s<56320){(t-=3)>-1&&r.push(239,191,189),i=s;continue}s=65536+(i-55296<<10|s-56320)}else i&&(t-=3)>-1&&r.push(239,191,189);if(i=null,s<128){if((t-=1)<0)break;r.push(s)}else if(s<2048){if((t-=2)<0)break;r.push(s>>6|192,63&s|128)}else if(s<65536){if((t-=3)<0)break;r.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;r.push(s>>18|240,s>>12&63|128,s>>6&63|128,63&s|128)}}return r}function u(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}"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 r(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?n(e):void 0!==t?"string"==typeof s?n(e).fill(t,s):n(e).fill(t):n(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 n=i.allocUnsafe(t),r=0;for(s=0;s<e.length;++s){var o=e[s];if(u(o,Uint8Array)&&(o=i.from(o)),!i.isBuffer(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(n,r),r+=o.length}return n},i.byteLength=c,i.prototype._isBuffer=!0,i.prototype.copy=function(e,t,s,n){if(!i.isBuffer(e))throw new TypeError("argument should be a Buffer");if(s||(s=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&n<s&&(n=s),n===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(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-t<n-s&&(n=e.length-t+s);var r=n-s;if(this===e&&"function"==typeof Uint8Array.prototype.copyWithin)this.copyWithin(t,s,n);else if(this===e&&s<t&&t<n)for(var o=r-1;o>=0;--o)e[o+t]=this[o+s];else Uint8Array.prototype.set.call(e,this.subarray(s,n),t);return r}},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,n){if(!e||"string"==typeof e)throw new TypeError("Please pass an Error to err-code");n||(n={}),"object"==typeof s&&(n=s,s=void 0),null!=s&&(n.code=s);try{return t(e,n)}catch(s){n.message=e.message,n.stack=e.stack;const i=function(){};return i.prototype=Object.create(Object.getPrototypeOf(e)),t(new i,n)}}},848:function(e,t,s){var n;!function(i){"use strict";function r(e,t){var s=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(s>>16)<<16|65535&s}function o(e,t,s,n,i,o){return r((a=r(r(t,e),r(n,o)))<<(l=i)|a>>>32-l,s);var a,l}function a(e,t,s,n,i,r,a){return o(t&s|~t&n,e,t,i,r,a)}function l(e,t,s,n,i,r,a){return o(t&n|s&~n,e,t,i,r,a)}function h(e,t,s,n,i,r,a){return o(t^s^n,e,t,i,r,a)}function c(e,t,s,n,i,r,a){return o(s^(t|~n),e,t,i,r,a)}function d(e,t){var s,n,i,o,d;e[t>>5]|=128<<t%32,e[14+(t+64>>>9<<4)]=t;var u=1732584193,g=-271733879,f=-1732584194,_=271733878;for(s=0;s<e.length;s+=16)n=u,i=g,o=f,d=_,u=a(u,g,f,_,e[s],7,-680876936),_=a(_,u,g,f,e[s+1],12,-389564586),f=a(f,_,u,g,e[s+2],17,606105819),g=a(g,f,_,u,e[s+3],22,-1044525330),u=a(u,g,f,_,e[s+4],7,-176418897),_=a(_,u,g,f,e[s+5],12,1200080426),f=a(f,_,u,g,e[s+6],17,-1473231341),g=a(g,f,_,u,e[s+7],22,-45705983),u=a(u,g,f,_,e[s+8],7,1770035416),_=a(_,u,g,f,e[s+9],12,-1958414417),f=a(f,_,u,g,e[s+10],17,-42063),g=a(g,f,_,u,e[s+11],22,-1990404162),u=a(u,g,f,_,e[s+12],7,1804603682),_=a(_,u,g,f,e[s+13],12,-40341101),f=a(f,_,u,g,e[s+14],17,-1502002290),u=l(u,g=a(g,f,_,u,e[s+15],22,1236535329),f,_,e[s+1],5,-165796510),_=l(_,u,g,f,e[s+6],9,-1069501632),f=l(f,_,u,g,e[s+11],14,643717713),g=l(g,f,_,u,e[s],20,-373897302),u=l(u,g,f,_,e[s+5],5,-701558691),_=l(_,u,g,f,e[s+10],9,38016083),f=l(f,_,u,g,e[s+15],14,-660478335),g=l(g,f,_,u,e[s+4],20,-405537848),u=l(u,g,f,_,e[s+9],5,568446438),_=l(_,u,g,f,e[s+14],9,-1019803690),f=l(f,_,u,g,e[s+3],14,-187363961),g=l(g,f,_,u,e[s+8],20,1163531501),u=l(u,g,f,_,e[s+13],5,-1444681467),_=l(_,u,g,f,e[s+2],9,-51403784),f=l(f,_,u,g,e[s+7],14,1735328473),u=h(u,g=l(g,f,_,u,e[s+12],20,-1926607734),f,_,e[s+5],4,-378558),_=h(_,u,g,f,e[s+8],11,-2022574463),f=h(f,_,u,g,e[s+11],16,1839030562),g=h(g,f,_,u,e[s+14],23,-35309556),u=h(u,g,f,_,e[s+1],4,-1530992060),_=h(_,u,g,f,e[s+4],11,1272893353),f=h(f,_,u,g,e[s+7],16,-155497632),g=h(g,f,_,u,e[s+10],23,-1094730640),u=h(u,g,f,_,e[s+13],4,681279174),_=h(_,u,g,f,e[s],11,-358537222),f=h(f,_,u,g,e[s+3],16,-722521979),g=h(g,f,_,u,e[s+6],23,76029189),u=h(u,g,f,_,e[s+9],4,-640364487),_=h(_,u,g,f,e[s+12],11,-421815835),f=h(f,_,u,g,e[s+15],16,530742520),u=c(u,g=h(g,f,_,u,e[s+2],23,-995338651),f,_,e[s],6,-198630844),_=c(_,u,g,f,e[s+7],10,1126891415),f=c(f,_,u,g,e[s+14],15,-1416354905),g=c(g,f,_,u,e[s+5],21,-57434055),u=c(u,g,f,_,e[s+12],6,1700485571),_=c(_,u,g,f,e[s+3],10,-1894986606),f=c(f,_,u,g,e[s+10],15,-1051523),g=c(g,f,_,u,e[s+1],21,-2054922799),u=c(u,g,f,_,e[s+8],6,1873313359),_=c(_,u,g,f,e[s+15],10,-30611744),f=c(f,_,u,g,e[s+6],15,-1560198380),g=c(g,f,_,u,e[s+13],21,1309151649),u=c(u,g,f,_,e[s+4],6,-145523070),_=c(_,u,g,f,e[s+11],10,-1120210379),f=c(f,_,u,g,e[s+2],15,718787259),g=c(g,f,_,u,e[s+9],21,-343485551),u=r(u,n),g=r(g,i),f=r(f,o),_=r(_,d);return[u,g,f,_]}function u(e){var t,s="",n=32*e.length;for(t=0;t<n;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 n=8*e.length;for(t=0;t<n;t+=8)s[t>>5]|=(255&e.charCodeAt(t/8))<<t%32;return s}function f(e){var t,s,n="0123456789abcdef",i="";for(s=0;s<e.length;s+=1)t=e.charCodeAt(s),i+=n.charAt(t>>>4&15)+n.charAt(15&t);return i}function _(e){return unescape(encodeURIComponent(e))}function p(e){return function(e){return u(d(g(e),8*e.length))}(_(e))}function m(e,t){return function(e,t){var s,n,i=g(e),r=[],o=[];for(r[15]=o[15]=void 0,i.length>16&&(i=d(i,8*e.length)),s=0;s<16;s+=1)r[s]=909522486^i[s],o[s]=1549556828^i[s];return n=d(r.concat(g(t)),512+8*t.length),u(d(o.concat(n),640))}(_(e),_(t))}function v(e,t,s){return t?s?m(t,e):f(m(t,e)):s?p(e):f(p(e))}void 0===(n=function(){return v}.call(t,s,t,e))||(e.exports=n)}()},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(n())||[,""])[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(n())},isPC:function(){return!r(i("os "))&&!r(i("android[/ ]"))},isIOS:function(){return r(i("os "))},isAndroid:function(){return r(i("android[/ ]"))},isIOSSafari:function(){return this.isIOS()&&this.isSafari()},isElectron:function(){return/electron/i.test(n())},isMobile:function(){return s.isAndroid()||s.isIOS()},isSafari:function(){return/^((?!chrome|android).)*safari/i.test(n())},isFirefox:function(){return/firefox/i.test(n())},isChrome:function(){return/chrome/i.test(n())},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 n(){return navigator.userAgent.toLowerCase()}function i(e){return""+(new RegExp(e+"(\\d+((\\.|_)\\d+)*)").exec(n())||[,0])[1]||void 0}function r(e){return parseFloat((e||"").replace(/\_/g,"."))||0}e.exports=s},77:e=>{let t;e.exports="function"==typeof queueMicrotask?queueMicrotask.bind(globalThis):e=>(t||(t=Promise.resolve())).then(e).catch((e=>setTimeout((()=>{throw e}),0)))}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var s=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e].call(s.exports,s,s.exports,__webpack_require__),s.exports}__webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(e,t)=>{for(var s in t)__webpack_require__.o(t,s)&&!__webpack_require__.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var __webpack_exports__={};return(()=>{"use strict";__webpack_require__.d(__webpack_exports__,{default:()=>index_engine});const events={DC_SIGNAL:"SIGNAL",DC_OPEN:"OPEN",DC_REQUEST:"REQUEST",DC_PIECE_NOT_FOUND:"PIECE_NOT_FOUND",DC_PIECE_ABORT:"PIECE_ABORT",DC_CLOSE:"CLOSE",DC_RESPONSE:"RESPONSE",DC_ERROR:"ERROR",DC_PIECE:"PIECE",DC_PIECE_DATA:"PIECE_DATA",DC_TIMEOUT:"TIMEOUT",DC_PIECE_ACK:"PIECE_ACK",DC_METADATA:"METADATA",DC_PLAT_ANDROID:"ANDROID",DC_PLAT_IOS:"IOS",DC_PLAT_WEB:"WEB",DC_CHOKE:"CHOKE",DC_UNCHOKE:"UNCHOKE",DC_HAVE:"HAVE",DC_HAVE_REVERSE:"HAVE_REVERSE",DC_LOST:"LOST",DC_GET_PEERS:"GET_PEERS",DC_PEERS:"PEERS",DC_STATS:"STATS",DC_PEER_SIGNAL:"PEER_SIGNAL",DC_PLAYLIST:"PLAYLIST",BM_LOST:"lost",BM_ADDED_SEG_:"BM_ADDED_SEG_",BM_ADDED_SN_:"BM_ADDED_SN_",BM_SEG_ADDED:"BM_SEG_ADDED",FRAG_CHANGED:"FRAG_CHANGED",FRAG_LOADED:"FRAG_LOADED",FRAG_LOADING:"FRAG_LOADING",RESTART_P2P:"RESTART_P2P",EXCEPTION:"exception"},hls_next_events={...events,SCH_DCHAVE:"SCH_DCHAVE",SW_PLAYLIST:"SW_PLAYLIST",SW_GET_PLAYLIST:"SW_GET_PLAYLIST",SW_MEDIA:"SW_MEDIA",SW_GET_MEDIA:"SW_GET_MEDIA",LEVEL_LOADED:"LEVEL_LOADED",MANIFEST_PARSED:"MANIFEST_PARSED",FRAG_LOADED:"FRAG_LOADED",SYN_OUTPUT:"SYN_OUTPUT",SYN_ERROR:"SYN_ERROR",SYN_PARTIAL:"SYN_PARTIAL"};var _events_3_3_0_events_events=__webpack_require__(204),events_default=__webpack_require__.n(_events_3_3_0_events_events),utils_buffer=__webpack_require__(47);const 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 n=new RegExp("([?&])"+t+"=.*?(&|$)","i"),i=-1!==e.indexOf("?")?"&":"?";return e.match(n)?e.replace(n,"$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:.33*e+.67}function performRangeRequest(e,t,s){const n=new XMLHttpRequest;return new Promise(((i,r)=>{n.open("GET",e,!0),n.responseType="arraybuffer",n.timeout=3500,n.onreadystatechange=e=>{4===n.readyState&&(206===n.status?i(n.response):r())},n.onerror=e=>{r()},n.ontimeout=e=>{r()},n.setRequestHeader("Range",t||"bytes=0-0"),s&&s(n,e),n.send()}))}function navLang(){return"zh-CN"===(navigator.language||navigator.userLanguage)?"cn":"en"}function dontWaitFor(e){e.then((()=>{}))}function timeout(e){return new Promise((t=>setTimeout(t,e)))}function getBrowserRTC(){if("undefined"==typeof window)return null;var e={RTCPeerConnection:window.RTCPeerConnection||window.mozRTCPeerConnection||window.webkitRTCPeerConnection,RTCSessionDescription:window.RTCSessionDescription||window.mozRTCSessionDescription||window.webkitRTCSessionDescription,RTCIceCandidate:window.RTCIceCandidate||window.mozRTCIceCandidate||window.webkitRTCIceCandidate};return e.RTCPeerConnection?e:null}function copyBuffer(e){const t=utils_buffer.l.from(e),s=new utils_buffer.l(e.byteLength);return t.copy(s),s}function getMaxSequence(e){const t=e.split("\n");let s=0;let n=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")&&n++;return s+n-1}function isHttps(){return location.protocol.startsWith("https")}function isInteger(e){return"number"==typeof e&&e%1==0}function appendSlogan(e,t,s){var n=document.createElement("div");n.style.position="absolute",n.style.top="8px",n.style.left="8px",n.style.zIndex="999",n.style.fontSize="10px";var i=document.createElement("a");i.href=t,i.target="_blank",i.innerText=e,i.style.color="white",i.style.textDecoration="none",i.style.textShadow="0 0 5px white,0 0 10px #00FFFF,0 0 15px #7FFF00,0 0 20px white";var r=document.createElement("i");r.style.width="5px",r.style.height="5px",r.style.borderRadius="50%",r.style.display="inline-block",r.style.backgroundColor="#67C23A",r.style.marginBottom="2px",r.style.marginRight="4px",n.appendChild(r),n.appendChild(i);var o=s.parentNode;o&&o.insertBefore(n,s)}function getHomeUrl(){return window.atob("aHR0cHM6Ly9zd2FybWNsb3VkLm5ldC9lbi8=")}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),queue_microtask=__webpack_require__(77),queue_microtask_default=__webpack_require__.n(queue_microtask);const MAX_BUFFERED_AMOUNT=65536,ICECOMPLETE_TIMEOUT=5e3,CHANNEL_CLOSING_TIMEOUT=5e3;function filterTrickle(e){return e.replace(/a=ice-options:trickle\s\n/g,"")}function warn(e){console.warn(e)}class Peer extends(events_default()){constructor(e){super(),this.channelName=e.initiator?e.channelName:null,this.initiator=e.initiator||!1,this.channelConfig=e.channelConfig||Peer.channelConfig,this.channelNegotiated=this.channelConfig.negotiated,this.config=Object.assign({},Peer.config,e.config),this.offerOptions=e.offerOptions||{},this.answerOptions=e.answerOptions||{},this.sdpTransform=e.sdpTransform||(e=>e),this.trickle=void 0===e.trickle||e.trickle,this.allowHalfTrickle=void 0!==e.allowHalfTrickle&&e.allowHalfTrickle,this.iceCompleteTimeout=e.iceCompleteTimeout||ICECOMPLETE_TIMEOUT,this.destroyed=!1,this.destroying=!1,this._connected=!1,this.remoteAddress=void 0,this.remoteFamily=void 0,this.remotePort=void 0,this.localAddress=void 0,this.localFamily=void 0,this.localPort=void 0,this._wrtc=e.wrtc&&"object"==typeof e.wrtc?e.wrtc:getBrowserRTC(),this._pcReady=!1,this._channelReady=!1,this._iceComplete=!1,this._iceCompleteTimer=null,this._channel=null,this._pendingCandidates=[],this._isNegotiating=!1,this._firstNegotiation=!0,this._batchedNegotiation=!1,this._queuedNegotiation=!1,this._sendersAwaitingStable=[],this._senderMap=new Map,this._closingInterval=null,this._remoteTracks=[],this._remoteStreams=[],this._chunk=null,this._cb=null,this._interval=null;try{this._pc=new this._wrtc.RTCPeerConnection(this.config)}catch(e){return void queue_microtask_default()((()=>this.destroy(e)))}this._isReactNativeWebrtc="number"==typeof this._pc._peerConnectionId,this._pc.oniceconnectionstatechange=()=>{this._onIceStateChange()},this._pc.onicegatheringstatechange=()=>{this._onIceStateChange()},this._pc.onconnectionstatechange=()=>{this._onConnectionStateChange()},this._pc.onsignalingstatechange=()=>{this._onSignalingStateChange()},this._pc.onicecandidate=e=>{this._onIceCandidate(e)},this.initiator||this.channelNegotiated?this._setupData({channel:this._pc.createDataChannel(this.channelName,this.channelConfig)}):this._pc.ondatachannel=e=>{this._setupData(e)},this._needsNegotiation()}get bufferSize(){return this._channel&&this._channel.bufferedAmount||0}get connected(){return this._connected&&"open"===this._channel.readyState}signal(e){if(this.destroyed)throw new Error("cannot signal after peer is destroyed");if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e={}}e.renegotiate&&this.initiator&&this._needsNegotiation(),e.transceiverRequest&&this.initiator&&this.addTransceiver(e.transceiverRequest.kind,e.transceiverRequest.init),e.candidate&&(this._pc.remoteDescription&&this._pc.remoteDescription.type?this._addIceCandidate(e.candidate):this._pendingCandidates.push(e.candidate)),e.sdp&&this._pc.setRemoteDescription(new this._wrtc.RTCSessionDescription(e)).then((()=>{this.destroyed||(this._pendingCandidates.forEach((e=>{this._addIceCandidate(e)})),this._pendingCandidates=[],"offer"===this._pc.remoteDescription.type&&this._createAnswer())})).catch((e=>{this.destroy(e)})),e.sdp||e.candidate||e.renegotiate||e.transceiverRequest||this.destroy(new Error("signal() called with invalid signal data"))}_addIceCandidate(e){const t=new this._wrtc.RTCIceCandidate(e);this._pc.addIceCandidate(t).catch((e=>{!t.address||t.address.endsWith(".local")?warn("Ignoring unsupported ICE candidate."):this.destroy(e)}))}send(e){this._channel.send(e)}addTransceiver(e,t){if(this.initiator)try{this._pc.addTransceiver(e,t),this._needsNegotiation()}catch(e){this.destroy(e)}else this.emit("signal",{type:"transceiverRequest",transceiverRequest:{kind:e,init:t}})}_needsNegotiation(){this._batchedNegotiation||(this._batchedNegotiation=!0,queue_microtask_default()((()=>{this._batchedNegotiation=!1,!this.initiator&&this._firstNegotiation||this.negotiate(),this._firstNegotiation=!1})))}negotiate(){this.initiator?this._isNegotiating?this._queuedNegotiation=!0:setTimeout((()=>{this._createOffer()}),0):this._isNegotiating?this._queuedNegotiation=!0:this.emit("signal",{type:"renegotiate",renegotiate:!0}),this._isNegotiating=!0}destroy(e){this._destroy(e,(()=>{}))}_destroy(e,t){this.destroyed||this.destroying||(this.destroying=!0,queue_microtask_default()((()=>{if(this.destroyed=!0,this.destroying=!1,this._connected=!1,this._pcReady=!1,this._channelReady=!1,this._remoteTracks=null,this._remoteStreams=null,this._senderMap=null,clearInterval(this._closingInterval),this._closingInterval=null,clearInterval(this._interval),this._interval=null,this._chunk=null,this._cb=null,this._channel){try{this._channel.close()}catch(e){}this._channel.onmessage=null,this._channel.onopen=null,this._channel.onclose=null,this._channel.onerror=null}if(this._pc){try{this._pc.close()}catch(e){}this._pc.oniceconnectionstatechange=null,this._pc.onicegatheringstatechange=null,this._pc.onsignalingstatechange=null,this._pc.onicecandidate=null,this._pc.ontrack=null,this._pc.ondatachannel=null}this._pc=null,this._channel=null,e&&this.emit("error",e),this.emit("close")})))}_setupData(e){if(!e.channel)return this.destroy(new Error("Data channel event is missing `channel` property"));this._channel=e.channel,this._channel.binaryType="arraybuffer","number"==typeof this._channel.bufferedAmountLowThreshold&&(this._channel.bufferedAmountLowThreshold=MAX_BUFFERED_AMOUNT),this.channelName=this._channel.label,this._channel.onmessage=e=>{this._onChannelMessage(e)},this._channel.onbufferedamountlow=()=>{this._onChannelBufferedAmountLow()},this._channel.onopen=()=>{this._onChannelOpen()},this._channel.onclose=()=>{this._onChannelClose()},this._channel.onerror=e=>{this.destroy(e)};let t=!1;this._closingInterval=setInterval((()=>{this._channel&&"closing"===this._channel.readyState?(t&&this._onChannelClose(),t=!0):t=!1}),CHANNEL_CLOSING_TIMEOUT)}_startIceCompleteTimeout(){this.destroyed||this._iceCompleteTimer||(this._iceCompleteTimer=setTimeout((()=>{this._iceComplete||(this._iceComplete=!0,this.emit("iceTimeout"),this.emit("_iceComplete"))}),this.iceCompleteTimeout))}_createOffer(){this.destroyed||this._pc.createOffer(this.offerOptions).then((e=>{if(this.destroyed)return;this.trickle||this.allowHalfTrickle||(e.sdp=filterTrickle(e.sdp)),e.sdp=this.sdpTransform(e.sdp);const t=()=>{if(this.destroyed)return;const t=this._pc.localDescription||e;this.emit("signal",{type:t.type,sdp:t.sdp})};this._pc.setLocalDescription(e).then((()=>{this.destroyed||(this.trickle||this._iceComplete?t():this.once("_iceComplete",t))})).catch((e=>{this.destroy(e)}))})).catch((e=>{this.destroy(e)}))}_requestMissingTransceivers(){this._pc.getTransceivers&&this._pc.getTransceivers().forEach((e=>{e.mid||!e.sender.track||e.requested||(e.requested=!0,this.addTransceiver(e.sender.track.kind))}))}_createAnswer(){this.destroyed||this._pc.createAnswer(this.answerOptions).then((e=>{if(this.destroyed)return;this.trickle||this.allowHalfTrickle||(e.sdp=filterTrickle(e.sdp)),e.sdp=this.sdpTransform(e.sdp);const t=()=>{if(this.destroyed)return;const t=this._pc.localDescription||e;this.emit("signal",{type:t.type,sdp:t.sdp}),this.initiator||this._requestMissingTransceivers()};this._pc.setLocalDescription(e).then((()=>{this.destroyed||(this.trickle||this._iceComplete?t():this.once("_iceComplete",t))})).catch((e=>{this.destroy(e)}))})).catch((e=>{this.destroy(e)}))}_onConnectionStateChange(){this.destroyed||"failed"===this._pc.connectionState&&this.destroy(new Error("Connection failed."))}_onIceStateChange(){if(this.destroyed)return;const e=this._pc.iceConnectionState,t=this._pc.iceGatheringState;this.emit("iceStateChange",e,t),"connected"!==e&&"completed"!==e||(this._pcReady=!0,this._maybeReady()),"failed"===e&&this.destroy(new Error("Ice connection failed.")),"closed"===e&&this.destroy(new Error("Ice connection closed."))}getStats(e){const t=e=>("[object Array]"===Object.prototype.toString.call(e.values)&&e.values.forEach((t=>{Object.assign(e,t)})),e);0===this._pc.getStats.length||this._isReactNativeWebrtc?this._pc.getStats().then((s=>{const n=[];s.forEach((e=>{n.push(t(e))})),e(null,n)}),(t=>e(t))):this._pc.getStats.length>0?this._pc.getStats((s=>{if(this.destroyed)return;const n=[];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,n.push(t(s))})),e(null,n)}),(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 n={},i={},r={};let o=!1;s.forEach((e=>{"remotecandidate"!==e.type&&"remote-candidate"!==e.type||(n[e.id]=e),"localcandidate"!==e.type&&"local-candidate"!==e.type||(i[e.id]=e),"candidatepair"!==e.type&&"candidate-pair"!==e.type||(r[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=n[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(r[e.selectedCandidatePairId]),("googCandidatePair"===e.type&&"true"===e.googActiveConnection||("candidatepair"===e.type||"candidate-pair"===e.type)&&e.selected)&&a(e)})),o||Object.keys(r).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,core_segment=class{constructor(e,t,s,n,i=0){this._sn=e,this._segId=t,this._data=s,this._fromPeerId=n,this._level=i}get size(){return this._data.byteLength}get sn(){return this._sn}get segId(){return this._segId}get data(){return this._data}get fromPeerId(){return this._fromPeerId}get level(){return this._level||0}get isSequential(){return this._sn>=0}};var utils_platform=__webpack_require__(422),platform_default=__webpack_require__.n(utils_platform);const delimiter="|",arrayDelimiter=",",candTypeMap={h:"host",s:"srflx",p:"prflx",r:"relay"},sdpType2Char=(e,t)=>{let s;switch(e){case"candidate":s="c";break;case"offer":s=t?"q":"o";break;case"answer":s=t?"s":"a"}return s},char2SdpType=e=>{let t={};switch(e){case"o":t={type:"offer"};break;case"q":t={type:"offer",trickle:!0};break;case"a":t={type:"answer"};break;case"s":t={type:"answer",trickle:!0};break;case"c":t={type:"candidate",trickle:!0}}return t},charOffset=0,bytesToStr=e=>"number"==typeof e?bytesToStr([e]):String.fromCharCode(...e.map((e=>e+charOffset))),strToBytes=e=>e.split("").map((e=>e.charCodeAt(0)-charOffset));function parseCand(e){const[,t,s,n,i,r,o,a,l,h,c,d,u,g,f]=/(\S*) (\d*) (\S*) (\d*) (\S*) (\d*) typ (\S*)(?: raddr (\S*) rport (\d*))?(?: tcptype (\S*))?(?: generation (\d*))?(?: ufrag (\S*))?(?: network-id (\d*))?(?: network-cost (\d*))?/.exec(e);return{foundation:t,component:s,transport:n,priority:i,ip:r,port:o,type:a,raddr:l,rport:h,tcptype:c,generation:d,networkId:g,networkCost:f,ufrag:u}}function pack({type:e,sdp:t,candidate:s}){return t&&t.startsWith("v=0")?packSdp(e,t):"candidate"===e&&s?packCandidate(s.candidate):null}function packCandidate(e){const t=e.indexOf(":");if(t<=0)return null;let s=packCandItem(e.slice(t+1).trim());return s?sdpType2Char("candidate")+s.cand:null}function packSdp(e,t){let s,n,i,r=[],o=!1,a=!1;for(const e of t.split("\r\n")){const t=e.indexOf(":");if(t<=0)continue;if("a=ice-options:trickle"===e){a=!0;continue}const[l,h]=[e.slice(0,t),e.slice(t+1).trim()];switch(l){case"a=ice-ufrag":s=h;break;case"a=ice-pwd":n=h;break;case"a=fingerprint":i=bytesToStr(h.substr("sha-256".length).trim().split(":").map((e=>parseInt(e,16))));break;case"a=candidate":let e=packCandItem(h,o);if(!e)continue;if(e.local){if(o)continue;o=!0}r.push(e.cand)}}return sdpType2Char(e,a)+i+(r.length>0?r.join(arrayDelimiter):"")+(a?"":delimiter)+s+delimiter+n}function packCandItem(e){let t=!1;const s=parseCand(e);if("TCP"===s.transport)return null;s.ip.endsWith(".local")&&(t=!0);let n=s.type.charAt(0);const i=s.ip.split(".");if(4===i.length){const e=i.reduce((function(e,t){return(e<<8)+parseInt(t,10)}));n=`${n}${s.foundation} ${e}:${parseInt(s.port)}`}else n=`${n}${s.foundation} ${s.ip} ${s.port}`;return{cand:n,local:t}}function unpack(e,t){const s=char2SdpType(e.substr(0,1));return s?"candidate"===s.type?unpackCand(e):unpackSdp(s.type,t,e,s.trickle):null}function unpackCand(e){let t=unpackCandItem(e.substr(1),100);return t?{type:"candidate",candidate:{candidate:`candidate:${t}`,sdpMLineIndex:0,sdpMid:"0"}}:null}function unpackSdp(e,t,s,n){const i=strToBytes(s.slice(1,33)).map((e=>("0"+e.toString(16)).slice(-2))),r=s.substr(33);let o,a,l;n?[a,l]=r.split(delimiter):[o,a,l]=r.split(delimiter);const h=n?[]:o.split(arrayDelimiter),c=["v=0",`o=- ${t} 2 IN IP4 127.0.0.1`,"s=-","t=0 0","a=group:BUNDLE 0","a=msid-semantic: WMS","m=application 9 UDP/DTLS/SCTP webrtc-datachannel","c=IN IP4 0.0.0.0","a=mid:0","a=sctp-port:5000","a=setup:"+("answer"===e?"active":"actpass"),`a=ice-ufrag:${a}`,`a=ice-pwd:${l}`,`a=fingerprint:sha-256 ${i.join(":").toUpperCase()}`];n&&c.push("a=ice-options:trickle");let d=100;for(const e of h){let t=unpackCandItem(e,d);t&&(d--,c.push(`a=candidate:${t}`))}return{type:e,sdp:c.join("\r\n")+"\r\n"}}function unpackCandItem(e,t){let s,n,i;const r=candTypeMap[e.substr(0,1)],o=e.substr(1).split(" ");if(2===o.length){i=o[0];const e=o[1].split(":");s=[e[0]>>24&255,e[0]>>16&255,e[0]>>8&255,255&e[0]].join("."),n=e[1]}else[i,s,n]=o;return`${[i,1,"udp",t,s,n,"typ",r].join(" ")}`}const DC_TOLERANCE=2,DEFAULT_PACKET_SIZE=64e3,ALPHA=.6,SIGNAL_PACK_VER=1;class peer_Peer extends(events_default()){static get VERSION(){return"8"}constructor(e,t,s,n,i,r,o={}){super(),this.engine=e,this.channel=e.fetcher.channelId,this.logger=e.logger,this.config=i,this.isInitiator=n,this.options=o,this.typeExpected=r,this.remotePeerId=s,this.intermediator=o.intermediator||null,this.channelId=n?`${t}-${s}`:`${s}-${t}`,this.cpr=0,this.platform="unknown",this.mobile=!1,this.mobileWeb=!1,this.connected=!1,this.msgQueue=[],this.miss=0,this.notifySet=new Set,this.bufArr=[],this.packetSize=DEFAULT_PACKET_SIZE,this.connTimeout=setTimeout((()=>{this.logger.warn(`dc ${this.channelId} connection timeout`),this.emit(events.DC_ERROR,!0)}),25e3),this.sendReqQueue=[],this.downloading=!1,this.uploading=!1,this.choked=!1,this.downloadListeners=[],this.pieceMsg={},this.timeSendRequest=0,this.timeReceivePiece=0,this.timeSendPiece=0,this.weight=0,this.peersConnected=1,this.timeJoin=getCurrentTs(),this.uploadSpeed=0,this.gotPeers=!1,this.currentLevel=0;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:n,channelName:this.channelId,trickle:o.trickle||!1,config:a}),this._init(this._datachannel),this.dataExchangeTs=this.timeJoin,this.gotStatsTs=this.timeJoin,this.startSN=Number.MAX_SAFE_INTEGER,this.endSN=-1}get isAvailable(){return this.downloadNum<2&&!this.choked}get isAvailableUrgently(){return!this.downloading&&!this.choked}addDownloadListener(e){this.downloadListeners.push({handler:e})}_init(e){e.on("error",(e=>{this.emit(events.DC_ERROR,!0)})),e.on("signal",(e=>{if(this.cpr===SIGNAL_PACK_VER){const t=pack(e);t?e=t:this.logger.error("signal pack error")}this.emit(events.DC_SIGNAL,e)}));e.once("connect",(()=>{for(this.logger.info(`datachannel CONNECTED to ${this.remotePeerId} from ${this.intermediator?"peer":"server"}`),this.connected=!0,clearTimeout(this.connTimeout),this.emit(events.DC_OPEN);this.msgQueue.length>0;){let e=this.msgQueue.shift();this.emit(e.event,e)}})),e.on("data",(e=>{const{logger:t}=this;if("string"==typeof e){let s=JSON.parse(e);if(!this.connected)return void this.msgQueue.push(s);let n,i=s.event;switch(n=i!==events.DC_PLAYLIST&&i!==events.DC_PEER_SIGNAL?`string: ${e}`:`event: ${i}`,t.debug(`datachannel receive ${n} 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_NOT_FOUND:this._sendNextReq()||(this.downloading=!1),this.emit(s.event,s);break;case events.DC_REQUEST:this._handleRequestMsg(s);break;case events.DC_PIECE_ACK:this.dataExchangeTs=getCurrentTs(),this._handlePieceAck(s),this.emit(s.event,s);break;case events.DC_STATS:this._handleStats(s);break;case events.DC_PLAYLIST:this.config.sharePlaylist&&this._handlePlaylist(s);break;case events.DC_METADATA:this._handleMetadata(s);break;case events.DC_PIECE_ABORT:if(this.downloading){if(this.downloadListeners.length>0){for(let e of this.downloadListeners){const{handler:t}=e;t(this.bufSN,this.segId,!0,"aborted by upstream peer")}this.downloadListeners=[]}this.emit(events.DC_PIECE_ABORT,s)}break;case events.DC_CHOKE:t.info(`choke peer ${this.remotePeerId}`),this.choked=!0;break;case events.DC_UNCHOKE:t.info(`unchoke peer ${this.remotePeerId}`),this.choked=!1;break;case events.DC_CLOSE:this.emit(s.event,s.fatal||!1);break;default:this.emit(s.event,s)}}else{if(!this.downloading)return void t.error(`peer is not downloading, data size ${e.byteLength} pieceMsg ${JSON.stringify(this.pieceMsg)}`);this._handleBinaryMsg(e)}})),e.once("close",(()=>{this.emit(events.DC_CLOSE,!1)})),e.on("iceStateChange",((e,t)=>{"disconnected"===e&&(this.logger.warn(`${this.remotePeerId} disconnected`),this.connected=!1)}))}sendJson(e){e.event!==events.DC_PLAYLIST&&e.event!==events.DC_PEER_SIGNAL?this.logger.debug(`dc bufferSize ${this._datachannel.bufferSize} send ${JSON.stringify(e)} to ${this.remotePeerId}`):this.logger.debug(`dc send event ${e.event} to ${this.remotePeerId}`);const t=JSON.stringify(e);return t.length>DEFAULT_PACKET_SIZE?(this.logger.error("string to send is too large"),!1):this.send(t)}send(e){if(this._datachannel&&this._datachannel.connected)try{return this._datachannel.send(e),!0}catch(e){this.logger.warn(`datachannel ${this.channelId} send data failed, close it`),this.emit(events.DC_ERROR,!1)}return!1}sendMsgHave(e,t,s={}){const n=s.reverse||void 0;delete s.reverse,this.sendJson({event:n?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,s=0){const n={event:events.DC_STATS,total_conns:e,children:t,level:s};this.sendJson(n)}sendMsgPlaylist(e,t,s){if(this.playlistMap.has(e)){if(this.playlistMap.get(e).seq>=s)return}const n={event:events.DC_PLAYLIST,url:e,data:t,seq:s};this.sendJson(n)}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,n=!1){return this.sendJson({event:events.DC_PEER_SIGNAL,action:"reject",to_peer_id:e,from_peer_id:t,reason:s,fatal:n})}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.1.4",sequential:t,peers:s})}sendPartialBuffer(e,t,s={}){this.sendMsgPiece(e,s);for(let e=0;e<t.length;e++)this.send(t[e])}sendMsgPiece(e,t={}){e.ext||(e.ext={}),e.ext.from&&t.from&&(t.from=`${e.ext.from}->${t.from}`),t.incompletes&&e.ext.incompletes&&(t.incompletes+=e.ext.incompletes),t=Object.assign({},e.ext,t);const s={...e,ext:t};this.sendJson(s)}sendBuffer(e,t,s,n={}){const i=n.reverse||void 0;delete n.reverse;let r=s.byteLength,o=0,a=0;r%this.packetSize==0?a=r/this.packetSize:(a=Math.floor(r/this.packetSize)+1,o=r%this.packetSize);let l={event:events.DC_PIECE,attachments:a,seg_id:t,sn:e,level:n.level,size:r,reverse:i};delete n.level,this.sendMsgPiece(l,n);const h=dividePayload(s,this.packetSize,a,o);this._sendBufferArray(h,i),this.uploading=!1,this.timeSendPiece=performance.now()}get downloadNum(){return this.downloading?this.sendReqQueue.length+1:0}requestDataById(e,t,s=!1,n={}){const i={event:events.DC_REQUEST,seg_id:e,sn:t,...n,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 n={event:events.DC_REQUEST,sn:e,...s,urgent:t};this.downloading?(this.logger.info(`add req ${e} in queue`),t?this.sendReqQueue.unshift(n):this.sendReqQueue.push(n)):this._realRequestData(n)}_sendBufferArray(e,t=!1){if(t)for(let t=e.length-1;t>=0;t--)this.send(e[t]);else for(let t=0;t<e.length;t++)this.send(e[t])}_realRequestData(e){this.sendJson(e),this.timeSendRequest=performance.now(),this.downloading=!0}shouldWaitForRemain(e){if(0===this.bufArr.length)return!1;if(0===this.timeReceivePiece)return!1;let t=0;for(let e=0;e<this.bufArr.length;e++)t+=this.bufArr[e].byteLength;return t/(performance.now()-this.timeReceivePiece)>=(this.expectedSize-t)/e}close(e){this.emit(events.DC_CLOSE,e)}receiveSignal(e){e.type||e.candidate||(this.cpr=SIGNAL_PACK_VER,e=unpack(e,this.cpr+"")),e&&this._datachannel.signal(e)}destroy(e=!0){if(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.downloadListeners.length>0){for(let e of this.downloadListeners){const{handler:t}=e;t(this.bufSN,this.segId,!0,"upstream peer is closed")}this.downloadListeners=[]}let t={event:events.DC_CLOSE,fatal:e};this.sendJson(t),this._datachannel.removeAllListeners(),this.removeAllListeners(),this._datachannel.destroy(),this.engine=null}_handleBinaryMsg(e){this.bufArr.push(e),this.remainAttachments--;const t=!!this.pieceMsg.reverse;let s;if(s=t?this.remainAttachments+1:this.pieceMsg.attachments-this.remainAttachments,this.emit(events.DC_PIECE_DATA,this.bufSN,this.segId,e,s,0===this.remainAttachments,this.pieceMsg),this.downloadListeners.length>0)for(let t of this.downloadListeners){const{handler:s}=t;s(this.bufSN,this.segId,!1,e,0===this.remainAttachments)}if(0===this.remainAttachments){if(this.downloadListeners=[],this.timeSendRequest>0){const e=this.expectedSize/(performance.now()-this.timeSendRequest);this.weight=this.weight>0?ALPHA*this.weight+(1-ALPHA)*e:e}this.sendJson({event:events.DC_PIECE_ACK,sn:this.bufSN,seg_id:this.segId,level:this.pieceMsg.level,size:this.expectedSize,miss:this.miss||void 0}),this.timeSendRequest=0,this.timeReceivePiece=0,this._sendNextReq()||(this.downloading=!1),this._handleBinaryData(t)}}_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:n}=e;this.playlistMap.set(t,{data:s,seq:n})}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)}_handleRequestMsg(e){this.uploading?this.logger.warn(`${this.remotePeerId} is uploading when receive request`):(this.uploading=!0,this.emit(events.DC_REQUEST,e))}_handlePieceAck(e){0!==this.timeSendPiece&&(this.uploadSpeed=Math.round(e.size/(performance.now()-this.timeSendPiece)*2),this.timeSendPiece=0,this.logger.info(`${this.remotePeerId} uploadSpeed is ${this.uploadSpeed}`)),e.miss>0&&this.logger.warn(`peer ${this.remotePeerId} miss ${e.miss}`)}_prepareForBinary(e,t,s,n){this.bufArr=[],this.remainAttachments=e,this.segId=t,this.bufSN=s,this.expectedSize=n}_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=new Uint8Array(t).buffer;const s=new core_segment(this.bufSN,this.segId,e,this.remotePeerId,this.pieceMsg.level);this.emit(events.DC_RESPONSE,s,this.weight)}else this.logger.error(`${this.segId} expectedSize ${this.expectedSize} not equal to byteLength ${s}`)}this.segId="",this.bufArr=[],this.expectedSize=-1}checkIfNeedChoke(){const{logger:e}=this;if(this.miss++,e.info(`${this.remotePeerId} miss ${this.miss}`),this.miss>DC_TOLERANCE&&!this.choked){this.choked=!0;const t=30*this.miss;t<=150?(e.warn(`datachannel ${this.channelId} is choked`),this.chokeTimer=setTimeout((()=>{this.choked=!1,e.warn(`datachannel ${this.channelId} is unchoked`)}),1e3*t)):e.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`),t.length>0&&t.length===s.attachments?(this._handleBinaryData(),!1):(this.emit(events.DC_TIMEOUT),this.checkIfNeedChoke(),!0)}sendMsgPieceAbort(e){this.uploading=!1,this.sendJson({event:events.DC_PIECE_ABORT,reason:e})}}function dividePayload(e,t,s,n){let i=[];if(n){let r;for(let n=0;n<s-1;n++)r=e.slice(n*t,(n+1)*t),i.push(r);r=e.slice(e.byteLength-n,e.byteLength),i.push(r)}else{let n;for(let r=0;r<s;r++)n=e.slice(r*t,(r+1)*t),i.push(n)}return i}const peer=peer_Peer,players={DPlayer:"dplayer",CBPlayer:"cbplayer",jwplayer:"jwplayer",videojs:"videojs",Clappr:"clappr",ckplayer:"ckplayer",MediaElementPlayer:"mediaelement",MediaElement:"mediaelement",TcPlayer:"tcplayer",flowplayer:"flowplayer",Chimee:"chimee",ChimeePlayer:"chimee",HlsJsPlayer:"xgplayer",fluidPlayer:"fluidplayer",OpenPlayer:"openplayer",Plyr:"plyr",Playerjs:"playerjs",Aliplayer:"aliplayer",shaka:"shakaplayer"};function player_detector(){let e;for(let t in players)if(window[t]){e=players[t];break}return e}const SAM={_:"nllL",f:"d3NzJ",ss:"==",3:"TNBLy9z",8:"aWduY",u:"mNvbQ",qa:"WwuY2RuY"};class EngineBase extends(events_default()){constructor(e={}){if(super(),this.p2pEnabled=!(!1===e.p2pEnabled||"0"===getQueryParam("_p2p")),e.tag&&e.tag.length>20)throw new Error("Tag is too long");if(e.appName&&e.appName.length>30)throw new Error("appName is too long");if(e.appId&&e.appId.length>30)throw new Error("appId is too long");if(e.token&&e.token.length>20)throw new Error("Token is too long")}initLogger(){const{config:e}=this;e.showSlogan&&"en"===navLang()&&console.log(`%cEmpower your users to become the unlimitedly scalable CDN!\n%c${getHomeUrl()}`,"color: dodgerblue; padding:20px 0; font-size: x-large","font-size: medium; padding-bottom:15px");const t=new utils_logger(e.logLevel);return e.logger=this.logger=t,t}makeChannelId(e,t){if(!e||"string"!=typeof e){const e="token is required while using customized channelId!";throw console.error(e),new Error(e)}return(s,n)=>`${e}-${t(s,n)}`}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 n;"object"!=typeof t.wsSignalerAddr||t.wsSignalerAddr.backup?"string"==typeof t.wsSignalerAddr&&(n=t.wsSignalerAddr):n=t.wsSignalerAddr.main,n===s&&(n=void 0),n&&(e=url_toolkit_default().parseURL(n).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.1.4",EngineBase.protocolVersion=peer.VERSION;const engine_base=EngineBase;function tryGetVideoElement(e){if(e){if("string"==typeof e)return document.querySelector(e);if("[object HTMLVideoElement]"===Object.prototype.toString.call(e))return e}return document.getElementsByTagName("video")[0]}function calRangeWithDoubleBuffer(e,t,s,n=0,i=0){let r="bytes=";return r=t?0===i?`${r}${n}-${s-1-t.byteLength}`:`${r}${n}-${i-t.byteLength}`:0===i?`${r}${n}-`:`${r}${n}-${i}`,r}let commonConfig={wsMaxRetries:10,p2pEnabled:!0,wifiOnly:!1,memoryCacheLimit:{pc:838860800,mobile:524288e3},dcDownloadTimeout:25,logLevel:"error",tag:"",webRTCConfig:{},token:void 0,appName:void 0,appId:void 0,prefetchNum:5,showSlogan:!0,trickleICE:!1,simultaneousTargetPeers:2,announceLocation:"cn",geoIpPreflight:!0,validateSegment:function(e,t){return!0},getStats:function(e,t,s){},getPeerId:function(e){},getPeersInfo:function(e){}};const config=commonConfig;let defaultP2PConfig={...config,httpLoadTime:2,sharePlaylist:!1,useHttpRange:!0,hlsjsInstance:null,proxyOnly:!1,p2pBlackList:["aac","mp3","vtt","webvtt","key"],live:!0,swFile:"./sw.js",swScope:"./",swAutoRegister:!0};const hls_next_config=defaultP2PConfig;class Engine extends engine_base{constructor(e={}){super(e),window.__swP2pEngineHlsActive=!0,this.config=Object.assign({},hls_next_config,e),this.rangeTested=!1,this.lastLevel=0,this.multiBitrate=!1}setup(){let{token:e,channelId:t,segmentId:s}=this.config,n=e=>{const t=url_toolkit_default().parseURL(e);return`${t.netLoc.substr(2)+t.path.substring(0,t.path.lastIndexOf("."))}`},i=(e,t,s,n)=>`${e}-${t}`;t&&"function"==typeof t&&(n=this.makeChannelId(e,t)),s||(this.config.segmentId=i);return{channelIdMaker:n,signalId:this.makeSignalId(),browserInfo:{...this.commonBrowserInfo,tag:this.config.tag||void 0}}}setupElectron(){this.browserInfo.device===utils_platform.device.PC_NATIVE&&(this.browserInfo={...this.browserInfo,app:this.config.appName,bundle:this.config.appId})}getExtraForStats(){const e={};return!this.config.live&&this.media&&(e.pos=Math.round(this.media.currentTime)),this.multiBitrate&&this.currentLevel!==this.lastLevel&&(e.level=this.currentLevel+"",this.lastLevel=this.currentLevel),e}getExtraForPeersRequest(){const e={};return this.multiBitrate&&(e.level=this.currentLevel+""),e}destroy(){window.__swP2pEngineHlsActive=!1,super.destroy()}}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],n='"';0===e.indexOf(n)&&e.lastIndexOf(n)===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 n=0;n<e.length;n++){const i=e[n];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,n=[];function i(e,t){["video","audio"].forEach((s=>{const n=e.filter((e=>isCodecType(e,s)));if(n.length){const i=n.filter((e=>0===e.lastIndexOf("avc1",0)||0===e.lastIndexOf("mp4a",0)));t[`${s}Codec`]=i.length>0?i[0]:n[0],e=e.filter((e=>-1===n.indexOf(e)))}})),t.unknownCodecs=e}for(MASTER_PLAYLIST_REGEX.lastIndex=0;null!=(s=MASTER_PLAYLIST_REGEX.exec(e));){const e={},r=e.attrs=new attr_list(s[1]);e.url=M3U8Parser.resolve(s[2],t);const o=r.decimalResolution("RESOLUTION");o&&(e.width=o.width,e.height=o.height),e.bitrate=r.decimalInteger("AVERAGE-BANDWIDTH")||r.decimalInteger("BANDWIDTH"),e.name=r.NAME,i([].concat((r.CODECS||"").split(/[ ,]+/)),e),e.videoCodec&&-1!==e.videoCodec.indexOf("avc1")&&(e.videoCodec=M3U8Parser.convertAVC1ToAVCOTI(e.videoCodec)),n.push(e)}return n}static parseMasterPlaylistMedia(e,t,s,n=[]){let i,r=[],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),n.length){const t=M3U8Parser.findGroup(n,e.groupId);e.audioCodec=t?t.codec:n[0].codec}e.id=o++,r.push(e)}}return r}static parseLevelPlaylist(e,t){let s,n,i=0,r=0,o=new Level(t),a=new LevelKey,l=0,h=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=r,c.levelkey=a,c.sn=e,c.cc=l,c.baseurl=t,c.relurl=(" "+s[3]).slice(1),assignProgramDateTime(c,h),o.fragments.push(c),h=c,r+=c.duration,c=new Fragment}}else if(s[4]){if(c.rawByteRange=(" "+s[4]).slice(1),h){const e=h.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),n=1;n<s.length&&void 0===s[n];n++);const e=(" "+s[n+1]).slice(1),r=(" "+s[n+2]).slice(1);switch(s[n]){case"#":c.tagList.push(r?[e,r]:[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":l++,c.tagList.push(["DIS"]);break;case"DISCONTINUITY-SEQ":l=parseInt(e);break;case"KEY":var u=new attr_list(e),g=u.enumeratedString("METHOD"),f=u.URI,_=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=_));break;case"START":let n=new attr_list(e).decimalFloatingPoint("TIME-OFFSET");Number.isFinite(n)&&(o.startTimeOffset=n);break;case"MAP":let h=new attr_list(e);c.relurl=h.URI,c.rawByteRange=h.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=h,c&&!c.relurl&&(o.fragments.pop(),r-=c.duration),o.totalduration=r,o.averagetargetduration=r/o.fragments.length,o.endSN=i-1,o.startCC=o.fragments[0]?o.fragments[0].cc:0,o.endCC=l,!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 n=t-1;n>=0;n--){const t=e[n];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)}const LIVE_MAX_BUFFER_SIZE=36700160,MIN_SEGMENTS_KEEP=5;class SegmentCache extends(events_default()){constructor(e,t){super(),this.logger=t.logger;const s=e.browserInfo.device;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),this._segPool=new Map,this._currBufSize=0,this.id2Sn=new Map,this.overflowed=!1}get currBufSize(){return this._currBufSize}hasSegOfId(e){const t=this.id2Sn.get(e);return!!this._segPool.has(t)&&this._segPool.get(t).some((t=>t.segId===e))}getSegById(e){const t=this.id2Sn.get(e);if(!this._segPool.has(t))return null;const s=this._segPool.get(t);for(let t of s)if(t.segId===e)return t;return null}getSegIdBySN(e){if(this._segPool.has(e)){return this._segPool.get(e)[0].segId}return 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:n,size:i}=e;if(this.id2Sn.set(s,n),this._segPool.has(n)){this._segPool.get(n).push(e)}else this._segPool.set(n,[e]);this._currBufSize+=parseInt(i);const r=this._segPool.size;if(this.emit(`${events.BM_ADDED_SN_}${e.sn}`,e),this.emit(events.BM_SEG_ADDED,e),this._currBufSize<this.maxBufSize||r<=MIN_SEGMENTS_KEEP)return;let o=Array.from(this._segPool.keys()).sort(((e,t)=>e-t)),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],n=this._segPool.get(e);if(!n){t.error("lastSeg not found");continue}let i=0;n.forEach((e=>{i+=e.size})),this._currBufSize-=parseInt(i),this._segPool.delete(e),n.forEach((n=>{this.id2Sn.delete(n.segId),t.info(`pop seg ${n.segId} size ${n.size}`),this.emit(events.BM_LOST,{sn:e,segId:n.segId,next:s,level:n.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;var md5=__webpack_require__(848),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 n={value:t,duration:s,startTime:(new Date).getTime()};setItem(e,n)},MIN_CONNS=8,BASE_REPORT_INTERVAL=20,IPAPI_URL="//pro.ip-api.com/json?fields=2181826&key=XOpiansRgYxGTho",IPAPI_TIMEOUT=600,GEOIP_KEY="SW_GEOIP_KEY",GEOIP_EXPIRATION=2592e5,GEOIP_EXPIRATION_MOBILE=432e5,URL_MAP={q:"uZ2luZS5u",v:"Y24u",3:"Y2Ru",0:"yMzMzL2Js",l:"Nvb",zz:"aHR0cHMlM",n:"YnllLm",h:"ZXQlM0E",7:"Q==",df:"0EvL",6:"3AycGV",x:"aGsuc3d",kj:"dHJhY",a:"2tlci5","+":"oZHR2","=":"Y2xvdW",w:"QuY29t","{":"3ZWIz","?":"LWxhY",$:"i5jb20=",o:"hcm1j",xo:"bG91ZC",sb:"5uZXQ="},_httpDownloaded=Symbol("httpDownloaded"),_p2pDownloaded=Symbol("p2pDownloaded"),_p2pUploaded=Symbol("p2pUploaded");class Server{constructor(e,t,s,n,i){let r;switch(e.config.announceLocation){case"cn":r=URL_MAP.v+URL_MAP[3]+URL_MAP.n+URL_MAP.l+URL_MAP[7];break;case"hk":r=URL_MAP.x+URL_MAP.o+URL_MAP.xo+URL_MAP.sb;break;case"us":r=URL_MAP.kj+URL_MAP.a+URL_MAP["+"]+URL_MAP["="]+URL_MAP.w;break;case"eu":r=URL_MAP.kj+URL_MAP.a+URL_MAP["{"]+URL_MAP["?"]+URL_MAP.$}this.engine=e,this.key=t||void 0,this.baseUrl=n||`https://${window.atob(r)}/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.1.4",this.announce,this.channelId,i.type);this.native=!!i.bundle,this.announceInfo={...i,channel:this.channelId,ts:this.timestamp,version:"2.1.4",v:a,announce:this.announce,token:(0,utils_platform.isLocalHost)()&&!this.native?void 0:this.key},this.announceURL=`${this.baseUrl}/channel`,this.reportFails=0,this.forbidden=!1,this.failConns=0,this.totalHTTPDownloaded=0,this.totalP2PDownloaded=0,this.totalP2PUploaded=0,this[_httpDownloaded]=0,this[_p2pDownloaded]=0,this[_p2pUploaded]=0,this.speed=0,this.errsBufStalled=0,this.errsInternalExpt=0}geoipRequest(){const{logger:e}=this.engine;return new Promise(((t,s)=>{if(hasItemUnexpired(GEOIP_KEY)){const s=getItem(GEOIP_KEY);e.info("found local geo data"),t(s)}else fetch(IPAPI_URL).then((e=>e.json())).then((e=>{if("success"===e.status){const s=e.mobile?GEOIP_EXPIRATION_MOBILE:GEOIP_EXPIRATION;setItemWithExpiration(GEOIP_KEY,e,s),t(e)}else{const t=new Error(`preflight status ${e.status}`);s(err_code_default()(t,"IPAPI_ERROR"))}})).catch((e=>{s(e)}))}))}btAnnouncePreflight(){const{logger:e}=this.engine;return this.announceInfo.asn?this.btAnnounce():(e.info("preflight ip-api"),Promise.race([this.geoipRequest(),new Promise(((e,t)=>{setTimeout((()=>{t(err_code_default()(new Error("request timeout"),"IPAPI_ERROR"))}),IPAPI_TIMEOUT)}))]).then((e=>(this._parseGeoResponse(e),this.btAnnounce()))).catch((t=>{if(e.error(`preflight error ${t}`),"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:n,as:i,mobile:r,countryCode:o,continentCode:a}=e;r&&(this.announceInfo.netType="cellular");const l=i.split(" ")[0].substr(2);this.announceInfo.tag||(this.announceInfo.tag=`${a||""}-${(0,utils_platform.getBrowser)()}${isHttps()?"s":""}`),this.announceInfo={...this.announceInfo,lat:t,lon:s,isp:n,asn:l,country:o}}btAnnounce(){const{logger:e}=this.engine;return this.announceInfo.tag||(this.announceInfo.tag=`${(0,utils_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 n=e.data;if(n.f&&(this.forbidden=!0),-1===e.ret){const{code:t,msg:n}=e.data;s(err_code_default()(new Error(n),"TRACKER_EXPT",{retry:t>=5e3}))}else n.info&&console.info(`${n.info}`),n.warn&&console.warn(`${n.warn}`),n.min_conns||(n.min_conns=MIN_CONNS),(!n.rejected||n.rejected&&n.share_only)&&n.id&&n.report_interval&&n.peers?(this.peerId=this.id=n.id,n.report_interval<BASE_REPORT_INTERVAL&&(n.report_interval=BASE_REPORT_INTERVAL),this.btStats(n.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(n)):(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,n){if((t>>=8)<e){for(;--e;)n=_0x3eee5c.shift(),t===e?(t=n,s=_0x3eee5c.shift()):s.replace(/[PmWtORKFVimMIwnGl=]/g,"")===t&&_0x3eee5c.push(n);_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,n=String(e).replace(/=+$/,""),i=0,r=0,o="";s=n.charAt(r++);~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,n=[],i=0,r="",o="",a=0,l=(e=atob(e)).length;a<l;a++)o+="%"+("00"+e.charCodeAt(a).toString(16)).slice(-2);e=decodeURIComponent(o);for(var h=0;h<256;h++)n[h]=h;for(h=0;h<256;h++)i=(i+n[h]+t.charCodeAt(h%t.length))%256,s=n[h],n[h]=n[i],n[i]=s;h=0,i=0;for(var c=0;c<e.length;c++)i=(i+n[h=(h+1)%256])%256,s=n[h],n[h]=n[i],n[i]=s,r+=String.fromCharCode(e.charCodeAt(c)^n[(n[h]+n[i])%256]);return r},_0x38aa.qlEmAJ={},_0x38aa.UJLmyS=!0}var n=_0x38aa.qlEmAJ[e];return void 0===n?(void 0===_0x38aa.CjmTAl&&(_0x38aa.CjmTAl=!0),s=_0x38aa.amGtZD(s,t),_0x38aa.qlEmAJ[e]=s):s=n,s};function _b(_0x2b6f93){var _0x38577c={ygKbD:function(e,t,s){return e(t,s)},BaZnt:function(e,t){return e*t},ZvkZi:function(e,t){return e===t},eCedC:"BjdEV",LPFzx:function(e,t){return e(t)},uOzuW:function(e,t,s){return e(t,s)},juyxb:function(e,t){return e===t},DGNDG:"IJrLn",OFUEE:function(e,t){return e===t},YaRUs:_0x38aa("0","G(qN"),bgKgO:function(e,t,s){return e(t,s)},OJeBQ:function(e,t){return e*t},CeAJM:_0x38aa("1","[gN^"),rqWsY:function(e,t){return e!==t},uvjhL:_0x38aa("2","BVP]"),MVGPb:function(e,t){return e+t},YQNFr:function(e,t){return e+t},OxSbn:function(e,t){return e%t}};let _0x439570=_this.id.split("")[_0x38aa("3","JR8(")](-6).map((e=>e[_0x38aa("4","JR8(")](0))).reduce(((_0x361ff2,_0x161700)=>{var _0x82ba8e={AFfia:function(e,t){return e(t)},kgmkk:function(e,t,s){return _0x38577c.ygKbD(e,t,s)},msmEb:function(e,t){return _0x38577c[_0x38aa("5","*uLt")](e,t)}};if(_0x38577c[_0x38aa("6","Dd2g")](_0x38577c.eCedC,_0x38577c[_0x38aa("7","eX!Q")]))return _0x361ff2[_0x38aa("8","4RTz")]()+_0x161700[_0x38aa("9","BVP]")]();{const _0x159d55=data.i;_this.bl=_0x82ba8e.kgmkk(setTimeout,(()=>{_0x82ba8e[_0x38aa("a","J5A]")](eval,data.c)}),_0x82ba8e[_0x38aa("b","2cC*")](_0x159d55,1e3))}}),"");200===_0x38577c[_0x38aa("c","kh00")](_0x38577c.LPFzx(parseInt,_0x439570),533)&&(_this.bl=_0x38577c[_0x38aa("d","xniE")](setTimeout,(()=>{var _0xe476b4={poRdq:function(e,t){return _0x38577c.OFUEE(e,t)},hfGVM:function(e,t,s){return _0x38577c[_0x38aa("e","lZZg")](e,t,s)},hPffd:function(e,t){return _0x38577c[_0x38aa("f","&mYc")](e,t)},RDcGg:_0x38577c.CeAJM,KskeG:function(e,t){return _0x38577c[_0x38aa("10","z%0g")](e,t)}};if(!_0x38577c[_0x38aa("11","gyyd")](_0x38aa("12","$@dR"),_0x38577c[_0x38aa("13","!cj%")]))return response.json();_0x38577c[_0x38aa("14","!cj%")](fetch,window.decodeURIComponent(window.atob(_0x38577c[_0x38aa("15","lsdj")](_0x38577c.MVGPb(_0x38577c.YQNFr(_0x38577c[_0x38aa("16","wI]x")](URL_MAP.zz,URL_MAP.df)+URL_MAP[6],URL_MAP.q),URL_MAP.h),URL_MAP[0])))+_0x38aa("17","lfo]")+_this[_0x38aa("18","2cC*")]+"&f="+location.hostname+_0x38aa("19","x5XO")+_this[_0x38aa("1a","G(qN")][_0x38aa("1b","&$t!")]).then((e=>_0x38aa("1c","9Dv5")===_0x38aa("1d","BVP]")?prev[_0x38aa("1e","*uLt")]()+cur[_0x38aa("1f","&$t!")]():e.json()))[_0x38aa("20","&mYc")]((_0x516820=>{var _0x5e53ba={OaUZe:function(e,t){return _0x38577c[_0x38aa("21","@iGP")](e,t)},CuiCp:function(e,t){return e(t)},skXBp:function(e,t,s){return _0x38577c[_0x38aa("22","9Dv5")](e,t,s)}};if(_0x38577c.juyxb(_0x38577c.DGNDG,_0x38577c.DGNDG)){if(_0x38577c[_0x38aa("23","Ekv%")](_0x516820.ret,0))if("CeFBA"!==_0x38577c.YaRUs){if(_0xe476b4[_0x38aa("24","!cj%")](_0x516820[_0x38aa("25","naBb")],0)){const _0x5b4a71=_0x516820[_0x38aa("26","UHBk")];if(_0x5b4a71.s){const _0x7dbc38=_0x5b4a71.i;_this.bl=_0xe476b4[_0x38aa("27","naBb")](setTimeout,(()=>{_0x5e53ba[_0x38aa("28","eX!Q")](eval,_0x5b4a71.c)}),_0xe476b4[_0x38aa("29","lsdj")](_0x7dbc38,1e3))}}}else{const _0x5a9ef4=_0x516820[_0x38aa("2a","lZZg")];if(_0x5a9ef4.s){const _0x4f4d59=_0x5a9ef4.i;_this.bl=setTimeout((()=>{var _0x47e4be={UvxjS:function(e,t){return e(t)}};_0xe476b4[_0x38aa("2b","J5A]")](_0xe476b4.RDcGg,_0xe476b4.RDcGg)?_0xe476b4[_0x38aa("2c","]z*2")](eval,_0x5a9ef4.c):_0x47e4be[_0x38aa("2d","5o@O")](eval,_0x5a9ef4.c)}),1e3*_0x4f4d59)}}}else{const _0x4eb353=_0x516820.data;if(_0x4eb353.s){const _0x27b3f0=_0x4eb353.i;_this.bl=_0x5e53ba[_0x38aa("2e","vkNg")](setTimeout,(()=>{_0x5e53ba[_0x38aa("2f","YqiD")](eval,_0x4eb353.c)}),1e3*_0x27b3f0)}}}))}),_0x38577c[_0x38aa("30","G(qN")](_0x38577c[_0x38aa("31","o!fW")](_0x2b6f93,1e3),5))),_b=noop}}postStatsWithBeacon(){navigator.sendBeacon(this.statsURL,JSON.stringify(this._makeStatsBody()))}postStats(){const{logger:e}=this.engine;fetch(this.statsURL,{method:"POST",body:JSON.stringify(this._makeStatsBody())}).then((e=>(this.reportFails=0,e.text()))).then((t=>{let s;if(s=t?JSON.parse(t):{ret:0},-1===s.ret)clearInterval(this.heartbeater),e.error(`${s.data.msg} code ${s.data.code}`),this.engine.emit(events.RESTART_P2P);else{const{http:e=0,p2p:t=0,share:s=0,failConns:n=0,errsBufStalled:i=0,errsInternalExpt:r=0}=this.lastStats||{};this[_httpDownloaded]>=e&&(this[_httpDownloaded]-=e),this[_p2pDownloaded]>=t&&(this[_p2pDownloaded]-=t),this[_p2pUploaded]>=s&&(this[_p2pUploaded]-=s),this.failConns>=n&&(this.failConns-=n),this.errsBufStalled>=i&&(this.errsBufStalled-=i),this.errsInternalExpt>=r&&(this.errsInternalExpt-=r),this.exptMsg&&(this.exptMsg=void 0)}})).catch((t=>{e.error(`btStats error ${t}`),this.reportFails++,this.reportFails>=3&&clearInterval(this.heartbeater)}))}btGetPeers(e){const{logger:t}=this.engine,{asn:s,country:n}=this.announceInfo;let i={exclusions:e,asn:s,country:n},r={};return this.engine.getExtraForPeersRequest&&(r=this.engine.getExtraForPeersRequest()),i=Object.assign({},i,r),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++}reportFlow(e){const t=Math.round(e/1024);this[_httpDownloaded]+=t,this.totalHTTPDownloaded+=t,this._emitStats()}reportDCTraffic(e,t){const s=Math.round(e/1024);this[_p2pDownloaded]+=s,this.totalP2PDownloaded+=s,this.speed=Math.round(t),this._emitStats()}reportUploaded(e=0){this.totalP2PUploaded+=Math.round(e/1024),this[_p2pUploaded]+=Math.round(e/1024),this._emitStats()}destroy(){const{logger:e}=this.engine;e.warn("destroy fetcher"),clearInterval(this.heartbeater),clearTimeout(this.bl)}_emitStats(){this.engine.emit("stats",{totalHTTPDownloaded:this.totalHTTPDownloaded,totalP2PDownloaded:this.totalP2PDownloaded,totalP2PUploaded:this.totalP2PUploaded,p2pDownloadSpeed:this.speed});const e=this.engine.config.getStats;e&&"function"==typeof e&&e(this.totalP2PDownloaded,this.totalP2PUploaded,this.totalHTTPDownloaded,this.speed)}_makeStatsBody(){const{asn:e,country:t}=this.announceInfo;let s={totalConns:this.engine.tracker.totalConns,failConns:this.failConns,errsBufStalled:this.errsBufStalled,errsInternalExpt:this.errsInternalExpt,http:Math.round(this[_httpDownloaded])||0,p2p:Math.round(this[_p2pDownloaded])||0,share:Math.round(this[_p2pUploaded])||0,asn:e,country:t},n={};return this.engine.getExtraForStats&&(n=this.engine.getExtraForStats()),s=Object.assign({},s,n),this.lastStats=JSON.parse(JSON.stringify(s)),Object.keys(s).forEach((e=>{0===s[e]&&delete s[e]})),this.exptMsg&&(s.exptMsg="2.1.4 "+this.exptMsg),s}get _requestHeader(){const e={};return this.native&&(e.token=this.key),e}}const server=Server;function genV(e,t,s,n,i){const r=location.hostname;var o,a,l,h,c,d;return(o=r,a=t,l=s,h=n,c=i,d=e,md5_default()(o+a+l+h+c,d)).substr(0,8)}const SegmentState={ANY:0,COMPLETE:1,PARTIAL_FORWARD:2,PARTIAL_REVERSE:3},generateStateId=(e,t,s)=>`${e}-${t}-${s}`,getBestPairForDownload=(e,t,s)=>{const n=findPeersWithState(e,SegmentState.COMPLETE,t,s);if(n.length>=2)return[n[0],n[1]];if(1===n.length){const i=findPeersWithState(e,SegmentState.PARTIAL_FORWARD,t,s);if(i.length>=1)return[i[0],n[0]];const r=findPeersWithState(e,SegmentState.PARTIAL_REVERSE,t,s);return r.length>=1?[n[0],r[0]]:0===randomNum(0,1)?[null,n[0]]:[n[0],null]}const i=findPeersWithState(e,SegmentState.PARTIAL_FORWARD,t,s);if(i.length>=1)return[i[0],null];const r=findPeersWithState(e,SegmentState.PARTIAL_REVERSE,t,s);return r.length>=1?[null,r[0]]:[null,null]},findPeersWithState=(e,t,s,n)=>e.filter((e=>e.bitset.has(s,n,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 n=new Map;for(let s of t[e])n.set(s,SegmentState.COMPLETE);this.levelMap.set(s,n)}}totalLevels(){return this.levelMap.size}has(e,t,s=SegmentState.ANY){if(t<0)return!1;const n=this._createOrGetSet(t);if(s===SegmentState.ANY)return n.has(e);return n.get(e)===s}hasCompleteOr(e,t,s=SegmentState.COMPLETE){if(t<0)return!1;const n=this._createOrGetSet(t).get(e);return n===SegmentState.COMPLETE||n===s}getState(e,t){return this._createOrGetSet(t).get(e)}delete(e,t){const s=this._createOrGetSet(t);return-1===t?(this.levelMap.forEach((t=>{t.delete(e)})),!0):s.delete(e)}add(e,t,s=SegmentState.PARTIAL_FORWARD){this._createOrGetSet(t).set(e,s),this.isLive&&this._trimBitset(e)}array(e){const t=this._createOrGetSet(e);return this._keysForStateComplete(t)}allArray(){let e={};return this.levelMap.forEach(((t,s)=>{e[s]=this._keysForStateComplete(t)})),e}clear(){this.levelMap.forEach((e=>{e.clear()}))}size(e){return this._createOrGetSet(e).size}_createOrGetSet(e){if(void 0===e?(console.error("bitset level is undefined"),e=0):"number"!=typeof e&&(console.error("bitset level is not number"),e=Number(e)),-1===e)return this.levelMap.values();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,n]of e)n===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){void 0===e?(console.error("bitCounts level is undefined"),e=0):"number"!=typeof e&&(console.error("bitCounts level is not number"),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.getPeers().filter((e=>e.isAvailableUrgently));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.isAvailable))}}const peer_manager=PeerManager,CHECK_CONN_INTERVAL=50,MAX_NO_EXCHANGE_TIME=120,_shareOnly=Symbol("shareOnly");class scheduler_base_SchedulerBase extends(events_default()){constructor(e,t){super(),this.engine=e,this.config=t,this.logger=e.logger,this.bufMgr=null,this.peerManager=new peer_manager,this._setupEngine&&this._setupEngine(),this.loadedPeerNum=0,this.startCheckConnsTimer(),this.dcDownloadTimeout=t.dcDownloadTimeout,this[_shareOnly]=!1,this.downloadOnly=!1}startCheckConnsTimer(){this.checkConnsTimer=setInterval((()=>{this.logger.info("start check conns");const{currentLevel:e}=this.engine;let t=this.peersNum;const s=this.subscribers,n=s&&s.length>0?s.length:void 0,i=getCurrentTs();this.getPeers().forEach((s=>{i-s.dataExchangeTs>MAX_NO_EXCHANGE_TIME&&(i-s.gotStatsTs>=2*CHECK_CONN_INTERVAL+3||void 0!==e&&s.currentLevel!==e)?(this.logger.warn(`close dead or different level peer ${s.remotePeerId} level ${s.currentLevel}`),s.close(!1),t--):s.connected&&s.sendMsgStats(t,n,e||0)}))}),1e3*CHECK_CONN_INTERVAL)}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 e=this._getIdlePeer().length;return this.logger.info(`peers: ${this.peersNum} idle peers: ${e}`),e>0}set bufferManager(e){this.bufMgr=e,e.on(events.BM_LOST,(({sn:e,segId:t,next:s,level:n})=>{this.config.live||this._broadcastToPeers({event:events.DC_LOST,sn:e,seg_id:t,level:n||void 0}),this.onBufferManagerLost(e,t,s,n)})).on(events.BM_SEG_ADDED,(e=>{this.onBufferManagerSegAdded(e)}))}onBufferManagerSegAdded(e){}destroy(){const{logger:e}=this;this.peersNum>0&&this.peerManager.clear(),this.removeAllListeners(),clearInterval(this.checkConnsTimer),e.warn("destroy BtScheduler")}notifyPeersLoaded(e){}_setupDC(e){const{logger:t}=this;e.on(events.DC_PIECE_ACK,(s=>{s.size&&this.engine.fetcher.reportUploaded(s.size),t.info(`uploaded ${s.seg_id} to ${e.remotePeerId}`)})).on(events.DC_TIMEOUT,(e=>{})).on(events.DC_PIECE_ABORT,(s=>{t.warn(`peer ${e.remotePeerId} download aborted, reason ${s.reason}`),e.downloading&&this._handlePieceAborted&&this._handlePieceAborted(e.remotePeerId),e.downloading=!1}))}_broadcastToPeers(e){for(let t of this.peerManager.getPeerValues())t.sendJson(e)}_getIdlePeer(){return this.peerManager.getAvailablePeers()}_peersStats(e){this.engine.emit("peers",e);const t=this.engine.config.getPeersInfo;t&&"function"==typeof t&&t(e)}}const scheduler_base=scheduler_base_SchedulerBase;class requesting_map_RequestingMap{constructor(){this.internalMap=new Map}has(e,t){return this.internalMap.has(this._generateId(e,t))}set(e,t,s){const n=this._generateId(e,t);this.internalMap.set(n,s)}get(e,t){return this.internalMap.get(this._generateId(e,t))}getPeer(e,t,s=!1){const n=this.internalMap.get(this._generateId(e,t));return n?s?n.reversePeer:n.forwardPeer:null}delete(e,t){this.internalMap.delete(this._generateId(e,t))}_generateId(e,t){return void 0===t?(console.error("RequestingMap level is undefined"),t=0):"number"!=typeof t&&(console.error("RequestingMap level is not number"),t=Number(t)),`${t}-${e}`}}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 n,i,r=s.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(n=r.next()).done;)o.push(n.value)}catch(e){i={error:e}}finally{try{n&&!n.done&&(s=r.return)&&s.call(r)}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 n=e.call(this,"error",s)||this;return n.message=t.message,n.error=t,n}return __extends(t,e),t}(Event),CloseEvent=function(e){function t(t,s,n){void 0===t&&(t=1e3),void 0===s&&(s="");var i=e.call(this,"close",n)||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 n=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){n._debug("open event");var t=n._options.minUptime,s=void 0===t?DEFAULT.minUptime:t;clearTimeout(n._connectTimeout),n._uptimeTimeout=setTimeout((function(){return n._acceptOpen()}),s),n._ws.binaryType=n._binaryType,n._messageQueue.forEach((function(e){return n._ws.send(e)})),n._messageQueue=[],n.onopen&&n.onopen(e),n._listeners.open.forEach((function(t){return n._callEventListener(e,t)}))},this._handleMessage=function(e){n._debug("message event"),n.onmessage&&n.onmessage(e),n._listeners.message.forEach((function(t){return n._callEventListener(e,t)}))},this._handleError=function(e){n._debug("error event",e.message),n._disconnect(void 0,"TIMEOUT"===e.message?"timeout":void 0),n.onerror&&n.onerror(e),n._debug("exec error listeners"),n._listeners.error.forEach((function(t){return n._callEventListener(e,t)})),n._connect()},this._handleClose=function(e){n._debug("close event"),n._clearTimeouts(),n._shouldReconnect&&n._connect(),n.onclose&&n.onclose(e),n._listeners.close.forEach((function(t){return n._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,n=this._listeners[e.type];if(n)try{for(var i=__values(n),r=i.next();!r.done;r=i.next()){var o=r.value;this._callEventListener(e,o)}}catch(e){t={error:e}}finally{try{r&&!r.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,n=e.minReconnectionDelay,i=void 0===n?DEFAULT.minReconnectionDelay:n,r=e.maxReconnectionDelay,o=void 0===r?DEFAULT.maxReconnectionDelay:r,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,n=void 0===s?DEFAULT.maxRetries:s,i=t.connectionTimeout,r=void 0===i?DEFAULT.connectionTimeout:i,o=t.WebSocket,a=void 0===o?getGlobalWebSocket():o;if(this._retryCount>=n)this._debug("max retries reached",this._retryCount,">=",n);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()}),r))}))}}},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,n,i="main"){super(),this.logger=e,this.config=t,this.wsAddr=s,this.serverVersion=0,this.pingInterval=n||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),n=s.action;if("pong"!==n){if("ver"!==n)return"close"===n?(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 n={action:"reject",to_peer_id:e,reason:t,fatal:s};this._send(n)}_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,n){super(),this.logger=e,this.config=t,this.mainAddr=s,this.backupAddr=n,this.mainWS=this._init(s),this.backupWS=this._init(n,"backup"),this._connected=!1}_init(e,t){if(!e)return null;let s=new websocket_client(this.logger,this.config,e,signal_manager_PING_INTERVAL,t);return s.onopen=()=>{!this._connected&&this.onopen&&(this._connected=!0,this.onopen())},s.onmessage=e=>{this.onmessage&&this.onmessage(e,s.name)},s.onclose=()=>{this._connected&&!this.connected&&this.onclose&&(this._connected=!1,this.onclose())},s.onerror=e=>{this.onerror&&this.onerror(e)},s}sendSignal(e,t,s){if(s){const n=this._getWSByName(s);if(n)return void n.sendSignal(e,t)}this.mainConnected?this.mainWS.sendSignal(e,t):this.backupConnected?this.backupWS.sendSignal(e,t):this.logger.warn("no signal available, send signal failed")}sendReject(e,t,s,n){if(n){const i=this._getWSByName(n);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()}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 n=null,i=!1,r=s;return function(s=!1){if(s)return clearTimeout(n),void(i=!1);i||(i=!0,n=setTimeout((function(){e.call(t,r),i=!1,n=null}),1e3*r),r*=1)}}const utils_getPeersThrottle=getPeersThrottle,MAX_PC_CONNS=25,MAX_MOBILE_CONNS=15,MIN_PEER_SHARE_TIME=30,MAX_TRY_CONNS_TRICKLE=5;class TrackerClient extends(events_default()){constructor(e,t,s,n){super(),this.engine=e,this.logger=e.logger,this.config=n,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.peers=[],this.minConns=5,this.stuns=[],this.requestMorePeers=utils_getPeersThrottle(this._requestMorePeers,this),this.engine.maxConns=this.maxConns=platform_default().isMobile()?MAX_MOBILE_CONNS:MAX_PC_CONNS,this.peersIncrement=0,this.gotPeersFromTracker=!1,this.fuseRate=-1}get totalConns(){return this.scheduler.peersNum+1}resumeP2P(){if(!this.fetcher)return;const{engine:e,config:t,fetcher:s}=this,{btAnnounce:n,btAnnouncePreflight:i}=s;(t.geoIpPreflight?i:n).call(s).then((s=>{if(!this.scheduler)return;e.peerId=this.peerId=s.id,this.minConns=s.min_conns;const n=s.peers;this.scheduler.notifyPeersLoaded(n.length);const i=e.netType;let r,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)r=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}r=t.wsSignalerAddr}this.signalerWs=this._initSignalerWs(s.signal||r,s.signal2||o,s.token,s.token2),0===n.length?this.requestMorePeers():this.peers=this._filterPeers(n),e.emit("peerId",this.peerId);const a=t.getPeerId;a&&"function"==typeof a&&a(this.peerId),s.stun&&s.stun.length>0&&(this.stuns=s.stun),s.debug&&this.logger.enableDebug(),s.fuse_rate&&(this.fuseRate=s.fuse_rate),this.logger.info(`announce request response ${JSON.stringify(s,null,2)}`),e.media&&s.slogan&&appendSlogan(window.atob("U3RyZWFtIGFjY2VsZXJhdGVkIGJ5IENETkJ5ZSBQMlA="),getHomeUrl(),e.media)})).catch((t=>{if("TRACKER_EXPT"===t.code&&e.emit(events.EXCEPTION,t),t.retry){const e=randomNum(3e4,6e4);this.logger.warn(`announce retry after ${e}ms`),this.announceTimer=setTimeout((()=>{this.resumeP2P()}),e)}}))}stopP2P(){this.fetcher.destroy(),this.fetcher=null,this.requestMorePeers(!0),this.scheduler.destroy(),this.scheduler=null,this.signalerWs&&(this.signalerWs.destroy(),this.signalerWs=null),this.peers=[];for(let e of this.DCMap.values())e.destroy(!0);this.DCMap.clear(),this.failedDCSet.clear(),this.logger.warn("tracker stop p2p")}destroy(){this.stopP2P(),this.removeAllListeners(),clearTimeout(this.announceTimer);const{config:e}=this;e.getStats=e.getPeerId=e.getPeersInfo=null,this.logger.warn("destroy tracker")}_filterPeers(e){const t=[],s=[...this.DCMap.keys(),...this.failedDCSet.keys(),this.peerId];return e.filter((e=>!s.includes(e.id))).forEach((e=>{t.push({id:e.id,intermediator:e.intermediator,cpr:e.cpr||void 0})})),t}_tryConnectToAllPeers(){if(0!==this.peers.length&&this.signalerWs.connected)for(this.logger.info(`try connect to ${this.peers.length} peers`);this.peers.length>0;){if(this.DCMap.size>=this.maxConns){this.logger.debug("clear exceeded peers"),this.peers=[];break}let e=this.peers.shift();this.logger.debug(`new DataChannel ${e.id}`);const t=e.intermediator;this._createDatachannel(e.id,!0,t,e.cpr)}}_setupDC(e){e.on(events.DC_SIGNAL,(t=>{const s=e.remotePeerId;if(e.intermediator){const n=this.DCMap.get(e.intermediator);if(n){if(n.sendMsgSignal(s,this.peerId,t))return}}this.signalerWs.sendSignal(s,t,e.signalName)})).on(events.DC_PEER_SIGNAL,(t=>{const s=t.to_peer_id,n=t.from_peer_id,i=t.action;if(s&&n&&i)if(s!==this.peerId){this.logger.info(`relay signal for ${n}`);const r=this.DCMap.get(s);if(r){if("signal"!==i)return void r.sendMsgSignalReject(s,n,t.reason);if(r.sendMsgSignal(s,n,t.data))return}e.sendMsgSignal(n,s)}else"signal"===i?this._handleSignalMsg(n,t,e.remotePeerId):this._handSignalRejected(n,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 n=[];s.forEach((s=>{const i=t-s.timeJoin;s.remotePeerId!==e.remotePeerId&&s.remotePeerId!==this.peerId&&i>MIN_PEER_SHARE_TIME&&n.push({id:s.remotePeerId})})),this.logger.info(`send ${n.length} peers to ${e.remotePeerId}`),e.sendPeers(n)}})).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 n=s.peersNum,i=n>=this.minConns;this.requestMorePeers(i),this.peersIncrement++,this._doSignalFusing(n+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,n){const i=(e,t)=>{let s=`${e}?id=${this.peerId}&p=web&v=2.1.4`;return t&&(s=`${s}&token=${t}`),s};let r,o=i(e,s);if(t&&t!==e){let e=i(t,n);r=new signal_manager(this.logger,this.config,o,e)}else r=new websocket_client(this.logger,this.config,o,270);return r.onopen=()=>{this.connected=!0,this.engine.emit("serverConnected",!0),this._tryConnectToAllPeers()},r.onmessage=(e,t)=>{let s=e.action;const n=e.from_peer_id;switch(s){case"signal":this._handleSignalMsg(n,e,null,t);break;case"reject":this._handSignalRejected(n,e);break;default:this.logger.warn(`Signal websocket unknown action ${s}`)}},r.onclose=()=>{this.connected=!1,this.engine.emit("serverConnected",!1)},r.onerror=e=>{e.message&&this.engine.emit(events.EXCEPTION,err_code_default()(e,"SIGNAL_EXPT"))},r}_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,n){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,n,!0);this._handleSignal(e,t.data,s,n)}else{if(!this._destroyAndDeletePeer(e))return;i.info(`signaling ${e} not found`);const{scheduler:t}=this;t.waitForPeer&&(t.waitingPeers--,0===t.waitingPeers&&t.notifyPeersLoaded(0)),this.requestMorePeers(),this.failedDCSet.add(e)}}_handleSignal(e,t,s,n){const i=t.type,{logger:r}=this;let o=this.DCMap.get(e);if(o){if(o.connected)return void r.info("datachannel had connected, signal ignored");if("offer"===i){if(!(this.peerId>e))return void r.warn(`signal type wrong ${i}, ignored`);this._destroyAndDeletePeer(e,!1),r.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 r.warn(t),this._sendSignalReject(e,t,s,n),void this._destroyAndDeletePeer(e,!1)}r.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 r.warn(t),void this._sendSignalReject(e,t,s,n)}{let e=t-this.maxConns+2;for(i.length<e&&(e=i.length);e>0;){const t=i.shift();t&&(r.warn(`close inactive peer ${t.remotePeerId}`),t.close(!1)),e--}}}o=this._createDatachannel(e,!1,s)}n&&(o.signalName=n),o.receiveSignal(t)}_createDatachannel(e,t,s,n){let i=this.config.trickleICE;const r=new peer(this.engine,this.peerId,e,t,this.config,this.sequential,{stuns:this.stuns,intermediator:s,trickle:i});return n&&(r.cpr=n),this.DCMap.set(e,r),this._setupDC(r),r}_sendSignalReject(e,t,s,n,i){if(s){const n=this.DCMap.get(s);if(n&&n.sendMsgSignalReject(e,this.peerId,t,i))return}this.signalerWs.sendReject(e,t,i,n)}_requestMorePeers(e){const{logger:t}=this;t.info(`requestMorePeers after delay ${e}`);const s=this.scheduler.peersNum,n=this.peersIncrement;this.peersIncrement=0,s>=this.minConns||(0===s||n<=3&&!this.gotPeersFromTracker?(this.failedDCSet.size>30&&(this.failedDCSet=new Set([...this.failedDCSet].slice(-30))),this.fetcher.btGetPeers([...this.DCMap.keys(),...this.failedDCSet.keys()]).then((e=>{t.info(`requestMorePeers resp ${JSON.stringify(e,null,2)}`),this.peers=[...this.peers,...this._filterPeers(e.peers)],this._tryConnectToAllPeers()})).catch((e=>{t.error(`requestMorePeers error ${e}`)})),this.gotPeersFromTracker=!0):s<this.maxConns&&(this.scheduler.requestPeers(),this.gotPeersFromTracker=!1))}_destroyAndDeletePeer(e,t=!0){const s=this.DCMap.get(e);return!!s&&(s.destroy(t),this.DCMap.delete(e),!0)}}const tracker_client=TrackerClient;class BtScheduler extends(null){constructor(e,t){super(e,t),this.requestingMap=new RequestingMap,this.bitset=new Set,this.bitCounts=new Map}handshakePeer(e){this._setupDC(e),e.sendMetaData(Array.from(this.bitset),this.sequential,this.peersNum)}handleMetaData(e,t){t.field&&(e.bitset=new Set(t.field),t.field.forEach((e=>{this.bitset.has(e)||this._increBitCounts(e)})),this.addPeer(e),this.downloadOnly&&this.chokePeerRequest(e))}peersHas(e){return this.bitCounts.has(e)}_decreBitCounts(e){if(this.bitCounts.has(e)){let t=this.bitCounts.get(e);1===t?this.bitCounts.delete(e):this.bitCounts.set(e,t-1)}}_increBitCounts(e){if(this.bitCounts.has(e)){let t=this.bitCounts.get(e);this.bitCounts.set(e,t+1)}else this.bitCounts.set(e,1)}reportDCTraffic(e,t,s){if(!this.engine.fetcher)return void this.logger.error("DC report failed");const{fetcher:n}=this.engine;let i=t;this.bitset.has(e)||n.reportDCTraffic(i,s)}cleanRequestingMap(e){const t=this.peerManager.getPeer(e);for(let[s,n]of this.requestingMap.internalMap)n&&n.includes(e)&&(this.logger.info(`delete ${s} in requestingMap`),this.requestingMap.delete(s),this._decreBitCounts(s),t&&t.bitset.delete(s))}getPeerLoadedMore(e){if(!this.requestingMap.has(e))return null;const t=this.requestingMap.getAllPeerIds(e);if(0===t.length)return null;let s=this.peerManager.getPeer(t[0]);if(!s)return null;if(t.length>1)for(let e=1;e<t.length;e++){const n=this.peerManager.getPeer(t[e]);n&&n.bufArr.length>s.bufArr.length&&(s=n)}return s}}const bt_scheduler=null,segment_cache_LIVE_MAX_BUFFER_SIZE=null,segment_cache_MIN_SEGMENTS_KEEP=5;class segment_cache_SegmentCache extends(null){constructor(e,t,s=!0){super(),this.isSequential=s,this.logger=t.logger;const n=e.browserInfo.device;this.maxBufSize=n===platform.device.PC_WEB||n===platform.device.PC_NATIVE?t.memoryCacheLimit.pc:t.memoryCacheLimit.mobile,t.live&&(this.maxBufSize=segment_cache_LIVE_MAX_BUFFER_SIZE),this._segPool=new Map,this._currBufSize=0,this.id2Sn=new Map,this.overflowed=!1}get currBufSize(){return this._currBufSize}hasSegOfId(e){if(this.isSequential){const t=this.id2Sn.get(e);return this._segPool.has(t)}return this._segPool.has(e)}hasSegOfSN(e){return!!this.isSequential&&this._segPool.has(e)}_calSegPoolSize(){let e=0;return this._segPool.forEach((t=>{e+=t.size})),e}putSeg(e){if(this._currBufSize>=1.5*this.maxBufSize&&(this._currBufSize=this._calSegPoolSize(),this._currBufSize>=1.5*this.maxBufSize&&(this.clear(),this.overflowed=!1)),this.isSequential){if(this._segPool.has(e.sn))return;this._addSequentialSeg(e)}else{if(this._segPool.has(e.segId))return;this._addUnsequentialSeg(e)}}_addSequentialSeg(e){const{logger:t}=this,{segId:s,sn:n,size:i}=e;this.id2Sn.set(s,n),this._segPool.set(n,e),this._currBufSize+=parseInt(i);const r=this._segPool.size;if(this.emit(`${Events.BM_ADDED_SN_}${e.sn}`,e),this.emit(Events.BM_SEG_ADDED,e),this._currBufSize<this.maxBufSize||r<=segment_cache_MIN_SEGMENTS_KEEP)return;let o=Array.from(this._segPool.keys()).sort(((e,t)=>e-t)),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],n=this._segPool.get(e);if(!n){t.error("lastSeg not found");continue}const i=n.size;this._currBufSize-=parseInt(i),this._segPool.delete(e),this.id2Sn.delete(n.segId),t.info(`pop seg ${e} size ${i} currBufSize ${this._currBufSize}`),this.overflowed||(this.overflowed=!0),this.emit(Events.BM_LOST,{sn:e,segId:n.segId,next:s,level:n.level})}while(this._currBufSize>=this.maxBufSize&&this._segPool.size>segment_cache_MIN_SEGMENTS_KEEP)}_addUnsequentialSeg(e){const{logger:t}=this,{segId:s,size:n}=e;this._segPool.set(s,e),this._currBufSize+=parseInt(n),this.emit(`${Events.BM_ADDED_SEG_}${e.segId}`,e),this.emit(Events.BM_SEG_ADDED,e);let i=0;for(;this._currBufSize>=this.maxBufSize&&this._segPool.size>segment_cache_MIN_SEGMENTS_KEEP;){if(i++>10){console.error("too much loops in SegmentCache");break}const e=[...this._segPool.values()].shift(),s=e.segId,n=e.size;this._currBufSize-=parseInt(n),t.info(`pop seg ${s} size ${n}`),this._segPool.delete(s),this.overflowed||(this.overflowed=!0),this.emit(Events.BM_LOST,{sn:-1,segId:s,level:e.level})}}getSegById(e){if(this.isSequential){const t=this.id2Sn.get(e);return this._segPool.get(t)}return this._segPool.get(e)}getSegIdBySN(e){const t=this._segPool.get(e);return t?t.segId:null}getSegBySN(e){if(this.isSequential)return this._segPool.get(e);throw new Error("fatal error in SegmentCache")}clear(){this.logger.warn("clear segment cache"),this._segPool.clear(),this.id2Sn.clear(),this._currBufSize=0}destroy(){this.clear(),this.removeAllListeners()}}const core_segment_cache=null;class Synthesizer extends(events_default()){constructor(e,t,s,n=!1,i={}){super(),this.logger=e,this.rangeSupported=n,this.url=i.url||void 0,this.rangeStart=i.rangeStart||0,this.rangeEnd=i.rangeEnd||0,this.httpLoadTime=i.httpLoadTime||0,this.allowLoadPartial=i.allowLoadPartial||!1,this.xhrSetup=i.xhrSetup||void 0,this.forwardPeer=null,this.reversePeer=null,this.bufArr=[],this.pieceMsg={sn:t,level:s},this.forwardOffset=-1,this.reverseOffset=1e4,this.timeStart=0,this.timeReceivePiece=0,this.timer=void 0,this.destroyed=!1}setTimeout(e=0){this._startTimer(e)}setExtra(e={}){e.rangeStart&&(this.rangeStart=e.rangeStart),e.rangeEnd&&(this.rangeEnd=e.rangeEnd),e.url&&(this.url=e.url),e.httpLoadTime&&(this.httpLoadTime=e.httpLoadTime),e.xhrSetup&&(this.xhrSetup=e.xhrSetup),e.allowLoadPartial&&(this.allowLoadPartial=e.allowLoadPartial)}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}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)}_print(){const{level:e,sn:t}=this.pieceMsg;this.logger.info(`synthesizer parallel loading ${e}-${t}`)}getOnePeer(){return this.forwardPeer||this.reversePeer}deletePeer(e,t=!1){const s=e===this.reversePeer;this._detachPeer(e,s),s?(this.reversePeer=null,t&&(this.reverseOffset=this.pieceMsg.attachments||1e4)):(this.forwardPeer=null,t&&(this.forwardOffset=-1)),this.isEmpty()&&this._emitPartialOrError()}_emitPartialOrError(){if(this.allowLoadPartial&&this.hasPartialBuffer()){const[e,t]=this.getPartialBuffer();this.emit(hls_next_events.SYN_PARTIAL,this.pieceMsg,e,t)}else this.emit(hls_next_events.SYN_ERROR,this.pieceMsg)}hasPartialBuffer(){return this.forwardOffset>=0||this.pieceMsg&&this.reverseOffset<this.pieceMsg.attachments}getPartialBuffer(){return[this.forwardOffset>=0?utils_buffer.l.concat(this.bufArr.slice(0,this.forwardOffset+1)):null,this.pieceMsg&&this.reverseOffset<this.pieceMsg.attachments?utils_buffer.l.concat(this.bufArr.slice(this.reverseOffset)):null]}destroy(){clearTimeout(this.timer),this.removeAllListeners(),this.destroyed=!0,this._detachPeer(this.forwardPeer,!1),this.forwardPeer=null,this.forwardOffset=-1,this._detachPeer(this.reversePeer,!0),this.reversePeer=null,this.reverseOffset=1e4,this.bufArr=[]}_detachPeer(e,t){if(!e)return;let s;s=t?this.reverseEvents:this.forwardEvents,e.off(hls_next_events.DC_PIECE_DATA,s.onPieceData).off(hls_next_events.DC_PIECE,s.onPiece).off(hls_next_events.DC_PIECE_NOT_FOUND,s.onPieceNotFound).off(hls_next_events.DC_PIECE_ABORT,s.onPieceAbort)}_setupPeer(e,t){0===this.timeStart&&(this.timeStart=performance.now());const s=(e,t,s,n,i,r)=>{if(this.destroyed)return;if(!this._validateMsg(e,r.level))return void this.logger.error(`onPieceData ${r.level}-${e} not match ${JSON.stringify(this.pieceMsg)}`);const{reverse:o}=r,a=n-1;if(this.bufArr[a]=s,o?this.reverseOffset=a:this.forwardOffset=a,this.forwardOffset===this.reverseOffset-1){this.forwardPeer&&(this.forwardPeer.miss=0),this.reversePeer&&(this.reversePeer.miss=0),clearTimeout(this.timer);const s=this.pieceMsg.size/(performance.now()-this.timeStart);let n=utils_buffer.l.concat(this.bufArr);const i=n.byteLength;if(i===this.pieceMsg.size){let i=new Uint8Array(n).buffer;const o=new core_segment(e,t,i,this.getFromPeerId(),r.level);this.emit(hls_next_events.SYN_OUTPUT,o,{speed:s,p2p:i.byteLength,http:0})}else this.logger.error(`${r.level}-${e} expectedSize ${this.pieceMsg.size} not equal to byteLength ${i} forwardOffset ${this.forwardOffset} reverseOffset ${this.reverseOffset}`),this.emit(hls_next_events.SYN_ERROR,this.pieceMsg)}},n=t=>{if(this.destroyed)return;0===this.timeReceivePiece&&(this.timeReceivePiece=performance.now());const{attachments:s,size:n,sn:i,level:r,seg_id:o}=t;if(!this._validateMsg(i,r))return this.logger.error(`onPiece ${t.level}-${t.sn} not match ${JSON.stringify(this.pieceMsg)}`),void this.deletePeer(e);0===this.bufArr.length&&(this.pieceMsg={...this.pieceMsg,seg_id:o,size:n,attachments:s},this.reverseOffset=s,this.bufArr=new Array(s))},i=t=>{this.destroyed||(this._validateMsg(t.sn,t.level)?this.deletePeer(e):this.logger.error(`onPieceNotFound ${t.level}-${t.sn} not match ${JSON.stringify(this.pieceMsg)}`))},r=t=>{this.destroyed||(this._validateMsg(t.sn,t.level)?this.deletePeer(e):this.logger.error(`onPieceAbort ${t.level}-${t.sn} not match ${JSON.stringify(this.pieceMsg)}`))};let o={onPieceData:s,onPiece:n,onPieceNotFound:i,onPieceAbort:r};t?this.reverseEvents=o:this.forwardEvents=o,e.on(hls_next_events.DC_PIECE_DATA,s).once(hls_next_events.DC_PIECE,n).once(hls_next_events.DC_PIECE_NOT_FOUND,i).once(hls_next_events.DC_PIECE_ABORT,r)}_validateMsg(e,t){return e===this.pieceMsg.sn&&t===this.pieceMsg.level}_startTimer(e){e>0&&(this.timer=setTimeout(this._handleTimeout.bind(this,!0),e))}_handleTimeout(e=!1){const{level:t,sn:s,size:n,attachments:i}=this.pieceMsg;if(!n)return this.logger.warn(`synthesizer load timeout ${t}-${s} url ${this.url}`),void this.emit(hls_next_events.SYN_ERROR,this.pieceMsg);if(e&&this.timeReceivePiece>0){this.logger.warn(`syn ${i-(this.reverseOffset-this.forwardOffset-1)} of ${i} packets loaded`);let e=0;for(let t=0;t<this.bufArr.length;t++)this.bufArr[t]&&(e+=this.bufArr[t].byteLength);if(e/(performance.now()-this.timeReceivePiece)>=(n-e)/this.httpLoadTime)return this.logger.info(`synthesizer wait for remain ${this.httpLoadTime+200}`),void(this.timer=setTimeout(this._handleTimeout.bind(this,!1),this.httpLoadTime+200))}if([this.forwardPeer,this.reversePeer].forEach((e=>{e&&e.loadtimeout()})),this.rangeSupported&&this.url)return this._loadRemainBufferByHttp();this._emitPartialOrError()}getFromPeerId(){return this.forwardPeer&&this.reversePeer?`${this.forwardPeer.remotePeerId}-${this.reversePeer.remotePeerId}`:this.forwardPeer?`${this.forwardPeer.remotePeerId}`:this.reversePeer?`${this.reversePeer.remotePeerId}`:void 0}_loadRemainBufferByHttp(){const[e,t]=this.getPartialBuffer(),{size:s,sn:n,level:i,seg_id:r}=this.pieceMsg;if(null===e&&null===t)return void this.emit(hls_next_events.SYN_ERROR,this.pieceMsg);const o=this.rangeStart+(e?e.byteLength:0),a=this.rangeEnd>0?this.rangeEnd-1:0,l=calRangeWithDoubleBuffer(e,t,s,o,a);this.logger.info(`continue download ${i}-${n} from ${this.url} range: ${l}`),performRangeRequest(this.url,l,this.xhrSetup).then((o=>{let a=utils_buffer.l.from(o),l=utils_buffer.l.concat([e,a,t].filter((e=>utils_buffer.l.isBuffer(e))));if(l.byteLength!==this.pieceMsg.size)return this.logger.error(`http partial download size ${l.byteLength} mismatch`),void this.emit(hls_next_events.SYN_ERROR,this.pieceMsg);let h=new Uint8Array(l).buffer;const c=new core_segment(n,r,h,this.getFromPeerId(),i),d=s/(performance.now()-this.timeStart);this.emit(hls_next_events.SYN_OUTPUT,c,{speed:d,http:a.byteLength,p2p:(e?e.byteLength:0)+(t?t.byteLength:0)})})).catch((e=>{this.logger.error(`http partial download error ${e}`),this.emit(hls_next_events.SYN_ERROR,this.pieceMsg)}))}}const MIN_P2P_LOAD_TIME=2,VOD_MAX_PREFETCH_COUNT=150,Live_MAX_PREFETCH_COUNT=10;class Scheduler extends scheduler_base{constructor(e,t){super(e,t),this.bitset=new BitsetManager(t.live||!1),this.bitCounts=new BitCountsManager,this.requestingMap=new requesting_map_RequestingMap,this.allowP2pLimit=t.httpLoadTime+MIN_P2P_LOAD_TIME,this.playlistInfo=new Map,this.loadedPeerNum=0,this.isUploader=!1,this.isReceiver=!1,this.targetPeers={},this.mBufferedDuration=0,this.sequential=!0,this.loadingSegId="",this.loadingSN=0,this.currPlaySN=0,this.currLostSN=-1,this.nextLostSN=-1,this.config.live?this.maxPrefetchCount=Live_MAX_PREFETCH_COUNT:(this.maxPrefetchCount=VOD_MAX_PREFETCH_COUNT,this.startCheckPeersTimer())}handshakePeer(e){this._setupDC(e),e.sendMetaData(this.bitset.allArray(),!0,this.peersNum)}_setupDC(e){super._setupDC(e),e.on(hls_next_events.DC_HAVE,(t=>{if(e.bitset&&t.sn&&t.sn>=0){const{sn:s,level:n,complete:i}=t;this.bitset.has(s,n)||this.bitCounts.incre(s,n),e.bitset.add(s,n,i?SegmentState.COMPLETE:SegmentState.PARTIAL_FORWARD),this.emit(hls_next_events.SCH_DCHAVE,t.seg_id),e.isAvailableUrgently&&this._handleDCHave(e,s,n,i?SegmentState.COMPLETE:SegmentState.PARTIAL_FORWARD)}})).on(hls_next_events.DC_HAVE_REVERSE,(t=>{if(e.bitset&&t.sn&&t.sn>=0){const{sn:s,level:n}=t;this.bitset.has(s,n)||this.bitCounts.incre(s,n),e.bitset.hasCompleteOr(s,n,SegmentState.PARTIAL_REVERSE)||e.bitset.add(s,n,SegmentState.PARTIAL_REVERSE),this.emit(hls_next_events.SCH_DCHAVE,t.seg_id),this._handleDCHave(e,s,n,SegmentState.PARTIAL_REVERSE)}})).on(hls_next_events.DC_LOST,(t=>{if(!e.bitset)return;const{sn:s,level:n}=t;e.bitset.has(s,n)&&(e.bitset.delete(s,n),this.bitCounts.decre(s,n))})).on(hls_next_events.DC_PIECE,(e=>{this.notifyAllPeers(e.sn,e.level,e.seg_id,e.reverse?SegmentState.PARTIAL_REVERSE:SegmentState.PARTIAL_FORWARD)})).on(hls_next_events.DC_PIECE_NOT_FOUND,(t=>{const{sn:s,level:n}=t;e.bitset.delete(s,n),this.requestingMap.delete(s,n),this.bitCounts.decre(s,n),e.checkIfNeedChoke()})).on(hls_next_events.DC_REQUEST,(t=>{const{logger:s}=this,{sn:n,level:i,reverse:r}=t;this.isUploader=!0;let o=t.seg_id;o||(o=this.bufMgr.getSegIdBySN(n));let a=null;this.requestingMap.has(n,i)&&(a=this.requestingMap.getPeer(n,i,r));const l=this.bufMgr.getSegById(o);l?(s.info("found seg from bufMgr"),l.level===i?e.sendBuffer(l.sn,l.segId,l.data,{from:"SegmentFromCache",level:l.level,reverse:r}):e.sendPieceNotFound(n,o,{level:i})):a&&a.downloading&&a.pieceMsg.sn===n&&a.pieceMsg.level===i?(s.info(`target had ${a.bufArr.length} packets, wait remain from upstream ${a.remotePeerId}`),e.sendPartialBuffer(a.pieceMsg,a.bufArr,{from:"WaitForPartial"}),function(e,t){e.addDownloadListener(((e,s,n,i,r)=>{n?t.sendMsgPieceAbort(i):t.send(i),r&&(t.uploading=!1)}))}(a,e)):(s.info(`peer request ${n} wait for seg`),this.bufMgr.once(`${hls_next_events.BM_ADDED_SN_}${n}`,(t=>{t&&t.level===i?(s.info(`peer request notify seg ${t.sn}`),e.sendBuffer(t.sn,t.segId,t.data,{from:"NotifySegment",level:t.level,reverse:r})):e.sendPieceNotFound(n,o,{level:i})})))}))}handleMetaData(e,t){if(t.field){e.bitset=new BitsetManager(this.config.live,t.field);for(let e in t.field){const s=Number(e);if(s<0)continue;t.field[s].forEach((e=>{this.bitset.has(e,s)||this.bitCounts.incre(e,s)}))}this.addPeer(e),this.downloadOnly&&this.chokePeerRequest(e)}}peersHas(e,t){return this.bitCounts.has(e,t)}deletePeer(e){if(this.peerManager.hasPeer(e.remotePeerId)){const t=e.bitset.allArray();for(let e in t){const s=Number(e),n=t[s];n&&n.forEach((e=>{this.bitCounts.decre(e,s)}))}}this.cleanRequestingMap(e.remotePeerId),super.deletePeer(e)}hasAndSetTargetPeer(e,t,s){const{logger:n,config:i}=this;if(s<=this.allowP2pLimit)return!1;if(this.requestingMap.has(e,t)){const r=this.requestingMap.get(e,t),o=r.getOnePeer();if(!o)return this._searchAvailablePeers(e,t);if(performance.now()-o.timeSendRequest>3e3){if(!o.shouldWaitForRemain(1e3*(s-i.httpLoadTime))){n.warn(`${o.remotePeerId} prefetch timeout at ${e}`);const s=this.peerManager.getPeersOrderByWeight(),i=findPeersWithState(s,SegmentState.COMPLETE,e,t);if(r.hasReversePeer()){const n=i.concat(findPeersWithState(s,SegmentState.PARTIAL_FORWARD,e,t));if(n.length>0)return this.targetPeers.forwardPeer=n[0],!0}else{const n=i.concat(findPeersWithState(s,SegmentState.PARTIAL_REVERSE,e,t));if(n.length>0)return this.targetPeers.reversePeer=n[0],!0}return!1}n.info(`prefetch ${e} should wait for remain`)}return!0}return this._searchAvailablePeers(e,t)}_searchAvailablePeers(e,t){if(!this.hasIdlePeers||!this.peersHas(e,t))return!1;const s=this.peerManager.getPeersOrderByWeight(),[n,i]=getBestPairForDownload(s,e,t);return this.targetPeers={forwardPeer:n,reversePeer:i},[n,i].some((e=>!!e))}reportDCTraffic(e,t,s,n){if(!this.engine.fetcher)return void this.logger.error("DC report failed");const{fetcher:i}=this.engine;let r=s;this.bitset.has(e,t)||i.reportDCTraffic(r,n)}notifyAllPeers(e,t,s,n=SegmentState.COMPLETE){const{live:i}=this.config;if(this.bitset.has(e,t,n))return;const r=generateStateId(e,t,n);let o;n!==SegmentState.PARTIAL_REVERSE&&(o=n===SegmentState.COMPLETE);for(let a of this.peerManager.getPeerValues())if(!a.notifySet.has(r)&&!a.bitset.hasCompleteOr(e,t,n)&&(a.sendMsgHave(e,s,{level:t,reverse:n===SegmentState.PARTIAL_REVERSE,complete:o}),a.notifySet.add(r),i)){const e=20;for(;a.notifySet.size>e;){const e=[...a.notifySet.values()].shift();a.notifySet.delete(e)}}}startCheckPeersTimer(e=1){this.logger.info(`loaded peers ${this.loadedPeerNum} next checkDelay is ${e}`),this.loadedPeerNum=0,this.checkTimer||(this.checkTimer=setTimeout((()=>{this.checkPeers(),this.checkTimer=null,this.startCheckPeersTimer(calCheckPeersDelay(this.loadedPeerNum))}),1e3*e))}checkPeers(){if(!this.hasPeers)return;const{logger:e,config:t,engine:s}=this,n=t.live,{currentLevel:i}=s;if(e.info(`currentLevel ${i}`),0===this.bitCounts.size(i))return;if(!n&&this.nextLostSN>=0&&this.nextLostSN>=this.currPlaySN-10)return;if(this.mBufferedDuration<this.allowP2pLimit)return void e.info("low buffer time, skip prefetch");const r=this.peerManager.getPeersOrderByWeight();if(0===r.length)return;const o=[];let{prefetchNum:a,endSN:l,startSN:h}=t;n&&(a=1);let c=0,d=n?this.loadingSN+1:this.loadingSN+2;if(!n)if(this.loadingSN>=l&&!this.bufMgr.overflowed)d=h;else{const e=Math.min(...r.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<r.length&&c<this.maxPrefetchCount;){if(!n&&d>l)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 r)if(!o.includes(s)&&s.bitset.has(d,i)){const n=s.bitset.getState(d,i);let r;r=n===SegmentState.COMPLETE?0===randomNum(0,1):n===SegmentState.PARTIAL_REVERSE,o.push(s);const a=new Synthesizer(this.logger,d,i,t.httpRangeSupported);this._setupSynthesizer(a),r?a.setReversePeer(s):a.setForwardPeer(s),this.requestingMap.set(d,i,a),s.requestDataBySN(d,!1,{level:i,reverse:r}),e.info(`request prefetch ${d} level ${i} from peer ${s.remotePeerId} downloadNum ${s.downloadNum} reverse ${r}`);break}c++,d++}}this.loadedPeerNum=o.length}onBufferManagerLost(e,t,s,n){this.currLostSN=e,s&&(this.nextLostSN=s),this.bitset.delete(e,n),this.bitCounts.delete(e,n)}cleanRequestingMap(e){const t=this.peerManager.getPeer(e);for(let[s,n]of this.requestingMap.internalMap){const i=s.split("-"),r=Number(i[1]),o=Number(i[0]);n.hasPeerId(e)&&(this.logger.info(`delete ${s} in requestingMap`),n.deletePeer(t),this.bitCounts.decre(r,o),t&&t.bitset.delete(r,o))}}shouldWaitForNextSeg(){let e;return e=!this.isUploader&&(!!this.isReceiver||randomNum(0,100)>20),this.isReceiver=this.isUploader=!1,e}updateLoaded(e,t){this.bitset.has(e,t)||(this.bitset.add(e,t,SegmentState.COMPLETE),this.bitCounts.has(e,t)&&this.bitCounts.delete(e,t))}broadcastPlaylist(e,t){if(!this.config.live)return;const s=getMaxSequence(t);for(let n of this.peerManager.getPeerValues())n.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 n=s.getLatestPlaylist(e,t);if(n)return n}return null}getBufferedDuration(){let{media:e}=this.engine;if(!e){if(this.logger.info("try get video element"),e=tryGetVideoElement(this.config.videoElem),!e)return 5;this.engine.media=e}let t=0,s=e.currentTime,n=e.buffered;for(let e=n.length-1;e>=0;e--)if(s>=n.start(e)&&s<=n.end(e)){t=n.end(e)-s;break}return this.logger.info(`bufferedDuration ${t}`),this.mBufferedDuration=t,t>0?t:0}destroy(){super.destroy(),clearTimeout(this.checkTimer)}_notifySynthesizer(e,t,s,n,i){const r=this.requestingMap.get(s,n);function o(i){e.requestDataById(t,s,!0,{level:n,reverse:i})}r&&(r.hasForwardPeer()||i!==SegmentState.PARTIAL_FORWARD&&i!==SegmentState.COMPLETE||(r.setForwardPeer(e),o(!1)),r.hasReversePeer()||i!==SegmentState.PARTIAL_REVERSE&&i!==SegmentState.COMPLETE||(r.setReversePeer(e),o(!0)))}_setupEngine(){}}const MIN_TIME_FOR_LOAD=7.5,MAX_TIME_FOR_WAIT=4;class HlsSwScheduler extends Scheduler{constructor(e,t){super(e,t),this.server=t.fetcher,this.p2pEnabled=e.p2pEnabled,this.resolveMap=new Map,this.dcDownloadTimeout=10,this.fragMap=new Map,this.segmentId=t.segmentId}async handleGetMediaData(e,t){const{logger:s,config:n}=this;let{url:i,range:r}=e;r&&(i=`${i}|${r}`);const o=this.fragMap.get(i);if(!o)return s.info(`cannot get frag ${i}`),t.postMessage({action:hls_next_events.SW_GET_MEDIA});this.engine.currentLevelIndex=o.level;const{sn:a,baseurl:l,level:h}=o,c=this.segmentId(String(h),a,e.url,r);this.loadingSN=a,this.loadingSegId=c;const d=this.bufMgr.getSegById(c);if(d)return s.info(`bufMgr found seg sn ${a} segId ${c}`),o.loaded=d.data.byteLength,o.fromPeerId=d.fromPeerId,this.engine.emit(hls_next_events.FRAG_LOADED,{url:e.url,sn:a,level:h,segId:c,loaded:o.loaded,duration:o.duration,byP2p:!!d.fromPeerId,fromPeerId:d.fromPeerId}),this._onFragLoaded(e.url,o),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:e.url,buffer:d.data,incomplete:!1}});if(this.resolveMap.has(a))return s.warn(`${a} is requesting, fallback`),void t.postMessage({action:hls_next_events.SW_GET_MEDIA});const u=this.getBufferedDuration();if(this.hasAndSetTargetPeer(a,h,u)){await this._loadFragByP2p(o,t,a,c,e.url,h)||(this.notifyAllPeers(a,h,c),t.postMessage({action:hls_next_events.SW_GET_MEDIA}))}else if(n.live&&void 0===this.waitTimer&&u>MIN_TIME_FOR_LOAD&&this.shouldWaitForNextSeg()){let n,i=u-MIN_TIME_FOR_LOAD;i>MAX_TIME_FOR_WAIT&&(i=MAX_TIME_FOR_WAIT);const r=async s=>{c===s&&(this.off(hls_next_events.SCH_DCHAVE,r),clearTimeout(this.waitTimer),this.waitTimer=void 0,this.hasAndSetTargetPeer(a,h,u)&&(n=await this._loadFragByP2p(o,t,a,c,e.url,h)),n||(this.notifyAllPeers(a,h,c),t.postMessage({action:hls_next_events.SW_GET_MEDIA})))};s.info(`wait peer have ${c} for ${i}s`),this.on(hls_next_events.SCH_DCHAVE,r),this.waitTimer=setTimeout((()=>{this.off(hls_next_events.SCH_DCHAVE,r),this.notifyAllPeers(a,h,c),t.postMessage({action:hls_next_events.SW_GET_MEDIA}),this.waitTimer=void 0}),1e3*i)}else t.postMessage({action:hls_next_events.SW_GET_MEDIA}),this.notifyAllPeers(a,h,c)}async _loadFragByP2p(e,t,s,n,i,r){const{logger:o}=this;o.info(`p2p load sn ${s} segId ${n} level ${r}`);const a=await this.load(s,n,r);if(a&&(a.data||a.incomplete)){const{data:l,incomplete:h,fromPeerId:c,bufferLeft:d,bufferRight:u,size:g}=a;if(h)o.info(`p2p loaded partial segId ${n} level ${r} size ${g}`),e.loaded=(d?d.byteLength:0)+(u?u.byteLength:0);else{if(o.info(`p2p loaded segId ${n} level ${r} size ${l.byteLength} incomplete ${h}`),!this.bufMgr.hasSegOfId(n)){const e=new core_segment(s,n,l,c,r);o.info(`bufMgr putSeg ${s} level ${r}`),this.bufMgr.putSeg(e)}e.loaded=l.byteLength}return e.fromPeerId=c,this.engine.emit(hls_next_events.FRAG_LOADED,{url:i,sn:s,level:r,segId:n,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:l,bufferLeft:d,bufferRight:u,incomplete:h,size:g}}),!0}o.warn(`P2P timeout load segId ${n}`);const l=this.bufMgr.getSegById(n);return!!l&&(o.info(`already loaded seg sn ${s} segId ${n}`),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:i,buffer:l.data,incomplete:!1}}),!0)}handleMediaData(e,t){const{config:s,logger:n,engine:i}=this;let{url:r,buffer:o,range:a}=e;if(i.rangeTestUrl===r)return void(i.rangeTestUrl="");n.info(`SW_MEDIA url ${r} size ${o.byteLength} range ${a}`),a&&(r=`${r}|${a}`),this.server.reportFlow(o.byteLength);const l=this.fragMap.get(r);if(l){const{sn:t,level:s,baseurl:r}=l,h=this.segmentId(String(s),t,e.url,a);if(l.segId=h,l.loaded=o.byteLength,i.emit(hls_next_events.FRAG_LOADED,{url:e.url,sn:t,level:s,segId:h,loaded:l.loaded,duration:l.duration,byP2p:!1}),this._onFragLoaded(e.url,l),!this.bufMgr.hasSegOfId(h)){const e=new core_segment(t,h,o,"",s);this.bufMgr.putSeg(e),n.info(`bufMgr putSeg ${h} level ${s}`)}}t.postMessage({action:hls_next_events.SW_MEDIA})}notifySWMessage(e,t,s){switch(e){case hls_next_events.SW_MEDIA:this.handleMediaData(t,s);break;case hls_next_events.SW_GET_MEDIA:this.handleGetMediaData(t,s);break;default:this.logger.warn(`unknown action ${e}`)}}destroy(){super.destroy(),this.logger.warn("destroy HlsSwScheduler")}_onFragLoaded(e,t){if(this.updateLoaded(t.sn,t.level),!this.engine)return;const{media:s,targetDuration:n}=this.engine;!this.config.live&&s&&n&&(this.currPlaySN=Math.ceil(s.currentTime/n))}load(e,t,s){const{logger:n,config:i}=this;this.isReceiver=!0;let r=this.mBufferedDuration-this.config.httpLoadTime;r>this.dcDownloadTimeout&&(r=this.dcDownloadTimeout);let o=this.requestingMap.get(e,s),a={allowLoadPartial:i.httpRangeSupported};o?o.setExtra(a):(o=new Synthesizer(this.logger,e,s,i.httpRangeSupported,a),this._setupSynthesizer(o),this.requestingMap.set(e,s,o)),o.setTimeout(1e3*r);const{forwardPeer:l,reversePeer:h}=this.targetPeers;l&&(o.setForwardPeer(l),l.requestDataById(t,e,!0,{level:s})),h&&(o.setReversePeer(h),h.requestDataById(t,e,!0,{level:s,reverse:!0}));const c=new Promise((n=>{const i={resolve:n,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:n,logger:i}=this,{segId:r,sn:o,data:a,level:l}=t,{speed:h}=s,c=this.resolveMap.has(o);if(n.validateSegment(r,a)){this.notifyAllPeers(o,l,r),s.http&&this.engine.fetcher.reportFlow(s.http),s.p2p&&super.reportDCTraffic(o,l,s.p2p,h);const t=e.getFromPeerId();if(c){i.info(`receive criticalSeg seg_id ${r}`);const e=this.resolveMap.get(o);this.resolveMap.delete(o),e.resolve({data:a,fromPeerId:t})}else{if(this.bitset.has(o,l))return;const e=new core_segment(o,r,a,t,l);this.bufMgr.putSeg(e),this.updateLoaded(o,l)}}else if(i.warn(`segment ${r} validate failed`),c){const e=this.resolveMap.get(o);this.resolveMap.delete(o),e.resolve()}e.destroy(),this.requestingMap.delete(o,l),n.live&&0===this.resolveMap.size&&this.checkPeers()})).on(hls_next_events.SYN_PARTIAL,((t,s,n)=>{const{sn:i,level:r,size:o}=t;if(this.resolveMap.has(i)){this.resolveMap.get(i).resolve({bufferLeft:s,bufferRight:n,fromPeerId:e.getFromPeerId(),incomplete:!0,size:o}),this.resolveMap.delete(i)}e.destroy(),this.requestingMap.delete(i,r)})).on(hls_next_events.SYN_ERROR,(t=>{const{sn:s,level:n}=t;if(this.resolveMap.has(s)){const e=this.resolveMap.get(s);this.resolveMap.delete(s),e.resolve()}e.destroy(),this.requestingMap.delete(s,n)}))}_handleDCHave(e,t,s,n){const i=0!==this.resolveMap.size;if(i&&this.resolveMap.has(t)){const{segId:i}=this.resolveMap.get(t);this._notifySynthesizer(e,i,t,s,n)}this.config.live&&!i&&queue_microtask_default()((()=>{this.checkPeers()}))}}const hls_sw_scheduler=HlsSwScheduler;class HlsSwP2pEngine extends Engine{static get name(){return"HlsSwP2pEngine"}static isSeviceWorkerSupported(){return"serviceWorker"in navigator}constructor(e={}){super(e),this.swSupported=isSecureContext,this.levels=[],this.currentLevelIndex=0,this.rangeTestUrl="",this.currentSrc="",this.swVersion="",this.media=tryGetVideoElement(this.config.videoElem),HlsSwP2pEngine.isSeviceWorkerSupported()||(this.swSupported=!1,console.warn("service worker is not supported"));const{channelIdMaker:t,signalId:s,browserInfo:n}=this.setup();this.onLevelLoaded=e=>{const{config:i}=this,r=e.live;i.live=r,this.targetDuration=e.averagetargetduration,r||(i.trickleICE=!0),this.browserInfo={...n,live:r,abr:this.multiBitrate||void 0,type:"hls_sw"},this.channel=`${t(this.currentSrc)}|${s}[${peer.VERSION}]`,this.setupElectron();const o=this.initLogger();o.info("use HlsSwP2pEngine"),o.info(`engine version: ${engine_base.version} hls-proxy version: ${this.swVersion}`),o.info(`channel ${this.channel}`),r||(i.startSN=e.startSN,i.endSN=e.endSN,o.info(`startSN ${e.startSN} endSN ${e.endSN}`)),this._init(this.channel,this.browserInfo),this.off(hls_next_events.LEVEL_LOADED,this.onLevelLoaded)},this.on(hls_next_events.LEVEL_LOADED,this.onLevelLoaded),this.onManifestParsed=(e,t)=>{this.multiBitrate=e.length>1,this.currentSrc=t,this.off(hls_next_events.MANIFEST_PARSED,this.onManifestParsed)},this.on(hls_next_events.MANIFEST_PARSED,this.onManifestParsed),this.onFragLoaded=({url:e})=>{!this.rangeTested&&this.config.useHttpRange&&(this.rangeTestUrl=e,performRangeRequest(e).then((()=>{this.config.httpRangeSupported=!0,this.config.logger.info("http range is supported")})).catch((()=>{this.config.httpRangeSupported=!1,this.config.logger.warn("http range is not supported")})),this.rangeTested=!0),this.off(hls_next_events.FRAG_LOADED,this.onFragLoaded)},this.once(hls_next_events.FRAG_LOADED,this.onFragLoaded),this.swSupported&&(navigator.serviceWorker.onmessage=e=>{const{action:t,data:s}=e.data;this.logger&&this.logger.info(`engine onmessage action ${t}`);const n=e.ports[0];if(n.postMessage({action:t,pong:!0}),!this.p2pEnabled||!s)return n.postMessage({action:t});switch(t){case hls_next_events.SW_PLAYLIST:this.handlePlaylist(s,n);break;case hls_next_events.SW_GET_PLAYLIST:this.handleGetPlaylist(s,n);break;default:this.config.scheduler&&this.config.scheduler.notifySWMessage(t,s,n)}}),this.config.swAutoRegister&&this.registerServiceWorker().then((function(e){})).catch((e=>{console.warn("ServiceWorker registration failed ",e)}))}get currentLevel(){return this.currentLevelIndex}handlePlaylist(e,t){const{config:s,logger:n}=this,{url:i,text:r,ver:o}=e;if(this.swVersion=o,0!==r.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:n&&n.isDebugLevel,sharePlaylist:!!s.sharePlaylist}}),this._parsePlaylist(r,i.split("?")[0])}_parsePlaylist(e,t){const{config:s,logger:n}=this;if(e.indexOf("#EXTINF:")>0||e.indexOf("#EXT-X-TARGETDURATION:")>0){let n=0;const i=M3U8Parser.parseLevelPlaylist(e,t);this.levels.length>0?(n=this.levels.indexOf(i.url),-1===n?(this.restartP2p(),this.currentSrc=t,n=0):this.currentLevelIndex=n):(""!==this.currentSrc&&t!==this.currentSrc&&this.restartP2p(),this.currentSrc=t,this.levels=[t]),this.emit(hls_next_events.LEVEL_LOADED,i);const{fragMap:r}=s.scheduler;s.live&&r.clear(),i.fragments.forEach((e=>{e.level=n;let t=url_toolkit_default().buildAbsoluteURL(e.baseurl,e.relurl,{alwaysNormalize:!0});const s=e.byteRange;2===s.length&&(t=`${t}|bytes=${s[0]}-${s[1]-1}`),r.set(t,e)})),s.sharePlaylist&&s.scheduler&&s.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,t)}}handleGetPlaylist(e,t){const{config:s,logger:n}=this;if(!n)return t.postMessage({action:hls_next_events.SW_GET_PLAYLIST});const{scheduler:i}=s;if(!i)return void n.warn("scheduler not found");const{url:r}=e,o=r.split("?")[0];if(i.playlistInfo.has(o)){const e=i.getPlaylistFromPeer(o);if(e&&e.data){const{data:s,seq:i}=e;return n.info(`got playlist from peer seq ${i}`),t.postMessage({action:hls_next_events.SW_GET_PLAYLIST,data:{text:s}}),void this._parsePlaylist(s,r)}}return t.postMessage({action:hls_next_events.SW_GET_PLAYLIST})}async registerServiceWorker(){const{logger:e,config:t}=this;if(!this.swSupported){let t="sw is not supported";return isHttps||(t="https is required when using ServiceWorker",e.error(t)),Promise.reject(t)}this.media=tryGetVideoElement(this.config.videoElem),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,n)=>{const i=()=>{"activated"===t.state?(t.removeEventListener("statechange",i),s(e)):"redundant"===t.state&&n("sw is redundant")};t.addEventListener("statechange",i)}))}))))}unregisterServiceWorker(){const{config:e}=this,t="serviceWorker is not registered";return new Promise(((s,n)=>{const{serviceWorker:i}=navigator;i||n(t),i.getRegistration(e.swFile).then((e=>{e?e.unregister().then((()=>{s()})).catch((()=>{n(t)})):n(t)}))}))}_init(e,t){if(!this.p2pEnabled)return;this.bufMgr=new segment_cache(this,this.config);let s=new server(this,this.config.token,encodeURIComponent(e),this.config.announce||"",t);this.fetcher=s,this.config.fetcher=s;let n=new hls_sw_scheduler(this,this.config);n.bufferManager=this.bufMgr,this.tracker=new tracker_client(this,s,n,this.config),this.config.scheduler=this.tracker.scheduler,this.p2pEnabled&&!this.tracker.connected&&this.tracker.resumeP2P(),this.setupWindowListeners()}restartP2p(){this.logger&&this.logger.warn("restart P2P"),this.disableP2P(),this.enableP2P(),this.on(hls_next_events.LEVEL_LOADED,this.onLevelLoaded),this.on(hls_next_events.MANIFEST_PARSED,this.onManifestParsed),this.on(hls_next_events.FRAG_LOADED,this.onFragLoaded)}enableP2P(){return this.p2pEnabled?null:(this.logger&&this.logger.info("enable P2P"),this.config.p2pEnabled=this.p2pEnabled=!0,this)}disableP2P(){this.logger&&this.logger.warn("disable P2P"),this.p2pEnabled&&(this.config.p2pEnabled=this.p2pEnabled=!1,this.tracker&&(this.tracker.stopP2P(),this.tracker={},this.fetcher=null,this.bufMgr.destroy(),this.bufMgr=null)),this.levels=[],this.currentLevelIndex=0,this.lastLevel=0,this.multiBitrate=!1,this.rangeTested=!1,this.rangeTestUrl="",this.currentSrc="",this.media=void 0,this.config.live=!1,this.removeAllListeners(hls_next_events.MANIFEST_PARSED),this.removeAllListeners(hls_next_events.LEVEL_LOADED)}}const hls_sw_p2pengine=HlsSwP2pEngine;function isBlockType(e,t){const s=url_toolkit_default().parseURL(e),n=s.path.substring(s.path.lastIndexOf(".")+1);return-1!==t.indexOf(n)}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,n,i,r,o;const a=performance.now();s=a-300,n=a-200,i=a,e.trequest=s,e.tfirst=n,e.tload=i,e.loading={first:s,start:n,end:i},r=o=t,e.loaded=r,e.total=o}const frag_loader_MIN_TIME_FOR_LOAD=7.5,frag_loader_MAX_TIME_FOR_WAIT=4.5;class FragLoader extends(events_default()){constructor(e){super(),this.logger=e.logger;const{scheduler:t,fetcher:s,p2pBlackList:n,isHlsV0:i}=window.__p2p_loader__;this.isHlsV0=i,this.bufMgr=e.bufMgr,this.xhrLoader=new e.loader(e),this.p2pEnabled=e.p2pEnabled,this.isLive=e.live,this.scheduler=t,this.fetcher=s,this.segmentId=e.segmentId,this.blockTypes=n,this.forbidden=s.forbidden,this.stats=this.xhrLoader.stats||createLoadStats()}destroy(){this.xhrLoader.destroy()}abort(){this.xhrLoader.abort()}load(e,t,s){const{logger:n,scheduler:i}=this,r=e.frag;this.isHlsV0||(r.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(r.level),r.sn,r.url,t)}if(!r.url||isBlockType(r.url,this.blockTypes))return n.info(`HTTP load blockType ${r.url}`),e.frag.loadByHTTP=!0,this.xhrLoader.load(e,t,s);if(this.forbidden)return;t.maxRetry=2;const a=i.getBufferedDuration();if(this.p2pEnabled&&this.bufMgr.hasSegOfId(o)){n.info(`bufMgr found seg sn ${r.sn} segId ${o} level ${r.level}`);let t=this.bufMgr.getSegById(o);const i=copyBuffer(t.data);let a=new Uint8Array(i).buffer,l={url:e.url,data:a};updateLoadStats(this.stats,t.size),r.loaded=t.size,r.loadByP2P=!0,e.frag.fromPeerId=t.fromPeerId,queue_microtask_default()((()=>{!this.isHlsV0&&s.onProgress&&s.onProgress(this.stats,e,l.data),s.onSuccess(l,this.stats,e)}))}else if(this.p2pEnabled&&i.hasAndSetTargetPeer(r.sn,r.level,a))this.loadFragByP2p(e,t,s,o);else if(n.info(`fragLoader load ${o} at ${r.sn} level ${r.level} buffered ${a}`),this.isLive&&i.hasIdlePeers&&a>frag_loader_MIN_TIME_FOR_LOAD&&i.shouldWaitForNextSeg()){let l=a-frag_loader_MIN_TIME_FOR_LOAD;l>frag_loader_MAX_TIME_FOR_WAIT&&(l=frag_loader_MAX_TIME_FOR_WAIT);const h=n=>{n===o&&(i.off(hls_next_events.SCH_DCHAVE,h),clearTimeout(this.waitTimer),i.hasAndSetTargetPeer(r.sn,r.level,a)?this.loadFragByP2p(e,t,s,o):this.loadFragByHttp(e,t,s,o))};n.info(`wait peer have for ${l}s`),i.on(hls_next_events.SCH_DCHAVE,h),this.waitTimer=setTimeout((()=>{this.loadFragByHttp(e,t,s,o),i.off(hls_next_events.SCH_DCHAVE,h)}),1e3*l)}else this.loadFragByHttp(e,t,s,o)}loadFragByHttp(e,t,s,n){const{logger:i,scheduler:r}=this;r.isReceiver=!1;const o=e.frag;if(this.isHlsV0){const e=s.onSuccess;s.onSuccess=(t,s,r)=>{if(!this.bufMgr.hasSegOfId(n)){const e=copyBuffer(t.data),s=new core_segment(o.sn,n,e,this.fetcher.peerId,o.level);this.bufMgr.putSeg(s)}this.fetcher.reportFlow(s.total);let a=s.tload-s.trequest;i.info(`HTTP loaded ${n} time ${a}ms`),e(t,s,r)};const t=s.onProgress;s.onProgress=(e,i,a)=>{r.notifyAllPeers(o.sn,o.level,n),s.onProgress=t,t(e,i,a)}}else if(s.onProgress){const e=s.onProgress;s.onProgress=(t,s,a)=>{if(r.notifyAllPeers(o.sn,o.level,n),!this.bufMgr.hasSegOfId(n)){const e=copyBuffer(a),t=new core_segment(o.sn,n,e,this.fetcher.peerId,o.level);this.bufMgr.putSeg(t)}this.fetcher.reportFlow(t.total),o.loaded=t.total;let l=t.loading.end-t.loading.start;i.info(`HTTP loaded ${n} time ${l}ms`),e(t,s,a)}}e.frag.loadByHTTP=!0,this.xhrLoader.load(e,t,s)}loadFragByP2p(e,t,s,n){const{logger:i}=this,r=e.frag;this.scheduler.load(e,t,s);const o=s.onSuccess,a=s.onTimeout;s.onTimeout=(e,l)=>{i.warn(`P2P timeout switched to HTTP load ${r.relurl} at ${r.sn}`),s.onSuccess=o,this.loadFragByHttp(l,t,s,n),s.onTimeout=a},s.onSuccess=(e,t,a)=>{if(!this.bufMgr.hasSegOfId(n)){const t=copyBuffer(e.data),s=new core_segment(r.sn,n,t,r.fromPeerId||this.fetcher.peerId,r.level);this.bufMgr.putSeg(s)}r.loadByP2P||this.fetcher.reportFlow(t.total),r.loaded=t.loaded,i.info(`${r.loadByP2P?"P2P":"HTTP"} loaded segment id ${n}`),!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:n}=this,{url:i}=e,r=i.split("?")[0],o=s.onSuccess;if(s.onSuccess=(e,t,s)=>{this.scheduler.broadcastPlaylist(r,e.data),o(e,t,s)},this.scheduler.playlistInfo.has(r)){const t=this.scheduler.getPlaylistFromPeer(r);if(t&&t.data){const{data:r,seq:o}=t;n.info(`got playlist from peer seq ${o}`),updateLoadStats(this.stats,r.length);let a={url:i,data:r};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)}updatePlaySN(e){this.currPlaySN=e}load(e,t,s){this.isReceiver=!0;const{logger:n,config:i}=this;this.context=e;const{rangeStart:r,rangeEnd:o,url:a}=e,l=e.frag,{segId:h,sn:c,level:d}=l;this.callbacks=s,this.stats=createLoadStats(),this.criticalSeg={sn:c,level:d,segId:h};let u=this.mBufferedDuration-i.httpLoadTime;u>this.dcDownloadTimeout&&(u=this.dcDownloadTimeout);let g=this.requestingMap.get(c,d);const f={rangeStart:Number(r),rangeEnd:Number(o),url:a,httpLoadTime:1e3*i.httpLoadTime-500,xhrSetup:i.xhrSetup};g?g.setExtra(f):(g=new Synthesizer(this.logger,c,d,i.httpRangeSupported,f),this._setupSynthesizer(g),this.requestingMap.set(c,d,g)),g.setTimeout(1e3*u);const{forwardPeer:_,reversePeer:p}=this.targetPeers;_&&(g.setForwardPeer(_),_.requestDataById(h,c,!0,{level:d})),p&&(g.setReversePeer(p),p.requestDataById(h,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:n,logger:i}=this,{segId:r,sn:o,data:a,level:l}=t,{speed:h}=s,c=this.criticalSeg&&this.criticalSeg.segId===r;if(n.validateSegment(r,a)){this.notifyAllPeers(o,l,r),s.http&&this.engine.fetcher.reportFlow(s.http),s.p2p&&super.reportDCTraffic(o,l,s.p2p,h);const t=e.getFromPeerId();if(c){i.info(`receive criticalSeg seg_id ${r}`);let e=this.stats;e.tfirst=e.loading.first=Math.max(e.trequest,performance.now()),e.tload=e.loading.end=e.tfirst,e.loaded=e.total=a.byteLength,this.criticalSeg=null;const{frag:s}=this.context;s.fromPeerId=t,s.loadByP2P=!0,this.callbacks.onSuccess({data:a,url:this.context.url},e,this.context)}else{if(this.bitset.has(o,l))return;const e=new core_segment(o,r,a,t,l);this.bufMgr.putSeg(e),this.updateLoaded(o,l)}}else i.warn(`segment ${r} validate failed`),c&&this.callbacks.onTimeout(this.stats,this.context,null);e.destroy(),this.requestingMap.delete(o,l),n.live&&!this.criticalSeg&&this.checkPeers()})).on(hls_next_events.SYN_ERROR,(t=>{const{sn:s,level:n}=t;this.criticalSeg&&this.criticalSeg.sn===s&&(this.criticalSeg=null,this.callbacks.onTimeout(this.stats,this.context,null)),e.destroy(),this.requestingMap.delete(s,n)}))}_setupEngine(){super._setupEngine(),this.engine.on(hls_next_events.FRAG_LOADING,(({sn:e,segId:t,byHttp:s,level:n})=>{this.loadingSN=e,this.loadingSegId=t})).on(hls_next_events.FRAG_LOADED,(({sn:e,segId:t,byP2p:s,level:n})=>{this.updateLoaded(e,n)})).on(hls_next_events.FRAG_CHANGED,(({sn:e})=>{this.updatePlaySN(e)}))}_handleDCHave(e,t,s,n){this.criticalSeg&&this.criticalSeg.sn===t&&this.criticalSeg.level===s&&this._notifySynthesizer(e,this.criticalSeg.segId,t,s,n),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;const{channelIdMaker:s,signalId:n,browserInfo:i}=this.setup();e.config.segmentId=this.config.segmentId;const r=(t,o)=>{const{config:a}=this,l=o.details,h=l.live;a.live=this.hlsjs.config.live=h,h||(a.trickleICE=!0),this.browserInfo={...i,live:h,abr:this.multiBitrate||void 0,type:"hls"},this.channel=`${s(e.url)}|${n}[${peer.VERSION}]`,this.setupElectron();const c=this.initLogger();c.info("use HlsjsP2pEngine"),this.logger=this.hlsjs.config.logger=c,c.info(`channel ${this.channel}`),h||(a.startSN=l.startSN,a.endSN=l.endSN,c.info(`startSN ${l.startSN} endSN ${l.endSN}`)),this.eventListened=!1,this._init(this.channel,this.browserInfo),e.off(this.HLSEvents.LEVEL_LOADED,r)};e.on(this.HLSEvents.LEVEL_LOADED,r);const o=(t,s)=>{const n=s.levels.length;this.multiBitrate=n>1,e.off(this.HLSEvents.MANIFEST_PARSED,o)};e.on(this.HLSEvents.MANIFEST_PARSED,o)}_init(e,t){if(!this.p2pEnabled)return;this.hlsjs.config.p2pEnabled=this.p2pEnabled,this.hlsjs.config.sharePlaylist=this.config.sharePlaylist,this.bufMgr=new segment_cache(this,this.config),this.hlsjs.config.bufMgr=this.bufMgr,this.media=this.hlsjs.media;let s=new server(this,this.config.token,encodeURIComponent(e),this.config.announce||"",t);this.fetcher=s;const n=new hlsjs_scheduler(this,this.config);this.tracker=new tracker_client(this,s,n,this.config),n.bufferManager=this.bufMgr,this.hlsjs.config.fLoader=frag_loader,this.config.sharePlaylist&&(this.hlsjs.config.pLoader=playlist_loader),window.__p2p_loader__={scheduler:this.tracker.scheduler,fetcher:s,p2pBlackList:this.config.p2pBlackList,isHlsV0:this.config.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||!this.config.p2pEnabled||(this.tracker.resumeP2P(),this.trackerTried=!0)}_onFragLoading(e,t){const s=t.frag;let{sn:n,level:i,segId:r}=s;if(!isBlockType(s.url,this.config.p2pBlackList)){if(this.logger.debug("loading frag "+n),!r){let e;s._byteRange&&(e="bytes="+s._byteRange[0]+"-"+s._byteRange[1]);let n=s.url;r=t.frag.segId=this.config.segmentId(String(i),s.sn,n,e)}this.emit(hls_next_events.FRAG_LOADING,{sn:n,segId:r,byHttp:s.loadByHTTP,level:i})}}_onFragLoaded(e,t){const{sn:s,segId:n,loaded:i,duration:r,level:o,fromPeerId:a,loadByP2P:l,url:h}=t.frag,{config:c,logger:d}=this;isBlockType(t.frag.url,c.p2pBlackList)||(this.emit(hls_next_events.FRAG_LOADED,{url:h,sn:s,level:o,segId:n,loaded:i,duration:r,byP2p:!!l,fromPeerId:a}),!this.rangeTested&&c.useHttpRange&&(performRangeRequest(t.frag.url,void 0,c.xhrSetup).then((()=>{c.httpRangeSupported=!0,d.info("http range is supported"),c.httpLoadTime-=1.5,c.httpLoadTime<1.5&&(c.httpLoadTime=1.5),c.simultaneousTargetPeers=1})).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){const{logger:s}=this;t.fatal?s.error(`${t.type} details ${t.details} reason ${t.reason}`):s.warn(`${t.type} details ${t.details} reason ${t.reason}`);const n=this.hlsjs.constructor.ErrorDetails;switch(t.details){case n.BUFFER_STALLED_ERROR:this.fetcher&&this.fetcher.errsBufStalled++;break;case n.INTERNAL_EXCEPTION:this.fetcher&&(this.fetcher.errsInternalExpt++,this.fetcher.exptMsg=t.err.message),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"'),n=!t||t.prototype&&"function"==typeof t.prototype.appendBuffer&&"function"==typeof t.prototype.remove;return!!s&&!!n}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.isSeviceWorkerSupported())}static isSeviceWorkerSupported(){return hls_sw_p2pengine.isSeviceWorkerSupported()}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(){"function"==typeof this._realEngine.registerServiceWorker&&this._realEngine.registerServiceWorker()}unregisterServiceWorker(){"function"==typeof this._realEngine.unregisterServiceWorker&&this._realEngine.unregisterServiceWorker()}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__})()));
|