UNPKG

@liascript/exporter

Version:
2 lines (1 loc) 13.5 kB
var e=("undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:{}).parcelRequire55a5;e.register("hsMrW",(function(r,t){var n,a;n=r.exports,a=function(){return ve},Object.defineProperty(n,"joinRoom",{get:a,set:undefined,enumerable:!0,configurable:!0});var o,s,i,c,l,d,f,u,p,y,m,w,v,g,h,b,k,P,T=e("dM3DM"),S=e("aQXMn");const{floor:A,random:D}=Math,L="Trystero",$=(e,r)=>Array(e).fill().map(r),E=e=>$(e,(()=>"0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz"[A(62*D())])).join(""),I=E(20),C=Promise.all.bind(Promise),U="undefined"!=typeof window,{entries:_,fromEntries:j,keys:O}=Object,M=()=>{},H=e=>Error(`${L}: ${e}`),R=new TextEncoder,J=new TextDecoder,x=e=>R.encode(e),q=e=>J.decode(e),B=(...e)=>e.join("@"),N=JSON.stringify,G=JSON.parse,W={},z="AES-GCM",K={},Q=async e=>K[e]||(K[e]=Array.from(new Uint8Array(await crypto.subtle.digest("SHA-1",x(e)))).map((e=>e.toString(36))).join("")),V=async(e,r)=>{const t=crypto.getRandomValues(new Uint8Array(16));var n;return t.join(",")+"$"+(n=await crypto.subtle.encrypt({name:z,iv:t},await e,x(r)),btoa(String.fromCharCode.apply(null,new Uint8Array(n))))},X=async(e,r)=>{const[t,n]=r.split("$");return q(await crypto.subtle.decrypt({name:z,iv:new Uint8Array(t.split(","))},await e,(e=>{const r=atob(e);return new Uint8Array(r.length).map(((e,t)=>r.charCodeAt(t))).buffer})(n)))},F="icegatheringstatechange",Y=e=>e.replace(/a=ice-options:trickle\s\n/g,"");var Z=(e,{rtcConfig:r,rtcPolyfill:t,turnConfig:n})=>{const a=new(t||RTCPeerConnection)((0,T.default)({iceServers:ee.concat(n||[])},r)),o={},s=e=>{e.binaryType="arraybuffer",e.bufferedAmountLowThreshold=65535,e.onmessage=e=>{var r;return null===(r=o.data)||void 0===r?void 0:r.call(o,e.data)},e.onopen=()=>{var e;return null===(e=o.connect)||void 0===e?void 0:e.call(o)},e.onclose=()=>{var e;return null===(e=o.close)||void 0===e?void 0:e.call(o)},e.onerror=e=>{var r;return null===(r=o.error)||void 0===r?void 0:r.call(o,e)}},i=async e=>{if(!e.localDescription)throw Error("No local description available");return await Promise.race([new Promise((r=>{const t=()=>{"complete"===e.iceGatheringState&&(e.removeEventListener(F,t),r())};e.addEventListener(F,t),t()})),new Promise((e=>setTimeout(e,5e3)))]),{type:e.localDescription.type,sdp:Y(e.localDescription.sdp)}};let c=!1,l=null,d=!1;return e?(l=a.createDataChannel("data"),s(l)):a.ondatachannel=({channel:e})=>{l=e,s(e)},a.onnegotiationneeded=async()=>{try{var e;c=!0,await a.setLocalDescription();const r=await i(a);null===(e=o.signal)||void 0===e||e.call(o,{type:r.type,sdp:Y(r.sdp)})}catch(e){var r;null===(r=o.error)||void 0===r||r.call(o,e)}finally{c=!1}},a.onconnectionstatechange=()=>{var e;["disconnected","failed","closed"].includes(a.connectionState)&&(null===(e=o.close)||void 0===e||e.call(o))},a.ontrack=e=>{var r,t;null===(r=o.track)||void 0===r||r.call(o,e.track,e.streams[0]),null===(t=o.stream)||void 0===t||t.call(o,e.streams[0])},a.onremovestream=e=>{var r;null===(r=o.stream)||void 0===r||r.call(o,e.stream,{removed:!0})},{created:Date.now(),connection:a,get channel(){return l},get isDead(){return"closed"===a.connectionState},async signal(r){if("open"!==(null==l?void 0:l.readyState))try{if("offer"===r.type){var t;if((c||"stable"!==a.signalingState)&&(d=!e,d))return;await a.setRemoteDescription(r),await a.setLocalDescription();const n=await i(a),s=Y(n.sdp);return null===(t=o.signal)||void 0===t||t.call(o,{type:n.type,sdp:s}),{type:n.type,sdp:s}}"answer"!==r.type||"have-local-offer"!==a.signalingState&&"have-remote-offer"!==a.signalingState||await a.setRemoteDescription(r)}catch(e){var n;null===(n=o.error)||void 0===n||n.call(o,e)}else if(("offer"===r.type||"stable"!==a.signalingState)&&(await a.setRemoteDescription(r),"offer"===r.type)){var s;await a.setLocalDescription();const e=await i(a);return null===(s=o.signal)||void 0===s||s.call(o,{type:e.type,sdp:e.sdp}),{type:e.type,sdp:e.sdp}}},sendData:e=>l.send(e),destroy(){l&&l.close(),a.close()},setHandlers:e=>Object.assign(o,e),offerPromise:e?new Promise((e=>{o.signal=r=>{"offer"===r.type&&e(r)}})):Promise.resolve(),addStream(e){e.getTracks().forEach((r=>a.addTrack(r,e)))},removeStream(e){a.getSenders().filter((r=>e.getTracks().includes(r.track))).forEach((e=>a.removeTrack(e)))},addTrack:(e,r)=>a.addTrack(e,r),removeTrack(e){const r=a.getSenders().find((r=>r.track===e));r&&a.removeTrack(r)},async replaceTrack(e,r){const t=a.getSenders().find((r=>r.track===e));t&&await t.replaceTrack(r)}}};const ee=[...$(3,((e,r)=>`stun:stun${r||""}.l.google.com:19302`)),"stun:global.stun.twilio.com:3478"].map((e=>({urls:e}))),re=Object.getPrototypeOf(Uint8Array),te=16369,ne=255,ae="bufferedamountlow",oe=e=>"@_"+e,se={},ie={},ce={},le={},de={},fe={},ue={},pe={},ye=async e=>{if(ie[e])return ie[e];const r=(await Q(e)).slice(0,20);return ie[e]=r,ce[r]=e,r},me=async(e,r,t)=>e.send(N((0,T.default)({action:"announce",info_hash:await ye(r),peer_id:I},t))),we=(e,r,t)=>console.warn(`${L}: torrent tracker ${t?"failure":"warning"} from ${e} - ${r}`),ve=(({init:e,subscribe:r,announce:t})=>{const n={};let a,v,g,h=!1;return(b,k,P)=>{var A;const{appId:D}=b;if(null===(A=n[D])||void 0===A?void 0:A[k])return n[D][k];const E={},R={},J=B(L,D,k),W=Q(J),K=Q(B(J,I)),F=(async(e,r,t)=>crypto.subtle.importKey("raw",await crypto.subtle.digest({name:"SHA-256"},x(`${e}:${r}:${t}`)),{name:z},!1,["encrypt","decrypt"]))(b.password||"",D,k),Y=e=>async r=>({type:r.type,sdp:await e(F,r.sdp)}),ee=Y(X),se=Y(V),ie=()=>Z(!0,b),ce=(e,r,t)=>{var n;R[r]?R[r]!==e&&e.destroy():(R[r]=e,me(e,r),null===(n=E[r])||void 0===n||n.forEach(((e,r)=>{r!==t&&e.destroy()})),delete E[r])},le=(e,r)=>{R[r]===e&&delete R[r]},de=e=>(v.push(...$(e,ie)),C(v.splice(0,e).map((e=>e.offerPromise.then(se).then((r=>({peer:e,offer:r}))))))),fe=(e,r)=>null==P?void 0:P({error:`incorrect password (${b.password}) when decrypting ${r}`,appId:D,peerId:e,roomId:k});if(!b)throw H("requires a config map as the first argument");if(!D&&!b.firebaseApp)throw H("config map is missing appId field");if(!k)throw H("roomId argument required");if(!h){const r=e(b);v=$(20,ie),a=Array.isArray(r)?r:[r],h=!0,g=setInterval((()=>v=v.filter((e=>{const r=Date.now()-e.created<57333;return r||e.destroy(),r}))),59052.99)}const ue=a.map((()=>5333)),pe=[],ye=a.map((async(e,t)=>r(await e,await W,await K,(e=>async(r,t,n)=>{const[a,i]=await C([W,K]);if(r!==a&&r!==i)return;const{peerId:c,offer:l,answer:d,peer:f}="string"==typeof t?G(t):t;if(c!==I&&!R[c])if(!c||l||d){if(l){var u;if((null===(u=E[c])||void 0===u?void 0:u[e])&&I>c)return;const r=Z(!1,b);let t;r.setHandlers({connect:()=>ce(r,c,e),close:()=>le(r,c)});try{t=await ee(l)}catch(e){return void fe(c,"offer")}if(r.isDead)return;const[a,o]=await C([Q(B(J,c)),r.signal(t)]);n(a,N({peerId:I,answer:await se(o)}))}else if(d){let r;try{r=await ee(d)}catch(e){return void fe(c,"answer")}if(f)f.setHandlers({connect:()=>ce(f,c,e),close:()=>le(f,c)}),f.signal(r);else{var p;const t=null===(p=E[c])||void 0===p?void 0:p[e];t&&!t.isDead&&t.signal(r)}}}else{var y;if(null===(y=E[c])||void 0===y?void 0:y[e])return;const[[{peer:r,offer:t}],a]=await C([de(1),Q(B(J,c))]);(o=E)[s=c]||(o[s]=[]),E[c][e]=r,setTimeout((()=>((e,r)=>{var t;if(R[e])return;const n=null===(t=E[e])||void 0===t?void 0:t[r];n&&(delete E[e][r],n.destroy())})(c,e)),.9*ue[e]),r.setHandlers({connect:()=>ce(r,c,e),close:()=>le(r,c)}),n(a,N({peerId:I,offer:t}))}})(t),de)));C([W,K]).then((([e,r])=>{const n=async(a,o)=>{const s=await t(a,e,r);"number"==typeof s&&(ue[o]=s),pe[o]=setTimeout((()=>n(a,o)),ue[o])};ye.forEach((async(e,r)=>{await e,n(await a[r],r)}))}));let me=M;return(i=n)[c=D]||(i[c]={}),n[D][k]=((e,r,t)=>{const n={},a={},o={},s={},i={},c={},v={},g={onPeerJoin:M,onPeerLeave:M,onPeerStream:M,onPeerTrack:M},h=(e,r)=>(e?Array.isArray(e)?e:[e]:O(n)).flatMap((e=>{const t=n[e];return t?r(e,t):(console.warn(`${L}: no peer with id ${e} found`),[])})),b=e=>{n[e]&&(delete n[e],delete s[e],delete i[e],g.onPeerLeave(e),r(e))},k=e=>{if(a[e])return o[e];if(!e)throw H("action type argument is required");const r=x(e);if(r.byteLength>12)throw H(`action type string "${e}" (${r.byteLength}b) exceeds byte limit (12). Hint: choose a shorter name.`);const t=new Uint8Array(12);t.set(r);let s=0;return a[e]={onComplete:M,onProgress:M,setOnComplete:r=>a[e]=(0,S.default)((0,T.default)({},a[e]),{onComplete:r}),setOnProgress:r=>a[e]=(0,S.default)((0,T.default)({},a[e]),{onProgress:r}),async send(e,r,a,o){if(a&&"object"!=typeof a)throw H("action meta argument must be an object");const i=typeof e;if("undefined"===i)throw H("action data cannot be undefined");const c="string"!==i,l=e instanceof Blob,d=l||e instanceof ArrayBuffer||e instanceof re;if(a&&!d)throw H("action meta argument can only be used with binary data");const f=d?new Uint8Array(l?await e.arrayBuffer():e):x(c?N(e):e),u=a?x(N(a)):null,p=Math.ceil(f.byteLength/te)+(a?1:0)||1,y=$(p,((e,r)=>{const n=r===p-1,o=a&&0===r,i=new Uint8Array(15+(o?u.byteLength:n?f.byteLength-te*(p-(a?2:1)):te));return i.set(t),i.set([s],12),i.set([n|o<<1|d<<2|c<<3],13),i.set([Math.round((r+1)/p*ne)],14),i.set(a?o?u:f.subarray((r-1)*te,r*te):f.subarray(r*te,(r+1)*te),15),i}));return s=s+1&ne,C(h(r,(async(e,r)=>{const{channel:t}=r;let s=0;for(;s<p;){const i=y[s];if(t.bufferedAmount>t.bufferedAmountLowThreshold&&await new Promise((e=>{const r=()=>{t.removeEventListener(ae,r),e()};t.addEventListener(ae,r)})),!n[e])break;r.sendData(i),s++,null==o||o(i[14]/ne,e,a)}})))}},(l=o)[d=e]||(l[d]=[a[e].send,a[e].setOnComplete,a[e].setOnProgress])},P=(e,r)=>{const t=new Uint8Array(r),n=q(t.subarray(0,12)).replaceAll("\0",""),[o]=t.subarray(12,13),[i]=t.subarray(13,14),[c]=t.subarray(14,15),l=t.subarray(15),d=!!(1&i),v=!!(2&i),g=!!(4&i),h=!!(8&i);if(!a[n])return void console.warn(`${L}: received message with unregistered type (${n})`);(f=s)[u=e]||(f[u]={}),(p=s[e])[y=n]||(p[y]={});const b=(m=s[e][n])[w=o]||(m[w]={chunks:[]});if(v?b.meta=G(q(l)):b.chunks.push(l),a[n].onProgress(c/ne,e,b.meta),!d)return;const k=new Uint8Array(b.chunks.reduce(((e,r)=>e+r.byteLength),0));if(b.chunks.reduce(((e,r)=>(k.set(r,e),e+r.byteLength)),0),delete s[e][n][o],g)a[n].onComplete(k,e,b.meta);else{const r=q(k);a[n].onComplete(h?G(r):r,e)}},A=async()=>{await V(""),await new Promise((e=>setTimeout(e,99))),_(n).forEach((([e,r])=>{r.destroy(),delete n[e]})),t()},[D,E]=k(oe("ping")),[I,R]=k(oe("pong")),[J,B]=k(oe("signal")),[W,z]=k(oe("stream")),[K,Q]=k(oe("track")),[V,X]=k(oe("leave"));return me=(e,r)=>{var t;n[r]||(n[r]=e,e.setHandlers({data:e=>P(r,e),stream(e){g.onPeerStream(e,r,c[r]),delete c[r]},track(e,t){g.onPeerTrack(e,t,r,v[r]),delete v[r]},signal:e=>J(e,r),close:()=>b(r),error:()=>b(r)}),g.onPeerJoin(r),null===(t=e.drainEarlyData)||void 0===t||t.call(e,(e=>P(r,e))))},E(((e,r)=>I("",r))),R(((e,r)=>{var t;null===(t=i[r])||void 0===t||t.call(i),delete i[r]})),B(((e,r)=>{var t;return null===(t=n[r])||void 0===t?void 0:t.signal(e)})),z(((e,r)=>c[r]=e)),Q(((e,r)=>v[r]=e)),X(((e,r)=>b(r))),U&&addEventListener("beforeunload",A),{makeAction:k,leave:A,async ping(e){if(!e)throw H("ping() must be called with target peer ID");const r=Date.now();return D("",e),await new Promise((r=>i[e]=r)),Date.now()-r},getPeers:()=>j(_(n).map((([e,r])=>[e,r.connection]))),addStream:(e,r,t)=>h(r,(async(r,n)=>{t&&await W(t,r),n.addStream(e)})),removeStream:(e,r)=>h(r,((r,t)=>t.removeStream(e))),addTrack:(e,r,t,n)=>h(t,(async(t,a)=>{n&&await K(n,t),a.addTrack(e,r)})),removeTrack:(e,r,t)=>h(t,((t,n)=>n.removeTrack(e,r))),replaceTrack:(e,r,t,n,a)=>h(n,(async(n,o)=>{a&&await K(a,n),o.replaceTrack(e,r,t)})),onPeerJoin:e=>g.onPeerJoin=e,onPeerLeave:e=>g.onPeerLeave=e,onPeerStream:e=>g.onPeerStream=e,onPeerTrack:e=>g.onPeerTrack=e}})(0,(e=>delete R[e]),(()=>{delete n[D][k],pe.forEach(clearTimeout),ye.forEach((async e=>(await e)())),clearInterval(g)}))}})({init:e=>((e,r,t)=>(e.relayUrls||r).slice(0,e.relayUrls?e.relayUrls.length:e.relayRedundancy||3))(e,ge).map((e=>{const r=((e,r)=>{const t={},n=()=>{const a=new WebSocket(e);a.onclose=()=>{var r;null!==(r=(v=W)[g=e])&&void 0!==r||(v[g]=3333),setTimeout(n,W[e]),W[e]*=2},a.onmessage=e=>r(e.data),t.socket=a,t.url=a.url,t.ready=new Promise((r=>a.onopen=()=>{r(t),W[e]=3333})),t.send=e=>{1===a.readyState&&a.send(e)}};return n(),t})(e,(e=>{const r=G(e),n=r["failure reason"],a=r["warning message"],{interval:o}=r,s=ce[r.info_hash];if(n)we(t,n,!0);else{var i,c;if(a&&we(t,a),o&&1e3*o>fe[t]&&de[t][s]){const e=Math.min(1e3*o,120333);clearInterval(le[t][s]),fe[t]=e,le[t][s]=setInterval(de[t][s],e)}ue[r.offer_id]||(r.offer||r.answer)&&(ue[r.offer_id]=!0,null===(c=(i=pe[t])[s])||void 0===c||c.call(i,r))}})),{url:t}=r;return se[t]=r,pe[t]={},r.ready})),subscribe(e,r,t,n,a){const{url:o}=e,s=async()=>{const t=j((await a(10)).map((e=>[E(20),e])));pe[e.url][r]=a=>{if(a.offer)n(r,{offer:a.offer,peerId:a.peer_id},((t,n)=>me(e,r,{answer:G(n).answer,offer_id:a.offer_id,to_peer_id:a.peer_id})));else if(a.answer){const e=t[a.offer_id];e&&n(r,{answer:a.answer,peerId:a.peer_id,peer:e.peer})}},me(e,r,{numwant:10,offers:_(t).map((([e,{offer:r}])=>({offer_id:e,offer:r})))})};return fe[o]=33333,(h=de)[b=o]||(h[b]={}),de[o][r]=s,(k=le)[P=o]||(k[P]={}),le[o][r]=setInterval(s,fe[o]),s(),()=>{clearInterval(le[o][r]),delete pe[o][r],delete de[o][r]}},announce:e=>fe[e.url]});const ge=["tracker.webtorrent.dev","tracker.openwebtorrent.com","tracker.btorrent.xyz","tracker.files.fm:7073/announce"].map((e=>"wss://"+e))}));