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