@webreflection/coincident
Version:
An Atomics based Proxy to simplify, and synchronize, Worker related tasks
2 lines (1 loc) • 1.91 kB
JavaScript
const{stringify:e}=JSON,t=(r=e,({byteOffset:e=0}={})=>(t,s)=>{const n=r(t),o=n.length,a=2*o+e;s.byteLength<a&&s.grow(a);const c=new Uint16Array(s,e,o);for(let e=0;e<o;e++)c[e]=n.charCodeAt(e);return o});var r;const{assign:s,create:n}=Object;let o="coincident-",a=!0;try{new SharedArrayBuffer(4,{maxByteLength:8}),o+=crypto.randomUUID()}catch(e){a=!1,o+=Math.random().toString(36).substring(2)}const c={byteOffset:2*Int32Array.BYTES_PER_ELEMENT,useUTF16:!0,circular:!0},i=new Map,l=(e,t,r)=>{const s="then"!==t;return s&&(e[t]=r),s},u=()=>Promise.withResolvers(),p="InstallTrigger"in globalThis?o:"",{notify:g}=Atomics,y=e=>e;var f=e=>{const r=e?.transform,o=(e?.encoder||t)(c);class f extends globalThis.Worker{constructor(e,t){const{port1:c,port2:f}=new MessageChannel,[m,d]=((e,t=0)=>[r=>{const s=u();do{r=e(t++)}while(i.has(r));return i.set(r,s),[r,s]},(e,t,r)=>{const s=i.get(e);i.delete(e),r?s.reject(r):s.resolve(t)}])(y),h=new Map,w=n(null);let b="";super(e,s({type:"module"},t)).proxy=new Proxy(w,{get:(e,t)=>{if("then"===t)return;let s=h.get(t);return s||h.set(t,s=(...e)=>{const[s,n]=m();return c.postMessage([s,t,r?e.map(r):e]),(({promise:e},t)=>{if(b){const r=setTimeout(console.warn,3e3,`💀🔒 - is proxy.${b}() awaiting proxy.${t}() ?`);e=e.then((e=>(clearTimeout(r),e)),(e=>(clearTimeout(r),Promise.reject(e))))}return e})(n,t)}),s},set:l}),super.postMessage(p,[f]),a&&p&&super.addEventListener("message",(e=>{const{data:t}=e;t?.ID===p&&((e=>{e.stopImmediatePropagation(),e.preventDefault()})(e),c.onmessage(t))})),c.onmessage=async({data:e})=>{const t=e[0],s=typeof t;if("number"===s)d.apply(null,e);else if(b=e[1],await(async(e,t,r)=>{try{const s=await t[e[1]].apply(null,e[2]);e[1]=r?r(s):s,e[2]=null}catch(t){e[2]=t}})(e,w,r),b="","string"===s)c.postMessage(e);else{const r=e[2]||e[1];t[1]=void 0===r?0:o(r,t.buffer),t[0]=1,g(t,0)}}}}return{Worker:f,native:a}};export{f as default};