UNPKG

@webreflection/coincident

Version:

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

2 lines (1 loc) 6.7 kB
const e="2d28b248-43f8-4fdc-b78e-514b8111e549",t="="+e,r="-"+e,n=t+"-ws",s=r+"-ws",{create:o}=Object;let a="coincident-",c=!0;try{new SharedArrayBuffer(4,{maxByteLength:8}),a+=crypto.randomUUID()}catch(e){c=!1,a+=Math.random().toString(36).substring(2)}const l=2*Int32Array.BYTES_PER_ELEMENT,i={byteOffset:l,useUTF16:!0,circular:!0},u=new Map,f=e=>e,y=(e,t,r)=>{const n="then"!==t;return n&&(e[t]=r),n},p=()=>Promise.withResolvers(),{fromCharCode:d}=String,{min:g}=Math;const{parse:h}=JSON,w=(b=h,({byteOffset:e})=>(t,r)=>{const n=new Uint16Array(r,e,t);let s="",o=0;for(;o<t;){const e=g(o+65535,t);s+=d.apply(null,n.subarray(o,e)),o=e}return b(s)});var b;const m=p();addEventListener("message",(e=>{(e=>{e.stopImmediatePropagation(),e.preventDefault()})(e),m.resolve([e.data,e.ports[0]])}),{once:!0});var E=async e=>{const[t,r]=await m.promise,n=c&&!!t,s=e?.transform,a=(e?.decoder||w)(i);let l,d;if(c){const t=new SharedArrayBuffer(e?.minByteLength||65535,{maxByteLength:e?.maxByteLength||16777216});l=new Int32Array(t),d=Atomics.wait;const r=e?.interrupt;if(r){const{handler:e,timeout:t=42}=r;d=(r,n,s)=>{for(;"timed-out"===(s=wait(r,n,0,t));)e();return s}}}const[g,h]=((e=f,t=0)=>[r=>{const n=p();do{r=e(t++)}while(u.has(r));return u.set(r,n),[r,n]},(e,t,r)=>{const n=u.get(e);u.delete(e),r?n.reject(r):n.resolve(t)}])(String),b=new Map,E=o(null),P=new Proxy(E,{get(e,o){if("then"===o)return;let i=b.get(o);return i||b.set(o,i=(...e)=>{const i=[l,o,s?e.map(s):e];if(c){n?postMessage({ID:t,data:i}):r.postMessage(i),d(l,0),l[0]=0;const e=l[1]?a(l[1],l.buffer):void 0;if(e instanceof Error)throw e;return e}{const[e,t]=g();return i[0]=e,r.postMessage(i),t.promise}}),i},set:y});return r.onmessage=async({data:[e,t,n]})=>{if("string"==typeof e)h(e,t,n);else{const o=await(async(e,t,r,n)=>{const s=[e,null,null];try{const e=await t(...r);s[1]=n?n(e):e}catch(e){s[2]=e}return s})(e,E[t],n,s);r.postMessage(o)}},{native:c,proxy:P}};const P="apply",v="construct",O="defineProperty",S="deleteProperty",T="get",x="getOwnPropertyDescriptor",R="getPrototypeOf",_="has",M="isExtensible",A="ownKeys",I="preventExtensions",k="set",N="setPrototypeOf";var j=Object.freeze({__proto__:null,APPLY:P,CONSTRUCT:v,DEFINE_PROPERTY:O,DELETE_PROPERTY:S,GET:T,GET_OWN_PROPERTY_DESCRIPTOR:x,GET_PROTOTYPE_OF:R,HAS:_,IS_EXTENSIBLE:M,OWN_KEYS:A,PREVENT_EXTENSION:I,SET:k,SET_PROTOTYPE_OF:N});const B="destruct",L="array",Y="function",D="null",F="number",W="object",C="symbol",U="undefined";function $(){return this}const G=new FinalizationRegistry((([e,t,r])=>{r&&console.debug(`%c${String(t)}`,"font-weight:bold","collected"),e(t)})),K=Object.create(null),{Object:z,Proxy:V,Reflect:X}=globalThis,{isArray:H}=Array,{ownKeys:J}=X,{create:q,hasOwn:Q,values:Z}=z,ee=(e,t)=>t===L?e[0]:t===Y?e():t===W?e.$:e,te=(e,t,r,n)=>{const s={type:{value:t}},o=Q(e,"valueOf");for(const a of Z(j)){let c=n(e[a]||X[a]);if(o&&a===T){const{valueOf:n}=e,{value:s}=c;c={value(e,o,...a){return o===r?n.call(this,ee(e,t)):s.call(this,e,o,...a)}}}s[a]=c}return q(e,s)},re=(e,t,r,n=e)=>{if(n===e)switch(typeof e){case W:case U:n||(n=!1);case Y:break;default:n=!1,t===e&&(t=z(e))}const s=new V(t,r),{destruct:o}=r;return o?((e,t,{debug:r,handler:n,return:s,token:o=e}=K)=>{const a=s||new Proxy(e,n||K),c=[a,[t,e,!!r]];return!1!==o&&c.push(o),G.register(...c),a})(e,o,{token:n,return:s}):s},ne=e=>t=>{const r=typeof t;return r===W?t?e.get(t)?.[0]??(e=>H(e)?L:W)(t):D:r},se=e=>t=>{let r=typeof t;switch(r){case W:if(!t){r=D;break}case Y:const n=e.get(t);n&&([r,t]=n)}return[r,t]},oe=e=>((e=>{G.unregister(e)})(e),e);var ae=e=>{const t=new WeakMap,r=Symbol(),n={},s=(e,r,n)=>(t.set(e,[r,n]),e),o={proxy:n,release:oe,pair:se(t),typeOf:ne(t),isProxy:e=>t.has(e),valueOf:e=>e[r]??e.valueOf()};for(const t of J(e)){if(Q(o,t))continue;const a=e[t];switch(t){case L:{const e=te(a,t,r,(e=>({value([t],...r){return e.call(this,t,...r)}})));n[t]=(t,...r)=>s(re(t,[t],e,...r),L,t);break}case Y:{const e=te(a,t,r,(e=>({value(t,...r){return e.call(this,t(),...r)}})));n[t]=(t,...r)=>{return s(re(t,(n=t,$.bind(n)),e,...r),Y,t);var n};break}case W:{const e=te(a,t,r,(e=>({value({$:t},...r){return e.call(this,t,...r)}})));n[t]=(t,...r)=>s(re(t,{$:t},e,...r),W,t);break}default:{const e=te(a,t,r,(e=>({value:e})));n[t]=(r,...n)=>s(re(r,r,e,...n),t,r);break}}}return o};const{drop:ce,get:le,hold:ie}=(()=>{const e=new Map,t=new Map;let r=0;return{clear:()=>{e.clear(),t.clear()},drop:r=>{const[n,s]=typeof r===F?[t,e]:[e,t],o=n.has(r);return o&&(s.delete(n.get(r)),n.delete(r)),o},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 ue=Object.fromEntries([L,"bigint","boolean",Y,D,F,W,"string",C,U].map(((e,t)=>[e,t])));const{[A]:fe}=Reflect,ye=new Map(fe(Symbol).filter((e=>typeof Symbol[e]===C)).map((e=>[Symbol[e],e]))),pe=e=>ye.get(e)||`.${Symbol.keyFor(e)||""}`,{isArray:de}=Array,{isView:ge}=ArrayBuffer,{[P]:he}=Reflect;var we=(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 ue[W]:return null==t?globalThis:typeof t===F?n(t,i.object):t;case ue[L]:return typeof t===F?n(t,i.array):t;case ue[Y]:return typeof t===F?n(t,i.function):le(parseInt(t));case ue[C]:return(e=>{if(e.startsWith("."))return Symbol.for(e.slice(1));for(const[t,r]of ye)if(r===e)return t})(t);default:return t}},o=e=>{let[r,n]=f(e);switch(r){case W:if(n==globalThis||null==n)n=null;else if(typeof n===W&&!ge(n))if(n=t(n),de(n))n=n.map(o);else for(const e in n)n[e]=o(n[e]);return[ue[W],n];case L:return[ue[L],typeof n===F?n:t(n).map(o)];case Y:return[ue[Y],typeof n===Y?String(ie(t(n))):n];case C:return[ue[C],pe(e)];default:return[ue[r],n]}},a=(...t)=>s(e(...t)),c={[O]:(e,t,r)=>a(O,e,o(t),o(r)),[S]:(e,t)=>a(S,e,o(t)),[T]:(e,t)=>a(T,e,o(t)),[R]:e=>a(R,e),[x]:(e,t)=>{const r=a(x,e,o(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},[_]:(e,t)=>a(_,e,o(t)),[M]:e=>a(M,e),[A]:e=>a(A,e).map(s),[I]:e=>a(I,e),[k]:(e,t,r)=>a(k,e,o(t),o(r)),[N]:(e,t)=>a(N,e,o(t)),[B](t){r.delete(t),e(B,t)}},l={[W]:c,[L]:c,[Y]:{...c,[P]:(e,...t)=>a(P,e,...t.map(o)),[v]:(e,...t)=>a(v,e,...t.map(o))}},{proxy:i,isProxy:u,pair:f}=ae(l);return{isProxy:u,global:i.object(null),method:async(e,t,...r)=>{const n=parseInt(t);switch(e){case P:{const[e,t]=r;return o(await he(le(n),s(e),t.map(s)))}case B:ce(n)}}}},be=async e=>{const o=await(async e=>{const n=await E(e),{isProxy:s,global:o,method:a}=we(n.proxy[t],e?.transform||(e=>e));return n.proxy[r]=a,{...n,window:o,isWindowProxy:s}})(e),{isProxy:a,global:c,method:l}=we(o.proxy[n],e?.transform||(e=>e));return o.proxy[s]=l,{...o,server:c,isServerProxy:a}};export{be as default};