UNPKG

@webreflection/coincident

Version:

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

2 lines (1 loc) 3.15 kB
const{create:e}=Object;let t="coincident-",r=!0;try{new SharedArrayBuffer(4,{maxByteLength:8}),t+=crypto.randomUUID()}catch(e){r=!1,t+=Math.random().toString(36).substring(2)}const n=2*Int32Array.BYTES_PER_ELEMENT,s={byteOffset:n,useUTF16:!0,circular:!0},a=new Map,o=(e,t,r)=>{const n="then"!==t;return n&&(e[t]=r),n},c=()=>Promise.withResolvers(),{fromCharCode:u}=String,{min:l}=Math;var i=0,f=1,y=2,p=3,d=4,h=5,w=6,g=7,m=8,v=9,b=10,S=11,B=12,E=13,M=14,x=15,A=16,L=17;const{defineProperty:I}=Object,O=e=>{switch(e[P++]){case f:{const t=e[P++],r=[];e[P-2]=r;for(let n=0;n<t;n++)r[n]=O(e);return r}case y:{const t=e[P++],r={};e[P-2]=r;for(let n=0;n<t;n++)r[O(e)]=O(e);return r}case d:{const t=e[P++];return e[P-2]=t,t}case i:return e[e[P++]];case p:return e[P++];case B:return BigInt(e[P++]);case h:return!0;case w:return!1;case g:return null;case E:return;case m:{const t=e[P++],r=e[P++],n=[t];r&&n.push({maxByteLength:r});const s=new ArrayBuffer(...n);e[P-3]=s;const a=new Uint8Array(s,0,t);for(let r=0;r<t;r++)a[r]=e[P++];return s}case v:{const t=e[P++],r=e[P++],n=e[P++],s=[O(e),r];n&&s.push(n);const a=new globalThis[t](...s);return e[P-4]=a,a}case b:return(t=e[P++]).startsWith("Symbol.")?Symbol[t.slice(t.indexOf(".")+1)]:Symbol.for(t);case S:{const t=new Date(e[P++]);return e[P-2]=t,t}case M:{const t=e[P++],r=new Map;e[P-2]=r;for(let n=0;n<t;n++){const t=O(e),n=O(e);void 0!==t&&r.set(t,n)}return r}case x:{const t=e[P++],r=new Set;e[P-2]=r;for(let n=0;n<t;n++){const t=O(e);void 0!==t&&r.add(t)}return r}case A:{const t=e[P++],r=e[P++],n=new RegExp(t,r);return e[P-3]=n,n}case L:{const t=globalThis[e[P++]]||Error,r=e[P++],n=e[P++],s=new t(r,{cause:e[P++]});return e[P-5]=I(s,"stack",{value:n}),s}default:throw new Error(`Unknown type: ${e[P-1]}`)}var t},{parse:U}=JSON;let P=0;const T=(e=>({byteOffset:t})=>(r,n)=>{const s=new Uint16Array(n,t,r);let a="",o=0;for(;o<r;){const e=l(o+65535,r);a+=u.apply(null,s.subarray(o,e)),o=e}return e(a)})((e=>{P=0;const t=U(e);return t.length?O(t):void 0})),D=c();addEventListener("message",(e=>{(e=>{e.stopImmediatePropagation(),e.preventDefault()})(e),D.resolve([e.data,e.ports[0]])}),{once:!0});var j=async t=>{const[n,u]=await D.promise,l=r&&!!n,i=t?.transform,f=(t?.decoder||T)(s);let y,p;if(r){const e=new SharedArrayBuffer(t?.minByteLength||65535,{maxByteLength:t?.maxByteLength||16777216});y=new Int32Array(e),p=Atomics.wait}const[d,h]=((e,t=0)=>[r=>{const n=c();do{r=e(t++)}while(a.has(r));return a.set(r,n),[r,n]},(e,t,r)=>{const n=a.get(e);a.delete(e),r?n.reject(r):n.resolve(t)}])(String),w=new Map,g=e(null),m=new Proxy(g,{get(e,t){if("then"===t)return;let s=w.get(t);return s||w.set(t,s=(...e)=>{const s=[y,t,i?e.map(i):e];if(r){l?postMessage({ID:n,data:s}):u.postMessage(s),p(y,0),y[0]=0;const e=y[1]?f(y[1],y.buffer):void 0;if(e instanceof Error)throw e;return e}{const[e,t]=d();return s[0]=e,u.postMessage(s),t.promise}}),s},set:o});return u.onmessage=async({data:e})=>{"string"==typeof e[0]?h.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,g,i),u.postMessage(e))},{native:r,proxy:m}};export{j as default};