accordant
Version:
One way shared/worker async bindings
2 lines (1 loc) • 1.58 kB
JavaScript
const{isArray:t}=Array;class e extends Event{#t;#e;constructor(t,e,s){super(t),this.#t=e,this.#e=s}get data(){return this.#t}get ports(){return[this.#e]}}const s=t=>t.stopImmediatePropagation();var n=n=>{let a=!0,o="";n.addEventListener("message",r=>{const{data:c}=r;if(a)s(r),a=!1,o=c;else if(t(c)&&2===c.length&&o===c[0]){s(r);const{ports:[t]}=r;t.start(),n.dispatchEvent(new e("channel",c[1],t))}})};addEventListener("connect",t=>{for(const e of t.ports)e.start(),n(e)});const{isArray:a}=Array,o=(t,e)=>{const{data:s,ports:n}=t;return!!("accordant"===s&&a(n)&&n.at(0)instanceof MessagePort)&&(t.stopImmediatePropagation(),t.currentTarget.removeEventListener(t.type,e),!0)},r=new Set,c=(t,e)=>{for(const s of r)s.deref()?.postMessage([!0,t,e])},{assign:i}=Object,d={},p=t=>i(d,t);class f{constructor(t,e){this.data=t,this.options=e}}const h=(t,e,s,...n)=>t.postMessage([e,s],...n);class g{#s;constructor(t){this.#s=t}async handleEvent({currentTarget:t,data:[e,s,n]}){if("number"==typeof e)try{const a=await this.#s[s](...n);a instanceof f?h(t,e,a.data,a.options):h(t,e,a)}catch(s){h(t,e,s)}else c(s,n)}}const v=new FinalizationRegistry(t=>{r.delete(t),E(!1)}),{promise:l,resolve:u}=Promise.withResolvers(),E=t=>{dispatchEvent(new Event("port:"+(t?"connected":"disconnected")))};addEventListener("connect",({ports:t})=>{for(const e of t)e.addEventListener("channel",function t(e){if(o(e,t)){const[t]=e.ports,s=new WeakRef(t);t.addEventListener("message",new g(d)),v.register(t,s),r.add(s),E(!0),u()}})});const m=(...t)=>{l.then(()=>c("",t))};export{m as broadcast,p as exports};