UNPKG

@webreflection/coincident

Version:

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

2 lines (1 loc) 5.3 kB
const e="destroy";var t=e=>({byteOffset:t=0}={})=>(r,n)=>{const s=e(r),o=s.length,a=2*o+t;n.byteLength<a&&n.grow(a);const c=new Uint16Array(n,t,o);for(let e=0;e<o;e++)c[e]=s.charCodeAt(e);return o};const{stringify:r}=JSON,n=t(r),s="array",o="bigint",a="function",c="null",i="number",l="object",u="string",p="symbol",f="undefined",{getPrototypeOf:g}=Object,y=e=>{for(;!(e.name in globalThis);)e=g(e);return e.name};var d=Object.fromEntries([s,o,"boolean",a,c,i,l,u,p,f,"view"].map(((e,t)=>[e,t])));const{stringify:h}=JSON,m=t((e=>{switch(e[0]){case d.view:{const{constructor:t,buffer:r}=e[1];e[1]=[y(t),[...new Uint8Array(r)]];break}case d[o]:e[1]=e[1].toString()}return h(e)})),w="592e34ef",b="="+w,v="-"+w,{assign:T,create:M}=Object;let S="coincident-",k=!0;try{new SharedArrayBuffer(4,{maxByteLength:8}),S+=crypto.randomUUID()}catch(e){k=!1,S+=Math.random().toString(36).substring(2)}const E={byteOffset:2*Int32Array.BYTES_PER_ELEMENT,useUTF16:!0,circular:!0},x=new Map,O=(e,t,r)=>{const n="then"!==t;return n&&(e[t]=r),n},P=()=>Promise.withResolvers(),A="InstallTrigger"in globalThis?S:"",{notify:R}=Atomics,j=e=>e;var L=e=>{const t=e?.transform,r=(e?.encoder||n)(E);class s extends globalThis.Worker{constructor(e,n){const{port1:s,port2:o}=new MessageChannel,[a,c]=((e,t=0)=>[r=>{const n=P();do{r=e(t++)}while(x.has(r));return x.set(r,n),[r,n]},(e,t,r)=>{const n=x.get(e);x.delete(e),r?n.reject(r):n.resolve(t)}])(j),i=new Map,l=M(null);let u="";super(e,T({type:"module"},n)).proxy=new Proxy(l,{get:(e,r)=>{if("then"===r)return;let n=i.get(r);return n||i.set(r,n=(...e)=>{const[n,o]=a();return s.postMessage([n,r,t?e.map(t):e]),(({promise:e},t)=>{if(u){const r=setTimeout(console.warn,3e3,`💀🔒 - is proxy.${u}() awaiting proxy.${t}() ?`);e=e.then((e=>(clearTimeout(r),e)),(e=>(clearTimeout(r),Promise.reject(e))))}return e})(o,r)}),n},set:O}),super.postMessage(A,[o]),k&&A&&super.addEventListener("message",(e=>{const{data:t}=e;t?.ID===A&&((e=>{e.stopImmediatePropagation(),e.preventDefault()})(e),s.onmessage(t))})),s.onmessage=async({data:e})=>{const n=e[0],o=typeof n;if("number"===o)c.apply(null,e);else if(u=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,l,t),u="","string"===o)s.postMessage(e);else{const t=e[2]||e[1];n[1]=void 0===t?0:r(t,n.buffer),n[0]=1,R(n,0)}}}}return{Worker:s,native:k}};const U="destruct",W=new Map;for(const e of Reflect.ownKeys(Symbol))typeof Symbol[e]===p&&(W.set(Symbol[e],e),W.set(e,Symbol[e]));const I=e=>W.get(e)||`.${Symbol.keyFor(e)||""}`,B=new FinalizationRegistry((([e,t,r])=>{r&&console.debug(`%c${String(t)}`,"font-weight:bold","collected"),e(t)})),D=Object.create(null),{addEventListener:$}=EventTarget.prototype,F=new WeakMap;Reflect.defineProperty(EventTarget.prototype,"addEventListener",{value(e,t,...r){const n=r.at(0)?.invoke;if(n){let t=F.get(this);t||(t=new Map,F.set(this,t)),t.set(e,[].concat(n)),delete r[0].invoke}return $.call(this,e,t,...r)}});const{isArray:N}=Array,{isView:C}=ArrayBuffer;var J=(t,r)=>{const{clear:n,drop:o,get:g,hold:y}=(()=>{const e=new Map,t=new Map;let r=0;return{clear:()=>{e.clear(),t.clear()},drop:r=>{const[n,s]=typeof r===i?[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)}}})(),h=new Map,m=e=>{h.delete(e),r(U,e)},w=e=>{const t=typeof e;switch(t){case l:return null===e?[d[c],e]:e===globalThis?[d[l],null]:N(e)?[d[s],y(e)]:C(e)?[d.view,e]:[d[l],y(e)];case a:return[d[a],y(e)];case p:return[d[p],I(e)];default:return[d[t],e]}},b=([e,t])=>{switch(e){case d[l]:if(null===t)return globalThis;if(typeof t===i)return g(t);for(const e in t)t[e]=b(t[e]);return t;case d[s]:return typeof t===i?g(t):t.map(b);case d[a]:switch(typeof t){case i:return g(t);case u:{let e=h.get(t)?.deref();return e||(e=((e,t,{debug:r,handler:n,return:s,token:o=e}=D)=>{const a=s||new Proxy(e,n||D),c=[a,[t,e,!!r]];return!1!==o&&c.push(o),B.register(...c),a})(t,m,{token:!1,return:function(...e){return e.length&&e[0]instanceof Event&&(e=>{const{currentTarget:t,target:r,type:n}=e,s=F.get(t||r)?.get(n);if(s)for(const t of s)e[t]()})(e[0]),r("apply",t,w(this),e.map(w)).then(b)}}),h.set(t,new WeakRef(e))),e}}case d[p]:return(e=>W.get(e)||Symbol.for(e.slice(1)))(t);default:return t}},v=(e,t,r)=>w(e(t,...r.map(b))),T=e=>import(t(e)),M=new Set;return(t,r,...a)=>{if(t===e)n();else if(t===U)M.has(r)||o(r);else{const e=Reflect[t],n=null==r?globalThis:g(r);switch(t){case"defineProperty":{const[t,r]=a.map(b);return w(e(n,t,r))}case"getOwnPropertyDescriptor":{const t=e(n,...a.map(b));if(t){const{get:e,set:r,value:n}=t;e&&(t.get=w(e)),r&&(t.set=w(r)),n&&(t.value=w(n))}return[d[t?l:f],t]}case"ownKeys":return[d[s],e(n).map(w)];case"get":if(null==r){const t="import"===a[0][1]?w(T):v(e,n,a);return M.add(t[1]),t}default:return v(e,n,a)}}return[d[f],void 0]}},K=t=>{let r=!1;const s=t?.import,o=t?.encoder||n,a=L({...t,encoder(e){const t=o(e),n=m(e);return(e,s)=>r?(r=!1,n(e,s)):t(e,s)}});class c extends a.Worker{constructor(e,t){const{proxy:n}=super(e,t),o=J(t?.import||s||(e=>new URL(e,location.href)),n[v]);n[b]=function(...e){return r=!0,o.apply(this,e)}}terminate(){this.proxy[b](e),super.terminate()}}return{...a,Worker:c}};export{K as default};