coincident
Version:
An Atomics based Proxy to simplify, and synchronize, Worker related tasks
2 lines (1 loc) • 4.68 kB
JavaScript
var e=Promise.withResolvers.bind(Promise);let t=0;const s=t++,n=t++,r=t++,a=t++,o=t++,c=t++,i=t++,l=t++,u=t++,h=t++,p=t++,f=t++,g=t++,b=t++,y=t++,m=t++,d=t++,w=t++,k=t++,v=t++,S=t++,T=t++,A=t++,M=t++,x=t++;class E{static push(e,t){e.c(),e.v.set(t,e.g(t.length))}constructor(e,t){const s=[];this.l=0,this.v=new Uint8Array(e,t),this.o=s,this.push=s.push.bind(s)}get length(){return this.c(),this.l}c(){const e=this.o,t=e.length;t&&this.v.set(e.splice(0),this.g(t))}g(e){const{buffer:t,byteOffset:s}=this.v,n=this.l;return this.l+=e,e+=s+n,t.byteLength<e&&t.grow(e),n}}const O=new Map(Reflect.ownKeys(Symbol).map((e=>[Symbol[e],`@${String(e)}`]))),B=e=>O.get(e)||((e,t)=>void 0===t?"?":void 0===Symbol.keyFor(e)?`!${t}`:`#${t}`)(e,e.description),U=Array.isArray,I=ArrayBuffer.isView;new TextDecoder;const P=new TextEncoder,j=new ArrayBuffer(8),D=new DataView(j),N=new Uint8Array(j),{getPrototypeOf:R}=Object,{construct:$}=Reflect,{toStringTag:L}=Symbol,F=(e,t=e[L])=>t in globalThis?t:F($(R(e.constructor),[0])),{isNaN:W,isFinite:z,isInteger:J}=Number,{ownKeys:K}=Reflect,{is:V}=Object,_=(e,t,s)=>{const n=s.get(e),r=!n;return r?(D.setUint32(0,t.length,!0),s.set(e,[N[0],N[1],N[2],N[3]])):t.push(x,n[0],n[1],n[2],n[3]),r},C=(e,t,s)=>{D.setUint32(0,s,!0),e.push(t,N[0],N[1],N[2],N[3])},Y=(e,t,x)=>{switch(typeof e){case"number":e&&z(e)?J(e)&&e<256&&-1<e?t.push(c,e):(D.setFloat64(0,e,!0),t.push(o,N[0],N[1],N[2],N[3],N[4],N[5],N[6],N[7])):W(e)?t.push(i):e?t.push(e<0?u:l):t.push(V(e,0)?h:p);break;case"object":switch(!0){case null===e:t.push(a);break;case!_(e,t,x):break;case U(e):{const s=e.length;C(t,m,s);for(let n=0;n<s;n++)Y(e[n],t,x);break}case I(e):if(t.push(M),Y(F(e),t,x),e=e.buffer,!_(e,t,x))break;case e instanceof ArrayBuffer:{const s=new Uint8Array(e);C(t,d,s.length),q(t,s);break}case e instanceof Date:t.push(w),Y(e.getTime(),t,x);break;case e instanceof Map:C(t,v,e.size);for(const[s,n]of e)Y(s,t,x),Y(n,t,x);break;case e instanceof Set:C(t,A,e.size);for(const s of e)Y(s,t,x);break;case e instanceof Error:t.push(k),Y(e.name,t,x),Y(e.message,t,x),Y(e.stack,t,x);break;case e instanceof RegExp:t.push(T),Y(e.source,t,x),Y(e.flags,t,x);break;default:if("toJSON"in e){const s=e.toJSON();Y(s===e?null:s,t,x)}else{const s=K(e),n=s.length;C(t,S,n);for(let r=0;r<n;r++){const n=s[r];Y(n,t,x),Y(e[n],t,x)}}}break;case"string":if(_(e,t,x)){const s=P.encode(e);C(t,b,s.length),q(t,s)}break;case"boolean":t.push(e?n:s);break;case"symbol":t.push(y),Y(B(e),t,x);break;case"bigint":{let s=f;9223372036854775807n<e?(D.setBigUint64(0,e,!0),s=g):D.setBigInt64(0,e,!0),t.push(s,N[0],N[1],N[2],N[3],N[4],N[5],N[6],N[7]);break}default:t.push(r)}};let q=(e,t)=>{for(let s=e.push,n=0,r=t.length;n<r;n+=32767)s.apply(e,t.subarray(n,n+32767))};const G=({byteOffset:e=0}={})=>(t,s)=>{const n=new E(s,e);return q=E.push,Y(t,n,new Map),n.length},H=[],Q=new WeakSet,X=(...e)=>(Q.add(e),e),{assign:Z,create:ee}=Object;let te="coincident-",se=!0;try{new SharedArrayBuffer(4,{maxByteLength:8}),te+=crypto.randomUUID()}catch(e){se=!1,te+=Math.random().toString(36).substring(2)}const ne={byteOffset:2*Int32Array.BYTES_PER_ELEMENT},re=(e,t,s)=>{const n="then"!==t;return n&&(e[t]=s),n},ae="InstallTrigger"in globalThis?te:"",{notify:oe}=Atomics,ce=e=>e;var ie=t=>{const s=t?.transform,n=(t?.encoder||G)(ne),r=!1!==t?.transfer;class a extends globalThis.Worker{constructor(t,a){const{port1:o,port2:c}=new MessageChannel,[i,l]=((t=e=>e)=>{const s=new Map;let n=0;return[()=>{let r;do{r=t(n++)}while(s.has(r));const a=e();return s.set(r,a),[r,a.promise]},(e,t,n)=>{const r=s.get(e);s.delete(e),n?r?.reject(n):r?.resolve(t)}]})(ce),u=new Map,h=ee(null);let p="";super(t,Z({type:"module"},a)).proxy=new Proxy(h,{get:(e,t)=>{if("then"===t)return;let n=u.get(t);return n||u.set(t,n=(...e)=>{const n=((e,t)=>{let s=H;return e&&Q.has(t.at(-1)||H)&&(s=t.pop(),Q.delete(s)),s})(r,e),[a,c]=i();return o.postMessage([a,t,s?e.map(s):e],n),((e,t)=>{if(p){const s=setTimeout(console.warn,3e3,`💀🔒 - is proxy.${p}() awaiting proxy.${t}() ?`);e=e.then((e=>(clearTimeout(s),e)),(e=>(clearTimeout(s),Promise.reject(e))))}return e})(c,t)}),n},set:re}),super.postMessage(ae,[c]),se&&ae&&super.addEventListener("message",(e=>{const{data:t}=e;t?.ID===ae&&((e=>{e.stopImmediatePropagation(),e.preventDefault()})(e),o.onmessage(t))})),o.onmessage=async({data:e})=>{const t=e[0],r=typeof t;if("number"===r)l.apply(null,e);else if(p=e[1],await(async(e,t,s)=>{try{const n=await t[e[1]].apply(null,e[2]);e[1]=s?s(n):n,e[2]=null}catch(t){e[2]=t}})(e,h,s),p="","string"===r)o.postMessage(e);else{const s=e[2]||e[1];t[1]=void 0===s?0:n(s,t.buffer),t[0]=1,oe(t,0)}}}}return{Worker:a,native:se,transfer:X}};export{ie as default};