@webreflection/coincident
Version:
An Atomics based Proxy to simplify, and synchronize, Worker related tasks
2 lines (1 loc) • 1.72 kB
JavaScript
const{create:t}=Object;let e="coincident-",r=!0;try{new SharedArrayBuffer(4,{maxByteLength:8}),e+=crypto.randomUUID()}catch(t){r=!1,e+=Math.random().toString(36).substring(2)}const n=2*Int32Array.BYTES_PER_ELEMENT,a={byteOffset:n,useUTF16:!0,circular:!0},s=new Map,o=(t,e,r)=>{const n="then"!==e;return n&&(t[e]=r),n},c=()=>Promise.withResolvers(),{fromCharCode:i}=String,{min:l}=Math;const{parse:p}=JSON,y=(u=p,({byteOffset:t})=>(e,r)=>{const n=new Uint16Array(r,t,e);let a="",s=0;for(;s<e;){const t=l(s+65535,e);a+=i.apply(null,n.subarray(s,t)),s=t}return u(a)});var u;const f=c();addEventListener("message",(t=>{(t=>{t.stopImmediatePropagation(),t.preventDefault()})(t),f.resolve([t.data,t.ports[0]])}),{once:!0});var g=async e=>{const[n,i]=await f.promise,l=r&&!!n,p=e?.transform,u=(e?.decoder||y)(a);let g,d;if(r){const t=new SharedArrayBuffer(e?.minByteLength||65535,{maxByteLength:e?.maxByteLength||16777216});g=new Int32Array(t),d=Atomics.wait}const[m,h]=((t,e=0)=>[r=>{const n=c();do{r=t(e++)}while(s.has(r));return s.set(r,n),[r,n]},(t,e,r)=>{const n=s.get(t);s.delete(t),r?n.reject(r):n.resolve(e)}])(String),w=new Map,v=t(null),M=new Proxy(v,{get(t,e){if("then"===e)return;let a=w.get(e);return a||w.set(e,a=(...t)=>{const a=[g,e,p?t.map(p):t];if(r){l?postMessage({ID:n,data:a}):i.postMessage(a),d(g,0),g[0]=0;const t=g[1]?u(g[1],g.buffer):void 0;if(t instanceof Error)throw t;return t}{const[t,e]=m();return a[0]=t,i.postMessage(a),e.promise}}),a},set:o});return i.onmessage=async({data:t})=>{"string"==typeof t[0]?h.apply(null,t):(await(async(t,e,r)=>{try{const n=await e[t[1]].apply(null,t[2]);t[1]=r?r(n):n,t[2]=null}catch(e){t[2]=e}})(t,v,p),i.postMessage(t))},{native:r,proxy:M}};export{g as default};