UNPKG

coincident

Version:

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

2 lines (1 loc) 7.51 kB
const e="ownKeys",t="destruct",r="destroy",n="c70de905-a212-4eca-80aa-dad8bd4e677b",s="="+n,o="-"+n,{ArrayBuffer:a,Atomics:c,Promise:i}=globalThis,{isArray:l}=Array,{create:u,getPrototypeOf:p,values:f}=Object,d=p(Int32Array),g=u(c),y=()=>i.withResolvers();let h=0;const w=new Map,m=(e,t)=>class extends e{constructor(e,...r){super(e,...r),e instanceof t&&w.set(this,[h++,0,y()])}},v=new WeakSet,b=e=>(v.add(e),e),M=(e,t)=>{const{data:r}=e,n=l(r)&&(r.at(0)===t||0===r.at(1)&&!t);return n&&(e.stopImmediatePropagation(),e.preventDefault()),n},k=e=>null!==e&&"object"==typeof e&&!v.has(e),E=new WeakMap,A=(e,t,r)=>{if(w.has(e))t.set(e,w.get(e)[0]);else if(!(e instanceof d||e instanceof a))for(const n of f(e))k(n)&&!r.has(n)&&(r.add(n),A(n,t,r))},T=(...e)=>({value:new i((t=>{let r=new Worker("data:application/javascript,onmessage%3De%3D%3EpostMessage(!Atomics.wait(...e.data))");r.onmessage=()=>t("ok"),r.postMessage(e)}))}),x=(e,t,r)=>{for(const[r,n]of t)E.set(r,[n,e.currentTarget]);(({currentTarget:e,type:t,origin:r,lastEventId:n,source:s,ports:o},a)=>{e.dispatchEvent(new MessageEvent(t,{data:a,origin:r,lastEventId:n,source:s,ports:o}))})(e,r)};let{BigInt64Array:S,Int32Array:W,SharedArrayBuffer:R,Worker:P}=globalThis,U=e=>e,I=!1;const j=e=>({...e,type:"module"});try{new R(4),P=class extends P{constructor(e,t){super(e,j(t))}},g.waitAsync||(g.waitAsync=T)}catch(e){const t=crypto.randomUUID(),r=new Map,n=(e,t,r,...n)=>{e.addEventListener(t,r,...n)},s=({serviceWorker:e},s,o)=>{let a,c=!0;n(e,"message",(e=>{if(M(e,t)){const[n,s,o]=e.data,c=[s,o].join(","),i=e=>{r.delete(c),a.postMessage([t,s,o,e])},l=r.get(c);if(l)i(l);else{const{promise:e,resolve:t}=y();r.set(c,t),e.then(i)}}})),e.getRegistration(s).then((t=>t??e.register(s))).then((function t(r){c=c&&!!e.controller,a=r.installing||r.waiting||r.active,"activated"===a.state?c?o():location.reload():n(a,"statechange",(()=>t(r)),{once:!0})}))};U=b,I=!0,g.notify=(e,n)=>{const[s,o]=(e=>E.get(e))(e),a=[s,n].join(","),c=r.get(a);return c?c(e):r.set(a,e),o.postMessage([t,1,e,s,n]),0},g.waitAsync=(e,...t)=>{const[r,n]=((e,t)=>{const r=w.get(e),[n,s,{promise:o}]=r;return r[1]=t,[n,o]})(e,...t);return{value:n}},R=class extends a{},S=m(S,R),W=m(W,R);let o=null;P=class extends P{constructor(e,r){let a=r?.serviceWorker||"";if(a){if(a=new URL(a,location.href).href,r={...r,serviceWorker:a},!o){const{promise:e,resolve:t}=y();s(navigator,a,t),o=e}o.then((()=>super.postMessage([t,3])))}super(e,j(r)),super.postMessage([t,0,r]),n(this,"message",(e=>{if(M(e,t)){const[t,r,...n]=e.data;switch(r){case 1:((e,t,r)=>{for(const[n,[s,o,{resolve:a}]]of w)if(t===s&&r===o){for(let t=0;t<e.length;t++)n[t]=e[t];w.delete(n),a("ok");break}})(...n);break;case 2:x(e,...n)}}}))}postMessage(e,...r){return super.postMessage(((e,t)=>{const r=new Map;return k(t)&&A(t,r,new Set),r.size?[e,2,r,t]:t})(t,e),...r)}}}const{BYTES_PER_ELEMENT:L}=Int32Array,{BYTES_PER_ELEMENT:D}=Uint16Array,{notify:O}=g,B=new TextDecoder("utf-16"),$=new WeakSet,_=(...e)=>($.add(e),e);let N="";let z=0;const F=([e,t,r,n,s,o,a,c,i],l)=>(...u)=>{let p=""!==N,f=0;p&&"="!==N[0]&&"-"!==N[0]&&(f=((e,t)=>setTimeout(console.warn,3e3,`💀🔒 - proxy.${e}() in proxy.${t}()`))(l,N));const d=z++;let g=[];$.has(u.at(-1)||g)&&$.delete(g=u.pop());const y=r(c?u.map(c):u);let h=t(2*L);return a([e,2,l,d,h,y,n],{transfer:g}),i(h,0).value.then((()=>{p&&clearTimeout(f);const r=h[1];if(!r)return;const n=D*r;return h=t(n+n%L),a([e,1,d,h]),i(h,0).value.then((()=>{const e=new Uint16Array(h.buffer),t=o?e.subarray(0,r):e.slice(0,r);return s(B.decode(t))}))}))};var Y=({parse:e,stringify:t,transform:r}=JSON)=>{const n=((e,t)=>async(r,n,[s,o,a,c,i])=>{i&&(N=s);try{const s=await r(...c);if(void 0!==s){const r=e(t?t(s):s);n.set(o,r),a[1]=r.length}}finally{i&&(N=""),a[0]=1,O(a,0)}})(t,r);return{Worker:class extends P{constructor(t,s){const o=crypto.randomUUID(),a=new Map,c=new Map;super(t,s),this.proxy=((e,t)=>new Proxy(t,{get:(t,r)=>{let n;return"then"!==r&&(n=t.get(r),n||(n=F(e,r),t.set(r,n))),n},set:(e,t,r)=>"then"!==t&&!!e.set(t,r)}))([o,e=>new W(new R(e)),U,!1,e,I,(...e)=>this.postMessage(...e),r,g.waitAsync],a),this.postMessage(U([o,0,s])),this.addEventListener("message",(e=>{if(M(e,o)){const[t,r,...s]=e.data;switch(r){case 2:((e,t,r,n)=>{const[s]=n,o=r.get(s);if(!o)throw new Error(`Unknown proxy.${s}()`);e(o,t,n)})(n,c,a,s);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);O(r,0)})(c,s)}}}))}},polyfill:I,transfer:_}};const C="array",J="function",K="null",q="number",G="object",H="string",Q="symbol",V="undefined";var X=Object.fromEntries([C,"bigint","boolean",J,K,q,G,H,Q,V].map(((e,t)=>[e,t])));const{[e]:Z}=Reflect,ee=new Map(Z(Symbol).filter((e=>typeof Symbol[e]===Q)).map((e=>[Symbol[e],e]))),te=e=>ee.get(e)||`.${Symbol.keyFor(e)||""}`,re=new FinalizationRegistry((([e,t,r])=>{r&&console.debug(`%c${String(t)}`,"font-weight:bold","collected"),e(t)})),ne=Object.create(null),{addEventListener:se}=EventTarget.prototype,oe=new WeakMap;Reflect.defineProperty(EventTarget.prototype,"addEventListener",{value(e,t,...r){const n=r.at(0)?.invoke;if(n){let t=oe.get(this);t||(t=new Map,oe.set(this,t)),t.set(e,[].concat(n)),delete r[0].invoke}return se.call(this,e,t,...r)}});const{isArray:ae}=Array;var ce=(n,s)=>{const{clear:o,drop:a,get:c,hold:i}=(()=>{const e=new Map,t=new Map;let r=0;return{clear:()=>{e.clear(),t.clear()},drop:r=>{const[n,s]=typeof r===q?[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)}}})(),l=new Map,u=e=>{l.delete(e),s(t,e)},p=e=>{const t=typeof e;switch(t){case G:return null===e?[X[K],e]:e===globalThis?[X[G],null]:ae(e)?[X[C],i(e)]:[X[G],e instanceof d?e:i(e)];case J:return[X[J],i(e)];case Q:return[X[Q],te(e)];default:return[X[t],e]}},f=([e,t])=>{switch(e){case X[G]:if(null===t)return globalThis;if(typeof t===q)return c(t);if(!(t instanceof d))for(const e in t)t[e]=f(t[e]);return t;case X[C]:return typeof t===q?c(t):t.map(f);case X[J]:switch(typeof t){case q:return c(t);case H:{let e=l.get(t)?.deref();return e||(e=((e,t,{debug:r,handler:n,return:s,token:o=e}=ne)=>{const a=s||new Proxy(e,n||ne),c=[a,[t,e,!!r]];return!1!==o&&c.push(o),re.register(...c),a})(t,u,{token:!1,return:function(...e){return e.length&&e[0]instanceof Event&&(e=>{const{currentTarget:t,target:r,type:n}=e,s=oe.get(t||r)?.get(n);if(s)for(const t of s)e[t]()})(e[0]),s("apply",t,p(this),e.map(p)).then(f)}}),l.set(t,new WeakRef(e))),e}}case X[Q]:return(e=>{if(e.startsWith("."))return Symbol.for(e.slice(1));for(const[t,r]of ee)if(r===e)return t})(t);default:return t}},g=(e,t,r)=>p(e(t,...r.map(f))),y=e=>import(n(e)),h=new Set;return(n,s,...i)=>{if(n===r)o();else if(n===t)h.has(s)||a(s);else{const t=Reflect[n],r=null==s?globalThis:c(s);switch(n){case"defineProperty":{const[e,n]=i.map(f);return p(t(r,e,n))}case"getOwnPropertyDescriptor":{const e=t(r,...i.map(f));if(e){const{get:t,set:r,value:n}=e;t&&(e.get=p(t)),r&&(e.set=p(r)),n&&(e.value=p(n))}return[X[e?G:V],e]}case e:return[X[C],t(r).map(p)];case"get":if(null==s){const e="import"===i[0][1]?p(y):g(t,r,i);return h.add(e[1]),e}default:return g(t,r,i)}}}},ie=e=>{const t=e?.import,n=Y(e);class a extends n.Worker{constructor(e,r){const{proxy:n}=super(e,r);n[s]=ce(r?.import||t||(e=>new URL(e,location.href)),n[o])}terminate(){this.proxy[s](r),super.terminate()}}return{...n,Worker:a}};export{ie as default};