coincident
Version:
An Atomics based Proxy to simplify, and synchronize, Worker related tasks
2 lines (1 loc) • 11 kB
JavaScript
var e=Promise.withResolvers.bind(Promise),t=(t=e=>e)=>{const r=new Map;let n=0;return[()=>{let s;do{s=t(n++)}while(r.has(s));const a=e();return r.set(s,a),[s,a.promise]},(e,t,n)=>{const s=r.get(e);r.delete(e),n?s?.reject(n):s?.resolve(t)}]};const r="5d6208ba",n="="+r,s="-"+r,a=n+"-ws",o=s+"-ws";let c=0;const i=c++,u=c++,l=c++,f=c++,p=c++,g=c++,h=c++,y=c++,b=c++,d=c++,w=c++,m=c++,k=c++,v=c++,T=c++,E=c++,M=c++,S=c++,x=c++,A=c++,P=c++,O=c++,B=c++,U=c++,R=c++,W=new TextDecoder,L=new TextEncoder,N=new Map(Reflect.ownKeys(Symbol).map((e=>[Symbol[e],`@${String(e)}`]))),j=e=>{switch(e[0]){case"@":return Symbol[e.slice(1)];case"#":return Symbol.for(e.slice(1));case"!":return Symbol(e.slice(1));default:return Symbol()}},D=e=>N.get(e)||((e,t)=>void 0===t?"?":void 0===Symbol.keyFor(e)?`!${t}`:`#${t}`)(e,e.description),I=Object.defineProperty,$=Object.assign,F=Array.from,z=Array.isArray,_=ArrayBuffer.isView,K=(e,t)=>[e,t],J=e=>e,V={},Y=e=>(t,r=new Map)=>{for(let n=0,s=t.length;n<s;n++)t[n]=e(t[n],r);return t},C=([e,t])=>0===e?t:j(t),q=e=>"string"==typeof e?K(0,e):K(16,D(e)),G=(e,t)=>{for(let r=e.push,n=0,s=t.length;n<s;n+=32767)r.apply(e,t.subarray(n,n+32767))},H=new ArrayBuffer(8),Q=new DataView(H),X=new Uint8Array(H),Z=(e,t,r)=>(e.set(t,r),r),ee=e=>{X[0]=e[ne++],X[1]=e[ne++],X[2]=e[ne++],X[3]=e[ne++],X[4]=e[ne++],X[5]=e[ne++],X[6]=e[ne++],X[7]=e[ne++]},te=e=>(X[0]=e[ne++],X[1]=e[ne++],X[2]=e[ne++],X[3]=e[ne++],Q.getUint32(0,!0)),re=(e,t)=>{switch(e[ne++]){case p:return ee(e),Q.getFloat64(0,!0);case g:return e[ne++];case P:{const r=Z(t,ne-1,{});for(let n=0,s=te(e);n<s;n++)r[re(e,t)]=re(e,t);return r}case E:{const r=Z(t,ne-1,[]);for(let n=0,s=te(e);n<s;n++)r.push(re(e,t));return r}case U:{const r=ne-1,n=re(e,t);return Z(t,r,new globalThis[n](re(e,t)))}case M:{const r=ne-1,n=te(e);return Z(t,r,e.slice(ne,ne+=n).buffer)}case v:{const r=ne-1,n=te(e);return Z(t,r,W.decode(e.slice(ne,ne+=n)))}case S:return Z(t,ne-1,new Date(re(e,t)));case A:{const r=Z(t,ne-1,new Map);for(let n=0,s=te(e);n<s;n++)r.set(re(e,t),re(e,t));return r}case B:{const r=Z(t,ne-1,new Set);for(let n=0,s=te(e);n<s;n++)r.add(re(e,t));return r}case x:{const r=re(e,t),n=re(e,t),s=re(e,t),a=new(globalThis[r]||Error)(n);return Z(t,ne-1,I(a,"stack",{value:s}))}case O:{const r=re(e,t),n=re(e,t);return Z(t,ne-1,new RegExp(r,n))}case i:return!1;case u:return!0;case h:return NaN;case y:return 1/0;case b:return-1/0;case d:return 0;case w:return-0;case f:return null;case m:return ee(e),Q.getBigInt64(0,!0);case k:return ee(e),Q.getBigUint64(0,!0);case T:return j(re(e,t));case R:return t.get(te(e));default:return}};let ne=0;class se{static push(e,t){e.c(),e.v.set(t,e.g(t.length))}constructor(e,t){const r=[];this.l=0,this.v=new Uint8Array(e,t),this.o=r,this.push=r.push.bind(r)}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:r}=this.v,n=this.l;return this.l+=e,e+=r+n,t.byteLength<e&&t.grow(e),n}}const{getPrototypeOf:ae}=Object,{construct:oe}=Reflect,{toStringTag:ce}=Symbol,{toString:ie}=V,ue=(e,t=e[ce])=>t in globalThis?t:ue(oe(ae(e.constructor),[0])),{isNaN:le,isFinite:fe,isInteger:pe}=Number,{ownKeys:ge}=Reflect,{is:he}=Object,ye=(e,t,r)=>{const n=r.get(e),s=!n;return s?(Q.setUint32(0,t.length,!0),r.set(e,[X[0],X[1],X[2],X[3]])):t.push(R,n[0],n[1],n[2],n[3]),s},be=(e,t,r)=>{Q.setUint32(0,r,!0),e.push(t,X[0],X[1],X[2],X[3])},de=(e,t,r)=>{switch(typeof e){case"number":e&&fe(e)?pe(e)&&e<256&&-1<e?t.push(g,e):(Q.setFloat64(0,e,!0),t.push(p,X[0],X[1],X[2],X[3],X[4],X[5],X[6],X[7])):le(e)?t.push(h):e?t.push(e<0?b:y):t.push(he(e,0)?d:w);break;case"object":switch(!0){case null===e:t.push(f);break;case!ye(e,t,r):break;case z(e):{const n=e.length;be(t,E,n);for(let s=0;s<n;s++)de(e[s],t,r);break}case _(e):if(t.push(U),de(ue(e),t,r),e=e.buffer,!ye(e,t,r))break;case e instanceof ArrayBuffer:{const r=new Uint8Array(e);be(t,M,r.length),we(t,r);break}case e instanceof Date:t.push(S),de(e.getTime(),t,r);break;case e instanceof Map:be(t,A,e.size);for(const[n,s]of e)de(n,t,r),de(s,t,r);break;case e instanceof Set:be(t,B,e.size);for(const n of e)de(n,t,r);break;case e instanceof Error:t.push(x),de(e.name,t,r),de(e.message,t,r),de(e.stack,t,r);break;case e instanceof RegExp:t.push(O),de(e.source,t,r),de(e.flags,t,r);break;default:if("toJSON"in e){const n=e.toJSON();de(n===e?null:n,t,r)}else{const n=ge(e),s=n.length;be(t,P,s);for(let a=0;a<s;a++){const s=n[a];de(s,t,r),de(e[s],t,r)}}}break;case"string":if(ye(e,t,r)){const r=L.encode(e);be(t,v,r.length),we(t,r)}break;case"boolean":t.push(e?u:i);break;case"symbol":t.push(T),de(D(e),t,r);break;case"bigint":{let r=m;9223372036854775807n<e?(Q.setBigUint64(0,e,!0),r=k):Q.setBigInt64(0,e,!0),t.push(r,X[0],X[1],X[2],X[3],X[4],X[5],X[6],X[7]);break}default:t.push(l)}};let we=G;const me=({byteOffset:e=0}={})=>(t,r)=>{const n=new se(r,e);return we=se.push,de(t,n,new Map),n.length},ke=e=>new Uint8Array((e=>{const t=[];return we=G,de(e,t,new Map),t})(e)).buffer,ve=e=>{return t=new Uint8Array(e),ne=0,re(t,new Map);var t};let Te=0;const Ee=Te++,Me=Te++,Se=Te++,xe=Te++,Ae=Te++,Pe=Te++,Oe=Te++,Be=Te++,Ue=Te++,Re=Te++,We=Te++,Le=Te++,Ne=Te++,je=Te++,De=Te++,Ie=Te++,$e=Te++,Fe=Te++,ze=(e,t)=>[t?e:F(new Uint8Array(e)),e.resizable?e.maxByteLength:0],_e=/\[('|")?(.+?)\1\]/g,Ke=(e,t)=>e?.[t];var Je=(e,t)=>t.replace(_e,".$2").split(".").reduce(Ke,e);const{apply:Ve,construct:Ye,defineProperty:Ce,deleteProperty:qe,get:Ge,getOwnPropertyDescriptor:He,getPrototypeOf:Qe,has:Xe,isExtensible:Ze,ownKeys:et,preventExtensions:tt,set:rt,setPrototypeOf:nt}=Reflect;var st=({reflect:e=J,transform:t=J,remote:r=J,module:n=e=>import(e),buffer:s=!1}=V)=>{const a=(t,n=new Map)=>{if(!z(t))return t;const[s,i]=t;switch(s){case 2:{if(null===i)return globalThis;let e=n.get(t);if(!e){e=i,n.set(t,i);for(const e in i)i[e]=a(i[e],n)}return e}case 4:return n.get(t)||(n.set(t,i),c(i,n));case 8:{let t=h.get(i),n=t?.deref();return n||(t&&b.unregister(t),n=function(...t){r.apply(this,t);for(let e=0,r=t.length;e<r;e++)t[e]=o(t[e]);const n=e(Pe,i,o(this),t);return n instanceof Promise?n.then(a):a(n)},t=new WeakRef(n),h.set(i,t),b.register(n,i,t)),n}case 16:return j(i);default:return 1&s?p(i):i}},o=e=>{switch(typeof e){case"object":{if(null===e)break;if(e===globalThis)return y;const r=t(e);return w&&d.has(r)?K(0,r):_(r)?K(68,((e,t)=>{const{BYTES_PER_ELEMENT:r,byteOffset:n,buffer:s,length:a}=e;return[ue(e),ze(s,t),n,a!==(s.byteLength-n)/r?a:0]})(r,s)):r instanceof ArrayBuffer?K(64,ze(r,s)):K(z(r)?5:3,f(r))}case"function":return K(9,f(t(e)));case"symbol":return K(16,D(e));case"bigint":return K(32,e.toString())}return e},c=Y(a),i=Y(C),u=Y(q),{clear:l,id:f,ref:p,unref:g}=((e=0,t=new Map,r=new Map)=>({clear:()=>{t.clear(),r.clear()},id:n=>{let s=r.get(n);if(void 0===s){for(;t.has(s=e++););t.set(s,n),r.set(n,s)}return s},ref:e=>t.get(e),unref:e=>(r.delete(t.get(e)),t.delete(e))}))(),h=new Map,y=K(2,null),b=new FinalizationRegistry((t=>{h.delete(t),e(Ee,t)}));let d,w=!1;return{direct:e=>(w||(w=!0,d=new WeakSet),d.add(e),e),reflect(e,t,...r){const s=null===t,l=s?globalThis:p(t);switch(e){case Re:{const e=C(r[0]);return o(s&&"import"===e?n:Ge(l,e))}case Pe:{const e=new Map;return o(Ve(l,a(r[0],e),c(r[1],e)))}case $e:return rt(l,C(r[0]),a(r[1]));case Ne:return Xe(l,C(r[0]));case De:return u(et(l),h);case Oe:return o(Ye(l,c(r[0])));case We:{const e=He(l,C(r[0]));if(e)for(const t in e)e[t]=o(e[t]);return e}case Be:return Ce(l,C(r[0]),a(r[1]));case Ue:return qe(l,C(r[0]));case Le:return o(Qe(l));case Fe:return nt(l,a(r[0]));case Me:return void $(l,a(r[0]));case Se:{const e=a(r[0]),t=Function(`return(${e}).apply(null,arguments)`);return o(Ve(t,null,c(r[1])))}case xe:for(let e,t=0,n=(r=i(r[0],h)).length;t<n;t++)e=r[t],r[t]=o("string"==typeof e?Je(l,e):l[e]);return r;case Ae:return o(Je(l,r[0]));case Ee:return g(t);case je:return Ze(l);case Ie:return tt(l)}},terminate(){for(const e of h.values())b.unregister(e);h.clear(),l()}}};const{addEventListener:at}=EventTarget.prototype,ot=new WeakMap;Reflect.defineProperty(EventTarget.prototype,"addEventListener",{value(e,t,r){const n=r?.invoke;if(n){let t=ot.get(this);t||ot.set(this,t=new Map),t.set(e,[].concat(n)),delete r.invoke,console.log(t)}return at.apply(this,arguments)}});const ct=[],it=new WeakSet,ut=(...e)=>(it.add(e),e),{assign:lt,create:ft}=Object;let pt="coincident-",gt=!0;try{new SharedArrayBuffer(4,{maxByteLength:8}),pt+=crypto.randomUUID()}catch(e){gt=!1,pt+=Math.random().toString(36).substring(2)}const ht={byteOffset:2*Int32Array.BYTES_PER_ELEMENT},yt=(e,t,r)=>{const n="then"!==t;return n&&(e[t]=r),n},bt="InstallTrigger"in globalThis?pt:"",{notify:dt}=Atomics,wt=e=>e;var mt=e=>{const r=e?.transform,n=(e?.encoder||me)(ht),s=!1!==e?.transfer;class a extends globalThis.Worker{constructor(e,a){const{port1:o,port2:c}=new MessageChannel,[i,u]=t(wt),l=new Map,f=ft(null);let p="";super(e,lt({type:"module"},a)).proxy=new Proxy(f,{get:(e,t)=>{if("then"===t)return;let n=l.get(t);return n||l.set(t,n=(...e)=>{const n=((e,t)=>{let r=ct;return e&&it.has(t.at(-1)||ct)&&(r=t.pop(),it.delete(r)),r})(s,e),[a,c]=i();return o.postMessage([a,t,r?e.map(r):e],n),((e,t)=>{if(p){const r=setTimeout(console.warn,3e3,`💀🔒 - is proxy.${p}() awaiting proxy.${t}() ?`);e=e.then((e=>(clearTimeout(r),e)),(e=>(clearTimeout(r),Promise.reject(e))))}return e})(c,t)}),n},set:yt}),super.postMessage(bt,[c]),gt&&bt&&super.addEventListener("message",(e=>{const{data:t}=e;t?.ID===bt&&((e=>{e.stopImmediatePropagation(),e.preventDefault()})(e),o.onmessage(t))})),o.onmessage=async({data:e})=>{const t=e[0],s=typeof t;if("number"===s)u.apply(null,e);else if(p=e[1],await(async(e,t,r)=>{try{const n=await t[e[1]].apply(null,e[2]);e[1]=r?r(n):n,e[2]=null}catch(t){e[2]=t}})(e,f,r),p="","string"===s)o.postMessage(e);else{const r=e[2]||e[1];t[1]=void 0===r?0:n(r,t.buffer),t[0]=1,dt(t,0)}}}}return{Worker:a,native:gt,transfer:ut}},kt=e=>{const t=e?.import,r=mt({...e,encoder:e?.encoder||me});class a extends r.Worker{#e;constructor(e,r){const{proxy:a}=super(e,r),{direct:o,reflect:c,terminate:i}=st({...r,buffer:!0,reflect:a[s],remote(e){e instanceof Event&&(e=>{const{currentTarget:t,target:r,type:n}=e,s=ot.get(t||r)?.get(n);if(s)for(const t of s)e[t]()})(e)},module:r?.import||t||(e=>import(new URL(e,location).href))});this.#e=i,this.direct=o,a[n]=c}terminate(){this.#e(),super.terminate()}}return{...r,Worker:a}};const{WebSocket:vt}=globalThis;var Tt=e=>{const{ws:r}=e,n=kt(e);class s extends n.Worker{#t=null;constructor(e,n){const{proxy:s}=super(e,n),[c,i]=t(Number),[u,l]=c(),f=s[o],p=this.#t=new vt(r);p.onerror=console.error,p.onclose=()=>super.terminate(),p.onopen=()=>{p.send(ke([a])),i(u)},p.onmessage=async e=>{const t=ve(await e.data.arrayBuffer());if("number"==typeof t[0])i.apply(null,t);else{try{t[1]=await f(...t[1])}catch(e){t[1]=null,t[2]=e}p.send(ke(t))}},s[a]=async(...e)=>{await l;const[t,r]=c();return p.send(ke([t,e])),r}}terminate(){this.#t.close(),super.terminate()}}return{...n,Worker:s}};export{Tt as default};