UNPKG

@webreflection/coincident

Version:

An Atomics based Proxy to simplify, and synchronize, Worker related tasks

2 lines (1 loc) 4.85 kB
const{assign:e,create:t}=Object;let n="coincident-",s=!0;try{new SharedArrayBuffer(4,{maxByteLength:8}),n+=crypto.randomUUID()}catch(e){s=!1,n+=Math.random().toString(36).substring(2)}const r=2*Int32Array.BYTES_PER_ELEMENT,a={byteOffset:r,useUTF16:!0,circular:!0},o=new Map,i=(e,t,n)=>{const s="then"!==t;return s&&(e[t]=n),s},c=()=>Promise.withResolvers();var f=256===new DataView(new Uint16Array([256]).buffer).getUint16(0,!0),l=0,u=1,b=2,g=3,y=4,p=5,m=10,h=20,w=30,k=40,U=50,d=51,E=52,T=53,A=54,M=55,I=64,S=70,x=100,O=101,j=102,v=103,B=104,L=105,P=255;const{getPrototypeOf:D}=Object,N=e=>{const t=typeof e;switch(t){case"function":case"undefined":return"";case"object":return null===e?"null":"object";default:return t}},{isArray:F}=Array,{isView:R}=ArrayBuffer,{isInteger:_,isFinite:z}=Number,{entries:V}=Object,W=(e,t)=>{t<256?(G(e,H+2),e.setUint8(H++,d),e.setUint8(H++,t)):t<65536?(G(e,H+3),e.setUint8(H++,T),e.setUint16(H,t,f),H+=2):t<4294967296?(G(e,H+5),e.setUint8(H++,M),e.setUint32(H,t,f),H+=4):$(e,t)},$=(e,t)=>{G(e,H+9),e.setUint8(H++,I),e.setFloat64(H,t,f),H+=8},C=(e,t,n)=>{const s=t.get(n);return"number"==typeof s?(G(e,H+1),e.setUint8(H++,l),W(e,s),!0):(t.set(n,H),!1)},J=(e,t,n,s)=>{G(e,H+10+n*s),e.setUint8(H++,t),W(e,n)},Y=e=>{G(e,H+1),e.setUint8(H++,P)},q=(e,t)=>{G(e,H+1),e.setUint8(H++,t)},G=(e,t)=>{K<t&&(K+=t+65535,e.buffer.grow(K))};let H=0,K=H;const Q=(e,t,n,s=N(n))=>{switch(s){case"null":q(e,g);break;case"object":if(C(e,t,n))break;switch(!0){case F(n):{const s=n.length;J(e,m,s,1);for(let r=0;r<s;r++)Q(e,t,n[r]);break}case R(n):{const{BYTES_PER_ELEMENT:s,buffer:r,byteOffset:a,length:o}=n;if(q(e,k),Q(e,t,(e=>{for(;!(e.name in globalThis);)e=D(e);return e.name})(n.constructor),"string"),W(e,a),W(e,o!==(r.byteLength-a)/s?o:0),C(e,t,r))break;n=r}case n instanceof ArrayBuffer:{const t=n.byteLength,s=n.resizable?n.maxByteLength:0;if(J(e,w,t,1),W(e,s),t){G(e,H+=t);const s=new Uint8Array(n,0,t);new Uint8Array(e.buffer).set(s,H-t)}break}case n instanceof Date:q(e,x),W(e,+n);break;case n instanceof Map:J(e,O,n.size,1);for(const[s,r]of n){const n=N(s),a=N(r);n&&a?(Q(e,t,s,n),Q(e,t,r,a)):Y(e)}break;case n instanceof Set:J(e,j,n.size,1);for(const s of n){const n=N(s);n?Q(e,t,s,n):Y(e)}break;case n instanceof RegExp:q(e,B),Q(e,t,n.source,"string"),Q(e,t,n.flags,"string");break;case n instanceof Error:q(e,L),Q(e,t,n.name,"string"),Q(e,t,n.message,"string"),Q(e,t,n.stack,"string");break;default:{if("toJSON"in n){const s=n.toJSON();if(s===n){q(e,h),W(e,0);break}if(C(e,t,n=s))break}const s=V(n),r=s.length;J(e,h,r,1);for(let n=0;n<r;n++){const r=s[n],a=N(r[1]);a?(Q(e,t,r[0],"string"),Q(e,t,r[1],a)):Y(e)}break}}break;case"boolean":q(e,n?b:u);break;case"number":_(n)?((e,t)=>{-128<=t&&t<128?(G(e,H+2),e.setUint8(H++,U),e.setInt8(H++,t)):-32768<=t&&t<32768?(G(e,H+3),e.setUint8(H++,E),e.setInt16(H,t,f),H+=2):-2147483648<=t&&t<2147483648?(G(e,H+5),e.setUint8(H++,A),e.setInt32(H,t,f),H+=4):$(e,t)})(e,n):z(n)?$(e,n):q(e,g);break;case"string":{if(C(e,t,n))break;const s=n.length;J(e,p,s,2);for(let t=0;t<s;t++)e.setUint16(H,n.charCodeAt(t),f),H+=2;break}case"bigint":G(e,H+9),e.setUint8(H++,S),e.setBigInt64(H,n,f),H+=8;break;case"symbol":{const s=(e=>{const t=String(e).slice(7,-1);return t.startsWith("Symbol.")||Symbol.keyFor(e)?t:""})(n);if(s){q(e,v),Q(e,t,s,"string");break}}case"":q(e,y);break;default:throw new Error(`Unsupported type: ${s}`)}},X=e=>(t,n)=>((e,t,{byteOffset:n=0}={})=>{const s=H=n;return K=t.byteLength,Q(new DataView(t),new Map,e),H-s})(t,n,e),Z="InstallTrigger"in globalThis?n:"",{notify:ee}=Atomics,te=e=>e;var ne=n=>{const r=n?.transform,f=(n?.encoder||X)(a);class l extends globalThis.Worker{constructor(n,a){const{port1:l,port2:u}=new MessageChannel,[b,g]=((e,t=0)=>[n=>{const s=c();do{n=e(t++)}while(o.has(n));return o.set(n,s),[n,s]},(e,t,n)=>{const s=o.get(e);o.delete(e),n?s.reject(n):s.resolve(t)}])(te),y=new Map,p=t(null);let m="";super(n,e({type:"module"},a)).proxy=new Proxy(p,{get:(e,t)=>{if("then"===t)return;let n=y.get(t);return n||y.set(t,n=(...e)=>{const[n,s]=b();return l.postMessage([n,t,r?e.map(r):e]),(({promise:e},t)=>{if(m){const n=setTimeout(console.warn,3e3,`💀🔒 - is proxy.${m}() awaiting proxy.${t}() ?`);e=e.then((e=>(clearTimeout(n),e)),(e=>(clearTimeout(n),Promise.reject(e))))}return e})(s,t)}),n},set:i}),super.postMessage(Z,[u]),s&&Z&&super.addEventListener("message",(e=>{const{data:t}=e;t?.ID===Z&&((e=>{e.stopImmediatePropagation(),e.preventDefault()})(e),l.onmessage(t))})),l.onmessage=async({data:e})=>{const t=e[0],n=typeof t;if("number"===n)g.apply(null,e);else if(m=e[1],await(async(e,t,n)=>{try{const s=await t[e[1]].apply(null,e[2]);e[1]=n?n(s):s,e[2]=null}catch(t){e[2]=t}})(e,p,r),m="","string"===n)l.postMessage(e);else{const n=e[2]||e[1];t[1]=void 0===n?0:f(n,t.buffer),t[0]=1,ee(t,0)}}}}return{Worker:l,native:s}};export{ne as default};