coincident
Version:
An Atomics based Proxy to simplify, and synchronize, Worker related tasks
2 lines (1 loc) • 9.24 kB
JavaScript
const e="c70de905-a212-4eca-80aa-dad8bd4e677b",t="="+e,r="-"+e,n=t+"-ws",s=r+"-ws",a="apply",o="construct",c="defineProperty",l="deleteProperty",i="get",u="getOwnPropertyDescriptor",f="getPrototypeOf",p="has",y="isExtensible",d="ownKeys",g="preventExtensions",w="set",h="setPrototypeOf";var b=Object.freeze({__proto__:null,APPLY:a,CONSTRUCT:o,DEFINE_PROPERTY:c,DELETE_PROPERTY:l,GET:i,GET_OWN_PROPERTY_DESCRIPTOR:u,GET_PROTOTYPE_OF:f,HAS:p,IS_EXTENSIBLE:y,OWN_KEYS:d,PREVENT_EXTENSION:g,SET:w,SET_PROTOTYPE_OF:h});const v="destruct",{ArrayBuffer:E,Atomics:m,Promise:T}=globalThis,{isArray:P}=Array,{create:O,getPrototypeOf:k,values:x}=Object,S=k(Int32Array),A=O(m),R=({currentTarget:e,type:t,origin:r,lastEventId:n,source:s,ports:a},o)=>e.dispatchEvent(new MessageEvent(t,{data:o,origin:r,lastEventId:n,source:s,ports:a})),_=()=>T.withResolvers();let M=0;const I=new Map,j=(e,t)=>class extends e{constructor(e,...r){super(e,...r),e instanceof t&&I.set(this,[M++,0,_()])}},$=new WeakSet,N=e=>($.add(e),e),W=(e,t)=>{const{data:r}=e,n=P(r)&&(r.at(0)===t||0===r.at(1)&&!t);return n&&(e.stopImmediatePropagation(),e.preventDefault()),n},Y=e=>null!==e&&"object"==typeof e&&!$.has(e),D=new WeakMap,L=(e,t,r)=>{if(I.has(e))t.set(e,I.get(e)[0]);else if(!(e instanceof S||e instanceof E))for(const n of x(e))Y(n)&&!r.has(n)&&(r.add(n),L(n,t,r))},B=(...e)=>({value:new T((t=>{let r=new Worker("data:application/javascript,onmessage%3De%3D%3EpostMessage(!Atomics.wait(...e.data))");r.onmessage=()=>t("ok"),r.postMessage(e)}))}),C=(e,t)=>{const r=I.get(e),[n,s,{promise:a}]=r;return r[1]=t,[n,a]};let{BigInt64Array:F,Int32Array:U,SharedArrayBuffer:z,addEventListener:H,postMessage:G}=globalThis,K=!0,X=e=>e,q=!1;const J=_();try{new z(4),A.waitAsync||(A.waitAsync=B),J.resolve()}catch(e){const t=G,r=H,n=[];let s="",a="";z=class extends E{},F=j(F,z),U=j(U,z),X=N,q=!0,A.notify=(e,r)=>{const[n]=(e=>D.get(e))(e);return t([s,1,e,n,r]),0},A.waitAsync=(...e)=>{const[t,r]=C(...e);return{value:r}},A.wait=(e,t,...r)=>{const[n]=C(e,t,...r),o=new XMLHttpRequest;o.responseType="json",o.open("POST",`${a}?sabayon`,!1),o.setRequestHeader("Content-Type","application/json"),o.send(`["${s}",${n},${t}]`);const{response:c}=o;I.delete(e);for(let t=0;t<c.length;t++)e[t]=c[t];return"ok"},r("message",(e=>{if(W(e,s)){const[t,r,...n]=e.data;switch(r){case 0:s=t,a=n.at(0)?.serviceWorker||"",a||(A.wait=null,J.resolve());break;case 1:((e,t,r)=>{for(const[n,[s,a,{resolve:o}]]of I)if(t===s&&r===a){for(let t=0;t<e.length;t++)n[t]=e[t];I.delete(n),o("ok");break}})(...n);break;case 2:((e,t,r)=>{for(const[r,n]of t)D.set(r,[n,e.currentTarget]);R(e,r)})(e,...n);break;case 3:J.resolve()}}else if(K){const{currentTarget:t,type:r,origin:s,lastEventId:a,source:o,ports:c}=e;n.push([{currentTarget:t,type:r,origin:s,lastEventId:a,source:o,ports:c},e.data])}})),H=(e,...t)=>{if(r(e,...t),n.length)for(const e of n.splice(0))R(...e)},G=(e,...r)=>t(((e,t)=>{const r=new Map;return Y(t)&&L(t,r,new Set),r.size?[e,2,r,t]:t})(s,e),...r)}await J.promise,K=!1;const{BYTES_PER_ELEMENT:V}=Int32Array,{BYTES_PER_ELEMENT:Q}=Uint16Array,{notify:Z}=A,ee=new TextDecoder("utf-16"),te=new WeakSet,re=(...e)=>(te.add(e),e);let ne="";const se=(e,t,r,n)=>{const[s]=n,a=r.get(s);if(!a)throw new Error(`Unknown proxy.${s}()`);e(a,t,n)};let ae=0;const oe=([e,t,r,n,s,a,o,c,l],i)=>(...u)=>{let f=""!==ne,p=0;f&&"="!==ne[0]&&"-"!==ne[0]&&(p=((e,t)=>setTimeout(console.warn,3e3,`💀🔒 - proxy.${e}() in proxy.${t}()`))(i,ne));const y=ae++;let d=[];te.has(u.at(-1)||d)&&te.delete(d=u.pop());const g=r(c?u.map(c):u);let w=t(2*V);return o([e,2,i,y,w,g,n],{transfer:d}),l(w,0).value.then((()=>{f&&clearTimeout(p);const r=w[1];if(!r)return;const n=Q*r;return w=t(n+n%V),o([e,1,y,w]),l(w,0).value.then((()=>{const e=new Uint16Array(w.buffer),t=a?e.subarray(0,r):e.slice(0,r);return s(ee.decode(t))}))}))},ce=(e,t)=>new Proxy(t,{get:(t,r)=>{let n;return"then"!==r&&(n=t.get(r),n||(n=oe(e,r),t.set(r,n))),n},set:(e,t,r)=>"then"!==t&&!!e.set(t,r)}),{wait:le,waitAsync:ie}=A;var ue=({parse:e,stringify:t,transform:r,interrupt:n}=JSON)=>{const s=((e,t)=>async(r,n,[s,a,o,c,l])=>{l&&(ne=s);try{const s=await r(...c);if(void 0!==s){const r=e(t?t(s):s);n.set(a,r),o[1]=r.length}}finally{l&&(ne=""),o[0]=1,Z(o,0)}})(t,r),a=_(),o=new Map,c=new Map;let l="",i=le;if(le&&n){const{handler:e,timeout:t=42}=n;i=(r,n,s)=>{for(;"timed-out"===(s=le(r,n,0,t));)e();return s}}return H("message",(t=>{if(W(t,l)){const[n,u,...f]=t.data;switch(u){case 0:{const t=!!le;l=n,a.resolve({polyfill:q,sync:t,transfer:re,proxy:ce([l,e=>new U(new z(e)),X,t,e,q,G,r,t?(...e)=>({value:{then:t=>t(i(...e))}}):ie],o)});break}case 2:o.size?se(s,c,o,f):setTimeout(se,0,s,c,o,f);break;case 1:((e,[t,r])=>{const n=e.get(t);e.delete(t);for(let e=new Uint16Array(r.buffer),t=0,{length:s}=n;t<s;t++)e[t]=n.charCodeAt(t);Z(r,0)})(c,f)}}})),a.promise};const fe="array",pe="function",ye="null",de="number",ge="object",we="symbol",he="undefined";function be(){return this}const ve=new FinalizationRegistry((([e,t,r])=>{r&&console.debug(`Held value ${String(t)} not relevant anymore`),e(t)})),Ee=Object.create(null),{Object:me,Proxy:Te,Reflect:Pe}=globalThis,{isArray:Oe}=Array,{ownKeys:ke}=Pe,{create:xe,hasOwn:Se,values:Ae}=me,Re=(e,t)=>t===fe?e[0]:t===pe?e():t===ge?e.$:e,_e=(e,t,r,n)=>{const s={type:{value:t}},a=Se(e,"valueOf");for(const o of Ae(b)){let c=n(e[o]||Pe[o]);if(a&&o===i){const{valueOf:n}=e,{value:s}=c;c={value(e,a,...o){return a===r?n.call(this,Re(e,t)):s.call(this,e,a,...o)}}}s[o]=c}return xe(e,s)},Me=(e,t,r,n=e)=>{if(n===e)switch(typeof e){case ge:case he:n||(n=!1);case pe:break;default:n=!1,t===e&&(t=me(e))}const s=new Te(t,r),{destruct:a}=r;return a?((e,t,{debug:r,handler:n,return:s,token:a=e}=Ee)=>{const o=s||new Proxy(e,n||Ee),c=[o,[t,e,!!r]];return!1!==a&&c.push(a),ve.register(...c),o})(e,a,{token:n,return:s}):s},Ie=e=>t=>{const r=typeof t;return r===ge?t?e.get(t)?.[0]??(e=>Oe(e)?fe:ge)(t):ye:r},je=e=>t=>{let r=typeof t;switch(r){case ge:if(!t){r=ye;break}case pe:const n=e.get(t);n&&([r,t]=n)}return[r,t]},$e=e=>((e=>{ve.unregister(e)})(e),e);var Ne=e=>{const t=new WeakMap,r=Symbol(),n={},s=(e,r,n)=>(t.set(e,[r,n]),e),a={proxy:n,release:$e,pair:je(t),typeOf:Ie(t),isProxy:e=>t.has(e),valueOf:e=>e[r]??e.valueOf()};for(const t of ke(e)){if(Se(a,t))continue;const o=e[t];switch(t){case fe:{const e=_e(o,t,r,(e=>({value([t],...r){return e.call(this,t,...r)}})));n[t]=(t,...r)=>s(Me(t,[t],e,...r),fe,t);break}case pe:{const e=_e(o,t,r,(e=>({value(t,...r){return e.call(this,t(),...r)}})));n[t]=(t,...r)=>{return s(Me(t,(n=t,be.bind(n)),e,...r),pe,t);var n};break}case ge:{const e=_e(o,t,r,(e=>({value({$:t},...r){return e.call(this,t,...r)}})));n[t]=(t,...r)=>s(Me(t,{$:t},e,...r),ge,t);break}default:{const e=_e(o,t,r,(e=>({value:e})));n[t]=(r,...n)=>s(Me(r,r,e,...n),t,r);break}}}return a};const{clear:We,drop:Ye,get:De,hold:Le}=(()=>{const e=new Map,t=new Map;let r=0;return{clear:()=>{e.clear(),t.clear()},drop:r=>{const[n,s]=typeof r===de?[t,e]:[e,t],a=n.has(r);return a&&(s.delete(n.get(r)),n.delete(r)),a},get:e=>t.get(e),hold:n=>{if(!e.has(n)){let s;for(;t.has(s=r++););e.set(n,s),t.set(s,n)}return e.get(n)}}})();var Be=Object.fromEntries([fe,"bigint","boolean",pe,ye,de,ge,"string",we,he].map(((e,t)=>[e,t])));const{[d]:Ce}=Reflect,Fe=new Map(Ce(Symbol).filter((e=>typeof Symbol[e]===we)).map((e=>[Symbol[e],e]))),Ue=e=>Fe.get(e)||`.${Symbol.keyFor(e)||""}`,{isArray:ze}=Array,{[a]:He}=Reflect;var Ge=(e,t)=>{const r=new Map,n=(e,t)=>{let n=r.get(e)?.deref();return n||r.set(e,new WeakRef(n=t(e))),n},s=([e,t])=>{switch(e){case Be[ge]:return null==t?globalThis:typeof t===de?n(t,P.object):t;case Be[fe]:return typeof t===de?n(t,P.array):t;case Be[pe]:return typeof t===de?n(t,P.function):De(parseInt(t));case Be[we]:return(e=>{if(e.startsWith("."))return Symbol.for(e.slice(1));for(const[t,r]of Fe)if(r===e)return t})(t);default:return t}},b=e=>{let[r,n]=k(e);switch(r){case ge:if(n==globalThis||null==n)n=null;else if(typeof n===ge&&!(n instanceof S))if(n=t(n),ze(n))n=n.map(b);else for(const e in n)n[e]=b(n[e]);return[Be[ge],n];case fe:return[Be[fe],typeof n===de?n:t(n).map(b)];case pe:return[Be[pe],typeof n===pe?String(Le(t(n))):n];case we:return[Be[we],Ue(e)];default:return[Be[r],n]}},E=(...t)=>s(e(...t)),m={[c]:(e,t,r)=>E(c,e,b(t),b(r)),[l]:(e,t)=>E(l,e,b(t)),[i]:(e,t)=>E(i,e,b(t)),[f]:e=>E(f,e),[u]:(e,t)=>{const r=E(u,e,b(t));if(r){const{get:e,set:t,value:n}=r;e&&(r.get=s(e)),t&&(r.set=s(t)),n&&(r.value=s(n))}return r},[p]:(e,t)=>E(p,e,b(t)),[y]:e=>E(y,e),[d]:e=>E(d,e).map(s),[g]:e=>E(g,e),[w]:(e,t,r)=>E(w,e,b(t),b(r)),[h]:(e,t)=>E(h,e,b(t)),[v](t){r.delete(t),e(v,t)}},T={[ge]:m,[fe]:m,[pe]:{...m,[a]:(e,...t)=>E(a,e,...t.map(b)),[o]:(e,...t)=>E(o,e,...t.map(b))}},{proxy:P,isProxy:O,pair:k}=Ne(T);return{isProxy:O,global:P.object(null),method:async(e,t,...r)=>{const n=parseInt(t);switch(e){case a:{const[e,t]=r;return b(await He(De(n),s(e),t.map(s)))}case v:Ye(n)}}}},Ke=async e=>{const a=await(async e=>{const n=await ue(e),{isProxy:s,global:a,method:o}=Ge(n.proxy[t],e?.transform||(e=>e));return n.proxy[r]=o,{...n,window:a,isWindowProxy:s}})(e),{isProxy:o,global:c,method:l}=Ge(a.proxy[n],e?.transform||(e=>e));return a.proxy[s]=l,{...a,server:c,isServerProxy:o}};export{Ke as default};