UNPKG

accordant

Version:
2 lines (1 loc) 1.29 kB
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();(a=>{let n=!0,r="";a.addEventListener("message",(o=>{const{data:i}=o;if(n)s(o),n=!1,r=i;else if(t(i)&&2===i.length&&r===i[0]){s(o);const{ports:[t]}=o;t.start(),a.dispatchEvent(new e("channel",i[1],t))}}))})(self);const{isArray:a}=Array,{assign:n}=Object,r={},o=t=>n(r,t);class i{constructor(t,e){this.data=t,this.options=e}}const c=new Set,d=(t,e,s,...a)=>t.postMessage([e,s],...a);class p{#s;constructor(t){this.#s=t}async handleEvent({currentTarget:t,data:[e,s,a]}){if("number"==typeof e)try{const n=await this.#s[s](...a);n instanceof i?d(t,e,n.data,n.options):d(t,e,n)}catch(s){d(t,e,s)}else((t,e)=>{for(const s of c)s.deref()?.postMessage([!0,t,e])})(s,a)}}const{promise:f,resolve:h}=Promise.withResolvers();addEventListener("channel",(function t(e){if(((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)})(e,t)){const[t]=e.ports;t.addEventListener("message",new p(r)),h(t)}}));const g=(...t)=>{f.then((e=>e.postMessage([!0,"",t])))};export{g as broadcast,o as exports};