maria2
Version:
Simple and Light RPC Library for aria2
3 lines (2 loc) • 4.6 kB
JavaScript
var C=Object.defineProperty;var s=(e,r)=>C(e,"name",{value:r,configurable:!0});var l=(e=>(e[e.Connecting=0]="Connecting",e[e.Open=1]="Open",e[e.Closing=2]="Closing",e[e.Closed=3]="Closed",e))(l||{});function P(e){let r,t=!1;return(...n)=>t?r:(t=!0,r=e(...n))}s(P,"once");function T(e){return new Promise(r=>setTimeout(r,e))}s(T,"sleep");function m(e,r,t){return Promise.race([e,T(r).then(()=>{throw t?.(),new Error(`[maria2 error] Timeout of ${r}ms exceeded`)})])}s(m,"useTimeout");const k=new TextDecoder;async function y(e){return typeof e=="string"?e:e instanceof Blob?e.text():k.decode(e)}s(y,"decode");function D(e,r){return(t,n)=>t!=null?r(t):e(n)}s(D,"createCallback");function x(e,r,t){return e.socket.close(r,t)}s(x,"close");const j=s(async(e,r={})=>{const{onServerError:t,secret:n,timeout:c,openTimeout:w}=Object.assign({timeout:5e3,openTimeout:5e3},e?.getOptions?.()??{},r),d=new Map,u=new Map,O=s(o=>{const a=u.get(o.id);a&&(u.delete(o.id),a(o.error,o.result))},"invokeCallback"),S=s(o=>d.get(o.method)?.forEach(a=>a(...o.params)),"dispatchNotification"),b=s(async({data:o})=>{const a=JSON.parse(await y(o));if(a.method!=null){S(a);return}(a.result!=null||a.error!=null)&&(a.id!=null?O(a):a.error!=null&&t?.(a.error))},"handleMessage");if(e.readyState==l.Connecting)await m(new Promise(o=>e.addEventListener("open",()=>o(null),{once:!0})),w);else{if(e.readyState==l.Closing)throw new Error("[maria2 error] Socket is closing");if(e.readyState==l.Closed)throw new Error("[maria2 error] Socket is closed")}return e.addEventListener("message",b),Object.freeze({get socket(){return e},get secret(){return n},sendRequest:s(({method:o,secret:a=!0,timeout:i},...h)=>{const p=crypto.randomUUID(),f=new Promise((v,g)=>{if(e.readyState!=l.Open)return g(new Error("[maria2 error] Socket is not open"));u.set(p,D(v,g));const E=JSON.stringify({jsonrpc:"2.0",id:p,method:o,params:n!=null&&a?[`token:${n}`,...h]:[...h]});try{e.send(E)}catch(_){g(_)}});return i===!1?f:typeof i=="number"?m(f,i,()=>u.delete(p)):m(f,c,()=>u.delete(p))},"sendRequest"),onNotification:s((o,a)=>{let i=d.get(o);return i||d.set(o,i=new Set),i.add(a),{dispose:P(()=>(d.get(o)?.delete(a),a))}},"onNotification")})},"open"),M=Object.freeze(Object.assign({multicall:s((e,...r)=>{const t=e.secret;return t!=null?e.sendRequest({method:"system.multicall",secret:!1},r.map(n=>{const c=Object.assign({},n);return c.params=[`token:${t}`,...c.params],c})):e.sendRequest({method:"system.multicall",secret:!1},r)},"multicall")},["system.listMethods","system.listNotifications"].reduce((e,r)=>(e[r.slice(7)]=(t,...n)=>t.sendRequest({method:r,secret:!1},...n),e),{}))),N=Object.freeze(Object.assign({when:s((e,r,t)=>e.onNotification(r,t),"when")},["aria2.changeOption","aria2.changeGlobalOption","aria2.getGlobalOption","aria2.getOption","aria2.getSessionInfo","aria2.shutdown","aria2.forceShutdown","aria2.saveSession","aria2.getGlobalStat","aria2.getVersion","aria2.purgeDownloadResult","aria2.removeDownloadResult","aria2.changeUri","aria2.changePosition","aria2.getPeers","aria2.getFiles","aria2.getUris","aria2.getServers","aria2.tellStatus","aria2.tellWaiting","aria2.tellStopped","aria2.tellActive","aria2.remove","aria2.forceRemove","aria2.pause","aria2.forcePause","aria2.unpause","aria2.unpauseAll","aria2.pauseAll","aria2.forcePauseAll","aria2.addMetalink","aria2.addTorrent","aria2.addUri"].reduce((e,r)=>(e[r.slice(6)]=(t,...n)=>t.sendRequest({method:r,secret:!0},...n),e),{}),["aria2.onDownloadStart","aria2.onDownloadPause","aria2.onDownloadStop","aria2.onDownloadComplete","aria2.onDownloadError","aria2.onBtDownloadComplete"].reduce((e,r)=>(e[r.slice(6)]=(t,n)=>t.onNotification(r,n),e),{})));class q extends EventTarget{static{s(this,"PseudoSocketImpl")}constructor(r,t,n){super(),this.url=r,this.__options=t,this.__headers=n}readyState=1;close(){this.readyState=3}getOptions(){return this.__options}addEventListener(...r){super.addEventListener(...r)}send(r){fetch(this.url,{method:"POST",headers:{...this.__headers,"content-type":"application/json"},body:r}).then(t=>t.text()).then(t=>this.dispatchEvent(new MessageEvent("message",{data:t})))}}function U(e,r,t){return new q(e,r,t)}s(U,"createHTTP");class W extends WebSocket{static{s(this,"PreconfiguredWebSocket")}constructor(r,t,n){super(r,n),this.__options=t}getOptions(){return this.__options}}function z(e,r,t){return r!=null?new W(e,r,t):new WebSocket(e,t)}s(z,"createWebSocket");var A=Object.freeze({__proto__:null});export{l as ReadyState,N as aria2,x as close,U as createHTTP,z as createWebSocket,j as open,A as raw,M as system};
//# sourceMappingURL=index.js.map