UNPKG

@webreflection/coincident

Version:

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

2 lines (1 loc) 3.32 kB
let e="coincident-";try{new SharedArrayBuffer(4,{maxByteLength:8}),e+=crypto.randomUUID()}catch(t){e+=Math.random().toString(36).substring(2)}var t=256===new DataView(new Uint16Array([256]).buffer).getUint16(0,!0),n=0,r=1,s=2,a=3,i=4,o=5,c=10,f=20,b=30,g=40,u=50,l=51,y=52,k=53,U=54,h=55,w=64,m=70,d=100,p=101,A=102,S=103,E=104,B=105,O=255;const{getPrototypeOf:I}=Object,L=e=>{const t=typeof e;switch(t){case"function":case"undefined":return"";case"object":return null===e?"null":"object";default:return t}},{isArray:j}=Array,{isView:x}=ArrayBuffer,{isInteger:D,isFinite:M}=Number,{entries:N}=Object,z=(e,n)=>{n<256?(R(e,_+2),e.setUint8(_++,l),e.setUint8(_++,n)):n<65536?(R(e,_+3),e.setUint8(_++,k),e.setUint16(_,n,t),_+=2):n<4294967296?(R(e,_+5),e.setUint8(_++,h),e.setUint32(_,n,t),_+=4):F(e,n)},F=(e,n)=>{R(e,_+9),e.setUint8(_++,w),e.setFloat64(_,n,t),_+=8},T=(e,t,r)=>{const s=t.get(r);return"number"==typeof s?(R(e,_+1),e.setUint8(_++,n),z(e,s),!0):(t.set(r,_),!1)},V=(e,t,n,r)=>{R(e,_+10+n*r),e.setUint8(_++,t),z(e,n)},J=e=>{R(e,_+1),e.setUint8(_++,O)},P=(e,t)=>{R(e,_+1),e.setUint8(_++,t)},R=(e,t)=>{v<t&&(v+=t+65535,e.buffer.grow(v))};let _=0,v=_;const C=(e,n,l,k=L(l))=>{switch(k){case"null":P(e,a);break;case"object":if(T(e,n,l))break;switch(!0){case j(l):{const t=l.length;V(e,c,t,1);for(let r=0;r<t;r++)C(e,n,l[r]);break}case x(l):{const{BYTES_PER_ELEMENT:t,buffer:r,byteOffset:s,length:a}=l;if(P(e,g),C(e,n,(e=>{for(;!(e.name in globalThis);)e=I(e);return e.name})(l.constructor),"string"),z(e,s),z(e,a!==(r.byteLength-s)/t?a:0),T(e,n,r))break;l=r}case l instanceof ArrayBuffer:{const t=l.byteLength,n=l.resizable?l.maxByteLength:0;if(V(e,b,t,1),z(e,n),t){R(e,_+=t);const n=new Uint8Array(l,0,t);new Uint8Array(e.buffer).set(n,_-t)}break}case l instanceof Date:P(e,d),z(e,+l);break;case l instanceof Map:V(e,p,l.size,1);for(const[t,r]of l){const s=L(t),a=L(r);s&&a?(C(e,n,t,s),C(e,n,r,a)):J(e)}break;case l instanceof Set:V(e,A,l.size,1);for(const t of l){const r=L(t);r?C(e,n,t,r):J(e)}break;case l instanceof RegExp:P(e,E),C(e,n,l.source,"string"),C(e,n,l.flags,"string");break;case l instanceof Error:P(e,B),C(e,n,l.name,"string"),C(e,n,l.message,"string"),C(e,n,l.stack,"string");break;default:{if("toJSON"in l){const t=l.toJSON();if(t===l){P(e,f),z(e,0);break}if(T(e,n,l=t))break}const t=N(l),r=t.length;V(e,f,r,1);for(let s=0;s<r;s++){const r=t[s],a=L(r[1]);a?(C(e,n,r[0],"string"),C(e,n,r[1],a)):J(e)}break}}break;case"boolean":P(e,l?s:r);break;case"number":D(l)?((e,n)=>{-128<=n&&n<128?(R(e,_+2),e.setUint8(_++,u),e.setInt8(_++,n)):-32768<=n&&n<32768?(R(e,_+3),e.setUint8(_++,y),e.setInt16(_,n,t),_+=2):-2147483648<=n&&n<2147483648?(R(e,_+5),e.setUint8(_++,U),e.setInt32(_,n,t),_+=4):F(e,n)})(e,l):M(l)?F(e,l):P(e,a);break;case"string":{if(T(e,n,l))break;const r=l.length;V(e,o,r,2);for(let n=0;n<r;n++)e.setUint16(_,l.charCodeAt(n),t),_+=2;break}case"bigint":R(e,_+9),e.setUint8(_++,m),e.setBigInt64(_,l,t),_+=8;break;case"symbol":{const t=(e=>{const t=String(e).slice(7,-1);return t.startsWith("Symbol.")||Symbol.keyFor(e)?t:""})(l);if(t){P(e,S),C(e,n,t,"string");break}}case"":P(e,i);break;default:throw new Error(`Unsupported type: ${k}`)}},W=(e,t,{byteOffset:n=0}={})=>{const r=_=n;return v=t.byteLength,C(new DataView(t),new Map,e),_-r},Y=e=>(t,n)=>W(t,n,e);export{W as encode,Y as encoder};