UNPKG

@webreflection/coincident

Version:

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

2 lines (1 loc) 3.59 kB
const e="",{toString:t}={},{keys:r}=Object,s=r=>{const s=typeof r;if("object"!==s||!r)return[0,s];const n=t.call(r).slice(8,-1);switch(n){case"Array":return[1,e];case"Object":return[2,e];case"Date":return[3,e];case"RegExp":return[4,e];case"Map":return[5,e];case"Set":return[6,e];case"DataView":return[1,n]}return n.includes("Array")?[1,n]:n.includes("Error")?[7,n]:[2,n]},n=([e,t])=>0===e&&("function"===t||"symbol"===t),o=(e,{json:t,lossy:o}={})=>{const a=[];return((e,t,o,a)=>{const c=(e,t)=>{const r=a.push(e)-1;return o.set(t,r),r},u=a=>{if(o.has(a))return o.get(a);let[i,l]=s(a);switch(i){case 0:{let t=a;switch(l){case"bigint":i=8,t=a.toString();break;case"function":case"symbol":if(e)throw new TypeError("unable to serialize "+l);t=null;break;case"undefined":return c([-1],a)}return c([i,t],a)}case 1:{if(l){let e=a;return"DataView"===l?e=new Uint8Array(a.buffer):"ArrayBuffer"===l&&(e=new Uint8Array(a)),c([l,[...e]],a)}const e=[],t=c([i,e],a);for(const t of a)e.push(u(t));return t}case 2:{if(l)switch(l){case"BigInt":return c([l,a.toString()],a);case"Boolean":case"Number":case"String":return c([l,a.valueOf()],a)}if(t&&"toJSON"in a)return u(a.toJSON());const o=[],f=c([i,o],a);for(const t of r(a))!e&&n(s(a[t]))||o.push([u(t),u(a[t])]);return f}case 3:return c([i,a.toISOString()],a);case 4:{const{source:e,flags:t}=a;return c([i,{source:e,flags:t}],a)}case 5:{const t=[],r=c([i,t],a);for(const[r,o]of a)(e||!n(s(r))&&!n(s(o)))&&t.push([u(r),u(o)]);return r}case 6:{const t=[],r=c([i,t],a);for(const r of a)!e&&n(s(r))||t.push(u(r));return r}}const{message:f}=a;return c([i,{name:l,message:f}],a)};return u})(!(t||o),!!t,new Map,a)(e),a},{stringify:a}=JSON,c={json:!0,lossy:!0};const u=(i=e=>a(o(e,c)),({byteOffset:e=0}={})=>(t,r)=>{const s=i(t),n=s.length,o=2*n+e;r.byteLength<o&&r.grow(o);const a=new Uint16Array(r,e,n);for(let e=0;e<n;e++)a[e]=s.charCodeAt(e);return n});var i;const{assign:l,create:f}=Object;let g="coincident-",p=!0;try{new SharedArrayBuffer(4,{maxByteLength:8}),g+=crypto.randomUUID()}catch(e){p=!1,g+=Math.random().toString(36).substring(2)}const y={byteOffset:2*Int32Array.BYTES_PER_ELEMENT,useUTF16:!0,circular:!0},h=new Map,m=(e,t,r)=>{const s="then"!==t;return s&&(e[t]=r),s},w=()=>Promise.withResolvers(),d="InstallTrigger"in globalThis?g:"",{notify:b}=Atomics,S=e=>e;var A=e=>{const t=e?.transform,r=(e?.encoder||u)(y);class s extends globalThis.Worker{constructor(e,s){const{port1:n,port2:o}=new MessageChannel,[a,c]=((e,t=0)=>[r=>{const s=w();do{r=e(t++)}while(h.has(r));return h.set(r,s),[r,s]},(e,t,r)=>{const s=h.get(e);h.delete(e),r?s.reject(r):s.resolve(t)}])(S),u=new Map,i=f(null);let g="";super(e,l({type:"module"},s)).proxy=new Proxy(i,{get:(e,r)=>{if("then"===r)return;let s=u.get(r);return s||u.set(r,s=(...e)=>{const[s,o]=a();return n.postMessage([s,r,t?e.map(t):e]),(({promise:e},t)=>{if(g){const r=setTimeout(console.warn,3e3,`💀🔒 - is proxy.${g}() awaiting proxy.${t}() ?`);e=e.then((e=>(clearTimeout(r),e)),(e=>(clearTimeout(r),Promise.reject(e))))}return e})(o,r)}),s},set:m}),super.postMessage(d,[o]),p&&d&&super.addEventListener("message",(e=>{const{data:t}=e;t?.ID===d&&((e=>{e.stopImmediatePropagation(),e.preventDefault()})(e),n.onmessage(t))})),n.onmessage=async({data:e})=>{const s=e[0],o=typeof s;if("number"===o)c.apply(null,e);else if(g=e[1],await(async(e,t,r)=>{try{const s=await t[e[1]].apply(null,e[2]);e[1]=r?r(s):s,e[2]=null}catch(t){e[2]=t}})(e,i,t),g="","string"===o)n.postMessage(e);else{const t=e[2]||e[1];s[1]=void 0===t?0:r(t,s.buffer),s[0]=1,b(s,0)}}}}return{Worker:s,native:p}};export{A as default};