UNPKG

accordant

Version:
2 lines (1 loc) 1.71 kB
let{Worker:e,SharedWorker:s}=globalThis;e=class extends e{constructor(e,s){super(e,{...s,type:"module"})}},s&&(s=class extends s{constructor(e,s){"string"==typeof s&&(s={name:s}),super(e,{...s,type:"module"})}});let t,r,n=null;const{MessageChannel:o}=globalThis,a=(e,s)=>{const{port1:r,port2:n}=new t;return e.push(r),r.start(),s([n]),r},i=e=>{for(const s of e)s.close()};s&&(n=class extends s{#e;get id(){return this.#e}constructor(e,s){super(e,s),this.#e=`Shared-${crypto.randomUUID()}`;const t=this.port,r=[],{close:n,postMessage:o}=t;t.createChannel=(e=null)=>a(r,o.bind(t,[this.#e,e])),t.close=()=>{i(r),n.call(t)},t.start(),t.postMessage(this.#e)}}),t=class extends o{},r=class extends e{#s=[];#e;get id(){return this.#e}constructor(e,s){super(e,s),this.#e=`Worker-${crypto.randomUUID()}`,super.postMessage(this.#e)}createChannel(e=null){return a(this.#s,super.postMessage.bind(this,[this.#e,e]))}terminate(){i(this.#s),super.terminate()}};const c=Symbol(),d=new WeakMap,l={get(e,s){return async(...t)=>{if(s!==c){const r=this.id++,{promise:n,resolve:o,reject:a}=Promise.withResolvers();return this.ids.set(r,(e=>(e instanceof Error?a:o)(e))),e.postMessage([r,s,t]),n}e.postMessage([!0,this.uuid,t])}},has:()=>!1,ownKeys:()=>[]},u=(e,s,t)=>{const n=new e(s,t),o=((e,s)=>{const t=new Map,r=crypto.randomUUID(),n=e.createChannel("accordant");return n.addEventListener("message",(({data:e})=>{const[n,o]=e;"number"==typeof n?(t.get(n)(o),t.get(n)):o!==r&&s?.(...e.at(2))})),new Proxy(n,{...l,uuid:r,ids:t,id:0})})(e===r?n:n.port,t?.[c]);return d.set(o,n),o},h=e=>d.get(e);function p(e,s){return u(n,e,s)}function g(e,s){return u(r,e,s)}export{p as SharedWorker,g as Worker,c as broadcast,h as proxied};