From c110e8fef3d189c69e844d4c0c34c6c4a753749c Mon Sep 17 00:00:00 2001 From: Leo Herzog Date: Tue, 10 Nov 2020 17:08:06 -0500 Subject: [PATCH] Add Social Icons and Web Manifest --- bundle.js | 2 ++ bundle.min.js | 2 +- favicon.ico | Bin 0 -> 31398 bytes img/TorrentParts-Favicon-16.png | Bin 0 -> 430 bytes img/TorrentParts-Favicon-32.png | Bin 0 -> 676 bytes img/TorrentParts-Favicon.psd | Bin 0 -> 6911 bytes img/TorrentParts-Icon-.5x.png | Bin 0 -> 849 bytes img/TorrentParts-Icon-1x.png | Bin 0 -> 1569 bytes img/TorrentParts-Icon-2x.png | Bin 0 -> 2456 bytes img/TorrentParts-Icon.psd | Bin 0 -> 25971 bytes img/TorrentParts-Social.png | Bin 0 -> 9379 bytes img/TorrentParts-Social.psd | Bin 0 -> 215865 bytes index.html | 21 +++++++++++++++++++++ parse.js | 2 ++ site.webmanifest | 26 ++++++++++++++++++++++++++ 15 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 favicon.ico create mode 100644 img/TorrentParts-Favicon-16.png create mode 100644 img/TorrentParts-Favicon-32.png create mode 100644 img/TorrentParts-Favicon.psd create mode 100644 img/TorrentParts-Icon-.5x.png create mode 100644 img/TorrentParts-Icon-1x.png create mode 100644 img/TorrentParts-Icon-2x.png create mode 100644 img/TorrentParts-Icon.psd create mode 100644 img/TorrentParts-Social.png create mode 100644 img/TorrentParts-Social.psd create mode 100644 site.webmanifest diff --git a/bundle.js b/bundle.js index c8ed381..57f2541 100644 --- a/bundle.js +++ b/bundle.js @@ -33961,6 +33961,8 @@ function propertyChange(e) { function resetProperties() { document.getElementById('magnet').value = ""; document.getElementById('torrent').value = ""; + originalSourceIcon.innerHTML = ''; + originalSourceIcon.title = ''; properties.style.display = 'none'; name.value = ""; created.value = ""; diff --git a/bundle.min.js b/bundle.min.js index 0ae35f5..3fa3482 100644 --- a/bundle.min.js +++ b/bundle.min.js @@ -78,4 +78,4 @@ const i=e("debug")("torrent-discovery"),s=e("bittorrent-dht/client"),r=e("events /*! ut_metadata. MIT License. WebTorrent LLC */ const{EventEmitter:i}=e("events"),s=e("bencode"),r=e("bitfield").default,a=e("debug")("ut_metadata"),o=e("simple-sha1"),c=16384;t.exports=e=>{class t extends i{constructor(t){super(),this._wire=t,this._fetching=!1,this._metadataComplete=!1,this._metadataSize=null,this._remainingRejects=null,this._bitfield=new r(0,{grow:1e3}),n.isBuffer(e)&&this.setMetadata(e)}onHandshake(e,t,n){this._infoHash=e}onExtendedHandshake(e){return e.m&&e.m.ut_metadata?e.metadata_size?"number"!=typeof e.metadata_size||1e7this._metadataSize&&(n=this._metadataSize);const i=this.metadata.slice(t,n);this._data(e,i,this._metadataSize)}_onData(e,t,n){t.length>c||!this._fetching||(t.copy(this.metadata,e*c),this._bitfield.set(e),this._checkDone())}_onReject(e){this._remainingRejects>0&&this._fetching?(this._request(e),this._remainingRejects-=1):this.emit("warning",new Error('Peer sent "reject" too much'))}_requestPieces(){if(this._fetching){this.metadata=n.alloc(this._metadataSize);for(let e=0;e0?this._requestPieces():this.emit("warning",new Error("Peer sent invalid metadata"))}}return t.prototype.name="ut_metadata",t}}).call(this)}).call(this,e("buffer").Buffer)},{bencode:6,bitfield:300,buffer:59,debug:301,events:97,"simple-sha1":241}],300:[function(e,t,n){arguments[4][11][0].apply(n,arguments)},{dup:11}],301:[function(e,t,n){arguments[4][12][0].apply(n,arguments)},{"./common":302,_process:186,dup:12}],302:[function(e,t,n){arguments[4][13][0].apply(n,arguments)},{dup:13,ms:303}],303:[function(e,t,n){arguments[4][14][0].apply(n,arguments)},{dup:14}],304:[function(e,t,n){(function(e){(function(){function n(t){try{if(!e.localStorage)return!1}catch(e){return!1}var n=e.localStorage[t];return null!=n&&"true"===String(n).toLowerCase()}t.exports=function(e,t){if(n("noDeprecation"))return e;var i=!1;return function(){if(!i){if(n("throwDeprecation"))throw new Error(t);n("traceDeprecation")?console.trace(t):console.warn(t),i=!0}return e.apply(this,arguments)}}}).call(this)}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],305:[function(e,t,n){(function(n){(function(){const i=e("binary-search"),s=e("events"),r=e("mp4-stream"),a=e("mp4-box-encoding"),o=e("range-slice-stream");class c{constructor(e,t){this._entries=e,this._countName=t||"count",this._index=0,this._offset=0,this.value=this._entries[0]}inc(){this._offset++,this._offset>=this._entries[this._index][this._countName]&&(this._index++,this._offset=0),this.value=this._entries[this._index]}}const l=1;t.exports=class extends s{constructor(e){super(),this._tracks=[],this._file=e,this._decoder=null,this._findMoov(0)}_findMoov(e){this._decoder&&this._decoder.destroy();let t=0;this._decoder=r.decode();const n=this._file.createReadStream({start:e});n.pipe(this._decoder);const i=s=>{"moov"===s.type?(this._decoder.removeListener("box",i),this._decoder.decode((e=>{n.destroy();try{this._processMoov(e)}catch(e){e.message="Cannot parse mp4 file: "+e.message,this.emit("error",e)}}))):s.length<4096?(t+=s.length,this._decoder.ignore()):(this._decoder.removeListener("box",i),t+=s.length,n.destroy(),this._decoder.destroy(),this._findMoov(e+t))};this._decoder.on("box",i)}_processMoov(e){const t=e.traks;this._tracks=[],this._hasVideo=!1,this._hasAudio=!1;for(let n=0;n=r.stsz.entries.length)break;if(h++,m+=e,h>=i.samplesPerChunk){h=0,m=0,f++;const e=r.stsc.entries[g+1];e&&f+1>=e.firstChunk&&g++}v+=t,b.inc(),x&&x.inc(),s&&_++}s.mdia.mdhd.duration=0,s.tkhd.duration=0;const y=i.sampleDescriptionId,w={type:"moov",mvhd:e.mvhd,traks:[{tkhd:s.tkhd,mdia:{mdhd:s.mdia.mdhd,hdlr:s.mdia.hdlr,elng:s.mdia.elng,minf:{vmhd:s.mdia.minf.vmhd,smhd:s.mdia.minf.smhd,dinf:s.mdia.minf.dinf,stbl:{stsd:r.stsd,stts:{version:0,flags:0,entries:[]},ctts:{version:0,flags:0,entries:[]},stsc:{version:0,flags:0,entries:[]},stsz:{version:0,flags:0,entries:[]},stco:{version:0,flags:0,entries:[]},stss:{version:0,flags:0,entries:[]}}}}}],mvex:{mehd:{fragmentDuration:e.mvhd.duration},trexs:[{trackId:s.tkhd.trackId,defaultSampleDescriptionIndex:y,defaultSampleDuration:0,defaultSampleSize:0,defaultSampleFlags:0}]}};this._tracks.push({fragmentSequence:1,trackId:s.tkhd.trackId,timeScale:s.mdia.mdhd.timeScale,samples:u,currSample:null,currTime:null,moov:w,mime:p})}if(0===this._tracks.length)return void this.emit("error",new Error("no playable tracks"));e.mvhd.duration=0,this._ftyp={type:"ftyp",brand:"iso5",brandVersion:0,compatibleBrands:["iso5"]};const s=a.encode(this._ftyp),r=this._tracks.map((e=>{const t=a.encode(e.moov);return{mime:e.mime,init:n.concat([s,t])}}));this.emit("ready",r)}seek(e){if(!this._tracks)throw new Error("Not ready yet; wait for 'ready' event");this._fileStream&&(this._fileStream.destroy(),this._fileStream=null);let t=-1;if(this._tracks.map(((n,i)=>{n.outStream&&n.outStream.destroy(),n.inStream&&(n.inStream.destroy(),n.inStream=null);const s=n.outStream=r.encode(),a=this._generateFragment(i,e);if(!a)return s.finalize();(-1===t||a.ranges[0].start{s.destroyed||s.box(e.moof,(t=>{if(t)return this.emit("error",t);if(s.destroyed)return;n.inStream.slice(e.ranges).pipe(s.mediaData(e.length,(e=>{if(e)return this.emit("error",e);if(s.destroyed)return;const t=this._generateFragment(i);if(!t)return s.finalize();o(t)})))}))};o(a)})),t>=0){const e=this._fileStream=this._file.createReadStream({start:t});this._tracks.forEach((n=>{n.inStream=new o(t,{highWaterMark:1e7}),e.pipe(n.inStream)}))}return this._tracks.map((e=>e.outStream))}_findSampleBefore(e,t){const n=this._tracks[e],s=Math.floor(n.timeScale*t);let r=i(n.samples,s,((e,t)=>e.dts+e.presentationOffset-t));for(-1===r?r=0:r<0&&(r=-r-2);!n.samples[r].sync;)r--;return r}_generateFragment(e,t){const n=this._tracks[e];let i;if(i=void 0!==t?this._findSampleBefore(e,t):n.currSample,i>=n.samples.length)return null;const s=n.samples[i].dts;let r=0;const a=[];for(var o=i;o=n.timeScale*l)break;r+=e.size;const t=a.length-1;t<0||a[t].end!==e.offset?a.push({start:e.offset,end:e.offset+e.size}):a[t].end+=e.size}return n.currSample=o,{moof:this._generateMoof(e,i,o),ranges:a,length:r}}_generateMoof(e,t,n){const i=this._tracks[e],s=[];let r=0;for(let e=t;e{this.detailedError=this._elemWrapper.detailedError,this.destroy()},this._onWaiting=()=>{this._waitingFired=!0,this._muxer?this._tracks&&this._pump():this._createMuxer()},t.autoplay&&(t.preload="auto"),t.addEventListener("waiting",this._onWaiting),t.addEventListener("error",this._onError)}a.prototype={_createMuxer(){this._muxer=new r(this._file),this._muxer.on("ready",(e=>{this._tracks=e.map((e=>{const t=this._elemWrapper.createWriteStream(e.mime);t.on("error",(e=>{this._elemWrapper.error(e)}));const n={muxed:null,mediaSource:t,initFlushed:!1,onInitFlushed:null};return t.write(e.init,(e=>{n.initFlushed=!0,n.onInitFlushed&&n.onInitFlushed(e)})),n})),(this._waitingFired||"auto"===this._elem.preload)&&this._pump()})),this._muxer.on("error",(e=>{this._elemWrapper.error(e)}))},_pump(){const e=this._muxer.seek(this._elem.currentTime,!this._tracks);this._tracks.forEach(((t,n)=>{const i=()=>{t.muxed&&(t.muxed.destroy(),t.mediaSource=this._elemWrapper.createWriteStream(t.mediaSource),t.mediaSource.on("error",(e=>{this._elemWrapper.error(e)}))),t.muxed=e[n],s(t.muxed,t.mediaSource)};t.initFlushed?i():t.onInitFlushed=e=>{e?this._elemWrapper.error(e):i()}}))},destroy(){this.destroyed||(this.destroyed=!0,this._elem.removeEventListener("waiting",this._onWaiting),this._elem.removeEventListener("error",this._onError),this._tracks&&this._tracks.forEach((e=>{e.muxed&&e.muxed.destroy()})),this._elem.src="")}},t.exports=a},{"./mp4-remuxer":305,mediasource:124,pump:187}],307:[function(e,t,n){(function(n,i,s){(function(){ /*! webtorrent. MIT License. WebTorrent LLC */ -const{EventEmitter:r}=e("events"),a=e("simple-concat"),o=e("create-torrent"),c=e("debug")("webtorrent"),l=e("bittorrent-dht/client"),p=e("load-ip-set"),u=e("run-parallel"),d=e("parse-torrent"),h=e("path"),f=e("simple-peer"),m=e("randombytes"),g=e("speedometer"),v=e("./lib/conn-pool"),b=e("./lib/torrent"),x=e("./package.json").version,_=x.replace(/\d*./g,(e=>("0"+e%100).slice(-2))).slice(0,4),y=`-WW${_}-`;class w extends r{constructor(e={}){super(),"string"==typeof e.peerId?this.peerId=e.peerId:s.isBuffer(e.peerId)?this.peerId=e.peerId.toString("hex"):this.peerId=s.from(y+m(9).toString("base64")).toString("hex"),this.peerIdBuffer=s.from(this.peerId,"hex"),"string"==typeof e.nodeId?this.nodeId=e.nodeId:s.isBuffer(e.nodeId)?this.nodeId=e.nodeId.toString("hex"):this.nodeId=m(20).toString("hex"),this.nodeIdBuffer=s.from(this.nodeId,"hex"),this._debugId=this.peerId.toString("hex").substring(0,7),this.destroyed=!1,this.listening=!1,this.torrentPort=e.torrentPort||0,this.dhtPort=e.dhtPort||0,this.tracker=void 0!==e.tracker?e.tracker:{},this.torrents=[],this.maxConns=Number(e.maxConns)||55,this.utp=!0===e.utp,this._debug("new webtorrent (peerId %s, nodeId %s, port %s)",this.peerId,this.nodeId,this.torrentPort),this.tracker&&("object"!=typeof this.tracker&&(this.tracker={}),e.rtcConfig&&(console.warn("WebTorrent: opts.rtcConfig is deprecated. Use opts.tracker.rtcConfig instead"),this.tracker.rtcConfig=e.rtcConfig),e.wrtc&&(console.warn("WebTorrent: opts.wrtc is deprecated. Use opts.tracker.wrtc instead"),this.tracker.wrtc=e.wrtc),i.WRTC&&!this.tracker.wrtc&&(this.tracker.wrtc=i.WRTC)),"function"==typeof v?this._connPool=new v(this):n.nextTick((()=>{this._onListening()})),this._downloadSpeed=g(),this._uploadSpeed=g(),!1!==e.dht&&"function"==typeof l?(this.dht=new l(Object.assign({},{nodeId:this.nodeId},e.dht)),this.dht.once("error",(e=>{this._destroy(e)})),this.dht.once("listening",(()=>{const e=this.dht.address();e&&(this.dhtPort=e.port)})),this.dht.setMaxListeners(0),this.dht.listen(this.dhtPort)):this.dht=!1,this.enableWebSeeds=!1!==e.webSeeds;const t=()=>{this.destroyed||(this.ready=!0,this.emit("ready"))};"function"==typeof p&&null!=e.blocklist?p(e.blocklist,{headers:{"user-agent":`WebTorrent/${x} (https://webtorrent.io)`}},((e,n)=>{if(e)return this.error("Failed to load blocklist: "+e.message);this.blocked=n,t()})):n.nextTick(t)}get downloadSpeed(){return this._downloadSpeed()}get uploadSpeed(){return this._uploadSpeed()}get progress(){const e=this.torrents.filter((e=>1!==e.progress));return e.reduce(((e,t)=>e+t.downloaded),0)/(e.reduce(((e,t)=>e+(t.length||0)),0)||1)}get ratio(){return this.torrents.reduce(((e,t)=>e+t.uploaded),0)/(this.torrents.reduce(((e,t)=>e+t.received),0)||1)}get(e){if(e instanceof b){if(this.torrents.includes(e))return e}else{let t;try{t=d(e)}catch(e){}if(!t)return null;if(!t.infoHash)throw new Error("Invalid torrent identifier");for(const e of this.torrents)if(e.infoHash===t.infoHash)return e}return null}download(e,t,n){return console.warn("WebTorrent: client.download() is deprecated. Use client.add() instead"),this.add(e,t,n)}add(e,t={},n=(()=>{})){if(this.destroyed)throw new Error("client is destroyed");"function"==typeof t&&([t,n]=[{},t]);const i=()=>{if(!this.destroyed)for(const e of this.torrents)if(e.infoHash===r.infoHash&&e!==r)return void r._destroy(new Error("Cannot add duplicate torrent "+r.infoHash))},s=()=>{this.destroyed||(n(r),this.emit("torrent",r))};this._debug("add"),t=t?Object.assign({},t):{};const r=new b(e,this,t);return this.torrents.push(r),r.once("_infoHash",i),r.once("ready",s),r.once("close",(function e(){r.removeListener("_infoHash",i),r.removeListener("ready",s),r.removeListener("close",e)})),r}seed(e,t,n){if(this.destroyed)throw new Error("client is destroyed");"function"==typeof t&&([t,n]=[{},t]),this._debug("seed"),(t=t?Object.assign({},t):{}).skipVerify=!0;const i="string"==typeof e;i&&(t.path=h.dirname(e)),t.createdBy||(t.createdBy="WebTorrent/"+_);const s=e=>{this._debug("on seed"),"function"==typeof n&&n(e),e.emit("seed"),this.emit("seed",e)},r=this.add(null,t,(e=>{const t=[t=>{if(i)return t();e.load(c,t)}];this.dht&&t.push((t=>{e.once("dhtAnnounce",t)})),u(t,(t=>{if(!this.destroyed)return t?e._destroy(t):void s(e)}))}));let c;var l;return l=e,"undefined"!=typeof FileList&&l instanceof FileList?e=Array.from(e):Array.isArray(e)||(e=[e]),u(e.map((e=>t=>{!function(e){return"object"==typeof e&&null!=e&&"function"==typeof e.pipe}(e)?t(null,e):a(e,t)})),((e,n)=>{if(!this.destroyed)return e?r._destroy(e):void o.parseInput(n,t,((e,i)=>{if(!this.destroyed){if(e)return r._destroy(e);c=i.map((e=>e.getStream)),o(n,t,((e,t)=>{if(this.destroyed)return;if(e)return r._destroy(e);const n=this.get(t);n?r._destroy(new Error("Cannot add duplicate torrent "+n.infoHash)):r._onTorrentId(t)}))}}))})),r}remove(e,t,n){if("function"==typeof t)return this.remove(e,null,t);this._debug("remove");if(!this.get(e))throw new Error("No torrent with id "+e);this._remove(e,t,n)}_remove(e,t,n){if("function"==typeof t)return this._remove(e,null,t);const i=this.get(e);i&&(this.torrents.splice(this.torrents.indexOf(i),1),i.destroy(t,n))}address(){return this.listening?this._connPool?this._connPool.tcpServer.address():{address:"0.0.0.0",family:"IPv4",port:0}:null}destroy(e){if(this.destroyed)throw new Error("client already destroyed");this._destroy(null,e)}_destroy(e,t){this._debug("client destroy"),this.destroyed=!0;const n=this.torrents.map((e=>t=>{e.destroy(t)}));this._connPool&&n.push((e=>{this._connPool.destroy(e)})),this.dht&&n.push((e=>{this.dht.destroy(e)})),u(n,t),e&&this.emit("error",e),this.torrents=[],this._connPool=null,this.dht=null}_onListening(){if(this._debug("listening"),this.listening=!0,this._connPool){const e=this._connPool.tcpServer.address();e&&(this.torrentPort=e.port)}this.emit("listening")}_debug(){const e=[].slice.call(arguments);e[0]=`[${this._debugId}] ${e[0]}`,c(...e)}}w.WEBRTC_SUPPORT=f.WEBRTC_SUPPORT,w.VERSION=x,t.exports=w}).call(this)}).call(this,e("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},e("buffer").Buffer)},{"./lib/conn-pool":54,"./lib/torrent":312,"./package.json":332,_process:186,"bittorrent-dht/client":54,buffer:59,"create-torrent":79,debug:314,events:97,"load-ip-set":54,"parse-torrent":183,path:184,randombytes:194,"run-parallel":217,"simple-concat":220,"simple-peer":222,speedometer:262}],308:[function(e,t,n){const i=e("debug")("webtorrent:file-stream"),s=e("readable-stream");class r extends s.Readable{constructor(e,t){super(t),this.destroyed=!1,this._torrent=e._torrent;const n=t&&t.start||0,i=t&&t.end&&t.end{if(this._notifying=!1,!this.destroyed){if(i("read %s (length %s) (err %s)",e,n.length,t&&t.message),t)return this._destroy(t);this._offset&&(n=n.slice(this._offset),this._offset=0),this._missing{e.end()})),e}const t=new u(this,e);return this._torrent.select(t._startPiece,t._endPiece,!0,(()=>{t._notify()})),r(t,(()=>{this._destroyed||this._torrent.destroyed||this._torrent.deselect(t._startPiece,t._endPiece,!0)})),t}getBuffer(e){p(this.createReadStream(),this.length,e)}getBlob(e){if("undefined"==typeof window)throw new Error("browser-only method");c(this.createReadStream(),this._getMimeType()).then((t=>e(null,t)),(t=>e(t)))}getBlobURL(e){if("undefined"==typeof window)throw new Error("browser-only method");l(this.createReadStream(),this._getMimeType()).then((t=>e(null,t)),(t=>e(t)))}appendTo(e,t,n){if("undefined"==typeof window)throw new Error("browser-only method");o.append(this,e,t,n)}renderTo(e,t,n){if("undefined"==typeof window)throw new Error("browser-only method");o.render(this,e,t,n)}_getMimeType(){return o.mime[a.extname(this.name).toLowerCase()]}_destroy(){this._destroyed=!0,this._torrent=null}}}).call(this)}).call(this,e("_process"))},{"./file-stream":308,_process:186,"end-of-stream":95,events:97,path:184,"readable-stream":331,"render-media":211,"stream-to-blob":283,"stream-to-blob-url":282,"stream-with-known-length-to-buffer":284}],310:[function(e,t,n){const i=e("unordered-array-remove"),s=e("debug")("webtorrent:peer"),r=e("bittorrent-protocol"),a=e("./webconn");n.createWebRTCPeer=(e,t)=>{const n=new l(e.id,"webrtc");return n.conn=e,n.swarm=t,n.conn.connected?n.onConnect():(n.conn.once("connect",(()=>{n.onConnect()})),n.conn.once("error",(e=>{n.destroy(e)})),n.startConnectTimeout()),n},n.createTCPIncomingPeer=e=>o(e,"tcpIncoming"),n.createUTPIncomingPeer=e=>o(e,"utpIncoming"),n.createTCPOutgoingPeer=(e,t)=>c(e,t,"tcpOutgoing"),n.createUTPOutgoingPeer=(e,t)=>c(e,t,"utpOutgoing");const o=(e,t)=>{const n=`${e.remoteAddress}:${e.remotePort}`,i=new l(n,t);return i.conn=e,i.addr=n,i.onConnect(),i},c=(e,t,n)=>{const i=new l(e,n);return i.addr=e,i.swarm=t,i};n.createWebSeedPeer=(e,t)=>{const n=new l(e,"webSeed");return n.swarm=t,n.conn=new a(e,t),n.onConnect(),n};class l{constructor(e,t){this.id=e,this.type=t,s("new %s Peer %s",t,e),this.addr=null,this.conn=null,this.swarm=null,this.wire=null,this.connected=!1,this.destroyed=!1,this.timeout=null,this.retries=0,this.sentHandshake=!1}onConnect(){if(this.destroyed)return;this.connected=!0,s("Peer %s connected",this.id),clearTimeout(this.connectTimeout);const e=this.conn;e.once("end",(()=>{this.destroy()})),e.once("close",(()=>{this.destroy()})),e.once("finish",(()=>{this.destroy()})),e.once("error",(e=>{this.destroy(e)}));const t=this.wire=new r;t.type=this.type,t.once("end",(()=>{this.destroy()})),t.once("close",(()=>{this.destroy()})),t.once("finish",(()=>{this.destroy()})),t.once("error",(e=>{this.destroy(e)})),t.once("handshake",((e,t)=>{this.onHandshake(e,t)})),this.startHandshakeTimeout(),e.pipe(t).pipe(e),this.swarm&&!this.sentHandshake&&this.handshake()}onHandshake(e,t){if(!this.swarm)return;if(this.destroyed)return;if(this.swarm.destroyed)return this.destroy(new Error("swarm already destroyed"));if(e!==this.swarm.infoHash)return this.destroy(new Error("unexpected handshake info hash for this swarm"));if(t===this.swarm.peerId)return this.destroy(new Error("refusing to connect to ourselves"));s("Peer %s got handshake %s",this.id,e),clearTimeout(this.handshakeTimeout),this.retries=0;let n=this.addr;!n&&this.conn.remoteAddress&&this.conn.remotePort&&(n=`${this.conn.remoteAddress}:${this.conn.remotePort}`),this.swarm._onWire(this.wire,n),this.swarm&&!this.swarm.destroyed&&(this.sentHandshake||this.handshake())}handshake(){const e={dht:!this.swarm.private&&!!this.swarm.client.dht};this.wire.handshake(this.swarm.infoHash,this.swarm.client.peerId,e),this.sentHandshake=!0}startConnectTimeout(){clearTimeout(this.connectTimeout);const e={webrtc:25e3,tcpOutgoing:5e3,utpOutgoing:5e3};this.connectTimeout=setTimeout((()=>{this.destroy(new Error("connect timeout"))}),e[this.type]),this.connectTimeout.unref&&this.connectTimeout.unref()}startHandshakeTimeout(){clearTimeout(this.handshakeTimeout),this.handshakeTimeout=setTimeout((()=>{this.destroy(new Error("handshake timeout"))}),25e3),this.handshakeTimeout.unref&&this.handshakeTimeout.unref()}destroy(e){if(this.destroyed)return;this.destroyed=!0,this.connected=!1,s("destroy %s %s (error: %s)",this.type,this.id,e&&(e.message||e)),clearTimeout(this.connectTimeout),clearTimeout(this.handshakeTimeout);const t=this.swarm,n=this.conn,r=this.wire;this.swarm=null,this.conn=null,this.wire=null,t&&r&&i(t.wires,t.wires.indexOf(r)),n&&(n.on("error",(()=>{})),n.destroy()),r&&r.destroy(),t&&t.removePeer(this.id)}}},{"./webconn":313,"bittorrent-protocol":10,debug:314,"unordered-array-remove":296}],311:[function(e,t,n){t.exports=class{constructor(e){this._torrent=e,this._numPieces=e.pieces.length,this._pieces=new Array(this._numPieces),this._onWire=e=>{this.recalculate(),this._initWire(e)},this._onWireHave=e=>{this._pieces[e]+=1},this._onWireBitfield=()=>{this.recalculate()},this._torrent.wires.forEach((e=>{this._initWire(e)})),this._torrent.on("wire",this._onWire),this.recalculate()}getRarestPiece(e){let t=[],n=1/0;for(let i=0;i{this._cleanupWireEvents(e)})),this._torrent=null,this._pieces=null,this._onWire=null,this._onWireHave=null,this._onWireBitfield=null}_initWire(e){e._onClose=()=>{this._cleanupWireEvents(e);for(let t=0;t{this.destroyed||this._onParsedTorrent(t)}))):x.remote(e,((e,t)=>{if(!this.destroyed)return e?this._destroy(e):void this._onParsedTorrent(t)}))}_onParsedTorrent(e){if(!this.destroyed){if(this._processParsedTorrent(e),!this.infoHash)return this._destroy(new Error("Malformed torrent data: No info hash"));this.path||(this.path=_.join(N,this.infoHash)),this._rechokeIntervalId=setInterval((()=>{this._rechoke()}),1e4),this._rechokeIntervalId.unref&&this._rechokeIntervalId.unref(),this.emit("_infoHash",this.infoHash),this.destroyed||(this.emit("infoHash",this.infoHash),this.destroyed||(this.client.listening?this._onListening():this.client.once("listening",(()=>{this._onListening()}))))}}_processParsedTorrent(e){this._debugId=e.infoHash.toString("hex").substring(0,7),void 0!==this.private&&(e.private=this.private),this.announce&&(e.announce=e.announce.concat(this.announce)),this.client.tracker&&i.WEBTORRENT_ANNOUNCE&&!e.private&&(e.announce=e.announce.concat(i.WEBTORRENT_ANNOUNCE)),this.urlList&&(e.urlList=e.urlList.concat(this.urlList)),e.announce=Array.from(new Set(e.announce)),e.urlList=Array.from(new Set(e.urlList)),Object.assign(this,e),this.magnetURI=x.toMagnetURI(e),this.torrentFile=x.toTorrentFile(e)}_onListening(){this.destroyed||(this.info?this._onMetadata(this):(this.xs&&this._getMetadataFromServer(),this._startDiscovery()))}_startDiscovery(){if(this.discovery||this.destroyed)return;let e=this.client.tracker;e&&(e=Object.assign({},this.client.tracker,{getAnnounceOpts:()=>{const e={uploaded:this.uploaded,downloaded:this.downloaded,left:Math.max(this.length-this.downloaded,0)};return this.client.tracker.getAnnounceOpts&&Object.assign(e,this.client.tracker.getAnnounceOpts()),this._getAnnounceOpts&&Object.assign(e,this._getAnnounceOpts()),e}})),this.peerAddresses&&this.peerAddresses.forEach((e=>this.addPeer(e))),this.discovery=new c({infoHash:this.infoHash,announce:this.announce,peerId:this.client.peerId,dht:!this.private&&this.client.dht,tracker:e,port:this.client.torrentPort,userAgent:P}),this.discovery.on("error",(e=>{this._destroy(e)})),this.discovery.on("peer",(e=>{"string"==typeof e&&this.done||this.addPeer(e)})),this.discovery.on("trackerAnnounce",(()=>{this.emit("trackerAnnounce"),0===this.numPeers&&this.emit("noPeers","tracker")})),this.discovery.on("dhtAnnounce",(()=>{this.emit("dhtAnnounce"),0===this.numPeers&&this.emit("noPeers","dht")})),this.discovery.on("warning",(e=>{this.emit("warning",e)}))}_getMetadataFromServer(){const e=this,t=(Array.isArray(this.xs)?this.xs:[this.xs]).map((t=>n=>{!function(t,n){if(0!==t.indexOf("http://")&&0!==t.indexOf("https://"))return e.emit("warning",new Error("skipping non-http xs param: "+t)),n(null);const i={url:t,method:"GET",headers:{"user-agent":P}};let s;try{s=d.concat(i,r)}catch(i){return e.emit("warning",new Error("skipping invalid url xs param: "+t)),n(null)}function r(i,s,r){if(e.destroyed)return n(null);if(e.metadata)return n(null);if(i)return e.emit("warning",new Error("http error from xs param: "+t)),n(null);if(200!==s.statusCode)return e.emit("warning",new Error(`non-200 status code ${s.statusCode} from xs param: ${t}`)),n(null);let a;try{a=x(r)}catch(i){}return a?a.infoHash!==e.infoHash?(e.emit("warning",new Error("got torrent file with incorrect info hash from xs param: "+t)),n(null)):(e._onMetadata(a),void n(null)):(e.emit("warning",new Error("got invalid torrent file from xs param: "+t)),n(null))}e._xsRequests.push(s)}(t,n)}));v(t)}_onMetadata(e){if(this.metadata||this.destroyed)return;let t;if(this._debug("got metadata"),this._xsRequests.forEach((e=>{e.abort()})),this._xsRequests=[],e&&e.infoHash)t=e;else try{t=x(e)}catch(e){return this._destroy(e)}if(this._processParsedTorrent(t),this.metadata=this.torrentFile,this.client.enableWebSeeds&&this.urlList.forEach((e=>{this.addWebSeed(e)})),this._rarityMap=new L(this),this.store=new h(new this._store(this.pieceLength,{torrent:{infoHash:this.infoHash},files:this.files.map((e=>({path:_.join(this.path,e.path),length:e.length,offset:e.offset}))),length:this.length,name:this.infoHash})),this.files=this.files.map((e=>new A(this,e))),this.so?this.files.forEach(((e,t)=>{this.so.includes(t)?this.files[t].select():this.files[t].deselect()})):0!==this.pieces.length&&this.select(0,this.pieces.length-1,!1),this._hashes=this.pieces,this.pieces=this.pieces.map(((e,t)=>{const n=t===this.pieces.length-1?this.lastPieceLength:this.pieceLength;return new y(n)})),this._reservations=this.pieces.map((()=>[])),this.bitfield=new r(this.pieces.length),this.wires.forEach((e=>{e.ut_metadata&&e.ut_metadata.setMetadata(this.metadata),this._onWireWithMetadata(e)})),this.emit("metadata"),!this.destroyed)if(this.skipVerify)this._markAllVerified(),this._onStore();else{const e=e=>{if(e)return this._destroy(e);this._debug("done verifying"),this._onStore()};this._debug("verifying existing torrent data"),this._fileModtimes&&this._store===u?this.getFileModtimes(((t,n)=>{if(t)return this._destroy(t);this.files.map(((e,t)=>n[t]===this._fileModtimes[t])).every((e=>e))?(this._markAllVerified(),this._onStore()):this._verifyPieces(e)})):this._verifyPieces(e)}}getFileModtimes(e){const t=[];b(this.files.map(((e,n)=>i=>{p.stat(_.join(this.path,e.path),((e,s)=>{if(e&&"ENOENT"!==e.code)return i(e);t[n]=s&&s.mtime.getTime(),i(null)}))})),U,(n=>{this._debug("done getting file modtimes"),e(n,t)}))}_verifyPieces(e){b(this.pieces.map(((e,t)=>e=>{if(this.destroyed)return e(new Error("torrent is destroyed"));this.store.get(t,((i,s)=>this.destroyed?e(new Error("torrent is destroyed")):i?n.nextTick(e,null):void E(s,(n=>{if(this.destroyed)return e(new Error("torrent is destroyed"));if(n===this._hashes[t]){if(!this.pieces[t])return e(null);this._debug("piece verified %s",t),this._markVerified(t)}else this._debug("piece invalid %s",t);e(null)}))))})),U,e)}rescanFiles(e){if(this.destroyed)throw new Error("torrent is destroyed");e||(e=H),this._verifyPieces((t=>{if(t)return this._destroy(t),e(t);this._checkDone(),e(null)}))}_markAllVerified(){for(let e=0;e{e.abort()})),this._rarityMap&&this._rarityMap.destroy();for(const e in this._peers)this.removePeer(e);this.files.forEach((e=>{e instanceof A&&e._destroy()}));const i=this._servers.map((e=>t=>{e.destroy(t)}));this.discovery&&i.push((e=>{this.discovery.destroy(e)})),this.store&&i.push((e=>{t&&t.destroyStore?this.store.destroy(e):this.store.close(e)})),v(i,n),e&&(0===this.listenerCount("error")?this.client.emit("error",e):this.emit("error",e)),this.emit("close"),this.client=null,this.files=[],this.discovery=null,this.store=null,this._rarityMap=null,this._peers=null,this._servers=null,this._xsRequests=null}addPeer(e){if(this.destroyed)throw new Error("torrent is destroyed");if(!this.infoHash)throw new Error("addPeer() must not be called before the `infoHash` event");if(this.client.blocked){let t;if("string"==typeof e){let n;try{n=s(e)}catch(t){return this._debug("ignoring peer: invalid %s",e),this.emit("invalidPeer",e),!1}t=n[0]}else"string"==typeof e.remoteAddress&&(t=e.remoteAddress);if(t&&this.client.blocked.contains(t))return this._debug("ignoring peer: blocked %s",e),"string"!=typeof e&&e.destroy(),this.emit("blockedPeer",e),!1}const t=!!this._addPeer(e,this.client.utp?"utp":"tcp");return t?this.emit("peer",e):this.emit("invalidPeer",e),t}_addPeer(e,t){if(this.destroyed)return"string"!=typeof e&&e.destroy(),null;if("string"==typeof e&&!this._validAddr(e))return this._debug("ignoring peer: invalid %s",e),null;const n=e&&e.id||e;if(this._peers[n])return this._debug("ignoring peer: duplicate (%s)",n),"string"!=typeof e&&e.destroy(),null;if(this.paused)return this._debug("ignoring peer: torrent is paused"),"string"!=typeof e&&e.destroy(),null;let i;return this._debug("add peer %s",n),i="string"==typeof e?"utp"===t?I.createUTPOutgoingPeer(e,this):I.createTCPOutgoingPeer(e,this):I.createWebRTCPeer(e,this),this._peers[i.id]=i,this._peersLength+=1,"string"==typeof e&&(this._queue.push(i),this._drain()),i}addWebSeed(e){if(this.destroyed)throw new Error("torrent is destroyed");if(!/^https?:\/\/.+/.test(e))return this.emit("warning",new Error("ignoring invalid web seed: "+e)),void this.emit("invalidPeer",e);if(this._peers[e])return this.emit("warning",new Error("ignoring duplicate web seed: "+e)),void this.emit("invalidPeer",e);this._debug("add web seed %s",e);const t=I.createWebSeedPeer(e,this);this._peers[t.id]=t,this._peersLength+=1,this.emit("peer",e)}_addIncomingPeer(e){return this.destroyed?e.destroy(new Error("torrent is destroyed")):this.paused?e.destroy(new Error("torrent is paused")):(this._debug("add incoming peer %s",e.id),this._peers[e.id]=e,void(this._peersLength+=1))}removePeer(e){const t=e&&e.id||e;(e=this._peers[t])&&(this._debug("removePeer %s",t),delete this._peers[t],this._peersLength-=1,e.destroy(),this._drain())}select(e,t,n,i){if(this.destroyed)throw new Error("torrent is destroyed");if(e<0||tt.priority-e.priority)),this._updateSelections()}deselect(e,t,n){if(this.destroyed)throw new Error("torrent is destroyed");n=Number(n)||0,this._debug("deselect %s-%s (priority %s)",e,t,n);for(let i=0;i{this.destroyed||(this.received+=e,this._downloadSpeed(e),this.client._downloadSpeed(e),this.emit("download",e),this.destroyed||this.client.emit("download",e))})),e.on("upload",(e=>{this.destroyed||(this.uploaded+=e,this._uploadSpeed(e),this.client._uploadSpeed(e),this.emit("upload",e),this.destroyed||this.client.emit("upload",e))})),this.wires.push(e),t){const n=s(t);e.remoteAddress=n[0],e.remotePort=n[1]}this.client.dht&&this.client.dht.listening&&e.on("port",(n=>{if(!this.destroyed&&!this.client.dht.destroyed){if(!e.remoteAddress)return this._debug("ignoring PORT from peer with no address");if(0===n||n>65536)return this._debug("ignoring invalid PORT from peer");this._debug("port: %s (from %s)",n,t),this.client.dht.addNode({host:e.remoteAddress,port:n})}})),e.on("timeout",(()=>{this._debug("wire timeout (%s)",t),e.destroy()})),e.setTimeout(3e4,!0),e.setKeepAlive(!0),e.use(C(this.metadata)),e.ut_metadata.on("warning",(e=>{this._debug("ut_metadata warning: %s",e.message)})),this.metadata||(e.ut_metadata.on("metadata",(e=>{this._debug("got metadata via ut_metadata"),this._onMetadata(e)})),e.ut_metadata.fetch()),"function"!=typeof T||this.private||(e.use(T()),e.ut_pex.on("peer",(e=>{this.done||(this._debug("ut_pex: got peer: %s (from %s)",e,t),this.addPeer(e))})),e.ut_pex.on("dropped",(e=>{const n=this._peers[e];n&&!n.connected&&(this._debug("ut_pex: dropped peer: %s (from %s)",e,t),this.removePeer(e))})),e.once("close",(()=>{e.ut_pex.reset()}))),this.emit("wire",e,t),this.metadata&&n.nextTick((()=>{this._onWireWithMetadata(e)}))}_onWireWithMetadata(e){let t=null;const n=()=>{this.destroyed||e.destroyed||(this._numQueued>2*(this._numConns-this.numPeers)&&e.amInterested?e.destroy():(t=setTimeout(n,B),t.unref&&t.unref()))};let i;const s=()=>{if(e.peerPieces.buffer.length===this.bitfield.buffer.length){for(i=0;i{s(),this._update(),this._updateWireInterest(e)})),e.on("have",(()=>{s(),this._update(),this._updateWireInterest(e)})),e.once("interested",(()=>{e.unchoke()})),e.once("close",(()=>{clearTimeout(t)})),e.on("choke",(()=>{clearTimeout(t),t=setTimeout(n,B),t.unref&&t.unref()})),e.on("unchoke",(()=>{clearTimeout(t),this._update()})),e.on("request",((t,n,i,s)=>{if(i>131072)return e.destroy();this.pieces[t]||this.store.get(t,{offset:n,length:i},s)})),e.bitfield(this.bitfield),this._updateWireInterest(e),e.peerExtensions.dht&&this.client.dht&&this.client.dht.listening&&e.port(this.client.dht.address().port),"webSeed"!==e.type&&(t=setTimeout(n,B),t.unref&&t.unref()),e.isSeeder=!1,s()}_updateSelections(){this.ready&&!this.destroyed&&(n.nextTick((()=>{this._gcSelections()})),this._updateInterest(),this._update())}_gcSelections(){for(let e=0;ethis._updateWireInterest(e))),e!==this._amInterested&&(this._amInterested?this.emit("interested"):this.emit("uninterested"))}_updateWireInterest(e){let t=!1;for(let n=0;n=i.from+i.offset;--r)if(e.peerPieces.get(r)&&t._request(e,r,!1))return}}();const n=q(e,.5);if(e.requests.length>=n)return;const i=q(e,1);function s(t,n,i,s){return r=>r>=t&&r<=n&&!(r in i)&&e.peerPieces.get(r)&&(!s||s(r))}function r(e){let n=e;for(let i=e;i=i)return!0;const a=function(){const n=e.downloadSpeed()||1;if(n>O)return()=>!0;const i=Math.max(1,e.requests.length)*y.BLOCK_LENGTH/n;let s=10,r=0;return e=>{if(!s||t.bitfield.get(e))return!0;let a=t.pieces[e].missing;for(;r0))return s--,!1}return!0}}();for(let o=0;o({wire:e,random:Math.random()}))).sort(((e,t)=>{const n=e.wire,i=t.wire;return n.downloadSpeed()!==i.downloadSpeed()?n.downloadSpeed()-i.downloadSpeed():n.uploadSpeed()!==i.uploadSpeed()?n.uploadSpeed()-i.uploadSpeed():n.amChoking!==i.amChoking?n.amChoking?-1:1:e.random-t.random})).map((e=>e.wire));this._rechokeOptimisticTime<=0?this._rechokeOptimisticWire=null:this._rechokeOptimisticTime-=1;let t=0;for(;e.length>0&&t0){const t=e.filter((e=>e.peerInterested));if(t.length>0){const e=t[(n=t.length,Math.random()*n|0)];e.unchoke(),this._rechokeOptimisticWire=e,this._rechokeOptimisticTime=2}}var n;e.filter((e=>e!==this._rechokeOptimisticWire)).forEach((e=>e.choke()))}_hotswap(e,t){const n=e.downloadSpeed();if(n=O||(2*o>n||o>a||(s=t,a=o))}if(!s)return!1;for(r=0;r=(a?Math.min(function(e,t,n){return 1+Math.ceil(t*e.downloadSpeed()/n)}(e,1,s.pieceLength),s.maxWebConns):q(e,1)))return!1;const o=s.pieces[t];let c=a?o.reserveRemaining():o.reserve();if(-1===c&&i&&s._hotswap(e,t)&&(c=a?o.reserveRemaining():o.reserve()),-1===c)return!1;let l=s._reservations[t];l||(l=s._reservations[t]=[]);let p=l.indexOf(null);-1===p&&(p=l.length),l[p]=e;const u=o.chunkOffset(c),d=a?o.chunkLengthRemaining(c):o.chunkLength(c);function h(){n.nextTick((()=>{s._update()}))}return e.request(t,u,d,(function n(i,r){if(s.destroyed)return;if(!s.ready)return s.once("ready",(()=>{n(i,r)}));if(l[p]===e&&(l[p]=null),o!==s.pieces[t])return h();if(i)return s._debug("error getting piece %s (offset: %s length: %s) from %s: %s",t,u,d,`${e.remoteAddress}:${e.remotePort}`,i.message),a?o.cancelRemaining(c):o.cancel(c),void h();if(s._debug("got piece %s (offset: %s length: %s) from %s",t,u,d,`${e.remoteAddress}:${e.remotePort}`),!o.set(c,r,e))return h();const f=o.flush();E(f,(e=>{if(!s.destroyed){if(e===s._hashes[t]){if(!s.pieces[t])return;s._debug("piece verified %s",t),s.pieces[t]=null,s._reservations[t]=null,s.bitfield.set(t,!0),s.store.put(t,f),s.wires.forEach((e=>{e.have(t)})),s._checkDone()&&!s.destroyed&&s.discovery.complete()}else s.pieces[t]=new y(o.length),s.emit("warning",new Error(`Piece ${t} failed verification`));h()}}))})),!0}_checkDone(){if(this.destroyed)return;this.files.forEach((e=>{if(!e.done){for(let t=e._startPiece;t<=e._endPiece;++t)if(!this.bitfield.get(t))return;e.done=!0,e.emit("done"),this._debug("file done: "+e.name)}}));let e=!0;for(let t=0;t{this.load(e,t)}));Array.isArray(e)||(e=[e]),t||(t=H);const n=new f(e),i=new a(this.store,this.pieceLength);w(n,i,(e=>{if(e)return t(e);this._markAllVerified(),this._checkDone(),t(null)}))}createServer(e){if("function"!=typeof R)throw new Error("node.js-only method");if(this.destroyed)throw new Error("torrent is destroyed");const t=new R(this,e);return this._servers.push(t),t}pause(){this.destroyed||(this._debug("pause"),this.paused=!0)}resume(){this.destroyed||(this._debug("resume"),this.paused=!1,this._drain())}_debug(){const e=[].slice.call(arguments);e[0]=`[${this.client?this.client._debugId:"No Client"}] [${this._debugId}] ${e[0]}`,o(...e)}_drain(){if(this._debug("_drain numConns %s maxConns %s",this._numConns,this.client.maxConns),"function"!=typeof m.connect||this.destroyed||this.paused||this._numConns>=this.client.maxConns)return;this._debug("drain (%s queued, %s/%s peers)",this._numQueued,this.numPeers,this.client.maxConns);const e=this._queue.shift();if(!e)return;this._debug("%s connect attempt to %s",e.type,e.addr);const t=s(e.addr),n={host:t[0],port:t[1]};"utpOutgoing"===e.type?e.conn=j.connect(n.port,n.host):e.conn=m.connect(n);const i=e.conn;i.once("connect",(()=>{e.onConnect()})),i.once("error",(t=>{e.destroy(t)})),e.startConnectTimeout(),i.on("close",(()=>{if(this.destroyed)return;if(e.retries>=M.length){if(this.client.utp){const t=this._addPeer(e.addr,"tcp");t&&(t.retries=0)}else this._debug("conn %s closed: will not re-add (max %s attempts)",e.addr,M.length);return}const t=M[e.retries];this._debug("conn %s closed: will re-add to queue in %sms (attempt %s)",e.addr,t,e.retries+1);const n=setTimeout((()=>{if(this.destroyed)return;const t=this._addPeer(e.addr,this.client.utp?"utp":"tcp");t&&(t.retries=e.retries+1)}),t);n.unref&&n.unref()}))}_validAddr(e){let t;try{t=s(e)}catch(e){return!1}const n=t[0],i=t[1];return i>0&&i<65535&&!("127.0.0.1"===n&&i===this.client.torrentPort)}}}).call(this)}).call(this,e("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../package.json":332,"./file":309,"./peer":310,"./rarity-map":311,"./server":54,_process:186,"addr-to-ip-port":2,bitfield:9,"chunk-store-stream/write":77,debug:314,events:97,fs:55,"fs-chunk-store":140,"immediate-chunk-store":117,multistream:165,net:54,os:54,"parse-torrent":183,path:184,pump:187,"random-iterate":193,"run-parallel":217,"run-parallel-limit":216,"simple-get":221,"simple-sha1":241,speedometer:262,"torrent-discovery":289,"torrent-piece":293,ut_metadata:299,ut_pex:54,"utp-native":54}],313:[function(e,t,n){(function(n){(function(){const i=e("bitfield"),s=e("debug")("webtorrent:webconn"),r=e("simple-get"),a=e("simple-sha1"),o=e("bittorrent-protocol"),c=e("../package.json").version;t.exports=class extends o{constructor(e,t){super(),this.url=e,this.webPeerId=a.sync(e),this._torrent=t,this._init()}_init(){this.setKeepAlive(!0),this.once("handshake",((e,t)=>{if(this.destroyed)return;this.handshake(e,this.webPeerId);const n=this._torrent.pieces.length,s=new i(n);for(let e=0;e<=n;e++)s.set(e,!0);this.bitfield(s)})),this.once("interested",(()=>{s("interested"),this.unchoke()})),this.on("uninterested",(()=>{s("uninterested")})),this.on("choke",(()=>{s("choke")})),this.on("unchoke",(()=>{s("unchoke")})),this.on("bitfield",(()=>{s("bitfield")})),this.on("request",((e,t,n,i)=>{s("request pieceIndex=%d offset=%d length=%d",e,t,n),this.httpRequest(e,t,n,i)}))}httpRequest(e,t,i,a){const o=e*this._torrent.pieceLength+t,l=o+i-1,p=this._torrent.files;let u;if(p.length<=1)u=[{url:this.url,start:o,end:l}];else{const e=p.filter((e=>e.offset<=l&&e.offset+e.length>o));if(e.length<1)return a(new Error("Could not find file corresponnding to web seed range request"));u=e.map((e=>{const t=e.offset+e.length-1;return{url:this.url+("/"===this.url[this.url.length-1]?"":"/")+e.path,fileOffsetInRange:Math.max(e.offset-o,0),start:Math.max(o-e.offset,0),end:Math.min(t,l-e.offset)}}))}let d,h=0,f=!1;u.length>1&&(d=n.alloc(i)),u.forEach((n=>{const o=n.url,l=n.start,p=n.end;s("Requesting url=%s pieceIndex=%d offset=%d length=%d start=%d end=%d",o,e,t,i,l,p);const m={url:o,method:"GET",headers:{"user-agent":`WebTorrent/${c} (https://webtorrent.io)`,range:`bytes=${l}-${p}`}};function g(e,t){if(e.statusCode<200||e.statusCode>=300)return f=!0,a(new Error("Unexpected HTTP status code "+e.statusCode));s("Got data of length %d",t.length),1===u.length?a(null,t):(t.copy(d,n.fileOffsetInRange),++h===u.length&&a(null,d))}r.concat(m,((e,t,n)=>{if(!f)return e?"undefined"==typeof window||o.startsWith(window.location.origin+"/")?(f=!0,a(e)):r.head(o,((t,n)=>{if(!f){if(t)return f=!0,a(t);if(n.statusCode<200||n.statusCode>=300)return f=!0,a(new Error("Unexpected HTTP status code "+n.statusCode));if(n.url===o)return f=!0,a(e);m.url=n.url,r.concat(m,((e,t,n)=>{if(!f)return e?(f=!0,a(e)):void g(t,n)}))}})):void g(t,n)}))}))}destroy(){super.destroy(),this._torrent=null}}}).call(this)}).call(this,e("buffer").Buffer)},{"../package.json":332,bitfield:9,"bittorrent-protocol":10,buffer:59,debug:314,"simple-get":221,"simple-sha1":241}],314:[function(e,t,n){arguments[4][12][0].apply(n,arguments)},{"./common":315,_process:186,dup:12}],315:[function(e,t,n){arguments[4][13][0].apply(n,arguments)},{dup:13,ms:316}],316:[function(e,t,n){arguments[4][14][0].apply(n,arguments)},{dup:14}],317:[function(e,t,n){arguments[4][15][0].apply(n,arguments)},{dup:15}],318:[function(e,t,n){arguments[4][16][0].apply(n,arguments)},{"./_stream_readable":320,"./_stream_writable":322,_process:186,dup:16,inherits:118}],319:[function(e,t,n){arguments[4][17][0].apply(n,arguments)},{"./_stream_transform":321,dup:17,inherits:118}],320:[function(e,t,n){arguments[4][18][0].apply(n,arguments)},{"../errors":317,"./_stream_duplex":318,"./internal/streams/async_iterator":323,"./internal/streams/buffer_list":324,"./internal/streams/destroy":325,"./internal/streams/from":327,"./internal/streams/state":329,"./internal/streams/stream":330,_process:186,buffer:59,dup:18,events:97,inherits:118,"string_decoder/":285,util:54}],321:[function(e,t,n){arguments[4][19][0].apply(n,arguments)},{"../errors":317,"./_stream_duplex":318,dup:19,inherits:118}],322:[function(e,t,n){arguments[4][20][0].apply(n,arguments)},{"../errors":317,"./_stream_duplex":318,"./internal/streams/destroy":325,"./internal/streams/state":329,"./internal/streams/stream":330,_process:186,buffer:59,dup:20,inherits:118,"util-deprecate":304}],323:[function(e,t,n){arguments[4][21][0].apply(n,arguments)},{"./end-of-stream":326,_process:186,dup:21}],324:[function(e,t,n){arguments[4][22][0].apply(n,arguments)},{buffer:59,dup:22,util:54}],325:[function(e,t,n){arguments[4][23][0].apply(n,arguments)},{_process:186,dup:23}],326:[function(e,t,n){arguments[4][24][0].apply(n,arguments)},{"../../../errors":317,dup:24}],327:[function(e,t,n){arguments[4][25][0].apply(n,arguments)},{dup:25}],328:[function(e,t,n){arguments[4][26][0].apply(n,arguments)},{"../../../errors":317,"./end-of-stream":326,dup:26}],329:[function(e,t,n){arguments[4][27][0].apply(n,arguments)},{"../../../errors":317,dup:27}],330:[function(e,t,n){arguments[4][28][0].apply(n,arguments)},{dup:28,events:97}],331:[function(e,t,n){arguments[4][29][0].apply(n,arguments)},{"./lib/_stream_duplex.js":318,"./lib/_stream_passthrough.js":319,"./lib/_stream_readable.js":320,"./lib/_stream_transform.js":321,"./lib/_stream_writable.js":322,"./lib/internal/streams/end-of-stream.js":326,"./lib/internal/streams/pipeline.js":328,dup:29}],332:[function(e,t,n){t.exports={version:"0.110.1"}},{}],333:[function(e,t,n){t.exports=function e(t,n){if(t&&n)return e(t)(n);if("function"!=typeof t)throw new TypeError("need wrapper function");return Object.keys(t).forEach((function(e){i[e]=t[e]})),i;function i(){for(var e=new Array(arguments.length),n=0;n',i.addEventListener("click",H),t.appendChild(i),y.appendChild(t)}if(w.innerHTML="",l.urlList&&l.urlList.length)for(let e=0;e',i.addEventListener("click",H),t.appendChild(i),w.appendChild(t)}if(S.innerHTML="",l.files&&l.files.length){C.style.display="none";for(let e of l.files){let t=U(o.lookup(e.name));S.appendChild(O(t,e.name,e.length))}S.appendChild(O("folder-tree","",l.length)),A.addEventListener("click",W),A.disabled=!1}else I.torrents.length>0?(C.style.display="none",S.innerHTML=''):(C.style.display="block",S.innerHTML=''),A.removeEventListener("click",W),A.disabled=!0;T.setAttribute("data-clipboard-text",window.location.origin+"#"+s.toMagnetURI(l)),j.setAttribute("data-clipboard-text",s.toMagnetURI(l)),p.style.display="flex",window.location.hash=s.toMagnetURI(l),l.name?document.title="Torrent Parts | "+l.name:document.title="Torrent Parts | Inspect and edit what's in your Torrent file or Magnet link"}function O(e,t,n){let i=document.createElement("tr"),s=document.createElement("td");s.innerHTML='',i.appendChild(s);let r=document.createElement("td");r.innerHTML=t,i.appendChild(r);let o=document.createElement("td");return o.innerHTML=a.format(n,{decimalPlaces:1,unitSeparator:" "}),i.appendChild(o),i}function U(e){if(!e)return"file";switch(!0){case e.includes("msword"):case e.includes("wordprocessingml"):case e.includes("opendocument.text"):case e.includes("abiword"):return"file-word";case e.includes("ms-excel"):case e.includes("spreadsheet"):return"file-powerpoint";case e.includes("powerpoint"):case e.includes("presentation"):return"file-powerpoint";case e.includes("7z-"):case e.includes("iso9660"):case e.includes("zip"):case e.includes("octet-stream"):return"file-archive";case e.includes("csv"):return"file-csv";case e.includes("pdf"):return"file-pdf";case e.includes("font"):return"file-contract";case e.includes("text"):case e.includes("subrip"):case e.includes("vtt"):return"file-alt";case e.includes("audio"):return"file-audio";case e.includes("image"):return"file-image";case e.includes("video"):return"file-video";default:return"file"}}function M(e){this.dataset.group?l[this.dataset.group][this.dataset.index]=this.value?this.value:"":l[this.id]=this.value?this.value:"",window.location.hash=s.toMagnetURI(l),F()}function P(){document.getElementById("magnet").value="",document.getElementById("torrent").value="",p.style.display="none",d.value="",f.value="",m.value="",g.value="",v.value="",y.innerHTML="",w.innerHTML="",I.torrents.forEach((e=>e.destroy())),C.style.display="block",S.innerHTML="",window.location.hash="",T.setAttribute("data-clipboard-text",""),j.setAttribute("data-clipboard-text",""),document.title="Torrent Parts | Inspect and edit what's in your Torrent file or Magnet link"}async function N(){b.className="disabled",b.innerHTML="Adding...";try{let e=await fetch("https://newtrackon.com/api/100"),t=await e.text();l.announce=l.announce.concat(t.split("\n\n")),l.announce.push("http://bt1.archive.org:6969/announce"),l.announce.push("http://bt2.archive.org:6969/announce"),l.announce=l.announce.filter(((e,t)=>e&&l.announce.indexOf(e)===t)),F()}catch(e){console.error(e)}b.innerHTML="Add Known Working Trackers",b.className="",B()}function q(){l[this.dataset.type].unshift(""),B()}function H(){l[this.parentElement.className].splice(this.parentElement.dataset.index,1),B()}function D(e){l[e]=[],F(),B()}function F(){l.created=new Date,l.createdBy="Torrent Parts ",l.created?(f.value=l.created.toISOString().slice(0,19),f.type="datetime-local"):f.type="text",m.value=l.createdBy?"by "+l.createdBy:""}function z(){console.info("Attempting fetching files from Webtorrent..."),C.style.display="none",l.announce.push("wss://tracker.webtorrent.io"),l.announce.push("wss://tracker.openwebtorrent.com"),l.announce.push("wss://tracker.btorrent.xyz"),l.announce.push("wss://tracker.fastcast.nz"),l.announce=l.announce.filter(((e,t)=>e&&l.announce.indexOf(e)===t)),I.add(s.toMagnetURI(l),(e=>{l.info=Object.assign({},e.info),l.files=e.files,l.infoBuffer=e.infoBuffer,l.length=e.length,l.lastPieceLength=e.lastPieceLength,F(),B(),e.destroy()})),B()}function W(){let e=s.toTorrentFile(l);if(null!==e&&navigator.msSaveBlob)return navigator.msSaveBlob(new Blob([e],{type:"application/x-bittorrent"}),l.name+".torrent");let t=document.createElement("a");t.style.display="none";let n=window.URL.createObjectURL(new Blob([e],{type:"application/x-bittorrent"}));t.setAttribute("href",n),t.setAttribute("download",l.name+".torrent"),document.body.appendChild(t),t.click(),window.URL.revokeObjectURL(n),t.remove()}document.addEventListener("DOMContentLoaded",(function(){document.getElementById("magnet").addEventListener("keyup",(function(e){e.preventDefault(),"Enter"===e.key&&(u.innerHTML='',u.title="Currently loaded information sourced from Magnet URL",L(magnet.value))})),document.getElementById("torrent").addEventListener("change",(function(e){e.preventDefault();try{e.target.files[0].arrayBuffer().then((function(e){u.innerHTML='',u.title="Currently loaded information sourced from Torrent file",L(r.from(e))}))}catch(e){console.error(e)}}));let e=new i("#copyURL");e.on("success",(function(e){console.info(e)})),e.on("failure",(function(e){console.error(e)}));let t=new i("#copyMagnet");t.on("success",(function(e){console.info(e)})),t.on("failure",(function(e){console.error(e)})),d.addEventListener("input",M),d.addEventListener("change",M),d.addEventListener("reset",M),d.addEventListener("paste",M),h.addEventListener("click",P),g.addEventListener("input",M),g.addEventListener("change",M),g.addEventListener("reset",M),g.addEventListener("paste",M),b.addEventListener("click",N),x.addEventListener("click",q),_.addEventListener("click",(()=>D("announce"))),k.addEventListener("click",q),E.addEventListener("click",(()=>D("urlList"))),C.addEventListener("click",z),window.location.hash&&(u.innerHTML='',u.title="Currently loaded information sourced from shared torrent.parts link",L(window.location.hash.split("#")[1]))}))},{Buffer:1,bytes:61,clipboard:78,"mime-types":143,"parse-torrent":183,webtorrent:307}]},{},[335]); \ No newline at end of file +const{EventEmitter:r}=e("events"),a=e("simple-concat"),o=e("create-torrent"),c=e("debug")("webtorrent"),l=e("bittorrent-dht/client"),p=e("load-ip-set"),u=e("run-parallel"),d=e("parse-torrent"),h=e("path"),f=e("simple-peer"),m=e("randombytes"),g=e("speedometer"),v=e("./lib/conn-pool"),b=e("./lib/torrent"),x=e("./package.json").version,_=x.replace(/\d*./g,(e=>("0"+e%100).slice(-2))).slice(0,4),y=`-WW${_}-`;class w extends r{constructor(e={}){super(),"string"==typeof e.peerId?this.peerId=e.peerId:s.isBuffer(e.peerId)?this.peerId=e.peerId.toString("hex"):this.peerId=s.from(y+m(9).toString("base64")).toString("hex"),this.peerIdBuffer=s.from(this.peerId,"hex"),"string"==typeof e.nodeId?this.nodeId=e.nodeId:s.isBuffer(e.nodeId)?this.nodeId=e.nodeId.toString("hex"):this.nodeId=m(20).toString("hex"),this.nodeIdBuffer=s.from(this.nodeId,"hex"),this._debugId=this.peerId.toString("hex").substring(0,7),this.destroyed=!1,this.listening=!1,this.torrentPort=e.torrentPort||0,this.dhtPort=e.dhtPort||0,this.tracker=void 0!==e.tracker?e.tracker:{},this.torrents=[],this.maxConns=Number(e.maxConns)||55,this.utp=!0===e.utp,this._debug("new webtorrent (peerId %s, nodeId %s, port %s)",this.peerId,this.nodeId,this.torrentPort),this.tracker&&("object"!=typeof this.tracker&&(this.tracker={}),e.rtcConfig&&(console.warn("WebTorrent: opts.rtcConfig is deprecated. Use opts.tracker.rtcConfig instead"),this.tracker.rtcConfig=e.rtcConfig),e.wrtc&&(console.warn("WebTorrent: opts.wrtc is deprecated. Use opts.tracker.wrtc instead"),this.tracker.wrtc=e.wrtc),i.WRTC&&!this.tracker.wrtc&&(this.tracker.wrtc=i.WRTC)),"function"==typeof v?this._connPool=new v(this):n.nextTick((()=>{this._onListening()})),this._downloadSpeed=g(),this._uploadSpeed=g(),!1!==e.dht&&"function"==typeof l?(this.dht=new l(Object.assign({},{nodeId:this.nodeId},e.dht)),this.dht.once("error",(e=>{this._destroy(e)})),this.dht.once("listening",(()=>{const e=this.dht.address();e&&(this.dhtPort=e.port)})),this.dht.setMaxListeners(0),this.dht.listen(this.dhtPort)):this.dht=!1,this.enableWebSeeds=!1!==e.webSeeds;const t=()=>{this.destroyed||(this.ready=!0,this.emit("ready"))};"function"==typeof p&&null!=e.blocklist?p(e.blocklist,{headers:{"user-agent":`WebTorrent/${x} (https://webtorrent.io)`}},((e,n)=>{if(e)return this.error("Failed to load blocklist: "+e.message);this.blocked=n,t()})):n.nextTick(t)}get downloadSpeed(){return this._downloadSpeed()}get uploadSpeed(){return this._uploadSpeed()}get progress(){const e=this.torrents.filter((e=>1!==e.progress));return e.reduce(((e,t)=>e+t.downloaded),0)/(e.reduce(((e,t)=>e+(t.length||0)),0)||1)}get ratio(){return this.torrents.reduce(((e,t)=>e+t.uploaded),0)/(this.torrents.reduce(((e,t)=>e+t.received),0)||1)}get(e){if(e instanceof b){if(this.torrents.includes(e))return e}else{let t;try{t=d(e)}catch(e){}if(!t)return null;if(!t.infoHash)throw new Error("Invalid torrent identifier");for(const e of this.torrents)if(e.infoHash===t.infoHash)return e}return null}download(e,t,n){return console.warn("WebTorrent: client.download() is deprecated. Use client.add() instead"),this.add(e,t,n)}add(e,t={},n=(()=>{})){if(this.destroyed)throw new Error("client is destroyed");"function"==typeof t&&([t,n]=[{},t]);const i=()=>{if(!this.destroyed)for(const e of this.torrents)if(e.infoHash===r.infoHash&&e!==r)return void r._destroy(new Error("Cannot add duplicate torrent "+r.infoHash))},s=()=>{this.destroyed||(n(r),this.emit("torrent",r))};this._debug("add"),t=t?Object.assign({},t):{};const r=new b(e,this,t);return this.torrents.push(r),r.once("_infoHash",i),r.once("ready",s),r.once("close",(function e(){r.removeListener("_infoHash",i),r.removeListener("ready",s),r.removeListener("close",e)})),r}seed(e,t,n){if(this.destroyed)throw new Error("client is destroyed");"function"==typeof t&&([t,n]=[{},t]),this._debug("seed"),(t=t?Object.assign({},t):{}).skipVerify=!0;const i="string"==typeof e;i&&(t.path=h.dirname(e)),t.createdBy||(t.createdBy="WebTorrent/"+_);const s=e=>{this._debug("on seed"),"function"==typeof n&&n(e),e.emit("seed"),this.emit("seed",e)},r=this.add(null,t,(e=>{const t=[t=>{if(i)return t();e.load(c,t)}];this.dht&&t.push((t=>{e.once("dhtAnnounce",t)})),u(t,(t=>{if(!this.destroyed)return t?e._destroy(t):void s(e)}))}));let c;var l;return l=e,"undefined"!=typeof FileList&&l instanceof FileList?e=Array.from(e):Array.isArray(e)||(e=[e]),u(e.map((e=>t=>{!function(e){return"object"==typeof e&&null!=e&&"function"==typeof e.pipe}(e)?t(null,e):a(e,t)})),((e,n)=>{if(!this.destroyed)return e?r._destroy(e):void o.parseInput(n,t,((e,i)=>{if(!this.destroyed){if(e)return r._destroy(e);c=i.map((e=>e.getStream)),o(n,t,((e,t)=>{if(this.destroyed)return;if(e)return r._destroy(e);const n=this.get(t);n?r._destroy(new Error("Cannot add duplicate torrent "+n.infoHash)):r._onTorrentId(t)}))}}))})),r}remove(e,t,n){if("function"==typeof t)return this.remove(e,null,t);this._debug("remove");if(!this.get(e))throw new Error("No torrent with id "+e);this._remove(e,t,n)}_remove(e,t,n){if("function"==typeof t)return this._remove(e,null,t);const i=this.get(e);i&&(this.torrents.splice(this.torrents.indexOf(i),1),i.destroy(t,n))}address(){return this.listening?this._connPool?this._connPool.tcpServer.address():{address:"0.0.0.0",family:"IPv4",port:0}:null}destroy(e){if(this.destroyed)throw new Error("client already destroyed");this._destroy(null,e)}_destroy(e,t){this._debug("client destroy"),this.destroyed=!0;const n=this.torrents.map((e=>t=>{e.destroy(t)}));this._connPool&&n.push((e=>{this._connPool.destroy(e)})),this.dht&&n.push((e=>{this.dht.destroy(e)})),u(n,t),e&&this.emit("error",e),this.torrents=[],this._connPool=null,this.dht=null}_onListening(){if(this._debug("listening"),this.listening=!0,this._connPool){const e=this._connPool.tcpServer.address();e&&(this.torrentPort=e.port)}this.emit("listening")}_debug(){const e=[].slice.call(arguments);e[0]=`[${this._debugId}] ${e[0]}`,c(...e)}}w.WEBRTC_SUPPORT=f.WEBRTC_SUPPORT,w.VERSION=x,t.exports=w}).call(this)}).call(this,e("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},e("buffer").Buffer)},{"./lib/conn-pool":54,"./lib/torrent":312,"./package.json":332,_process:186,"bittorrent-dht/client":54,buffer:59,"create-torrent":79,debug:314,events:97,"load-ip-set":54,"parse-torrent":183,path:184,randombytes:194,"run-parallel":217,"simple-concat":220,"simple-peer":222,speedometer:262}],308:[function(e,t,n){const i=e("debug")("webtorrent:file-stream"),s=e("readable-stream");class r extends s.Readable{constructor(e,t){super(t),this.destroyed=!1,this._torrent=e._torrent;const n=t&&t.start||0,i=t&&t.end&&t.end{if(this._notifying=!1,!this.destroyed){if(i("read %s (length %s) (err %s)",e,n.length,t&&t.message),t)return this._destroy(t);this._offset&&(n=n.slice(this._offset),this._offset=0),this._missing{e.end()})),e}const t=new u(this,e);return this._torrent.select(t._startPiece,t._endPiece,!0,(()=>{t._notify()})),r(t,(()=>{this._destroyed||this._torrent.destroyed||this._torrent.deselect(t._startPiece,t._endPiece,!0)})),t}getBuffer(e){p(this.createReadStream(),this.length,e)}getBlob(e){if("undefined"==typeof window)throw new Error("browser-only method");c(this.createReadStream(),this._getMimeType()).then((t=>e(null,t)),(t=>e(t)))}getBlobURL(e){if("undefined"==typeof window)throw new Error("browser-only method");l(this.createReadStream(),this._getMimeType()).then((t=>e(null,t)),(t=>e(t)))}appendTo(e,t,n){if("undefined"==typeof window)throw new Error("browser-only method");o.append(this,e,t,n)}renderTo(e,t,n){if("undefined"==typeof window)throw new Error("browser-only method");o.render(this,e,t,n)}_getMimeType(){return o.mime[a.extname(this.name).toLowerCase()]}_destroy(){this._destroyed=!0,this._torrent=null}}}).call(this)}).call(this,e("_process"))},{"./file-stream":308,_process:186,"end-of-stream":95,events:97,path:184,"readable-stream":331,"render-media":211,"stream-to-blob":283,"stream-to-blob-url":282,"stream-with-known-length-to-buffer":284}],310:[function(e,t,n){const i=e("unordered-array-remove"),s=e("debug")("webtorrent:peer"),r=e("bittorrent-protocol"),a=e("./webconn");n.createWebRTCPeer=(e,t)=>{const n=new l(e.id,"webrtc");return n.conn=e,n.swarm=t,n.conn.connected?n.onConnect():(n.conn.once("connect",(()=>{n.onConnect()})),n.conn.once("error",(e=>{n.destroy(e)})),n.startConnectTimeout()),n},n.createTCPIncomingPeer=e=>o(e,"tcpIncoming"),n.createUTPIncomingPeer=e=>o(e,"utpIncoming"),n.createTCPOutgoingPeer=(e,t)=>c(e,t,"tcpOutgoing"),n.createUTPOutgoingPeer=(e,t)=>c(e,t,"utpOutgoing");const o=(e,t)=>{const n=`${e.remoteAddress}:${e.remotePort}`,i=new l(n,t);return i.conn=e,i.addr=n,i.onConnect(),i},c=(e,t,n)=>{const i=new l(e,n);return i.addr=e,i.swarm=t,i};n.createWebSeedPeer=(e,t)=>{const n=new l(e,"webSeed");return n.swarm=t,n.conn=new a(e,t),n.onConnect(),n};class l{constructor(e,t){this.id=e,this.type=t,s("new %s Peer %s",t,e),this.addr=null,this.conn=null,this.swarm=null,this.wire=null,this.connected=!1,this.destroyed=!1,this.timeout=null,this.retries=0,this.sentHandshake=!1}onConnect(){if(this.destroyed)return;this.connected=!0,s("Peer %s connected",this.id),clearTimeout(this.connectTimeout);const e=this.conn;e.once("end",(()=>{this.destroy()})),e.once("close",(()=>{this.destroy()})),e.once("finish",(()=>{this.destroy()})),e.once("error",(e=>{this.destroy(e)}));const t=this.wire=new r;t.type=this.type,t.once("end",(()=>{this.destroy()})),t.once("close",(()=>{this.destroy()})),t.once("finish",(()=>{this.destroy()})),t.once("error",(e=>{this.destroy(e)})),t.once("handshake",((e,t)=>{this.onHandshake(e,t)})),this.startHandshakeTimeout(),e.pipe(t).pipe(e),this.swarm&&!this.sentHandshake&&this.handshake()}onHandshake(e,t){if(!this.swarm)return;if(this.destroyed)return;if(this.swarm.destroyed)return this.destroy(new Error("swarm already destroyed"));if(e!==this.swarm.infoHash)return this.destroy(new Error("unexpected handshake info hash for this swarm"));if(t===this.swarm.peerId)return this.destroy(new Error("refusing to connect to ourselves"));s("Peer %s got handshake %s",this.id,e),clearTimeout(this.handshakeTimeout),this.retries=0;let n=this.addr;!n&&this.conn.remoteAddress&&this.conn.remotePort&&(n=`${this.conn.remoteAddress}:${this.conn.remotePort}`),this.swarm._onWire(this.wire,n),this.swarm&&!this.swarm.destroyed&&(this.sentHandshake||this.handshake())}handshake(){const e={dht:!this.swarm.private&&!!this.swarm.client.dht};this.wire.handshake(this.swarm.infoHash,this.swarm.client.peerId,e),this.sentHandshake=!0}startConnectTimeout(){clearTimeout(this.connectTimeout);const e={webrtc:25e3,tcpOutgoing:5e3,utpOutgoing:5e3};this.connectTimeout=setTimeout((()=>{this.destroy(new Error("connect timeout"))}),e[this.type]),this.connectTimeout.unref&&this.connectTimeout.unref()}startHandshakeTimeout(){clearTimeout(this.handshakeTimeout),this.handshakeTimeout=setTimeout((()=>{this.destroy(new Error("handshake timeout"))}),25e3),this.handshakeTimeout.unref&&this.handshakeTimeout.unref()}destroy(e){if(this.destroyed)return;this.destroyed=!0,this.connected=!1,s("destroy %s %s (error: %s)",this.type,this.id,e&&(e.message||e)),clearTimeout(this.connectTimeout),clearTimeout(this.handshakeTimeout);const t=this.swarm,n=this.conn,r=this.wire;this.swarm=null,this.conn=null,this.wire=null,t&&r&&i(t.wires,t.wires.indexOf(r)),n&&(n.on("error",(()=>{})),n.destroy()),r&&r.destroy(),t&&t.removePeer(this.id)}}},{"./webconn":313,"bittorrent-protocol":10,debug:314,"unordered-array-remove":296}],311:[function(e,t,n){t.exports=class{constructor(e){this._torrent=e,this._numPieces=e.pieces.length,this._pieces=new Array(this._numPieces),this._onWire=e=>{this.recalculate(),this._initWire(e)},this._onWireHave=e=>{this._pieces[e]+=1},this._onWireBitfield=()=>{this.recalculate()},this._torrent.wires.forEach((e=>{this._initWire(e)})),this._torrent.on("wire",this._onWire),this.recalculate()}getRarestPiece(e){let t=[],n=1/0;for(let i=0;i{this._cleanupWireEvents(e)})),this._torrent=null,this._pieces=null,this._onWire=null,this._onWireHave=null,this._onWireBitfield=null}_initWire(e){e._onClose=()=>{this._cleanupWireEvents(e);for(let t=0;t{this.destroyed||this._onParsedTorrent(t)}))):x.remote(e,((e,t)=>{if(!this.destroyed)return e?this._destroy(e):void this._onParsedTorrent(t)}))}_onParsedTorrent(e){if(!this.destroyed){if(this._processParsedTorrent(e),!this.infoHash)return this._destroy(new Error("Malformed torrent data: No info hash"));this.path||(this.path=_.join(N,this.infoHash)),this._rechokeIntervalId=setInterval((()=>{this._rechoke()}),1e4),this._rechokeIntervalId.unref&&this._rechokeIntervalId.unref(),this.emit("_infoHash",this.infoHash),this.destroyed||(this.emit("infoHash",this.infoHash),this.destroyed||(this.client.listening?this._onListening():this.client.once("listening",(()=>{this._onListening()}))))}}_processParsedTorrent(e){this._debugId=e.infoHash.toString("hex").substring(0,7),void 0!==this.private&&(e.private=this.private),this.announce&&(e.announce=e.announce.concat(this.announce)),this.client.tracker&&i.WEBTORRENT_ANNOUNCE&&!e.private&&(e.announce=e.announce.concat(i.WEBTORRENT_ANNOUNCE)),this.urlList&&(e.urlList=e.urlList.concat(this.urlList)),e.announce=Array.from(new Set(e.announce)),e.urlList=Array.from(new Set(e.urlList)),Object.assign(this,e),this.magnetURI=x.toMagnetURI(e),this.torrentFile=x.toTorrentFile(e)}_onListening(){this.destroyed||(this.info?this._onMetadata(this):(this.xs&&this._getMetadataFromServer(),this._startDiscovery()))}_startDiscovery(){if(this.discovery||this.destroyed)return;let e=this.client.tracker;e&&(e=Object.assign({},this.client.tracker,{getAnnounceOpts:()=>{const e={uploaded:this.uploaded,downloaded:this.downloaded,left:Math.max(this.length-this.downloaded,0)};return this.client.tracker.getAnnounceOpts&&Object.assign(e,this.client.tracker.getAnnounceOpts()),this._getAnnounceOpts&&Object.assign(e,this._getAnnounceOpts()),e}})),this.peerAddresses&&this.peerAddresses.forEach((e=>this.addPeer(e))),this.discovery=new c({infoHash:this.infoHash,announce:this.announce,peerId:this.client.peerId,dht:!this.private&&this.client.dht,tracker:e,port:this.client.torrentPort,userAgent:P}),this.discovery.on("error",(e=>{this._destroy(e)})),this.discovery.on("peer",(e=>{"string"==typeof e&&this.done||this.addPeer(e)})),this.discovery.on("trackerAnnounce",(()=>{this.emit("trackerAnnounce"),0===this.numPeers&&this.emit("noPeers","tracker")})),this.discovery.on("dhtAnnounce",(()=>{this.emit("dhtAnnounce"),0===this.numPeers&&this.emit("noPeers","dht")})),this.discovery.on("warning",(e=>{this.emit("warning",e)}))}_getMetadataFromServer(){const e=this,t=(Array.isArray(this.xs)?this.xs:[this.xs]).map((t=>n=>{!function(t,n){if(0!==t.indexOf("http://")&&0!==t.indexOf("https://"))return e.emit("warning",new Error("skipping non-http xs param: "+t)),n(null);const i={url:t,method:"GET",headers:{"user-agent":P}};let s;try{s=d.concat(i,r)}catch(i){return e.emit("warning",new Error("skipping invalid url xs param: "+t)),n(null)}function r(i,s,r){if(e.destroyed)return n(null);if(e.metadata)return n(null);if(i)return e.emit("warning",new Error("http error from xs param: "+t)),n(null);if(200!==s.statusCode)return e.emit("warning",new Error(`non-200 status code ${s.statusCode} from xs param: ${t}`)),n(null);let a;try{a=x(r)}catch(i){}return a?a.infoHash!==e.infoHash?(e.emit("warning",new Error("got torrent file with incorrect info hash from xs param: "+t)),n(null)):(e._onMetadata(a),void n(null)):(e.emit("warning",new Error("got invalid torrent file from xs param: "+t)),n(null))}e._xsRequests.push(s)}(t,n)}));v(t)}_onMetadata(e){if(this.metadata||this.destroyed)return;let t;if(this._debug("got metadata"),this._xsRequests.forEach((e=>{e.abort()})),this._xsRequests=[],e&&e.infoHash)t=e;else try{t=x(e)}catch(e){return this._destroy(e)}if(this._processParsedTorrent(t),this.metadata=this.torrentFile,this.client.enableWebSeeds&&this.urlList.forEach((e=>{this.addWebSeed(e)})),this._rarityMap=new L(this),this.store=new h(new this._store(this.pieceLength,{torrent:{infoHash:this.infoHash},files:this.files.map((e=>({path:_.join(this.path,e.path),length:e.length,offset:e.offset}))),length:this.length,name:this.infoHash})),this.files=this.files.map((e=>new A(this,e))),this.so?this.files.forEach(((e,t)=>{this.so.includes(t)?this.files[t].select():this.files[t].deselect()})):0!==this.pieces.length&&this.select(0,this.pieces.length-1,!1),this._hashes=this.pieces,this.pieces=this.pieces.map(((e,t)=>{const n=t===this.pieces.length-1?this.lastPieceLength:this.pieceLength;return new y(n)})),this._reservations=this.pieces.map((()=>[])),this.bitfield=new r(this.pieces.length),this.wires.forEach((e=>{e.ut_metadata&&e.ut_metadata.setMetadata(this.metadata),this._onWireWithMetadata(e)})),this.emit("metadata"),!this.destroyed)if(this.skipVerify)this._markAllVerified(),this._onStore();else{const e=e=>{if(e)return this._destroy(e);this._debug("done verifying"),this._onStore()};this._debug("verifying existing torrent data"),this._fileModtimes&&this._store===u?this.getFileModtimes(((t,n)=>{if(t)return this._destroy(t);this.files.map(((e,t)=>n[t]===this._fileModtimes[t])).every((e=>e))?(this._markAllVerified(),this._onStore()):this._verifyPieces(e)})):this._verifyPieces(e)}}getFileModtimes(e){const t=[];b(this.files.map(((e,n)=>i=>{p.stat(_.join(this.path,e.path),((e,s)=>{if(e&&"ENOENT"!==e.code)return i(e);t[n]=s&&s.mtime.getTime(),i(null)}))})),U,(n=>{this._debug("done getting file modtimes"),e(n,t)}))}_verifyPieces(e){b(this.pieces.map(((e,t)=>e=>{if(this.destroyed)return e(new Error("torrent is destroyed"));this.store.get(t,((i,s)=>this.destroyed?e(new Error("torrent is destroyed")):i?n.nextTick(e,null):void E(s,(n=>{if(this.destroyed)return e(new Error("torrent is destroyed"));if(n===this._hashes[t]){if(!this.pieces[t])return e(null);this._debug("piece verified %s",t),this._markVerified(t)}else this._debug("piece invalid %s",t);e(null)}))))})),U,e)}rescanFiles(e){if(this.destroyed)throw new Error("torrent is destroyed");e||(e=H),this._verifyPieces((t=>{if(t)return this._destroy(t),e(t);this._checkDone(),e(null)}))}_markAllVerified(){for(let e=0;e{e.abort()})),this._rarityMap&&this._rarityMap.destroy();for(const e in this._peers)this.removePeer(e);this.files.forEach((e=>{e instanceof A&&e._destroy()}));const i=this._servers.map((e=>t=>{e.destroy(t)}));this.discovery&&i.push((e=>{this.discovery.destroy(e)})),this.store&&i.push((e=>{t&&t.destroyStore?this.store.destroy(e):this.store.close(e)})),v(i,n),e&&(0===this.listenerCount("error")?this.client.emit("error",e):this.emit("error",e)),this.emit("close"),this.client=null,this.files=[],this.discovery=null,this.store=null,this._rarityMap=null,this._peers=null,this._servers=null,this._xsRequests=null}addPeer(e){if(this.destroyed)throw new Error("torrent is destroyed");if(!this.infoHash)throw new Error("addPeer() must not be called before the `infoHash` event");if(this.client.blocked){let t;if("string"==typeof e){let n;try{n=s(e)}catch(t){return this._debug("ignoring peer: invalid %s",e),this.emit("invalidPeer",e),!1}t=n[0]}else"string"==typeof e.remoteAddress&&(t=e.remoteAddress);if(t&&this.client.blocked.contains(t))return this._debug("ignoring peer: blocked %s",e),"string"!=typeof e&&e.destroy(),this.emit("blockedPeer",e),!1}const t=!!this._addPeer(e,this.client.utp?"utp":"tcp");return t?this.emit("peer",e):this.emit("invalidPeer",e),t}_addPeer(e,t){if(this.destroyed)return"string"!=typeof e&&e.destroy(),null;if("string"==typeof e&&!this._validAddr(e))return this._debug("ignoring peer: invalid %s",e),null;const n=e&&e.id||e;if(this._peers[n])return this._debug("ignoring peer: duplicate (%s)",n),"string"!=typeof e&&e.destroy(),null;if(this.paused)return this._debug("ignoring peer: torrent is paused"),"string"!=typeof e&&e.destroy(),null;let i;return this._debug("add peer %s",n),i="string"==typeof e?"utp"===t?I.createUTPOutgoingPeer(e,this):I.createTCPOutgoingPeer(e,this):I.createWebRTCPeer(e,this),this._peers[i.id]=i,this._peersLength+=1,"string"==typeof e&&(this._queue.push(i),this._drain()),i}addWebSeed(e){if(this.destroyed)throw new Error("torrent is destroyed");if(!/^https?:\/\/.+/.test(e))return this.emit("warning",new Error("ignoring invalid web seed: "+e)),void this.emit("invalidPeer",e);if(this._peers[e])return this.emit("warning",new Error("ignoring duplicate web seed: "+e)),void this.emit("invalidPeer",e);this._debug("add web seed %s",e);const t=I.createWebSeedPeer(e,this);this._peers[t.id]=t,this._peersLength+=1,this.emit("peer",e)}_addIncomingPeer(e){return this.destroyed?e.destroy(new Error("torrent is destroyed")):this.paused?e.destroy(new Error("torrent is paused")):(this._debug("add incoming peer %s",e.id),this._peers[e.id]=e,void(this._peersLength+=1))}removePeer(e){const t=e&&e.id||e;(e=this._peers[t])&&(this._debug("removePeer %s",t),delete this._peers[t],this._peersLength-=1,e.destroy(),this._drain())}select(e,t,n,i){if(this.destroyed)throw new Error("torrent is destroyed");if(e<0||tt.priority-e.priority)),this._updateSelections()}deselect(e,t,n){if(this.destroyed)throw new Error("torrent is destroyed");n=Number(n)||0,this._debug("deselect %s-%s (priority %s)",e,t,n);for(let i=0;i{this.destroyed||(this.received+=e,this._downloadSpeed(e),this.client._downloadSpeed(e),this.emit("download",e),this.destroyed||this.client.emit("download",e))})),e.on("upload",(e=>{this.destroyed||(this.uploaded+=e,this._uploadSpeed(e),this.client._uploadSpeed(e),this.emit("upload",e),this.destroyed||this.client.emit("upload",e))})),this.wires.push(e),t){const n=s(t);e.remoteAddress=n[0],e.remotePort=n[1]}this.client.dht&&this.client.dht.listening&&e.on("port",(n=>{if(!this.destroyed&&!this.client.dht.destroyed){if(!e.remoteAddress)return this._debug("ignoring PORT from peer with no address");if(0===n||n>65536)return this._debug("ignoring invalid PORT from peer");this._debug("port: %s (from %s)",n,t),this.client.dht.addNode({host:e.remoteAddress,port:n})}})),e.on("timeout",(()=>{this._debug("wire timeout (%s)",t),e.destroy()})),e.setTimeout(3e4,!0),e.setKeepAlive(!0),e.use(C(this.metadata)),e.ut_metadata.on("warning",(e=>{this._debug("ut_metadata warning: %s",e.message)})),this.metadata||(e.ut_metadata.on("metadata",(e=>{this._debug("got metadata via ut_metadata"),this._onMetadata(e)})),e.ut_metadata.fetch()),"function"!=typeof T||this.private||(e.use(T()),e.ut_pex.on("peer",(e=>{this.done||(this._debug("ut_pex: got peer: %s (from %s)",e,t),this.addPeer(e))})),e.ut_pex.on("dropped",(e=>{const n=this._peers[e];n&&!n.connected&&(this._debug("ut_pex: dropped peer: %s (from %s)",e,t),this.removePeer(e))})),e.once("close",(()=>{e.ut_pex.reset()}))),this.emit("wire",e,t),this.metadata&&n.nextTick((()=>{this._onWireWithMetadata(e)}))}_onWireWithMetadata(e){let t=null;const n=()=>{this.destroyed||e.destroyed||(this._numQueued>2*(this._numConns-this.numPeers)&&e.amInterested?e.destroy():(t=setTimeout(n,B),t.unref&&t.unref()))};let i;const s=()=>{if(e.peerPieces.buffer.length===this.bitfield.buffer.length){for(i=0;i{s(),this._update(),this._updateWireInterest(e)})),e.on("have",(()=>{s(),this._update(),this._updateWireInterest(e)})),e.once("interested",(()=>{e.unchoke()})),e.once("close",(()=>{clearTimeout(t)})),e.on("choke",(()=>{clearTimeout(t),t=setTimeout(n,B),t.unref&&t.unref()})),e.on("unchoke",(()=>{clearTimeout(t),this._update()})),e.on("request",((t,n,i,s)=>{if(i>131072)return e.destroy();this.pieces[t]||this.store.get(t,{offset:n,length:i},s)})),e.bitfield(this.bitfield),this._updateWireInterest(e),e.peerExtensions.dht&&this.client.dht&&this.client.dht.listening&&e.port(this.client.dht.address().port),"webSeed"!==e.type&&(t=setTimeout(n,B),t.unref&&t.unref()),e.isSeeder=!1,s()}_updateSelections(){this.ready&&!this.destroyed&&(n.nextTick((()=>{this._gcSelections()})),this._updateInterest(),this._update())}_gcSelections(){for(let e=0;ethis._updateWireInterest(e))),e!==this._amInterested&&(this._amInterested?this.emit("interested"):this.emit("uninterested"))}_updateWireInterest(e){let t=!1;for(let n=0;n=i.from+i.offset;--r)if(e.peerPieces.get(r)&&t._request(e,r,!1))return}}();const n=q(e,.5);if(e.requests.length>=n)return;const i=q(e,1);function s(t,n,i,s){return r=>r>=t&&r<=n&&!(r in i)&&e.peerPieces.get(r)&&(!s||s(r))}function r(e){let n=e;for(let i=e;i=i)return!0;const a=function(){const n=e.downloadSpeed()||1;if(n>O)return()=>!0;const i=Math.max(1,e.requests.length)*y.BLOCK_LENGTH/n;let s=10,r=0;return e=>{if(!s||t.bitfield.get(e))return!0;let a=t.pieces[e].missing;for(;r0))return s--,!1}return!0}}();for(let o=0;o({wire:e,random:Math.random()}))).sort(((e,t)=>{const n=e.wire,i=t.wire;return n.downloadSpeed()!==i.downloadSpeed()?n.downloadSpeed()-i.downloadSpeed():n.uploadSpeed()!==i.uploadSpeed()?n.uploadSpeed()-i.uploadSpeed():n.amChoking!==i.amChoking?n.amChoking?-1:1:e.random-t.random})).map((e=>e.wire));this._rechokeOptimisticTime<=0?this._rechokeOptimisticWire=null:this._rechokeOptimisticTime-=1;let t=0;for(;e.length>0&&t0){const t=e.filter((e=>e.peerInterested));if(t.length>0){const e=t[(n=t.length,Math.random()*n|0)];e.unchoke(),this._rechokeOptimisticWire=e,this._rechokeOptimisticTime=2}}var n;e.filter((e=>e!==this._rechokeOptimisticWire)).forEach((e=>e.choke()))}_hotswap(e,t){const n=e.downloadSpeed();if(n=O||(2*o>n||o>a||(s=t,a=o))}if(!s)return!1;for(r=0;r=(a?Math.min(function(e,t,n){return 1+Math.ceil(t*e.downloadSpeed()/n)}(e,1,s.pieceLength),s.maxWebConns):q(e,1)))return!1;const o=s.pieces[t];let c=a?o.reserveRemaining():o.reserve();if(-1===c&&i&&s._hotswap(e,t)&&(c=a?o.reserveRemaining():o.reserve()),-1===c)return!1;let l=s._reservations[t];l||(l=s._reservations[t]=[]);let p=l.indexOf(null);-1===p&&(p=l.length),l[p]=e;const u=o.chunkOffset(c),d=a?o.chunkLengthRemaining(c):o.chunkLength(c);function h(){n.nextTick((()=>{s._update()}))}return e.request(t,u,d,(function n(i,r){if(s.destroyed)return;if(!s.ready)return s.once("ready",(()=>{n(i,r)}));if(l[p]===e&&(l[p]=null),o!==s.pieces[t])return h();if(i)return s._debug("error getting piece %s (offset: %s length: %s) from %s: %s",t,u,d,`${e.remoteAddress}:${e.remotePort}`,i.message),a?o.cancelRemaining(c):o.cancel(c),void h();if(s._debug("got piece %s (offset: %s length: %s) from %s",t,u,d,`${e.remoteAddress}:${e.remotePort}`),!o.set(c,r,e))return h();const f=o.flush();E(f,(e=>{if(!s.destroyed){if(e===s._hashes[t]){if(!s.pieces[t])return;s._debug("piece verified %s",t),s.pieces[t]=null,s._reservations[t]=null,s.bitfield.set(t,!0),s.store.put(t,f),s.wires.forEach((e=>{e.have(t)})),s._checkDone()&&!s.destroyed&&s.discovery.complete()}else s.pieces[t]=new y(o.length),s.emit("warning",new Error(`Piece ${t} failed verification`));h()}}))})),!0}_checkDone(){if(this.destroyed)return;this.files.forEach((e=>{if(!e.done){for(let t=e._startPiece;t<=e._endPiece;++t)if(!this.bitfield.get(t))return;e.done=!0,e.emit("done"),this._debug("file done: "+e.name)}}));let e=!0;for(let t=0;t{this.load(e,t)}));Array.isArray(e)||(e=[e]),t||(t=H);const n=new f(e),i=new a(this.store,this.pieceLength);w(n,i,(e=>{if(e)return t(e);this._markAllVerified(),this._checkDone(),t(null)}))}createServer(e){if("function"!=typeof R)throw new Error("node.js-only method");if(this.destroyed)throw new Error("torrent is destroyed");const t=new R(this,e);return this._servers.push(t),t}pause(){this.destroyed||(this._debug("pause"),this.paused=!0)}resume(){this.destroyed||(this._debug("resume"),this.paused=!1,this._drain())}_debug(){const e=[].slice.call(arguments);e[0]=`[${this.client?this.client._debugId:"No Client"}] [${this._debugId}] ${e[0]}`,o(...e)}_drain(){if(this._debug("_drain numConns %s maxConns %s",this._numConns,this.client.maxConns),"function"!=typeof m.connect||this.destroyed||this.paused||this._numConns>=this.client.maxConns)return;this._debug("drain (%s queued, %s/%s peers)",this._numQueued,this.numPeers,this.client.maxConns);const e=this._queue.shift();if(!e)return;this._debug("%s connect attempt to %s",e.type,e.addr);const t=s(e.addr),n={host:t[0],port:t[1]};"utpOutgoing"===e.type?e.conn=j.connect(n.port,n.host):e.conn=m.connect(n);const i=e.conn;i.once("connect",(()=>{e.onConnect()})),i.once("error",(t=>{e.destroy(t)})),e.startConnectTimeout(),i.on("close",(()=>{if(this.destroyed)return;if(e.retries>=M.length){if(this.client.utp){const t=this._addPeer(e.addr,"tcp");t&&(t.retries=0)}else this._debug("conn %s closed: will not re-add (max %s attempts)",e.addr,M.length);return}const t=M[e.retries];this._debug("conn %s closed: will re-add to queue in %sms (attempt %s)",e.addr,t,e.retries+1);const n=setTimeout((()=>{if(this.destroyed)return;const t=this._addPeer(e.addr,this.client.utp?"utp":"tcp");t&&(t.retries=e.retries+1)}),t);n.unref&&n.unref()}))}_validAddr(e){let t;try{t=s(e)}catch(e){return!1}const n=t[0],i=t[1];return i>0&&i<65535&&!("127.0.0.1"===n&&i===this.client.torrentPort)}}}).call(this)}).call(this,e("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"../package.json":332,"./file":309,"./peer":310,"./rarity-map":311,"./server":54,_process:186,"addr-to-ip-port":2,bitfield:9,"chunk-store-stream/write":77,debug:314,events:97,fs:55,"fs-chunk-store":140,"immediate-chunk-store":117,multistream:165,net:54,os:54,"parse-torrent":183,path:184,pump:187,"random-iterate":193,"run-parallel":217,"run-parallel-limit":216,"simple-get":221,"simple-sha1":241,speedometer:262,"torrent-discovery":289,"torrent-piece":293,ut_metadata:299,ut_pex:54,"utp-native":54}],313:[function(e,t,n){(function(n){(function(){const i=e("bitfield"),s=e("debug")("webtorrent:webconn"),r=e("simple-get"),a=e("simple-sha1"),o=e("bittorrent-protocol"),c=e("../package.json").version;t.exports=class extends o{constructor(e,t){super(),this.url=e,this.webPeerId=a.sync(e),this._torrent=t,this._init()}_init(){this.setKeepAlive(!0),this.once("handshake",((e,t)=>{if(this.destroyed)return;this.handshake(e,this.webPeerId);const n=this._torrent.pieces.length,s=new i(n);for(let e=0;e<=n;e++)s.set(e,!0);this.bitfield(s)})),this.once("interested",(()=>{s("interested"),this.unchoke()})),this.on("uninterested",(()=>{s("uninterested")})),this.on("choke",(()=>{s("choke")})),this.on("unchoke",(()=>{s("unchoke")})),this.on("bitfield",(()=>{s("bitfield")})),this.on("request",((e,t,n,i)=>{s("request pieceIndex=%d offset=%d length=%d",e,t,n),this.httpRequest(e,t,n,i)}))}httpRequest(e,t,i,a){const o=e*this._torrent.pieceLength+t,l=o+i-1,p=this._torrent.files;let u;if(p.length<=1)u=[{url:this.url,start:o,end:l}];else{const e=p.filter((e=>e.offset<=l&&e.offset+e.length>o));if(e.length<1)return a(new Error("Could not find file corresponnding to web seed range request"));u=e.map((e=>{const t=e.offset+e.length-1;return{url:this.url+("/"===this.url[this.url.length-1]?"":"/")+e.path,fileOffsetInRange:Math.max(e.offset-o,0),start:Math.max(o-e.offset,0),end:Math.min(t,l-e.offset)}}))}let d,h=0,f=!1;u.length>1&&(d=n.alloc(i)),u.forEach((n=>{const o=n.url,l=n.start,p=n.end;s("Requesting url=%s pieceIndex=%d offset=%d length=%d start=%d end=%d",o,e,t,i,l,p);const m={url:o,method:"GET",headers:{"user-agent":`WebTorrent/${c} (https://webtorrent.io)`,range:`bytes=${l}-${p}`}};function g(e,t){if(e.statusCode<200||e.statusCode>=300)return f=!0,a(new Error("Unexpected HTTP status code "+e.statusCode));s("Got data of length %d",t.length),1===u.length?a(null,t):(t.copy(d,n.fileOffsetInRange),++h===u.length&&a(null,d))}r.concat(m,((e,t,n)=>{if(!f)return e?"undefined"==typeof window||o.startsWith(window.location.origin+"/")?(f=!0,a(e)):r.head(o,((t,n)=>{if(!f){if(t)return f=!0,a(t);if(n.statusCode<200||n.statusCode>=300)return f=!0,a(new Error("Unexpected HTTP status code "+n.statusCode));if(n.url===o)return f=!0,a(e);m.url=n.url,r.concat(m,((e,t,n)=>{if(!f)return e?(f=!0,a(e)):void g(t,n)}))}})):void g(t,n)}))}))}destroy(){super.destroy(),this._torrent=null}}}).call(this)}).call(this,e("buffer").Buffer)},{"../package.json":332,bitfield:9,"bittorrent-protocol":10,buffer:59,debug:314,"simple-get":221,"simple-sha1":241}],314:[function(e,t,n){arguments[4][12][0].apply(n,arguments)},{"./common":315,_process:186,dup:12}],315:[function(e,t,n){arguments[4][13][0].apply(n,arguments)},{dup:13,ms:316}],316:[function(e,t,n){arguments[4][14][0].apply(n,arguments)},{dup:14}],317:[function(e,t,n){arguments[4][15][0].apply(n,arguments)},{dup:15}],318:[function(e,t,n){arguments[4][16][0].apply(n,arguments)},{"./_stream_readable":320,"./_stream_writable":322,_process:186,dup:16,inherits:118}],319:[function(e,t,n){arguments[4][17][0].apply(n,arguments)},{"./_stream_transform":321,dup:17,inherits:118}],320:[function(e,t,n){arguments[4][18][0].apply(n,arguments)},{"../errors":317,"./_stream_duplex":318,"./internal/streams/async_iterator":323,"./internal/streams/buffer_list":324,"./internal/streams/destroy":325,"./internal/streams/from":327,"./internal/streams/state":329,"./internal/streams/stream":330,_process:186,buffer:59,dup:18,events:97,inherits:118,"string_decoder/":285,util:54}],321:[function(e,t,n){arguments[4][19][0].apply(n,arguments)},{"../errors":317,"./_stream_duplex":318,dup:19,inherits:118}],322:[function(e,t,n){arguments[4][20][0].apply(n,arguments)},{"../errors":317,"./_stream_duplex":318,"./internal/streams/destroy":325,"./internal/streams/state":329,"./internal/streams/stream":330,_process:186,buffer:59,dup:20,inherits:118,"util-deprecate":304}],323:[function(e,t,n){arguments[4][21][0].apply(n,arguments)},{"./end-of-stream":326,_process:186,dup:21}],324:[function(e,t,n){arguments[4][22][0].apply(n,arguments)},{buffer:59,dup:22,util:54}],325:[function(e,t,n){arguments[4][23][0].apply(n,arguments)},{_process:186,dup:23}],326:[function(e,t,n){arguments[4][24][0].apply(n,arguments)},{"../../../errors":317,dup:24}],327:[function(e,t,n){arguments[4][25][0].apply(n,arguments)},{dup:25}],328:[function(e,t,n){arguments[4][26][0].apply(n,arguments)},{"../../../errors":317,"./end-of-stream":326,dup:26}],329:[function(e,t,n){arguments[4][27][0].apply(n,arguments)},{"../../../errors":317,dup:27}],330:[function(e,t,n){arguments[4][28][0].apply(n,arguments)},{dup:28,events:97}],331:[function(e,t,n){arguments[4][29][0].apply(n,arguments)},{"./lib/_stream_duplex.js":318,"./lib/_stream_passthrough.js":319,"./lib/_stream_readable.js":320,"./lib/_stream_transform.js":321,"./lib/_stream_writable.js":322,"./lib/internal/streams/end-of-stream.js":326,"./lib/internal/streams/pipeline.js":328,dup:29}],332:[function(e,t,n){t.exports={version:"0.110.1"}},{}],333:[function(e,t,n){t.exports=function e(t,n){if(t&&n)return e(t)(n);if("function"!=typeof t)throw new TypeError("need wrapper function");return Object.keys(t).forEach((function(e){i[e]=t[e]})),i;function i(){for(var e=new Array(arguments.length),n=0;n',i.addEventListener("click",H),t.appendChild(i),y.appendChild(t)}if(w.innerHTML="",l.urlList&&l.urlList.length)for(let e=0;e',i.addEventListener("click",H),t.appendChild(i),w.appendChild(t)}if(S.innerHTML="",l.files&&l.files.length){C.style.display="none";for(let e of l.files){let t=U(o.lookup(e.name));S.appendChild(O(t,e.name,e.length))}S.appendChild(O("folder-tree","",l.length)),A.addEventListener("click",W),A.disabled=!1}else I.torrents.length>0?(C.style.display="none",S.innerHTML=''):(C.style.display="block",S.innerHTML=''),A.removeEventListener("click",W),A.disabled=!0;T.setAttribute("data-clipboard-text",window.location.origin+"#"+s.toMagnetURI(l)),j.setAttribute("data-clipboard-text",s.toMagnetURI(l)),p.style.display="flex",window.location.hash=s.toMagnetURI(l),l.name?document.title="Torrent Parts | "+l.name:document.title="Torrent Parts | Inspect and edit what's in your Torrent file or Magnet link"}function O(e,t,n){let i=document.createElement("tr"),s=document.createElement("td");s.innerHTML='',i.appendChild(s);let r=document.createElement("td");r.innerHTML=t,i.appendChild(r);let o=document.createElement("td");return o.innerHTML=a.format(n,{decimalPlaces:1,unitSeparator:" "}),i.appendChild(o),i}function U(e){if(!e)return"file";switch(!0){case e.includes("msword"):case e.includes("wordprocessingml"):case e.includes("opendocument.text"):case e.includes("abiword"):return"file-word";case e.includes("ms-excel"):case e.includes("spreadsheet"):return"file-powerpoint";case e.includes("powerpoint"):case e.includes("presentation"):return"file-powerpoint";case e.includes("7z-"):case e.includes("iso9660"):case e.includes("zip"):case e.includes("octet-stream"):return"file-archive";case e.includes("csv"):return"file-csv";case e.includes("pdf"):return"file-pdf";case e.includes("font"):return"file-contract";case e.includes("text"):case e.includes("subrip"):case e.includes("vtt"):return"file-alt";case e.includes("audio"):return"file-audio";case e.includes("image"):return"file-image";case e.includes("video"):return"file-video";default:return"file"}}function M(e){this.dataset.group?l[this.dataset.group][this.dataset.index]=this.value?this.value:"":l[this.id]=this.value?this.value:"",window.location.hash=s.toMagnetURI(l),F()}function P(){document.getElementById("magnet").value="",document.getElementById("torrent").value="",u.innerHTML='',u.title="",p.style.display="none",d.value="",f.value="",m.value="",g.value="",v.value="",y.innerHTML="",w.innerHTML="",I.torrents.forEach((e=>e.destroy())),C.style.display="block",S.innerHTML="",window.location.hash="",T.setAttribute("data-clipboard-text",""),j.setAttribute("data-clipboard-text",""),document.title="Torrent Parts | Inspect and edit what's in your Torrent file or Magnet link"}async function N(){b.className="disabled",b.innerHTML="Adding...";try{let e=await fetch("https://newtrackon.com/api/100"),t=await e.text();l.announce=l.announce.concat(t.split("\n\n")),l.announce.push("http://bt1.archive.org:6969/announce"),l.announce.push("http://bt2.archive.org:6969/announce"),l.announce=l.announce.filter(((e,t)=>e&&l.announce.indexOf(e)===t)),F()}catch(e){console.error(e)}b.innerHTML="Add Known Working Trackers",b.className="",B()}function q(){l[this.dataset.type].unshift(""),B()}function H(){l[this.parentElement.className].splice(this.parentElement.dataset.index,1),B()}function D(e){l[e]=[],F(),B()}function F(){l.created=new Date,l.createdBy="Torrent Parts ",l.created?(f.value=l.created.toISOString().slice(0,19),f.type="datetime-local"):f.type="text",m.value=l.createdBy?"by "+l.createdBy:""}function z(){console.info("Attempting fetching files from Webtorrent..."),C.style.display="none",l.announce.push("wss://tracker.webtorrent.io"),l.announce.push("wss://tracker.openwebtorrent.com"),l.announce.push("wss://tracker.btorrent.xyz"),l.announce.push("wss://tracker.fastcast.nz"),l.announce=l.announce.filter(((e,t)=>e&&l.announce.indexOf(e)===t)),I.add(s.toMagnetURI(l),(e=>{l.info=Object.assign({},e.info),l.files=e.files,l.infoBuffer=e.infoBuffer,l.length=e.length,l.lastPieceLength=e.lastPieceLength,F(),B(),e.destroy()})),B()}function W(){let e=s.toTorrentFile(l);if(null!==e&&navigator.msSaveBlob)return navigator.msSaveBlob(new Blob([e],{type:"application/x-bittorrent"}),l.name+".torrent");let t=document.createElement("a");t.style.display="none";let n=window.URL.createObjectURL(new Blob([e],{type:"application/x-bittorrent"}));t.setAttribute("href",n),t.setAttribute("download",l.name+".torrent"),document.body.appendChild(t),t.click(),window.URL.revokeObjectURL(n),t.remove()}document.addEventListener("DOMContentLoaded",(function(){document.getElementById("magnet").addEventListener("keyup",(function(e){e.preventDefault(),"Enter"===e.key&&(u.innerHTML='',u.title="Currently loaded information sourced from Magnet URL",L(magnet.value))})),document.getElementById("torrent").addEventListener("change",(function(e){e.preventDefault();try{e.target.files[0].arrayBuffer().then((function(e){u.innerHTML='',u.title="Currently loaded information sourced from Torrent file",L(r.from(e))}))}catch(e){console.error(e)}}));let e=new i("#copyURL");e.on("success",(function(e){console.info(e)})),e.on("failure",(function(e){console.error(e)}));let t=new i("#copyMagnet");t.on("success",(function(e){console.info(e)})),t.on("failure",(function(e){console.error(e)})),d.addEventListener("input",M),d.addEventListener("change",M),d.addEventListener("reset",M),d.addEventListener("paste",M),h.addEventListener("click",P),g.addEventListener("input",M),g.addEventListener("change",M),g.addEventListener("reset",M),g.addEventListener("paste",M),b.addEventListener("click",N),x.addEventListener("click",q),_.addEventListener("click",(()=>D("announce"))),k.addEventListener("click",q),E.addEventListener("click",(()=>D("urlList"))),C.addEventListener("click",z),window.location.hash&&(u.innerHTML='',u.title="Currently loaded information sourced from shared torrent.parts link",L(window.location.hash.split("#")[1]))}))},{Buffer:1,bytes:61,clipboard:78,"mime-types":143,"parse-torrent":183,webtorrent:307}]},{},[335]); \ No newline at end of file diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..2870e11a54634b642d34ca10c4f98820eb55b21f GIT binary patch literal 31398 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 WicLRmHGMnK0tQc4KbLh*2~7ZKORC`j literal 0 HcmV?d00001 diff --git a/img/TorrentParts-Favicon-32.png b/img/TorrentParts-Favicon-32.png new file mode 100644 index 0000000000000000000000000000000000000000..3772cdd1520bf2987a8ae8311e370004a6849397 GIT binary patch literal 676 zcmV;V0$crwP)7$`RvCpHx%G!r8-HbhZm zZ+U2Pd}nccV{UjOF+dR^F+)#WTxW6{DmrX-fN*((T4it^Ej(^_fl5|lU}|+BFFsIP zXK#3dUukqtTV^spO*lqVC^tnEBQrHZP&Y+VA~8Q7E%-fEIXW{sngck{QUh* zS!K1lzo4hB&(hXBNmly%`$0`w&eGK;HA5>oNPdQo^Yrx4)7Ht%(CzN<^7Hg&aC-QW58`ohM_ zf{T-xpr@9dq;`LZPFiLfDmie_*4O|50TD?=K~#90&5~DB!ax*-H-ZIAlxD*aR1_O) zZ`dL#UC?qBEYS{l0Tvc4vk7C(+vM`24Q$Iij7hqqECSpt}d$ z+ZS+z-VZSlq=dlX2t*VD7#su-u^9ff!3cO%9mF8U3`!hqCWyx;ASRQPDZb`3ga(nC zq0EBk<{=g!(vq?WHo$V}r@^u^SXm`rQwQtdjZI>m2U{3ygEKqCyF7?su*YKGxz~XO zv8~r|Yy3Bv z@BM8^D7m|TaBHiYRD1iY)*dmbH=<^1|CzY{^!)Pr_U_&OSv~-gW=KjHOqKfp0000< KMNUMnLSTYW3OpVF literal 0 HcmV?d00001 diff --git a/img/TorrentParts-Favicon.psd b/img/TorrentParts-Favicon.psd new file mode 100644 index 0000000000000000000000000000000000000000..f251d835b983be9c5ff24d5aefc6a1a6f20bfbae GIT binary patch literal 6911 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 Gto<8+b~d^I literal 0 HcmV?d00001 diff --git a/img/TorrentParts-Icon-.5x.png b/img/TorrentParts-Icon-.5x.png new file mode 100644 index 0000000000000000000000000000000000000000..be92f879d64d56bde611a3c33736f4d4182ec955 GIT binary patch literal 849 zcmV-X1FrmuP)Y zM^s=nLQqChUlSuU6CyG;L{TI%K`A#yD>+9VEj;`C`%PG6Wp8@=`upVO=bWRexxK>I z+T6av$N2d9L{VO(s<3*4jMUfKEILTw;^bUsavv@|`TF|e@XF26%g@sB^7E6LqBlfR`T6+J49PFpZOOwrWW%+S*rDL90Tlz@nlp{K6; z`};0CNp^pT)7IJj{r&y@{?*vqc!7#7J4sPpXqKI%qp7c#o~3z$i&9=`^x7WG0004S zNklM^6JW5QR5Da41XfH7rZ$JrH_XdI>G`y7b;5K!E?wfq=(>@j6IId+5ybVl8G8* z!8R2V24qWv|1`+S&7;bPqyT_IhmBXEsJMix6cRT8Wg2Qwu0uh>fC|*WBW6&E8dQlH zRHFtpVg|LSK^@aqPeFs=5gM7kCJLGv(1IGYdSPE11?{lz!vlqMz{XArx?sJV;4i5M zHuipBR-X^n`#Dc>fH~`6_!f*Iraa6s7#U?+$HpfVWpZkoDf(x4+c2xMnwwt;M3fe} z>$J42TWDpKzmRKI2J03Zt!?n_%^bMPe;dVPC0iTwRZ bN!ec?OecU4rP7We00000NkvXXu0mjfA##M! literal 0 HcmV?d00001 diff --git a/img/TorrentParts-Icon-1x.png b/img/TorrentParts-Icon-1x.png new file mode 100644 index 0000000000000000000000000000000000000000..24ffe8e94ef6d9754dbbdaa999cd8cb6c148e0e4 GIT binary patch literal 1569 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 aNeTNzB)wogP&+T;PbpmA6jGt<81_FT7mnlr literal 0 HcmV?d00001 diff --git a/img/TorrentParts-Icon.psd b/img/TorrentParts-Icon.psd new file mode 100644 index 0000000000000000000000000000000000000000..c08f506dd1a5f8b841306742c7bc7f268720f202 GIT binary patch literal 25971 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 z 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 literal 0 HcmV?d00001 diff --git a/index.html b/index.html index 0227037..5e0ff0a 100644 --- a/index.html +++ b/index.html @@ -10,6 +10,27 @@ + + + + + + + + + + + + + + + + + + + + + Torrent Parts | Inspect and edit what's in your Torrent file or Magnet link diff --git a/parse.js b/parse.js index 707f732..8d62ee7 100644 --- a/parse.js +++ b/parse.js @@ -298,6 +298,8 @@ function propertyChange(e) { function resetProperties() { document.getElementById('magnet').value = ""; document.getElementById('torrent').value = ""; + originalSourceIcon.innerHTML = ''; + originalSourceIcon.title = ''; properties.style.display = 'none'; name.value = ""; created.value = ""; diff --git a/site.webmanifest b/site.webmanifest new file mode 100644 index 0000000..3b543b9 --- /dev/null +++ b/site.webmanifest @@ -0,0 +1,26 @@ +{ + "name": "Torrent Parts", + "description": "Inspect and edit what's in your Torrent file or Magnet link", + "theme_color": "#102030", + "background_color": "#102030", + "scope": "/", + "start_url": "/", + "display": "minimal-ui", + "icons": [ + { + "src": "/img/TorrentParts-Icon-.5x.png", + "sizes": "64x64", + "type": "image/png" + }, + { + "src": "/img/TorrentParts-Icon-1x.png", + "sizes": "128x128", + "type": "image/png" + }, + { + "src": "/img/TorrentParts-Icon-2x.png", + "sizes": "256x256", + "type": "image/png" + } + ] +} \ No newline at end of file