@webreflection/coincident
Version:
An Atomics based Proxy to simplify, and synchronize, Worker related tasks
3 lines (2 loc) • 2.61 kB
JavaScript
const e="object"==typeof self?self:globalThis,t=t=>((t,r)=>{const n=(e,r)=>(t.set(r,e),e),s=a=>{if(t.has(a))return t.get(a);const[o,c]=r[a];switch(o){case 0:case-1:return n(c,a);case 1:{const e=n([],a);for(const t of c)e.push(s(t));return e}case 2:{const e=n({},a);for(const[t,r]of c)e[s(t)]=s(r);return e}case 3:return n(new Date(c),a);case 4:{const{source:e,flags:t}=c;return n(new RegExp(e,t),a)}case 5:{const e=n(new Map,a);for(const[t,r]of c)e.set(s(t),s(r));return e}case 6:{const e=n(new Set,a);for(const t of c)e.add(s(t));return e}case 7:{const{name:t,message:r}=c;return n(new e[t](r),a)}case 8:return n(BigInt(c),a);case"BigInt":return n(Object(BigInt(c)),a);case"ArrayBuffer":return n(new Uint8Array(c).buffer,c);case"DataView":{const{buffer:e}=new Uint8Array(c);return n(new DataView(e),c)}}return n(new e[o](c),a)};return s})(new Map,t)(0)
/*! (c) Andrea Giammarchi - ISC */,{parse:r}=JSON,{create:n}=Object;let s="coincident-",a=!0;try{new SharedArrayBuffer(4,{maxByteLength:8}),s+=crypto.randomUUID()}catch(e){a=!1,s+=Math.random().toString(36).substring(2)}const o=2*Int32Array.BYTES_PER_ELEMENT,c={byteOffset:o,useUTF16:!0,circular:!0},u=new Map,i=(e,t,r)=>{const n="then"!==t;return n&&(e[t]=r),n},f=()=>Promise.withResolvers(),{fromCharCode:l}=String,{min:p}=Math;const y=(g=e=>t(r(e)),({byteOffset:e})=>(t,r)=>{const n=new Uint16Array(r,e,t);let s="",a=0;for(;a<t;){const e=p(a+65535,t);s+=l.apply(null,n.subarray(a,e)),a=e}return g(s)});var g;const w=f();addEventListener("message",(e=>{(e=>{e.stopImmediatePropagation(),e.preventDefault()})(e),w.resolve([e.data,e.ports[0]])}),{once:!0});var h=async e=>{const[t,r]=await w.promise,s=a&&!!t,o=e?.transform,l=(e?.decoder||y)(c);let p,g;if(a){const t=new SharedArrayBuffer(e?.minByteLength||65535,{maxByteLength:e?.maxByteLength||16777216});p=new Int32Array(t),g=Atomics.wait}const[h,d]=((e,t=0)=>[r=>{const n=f();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),m=new Map,b=n(null),B=new Proxy(b,{get(e,n){if("then"===n)return;let c=m.get(n);return c||m.set(n,c=(...e)=>{const c=[p,n,o?e.map(o):e];if(a){s?postMessage({ID:t,data:c}):r.postMessage(c),g(p,0),p[0]=0;const e=p[1]?l(p[1],p.buffer):void 0;if(e instanceof Error)throw e;return e}{const[e,t]=h();return c[0]=e,r.postMessage(c),t.promise}}),c},set:i});return r.onmessage=async({data:e})=>{"string"==typeof e[0]?d.apply(null,e):(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,b,o),r.postMessage(e))},{native:a,proxy:B}};export{h as default};