@webreflection/coincident
Version:
An Atomics based Proxy to simplify, and synchronize, Worker related tasks
2 lines (1 loc) • 3.72 kB
JavaScript
const{create:t}=Object;let e="coincident-",n=!0;try{new SharedArrayBuffer(4,{maxByteLength:8}),e+=crypto.randomUUID()}catch(t){n=!1,e+=Math.random().toString(36).substring(2)}const r=2*Int32Array.BYTES_PER_ELEMENT,s=65535,a={byteOffset:r,useUTF16:!0,circular:!0},o=new Map,c=(t,e,n)=>{const r="then"!==e;return r&&(t[e]=n),r},u=()=>Promise.withResolvers();var i=256===new DataView(new Uint16Array([256]).buffer).getUint16(0,!0),l=0,f=1,g=2,y=3,w=4,p=5,h=10,d=20,m=30,b=40,U=50,v=51,M=52,S=53,A=54,B=55,E=64,x=70,I=100,L=101,D=102,O=103,P=104,T=105,j=255;const{min:F}=Math,{defineProperty:R}=Object,{fromCharCode:k}=String,C=t=>{switch(t.getUint8(N++)){case v:return t.getUint8(N++);case S:{const e=t.getUint16(N,i);return N+=2,e}case B:{const e=t.getUint32(N,i);return N+=4,e}default:return(t=>{const e=t.getFloat64(N,i);return N+=8,e})(t)}},V=(t,e)=>{const n=N++;switch(t.getUint8(n)){case h:{const r=[];e.set(n,r);const s=C(t);for(let n=0;n<s;n++)r[n]=V(t,e);return r}case d:{const r={};e.set(n,r);const s=C(t);for(let n=0;n<s;n++){const n=V(t,e);n!==_&&(r[n]=V(t,e))}return r}case p:{const r=C(t),a=2*r,o=t.buffer.slice(N,N+a),c=new Uint16Array(o,0,r);let u="";for(let t=0;t<r;t+=s){const e=F(t+s,r);u+=k.apply(null,c.subarray(t,e))}return e.set(n,u),N+=a,u}case m:{const r=C(t),s=C(t),a=[r];s&&a.push({maxByteLength:s});const o=new ArrayBuffer(...a);return e.set(n,o),new Uint8Array(o).set(new Uint8Array(t.buffer,N,r)),N+=r,o}case b:{const r=V(t,e),s=C(t),a=C(t),o=[V(t,e),s];a&&o.push(a);const c=new globalThis[r](...o);return e.set(n,c),c}case I:{const r=new Date(C(t));return e.set(n,r),r}case L:{const r=C(t),s=new Map;e.set(n,s);for(let n=0;n<r;n++){const n=V(t,e);n!==_&&s.set(n,V(t,e))}return s}case D:{const r=C(t),s=new Set;e.set(n,s);for(let n=0;n<r;n++){const n=V(t,e);n!==_&&s.add(n)}return s}case P:{const r=V(t,e),s=V(t,e),a=new RegExp(r,s);return e.set(n,a),a}case T:{const r=globalThis[V(t,e)]||Error,s=V(t,e),a=V(t,e),o=new r(s);return e.set(n,R(o,"stack",{value:a})),o}case l:return e.get(C(t));case U:return t.getInt8(N++);case M:{const e=t.getInt16(N,i);return N+=2,e}case A:{const e=t.getInt32(N,i);return N+=4,e}case E:{const e=t.getFloat64(N,i);return N+=8,e}case x:{const e=t.getBigInt64(N,i);return N+=8,e}case g:return!0;case f:return!1;case y:return null;case w:return;case j:return _;case O:return(r=V(t,e)).startsWith("Symbol.")?Symbol[r.slice(r.indexOf(".")+1)]:Symbol.for(r);default:throw new Error(`Unknown type: ${t.getUint8(N-1)}`)}var r},_=Symbol();let N=0;const W=t=>(e,n)=>((t,{byteOffset:e=0}={})=>(N=e,V(new DataView(t),new Map)))(n,t),Y=u();addEventListener("message",(t=>{(t=>{t.stopImmediatePropagation(),t.preventDefault()})(t),Y.resolve([t.data,t.ports[0]])}),{once:!0});var $=async e=>{const[r,i]=await Y.promise,l=n&&!!r,f=e?.transform,g=(e?.decoder||W)(a);let y,w;if(n){const t=new SharedArrayBuffer(e?.minByteLength||s,{maxByteLength:e?.maxByteLength||16777216});y=new Int32Array(t),w=Atomics.wait}const[p,h]=((t,e=0)=>[n=>{const r=u();do{n=t(e++)}while(o.has(n));return o.set(n,r),[n,r]},(t,e,n)=>{const r=o.get(t);o.delete(t),n?r.reject(n):r.resolve(e)}])(String),d=new Map,m=t(null),b=new Proxy(m,{get(t,e){if("then"===e)return;let s=d.get(e);return s||d.set(e,s=(...t)=>{const s=[y,e,f?t.map(f):t];if(n){l?postMessage({ID:r,data:s}):i.postMessage(s),w(y,0),y[0]=0;const t=y[1]?g(y[1],y.buffer):void 0;if(t instanceof Error)throw t;return t}{const[t,e]=p();return s[0]=t,i.postMessage(s),e.promise}}),s},set:c});return i.onmessage=async({data:t})=>{"string"==typeof t[0]?h.apply(null,t):(await(async(t,e,n)=>{try{const r=await e[t[1]].apply(null,t[2]);t[1]=n?n(r):r,t[2]=null}catch(e){t[2]=e}})(t,m,f),i.postMessage(t))},{native:n,proxy:b}};export{$ as default};