UNPKG

proxied-worker

Version:

A tiny utility to asynchronously drive a namespace exposed through a Shared/Service/Worker

3 lines (2 loc) 1.72 kB
/*! (c) Andrea Giammarchi - ISC */ const{navigator:e,ServiceWorker:t,SharedWorker:r,Worker:n}=globalThis,{isArray:s}=Array,{random:i}=Math,o=[],a=[],c=({data:{id:e,args:t}})=>{if(s(t)){const r=o.indexOf(e);-1<r&&a[r](...t)}},d=r=>r instanceof t?e.serviceWorker:r;let l=0;const u=(e,t,r,n=null,u=(e=>e))=>new Promise(((g,h)=>{const p=`proxied-worker:${t}:${l++}`,f=d(e);if(f.addEventListener("message",(function e({data:{id:t,result:r,error:n}}){t===p&&(f.removeEventListener("message",e),null!=n?h(new Error(n)):g(u(r)))})),s(n)){r.push(n);for(let e=0,{length:t}=n;e<t;e++)switch(typeof n[e]){case"string":n[e]="$"+n[e];break;case"function":f.addEventListener("message",c);let t=a.indexOf(n[e]);t<0&&(t=a.push(n[e])-1,o[t]=`proxied-worker:cb:${l+++i()}`),n[e]=o[t]}}e.postMessage({id:p,list:r})}));function g(s,i={type:"classic"},o=n){const a=(e,t)=>new Proxy(h.bind({id:e,list:t}),g),c=new FinalizationRegistry((e=>{l.then((t=>t.postMessage({id:`proxied-worker:${e}:-0`,list:[]})))})),l=new Promise((n=>{if(o===r){const{port:e}=new o(s,i);e.start(),n(e)}else o===t?e.serviceWorker.register(s,i).then((({installing:e,waiting:t,active:r})=>n(e||t||r))):n(new o(s,i))})),g={apply(e,t,r){const{id:n,list:s}=e();return l.then((e=>u(e,n,["apply"].concat(s),r)))},construct(e,t){const{id:r,list:n}=e();return l.then((e=>u(e,r,["new"].concat(n),t,(e=>{const t=a(e,[]);return c.register(t,e),t}))))},get(e,t){const{id:r,list:n}=e(),{length:s}=n;switch(t){case"then":return s?(e,t)=>l.then((s=>u(s,r,["get"].concat(n)).then(e,t))):void 0;case"addEventListener":case"removeEventListener":if(!s&&!r)return(...e)=>l.then((r=>{d(r)[t](...e)}))}return a(r,n.concat(t))}};return a("",[])}function h(){return this}export{g as default};