UNPKG

coincident

Version:

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

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