@webreflection/coincident
Version:
An Atomics based Proxy to simplify, and synchronize, Worker related tasks
2 lines (1 loc) • 3.85 kB
JavaScript
const{getPrototypeOf:e}=Object,t=e=>{const t=typeof e;switch(t){case"function":case"undefined":return"";case"object":return null===e?"null":"object";default:return t}};let r="coincident-";try{new SharedArrayBuffer(4,{maxByteLength:8}),r+=crypto.randomUUID()}catch(e){r+=Math.random().toString(36).substring(2)}var n={ref:0,array:1,object:2,number:3,string:4,true:5,false:6,null:7,buffer:8,view:9,symbol:10,date:11,bigint:12,undefined:13,map:14,set:15,regexp:16,error:17};const{defineProperty:s}=Object,a=e=>{switch(e[o++]){case n.array:{const t=e[o++],r=[];e[o-2]=r;for(let n=0;n<t;n++)r[n]=a(e);return r}case n.object:{const t=e[o++],r={};e[o-2]=r;for(let n=0;n<t;n++)r[a(e)]=a(e);return r}case n.string:{const t=e[o++];return e[o-2]=t,t}case n.ref:return e[e[o++]];case n.number:return e[o++];case n.bigint:return BigInt(e[o++]);case n.true:return!0;case n.false:return!1;case n.null:return null;case n.undefined:return;case n.buffer:{const t=e[o++],r=e[o++],n=[t];r&&n.push({maxByteLength:r});const s=new ArrayBuffer(...n);e[o-3]=s;const a=new Uint8Array(s,0,t);for(let r=0;r<t;r++)a[r]=e[o++];return s}case n.view:{const t=e[o++],r=e[o++],n=e[o++],s=[a(e),r];n&&s.push(n);const c=new globalThis[t](...s);return e[o-4]=c,c}case n.symbol:return(t=e[o++]).startsWith("Symbol.")?Symbol[t.slice(t.indexOf(".")+1)]:Symbol.for(t);case n.date:{const t=new Date(e[o++]);return e[o-2]=t,t}case n.map:{const t=e[o++],r=new Map;e[o-2]=r;for(let n=0;n<t;n++){const t=a(e),n=a(e);void 0!==t&&r.set(t,n)}return r}case n.set:{const t=e[o++],r=new Set;e[o-2]=r;for(let n=0;n<t;n++){const t=a(e);void 0!==t&&r.add(t)}return r}case n.regexp:{const t=e[o++],r=e[o++],n=new RegExp(t,r);return e[o-3]=n,n}case n.error:{const t=globalThis[e[o++]]||Error,r=e[o++],n=e[o++],a=new t(r,{cause:e[o++]});return e[o-5]=s(a,"stack",{value:n}),a}default:throw new Error(`Unknown type: ${e[o-1]}`)}var t},{parse:c}=JSON;let o=0;const u=e=>{o=0;const t=c(e);return t.length?a(t):void 0},{isArray:f}=Array,{isView:i}=ArrayBuffer,{stringify:l}=JSON,b=(e,t,r)=>{const s=t.get(r);return"number"==typeof s?(e.push(n.ref,s),!0):(t.set(r,e.length),!1)},h=(r,s,a,c=t(a))=>{switch(c){case"null":r.push(n.null);break;case"object":if(b(r,s,a))break;switch(!0){case f(a):{const e=a.length;r.push(n.array,e);for(let t=0;t<e;t++)h(r,s,a[t]);break}case i(a):{const{BYTES_PER_ELEMENT:t,buffer:c,byteOffset:o,length:u}=a;if(r.push(n.view,(t=>{for(;!(t.name in globalThis);)t=e(t);return t.name})(a.constructor),o,u!==(c.byteLength-o)/t?u:0),b(r,s,c))break;a=c}case a instanceof ArrayBuffer:{const e=a.byteLength,t=a.resizable?a.maxByteLength:0;if(r.push(n.buffer,e,t),e){const t=new Uint8Array(a,0,e);for(let e=0;e<t.length;e+=65535)r.push.apply(r,t.subarray(e,e+65535))}break}case a instanceof Date:r.push(n.date,+a);break;case a instanceof Map:{const e=r.push(n.map,0);let c=0;for(const[e,n]of a){const a=t(e),o=t(n);a&&o&&(h(r,s,e,a),h(r,s,n,o),c++)}r[e-1]=c;break}case a instanceof Set:{const e=r.push(n.set,0);let c=0;for(const e of a){const n=t(e);n&&(h(r,s,e,n),c++)}r[e-1]=c;break}case a instanceof RegExp:r.push(n.regexp,a.source,a.flags);break;case a instanceof Error:r.push(n.error,a.name,a.message,a.stack,a.cause);break;default:{if("toJSON"in a){const e=a.toJSON();if(e===a){r.push(n.object,0);break}if(b(r,s,a=e))break}const e=r.push(n.object,0);let c=0;for(const e in a){const n=a[e],o=t(n);o&&(h(r,s,e,"string"),h(r,s,n,o),c++)}r[e-1]=c;break}}break;case"boolean":r.push(a?n.true:n.false);break;case"string":if(b(r,s,a))break;r.push(n.string,a);break;case"bigint":r.push(n[c],a.toString());break;case"symbol":{const e=(e=>{const t=String(e).slice(7,-1);return t.startsWith("Symbol.")||Symbol.keyFor(e)?t:""})(a);if(e){r.push(n[c],e);break}}case"":r.push(n.undefined);break;default:r.push(n[c],a)}},p=e=>{const t=[];return h(t,new Map,e),l(t)};export{u as decode,p as encode};