diff --git a/dist/index.cjs b/dist/index.cjs index 2a4497f..fa2bc69 100644 --- a/dist/index.cjs +++ b/dist/index.cjs @@ -1,2 +1,2 @@ -class TinybufError extends Error{}function $hashCode(t){let r=5381;for(let e=0;ethis.on(t,(()=>{})))),this}clear(){this.t.clear(),this.o.clear()}}const t=Math.floor,r=Math.ceil,$clamp=(t,r,e)=>t>e?e:te<0?r(e):t(e),$roundAwayFromZero=e=>e<0?t(e):r(e);function $touscal8(t){return $clamp(127+$roundTowardZero(254*t-127),0,254)}function $toscal8(t){return $clamp($roundTowardZero(127*t),-127,127)+127}function $fromuscal8(t){return $clamp(.01*($roundAwayFromZero(.3937007874015748*(t-127))+50),0,1)}function $fromscal8(t){return $clamp(.01*$roundAwayFromZero(.787401574803149*(t-127)),-1,1)}const e={UInt:"uint",UInt8:"u8",UInt16:"u16",UInt32:"u32",Int:"int",Int8:"i8",Int16:"i16",Int32:"i32",Float64:"f64",Float32:"f32",Float16:"f16",BFloat16:"b16",Scalar8:"sc",UScalar8:"usc",Bool:"bl",Bools:"bls",Buffer:"buf",String:"str",JSON:"jsn",RegExp:"re",Date:"dt"},i=Object.values(e);class MaybeType{constructor(t){this.type=t}}const mask=(t,r=1)=>t.reduce(((t,r)=>t<<1|r),r),unmask=(t,r)=>{const e=void 0===r?31-Math.clz32(t):Array.isArray(r)?r.length:r,i=Array.isArray(r)&&r.length===e?r:new Array(e);for(let r=0;rt.encode(r)}(),s=function(){const t=new TextDecoder("utf-8");return r=>t.decode(r)}();const o=function(){const t=new Float32Array(1),r=new Int32Array(t.buffer);return function(e){t[0]=e;let i=r[0],n=i>>16&32768,s=4096+(2147483647&i)|0;return s>=1199570944?(2147483647&i)<1199570944?31743|n:s<2139095040?31744|n:31744|n|(8388607&i)>>13:s>=947912704?n|s-939524096>>13:s<855638016?n:(s=(2147483647&i)>>23,n|(8388607&i|8388608)+(8388608>>>s-102)>>126-s)}}(),h=function(){const t=Math.pow(2,-24),r=new Float32Array(1056);for(let t=0;t<32;t++)r[t]=Math.pow(2,t-15);for(let t=0;t<1024;t++)r[t+32]=1+t/1024;return function(e){const i=32768&~e?1:-1,n=31744&e,s=1023&e;return 0===n?0===s?0*i:i*t:31744===n?0===s?i*(1/0):NaN:r[n>>10]*r[s+32]*i}}(),a=new Uint32Array(1),f=new Float32Array(a.buffer);const u=536870912,c=268435456,d=4294967296,l={h:(r,e)=>{"number"!=typeof r&&(r=Number(r)),r<0&&(r=0),r<128?e.u(r):r<16384?e.l(r+32768):r=u?(e.$(t(r/d)+3758096384|0),e.l(r>>>16),e.l(65535&r)):e.u(!0===r?1:0)},p:t=>{const r=t.m();return 128&r?64&r?32&r?(t.v()-3758096384)*d+t.v():t.v()-3221225472:t.B()-32768:(t.F(),r)}},$={h:(t,r)=>r.u(t),p:t=>t.A()},w={h:(t,r)=>r.l(t),p:t=>t.B()},y={h:(t,r)=>r.$(t),p:t=>t.v()},p={h:(r,e)=>{"number"!=typeof r&&(r=Number(r)),r>=-64&&r<64?e.u(127&r):r>=-8192&&r<8192?e.l(32768+(16383&r)):r>=-268435456&&r=c?(e.$(536870911&t(r/d)|3758096384),e.l(r>>>16),e.l(65535&r)):e.u(!0===r?127:0)},p:t=>{let r,e=t.m();return 128&e?64&e?32&e?(r=t.v()-3758096384,r=268435456&r?3758096384|r:r,r*d+t.v()):(r=t.v()-3221225472,268435456&r?3758096384|r:r):(r=t.B()-32768,8192&r?4294950912|r:r):(t.F(),64&e?4294967168|e:e)}},b={h:(t,r)=>r.T(t),p:t=>t.U()},m={h:(t,r)=>r.I(t),p:t=>t.M()},v={h:(t,r)=>r.S(t),p:t=>t._()},B={h:(t,r)=>r.l(function $tobf16(t){return f[0]=t,a[0]>>>16}(t)),p:t=>function $frombf16(t){return a[0]=t<<16,f[0]}(t.B())},F={h:(t,r)=>r.l(o(t)),p:t=>h(t.B())},A={h:(t,r)=>r.j(t),p:t=>t.H()},T={h:(t,r)=>r.k(t),p:t=>t.O()},x={h:(t,r)=>r.u($touscal8(t)),p:t=>$fromuscal8(t.A())},E={h:(t,r)=>r.u($toscal8(t)),p:t=>$fromscal8(t.A())},g={h:(t,r)=>p.h(t.getTime(),r),p:t=>new Date(p.p(t))},U={h:(t,r)=>{l.h(t.byteLength,r),r.C(t)},p:t=>t.D(l.p(t))},I={h:(t,r)=>U.h(n(t),r),p:t=>s(U.p(t))},M={h:(t,r)=>r.u(t?1:0),p:t=>0!==t.A()},S={h:(t,r)=>{t.length>28&&(t=t.slice(0,28)),l.h(mask(t),r)},p:(t,r)=>unmask(l.p(t),r)},_={h:(t,r)=>I.h(JSON.stringify(t),r),p:t=>JSON.parse(I.p(t))},j={h:(t,r)=>{r.u(mask([t.global,t.ignoreCase,t.multiline])),I.h(t.source,r)},p:t=>{const[r,e,i]=unmask(t.A());return new RegExp(I.p(t),(r?"g":"")+(e?"i":"")+(i?"m":""))}},H={[e.UInt]:l.h,[e.UInt8]:$.h,[e.UInt16]:w.h,[e.UInt32]:y.h,[e.Int]:p.h,[e.Int8]:b.h,[e.Int16]:m.h,[e.Int32]:v.h,[e.Float64]:T.h,[e.Float32]:A.h,[e.Float16]:F.h,[e.BFloat16]:B.h,[e.Scalar8]:E.h,[e.UScalar8]:x.h,[e.Bool]:M.h,[e.Bools]:S.h,[e.Buffer]:U.h,[e.String]:I.h,[e.JSON]:_.h,[e.RegExp]:j.h,[e.Date]:g.h},k={[e.UInt]:l.p,[e.UInt8]:$.p,[e.UInt16]:w.p,[e.UInt32]:y.p,[e.Int]:p.p,[e.Int8]:b.p,[e.Int16]:m.p,[e.Int32]:v.p,[e.Float64]:T.p,[e.Float32]:A.p,[e.Float16]:F.p,[e.BFloat16]:B.p,[e.Scalar8]:E.p,[e.UScalar8]:x.p,[e.Bool]:M.p,[e.Bools]:S.p,[e.Buffer]:U.p,[e.String]:I.p,[e.JSON]:_.p,[e.RegExp]:j.p,[e.Date]:g.p};let O={safe:!1,useGlobalEncodingBuffer:!0,encodingBufferMaxSize:1500,encodingBufferInitialSize:256,encodingBufferIncrement:256};class BufferWriter{constructor(t){this.R=0,this.V=0,this.N="number"==typeof t;let r=t instanceof Uint8Array?t:new Uint8Array(t);this.W=r,this.J=r.byteOffset,this.P=new DataView(r.buffer)}q(t){return this.P.buffer!==t.buffer&&(this.P=new DataView(t.buffer)),this.W=t,this.J=t.byteOffset,this.N=!1,this.V=0,this.R=0,this}G(){return this.W.subarray(0,this.R)}L(){const t=new Uint8Array(this.R);return t.set(this.G()),t}T(t){this.K(1).setInt8(this.V,t)}I(t){this.K(2).setInt16(this.V,t,!0)}S(t){this.K(4).setInt32(this.V,t,!0)}u(t){this.K(1).setUint8(this.V,t)}l(t){this.K(2).setUint16(this.V,t,!1)}$(t){this.K(4).setUint32(this.V,t,!1)}j(t){this.K(4).setFloat32(this.V,t,!0)}k(t){this.K(8).setFloat64(this.V,t,!0)}C(t){this.K(t.byteLength),this.W.set(t instanceof Uint8Array?t:ArrayBuffer.isView(t)?new Uint8Array(t.buffer,t.byteOffset,t.byteLength):new Uint8Array(t),this.V-this.J)}K(t){return this.R+t>this.W.byteLength&&this.X(t),this.V=this.J+this.R,this.R+=t,this.P}X(t){if(!this.N)throw new TinybufError("exceeded buffer length: "+this.W.byteLength);const r=this.W.byteLength,e=this.R+t-r,i=O.encodingBufferMaxSize-r;if(e>i)throw new TinybufError("exceeded encodingBufferMaxSize: "+O.encodingBufferMaxSize);const n=O.encodingBufferIncrement,s=Math.ceil(e/n)*n,o=r+Math.min(s,i),h=new Uint8Array(o);h.set(this.W),this.P=new DataView(h.buffer),this.W=h,this.J=0}}class BufferReader{constructor(t,r){this.q(t,r)}q(t,r){const e=ArrayBuffer.isView(t),i=e?t.buffer:t,n=e?t.byteOffset:0;let s=this.P;return(void 0===s||s.buffer!==i||ns.byteOffset+s.byteLength)&&(s=this.P=t instanceof DataView?t:new DataView(i)),this.J=n-s.byteOffset,this.Y=t.byteLength,this.i=null!=r?r:0,this}m(){if(this.i>=this.Y)throw new RangeError("exceeded bytes");return this.P.getUint8(this.J+this.i)}F(){this.i++}A(){return this.P.getUint8(this.Z(1))}B(){return this.P.getUint16(this.Z(2))}v(){return this.P.getUint32(this.Z(4))}U(){return this.P.getInt8(this.Z(1))}M(){return this.P.getInt16(this.Z(2),!0)}_(){return this.P.getInt32(this.Z(4),!0)}H(){return this.P.getFloat32(this.Z(4),!0)}O(){return this.P.getFloat64(this.Z(8),!0)}D(t){return new Uint8Array(this.P.buffer,this.P.byteOffset+this.Z(t),t)}Z(t){const r=this.i;if(r+t>this.Y)throw new RangeError("exceeded bytes");return this.i=r+t,this.J+r}}class BufferFormat{constructor(t,r){if(this.tt=!1,"string"==typeof t&&i.includes(t))this.rt=t;else{if(t instanceof MaybeType)throw new TypeError("Format cannot be optional");if(!(t instanceof Object))throw new TypeError("Format must be object or Type");if(this.rt=void 0,this.et=new Map,this.it=Object.keys(t).map((r=>{const e=new Field(r,t[r]);return this.et.set(r,e),e})),void 0===r)this.header=$hashCode(this.f),this.nt=this.header;else if(null===r)this.header=void 0,this.nt=void 0;else{if(!function isValidHeader(t){return"number"==typeof t?Number.isInteger(t)&&t>=0&&t<=65535:"string"==typeof t&&2===(new TextEncoder).encode(t).byteLength}(r))throw new TypeError("Header must be 2-byte string, uint16, or null.");this.header=r,this.nt="number"==typeof r?r:$strToHashCode(r)}}}get f(){return void 0===this.st&&(this.st=void 0!==this.it?`{${this.it.map((t=>t.f)).join(",")}}`:`${this.rt}`),this.st}static ot(){return O.useGlobalEncodingBuffer?(BufferFormat.ht||(this.ht=new BufferWriter(O.encodingBufferMaxSize)),this.ht):new BufferWriter(O.encodingBufferInitialSize)}encodeInto(t,r){return r.subarray(0,this.encodeIntoLength(t,r))}encodeIntoLength(t,r){var e,i;this.tt&&(t=this.ft(t));const n=null!==(i=null===(e=this.ut)||void 0===e?void 0:e.q(r))&&void 0!==i?i:new BufferWriter(r);this.ut=void 0;try{return this.ct(t,n),n.R}finally{this.ut=n}}encode(t,r){return this.dt||(this.dt=BufferFormat.ot()),this.dt.R=0,this.tt&&(t=this.ft(t)),this.ct(t,this.dt),(null!=r?r:O.safe)?this.dt.L():this.dt.G()}decodeInto(t,r){return this.lt(t,r)}decode(t,r){return this.lt(t,r)}setTransforms(t){if(this.tt=!0,"function"==typeof t||Array.isArray(t)&&"function"==typeof t[0])this.$t=t;else for(const r of Object.keys(t)){const e=this.et.get(r);if(!e)throw new TypeError(`Failed to set transforms for field '${r}'`);e.wt.setTransforms(t[r])}return this}setValidation(t){if(this.tt=!0,"function"==typeof t)this.yt=t;else for(const r of Object.keys(t)){const e=this.et.get(r);if(!e)throw new TypeError(`Failed to set validation function for field '${r}'`);e.wt.setValidation(t[r])}return this}lt(t,r){var e,i;const n=void 0===this.header?0:2,s=null!==(i=null===(e=this.bt)||void 0===e?void 0:e.q(t,n))&&void 0!==i?i:new BufferReader(t,n);this.bt=void 0;try{return this.vt(s,r)}finally{this.bt=s}}ct(t,r){if(void 0!==this.nt&&r.l(this.nt),void 0!==this.rt){const e=this.yt||this.$t?this.ft(t):t;return H[this.rt](e,r)}if("object"!=typeof t||!t)throw new TypeError("expected object type");const e=this.it;for(let i=0;i`v.${t}=this.${this.It.name}(${r},s,v.${t})`)).join(";");return`let v=o??{};${t};return v;`}It(t,r,e){const i=this.it[t];if(!i.Ft||M.p(r))return i.At?this.Mt(i.wt,r,e):i.wt.vt(r,e)}gt(){return void 0!==this.rt?this.tt?t=>this.Et(k[this.rt](t)):k[this.rt]:new Function("s","o",this.Ut())}Tt(t,r,e){if(!Array.isArray(t))throw new TypeError(`expected array, instead got: ${t}`);l.h(t.length,r);for(let i=0;inew BufferParser,exports.defineFormat=function defineFormat(t,r){return null!==t&&"object"==typeof t?new BufferFormat(t):new BufferFormat(r,t)},exports.f16round=function f16round(t){return h(o(t))},exports.mask=mask,exports.optional=function optional(t){return new MaybeType(t)},exports.peekHeader=peekHeader,exports.peekHeaderStr=peekHeaderStr,exports.scalround=function scalround(t){return $fromscal8($toscal8(t))},exports.setTinybufConfig=t=>{O=Object.assign(Object.assign({},O),t)},exports.unmask=unmask,exports.uscalround=function uscalround(t){return $fromuscal8($touscal8(t))}; +class TinybufError extends Error{}function $hashCode(t){let r=5381;for(let e=0;ethis.on(t,(()=>{})))),this}clear(){this.t.clear(),this.o.clear()}}const t=Math.floor,r=Math.ceil,$clamp=(t,r,e)=>t>e?e:te<0?r(e):t(e),$roundAwayFromZero=e=>e<0?t(e):r(e);function $touscal8(t){return $clamp(127+$roundTowardZero(254*t-127),0,254)}function $toscal8(t){return $clamp($roundTowardZero(127*t),-127,127)+127}function $fromuscal8(t){return $clamp(.01*($roundAwayFromZero(.3937007874015748*(t-127))+50),0,1)}function $fromscal8(t){return $clamp(.01*$roundAwayFromZero(.787401574803149*(t-127)),-1,1)}const e={UInt:"uint",UInt8:"u8",UInt16:"u16",UInt32:"u32",Int:"int",Int8:"i8",Int16:"i16",Int32:"i32",Float64:"f64",Float32:"f32",Float16:"f16",BFloat16:"b16",Scalar8:"sc",UScalar8:"usc",Bool:"bl",Bools:"bls",Buffer:"buf",String:"str",JSON:"jsn",RegExp:"re",Date:"dt"},i=Object.values(e);class MaybeType{constructor(t){this.type=t}}const mask=(t,r=1)=>t.reduce(((t,r)=>t<<1|r),r),unmask=(t,r)=>{const e=void 0===r?31-Math.clz32(t):Array.isArray(r)?r.length:r,i=Array.isArray(r)&&r.length===e?r:new Array(e);for(let r=0;rt.encode(r)}(),s=function(){const t=new TextDecoder("utf-8");return r=>t.decode(r)}();const o=function(){const t=new Float32Array(1),r=new Int32Array(t.buffer);return function(e){t[0]=e;let i=r[0],n=i>>16&32768,s=4096+(2147483647&i)|0;return s>=1199570944?(2147483647&i)<1199570944?31743|n:s<2139095040?31744|n:31744|n|(8388607&i)>>13:s>=947912704?n|s-939524096>>13:s<855638016?n:(s=(2147483647&i)>>23,n|(8388607&i|8388608)+(8388608>>>s-102)>>126-s)}}(),h=function(){const t=Math.pow(2,-24),r=new Float32Array(1056);for(let t=0;t<32;t++)r[t]=Math.pow(2,t-15);for(let t=0;t<1024;t++)r[t+32]=1+t/1024;return function(e){const i=32768&~e?1:-1,n=31744&e,s=1023&e;return 0===n?0===s?0*i:i*t:31744===n?0===s?i*(1/0):NaN:r[n>>10]*r[s+32]*i}}(),a=new Uint32Array(1),f=new Float32Array(a.buffer);const u=536870912,c=268435456,d=4294967296,l={h:(r,e)=>{"number"!=typeof r&&(r=Number(r)),r<0&&(r=0),r<128?e.u(r):r<16384?e.l(r+32768):r=u?(e.$(t(r/d)+3758096384|0),e.l(r>>>16),e.l(65535&r)):e.u(!0===r?1:0)},p:t=>{const r=t.m();return 128&r?64&r?32&r?(t.v()-3758096384)*d+t.v():t.v()-3221225472:t.B()-32768:(t.F(),r)}},$={h:(t,r)=>r.u(t),p:t=>t.A()},w={h:(t,r)=>r.l(t),p:t=>t.B()},y={h:(t,r)=>r.$(t),p:t=>t.v()},p={h:(r,e)=>{"number"!=typeof r&&(r=Number(r)),r>=-64&&r<64?e.u(127&r):r>=-8192&&r<8192?e.l(32768+(16383&r)):r>=-268435456&&r=c?(e.$(536870911&t(r/d)|3758096384),e.l(r>>>16),e.l(65535&r)):e.u(!0===r?127:0)},p:t=>{let r,e=t.m();return 128&e?64&e?32&e?(r=t.v()-3758096384,r=268435456&r?3758096384|r:r,r*d+t.v()):(r=t.v()-3221225472,268435456&r?3758096384|r:r):(r=t.B()-32768,8192&r?4294950912|r:r):(t.F(),64&e?4294967168|e:e)}},b={h:(t,r)=>r.T(t),p:t=>t.U()},m={h:(t,r)=>r.I(t),p:t=>t.M()},v={h:(t,r)=>r.S(t),p:t=>t._()},B={h:(t,r)=>r.l(function $tobf16(t){return f[0]=t,a[0]>>>16}(t)),p:t=>function $frombf16(t){return a[0]=t<<16,f[0]}(t.B())},F={h:(t,r)=>r.l(o(t)),p:t=>h(t.B())},A={h:(t,r)=>r.j(t),p:t=>t.k()},T={h:(t,r)=>r.H(t),p:t=>t.O()},x={h:(t,r)=>r.u($touscal8(t)),p:t=>$fromuscal8(t.A())},E={h:(t,r)=>r.u($toscal8(t)),p:t=>$fromscal8(t.A())},g={h:(t,r)=>p.h(t.getTime(),r),p:t=>new Date(p.p(t))},U={h:(t,r)=>{l.h(t.byteLength,r),r.C(t)},p:t=>t.D(l.p(t))},I={h:(t,r)=>U.h(n(t),r),p:t=>s(U.p(t))},M={h:(t,r)=>r.u(t?1:0),p:t=>0!==t.A()},S={h:(t,r)=>{t.length>28&&(t=t.slice(0,28)),l.h(mask(t),r)},p:(t,r)=>unmask(l.p(t),r)},_={h:(t,r)=>I.h(JSON.stringify(t),r),p:t=>JSON.parse(I.p(t))},j={h:(t,r)=>{r.u(mask([t.global,t.ignoreCase,t.multiline])),I.h(t.source,r)},p:t=>{const[r,e,i]=unmask(t.A());return new RegExp(I.p(t),(r?"g":"")+(e?"i":"")+(i?"m":""))}},k={[e.UInt]:l.h,[e.UInt8]:$.h,[e.UInt16]:w.h,[e.UInt32]:y.h,[e.Int]:p.h,[e.Int8]:b.h,[e.Int16]:m.h,[e.Int32]:v.h,[e.Float64]:T.h,[e.Float32]:A.h,[e.Float16]:F.h,[e.BFloat16]:B.h,[e.Scalar8]:E.h,[e.UScalar8]:x.h,[e.Bool]:M.h,[e.Bools]:S.h,[e.Buffer]:U.h,[e.String]:I.h,[e.JSON]:_.h,[e.RegExp]:j.h,[e.Date]:g.h},H={[e.UInt]:l.p,[e.UInt8]:$.p,[e.UInt16]:w.p,[e.UInt32]:y.p,[e.Int]:p.p,[e.Int8]:b.p,[e.Int16]:m.p,[e.Int32]:v.p,[e.Float64]:T.p,[e.Float32]:A.p,[e.Float16]:F.p,[e.BFloat16]:B.p,[e.Scalar8]:E.p,[e.UScalar8]:x.p,[e.Bool]:M.p,[e.Bools]:S.p,[e.Buffer]:U.p,[e.String]:I.p,[e.JSON]:_.p,[e.RegExp]:j.p,[e.Date]:g.p};let O={safe:!1,useGlobalEncodingBuffer:!0,encodingBufferMaxSize:1500,encodingBufferInitialSize:256,encodingBufferIncrement:256};class BufferWriter{constructor(t){this.R=0,this.V=0,this.N="number"==typeof t;let r=t instanceof Uint8Array?t:new Uint8Array(t);this.W=r,this.J=r.byteOffset,this.P=new DataView(r.buffer)}q(t){return this.P.buffer!==t.buffer&&(this.P=new DataView(t.buffer)),this.W=t,this.J=t.byteOffset,this.N=!1,this.V=0,this.R=0,this}G(){return this.W.subarray(0,this.R)}L(){const t=new Uint8Array(this.R);return t.set(this.G()),t}T(t){this.K(1).setInt8(this.V,t)}I(t){this.K(2).setInt16(this.V,t,!0)}S(t){this.K(4).setInt32(this.V,t,!0)}u(t){this.K(1).setUint8(this.V,t)}l(t){this.K(2).setUint16(this.V,t,!1)}$(t){this.K(4).setUint32(this.V,t,!1)}j(t){this.K(4).setFloat32(this.V,t,!0)}H(t){this.K(8).setFloat64(this.V,t,!0)}C(t){this.K(t.byteLength),this.W.set(t instanceof Uint8Array?t:ArrayBuffer.isView(t)?new Uint8Array(t.buffer,t.byteOffset,t.byteLength):new Uint8Array(t),this.V-this.J)}K(t){return this.R+t>this.W.byteLength&&this.X(t),this.V=this.J+this.R,this.R+=t,this.P}X(t){if(!this.N)throw new TinybufError("exceeded buffer length: "+this.W.byteLength);const r=this.W.byteLength,e=this.R+t-r,i=O.encodingBufferMaxSize-r;if(e>i)throw new TinybufError("exceeded encodingBufferMaxSize: "+O.encodingBufferMaxSize);const n=O.encodingBufferIncrement,s=Math.ceil(e/n)*n,o=r+Math.min(s,i),h=new Uint8Array(o);h.set(this.W),this.P=new DataView(h.buffer),this.W=h,this.J=0}}class BufferReader{constructor(t,r){this.q(t,r)}q(t,r){const e=ArrayBuffer.isView(t),i=e?t.buffer:t,n=e?t.byteOffset:0;let s=this.P;return(void 0===s||s.buffer!==i||ns.byteOffset+s.byteLength)&&(s=this.P=t instanceof DataView?t:new DataView(i)),this.J=n-s.byteOffset,this.Y=t.byteLength,this.i=null!=r?r:0,this}m(){if(this.i>=this.Y)throw new RangeError("exceeded bytes");return this.P.getUint8(this.J+this.i)}F(){this.i++}A(){return this.P.getUint8(this.Z(1))}B(){return this.P.getUint16(this.Z(2))}v(){return this.P.getUint32(this.Z(4))}U(){return this.P.getInt8(this.Z(1))}M(){return this.P.getInt16(this.Z(2),!0)}_(){return this.P.getInt32(this.Z(4),!0)}k(){return this.P.getFloat32(this.Z(4),!0)}O(){return this.P.getFloat64(this.Z(8),!0)}D(t){return new Uint8Array(this.P.buffer,this.P.byteOffset+this.Z(t),t)}Z(t){const r=this.i;if(r+t>this.Y)throw new RangeError("exceeded bytes");return this.i=r+t,this.J+r}}const C=new WeakMap;class BufferFormat{constructor(t,r){if(this.tt=!1,"string"==typeof t&&i.includes(t))this.rt=t;else{if(t instanceof MaybeType)throw new TypeError("Format cannot be optional");if(!(t instanceof Object))throw new TypeError("Format must be object or Type");if(this.rt=void 0,this.et=new Map,this.it=Object.keys(t).map((r=>{const e=new Field(r,t[r]);return this.et.set(r,e),e})),void 0===r)this.header=$hashCode(this.f),this.nt=this.header;else if(null===r)this.header=void 0,this.nt=void 0;else{if(!function isValidHeader(t){return"number"==typeof t?Number.isInteger(t)&&t>=0&&t<=65535:"string"==typeof t&&2===(new TextEncoder).encode(t).byteLength}(r))throw new TypeError("Header must be 2-byte string, uint16, or null.");this.header=r,this.nt="number"==typeof r?r:$strToHashCode(r)}}}get f(){return void 0===this.st&&(this.st=void 0!==this.it?`{${this.it.map((t=>t.f)).join(",")}}`:`${this.rt}`),this.st}static ot(){return O.useGlobalEncodingBuffer?(BufferFormat.ht||(this.ht=new BufferWriter(O.encodingBufferMaxSize)),this.ht):new BufferWriter(O.encodingBufferInitialSize)}encodeInto(t,r){return r.subarray(0,this.encodeIntoLength(t,r))}encodeIntoLength(t,r){var e,i;this.tt&&(t=this.ft(t));const n=null!==(i=null===(e=this.ut)||void 0===e?void 0:e.q(r))&&void 0!==i?i:new BufferWriter(r);this.ut=void 0;try{return this.ct(t,n),n.R}finally{this.ut=n}}encode(t,r){return this.dt||(this.dt=BufferFormat.ot()),this.dt.R=0,this.tt&&(t=this.ft(t)),this.ct(t,this.dt),(null!=r?r:O.safe)?this.dt.L():this.dt.G()}decodeInto(t,r){return this.lt(t,r)}decode(t,r){return this.lt(t,r)}setTransforms(t){if(this.tt=!0,"function"==typeof t||Array.isArray(t)&&"function"==typeof t[0])this.$t=t;else for(const r of Object.keys(t)){const e=this.et.get(r);if(!e)throw new TypeError(`Failed to set transforms for field '${r}'`);e.wt.setTransforms(t[r])}return this}setValidation(t){if(this.tt=!0,"function"==typeof t)this.yt=t;else for(const r of Object.keys(t)){const e=this.et.get(r);if(!e)throw new TypeError(`Failed to set validation function for field '${r}'`);e.wt.setValidation(t[r])}return this}lt(t,r){var e,i;const n=void 0===this.header?0:2,s=null!==(i=null===(e=this.bt)||void 0===e?void 0:e.q(t,n))&&void 0!==i?i:new BufferReader(t,n);this.bt=void 0;try{return this.vt(s,r)}finally{this.bt=s}}ct(t,r){if(void 0!==this.nt&&r.l(this.nt),void 0!==this.rt){const e=this.yt||this.$t?this.ft(t):t;return k[this.rt](e,r)}if("object"!=typeof t||!t)throw new TypeError("expected object type");const e=this.it;for(let i=0;i`v.${t}=this.${this.It.name}(${r},s,v.${t})`)).join(";");return`let v=o??{};${t};return v;`}It(t,r,e){const i=this.it[t];if(!i.Ft||M.p(r))return i.At?this.Mt(i.wt,r,e):i.wt.vt(r,e)}gt(){return void 0!==this.rt?this.tt?t=>this.Et(H[this.rt](t)):H[this.rt]:new Function("s","o",this.Ut())}Tt(t,r,e){if(!Array.isArray(t))throw new TypeError(`expected array, instead got: ${t}`);l.h(t.length,r);for(let i=0;inew BufferParser,exports.defineFormat=function defineFormat(t,r){return null!==t&&"object"==typeof t?new BufferFormat(t):new BufferFormat(r,t)},exports.f16round=function f16round(t){return h(o(t))},exports.mask=mask,exports.optional=function optional(t){return new MaybeType(t)},exports.peekHeader=peekHeader,exports.peekHeaderStr=peekHeaderStr,exports.scalround=function scalround(t){return $fromscal8($toscal8(t))},exports.setTinybufConfig=t=>{O=Object.assign(Object.assign({},O),t)},exports.unmask=unmask,exports.uscalround=function uscalround(t){return $fromuscal8($touscal8(t))}; //# sourceMappingURL=index.cjs.map diff --git a/dist/index.cjs.map b/dist/index.cjs.map index 9cc6256..28b3b49 100644 --- a/dist/index.cjs.map +++ b/dist/index.cjs.map @@ -1 +1 @@ -{"version":3,"file":"index.cjs","sources":["../src/core/lib/errors.ts","../src/core/lib/hashCode.ts","../src/core/lib/peek.ts","../src/core/BufferParser.ts","../src/core/lib/math.ts","../src/core/lib/scalar.ts","../src/core/Type.ts","../src/core/lib/bitmask.ts","../src/core/lib/utf8.ts","../src/core/lib/float16.ts","../src/core/lib/bfloat16.ts","../src/core/lib/coders.ts","../src/core/config.ts","../src/core/lib/BufferWriter.ts","../src/core/lib/BufferReader.ts","../src/core/BufferFormat.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/unified-signatures */\n\nexport class TinybufError extends Error {}\n","/**\n * DJB2 hash algorithm (modified for 16-bit uints).\n *\n * DJB2 is a simple and widely used non-cryptographic\n * hash function created by Daniel J. Bernstein.\n *\n * @returns 16-bit unsigned integer\n */\nexport function $hashCode(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = (hash * 33) ^ str.charCodeAt(i);\n }\n return hash & 0xFFFF; // Ensure the result is a Uint16\n}\n\n/**\n * Returns an unsigned 16-bit integer hashcode for some string.\n * Prefers 2 character string.\n *\n * @returns A UInt16 between 0 and 65535 (inclusive).\n */\nexport function $strToHashCode(str: string): number {\n if (str.length !== 2) return $hashCode(str);\n return str.charCodeAt(0) * 256 + str.charCodeAt(1);\n}\n\n/**\n * Convert a UInt16 hashcode to a 2-byte string.\n */\nexport function $hashCodeToStr(hashCode: number): string {\n return String.fromCharCode(Math.floor(hashCode / 256)) + String.fromCharCode(hashCode % 256);\n}\n","import { $hashCodeToStr } from \"./hashCode\";\n\n\n/**\n * Read the header bytes of a buffer as a number.\n *\n * @throws {RangeError} if buffer size < 2\n */\nexport function peekHeader(b: ArrayBuffer | ArrayBufferView): number {\n if (b.byteLength < 2) {\n throw new RangeError(\"buffer length < 2\");\n }\n\n if (b instanceof Uint8Array) return (b[0] << 8) | b[1];\n if (b instanceof DataView) return b.getUint16(0, false);\n\n const u8 = ArrayBuffer.isView(b) ? new Uint8Array(b.buffer, b.byteOffset, 2) : new Uint8Array(b, 0, 2);\n\n return (u8[0] << 8) | u8[1];\n}\n\n/**\n * Read the header bytes of a buffer as a string.\n *\n * @throws {RangeError} if buffer length < 2\n */\nexport function peekHeaderStr(b: ArrayBuffer | ArrayBufferView): string {\n return $hashCodeToStr(peekHeader(b));\n}\n","import { BufferFormat } from \"./BufferFormat\";\nimport { EncoderDefinition, DecodedType } from \"./Type\";\nimport { TinybufError } from \"./lib/errors\";\nimport { $hashCodeToStr, $strToHashCode } from \"./lib/hashCode\";\nimport { peekHeader } from \"./lib/peek\";\n\ntype AnyFormat = BufferFormat;\ntype Uint16FormatHeader = number;\n\n/**\n * Small utility for registering and processing format handlers.\n *\n * @example\n * const myHandler = bufferParser()\n * .on(FormatA, aData => {})\n * .on(FormatB, bData => {});\n *\n * myHandler.processBuffer(bytes);\n */\nexport const bufferParser = (): BufferParser => new BufferParser();\n\nexport class BufferParser {\n /** @internal */\n private _$formats = new Map any, decodeInPlace: boolean]>();\n private _$data = new Map(); // used when decoding in-place\n\n /**\n * Decode an array buffer and trigger the relevant data handler.\n *\n * When passed an ArrayBufferView, accesses the underlying 'buffer' instance directly.\n *\n * @throws {TinybufError} if fails to decode, or no handler is registered\n */\n public processBuffer(b: ArrayBuffer | ArrayBufferView): void {\n let f: any, data: any, cb: (data: any) => any, r: boolean;\n\n try {\n const header = peekHeader(b);\n\n if (!this._$formats.has(header)) {\n throw new TinybufError(`Unknown format: ${header} '${$hashCodeToStr(header)}')`);\n }\n\n [f, cb, r] = this._$formats.get(header);\n if (r) data = this._$data.get(header) ?? {};\n data = f.decode(b, data);\n if (r) this._$data.set(header, data);\n }\n catch (e) {\n const err = new TinybufError(`Failed to decode: ${e}`);\n err.stack = e.stack;\n\n throw err;\n }\n\n cb(data);\n }\n\n /**\n * Register a format handler.\n */\n public on>(\n format: BufferFormat,\n callback: (data: TDecodedType) => any,\n {\n decodeInPlace = false,\n } = {},\n ): this {\n if (format.header == null) {\n throw new TinybufError(\"Format requires header\");\n }\n\n const header = typeof format.header === \"string\" ? $strToHashCode(format.header) : format.header;\n\n if (this._$formats.has(header) && this._$formats.get(header)?.[0] !== format) {\n throw new TinybufError(`Format header collision: ${format.header}`);\n }\n\n this._$formats.set(header, [format, callback, decodeInPlace]);\n\n return this;\n }\n\n /** Register a format (or formats) that are recognized. */\n public ignore(...format: AnyFormat[]): this {\n format.forEach(f => this.on(f, () => {}));\n return this;\n }\n\n /** Clears all registered formats and handlers. */\n public clear(): void {\n this._$formats.clear();\n this._$data.clear();\n }\n}\n","export const $floor = Math.floor,\n $ceil = Math.ceil;\n\n/** Clamp a number to a range. */\nexport const $clamp = (value: number, min: number, max: number): number =>\n value > max ? max : value < min ? min : value;\n\n/** Round toward zero */\nexport const $roundTowardZero = (x: number): number => x < 0 ? $ceil(x) : $floor(x);\n\n/** Round away zero */\nexport const $roundAwayFromZero = (x: number): number =>\n x < 0 ? $floor(x) : $ceil(x);\n","import { $clamp, $roundTowardZero, $roundAwayFromZero } from \"./math\";\n\n/**\n * Quantize a number to an 8-bit scalar between 0.0 and 1.0.\n *\n * @returns A number (double) in its closest signed scalar representation.\n */\nexport function uscalround(x: number): number {\n return $fromuscal8($touscal8(x));\n}\n\n/**\n * Quantize a number to an 8-bit signed scalar between -1.0 and 1.0.\n *\n * @returns A number (double) in its closest signed scalar representation.\n */\nexport function scalround(x: number): number {\n return $fromscal8($toscal8(x));\n}\n\n/** @returns A UInt8 bitmask representation. */\nexport function $touscal8(x: number): number {\n return $clamp(127 + $roundTowardZero(x * 254 - 127), 0, 254);\n}\n\n/** @returns A UInt8 bitmask representation. */\nexport function $toscal8(x: number): number {\n return $clamp($roundTowardZero(x * 127), -127, 127) + 127;\n}\n\n/** @returns An unsigned scalar between 0.0 and 1.0. */\nexport function $fromuscal8(x: number): number {\n // Make symmetric: (0.5 + round((uint8 - 127) / 254 * 100)) / 100\n return $clamp(($roundAwayFromZero((x - 127) * 0.3937007874015748) + 50) * 0.01, 0, 1);\n}\n\n/** @returns A signed scalar between -1.0 and 1.0. */\nexport function $fromscal8(x: number): number {\n // Make symmetric: round((uint8 - 127) / 127 * 100) / 100\n return $clamp($roundAwayFromZero((x - 127) * 0.787401574803149) * 0.01, -1, 1);\n}\n","/**\n * Field types for defining encoding formats.\n *\n * @see [Types](https://github.com/reececomo/tinybuf/blob/main/docs/types.md)\n */\nexport const Type = {\n /**\n * Unsigned integer (1 - 8 bytes).\n * - 0 → 127 = 1 byte\n * - 128 → 16,384 = 2 bytes\n * - 16,385 → 536,870,911 = 4 bytes\n * - 536,870,912 → `Number.MAX_SAFE_INTEGER` = 8 bytes\n */\n UInt: \"uint\",\n\n /** Unsigned 8-bit integer (between 0 and 255, 1 byte). */\n UInt8: \"u8\",\n\n /** Unsigned 16-bit integer (between 0 and 65,535, 2 bytes). */\n UInt16: \"u16\",\n\n /** Unsigned 32-bit integer (between 0 and 4,294,967,295, 4 bytes). */\n UInt32: \"u32\",\n\n /**\n * Signed integer (1 - 8 bytes).\n * - 0 → ±64 = 1 byte\n * - ±65 → ±8,192 = 2 bytes\n * - ±8,193 → ±268,435,456 = 4 bytes\n * - ±268,435,457 → ±`Number.MAX_SAFE_INTEGER` = 8 bytes\n */\n Int: \"int\",\n\n /** Signed 1 byte integer (between -127 and 127). */\n Int8: \"i8\",\n\n /** Signed 2 byte integer (between -32,767 and 32,767). */\n Int16: \"i16\",\n\n /** Signed 4 byte integer (between -2,147,483,647 and 2,147,483,647). */\n Int32: \"i32\",\n\n /** Default JavaScript `number` type. Floating-point number (64-bit, double precision, 8 bytes). */\n Float64: \"f64\",\n\n /** Floating-point number (32-bit, single precision, 4 bytes). */\n Float32: \"f32\",\n\n /**\n * Floating-point number (16-bit in FP16 format, half precision, 2 bytes).\n *\n * **Warning:** Low precision; maximum range: ±65,504.\n */\n Float16: \"f16\",\n\n /**\n * Floating-point number (16-bit in BF16 format, half precision, 2 bytes).\n *\n * **Warning:** Low precision.\n */\n BFloat16: \"b16\",\n\n /** A signed 2-decimal scalar between -1.00 and 1.00 (1 byte). */\n Scalar8: \"sc\",\n\n /** An unsigned 2-decimal scalar between 0.00 and 1.00 (1 byte). */\n UScalar8: \"usc\",\n\n /**\n * Boolean value (1 byte).\n * @see {Bools} for packing multiple booleans into a single byte.\n */\n Bool: \"bl\",\n\n /** Any array of booleans (1 bit overhead, encoded as UInt). */\n Bools: \"bls\",\n\n /** Any ArrayBuffer or ArrayBufferView (e.g. Uint8Array) value (encoded as 1 x UInt for byte length + buffer bytes). */\n Buffer: \"buf\",\n\n /** A UTF-8 string (encoded as 1 x UInt for UTF-8 byte length + UTF-8 bytes). */\n String: \"str\",\n\n /** Any JSON data (encodes as UTF-8). */\n JSON: \"jsn\",\n\n /** JavaScript RegExp object. */\n RegExp: \"re\",\n\n /**\n * JavaScript Date object.\n *\n * Encoded as an 8 byte (64-bit) integer UTC timestamp from as the number\n * of milliseconds since the Unix Epoch (January 1, 1970, 00:00:00 UTC).\n *\n * @see {Date}\n */\n Date: \"dt\",\n} as const;\n\nexport type TypeLiteral = typeof Type[keyof typeof Type];\nexport const ValidTypes = Object.values(Type);\n\n/**\n * Mappings for the value types.\n */\nexport type ValueTypes = {\n [Type.Int]: number;\n [Type.Int8]: number;\n [Type.Int16]: number;\n [Type.Int32]: number;\n [Type.UInt]: number;\n [Type.UInt8]: number;\n [Type.UInt16]: number;\n [Type.UInt32]: number;\n [Type.Float64]: number;\n [Type.Float32]: number;\n [Type.Float16]: number;\n [Type.BFloat16]: number;\n [Type.Scalar8]: number;\n [Type.UScalar8]: number;\n [Type.Bool]: boolean;\n [Type.Bools]: boolean[];\n [Type.Buffer]: Uint8Array | ArrayBuffer | ArrayBufferView;\n [Type.String]: string;\n [Type.JSON]: any;\n [Type.RegExp]: RegExp;\n [Type.Date]: Date;\n};\n\n/** https://www.totaltypescript.com/concepts/the-prettify-helper */\ntype Pretty = T extends ArrayBuffer | ArrayBufferView | Date | RegExp | Uint8Array ? T\n : T extends Array ? Array>\n : T extends object ? {[K in keyof T]: Pretty} & unknown : T;\n\n/** @throws any error too */\nexport type ValidationFn = (x: T) => undefined | boolean | Error;\nexport type TransformFn = (x: T) => T;\nexport type Transforms = TransformFn | [preEncode: TransformFn] | [preEncode: TransformFn | undefined, postDecode: TransformFn | undefined];\n\n/**\n * A wrapper around any Type definition that declares it as optional.\n */\nexport class MaybeType {\n public constructor(public type: T) {}\n}\n\n/**\n * Wrap any definition as optional.\n */\nexport function optional(t: T): MaybeType {\n return new MaybeType(t);\n}\n\n/**\n * A definition for an object binary encoder.\n */\nexport type EncoderDefinition = {\n [key: string]: FieldDefinition | MaybeType;\n};\n\n/**\n * Definition for an object-field binary encoder.\n */\nexport type FieldDefinition = keyof ValueTypes | [keyof ValueTypes] | EncoderDefinition | [EncoderDefinition] | MaybeType;\n\n/**\n * The resulting type of the decoded data, based on the encoder definition.\n */\ntype RawDecodedType = {\n [EKey in keyof EncoderType as EncoderType[EKey] extends MaybeType ? never : EKey]: EncoderType[EKey] extends keyof ValueTypes\n ? ValueTypes[EncoderType[EKey]]\n : EncoderType[EKey] extends [keyof ValueTypes]\n ? Array\n : EncoderType[EKey] extends EncoderDefinition\n ? RawDecodedType\n : EncoderType[EKey] extends [EncoderDefinition]\n ? Array>\n : never;\n} & {\n [EKey in keyof EncoderType as EncoderType[EKey] extends MaybeType ? EKey : never]?: EncoderType[EKey] extends MaybeType\n ? ValueTypes[OptionalValue] | undefined\n : EncoderType[EKey] extends MaybeType\n ? Array | undefined\n : EncoderType[EKey] extends MaybeType\n ? RawDecodedType | undefined\n : never;\n};\n\nexport type DecodedType = Pretty>;\n\nexport type TransformConfig = {\n [EKey in keyof EncoderType]?: EncoderType[EKey] extends keyof ValueTypes\n ? Transforms\n : EncoderType[EKey] extends [keyof ValueTypes]\n ? Transforms\n : EncoderType[EKey] extends EncoderDefinition\n ? TransformConfig\n : EncoderType[EKey] extends [EncoderDefinition]\n ? TransformConfig\n : EncoderType[EKey] extends MaybeType\n ? Transforms\n : EncoderType[EKey] extends MaybeType\n ? Transforms\n : EncoderType[EKey] extends MaybeType\n ? TransformConfig | undefined\n : never;\n};\n\nexport type ValidationConfig = {\n [EKey in keyof EncoderType]?: EncoderType[EKey] extends keyof ValueTypes\n ? ValidationFn\n : EncoderType[EKey] extends [keyof ValueTypes]\n ? ValidationFn\n : EncoderType[EKey] extends EncoderDefinition\n ? ValidationConfig\n : EncoderType[EKey] extends [EncoderDefinition]\n ? ValidationConfig\n : EncoderType[EKey] extends MaybeType\n ? ValidationFn\n : EncoderType[EKey] extends MaybeType\n ? ValidationFn\n : EncoderType[EKey] extends MaybeType\n ? ValidationConfig | undefined\n : never;\n};\n","/**\n * Mask booleans to a uint32.\n *\n * @param x - A boolean array.\n * @param padBit - A bit to pad the mask (for variable length data).\n */\nexport const mask = (x: boolean[], padBit: 0 | 1 = 0b1): number => {\n return x.reduce((n, b: any) => (n << 1) | b, padBit);\n};\n\n/**\n * Unmask booleans from a uint32.\n *\n * @param x - A uint32 number.\n * @param l - number of booleans to expect (default: infer lenth from x where x is encoded with a pad bit)\n * or pass an existing boolean array to decode in-place.\n */\nexport const unmask = (x: number, l?: number | boolean[]): boolean[] => {\n const len = l === undefined ? 31 - Math.clz32(x) : Array.isArray(l) ? l.length : l;\n const val = Array.isArray(l) && l.length === len ? l : new Array(len);\n for (let i = 0; i < len; i++) val[i] = !!(x & (1 << (len - 1 - i)));\n return val;\n};\n","export const $utf8encode = (function () {\n const encoder = new TextEncoder();\n return (x?: string): Uint8Array => encoder.encode(x);\n})();\n\nexport const $utf8decode = (function () {\n const decoder = new TextDecoder(\"utf-8\");\n return (y: Uint8Array): string => decoder.decode(y);\n})();\n","/**\n * Returns the nearest half precision float representation of a number.\n * @param x A numeric expression.\n */\nexport function f16round(x: number): number {\n return $fromf16($tof16(x));\n}\n\n/**\n * Returns the nearest half precision float representation of a number as a 16-bit bitmask.\n */\nexport const $tof16 = (function() {\n const x = new Float32Array(1);\n const y = new Int32Array(x.buffer);\n\n return function (f: number) {\n x[0] = f;\n let i = y[0]; // 32-bit int\n let s = (i >> 16) & 0X8000; // sign\n let z = (i & 0X7FFFFFFF) + 0X1000 | 0;\n\n if (z >= 0X47800000) {\n if ((i & 0X7FFFFFFF) < 0X47800000) return s | 0X7BFF;\n if (z < 0X7F800000) return s | 0X7C00;\n return s | 0X7C00 | (i & 0X007FFFFF) >> 13;\n }\n if (z >= 0X38800000) return s | z - 0X38000000 >> 13;\n else if (z < 0X33000000) return s;\n z = (i & 0X7FFFFFFF) >> 23;\n return s | ((i & 0X7FFFFF | 0X800000)\n + (0X800000 >>> z - 102)\n >> 126 - z);\n };\n}());\n\n/**\n * Returns the nearest half precision float value for a 16-bit bitmask.\n */\nexport const $fromf16 = (function() {\n const z = Math.pow(2, -24); // subnormal constant\n const d = new Float32Array(32 + 1024);\n for (let e = 0; e < 32; e++) d[e] = Math.pow(2, e - 15); // biased exponents\n for (let m = 0; m < 1024; m++) d[m + 0x20] = 1 + m / 1024; // normalized offset mantissas\n\n return function (b: number): number {\n const s = (b & 32768) === 32768 ? -1 : 1; // sign: 1 bit\n const e = b & 31744; // exponent: 5 bits\n const m = b & 1023; // mantissa: 10 bits\n\n if (e === 0) return m === 0 ? s * 0 : s * z;\n if (e === 31744) return m === 0 ? s * Infinity : NaN;\n return d[e >> 10] * d[m + 0x20] * s;\n };\n}());\n","const i = new Uint32Array(1);\nconst f = new Float32Array(i.buffer);\n\n/**\n * Returns the nearest bfloat16 representation of a number.\n * @param x A numeric expression.\n */\nexport function bf16round(x: number): number {\n f[0] = x;\n i[0] = i[0] & 0xFFFF0000;\n return f[0];\n}\n\n/** Returns a 16-bit bfloat16 bitmask for a given float. */\nexport function $tobf16(x: number): number {\n f[0] = x;\n return i[0] >>> 16;\n}\n\n/** Returns the nearest value from a 16-bit bfloat16 bitmask. */\nexport function $frombf16(x: number): number {\n i[0] = x << 16;\n return f[0];\n}\n","import { BufferWriter } from \"./BufferWriter\";\nimport { BufferReader } from \"./BufferReader\";\nimport {\n $fromuscal8,\n $fromscal8,\n $touscal8,\n $toscal8\n} from \"./scalar\";\nimport { TypeLiteral, Type } from \"../Type\";\nimport { mask, unmask } from \"./bitmask\";\nimport { $utf8decode, $utf8encode } from \"./utf8\";\nimport { $floor } from \"./math\";\nimport { $fromf16, $tof16 } from \"./float16\";\nimport { $frombf16, $tobf16 } from \"./bfloat16\";\n\n// Pre-calculated constants\nconst MAX_VARUINT8 = 128,\n MAX_VARUINT16 = 16_384,\n MAX_VARUINT32 = 536_870_912,\n MAX_VARINT8 = 64,\n MAX_VARINT16 = 8_192,\n MAX_VARINT32 = 268_435_456,\n POW_32 = 0x100000000;\n\ntype WriterFn = (value: W, writer: BufferWriter) => void;\ntype ReaderFn = (reader: BufferReader, overwrite?: Partial) => R;\n\nexport interface BinaryTypeCoder {\n $write: WriterFn;\n $read: ReaderFn;\n}\n\n/**\n * Format (big-endian):\n * 7b 0xxxxxxx\n * 14b 10xxxxxx xxxxxxxx\n * 29b 110xxxxx xxxxxxxx xxxxxxxx xxxxxxxx\n * 61b 111xxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx\n */\nexport const uintCoder: BinaryTypeCoder = {\n $write: (value, writer) => {\n if (typeof value !== \"number\") value = Number(value);\n if (value < 0) value = 0;\n if (value < MAX_VARUINT8) writer.$writeUint8(value);\n else if (value < MAX_VARUINT16) writer.$writeUint16(value + 0x8000);\n else if (value < MAX_VARUINT32) writer.$writeUint32((value + 0xc0000000) | 0);\n else if (value >= MAX_VARUINT32) {\n writer.$writeUint32(($floor(value / POW_32) + 0xe0000000) | 0);\n writer.$writeUint16(value >>> 16);\n writer.$writeUint16(value & 0xffff);\n }\n else {\n // coercion case\n writer.$writeUint8(value as any === true ? 1 : 0);\n }\n },\n $read: (reader) => {\n const firstByte = reader.$peek();\n\n if (!(firstByte & 0x80)) {\n reader.$skip();\n return firstByte;\n }\n else if (!(firstByte & 0x40)) {\n return reader.$readUint16() - 0x8000;\n }\n else if (!(firstByte & 0x20)) {\n return reader.$readUint32() - 0xc0000000;\n }\n\n return (reader.$readUint32() - 0xe0000000) * POW_32\n + reader.$readUint32();\n }\n};\n\nexport const uint8Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint8(value),\n $read: (reader) => reader.$readUint8(),\n};\n\nexport const uint16Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint16(value),\n $read: (reader) => reader.$readUint16(),\n};\n\nexport const uint32Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint32(value),\n $read: (reader) => reader.$readUint32(),\n};\n\n/**\n * Format (big-endian):\n * 7b 0xxxxxxx\n * 14b 10xxxxxx xxxxxxxx\n * 29b 110xxxxx xxxxxxxx xxxxxxxx xxxxxxxx\n * 61b 111xxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx\n */\nexport const intCoder: BinaryTypeCoder = {\n $write: (value, writer) => {\n if (typeof value !== \"number\") value = Number(value);\n if (value >= -MAX_VARINT8 && value < MAX_VARINT8) writer.$writeUint8(value & 0x7f);\n else if (value >= -MAX_VARINT16 && value < MAX_VARINT16) writer.$writeUint16((value & 0x3fff) + 0x8000);\n else if (value >= -MAX_VARINT32 && value < MAX_VARINT32) writer.$writeUint32((value & 0x1fffffff) | 0xc0000000);\n else if (value < -MAX_VARINT32 || value >= MAX_VARINT32) {\n // Split in two 32b uints\n writer.$writeUint32(($floor(value / POW_32) & 0x1fffffff) | 0xe0000000);\n writer.$writeUint16(value >>> 16);\n writer.$writeUint16(value & 0xffff);\n }\n else {\n // coercion case\n writer.$writeUint8(value as any === true ? 0x7f : 0);\n }\n },\n $read: (reader) => {\n let firstByte = reader.$peek(), i: number;\n\n if (!(firstByte & 0x80)) {\n reader.$skip();\n return (firstByte & 0x40) ? (firstByte | 0xffffff80) : firstByte;\n }\n else if (!(firstByte & 0x40)) {\n i = reader.$readUint16() - 0x8000;\n return (i & 0x2000) ? (i | 0xffffc000) : i;\n }\n else if (!(firstByte & 0x20)) {\n i = reader.$readUint32() - 0xc0000000;\n return (i & 0x10000000) ? (i | 0xe0000000) : i;\n }\n else {\n i = reader.$readUint32() - 0xe0000000;\n i = (i & 0x10000000) ? (i | 0xe0000000) : i;\n return i * POW_32 + reader.$readUint32();\n }\n }\n};\n\nexport const int8Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeInt8(value),\n $read: (reader) => reader.$readInt8(),\n};\n\nexport const int16Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeInt16(value),\n $read: (reader) => reader.$readInt16(),\n};\n\nexport const int32Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeInt32(value),\n $read: (reader) => reader.$readInt32(),\n};\n\nexport const bfloat16Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint16($tobf16(value)),\n $read: (reader) => $frombf16(reader.$readUint16()),\n};\n\nexport const float16Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint16($tof16(value)),\n $read: (reader) => $fromf16(reader.$readUint16()),\n};\n\nexport const float32Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeFloat32(value),\n $read: (reader) => reader.$readFloat32(),\n};\n\nexport const float64Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeFloat64(value),\n $read: (reader) => reader.$readFloat64(),\n};\n\nexport const uscalar8Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint8($touscal8(value)),\n $read: (reader) => $fromuscal8(reader.$readUint8()),\n};\n\nexport const scalar8Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint8($toscal8(value)),\n $read: (reader) => $fromscal8(reader.$readUint8()),\n};\n\nexport const dateCoder: BinaryTypeCoder = {\n $write: (value, writer) => intCoder.$write(value.getTime(), writer),\n $read: (reader) => new Date(intCoder.$read(reader)),\n};\n\nexport const bufferCoder: BinaryTypeCoder = {\n $write: (value, writer) => {\n uintCoder.$write(value.byteLength, writer); // prefix length\n writer.$writeBytes(value);\n },\n $read: (reader) => reader.$readBytes(uintCoder.$read(reader)),\n};\n\nexport const stringCoder: BinaryTypeCoder = {\n $write: (value, writer) => bufferCoder.$write($utf8encode(value), writer),\n $read: (reader) => $utf8decode(bufferCoder.$read(reader)),\n};\n\nexport const boolCoder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint8(value ? 1 : 0),\n $read: (reader) => reader.$readUint8() !== 0,\n};\n\nexport const boolsCoder: BinaryTypeCoder = {\n $write: (value, writer) => {\n if (value.length > 28) value = value.slice(0, 28); // drop additional\n uintCoder.$write(mask(value), writer);\n },\n $read: (reader, p) => unmask(uintCoder.$read(reader), p),\n};\n\nexport const jsonCoder: BinaryTypeCoder = {\n $write: (value, writer) => stringCoder.$write(JSON.stringify(value), writer),\n $read: (reader) => JSON.parse(stringCoder.$read(reader)),\n};\n\nexport const regexCoder: BinaryTypeCoder = {\n $write: (value, writer) => {\n writer.$writeUint8(mask([value.global, value.ignoreCase, value.multiline]));\n stringCoder.$write(value.source, writer);\n },\n $read: (reader) => {\n const [g, i, m] = unmask(reader.$readUint8());\n return new RegExp(stringCoder.$read(reader), (g ? \"g\" : \"\") + (i ? \"i\" : \"\") + (m ? \"m\" : \"\"));\n }\n};\n\nexport const writers: Record> = {\n [Type.UInt]: uintCoder.$write,\n [Type.UInt8]: uint8Coder.$write,\n [Type.UInt16]: uint16Coder.$write,\n [Type.UInt32]: uint32Coder.$write,\n [Type.Int]: intCoder.$write,\n [Type.Int8]: int8Coder.$write,\n [Type.Int16]: int16Coder.$write,\n [Type.Int32]: int32Coder.$write,\n [Type.Float64]: float64Coder.$write,\n [Type.Float32]: float32Coder.$write,\n [Type.Float16]: float16Coder.$write,\n [Type.BFloat16]: bfloat16Coder.$write,\n [Type.Scalar8]: scalar8Coder.$write,\n [Type.UScalar8]: uscalar8Coder.$write,\n [Type.Bool]: boolCoder.$write,\n [Type.Bools]: boolsCoder.$write,\n [Type.Buffer]: bufferCoder.$write,\n [Type.String]: stringCoder.$write,\n [Type.JSON]: jsonCoder.$write,\n [Type.RegExp]: regexCoder.$write,\n [Type.Date]: dateCoder.$write,\n};\n\nexport const readers: Record> = {\n [Type.UInt]: uintCoder.$read,\n [Type.UInt8]: uint8Coder.$read,\n [Type.UInt16]: uint16Coder.$read,\n [Type.UInt32]: uint32Coder.$read,\n [Type.Int]: intCoder.$read,\n [Type.Int8]: int8Coder.$read,\n [Type.Int16]: int16Coder.$read,\n [Type.Int32]: int32Coder.$read,\n [Type.Float64]: float64Coder.$read,\n [Type.Float32]: float32Coder.$read,\n [Type.Float16]: float16Coder.$read,\n [Type.BFloat16]: bfloat16Coder.$read,\n [Type.Scalar8]: scalar8Coder.$read,\n [Type.UScalar8]: uscalar8Coder.$read,\n [Type.Bool]: boolCoder.$read,\n [Type.Bools]: boolsCoder.$read,\n [Type.Buffer]: bufferCoder.$read,\n [Type.String]: stringCoder.$read,\n [Type.JSON]: jsonCoder.$read,\n [Type.RegExp]: regexCoder.$read,\n [Type.Date]: dateCoder.$read,\n};\n","/** Default maximum transmission unit in networking */\nconst MTU = 1500;\n\n/** Set Tinybuf global config */\nexport const setTinybufConfig = (c: Partial): void => {\n cfg = { ...cfg, ...c };\n};\n\nexport type TinybufConfig = {\n /**\n * (default: false)\n *\n * This sets the default value for `preserveBytes` on\n * `encode(data, preserveBytes?)`.\n *\n * By default, `encode()` returns its encoded bytes as a `Uint8Array`\n * view of the bytes in the shared encoding buffer.\n *\n * This is suitable for synchronous use (e.g. high-performance applications)\n * as it avoids slow and expensive memory allocation and fragmentation on\n * each call to `encode()`.\n *\n * However, susbsequent calls are destructive to the underlying bytes, so\n * for asynchronous uses (e.g. Promises, Workers, long-lived storage), set\n * `preserveBytes` to `true`.\n */\n safe: boolean,\n\n /**\n * (default: true)\n * By default, format encoders share a global encoding buffer for performance\n * and memory management reasons.\n *\n * When set to false, each format is allocated an individual encoding buffer.\n *\n * Enable to maximise performance and memory re-use, just be cautious of\n * possible race conditions.\n */\n useGlobalEncodingBuffer: boolean,\n\n /**\n * (default: 1500)\n * The maximum bytes that can be allocated to an encoding buffer.\n *\n * Default is 1500 bytes, the standard \"Maximum Transmission Unit\".\n */\n encodingBufferMaxSize: number,\n\n /**\n * (default: 256)\n * Initial bytes to allocate for an encoding buffer.\n */\n encodingBufferInitialSize: number,\n\n /**\n * (default: 256)\n * Additional bytes to allocated when dynamically increasing the size of an encoding buffer.\n */\n encodingBufferIncrement: number,\n};\n\n/** @internal */\nexport let cfg: TinybufConfig = {\n safe: false,\n useGlobalEncodingBuffer: true,\n encodingBufferMaxSize: MTU,\n encodingBufferInitialSize: 256,\n encodingBufferIncrement: 256,\n};\n","import { cfg } from \"../config\";\nimport { TinybufError } from \"./errors\";\n\n/**\n * Wraps a buffer with a write head pointer.\n *\n * @internal\n */\nexport class BufferWriter {\n public $byteLength: number = 0;\n private _$dataView: DataView;\n private _$bytes: Uint8Array;\n private _$base: number;\n private _$writeHead: number = 0;\n private _$resizable: boolean;\n\n public constructor($0: number | Uint8Array) {\n this._$resizable = typeof $0 === \"number\";\n let b = $0 instanceof Uint8Array ? $0 : new Uint8Array($0);\n this._$bytes = b;\n this._$base = b.byteOffset;\n this._$dataView = new DataView(b.buffer);\n }\n\n /** Retarget the writer to a fixed-size byte array, reusing the existing DataView where possible. */\n public $reset(b: Uint8Array): this {\n if (this._$dataView.buffer !== b.buffer) {\n this._$dataView = new DataView(b.buffer);\n }\n\n this._$bytes = b;\n this._$base = b.byteOffset;\n this._$resizable = false;\n this._$writeHead = 0;\n this.$byteLength = 0;\n\n return this;\n }\n\n public $viewBytes(): Uint8Array {\n return this._$bytes.subarray(0, this.$byteLength);\n }\n\n public $copyBytes(): Uint8Array {\n const buf = new Uint8Array(this.$byteLength);\n buf.set(this.$viewBytes());\n return buf;\n }\n\n // ----- Writers: -----\n\n public $writeInt8(value: number): void {\n this._$pre(1).setInt8(this._$writeHead, value);\n }\n\n public $writeInt16(value: number): void {\n this._$pre(2).setInt16(this._$writeHead, value, true);\n }\n\n public $writeInt32(value: number): void {\n this._$pre(4).setInt32(this._$writeHead, value, true);\n }\n\n public $writeUint8(value: number): void {\n this._$pre(1).setUint8(this._$writeHead, value);\n }\n\n public $writeUint16(value: number): void {\n this._$pre(2).setUint16(this._$writeHead, value, false); // big-endian for varint\n }\n\n public $writeUint32(value: number): void {\n this._$pre(4).setUint32(this._$writeHead, value, false); // big-endian for varint\n }\n\n public $writeFloat32(value: number): void {\n this._$pre(4).setFloat32(this._$writeHead, value, true);\n }\n\n public $writeFloat64(value: number): void {\n this._$pre(8).setFloat64(this._$writeHead, value, true);\n }\n\n public $writeBytes(b: Uint8Array | ArrayBuffer | ArrayBufferView): void {\n // allocate bytes first\n this._$pre(b.byteLength);\n\n this._$bytes.set(\n b instanceof Uint8Array\n ? b\n : ArrayBuffer.isView(b)\n ? new Uint8Array(b.buffer, b.byteOffset, b.byteLength)\n : new Uint8Array(b),\n this._$writeHead - this._$base\n );\n }\n\n // ----- Private methods: -----\n\n /**\n * Pre-allocate some bytes on the dataview, moving the write head into\n * position.\n *\n * @throws TinybufError\n */\n private _$pre(bytes: number): DataView {\n if (this.$byteLength + bytes > this._$bytes.byteLength) {\n this._$malloc(bytes);\n }\n\n this._$writeHead = this._$base + this.$byteLength;\n this.$byteLength += bytes;\n\n return this._$dataView;\n }\n\n /**\n * @throws TinybufError\n */\n private _$malloc(bytes: number): void {\n if (!this._$resizable) {\n throw new TinybufError(\"exceeded buffer length: \" + this._$bytes.byteLength);\n }\n\n const currentBytes = this._$bytes.byteLength;\n const minNewBytes = this.$byteLength + bytes - currentBytes;\n const availableBytes = cfg.encodingBufferMaxSize - currentBytes;\n\n if (minNewBytes > availableBytes) {\n throw new TinybufError(\"exceeded encodingBufferMaxSize: \" + cfg.encodingBufferMaxSize);\n }\n\n const increment = cfg.encodingBufferIncrement;\n const newBytes = Math.ceil(minNewBytes / increment) * increment;\n const newSize = currentBytes + Math.min(newBytes, availableBytes);\n const buf = new Uint8Array(newSize);\n\n // copy bytes\n buf.set(this._$bytes);\n\n // update refs\n this._$dataView = new DataView(buf.buffer);\n this._$bytes = buf;\n this._$base = 0;\n }\n}\n","/**\n * Wraps a buffer with a read head pointer.\n *\n * @internal\n */\nexport class BufferReader {\n public i: number;\n private _$dataView!: DataView;\n private _$base!: number;\n private _$byteLength!: number;\n\n public constructor(b: Uint8Array | ArrayBufferView | ArrayBuffer, headerBytes?: number) {\n this.$reset(b, headerBytes);\n }\n\n /** Retarget the reader to a new buffer, reusing the existing DataView where possible. */\n public $reset(b: Uint8Array | ArrayBufferView | ArrayBuffer, headerBytes?: number): this {\n const isView = ArrayBuffer.isView(b);\n const buffer = isView ? b.buffer : b;\n const offset = isView ? b.byteOffset : 0;\n let dv = this._$dataView;\n\n if (\n dv === undefined\n || dv.buffer !== buffer\n || offset < dv.byteOffset\n || offset + b.byteLength > dv.byteOffset + dv.byteLength\n ) {\n dv = this._$dataView = b instanceof DataView ? b : new DataView(buffer);\n }\n\n this._$base = offset - dv.byteOffset;\n this._$byteLength = b.byteLength;\n this.i = headerBytes ?? 0; // internal offset (header)\n\n return this;\n }\n\n /** Read the next byte, without moving the read head pointer. */\n public $peek(): number {\n if (this.i >= this._$byteLength) {\n throw new RangeError(\"exceeded bytes\");\n }\n\n return this._$dataView.getUint8(this._$base + this.i);\n }\n\n /** Skip the next byte without reading it. */\n public $skip(): void {\n this.i++;\n }\n\n // ----- Readers: -----\n\n public $readUint8(): number {\n return this._$dataView.getUint8(this._$at(1));\n }\n\n public $readUint16(): number {\n return this._$dataView.getUint16(this._$at(2)); // big-endian\n }\n\n public $readUint32(): number {\n return this._$dataView.getUint32(this._$at(4)); // big-endian\n }\n\n public $readInt8(): number {\n return this._$dataView.getInt8(this._$at(1));\n }\n\n public $readInt16(): number {\n return this._$dataView.getInt16(this._$at(2), true); // little-endian\n }\n\n public $readInt32(): number {\n return this._$dataView.getInt32(this._$at(4), true); // little-endian\n }\n\n public $readFloat32(): number {\n return this._$dataView.getFloat32(this._$at(4), true); // little-endian\n }\n\n public $readFloat64(): number {\n return this._$dataView.getFloat64(this._$at(8), true); // little-endian\n }\n\n /** @throws RangeError if exceeds length */\n public $readBytes(bytes: number): Uint8Array {\n return new Uint8Array(\n this._$dataView.buffer,\n this._$dataView.byteOffset + this._$at(bytes),\n bytes\n );\n }\n\n // ----- Private methods: -----\n\n /**\n * Advance the read head, returning the DataView offset to read from.\n *\n * @throws RangeError if exceeds length\n */\n private _$at(bytes: number): number {\n const i = this.i;\n\n if (i + bytes > this._$byteLength) {\n throw new RangeError(\"exceeded bytes\");\n }\n\n this.i = i + bytes;\n\n return this._$base + i;\n }\n}\n","/* eslint-disable @typescript-eslint/unified-signatures */\nimport { writers, readers } from \"./lib/coders\";\nimport * as coders from \"./lib/coders\";\nimport { $hashCode, $strToHashCode } from \"./lib/hashCode\";\nimport { peekHeader, peekHeaderStr } from \"./lib/peek\";\nimport { BufferWriter } from \"./lib/BufferWriter\";\nimport { BufferReader } from \"./lib/BufferReader\";\nimport {\n DecodedType,\n EncoderDefinition,\n FieldDefinition,\n TransformConfig,\n ValidationConfig,\n MaybeType,\n Transforms,\n TypeLiteral,\n ValidationFn,\n ValidTypes,\n} from \"./Type\";\nimport { cfg } from \"./config\";\n\nexport type FormatHeader = string | number;\n\n/**\n * Utility to get the decoded type of a buffer format\n * @example type Format = Decoded\n */\nexport type Decoded = TBufferFormat extends BufferFormat\n ? DecodedType\n : never;\n\n/**\n * Defines a format for encoding/decoding binary buffers.\n *\n * Optionally customize the identifier, either as a 2-byte string, an unsigned integer (0 -> 65,535), or as `null` to disable entirely.\n *\n * @example\n * const MyFormat = defineFormat({ ... });\n * const MyFormat = defineFormat('ab', { ... });\n * const MyFormat = defineFormat(1234, { ... });\n * const MyFormat = defineFormat(null, { ... });\n */\nexport function defineFormat(def: T): BufferFormat;\n/**\n * Defines a format for encoding/decoding binary buffers.\n *\n * Optionally customize the identifier, either as a 2-byte string, an unsigned integer (0 -> 65,535), or as `null` to disable entirely.\n *\n * @example\n * const MyFormat = defineFormat({ ... });\n * const MyFormat = defineFormat('ab', { ... });\n * const MyFormat = defineFormat(1234, { ... });\n * const MyFormat = defineFormat(null, { ... });\n */\nexport function defineFormat(h: HeaderType | null, def: T): BufferFormat;\nexport function defineFormat(a?: HeaderType | T, b?: T): BufferFormat {\n return a !== null && typeof a === \"object\"\n ? new BufferFormat(a as T)\n : new BufferFormat(b as T, a as HeaderType);\n}\n\nfunction isValidHeader(h: FormatHeader): boolean {\n if (typeof h === \"number\") return Number.isInteger(h) && h >= 0 && h <= 65_535;\n if (typeof h === \"string\") return new TextEncoder().encode(h).byteLength === 2;\n return false;\n}\n\n/**\n * BufferFormat is a utility class for encoding and decoding binary data based\n * on a provided encoding format.\n *\n * @see {header}\n * @see {encode(data)}\n * @see {decode(binary)}\n */\nexport class BufferFormat {\n /** @internal */\n private static _$globalWriter?: BufferWriter;\n\n /**\n * A unique identifier encoded as the first 2 bytes (or `undefined` if headerless).\n *\n * @see {peekHeader(...)}\n * @see {peekHeaderStr(...)}\n */\n public header!: HeaderType;\n\n /** @internal */\n private _$header!: number; // always uint16 vesion\n /** @internal */\n private _$type!: TypeLiteral;\n /** @internal */\n private _$fields!: Field[];\n /** @internal */\n private _$fieldsMap!: Map;\n\n /** @internal */\n private _$format?: string;\n /** @internal */\n private _$transforms?: Transforms | undefined;\n /** @internal */\n private _$validate?: ValidationFn | undefined;\n /** @internal */\n private _$hasValidationOrTransforms = false;\n /** @internal */\n private _$writer?: BufferWriter;\n /** @internal */\n private _$intoWriter?: BufferWriter;\n /** @internal */\n private _$reader?: BufferReader;\n\n public constructor(\n def: EncoderType,\n header?: HeaderType | null,\n ) {\n // set definition\n if (typeof def === \"string\" && ValidTypes.includes(def)) {\n this._$type = def;\n }\n else if (def instanceof MaybeType) {\n throw new TypeError(\"Format cannot be optional\");\n }\n else if (def instanceof Object) {\n this._$type = undefined; // object\n this._$fieldsMap = new Map();\n this._$fields = Object.keys(def).map((name) => {\n const f = new Field(name, def[name]);\n this._$fieldsMap.set(name, f); // also set map entry\n return f;\n });\n\n // set headers\n if (header === undefined) {\n this.header = $hashCode(this.f) as HeaderType; // automatic\n this._$header = this.header as number;\n }\n else if (header === null) {\n this.header = undefined; // headerless\n this._$header = undefined;\n }\n else if (isValidHeader(header)) {\n this.header = header; // manual\n this._$header = typeof header === \"number\" ? header : $strToHashCode(header);\n }\n else {\n throw new TypeError(\"Header must be 2-byte string, uint16, or null.\");\n }\n }\n else {\n throw new TypeError(\"Format must be object or Type\");\n }\n }\n\n // ----- Static methods: -----\n\n /**\n * Read the header of a buffer as a number.\n *\n * @see {header}\n * @throws {RangeError} if buffer size < 2\n */\n public static peekHeader = peekHeader;\n\n /**\n * Read the header of a buffer as a string.\n *\n * @see {header}\n * @throws {RangeError} if buffer size < 2\n */\n public static peekHeaderStr = peekHeaderStr;\n\n // ----- Accessors: -----\n\n /**\n * @example \"{uint8,str[]?}\"\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n private get f(): string {\n if (this._$format === undefined) {\n this._$format = this._$fields !== undefined\n ? `{${this._$fields.map(v => v.f).join(\",\")}}`\n : `${this._$type}`;\n }\n\n return this._$format;\n }\n\n /** @internal */\n private static _$initWriter(): BufferWriter {\n if (cfg.useGlobalEncodingBuffer) {\n if (!BufferFormat._$globalWriter) {\n this._$globalWriter = new BufferWriter(cfg.encodingBufferMaxSize);\n }\n\n return this._$globalWriter;\n }\n\n return new BufferWriter(cfg.encodingBufferInitialSize);\n }\n\n /**\n * Encode an object into an existing byte array.\n *\n * **Warning:** Returns an unsafe view into the encoding buffer. Pass this reference to preserve\n * performance, and to minimize memory allocation and fragmentation.\n */\n public encodeInto>(\n data: TDecodedType,\n bytes: Uint8Array,\n ): Uint8Array {\n return bytes.subarray(0, this.encodeIntoLength(data, bytes));\n }\n\n /**\n * Encode an object into an existing byte array, without allocating a view.\n *\n * @returns the number of bytes written to the start of `bytes`\n * @throws if fails to encode value to schema, or `bytes` is too small\n */\n public encodeIntoLength>(\n data: TDecodedType,\n bytes: Uint8Array,\n ): number {\n if (this._$hasValidationOrTransforms) {\n data = this._$preprocess(data);\n }\n\n const writer = this._$intoWriter?.$reset(bytes) ?? new BufferWriter(bytes);\n this._$intoWriter = undefined;\n\n try {\n this._$write(data, writer);\n\n return writer.$byteLength;\n }\n finally {\n this._$intoWriter = writer;\n }\n }\n\n /**\n * Encode an object to bytes.\n *\n * **Warning:** Returns an unsafe view into the encoding buffer. Pass this reference to preserve\n * performance, and to minimize memory allocation and fragmentation.\n *\n * @param data - data to encode\n * @param preserveBytes - (default: `setTinybufConfig().safe`) When set to true, copies encoded\n * bytes to a new buffer. When set to false, returns an unsafe view of bytes but prevents\n * unnnecessary memory allocation and fragmentation.\n *\n * @returns a copy of encoded bytes\n * @throws if fails to encode value to schema\n */\n public encode>(\n data: TDecodedType,\n preserveBytes?: boolean,\n ): Uint8Array {\n if (!this._$writer) {\n // lazy init\n this._$writer = BufferFormat._$initWriter();\n }\n\n // reset\n this._$writer.$byteLength = 0;\n\n if (this._$hasValidationOrTransforms) {\n data = this._$preprocess(data);\n }\n\n this._$write(data, this._$writer);\n\n return (preserveBytes ?? cfg.safe)\n ? this._$writer.$copyBytes()\n : this._$writer.$viewBytes();\n }\n\n /**\n * Decode binary data into an existing object instance.\n * @throws if fails to decode bytes to schema.\n */\n public decodeInto>(\n bytes: Uint8Array | ArrayBufferView | ArrayBuffer,\n obj: Partial,\n ): TDecodedType {\n return this._$decode(bytes, obj);\n }\n /**\n * Decode binary data to an object.\n * @throws if fails to decode bytes to schema.\n */\n public decode>(\n bytes: Uint8Array | ArrayBufferView | ArrayBuffer\n ): TDecodedType;\n /**\n * @deprecated use decodeInto() instead\n */\n public decode>(\n bytes: Uint8Array | ArrayBufferView | ArrayBuffer,\n decodeInto: Partial,\n ): TDecodedType;\n /**\n * Decode binary data to an object.\n * @throws if fails to decode bytes to schema.\n */\n public decode>(\n bytes: Uint8Array | ArrayBufferView | ArrayBuffer,\n decodeInto?: Partial | undefined,\n ): TDecodedType {\n return this._$decode(bytes, decodeInto);\n }\n\n /**\n * Set additional transform functions to apply before encoding and after decoding.\n */\n public setTransforms(transforms: TransformConfig | Transforms): this {\n this._$hasValidationOrTransforms = true;\n\n if (typeof transforms === \"function\" || (Array.isArray(transforms) && typeof transforms[0] === \"function\")) {\n this._$transforms = transforms;\n }\n else {\n for (const name of Object.keys(transforms)) {\n const field = this._$fieldsMap.get(name);\n if (!field) {\n throw new TypeError(`Failed to set transforms for field '${name}'`);\n }\n\n // Set validation for object.\n field.$coder.setTransforms(transforms[name]);\n }\n }\n\n return this;\n }\n\n /**\n * Set additional validation rules which are applied on encode() and decode().\n *\n * - Validation functions should throw an error, return an error, or return boolean false.\n * - Anything else is treated as successfully passing validation.\n */\n public setValidation(validations: ValidationConfig | ValidationFn): this {\n this._$hasValidationOrTransforms = true;\n\n if (typeof validations === \"function\") {\n this._$validate = validations;\n }\n else {\n for (const name of Object.keys(validations)) {\n const field = this._$fieldsMap.get(name);\n if (!field) {\n throw new TypeError(`Failed to set validation function for field '${name}'`);\n }\n\n field.$coder.setValidation(validations[name]);\n }\n }\n\n return this;\n }\n\n // ----- Implementation: -----\n\n /** @internal */\n private _$decode(\n bytes: Uint8Array | ArrayBufferView | ArrayBuffer,\n obj: Partial | undefined,\n ): TDecodedType {\n const headerBytes = this.header === undefined ? 0 : 2;\n\n const reader = this._$reader?.$reset(bytes, headerBytes) ?? new BufferReader(bytes, headerBytes);\n this._$reader = undefined;\n\n try {\n return this._$read(reader, obj);\n }\n finally {\n this._$reader = reader;\n }\n }\n\n /**\n * @param value\n * @param bw\n * @throws if the value is invalid\n *\n * @internal\n */\n private _$write(value: any, bw: BufferWriter): void {\n // write header\n if (this._$header !== undefined) bw.$writeUint16(this._$header);\n\n // write scalar\n if (this._$type !== undefined) {\n const safeValue = (this._$validate || this._$transforms) ? this._$preprocess(value) : value;\n\n return writers[this._$type](safeValue, bw);\n }\n\n // check for object type\n if (typeof value !== \"object\" || !value) {\n throw new TypeError(\"expected object type\");\n }\n\n // write each field\n const fields = this._$fields;\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n const subValue = value[field.$name];\n\n if (field.$isOptional) {\n if (subValue === undefined || subValue === null) {\n coders.boolCoder.$write(false, bw);\n continue; // skip\n }\n else {\n coders.boolCoder.$write(true, bw);\n }\n }\n else if (subValue == null) {\n throw new Error(`missing required value: ${field.$name}`);\n }\n\n if (field.$isArray) {\n // array\n this._$writeArray(subValue, bw, field.$coder);\n continue;\n }\n\n // scalar/object field\n field.$coder._$write(subValue, bw);\n }\n }\n\n /**\n * pre-process: validation and/or transforms\n * @internal\n */\n private _$preprocess>(data: T): T {\n if (this._$validate) this._$processValidation(data);\n\n if (typeof this._$transforms === \"function\") {\n return this._$transforms(data);\n }\n else if (Array.isArray(this._$transforms) && typeof this._$transforms[0] === \"function\") {\n return this._$transforms[0](data);\n }\n\n return data;\n }\n\n /**\n * post-process: validation and/or transforms\n * @internal\n */\n private _$postprocess>(data: T): T {\n if (Array.isArray(this._$transforms) && typeof this._$transforms[1] === \"function\") {\n data = this._$transforms[1](data);\n }\n\n if (this._$validate) this._$processValidation(data);\n\n return data;\n }\n\n private _$processValidation(data: any): void {\n if (!this._$validate) return;\n const res = this._$validate(data);\n if (res instanceof Error) throw res;\n if (res === false) throw new Error(\"failed validation\");\n }\n\n /**\n * This function will be executed only the first time\n * After that, we'll compile the read routine and add it directly to the instance\n * @param state\n * @returns\n * @throws if fails\n *\n * @internal\n */\n private _$read>(state: BufferReader, obj?: Partial): TDecodedType {\n // This function will be executed only the first time to compile the read routine.\n // After that, we'll compile the read routine and add it directly to the instance\n\n // Update the read method implementation.\n this._$read = this._$compileFormatReadFn();\n\n return this._$read(state, obj);\n }\n\n /**\n * Generate read function code for this coder.\n *\n * @example\n * let v=o??{};\n * v.prop1=this._$readField(0,s,o);\n * v.prop2=this._$readField(1,s,o);\n * return v\n *\n * @internal\n */\n private _$makeObjectReadFnBody(): string {\n const fieldsStr: string = this._$fields\n .map(({ $name: n }, i) => `v.${n}=this.${this._$readField.name}(${i},s,v.${n})`)\n .join(\";\");\n\n return `let v=o??{};${fieldsStr};return v;`;\n }\n\n /**\n * Read an individual field.\n * @internal\n */\n private _$readField(fieldIndex: number, state: BufferReader, obj?: any): any {\n const field = this._$fields[fieldIndex];\n\n if (field.$isOptional && !coders.boolCoder.$read(state)) {\n return undefined;\n }\n\n if (field.$isArray) {\n return this._$readArray(field.$coder, state, obj);\n }\n\n return field.$coder._$read(state, obj);\n }\n\n /**\n * Compile the decode() method for this object.\n *\n * @internal\n */\n private _$compileFormatReadFn>(): (state: BufferReader, obj: Partial | undefined) => TDecodedType {\n if (this._$type !== undefined) {\n // scalar type\n return this._$hasValidationOrTransforms\n ? (s) => this._$postprocess(readers[this._$type](s))\n : readers[this._$type];\n }\n\n // object type\n return new Function(\"s\", \"o\", this._$makeObjectReadFnBody()) as any;\n }\n\n /**\n * @internal\n */\n private _$writeArray(value: any[], bw: BufferWriter, type: BufferFormat): void {\n if (!Array.isArray(value)) {\n throw new TypeError(`expected array, instead got: ${value}`);\n }\n\n coders.uintCoder.$write(value.length, bw);\n for (let i = 0; i < value.length; i++) {\n type._$write(value[i], bw);\n }\n }\n\n /**\n * @throws if invalid data\n * @internal\n */\n private _$readArray(type: BufferFormat, state: any, obj?: Array): Array {\n const len = coders.uintCoder.$read(state);\n const arr = Array.isArray(obj) ? obj : new Array(len);\n if (arr.length !== len) arr.length = len;\n for (let j = 0; j < arr.length; j++) {\n arr[j] = type._$read(state, obj?.[j]);\n }\n return arr;\n }\n}\n\n/**\n * Parses and represents an object field.\n *\n * @internal\n */\nclass Field {\n public $name: string;\n public $coder: BufferFormat;\n public $isOptional: boolean;\n public $isArray: boolean;\n\n private _$formatString?: string;\n\n public constructor(name: string, rawType: FieldDefinition) {\n this.$isOptional = rawType instanceof MaybeType;\n let type = rawType instanceof MaybeType ? rawType.type : rawType;\n\n this.$name = name;\n\n if (Array.isArray(type)) {\n if (type.length !== 1) {\n throw new TypeError(\"Array type must contain exactly one format\");\n }\n\n type = type[0];\n this.$isArray = true;\n }\n else {\n this.$isArray = false;\n }\n\n this.$coder = new BufferFormat(type, null);\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public get f(): string {\n if (this._$formatString === undefined) {\n this._$formatString = `${(this.$coder as any).f}${this.$isArray ? \"[]\" : \"\"}${this.$isOptional ? \"?\" : \"\"}`;\n }\n\n return this._$formatString;\n }\n}\n"],"names":["TinybufError","Error","$hashCode","str","hash","i","length","charCodeAt","$strToHashCode","$hashCodeToStr","hashCode","String","fromCharCode","Math","floor","peekHeader","b","byteLength","RangeError","Uint8Array","DataView","getUint16","u8","ArrayBuffer","isView","buffer","byteOffset","peekHeaderStr","BufferParser","constructor","this","_$formats","Map","_$data","processBuffer","f","data","cb","r","header","has","get","_a","decode","set","e","err","stack","on","format","callback","decodeInPlace","ignore","forEach","clear","$floor","$ceil","ceil","$clamp","value","min","max","$roundTowardZero","x","$roundAwayFromZero","$touscal8","$toscal8","$fromuscal8","$fromscal8","Type","UInt","UInt8","UInt16","UInt32","Int","Int8","Int16","Int32","Float64","Float32","Float16","BFloat16","Scalar8","UScalar8","Bool","Bools","Buffer","JSON","RegExp","Date","ValidTypes","Object","values","MaybeType","type","mask","padBit","reduce","n","unmask","l","len","undefined","clz32","Array","isArray","val","$utf8encode","encoder","TextEncoder","encode","$utf8decode","decoder","TextDecoder","y","$tof16","Float32Array","Int32Array","s","z","$fromf16","pow","d","m","Infinity","NaN","Uint32Array","MAX_VARUINT32","MAX_VARINT32","POW_32","uintCoder","$write","writer","Number","$writeUint8","$writeUint16","$writeUint32","$read","reader","firstByte","$peek","$readUint32","$readUint16","$skip","uint8Coder","$readUint8","uint16Coder","uint32Coder","intCoder","int8Coder","$writeInt8","$readInt8","int16Coder","$writeInt16","$readInt16","int32Coder","$writeInt32","$readInt32","bfloat16Coder","$tobf16","$frombf16","float16Coder","float32Coder","$writeFloat32","$readFloat32","float64Coder","$writeFloat64","$readFloat64","uscalar8Coder","scalar8Coder","dateCoder","getTime","bufferCoder","$writeBytes","$readBytes","stringCoder","boolCoder","boolsCoder","slice","p","jsonCoder","stringify","parse","regexCoder","global","ignoreCase","multiline","source","g","writers","readers","cfg","safe","useGlobalEncodingBuffer","encodingBufferMaxSize","encodingBufferInitialSize","encodingBufferIncrement","BufferWriter","$0","$byteLength","_$writeHead","_$resizable","_$bytes","_$base","_$dataView","$reset","$viewBytes","subarray","$copyBytes","buf","_$pre","setInt8","setInt16","setInt32","setUint8","setUint16","setUint32","setFloat32","setFloat64","bytes","_$malloc","currentBytes","minNewBytes","availableBytes","increment","newBytes","newSize","BufferReader","headerBytes","offset","dv","_$byteLength","getUint8","_$at","getUint32","getInt8","getInt16","getInt32","getFloat32","getFloat64","BufferFormat","def","_$hasValidationOrTransforms","includes","_$type","TypeError","_$fieldsMap","_$fields","keys","map","name","Field","_$header","isValidHeader","h","isInteger","_$format","v","join","_$initWriter","_$globalWriter","encodeInto","encodeIntoLength","_$preprocess","_b","_$intoWriter","_$write","preserveBytes","_$writer","decodeInto","obj","_$decode","setTransforms","transforms","_$transforms","field","$coder","setValidation","validations","_$validate","_$reader","_$read","bw","safeValue","fields","subValue","$name","$isOptional","coders.boolCoder","$isArray","_$writeArray","_$processValidation","_$postprocess","res","state","_$compileFormatReadFn","_$makeObjectReadFnBody","fieldsStr","_$readField","fieldIndex","_$readArray","Function","coders.uintCoder","arr","j","rawType","_$formatString","bf16round","defineFormat","a","f16round","optional","t","scalround","c","assign","uscalround"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.cjs","sources":["../src/core/lib/errors.ts","../src/core/lib/hashCode.ts","../src/core/lib/peek.ts","../src/core/BufferParser.ts","../src/core/lib/math.ts","../src/core/lib/scalar.ts","../src/core/Type.ts","../src/core/lib/bitmask.ts","../src/core/lib/utf8.ts","../src/core/lib/float16.ts","../src/core/lib/bfloat16.ts","../src/core/lib/coders.ts","../src/core/config.ts","../src/core/lib/BufferWriter.ts","../src/core/lib/BufferReader.ts","../src/core/BufferFormat.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/unified-signatures */\n\nexport class TinybufError extends Error {}\n","/**\n * DJB2 hash algorithm (modified for 16-bit uints).\n *\n * DJB2 is a simple and widely used non-cryptographic\n * hash function created by Daniel J. Bernstein.\n *\n * @returns 16-bit unsigned integer\n */\nexport function $hashCode(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = (hash * 33) ^ str.charCodeAt(i);\n }\n return hash & 0xFFFF; // Ensure the result is a Uint16\n}\n\n/**\n * Returns an unsigned 16-bit integer hashcode for some string.\n * Prefers 2 character string.\n *\n * @returns A UInt16 between 0 and 65535 (inclusive).\n */\nexport function $strToHashCode(str: string): number {\n if (str.length !== 2) return $hashCode(str);\n return str.charCodeAt(0) * 256 + str.charCodeAt(1);\n}\n\n/**\n * Convert a UInt16 hashcode to a 2-byte string.\n */\nexport function $hashCodeToStr(hashCode: number): string {\n return String.fromCharCode(Math.floor(hashCode / 256)) + String.fromCharCode(hashCode % 256);\n}\n","import { $hashCodeToStr } from \"./hashCode\";\n\n\n/**\n * Read the header bytes of a buffer as a number.\n *\n * @throws {RangeError} if buffer size < 2\n */\nexport function peekHeader(b: ArrayBuffer | ArrayBufferView): number {\n if (b.byteLength < 2) {\n throw new RangeError(\"buffer length < 2\");\n }\n\n if (b instanceof Uint8Array) return (b[0] << 8) | b[1];\n if (b instanceof DataView) return b.getUint16(0, false);\n\n const u8 = ArrayBuffer.isView(b) ? new Uint8Array(b.buffer, b.byteOffset, 2) : new Uint8Array(b, 0, 2);\n\n return (u8[0] << 8) | u8[1];\n}\n\n/**\n * Read the header bytes of a buffer as a string.\n *\n * @throws {RangeError} if buffer length < 2\n */\nexport function peekHeaderStr(b: ArrayBuffer | ArrayBufferView): string {\n return $hashCodeToStr(peekHeader(b));\n}\n","import { BufferFormat } from \"./BufferFormat\";\nimport { EncoderDefinition, DecodedType } from \"./Type\";\nimport { TinybufError } from \"./lib/errors\";\nimport { $hashCodeToStr, $strToHashCode } from \"./lib/hashCode\";\nimport { peekHeader } from \"./lib/peek\";\n\ntype AnyFormat = BufferFormat;\ntype Uint16FormatHeader = number;\n\n/**\n * Small utility for registering and processing format handlers.\n *\n * @example\n * const myHandler = bufferParser()\n * .on(FormatA, aData => {})\n * .on(FormatB, bData => {});\n *\n * myHandler.processBuffer(bytes);\n */\nexport const bufferParser = (): BufferParser => new BufferParser();\n\nexport class BufferParser {\n /** @internal */\n private _$formats = new Map any, decodeInPlace: boolean]>();\n private _$data = new Map(); // used when decoding in-place\n\n /**\n * Decode an array buffer and trigger the relevant data handler.\n *\n * When passed an ArrayBufferView, accesses the underlying 'buffer' instance directly.\n *\n * @throws {TinybufError} if fails to decode, or no handler is registered\n */\n public processBuffer(b: ArrayBuffer | ArrayBufferView): void {\n let f: any, data: any, cb: (data: any) => any, r: boolean;\n\n try {\n const header = peekHeader(b);\n\n if (!this._$formats.has(header)) {\n throw new TinybufError(`Unknown format: ${header} '${$hashCodeToStr(header)}')`);\n }\n\n [f, cb, r] = this._$formats.get(header);\n if (r) data = this._$data.get(header) ?? {};\n data = f.decode(b, data);\n if (r) this._$data.set(header, data);\n }\n catch (e) {\n const err = new TinybufError(`Failed to decode: ${e}`);\n err.stack = e.stack;\n\n throw err;\n }\n\n cb(data);\n }\n\n /**\n * Register a format handler.\n */\n public on>(\n format: BufferFormat,\n callback: (data: TDecodedType) => any,\n {\n decodeInPlace = false,\n } = {},\n ): this {\n if (format.header == null) {\n throw new TinybufError(\"Format requires header\");\n }\n\n const header = typeof format.header === \"string\" ? $strToHashCode(format.header) : format.header;\n\n if (this._$formats.has(header) && this._$formats.get(header)?.[0] !== format) {\n throw new TinybufError(`Format header collision: ${format.header}`);\n }\n\n this._$formats.set(header, [format, callback, decodeInPlace]);\n\n return this;\n }\n\n /** Register a format (or formats) that are recognized. */\n public ignore(...format: AnyFormat[]): this {\n format.forEach(f => this.on(f, () => {}));\n return this;\n }\n\n /** Clears all registered formats and handlers. */\n public clear(): void {\n this._$formats.clear();\n this._$data.clear();\n }\n}\n","export const $floor = Math.floor,\n $ceil = Math.ceil;\n\n/** Clamp a number to a range. */\nexport const $clamp = (value: number, min: number, max: number): number =>\n value > max ? max : value < min ? min : value;\n\n/** Round toward zero */\nexport const $roundTowardZero = (x: number): number => x < 0 ? $ceil(x) : $floor(x);\n\n/** Round away zero */\nexport const $roundAwayFromZero = (x: number): number =>\n x < 0 ? $floor(x) : $ceil(x);\n","import { $clamp, $roundTowardZero, $roundAwayFromZero } from \"./math\";\n\n/**\n * Quantize a number to an 8-bit scalar between 0.0 and 1.0.\n *\n * @returns A number (double) in its closest signed scalar representation.\n */\nexport function uscalround(x: number): number {\n return $fromuscal8($touscal8(x));\n}\n\n/**\n * Quantize a number to an 8-bit signed scalar between -1.0 and 1.0.\n *\n * @returns A number (double) in its closest signed scalar representation.\n */\nexport function scalround(x: number): number {\n return $fromscal8($toscal8(x));\n}\n\n/** @returns A UInt8 bitmask representation. */\nexport function $touscal8(x: number): number {\n return $clamp(127 + $roundTowardZero(x * 254 - 127), 0, 254);\n}\n\n/** @returns A UInt8 bitmask representation. */\nexport function $toscal8(x: number): number {\n return $clamp($roundTowardZero(x * 127), -127, 127) + 127;\n}\n\n/** @returns An unsigned scalar between 0.0 and 1.0. */\nexport function $fromuscal8(x: number): number {\n // Make symmetric: (0.5 + round((uint8 - 127) / 254 * 100)) / 100\n return $clamp(($roundAwayFromZero((x - 127) * 0.3937007874015748) + 50) * 0.01, 0, 1);\n}\n\n/** @returns A signed scalar between -1.0 and 1.0. */\nexport function $fromscal8(x: number): number {\n // Make symmetric: round((uint8 - 127) / 127 * 100) / 100\n return $clamp($roundAwayFromZero((x - 127) * 0.787401574803149) * 0.01, -1, 1);\n}\n","/**\n * Field types for defining encoding formats.\n *\n * @see [Types](https://github.com/reececomo/tinybuf/blob/main/docs/types.md)\n */\nexport const Type = {\n /**\n * Unsigned integer (1 - 8 bytes).\n * - 0 → 127 = 1 byte\n * - 128 → 16,384 = 2 bytes\n * - 16,385 → 536,870,911 = 4 bytes\n * - 536,870,912 → `Number.MAX_SAFE_INTEGER` = 8 bytes\n */\n UInt: \"uint\",\n\n /** Unsigned 8-bit integer (between 0 and 255, 1 byte). */\n UInt8: \"u8\",\n\n /** Unsigned 16-bit integer (between 0 and 65,535, 2 bytes). */\n UInt16: \"u16\",\n\n /** Unsigned 32-bit integer (between 0 and 4,294,967,295, 4 bytes). */\n UInt32: \"u32\",\n\n /**\n * Signed integer (1 - 8 bytes).\n * - 0 → ±64 = 1 byte\n * - ±65 → ±8,192 = 2 bytes\n * - ±8,193 → ±268,435,456 = 4 bytes\n * - ±268,435,457 → ±`Number.MAX_SAFE_INTEGER` = 8 bytes\n */\n Int: \"int\",\n\n /** Signed 1 byte integer (between -127 and 127). */\n Int8: \"i8\",\n\n /** Signed 2 byte integer (between -32,767 and 32,767). */\n Int16: \"i16\",\n\n /** Signed 4 byte integer (between -2,147,483,647 and 2,147,483,647). */\n Int32: \"i32\",\n\n /** Default JavaScript `number` type. Floating-point number (64-bit, double precision, 8 bytes). */\n Float64: \"f64\",\n\n /** Floating-point number (32-bit, single precision, 4 bytes). */\n Float32: \"f32\",\n\n /**\n * Floating-point number (16-bit in FP16 format, half precision, 2 bytes).\n *\n * **Warning:** Low precision; maximum range: ±65,504.\n */\n Float16: \"f16\",\n\n /**\n * Floating-point number (16-bit in BF16 format, half precision, 2 bytes).\n *\n * **Warning:** Low precision.\n */\n BFloat16: \"b16\",\n\n /** A signed 2-decimal scalar between -1.00 and 1.00 (1 byte). */\n Scalar8: \"sc\",\n\n /** An unsigned 2-decimal scalar between 0.00 and 1.00 (1 byte). */\n UScalar8: \"usc\",\n\n /**\n * Boolean value (1 byte).\n * @see {Bools} for packing multiple booleans into a single byte.\n */\n Bool: \"bl\",\n\n /** Any array of booleans (1 bit overhead, encoded as UInt). */\n Bools: \"bls\",\n\n /** Any ArrayBuffer or ArrayBufferView (e.g. Uint8Array) value (encoded as 1 x UInt for byte length + buffer bytes). */\n Buffer: \"buf\",\n\n /** A UTF-8 string (encoded as 1 x UInt for UTF-8 byte length + UTF-8 bytes). */\n String: \"str\",\n\n /** Any JSON data (encodes as UTF-8). */\n JSON: \"jsn\",\n\n /** JavaScript RegExp object. */\n RegExp: \"re\",\n\n /**\n * JavaScript Date object.\n *\n * Encoded as an 8 byte (64-bit) integer UTC timestamp from as the number\n * of milliseconds since the Unix Epoch (January 1, 1970, 00:00:00 UTC).\n *\n * @see {Date}\n */\n Date: \"dt\",\n} as const;\n\nexport type TypeLiteral = typeof Type[keyof typeof Type];\nexport const ValidTypes = Object.values(Type);\n\n/**\n * Mappings for the value types.\n */\nexport type ValueTypes = {\n [Type.Int]: number;\n [Type.Int8]: number;\n [Type.Int16]: number;\n [Type.Int32]: number;\n [Type.UInt]: number;\n [Type.UInt8]: number;\n [Type.UInt16]: number;\n [Type.UInt32]: number;\n [Type.Float64]: number;\n [Type.Float32]: number;\n [Type.Float16]: number;\n [Type.BFloat16]: number;\n [Type.Scalar8]: number;\n [Type.UScalar8]: number;\n [Type.Bool]: boolean;\n [Type.Bools]: boolean[];\n [Type.Buffer]: Uint8Array | ArrayBuffer | ArrayBufferView;\n [Type.String]: string;\n [Type.JSON]: any;\n [Type.RegExp]: RegExp;\n [Type.Date]: Date;\n};\n\n/** https://www.totaltypescript.com/concepts/the-prettify-helper */\ntype Pretty = T extends ArrayBuffer | ArrayBufferView | Date | RegExp | Uint8Array ? T\n : T extends Array ? Array>\n : T extends object ? {[K in keyof T]: Pretty} & unknown : T;\n\n/** @throws any error too */\nexport type ValidationFn = (x: T) => undefined | boolean | Error;\nexport type TransformFn = (x: T) => T;\nexport type Transforms = TransformFn | [preEncode: TransformFn] | [preEncode: TransformFn | undefined, postDecode: TransformFn | undefined];\n\n/**\n * A wrapper around any Type definition that declares it as optional.\n */\nexport class MaybeType {\n public constructor(public type: T) {}\n}\n\n/**\n * Wrap any definition as optional.\n */\nexport function optional(t: T): MaybeType {\n return new MaybeType(t);\n}\n\n/**\n * A definition for an object binary encoder.\n */\nexport type EncoderDefinition = {\n [key: string]: FieldDefinition | MaybeType;\n};\n\n/**\n * Definition for an object-field binary encoder.\n */\nexport type FieldDefinition = keyof ValueTypes | [keyof ValueTypes] | EncoderDefinition | [EncoderDefinition] | MaybeType;\n\n/**\n * The resulting type of the decoded data, based on the encoder definition.\n */\ntype RawDecodedType = {\n [EKey in keyof EncoderType as EncoderType[EKey] extends MaybeType ? never : EKey]: EncoderType[EKey] extends keyof ValueTypes\n ? ValueTypes[EncoderType[EKey]]\n : EncoderType[EKey] extends [keyof ValueTypes]\n ? Array\n : EncoderType[EKey] extends EncoderDefinition\n ? RawDecodedType\n : EncoderType[EKey] extends [EncoderDefinition]\n ? Array>\n : never;\n} & {\n [EKey in keyof EncoderType as EncoderType[EKey] extends MaybeType ? EKey : never]?: EncoderType[EKey] extends MaybeType\n ? ValueTypes[OptionalValue] | undefined\n : EncoderType[EKey] extends MaybeType\n ? Array | undefined\n : EncoderType[EKey] extends MaybeType\n ? RawDecodedType | undefined\n : never;\n};\n\nexport type DecodedType = Pretty>;\n\nexport type TransformConfig = {\n [EKey in keyof EncoderType]?: EncoderType[EKey] extends keyof ValueTypes\n ? Transforms\n : EncoderType[EKey] extends [keyof ValueTypes]\n ? Transforms\n : EncoderType[EKey] extends EncoderDefinition\n ? TransformConfig\n : EncoderType[EKey] extends [EncoderDefinition]\n ? TransformConfig\n : EncoderType[EKey] extends MaybeType\n ? Transforms\n : EncoderType[EKey] extends MaybeType\n ? Transforms\n : EncoderType[EKey] extends MaybeType\n ? TransformConfig | undefined\n : never;\n};\n\nexport type ValidationConfig = {\n [EKey in keyof EncoderType]?: EncoderType[EKey] extends keyof ValueTypes\n ? ValidationFn\n : EncoderType[EKey] extends [keyof ValueTypes]\n ? ValidationFn\n : EncoderType[EKey] extends EncoderDefinition\n ? ValidationConfig\n : EncoderType[EKey] extends [EncoderDefinition]\n ? ValidationConfig\n : EncoderType[EKey] extends MaybeType\n ? ValidationFn\n : EncoderType[EKey] extends MaybeType\n ? ValidationFn\n : EncoderType[EKey] extends MaybeType\n ? ValidationConfig | undefined\n : never;\n};\n","/**\n * Mask booleans to a uint32.\n *\n * @param x - A boolean array.\n * @param padBit - A bit to pad the mask (for variable length data).\n */\nexport const mask = (x: boolean[], padBit: 0 | 1 = 0b1): number => {\n return x.reduce((n, b: any) => (n << 1) | b, padBit);\n};\n\n/**\n * Unmask booleans from a uint32.\n *\n * @param x - A uint32 number.\n * @param l - number of booleans to expect (default: infer lenth from x where x is encoded with a pad bit)\n * or pass an existing boolean array to decode in-place.\n */\nexport const unmask = (x: number, l?: number | boolean[]): boolean[] => {\n const len = l === undefined ? 31 - Math.clz32(x) : Array.isArray(l) ? l.length : l;\n const val = Array.isArray(l) && l.length === len ? l : new Array(len);\n for (let i = 0; i < len; i++) val[i] = !!(x & (1 << (len - 1 - i)));\n return val;\n};\n","export const $utf8encode = (function () {\n const encoder = new TextEncoder();\n return (x?: string): Uint8Array => encoder.encode(x);\n})();\n\nexport const $utf8decode = (function () {\n const decoder = new TextDecoder(\"utf-8\");\n return (y: Uint8Array): string => decoder.decode(y);\n})();\n","/**\n * Returns the nearest half precision float representation of a number.\n * @param x A numeric expression.\n */\nexport function f16round(x: number): number {\n return $fromf16($tof16(x));\n}\n\n/**\n * Returns the nearest half precision float representation of a number as a 16-bit bitmask.\n */\nexport const $tof16 = (function() {\n const x = new Float32Array(1);\n const y = new Int32Array(x.buffer);\n\n return function (f: number) {\n x[0] = f;\n let i = y[0]; // 32-bit int\n let s = (i >> 16) & 0X8000; // sign\n let z = (i & 0X7FFFFFFF) + 0X1000 | 0;\n\n if (z >= 0X47800000) {\n if ((i & 0X7FFFFFFF) < 0X47800000) return s | 0X7BFF;\n if (z < 0X7F800000) return s | 0X7C00;\n return s | 0X7C00 | (i & 0X007FFFFF) >> 13;\n }\n if (z >= 0X38800000) return s | z - 0X38000000 >> 13;\n else if (z < 0X33000000) return s;\n z = (i & 0X7FFFFFFF) >> 23;\n return s | ((i & 0X7FFFFF | 0X800000)\n + (0X800000 >>> z - 102)\n >> 126 - z);\n };\n}());\n\n/**\n * Returns the nearest half precision float value for a 16-bit bitmask.\n */\nexport const $fromf16 = (function() {\n const z = Math.pow(2, -24); // subnormal constant\n const d = new Float32Array(32 + 1024);\n for (let e = 0; e < 32; e++) d[e] = Math.pow(2, e - 15); // biased exponents\n for (let m = 0; m < 1024; m++) d[m + 0x20] = 1 + m / 1024; // normalized offset mantissas\n\n return function (b: number): number {\n const s = (b & 32768) === 32768 ? -1 : 1; // sign: 1 bit\n const e = b & 31744; // exponent: 5 bits\n const m = b & 1023; // mantissa: 10 bits\n\n if (e === 0) return m === 0 ? s * 0 : s * z;\n if (e === 31744) return m === 0 ? s * Infinity : NaN;\n return d[e >> 10] * d[m + 0x20] * s;\n };\n}());\n","const i = new Uint32Array(1);\nconst f = new Float32Array(i.buffer);\n\n/**\n * Returns the nearest bfloat16 representation of a number.\n * @param x A numeric expression.\n */\nexport function bf16round(x: number): number {\n f[0] = x;\n i[0] = i[0] & 0xFFFF0000;\n return f[0];\n}\n\n/** Returns a 16-bit bfloat16 bitmask for a given float. */\nexport function $tobf16(x: number): number {\n f[0] = x;\n return i[0] >>> 16;\n}\n\n/** Returns the nearest value from a 16-bit bfloat16 bitmask. */\nexport function $frombf16(x: number): number {\n i[0] = x << 16;\n return f[0];\n}\n","import { BufferWriter } from \"./BufferWriter\";\nimport { BufferReader } from \"./BufferReader\";\nimport {\n $fromuscal8,\n $fromscal8,\n $touscal8,\n $toscal8\n} from \"./scalar\";\nimport { TypeLiteral, Type } from \"../Type\";\nimport { mask, unmask } from \"./bitmask\";\nimport { $utf8decode, $utf8encode } from \"./utf8\";\nimport { $floor } from \"./math\";\nimport { $fromf16, $tof16 } from \"./float16\";\nimport { $frombf16, $tobf16 } from \"./bfloat16\";\n\n// Pre-calculated constants\nconst MAX_VARUINT8 = 128,\n MAX_VARUINT16 = 16_384,\n MAX_VARUINT32 = 536_870_912,\n MAX_VARINT8 = 64,\n MAX_VARINT16 = 8_192,\n MAX_VARINT32 = 268_435_456,\n POW_32 = 0x100000000;\n\ntype WriterFn = (value: W, writer: BufferWriter) => void;\ntype ReaderFn = (reader: BufferReader, overwrite?: Partial) => R;\n\nexport interface BinaryTypeCoder {\n $write: WriterFn;\n $read: ReaderFn;\n}\n\n/**\n * Format (big-endian):\n * 7b 0xxxxxxx\n * 14b 10xxxxxx xxxxxxxx\n * 29b 110xxxxx xxxxxxxx xxxxxxxx xxxxxxxx\n * 61b 111xxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx\n */\nexport const uintCoder: BinaryTypeCoder = {\n $write: (value, writer) => {\n if (typeof value !== \"number\") value = Number(value);\n if (value < 0) value = 0;\n if (value < MAX_VARUINT8) writer.$writeUint8(value);\n else if (value < MAX_VARUINT16) writer.$writeUint16(value + 0x8000);\n else if (value < MAX_VARUINT32) writer.$writeUint32((value + 0xc0000000) | 0);\n else if (value >= MAX_VARUINT32) {\n writer.$writeUint32(($floor(value / POW_32) + 0xe0000000) | 0);\n writer.$writeUint16(value >>> 16);\n writer.$writeUint16(value & 0xffff);\n }\n else {\n // coercion case\n writer.$writeUint8(value as any === true ? 1 : 0);\n }\n },\n $read: (reader) => {\n const firstByte = reader.$peek();\n\n if (!(firstByte & 0x80)) {\n reader.$skip();\n return firstByte;\n }\n else if (!(firstByte & 0x40)) {\n return reader.$readUint16() - 0x8000;\n }\n else if (!(firstByte & 0x20)) {\n return reader.$readUint32() - 0xc0000000;\n }\n\n return (reader.$readUint32() - 0xe0000000) * POW_32\n + reader.$readUint32();\n }\n};\n\nexport const uint8Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint8(value),\n $read: (reader) => reader.$readUint8(),\n};\n\nexport const uint16Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint16(value),\n $read: (reader) => reader.$readUint16(),\n};\n\nexport const uint32Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint32(value),\n $read: (reader) => reader.$readUint32(),\n};\n\n/**\n * Format (big-endian):\n * 7b 0xxxxxxx\n * 14b 10xxxxxx xxxxxxxx\n * 29b 110xxxxx xxxxxxxx xxxxxxxx xxxxxxxx\n * 61b 111xxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx\n */\nexport const intCoder: BinaryTypeCoder = {\n $write: (value, writer) => {\n if (typeof value !== \"number\") value = Number(value);\n if (value >= -MAX_VARINT8 && value < MAX_VARINT8) writer.$writeUint8(value & 0x7f);\n else if (value >= -MAX_VARINT16 && value < MAX_VARINT16) writer.$writeUint16((value & 0x3fff) + 0x8000);\n else if (value >= -MAX_VARINT32 && value < MAX_VARINT32) writer.$writeUint32((value & 0x1fffffff) | 0xc0000000);\n else if (value < -MAX_VARINT32 || value >= MAX_VARINT32) {\n // Split in two 32b uints\n writer.$writeUint32(($floor(value / POW_32) & 0x1fffffff) | 0xe0000000);\n writer.$writeUint16(value >>> 16);\n writer.$writeUint16(value & 0xffff);\n }\n else {\n // coercion case\n writer.$writeUint8(value as any === true ? 0x7f : 0);\n }\n },\n $read: (reader) => {\n let firstByte = reader.$peek(), i: number;\n\n if (!(firstByte & 0x80)) {\n reader.$skip();\n return (firstByte & 0x40) ? (firstByte | 0xffffff80) : firstByte;\n }\n else if (!(firstByte & 0x40)) {\n i = reader.$readUint16() - 0x8000;\n return (i & 0x2000) ? (i | 0xffffc000) : i;\n }\n else if (!(firstByte & 0x20)) {\n i = reader.$readUint32() - 0xc0000000;\n return (i & 0x10000000) ? (i | 0xe0000000) : i;\n }\n else {\n i = reader.$readUint32() - 0xe0000000;\n i = (i & 0x10000000) ? (i | 0xe0000000) : i;\n return i * POW_32 + reader.$readUint32();\n }\n }\n};\n\nexport const int8Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeInt8(value),\n $read: (reader) => reader.$readInt8(),\n};\n\nexport const int16Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeInt16(value),\n $read: (reader) => reader.$readInt16(),\n};\n\nexport const int32Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeInt32(value),\n $read: (reader) => reader.$readInt32(),\n};\n\nexport const bfloat16Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint16($tobf16(value)),\n $read: (reader) => $frombf16(reader.$readUint16()),\n};\n\nexport const float16Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint16($tof16(value)),\n $read: (reader) => $fromf16(reader.$readUint16()),\n};\n\nexport const float32Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeFloat32(value),\n $read: (reader) => reader.$readFloat32(),\n};\n\nexport const float64Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeFloat64(value),\n $read: (reader) => reader.$readFloat64(),\n};\n\nexport const uscalar8Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint8($touscal8(value)),\n $read: (reader) => $fromuscal8(reader.$readUint8()),\n};\n\nexport const scalar8Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint8($toscal8(value)),\n $read: (reader) => $fromscal8(reader.$readUint8()),\n};\n\nexport const dateCoder: BinaryTypeCoder = {\n $write: (value, writer) => intCoder.$write(value.getTime(), writer),\n $read: (reader) => new Date(intCoder.$read(reader)),\n};\n\nexport const bufferCoder: BinaryTypeCoder = {\n $write: (value, writer) => {\n uintCoder.$write(value.byteLength, writer); // prefix length\n writer.$writeBytes(value);\n },\n $read: (reader) => reader.$readBytes(uintCoder.$read(reader)),\n};\n\nexport const stringCoder: BinaryTypeCoder = {\n $write: (value, writer) => bufferCoder.$write($utf8encode(value), writer),\n $read: (reader) => $utf8decode(bufferCoder.$read(reader)),\n};\n\nexport const boolCoder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint8(value ? 1 : 0),\n $read: (reader) => reader.$readUint8() !== 0,\n};\n\nexport const boolsCoder: BinaryTypeCoder = {\n $write: (value, writer) => {\n if (value.length > 28) value = value.slice(0, 28); // drop additional\n uintCoder.$write(mask(value), writer);\n },\n $read: (reader, p) => unmask(uintCoder.$read(reader), p),\n};\n\nexport const jsonCoder: BinaryTypeCoder = {\n $write: (value, writer) => stringCoder.$write(JSON.stringify(value), writer),\n $read: (reader) => JSON.parse(stringCoder.$read(reader)),\n};\n\nexport const regexCoder: BinaryTypeCoder = {\n $write: (value, writer) => {\n writer.$writeUint8(mask([value.global, value.ignoreCase, value.multiline]));\n stringCoder.$write(value.source, writer);\n },\n $read: (reader) => {\n const [g, i, m] = unmask(reader.$readUint8());\n return new RegExp(stringCoder.$read(reader), (g ? \"g\" : \"\") + (i ? \"i\" : \"\") + (m ? \"m\" : \"\"));\n }\n};\n\nexport const writers: Record> = {\n [Type.UInt]: uintCoder.$write,\n [Type.UInt8]: uint8Coder.$write,\n [Type.UInt16]: uint16Coder.$write,\n [Type.UInt32]: uint32Coder.$write,\n [Type.Int]: intCoder.$write,\n [Type.Int8]: int8Coder.$write,\n [Type.Int16]: int16Coder.$write,\n [Type.Int32]: int32Coder.$write,\n [Type.Float64]: float64Coder.$write,\n [Type.Float32]: float32Coder.$write,\n [Type.Float16]: float16Coder.$write,\n [Type.BFloat16]: bfloat16Coder.$write,\n [Type.Scalar8]: scalar8Coder.$write,\n [Type.UScalar8]: uscalar8Coder.$write,\n [Type.Bool]: boolCoder.$write,\n [Type.Bools]: boolsCoder.$write,\n [Type.Buffer]: bufferCoder.$write,\n [Type.String]: stringCoder.$write,\n [Type.JSON]: jsonCoder.$write,\n [Type.RegExp]: regexCoder.$write,\n [Type.Date]: dateCoder.$write,\n};\n\nexport const readers: Record> = {\n [Type.UInt]: uintCoder.$read,\n [Type.UInt8]: uint8Coder.$read,\n [Type.UInt16]: uint16Coder.$read,\n [Type.UInt32]: uint32Coder.$read,\n [Type.Int]: intCoder.$read,\n [Type.Int8]: int8Coder.$read,\n [Type.Int16]: int16Coder.$read,\n [Type.Int32]: int32Coder.$read,\n [Type.Float64]: float64Coder.$read,\n [Type.Float32]: float32Coder.$read,\n [Type.Float16]: float16Coder.$read,\n [Type.BFloat16]: bfloat16Coder.$read,\n [Type.Scalar8]: scalar8Coder.$read,\n [Type.UScalar8]: uscalar8Coder.$read,\n [Type.Bool]: boolCoder.$read,\n [Type.Bools]: boolsCoder.$read,\n [Type.Buffer]: bufferCoder.$read,\n [Type.String]: stringCoder.$read,\n [Type.JSON]: jsonCoder.$read,\n [Type.RegExp]: regexCoder.$read,\n [Type.Date]: dateCoder.$read,\n};\n","/** Default maximum transmission unit in networking */\nconst MTU = 1500;\n\n/** Set Tinybuf global config */\nexport const setTinybufConfig = (c: Partial): void => {\n cfg = { ...cfg, ...c };\n};\n\nexport type TinybufConfig = {\n /**\n * (default: false)\n *\n * This sets the default value for `preserveBytes` on\n * `encode(data, preserveBytes?)`.\n *\n * By default, `encode()` returns its encoded bytes as a `Uint8Array`\n * view of the bytes in the shared encoding buffer.\n *\n * This is suitable for synchronous use (e.g. high-performance applications)\n * as it avoids slow and expensive memory allocation and fragmentation on\n * each call to `encode()`.\n *\n * However, susbsequent calls are destructive to the underlying bytes, so\n * for asynchronous uses (e.g. Promises, Workers, long-lived storage), set\n * `preserveBytes` to `true`.\n */\n safe: boolean,\n\n /**\n * (default: true)\n * By default, format encoders share a global encoding buffer for performance\n * and memory management reasons.\n *\n * When set to false, each format is allocated an individual encoding buffer.\n *\n * Enable to maximise performance and memory re-use, just be cautious of\n * possible race conditions.\n */\n useGlobalEncodingBuffer: boolean,\n\n /**\n * (default: 1500)\n * The maximum bytes that can be allocated to an encoding buffer.\n *\n * Default is 1500 bytes, the standard \"Maximum Transmission Unit\".\n */\n encodingBufferMaxSize: number,\n\n /**\n * (default: 256)\n * Initial bytes to allocate for an encoding buffer.\n */\n encodingBufferInitialSize: number,\n\n /**\n * (default: 256)\n * Additional bytes to allocated when dynamically increasing the size of an encoding buffer.\n */\n encodingBufferIncrement: number,\n};\n\n/** @internal */\nexport let cfg: TinybufConfig = {\n safe: false,\n useGlobalEncodingBuffer: true,\n encodingBufferMaxSize: MTU,\n encodingBufferInitialSize: 256,\n encodingBufferIncrement: 256,\n};\n","import { cfg } from \"../config\";\nimport { TinybufError } from \"./errors\";\n\n/**\n * Wraps a buffer with a write head pointer.\n *\n * @internal\n */\nexport class BufferWriter {\n public $byteLength: number = 0;\n private _$dataView: DataView;\n private _$bytes: Uint8Array;\n private _$base: number;\n private _$writeHead: number = 0;\n private _$resizable: boolean;\n\n public constructor($0: number | Uint8Array) {\n this._$resizable = typeof $0 === \"number\";\n let b = $0 instanceof Uint8Array ? $0 : new Uint8Array($0);\n this._$bytes = b;\n this._$base = b.byteOffset;\n this._$dataView = new DataView(b.buffer);\n }\n\n /** Retarget the writer to a fixed-size byte array, reusing the existing DataView where possible. */\n public $reset(b: Uint8Array): this {\n if (this._$dataView.buffer !== b.buffer) {\n this._$dataView = new DataView(b.buffer);\n }\n\n this._$bytes = b;\n this._$base = b.byteOffset;\n this._$resizable = false;\n this._$writeHead = 0;\n this.$byteLength = 0;\n\n return this;\n }\n\n public $viewBytes(): Uint8Array {\n return this._$bytes.subarray(0, this.$byteLength);\n }\n\n public $copyBytes(): Uint8Array {\n const buf = new Uint8Array(this.$byteLength);\n buf.set(this.$viewBytes());\n return buf;\n }\n\n // ----- Writers: -----\n\n public $writeInt8(value: number): void {\n this._$pre(1).setInt8(this._$writeHead, value);\n }\n\n public $writeInt16(value: number): void {\n this._$pre(2).setInt16(this._$writeHead, value, true);\n }\n\n public $writeInt32(value: number): void {\n this._$pre(4).setInt32(this._$writeHead, value, true);\n }\n\n public $writeUint8(value: number): void {\n this._$pre(1).setUint8(this._$writeHead, value);\n }\n\n public $writeUint16(value: number): void {\n this._$pre(2).setUint16(this._$writeHead, value, false); // big-endian for varint\n }\n\n public $writeUint32(value: number): void {\n this._$pre(4).setUint32(this._$writeHead, value, false); // big-endian for varint\n }\n\n public $writeFloat32(value: number): void {\n this._$pre(4).setFloat32(this._$writeHead, value, true);\n }\n\n public $writeFloat64(value: number): void {\n this._$pre(8).setFloat64(this._$writeHead, value, true);\n }\n\n public $writeBytes(b: Uint8Array | ArrayBuffer | ArrayBufferView): void {\n // allocate bytes first\n this._$pre(b.byteLength);\n\n this._$bytes.set(\n b instanceof Uint8Array\n ? b\n : ArrayBuffer.isView(b)\n ? new Uint8Array(b.buffer, b.byteOffset, b.byteLength)\n : new Uint8Array(b),\n this._$writeHead - this._$base\n );\n }\n\n // ----- Private methods: -----\n\n /**\n * Pre-allocate some bytes on the dataview, moving the write head into\n * position.\n *\n * @throws TinybufError\n */\n private _$pre(bytes: number): DataView {\n if (this.$byteLength + bytes > this._$bytes.byteLength) {\n this._$malloc(bytes);\n }\n\n this._$writeHead = this._$base + this.$byteLength;\n this.$byteLength += bytes;\n\n return this._$dataView;\n }\n\n /**\n * @throws TinybufError\n */\n private _$malloc(bytes: number): void {\n if (!this._$resizable) {\n throw new TinybufError(\"exceeded buffer length: \" + this._$bytes.byteLength);\n }\n\n const currentBytes = this._$bytes.byteLength;\n const minNewBytes = this.$byteLength + bytes - currentBytes;\n const availableBytes = cfg.encodingBufferMaxSize - currentBytes;\n\n if (minNewBytes > availableBytes) {\n throw new TinybufError(\"exceeded encodingBufferMaxSize: \" + cfg.encodingBufferMaxSize);\n }\n\n const increment = cfg.encodingBufferIncrement;\n const newBytes = Math.ceil(minNewBytes / increment) * increment;\n const newSize = currentBytes + Math.min(newBytes, availableBytes);\n const buf = new Uint8Array(newSize);\n\n // copy bytes\n buf.set(this._$bytes);\n\n // update refs\n this._$dataView = new DataView(buf.buffer);\n this._$bytes = buf;\n this._$base = 0;\n }\n}\n","/**\n * Wraps a buffer with a read head pointer.\n *\n * @internal\n */\nexport class BufferReader {\n public i: number;\n private _$dataView!: DataView;\n private _$base!: number;\n private _$byteLength!: number;\n\n public constructor(b: Uint8Array | ArrayBufferView | ArrayBuffer, headerBytes?: number) {\n this.$reset(b, headerBytes);\n }\n\n /** Retarget the reader to a new buffer, reusing the existing DataView where possible. */\n public $reset(b: Uint8Array | ArrayBufferView | ArrayBuffer, headerBytes?: number): this {\n const isView = ArrayBuffer.isView(b);\n const buffer = isView ? b.buffer : b;\n const offset = isView ? b.byteOffset : 0;\n let dv = this._$dataView;\n\n if (\n dv === undefined\n || dv.buffer !== buffer\n || offset < dv.byteOffset\n || offset + b.byteLength > dv.byteOffset + dv.byteLength\n ) {\n dv = this._$dataView = b instanceof DataView ? b : new DataView(buffer);\n }\n\n this._$base = offset - dv.byteOffset;\n this._$byteLength = b.byteLength;\n this.i = headerBytes ?? 0; // internal offset (header)\n\n return this;\n }\n\n /** Read the next byte, without moving the read head pointer. */\n public $peek(): number {\n if (this.i >= this._$byteLength) {\n throw new RangeError(\"exceeded bytes\");\n }\n\n return this._$dataView.getUint8(this._$base + this.i);\n }\n\n /** Skip the next byte without reading it. */\n public $skip(): void {\n this.i++;\n }\n\n // ----- Readers: -----\n\n public $readUint8(): number {\n return this._$dataView.getUint8(this._$at(1));\n }\n\n public $readUint16(): number {\n return this._$dataView.getUint16(this._$at(2)); // big-endian\n }\n\n public $readUint32(): number {\n return this._$dataView.getUint32(this._$at(4)); // big-endian\n }\n\n public $readInt8(): number {\n return this._$dataView.getInt8(this._$at(1));\n }\n\n public $readInt16(): number {\n return this._$dataView.getInt16(this._$at(2), true); // little-endian\n }\n\n public $readInt32(): number {\n return this._$dataView.getInt32(this._$at(4), true); // little-endian\n }\n\n public $readFloat32(): number {\n return this._$dataView.getFloat32(this._$at(4), true); // little-endian\n }\n\n public $readFloat64(): number {\n return this._$dataView.getFloat64(this._$at(8), true); // little-endian\n }\n\n /** @throws RangeError if exceeds length */\n public $readBytes(bytes: number): Uint8Array {\n return new Uint8Array(\n this._$dataView.buffer,\n this._$dataView.byteOffset + this._$at(bytes),\n bytes\n );\n }\n\n // ----- Private methods: -----\n\n /**\n * Advance the read head, returning the DataView offset to read from.\n *\n * @throws RangeError if exceeds length\n */\n private _$at(bytes: number): number {\n const i = this.i;\n\n if (i + bytes > this._$byteLength) {\n throw new RangeError(\"exceeded bytes\");\n }\n\n this.i = i + bytes;\n\n return this._$base + i;\n }\n}\n","/* eslint-disable @typescript-eslint/unified-signatures */\nimport { writers, readers } from \"./lib/coders\";\nimport * as coders from \"./lib/coders\";\nimport { $hashCode, $strToHashCode } from \"./lib/hashCode\";\nimport { peekHeader, peekHeaderStr } from \"./lib/peek\";\nimport { BufferWriter } from \"./lib/BufferWriter\";\nimport { BufferReader } from \"./lib/BufferReader\";\nimport {\n DecodedType,\n EncoderDefinition,\n FieldDefinition,\n TransformConfig,\n ValidationConfig,\n MaybeType,\n Transforms,\n TypeLiteral,\n ValidationFn,\n ValidTypes,\n} from \"./Type\";\nimport { cfg } from \"./config\";\n\nconst spareArrayElements = new WeakMap();\n\nexport type FormatHeader = string | number;\n\n/**\n * Utility to get the decoded type of a buffer format\n * @example type Format = Decoded\n */\nexport type Decoded = TBufferFormat extends BufferFormat\n ? DecodedType\n : never;\n\n/**\n * Defines a format for encoding/decoding binary buffers.\n *\n * Optionally customize the identifier, either as a 2-byte string, an unsigned integer (0 -> 65,535), or as `null` to disable entirely.\n *\n * @example\n * const MyFormat = defineFormat({ ... });\n * const MyFormat = defineFormat('ab', { ... });\n * const MyFormat = defineFormat(1234, { ... });\n * const MyFormat = defineFormat(null, { ... });\n */\nexport function defineFormat(def: T): BufferFormat;\n/**\n * Defines a format for encoding/decoding binary buffers.\n *\n * Optionally customize the identifier, either as a 2-byte string, an unsigned integer (0 -> 65,535), or as `null` to disable entirely.\n *\n * @example\n * const MyFormat = defineFormat({ ... });\n * const MyFormat = defineFormat('ab', { ... });\n * const MyFormat = defineFormat(1234, { ... });\n * const MyFormat = defineFormat(null, { ... });\n */\nexport function defineFormat(h: HeaderType | null, def: T): BufferFormat;\nexport function defineFormat(a?: HeaderType | T, b?: T): BufferFormat {\n return a !== null && typeof a === \"object\"\n ? new BufferFormat(a as T)\n : new BufferFormat(b as T, a as HeaderType);\n}\n\nfunction isValidHeader(h: FormatHeader): boolean {\n if (typeof h === \"number\") return Number.isInteger(h) && h >= 0 && h <= 65_535;\n if (typeof h === \"string\") return new TextEncoder().encode(h).byteLength === 2;\n return false;\n}\n\n/**\n * BufferFormat is a utility class for encoding and decoding binary data based\n * on a provided encoding format.\n *\n * @see {header}\n * @see {encode(data)}\n * @see {decode(binary)}\n */\nexport class BufferFormat {\n /** @internal */\n private static _$globalWriter?: BufferWriter;\n\n /**\n * A unique identifier encoded as the first 2 bytes (or `undefined` if headerless).\n *\n * @see {peekHeader(...)}\n * @see {peekHeaderStr(...)}\n */\n public header!: HeaderType;\n\n /** @internal */\n private _$header!: number; // always uint16 vesion\n /** @internal */\n private _$type!: TypeLiteral;\n /** @internal */\n private _$fields!: Field[];\n /** @internal */\n private _$fieldsMap!: Map;\n\n /** @internal */\n private _$format?: string;\n /** @internal */\n private _$transforms?: Transforms | undefined;\n /** @internal */\n private _$validate?: ValidationFn | undefined;\n /** @internal */\n private _$hasValidationOrTransforms = false;\n /** @internal */\n private _$writer?: BufferWriter;\n /** @internal */\n private _$intoWriter?: BufferWriter;\n /** @internal */\n private _$reader?: BufferReader;\n\n public constructor(\n def: EncoderType,\n header?: HeaderType | null,\n ) {\n // set definition\n if (typeof def === \"string\" && ValidTypes.includes(def)) {\n this._$type = def;\n }\n else if (def instanceof MaybeType) {\n throw new TypeError(\"Format cannot be optional\");\n }\n else if (def instanceof Object) {\n this._$type = undefined; // object\n this._$fieldsMap = new Map();\n this._$fields = Object.keys(def).map((name) => {\n const f = new Field(name, def[name]);\n this._$fieldsMap.set(name, f); // also set map entry\n return f;\n });\n\n // set headers\n if (header === undefined) {\n this.header = $hashCode(this.f) as HeaderType; // automatic\n this._$header = this.header as number;\n }\n else if (header === null) {\n this.header = undefined; // headerless\n this._$header = undefined;\n }\n else if (isValidHeader(header)) {\n this.header = header; // manual\n this._$header = typeof header === \"number\" ? header : $strToHashCode(header);\n }\n else {\n throw new TypeError(\"Header must be 2-byte string, uint16, or null.\");\n }\n }\n else {\n throw new TypeError(\"Format must be object or Type\");\n }\n }\n\n // ----- Static methods: -----\n\n /**\n * Read the header of a buffer as a number.\n *\n * @see {header}\n * @throws {RangeError} if buffer size < 2\n */\n public static peekHeader = peekHeader;\n\n /**\n * Read the header of a buffer as a string.\n *\n * @see {header}\n * @throws {RangeError} if buffer size < 2\n */\n public static peekHeaderStr = peekHeaderStr;\n\n // ----- Accessors: -----\n\n /**\n * @example \"{uint8,str[]?}\"\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n private get f(): string {\n if (this._$format === undefined) {\n this._$format = this._$fields !== undefined\n ? `{${this._$fields.map(v => v.f).join(\",\")}}`\n : `${this._$type}`;\n }\n\n return this._$format;\n }\n\n /** @internal */\n private static _$initWriter(): BufferWriter {\n if (cfg.useGlobalEncodingBuffer) {\n if (!BufferFormat._$globalWriter) {\n this._$globalWriter = new BufferWriter(cfg.encodingBufferMaxSize);\n }\n\n return this._$globalWriter;\n }\n\n return new BufferWriter(cfg.encodingBufferInitialSize);\n }\n\n /**\n * Encode an object into an existing byte array.\n *\n * **Warning:** Returns an unsafe view into the encoding buffer. Pass this reference to preserve\n * performance, and to minimize memory allocation and fragmentation.\n */\n public encodeInto>(\n data: TDecodedType,\n bytes: Uint8Array,\n ): Uint8Array {\n return bytes.subarray(0, this.encodeIntoLength(data, bytes));\n }\n\n /**\n * Encode an object into an existing byte array, without allocating a view.\n *\n * @returns the number of bytes written to the start of `bytes`\n * @throws if fails to encode value to schema, or `bytes` is too small\n */\n public encodeIntoLength>(\n data: TDecodedType,\n bytes: Uint8Array,\n ): number {\n if (this._$hasValidationOrTransforms) {\n data = this._$preprocess(data);\n }\n\n const writer = this._$intoWriter?.$reset(bytes) ?? new BufferWriter(bytes);\n this._$intoWriter = undefined;\n\n try {\n this._$write(data, writer);\n\n return writer.$byteLength;\n }\n finally {\n this._$intoWriter = writer;\n }\n }\n\n /**\n * Encode an object to bytes.\n *\n * **Warning:** Returns an unsafe view into the encoding buffer. Pass this reference to preserve\n * performance, and to minimize memory allocation and fragmentation.\n *\n * @param data - data to encode\n * @param preserveBytes - (default: `setTinybufConfig().safe`) When set to true, copies encoded\n * bytes to a new buffer. When set to false, returns an unsafe view of bytes but prevents\n * unnnecessary memory allocation and fragmentation.\n *\n * @returns a copy of encoded bytes\n * @throws if fails to encode value to schema\n */\n public encode>(\n data: TDecodedType,\n preserveBytes?: boolean,\n ): Uint8Array {\n if (!this._$writer) {\n // lazy init\n this._$writer = BufferFormat._$initWriter();\n }\n\n // reset\n this._$writer.$byteLength = 0;\n\n if (this._$hasValidationOrTransforms) {\n data = this._$preprocess(data);\n }\n\n this._$write(data, this._$writer);\n\n return (preserveBytes ?? cfg.safe)\n ? this._$writer.$copyBytes()\n : this._$writer.$viewBytes();\n }\n\n /**\n * Decode binary data into an existing object instance.\n * @throws if fails to decode bytes to schema.\n */\n public decodeInto>(\n bytes: Uint8Array | ArrayBufferView | ArrayBuffer,\n obj: Partial,\n ): TDecodedType {\n return this._$decode(bytes, obj);\n }\n /**\n * Decode binary data to an object.\n * @throws if fails to decode bytes to schema.\n */\n public decode>(\n bytes: Uint8Array | ArrayBufferView | ArrayBuffer\n ): TDecodedType;\n /**\n * @deprecated use decodeInto() instead\n */\n public decode>(\n bytes: Uint8Array | ArrayBufferView | ArrayBuffer,\n decodeInto: Partial,\n ): TDecodedType;\n /**\n * Decode binary data to an object.\n * @throws if fails to decode bytes to schema.\n */\n public decode>(\n bytes: Uint8Array | ArrayBufferView | ArrayBuffer,\n decodeInto?: Partial | undefined,\n ): TDecodedType {\n return this._$decode(bytes, decodeInto);\n }\n\n /**\n * Set additional transform functions to apply before encoding and after decoding.\n */\n public setTransforms(transforms: TransformConfig | Transforms): this {\n this._$hasValidationOrTransforms = true;\n\n if (typeof transforms === \"function\" || (Array.isArray(transforms) && typeof transforms[0] === \"function\")) {\n this._$transforms = transforms;\n }\n else {\n for (const name of Object.keys(transforms)) {\n const field = this._$fieldsMap.get(name);\n if (!field) {\n throw new TypeError(`Failed to set transforms for field '${name}'`);\n }\n\n // Set validation for object.\n field.$coder.setTransforms(transforms[name]);\n }\n }\n\n return this;\n }\n\n /**\n * Set additional validation rules which are applied on encode() and decode().\n *\n * - Validation functions should throw an error, return an error, or return boolean false.\n * - Anything else is treated as successfully passing validation.\n */\n public setValidation(validations: ValidationConfig | ValidationFn): this {\n this._$hasValidationOrTransforms = true;\n\n if (typeof validations === \"function\") {\n this._$validate = validations;\n }\n else {\n for (const name of Object.keys(validations)) {\n const field = this._$fieldsMap.get(name);\n if (!field) {\n throw new TypeError(`Failed to set validation function for field '${name}'`);\n }\n\n field.$coder.setValidation(validations[name]);\n }\n }\n\n return this;\n }\n\n // ----- Implementation: -----\n\n /** @internal */\n private _$decode(\n bytes: Uint8Array | ArrayBufferView | ArrayBuffer,\n obj: Partial | undefined,\n ): TDecodedType {\n const headerBytes = this.header === undefined ? 0 : 2;\n\n const reader = this._$reader?.$reset(bytes, headerBytes) ?? new BufferReader(bytes, headerBytes);\n this._$reader = undefined;\n\n try {\n return this._$read(reader, obj);\n }\n finally {\n this._$reader = reader;\n }\n }\n\n /**\n * @param value\n * @param bw\n * @throws if the value is invalid\n *\n * @internal\n */\n private _$write(value: any, bw: BufferWriter): void {\n // write header\n if (this._$header !== undefined) bw.$writeUint16(this._$header);\n\n // write scalar\n if (this._$type !== undefined) {\n const safeValue = (this._$validate || this._$transforms) ? this._$preprocess(value) : value;\n\n return writers[this._$type](safeValue, bw);\n }\n\n // check for object type\n if (typeof value !== \"object\" || !value) {\n throw new TypeError(\"expected object type\");\n }\n\n // write each field\n const fields = this._$fields;\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n const subValue = value[field.$name];\n\n if (field.$isOptional) {\n if (subValue === undefined || subValue === null) {\n coders.boolCoder.$write(false, bw);\n continue; // skip\n }\n else {\n coders.boolCoder.$write(true, bw);\n }\n }\n else if (subValue == null) {\n throw new Error(`missing required value: ${field.$name}`);\n }\n\n if (field.$isArray) {\n // array\n this._$writeArray(subValue, bw, field.$coder);\n continue;\n }\n\n // scalar/object field\n field.$coder._$write(subValue, bw);\n }\n }\n\n /**\n * pre-process: validation and/or transforms\n * @internal\n */\n private _$preprocess>(data: T): T {\n if (this._$validate) this._$processValidation(data);\n\n if (typeof this._$transforms === \"function\") {\n return this._$transforms(data);\n }\n else if (Array.isArray(this._$transforms) && typeof this._$transforms[0] === \"function\") {\n return this._$transforms[0](data);\n }\n\n return data;\n }\n\n /**\n * post-process: validation and/or transforms\n * @internal\n */\n private _$postprocess>(data: T): T {\n if (Array.isArray(this._$transforms) && typeof this._$transforms[1] === \"function\") {\n data = this._$transforms[1](data);\n }\n\n if (this._$validate) this._$processValidation(data);\n\n return data;\n }\n\n private _$processValidation(data: any): void {\n if (!this._$validate) return;\n const res = this._$validate(data);\n if (res instanceof Error) throw res;\n if (res === false) throw new Error(\"failed validation\");\n }\n\n /**\n * This function will be executed only the first time\n * After that, we'll compile the read routine and add it directly to the instance\n * @param state\n * @returns\n * @throws if fails\n *\n * @internal\n */\n private _$read>(state: BufferReader, obj?: Partial): TDecodedType {\n // This function will be executed only the first time to compile the read routine.\n // After that, we'll compile the read routine and add it directly to the instance\n\n // Update the read method implementation.\n this._$read = this._$compileFormatReadFn();\n\n return this._$read(state, obj);\n }\n\n /**\n * Generate read function code for this coder.\n *\n * @example\n * let v=o??{};\n * v.prop1=this._$readField(0,s,o);\n * v.prop2=this._$readField(1,s,o);\n * return v\n *\n * @internal\n */\n private _$makeObjectReadFnBody(): string {\n const fieldsStr: string = this._$fields\n .map(({ $name: n }, i) => `v.${n}=this.${this._$readField.name}(${i},s,v.${n})`)\n .join(\";\");\n\n return `let v=o??{};${fieldsStr};return v;`;\n }\n\n /**\n * Read an individual field.\n * @internal\n */\n private _$readField(fieldIndex: number, state: BufferReader, obj?: any): any {\n const field = this._$fields[fieldIndex];\n\n if (field.$isOptional && !coders.boolCoder.$read(state)) {\n return undefined;\n }\n\n if (field.$isArray) {\n return this._$readArray(field.$coder, state, obj);\n }\n\n return field.$coder._$read(state, obj);\n }\n\n /**\n * Compile the decode() method for this object.\n *\n * @internal\n */\n private _$compileFormatReadFn>(): (state: BufferReader, obj: Partial | undefined) => TDecodedType {\n if (this._$type !== undefined) {\n // scalar type\n return this._$hasValidationOrTransforms\n ? (s) => this._$postprocess(readers[this._$type](s))\n : readers[this._$type];\n }\n\n // object type\n return new Function(\"s\", \"o\", this._$makeObjectReadFnBody()) as any;\n }\n\n /**\n * @internal\n */\n private _$writeArray(value: any[], bw: BufferWriter, type: BufferFormat): void {\n if (!Array.isArray(value)) {\n throw new TypeError(`expected array, instead got: ${value}`);\n }\n\n coders.uintCoder.$write(value.length, bw);\n for (let i = 0; i < value.length; i++) {\n type._$write(value[i], bw);\n }\n }\n\n /**\n * @throws if invalid data\n * @internal\n */\n private _$readArray(type: BufferFormat, state: any, obj?: Array): Array {\n const len = coders.uintCoder.$read(state);\n const arr = Array.isArray(obj) ? obj : new Array(len);\n const prevLen = Array.isArray(obj) ? arr.length : 0;\n let spare: any[] | undefined;\n\n if (prevLen !== len && type._$type === undefined) {\n spare = spareArrayElements.get(arr);\n\n if (len < prevLen) {\n if (spare === undefined) spareArrayElements.set(arr, spare = []);\n for (let j = len; j < prevLen; j++) {\n if (arr[j] != null) spare.push(arr[j]);\n }\n }\n }\n\n if (arr.length !== len) arr.length = len;\n for (let j = 0; j < len; j++) {\n arr[j] = type._$read(state, j < prevLen ? arr[j] : spare?.pop());\n }\n return arr;\n }\n}\n\n/**\n * Parses and represents an object field.\n *\n * @internal\n */\nclass Field {\n public $name: string;\n public $coder: BufferFormat;\n public $isOptional: boolean;\n public $isArray: boolean;\n\n private _$formatString?: string;\n\n public constructor(name: string, rawType: FieldDefinition) {\n this.$isOptional = rawType instanceof MaybeType;\n let type = rawType instanceof MaybeType ? rawType.type : rawType;\n\n this.$name = name;\n\n if (Array.isArray(type)) {\n if (type.length !== 1) {\n throw new TypeError(\"Array type must contain exactly one format\");\n }\n\n type = type[0];\n this.$isArray = true;\n }\n else {\n this.$isArray = false;\n }\n\n this.$coder = new BufferFormat(type, null);\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public get f(): string {\n if (this._$formatString === undefined) {\n this._$formatString = `${(this.$coder as any).f}${this.$isArray ? \"[]\" : \"\"}${this.$isOptional ? \"?\" : \"\"}`;\n }\n\n return this._$formatString;\n }\n}\n"],"names":["TinybufError","Error","$hashCode","str","hash","i","length","charCodeAt","$strToHashCode","$hashCodeToStr","hashCode","String","fromCharCode","Math","floor","peekHeader","b","byteLength","RangeError","Uint8Array","DataView","getUint16","u8","ArrayBuffer","isView","buffer","byteOffset","peekHeaderStr","BufferParser","constructor","this","_$formats","Map","_$data","processBuffer","f","data","cb","r","header","has","get","_a","decode","set","e","err","stack","on","format","callback","decodeInPlace","ignore","forEach","clear","$floor","$ceil","ceil","$clamp","value","min","max","$roundTowardZero","x","$roundAwayFromZero","$touscal8","$toscal8","$fromuscal8","$fromscal8","Type","UInt","UInt8","UInt16","UInt32","Int","Int8","Int16","Int32","Float64","Float32","Float16","BFloat16","Scalar8","UScalar8","Bool","Bools","Buffer","JSON","RegExp","Date","ValidTypes","Object","values","MaybeType","type","mask","padBit","reduce","n","unmask","l","len","undefined","clz32","Array","isArray","val","$utf8encode","encoder","TextEncoder","encode","$utf8decode","decoder","TextDecoder","y","$tof16","Float32Array","Int32Array","s","z","$fromf16","pow","d","m","Infinity","NaN","Uint32Array","MAX_VARUINT32","MAX_VARINT32","POW_32","uintCoder","$write","writer","Number","$writeUint8","$writeUint16","$writeUint32","$read","reader","firstByte","$peek","$readUint32","$readUint16","$skip","uint8Coder","$readUint8","uint16Coder","uint32Coder","intCoder","int8Coder","$writeInt8","$readInt8","int16Coder","$writeInt16","$readInt16","int32Coder","$writeInt32","$readInt32","bfloat16Coder","$tobf16","$frombf16","float16Coder","float32Coder","$writeFloat32","$readFloat32","float64Coder","$writeFloat64","$readFloat64","uscalar8Coder","scalar8Coder","dateCoder","getTime","bufferCoder","$writeBytes","$readBytes","stringCoder","boolCoder","boolsCoder","slice","p","jsonCoder","stringify","parse","regexCoder","global","ignoreCase","multiline","source","g","writers","readers","cfg","safe","useGlobalEncodingBuffer","encodingBufferMaxSize","encodingBufferInitialSize","encodingBufferIncrement","BufferWriter","$0","$byteLength","_$writeHead","_$resizable","_$bytes","_$base","_$dataView","$reset","$viewBytes","subarray","$copyBytes","buf","_$pre","setInt8","setInt16","setInt32","setUint8","setUint16","setUint32","setFloat32","setFloat64","bytes","_$malloc","currentBytes","minNewBytes","availableBytes","increment","newBytes","newSize","BufferReader","headerBytes","offset","dv","_$byteLength","getUint8","_$at","getUint32","getInt8","getInt16","getInt32","getFloat32","getFloat64","spareArrayElements","WeakMap","BufferFormat","def","_$hasValidationOrTransforms","includes","_$type","TypeError","_$fieldsMap","_$fields","keys","map","name","Field","_$header","isValidHeader","h","isInteger","_$format","v","join","_$initWriter","_$globalWriter","encodeInto","encodeIntoLength","_$preprocess","_b","_$intoWriter","_$write","preserveBytes","_$writer","decodeInto","obj","_$decode","setTransforms","transforms","_$transforms","field","$coder","setValidation","validations","_$validate","_$reader","_$read","bw","safeValue","fields","subValue","$name","$isOptional","coders.boolCoder","$isArray","_$writeArray","_$processValidation","_$postprocess","res","state","_$compileFormatReadFn","_$makeObjectReadFnBody","fieldsStr","_$readField","fieldIndex","_$readArray","Function","coders.uintCoder","arr","prevLen","spare","j","push","pop","rawType","_$formatString","bf16round","defineFormat","a","f16round","optional","t","scalround","c","assign","uscalround"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.mjs b/dist/index.mjs index 81596d4..837094e 100644 --- a/dist/index.mjs +++ b/dist/index.mjs @@ -1,2 +1,2 @@ -class TinybufError extends Error{}function $hashCode(t){let r=5381;for(let e=0;enew BufferParser;class BufferParser{constructor(){this.t=new Map,this.o=new Map}processBuffer(t){var r;let e,i,n,s;try{const o=peekHeader(t);if(!this.t.has(o))throw new TinybufError(`Unknown format: ${o} '${$hashCodeToStr(o)}')`);[e,n,s]=this.t.get(o),s&&(i=null!==(r=this.o.get(o))&&void 0!==r?r:{}),i=e.decode(t,i),s&&this.o.set(o,i)}catch(t){const r=new TinybufError(`Failed to decode: ${t}`);throw r.stack=t.stack,r}n(i)}on(t,r,{decodeInPlace:e=!1}={}){var i;if(null==t.header)throw new TinybufError("Format requires header");const n="string"==typeof t.header?$strToHashCode(t.header):t.header;if(this.t.has(n)&&(null===(i=this.t.get(n))||void 0===i?void 0:i[0])!==t)throw new TinybufError(`Format header collision: ${t.header}`);return this.t.set(n,[t,r,e]),this}ignore(...t){return t.forEach((t=>this.on(t,(()=>{})))),this}clear(){this.t.clear(),this.o.clear()}}const t=Math.floor,r=Math.ceil,$clamp=(t,r,e)=>t>e?e:te<0?r(e):t(e),$roundAwayFromZero=e=>e<0?t(e):r(e);function uscalround(t){return $fromuscal8($touscal8(t))}function scalround(t){return $fromscal8($toscal8(t))}function $touscal8(t){return $clamp(127+$roundTowardZero(254*t-127),0,254)}function $toscal8(t){return $clamp($roundTowardZero(127*t),-127,127)+127}function $fromuscal8(t){return $clamp(.01*($roundAwayFromZero(.3937007874015748*(t-127))+50),0,1)}function $fromscal8(t){return $clamp(.01*$roundAwayFromZero(.787401574803149*(t-127)),-1,1)}const e={UInt:"uint",UInt8:"u8",UInt16:"u16",UInt32:"u32",Int:"int",Int8:"i8",Int16:"i16",Int32:"i32",Float64:"f64",Float32:"f32",Float16:"f16",BFloat16:"b16",Scalar8:"sc",UScalar8:"usc",Bool:"bl",Bools:"bls",Buffer:"buf",String:"str",JSON:"jsn",RegExp:"re",Date:"dt"},i=Object.values(e);class MaybeType{constructor(t){this.type=t}}function optional(t){return new MaybeType(t)}const mask=(t,r=1)=>t.reduce(((t,r)=>t<<1|r),r),unmask=(t,r)=>{const e=void 0===r?31-Math.clz32(t):Array.isArray(r)?r.length:r,i=Array.isArray(r)&&r.length===e?r:new Array(e);for(let r=0;rt.encode(r)}(),s=function(){const t=new TextDecoder("utf-8");return r=>t.decode(r)}();function f16round(t){return h(o(t))}const o=function(){const t=new Float32Array(1),r=new Int32Array(t.buffer);return function(e){t[0]=e;let i=r[0],n=i>>16&32768,s=4096+(2147483647&i)|0;return s>=1199570944?(2147483647&i)<1199570944?31743|n:s<2139095040?31744|n:31744|n|(8388607&i)>>13:s>=947912704?n|s-939524096>>13:s<855638016?n:(s=(2147483647&i)>>23,n|(8388607&i|8388608)+(8388608>>>s-102)>>126-s)}}(),h=function(){const t=Math.pow(2,-24),r=new Float32Array(1056);for(let t=0;t<32;t++)r[t]=Math.pow(2,t-15);for(let t=0;t<1024;t++)r[t+32]=1+t/1024;return function(e){const i=32768&~e?1:-1,n=31744&e,s=1023&e;return 0===n?0===s?0*i:i*t:31744===n?0===s?i*(1/0):NaN:r[n>>10]*r[s+32]*i}}(),a=new Uint32Array(1),u=new Float32Array(a.buffer);function bf16round(t){return u[0]=t,a[0]=4294901760&a[0],u[0]}const f=536870912,c=268435456,d=4294967296,l={h:(r,e)=>{"number"!=typeof r&&(r=Number(r)),r<0&&(r=0),r<128?e.u(r):r<16384?e.l(r+32768):r=f?(e.$(t(r/d)+3758096384|0),e.l(r>>>16),e.l(65535&r)):e.u(!0===r?1:0)},p:t=>{const r=t.m();return 128&r?64&r?32&r?(t.v()-3758096384)*d+t.v():t.v()-3221225472:t.F()-32768:(t.B(),r)}},$={h:(t,r)=>r.u(t),p:t=>t.A()},w={h:(t,r)=>r.l(t),p:t=>t.F()},y={h:(t,r)=>r.$(t),p:t=>t.v()},p={h:(r,e)=>{"number"!=typeof r&&(r=Number(r)),r>=-64&&r<64?e.u(127&r):r>=-8192&&r<8192?e.l(32768+(16383&r)):r>=-268435456&&r=c?(e.$(536870911&t(r/d)|3758096384),e.l(r>>>16),e.l(65535&r)):e.u(!0===r?127:0)},p:t=>{let r,e=t.m();return 128&e?64&e?32&e?(r=t.v()-3758096384,r=268435456&r?3758096384|r:r,r*d+t.v()):(r=t.v()-3221225472,268435456&r?3758096384|r:r):(r=t.F()-32768,8192&r?4294950912|r:r):(t.B(),64&e?4294967168|e:e)}},b={h:(t,r)=>r.T(t),p:t=>t.U()},m={h:(t,r)=>r.I(t),p:t=>t.M()},v={h:(t,r)=>r.S(t),p:t=>t._()},F={h:(t,r)=>r.l(function $tobf16(t){return u[0]=t,a[0]>>>16}(t)),p:t=>function $frombf16(t){return a[0]=t<<16,u[0]}(t.F())},B={h:(t,r)=>r.l(o(t)),p:t=>h(t.F())},A={h:(t,r)=>r.j(t),p:t=>t.H()},T={h:(t,r)=>r.k(t),p:t=>t.O()},E={h:(t,r)=>r.u($touscal8(t)),p:t=>$fromuscal8(t.A())},g={h:(t,r)=>r.u($toscal8(t)),p:t=>$fromscal8(t.A())},U={h:(t,r)=>p.h(t.getTime(),r),p:t=>new Date(p.p(t))},I={h:(t,r)=>{l.h(t.byteLength,r),r.C(t)},p:t=>t.D(l.p(t))},M={h:(t,r)=>I.h(n(t),r),p:t=>s(I.p(t))},S={h:(t,r)=>r.u(t?1:0),p:t=>0!==t.A()},x={h:(t,r)=>{t.length>28&&(t=t.slice(0,28)),l.h(mask(t),r)},p:(t,r)=>unmask(l.p(t),r)},_={h:(t,r)=>M.h(JSON.stringify(t),r),p:t=>JSON.parse(M.p(t))},j={h:(t,r)=>{r.u(mask([t.global,t.ignoreCase,t.multiline])),M.h(t.source,r)},p:t=>{const[r,e,i]=unmask(t.A());return new RegExp(M.p(t),(r?"g":"")+(e?"i":"")+(i?"m":""))}},H={[e.UInt]:l.h,[e.UInt8]:$.h,[e.UInt16]:w.h,[e.UInt32]:y.h,[e.Int]:p.h,[e.Int8]:b.h,[e.Int16]:m.h,[e.Int32]:v.h,[e.Float64]:T.h,[e.Float32]:A.h,[e.Float16]:B.h,[e.BFloat16]:F.h,[e.Scalar8]:g.h,[e.UScalar8]:E.h,[e.Bool]:S.h,[e.Bools]:x.h,[e.Buffer]:I.h,[e.String]:M.h,[e.JSON]:_.h,[e.RegExp]:j.h,[e.Date]:U.h},k={[e.UInt]:l.p,[e.UInt8]:$.p,[e.UInt16]:w.p,[e.UInt32]:y.p,[e.Int]:p.p,[e.Int8]:b.p,[e.Int16]:m.p,[e.Int32]:v.p,[e.Float64]:T.p,[e.Float32]:A.p,[e.Float16]:B.p,[e.BFloat16]:F.p,[e.Scalar8]:g.p,[e.UScalar8]:E.p,[e.Bool]:S.p,[e.Bools]:x.p,[e.Buffer]:I.p,[e.String]:M.p,[e.JSON]:_.p,[e.RegExp]:j.p,[e.Date]:U.p},setTinybufConfig=t=>{O=Object.assign(Object.assign({},O),t)};let O={safe:!1,useGlobalEncodingBuffer:!0,encodingBufferMaxSize:1500,encodingBufferInitialSize:256,encodingBufferIncrement:256};class BufferWriter{constructor(t){this.R=0,this.V=0,this.N="number"==typeof t;let r=t instanceof Uint8Array?t:new Uint8Array(t);this.W=r,this.J=r.byteOffset,this.P=new DataView(r.buffer)}q(t){return this.P.buffer!==t.buffer&&(this.P=new DataView(t.buffer)),this.W=t,this.J=t.byteOffset,this.N=!1,this.V=0,this.R=0,this}G(){return this.W.subarray(0,this.R)}L(){const t=new Uint8Array(this.R);return t.set(this.G()),t}T(t){this.K(1).setInt8(this.V,t)}I(t){this.K(2).setInt16(this.V,t,!0)}S(t){this.K(4).setInt32(this.V,t,!0)}u(t){this.K(1).setUint8(this.V,t)}l(t){this.K(2).setUint16(this.V,t,!1)}$(t){this.K(4).setUint32(this.V,t,!1)}j(t){this.K(4).setFloat32(this.V,t,!0)}k(t){this.K(8).setFloat64(this.V,t,!0)}C(t){this.K(t.byteLength),this.W.set(t instanceof Uint8Array?t:ArrayBuffer.isView(t)?new Uint8Array(t.buffer,t.byteOffset,t.byteLength):new Uint8Array(t),this.V-this.J)}K(t){return this.R+t>this.W.byteLength&&this.X(t),this.V=this.J+this.R,this.R+=t,this.P}X(t){if(!this.N)throw new TinybufError("exceeded buffer length: "+this.W.byteLength);const r=this.W.byteLength,e=this.R+t-r,i=O.encodingBufferMaxSize-r;if(e>i)throw new TinybufError("exceeded encodingBufferMaxSize: "+O.encodingBufferMaxSize);const n=O.encodingBufferIncrement,s=Math.ceil(e/n)*n,o=r+Math.min(s,i),h=new Uint8Array(o);h.set(this.W),this.P=new DataView(h.buffer),this.W=h,this.J=0}}class BufferReader{constructor(t,r){this.q(t,r)}q(t,r){const e=ArrayBuffer.isView(t),i=e?t.buffer:t,n=e?t.byteOffset:0;let s=this.P;return(void 0===s||s.buffer!==i||ns.byteOffset+s.byteLength)&&(s=this.P=t instanceof DataView?t:new DataView(i)),this.J=n-s.byteOffset,this.Y=t.byteLength,this.i=null!=r?r:0,this}m(){if(this.i>=this.Y)throw new RangeError("exceeded bytes");return this.P.getUint8(this.J+this.i)}B(){this.i++}A(){return this.P.getUint8(this.Z(1))}F(){return this.P.getUint16(this.Z(2))}v(){return this.P.getUint32(this.Z(4))}U(){return this.P.getInt8(this.Z(1))}M(){return this.P.getInt16(this.Z(2),!0)}_(){return this.P.getInt32(this.Z(4),!0)}H(){return this.P.getFloat32(this.Z(4),!0)}O(){return this.P.getFloat64(this.Z(8),!0)}D(t){return new Uint8Array(this.P.buffer,this.P.byteOffset+this.Z(t),t)}Z(t){const r=this.i;if(r+t>this.Y)throw new RangeError("exceeded bytes");return this.i=r+t,this.J+r}}function defineFormat(t,r){return null!==t&&"object"==typeof t?new BufferFormat(t):new BufferFormat(r,t)}class BufferFormat{constructor(t,r){if(this.tt=!1,"string"==typeof t&&i.includes(t))this.rt=t;else{if(t instanceof MaybeType)throw new TypeError("Format cannot be optional");if(!(t instanceof Object))throw new TypeError("Format must be object or Type");if(this.rt=void 0,this.et=new Map,this.it=Object.keys(t).map((r=>{const e=new Field(r,t[r]);return this.et.set(r,e),e})),void 0===r)this.header=$hashCode(this.f),this.nt=this.header;else if(null===r)this.header=void 0,this.nt=void 0;else{if(!function isValidHeader(t){return"number"==typeof t?Number.isInteger(t)&&t>=0&&t<=65535:"string"==typeof t&&2===(new TextEncoder).encode(t).byteLength}(r))throw new TypeError("Header must be 2-byte string, uint16, or null.");this.header=r,this.nt="number"==typeof r?r:$strToHashCode(r)}}}get f(){return void 0===this.st&&(this.st=void 0!==this.it?`{${this.it.map((t=>t.f)).join(",")}}`:`${this.rt}`),this.st}static ot(){return O.useGlobalEncodingBuffer?(BufferFormat.ht||(this.ht=new BufferWriter(O.encodingBufferMaxSize)),this.ht):new BufferWriter(O.encodingBufferInitialSize)}encodeInto(t,r){return r.subarray(0,this.encodeIntoLength(t,r))}encodeIntoLength(t,r){var e,i;this.tt&&(t=this.ut(t));const n=null!==(i=null===(e=this.ft)||void 0===e?void 0:e.q(r))&&void 0!==i?i:new BufferWriter(r);this.ft=void 0;try{return this.ct(t,n),n.R}finally{this.ft=n}}encode(t,r){return this.dt||(this.dt=BufferFormat.ot()),this.dt.R=0,this.tt&&(t=this.ut(t)),this.ct(t,this.dt),(null!=r?r:O.safe)?this.dt.L():this.dt.G()}decodeInto(t,r){return this.lt(t,r)}decode(t,r){return this.lt(t,r)}setTransforms(t){if(this.tt=!0,"function"==typeof t||Array.isArray(t)&&"function"==typeof t[0])this.$t=t;else for(const r of Object.keys(t)){const e=this.et.get(r);if(!e)throw new TypeError(`Failed to set transforms for field '${r}'`);e.wt.setTransforms(t[r])}return this}setValidation(t){if(this.tt=!0,"function"==typeof t)this.yt=t;else for(const r of Object.keys(t)){const e=this.et.get(r);if(!e)throw new TypeError(`Failed to set validation function for field '${r}'`);e.wt.setValidation(t[r])}return this}lt(t,r){var e,i;const n=void 0===this.header?0:2,s=null!==(i=null===(e=this.bt)||void 0===e?void 0:e.q(t,n))&&void 0!==i?i:new BufferReader(t,n);this.bt=void 0;try{return this.vt(s,r)}finally{this.bt=s}}ct(t,r){if(void 0!==this.nt&&r.l(this.nt),void 0!==this.rt){const e=this.yt||this.$t?this.ut(t):t;return H[this.rt](e,r)}if("object"!=typeof t||!t)throw new TypeError("expected object type");const e=this.it;for(let i=0;i`v.${t}=this.${this.Mt.name}(${r},s,v.${t})`)).join(";");return`let v=o??{};${t};return v;`}Mt(t,r,e){const i=this.it[t];if(!i.Bt||S.p(r))return i.At?this.St(i.wt,r,e):i.wt.vt(r,e)}Ut(){return void 0!==this.rt?this.tt?t=>this.gt(k[this.rt](t)):k[this.rt]:new Function("s","o",this.It())}Tt(t,r,e){if(!Array.isArray(t))throw new TypeError(`expected array, instead got: ${t}`);l.h(t.length,r);for(let i=0;inew BufferParser;class BufferParser{constructor(){this.t=new Map,this.o=new Map}processBuffer(t){var r;let e,i,n,s;try{const o=peekHeader(t);if(!this.t.has(o))throw new TinybufError(`Unknown format: ${o} '${$hashCodeToStr(o)}')`);[e,n,s]=this.t.get(o),s&&(i=null!==(r=this.o.get(o))&&void 0!==r?r:{}),i=e.decode(t,i),s&&this.o.set(o,i)}catch(t){const r=new TinybufError(`Failed to decode: ${t}`);throw r.stack=t.stack,r}n(i)}on(t,r,{decodeInPlace:e=!1}={}){var i;if(null==t.header)throw new TinybufError("Format requires header");const n="string"==typeof t.header?$strToHashCode(t.header):t.header;if(this.t.has(n)&&(null===(i=this.t.get(n))||void 0===i?void 0:i[0])!==t)throw new TinybufError(`Format header collision: ${t.header}`);return this.t.set(n,[t,r,e]),this}ignore(...t){return t.forEach((t=>this.on(t,(()=>{})))),this}clear(){this.t.clear(),this.o.clear()}}const t=Math.floor,r=Math.ceil,$clamp=(t,r,e)=>t>e?e:te<0?r(e):t(e),$roundAwayFromZero=e=>e<0?t(e):r(e);function uscalround(t){return $fromuscal8($touscal8(t))}function scalround(t){return $fromscal8($toscal8(t))}function $touscal8(t){return $clamp(127+$roundTowardZero(254*t-127),0,254)}function $toscal8(t){return $clamp($roundTowardZero(127*t),-127,127)+127}function $fromuscal8(t){return $clamp(.01*($roundAwayFromZero(.3937007874015748*(t-127))+50),0,1)}function $fromscal8(t){return $clamp(.01*$roundAwayFromZero(.787401574803149*(t-127)),-1,1)}const e={UInt:"uint",UInt8:"u8",UInt16:"u16",UInt32:"u32",Int:"int",Int8:"i8",Int16:"i16",Int32:"i32",Float64:"f64",Float32:"f32",Float16:"f16",BFloat16:"b16",Scalar8:"sc",UScalar8:"usc",Bool:"bl",Bools:"bls",Buffer:"buf",String:"str",JSON:"jsn",RegExp:"re",Date:"dt"},i=Object.values(e);class MaybeType{constructor(t){this.type=t}}function optional(t){return new MaybeType(t)}const mask=(t,r=1)=>t.reduce(((t,r)=>t<<1|r),r),unmask=(t,r)=>{const e=void 0===r?31-Math.clz32(t):Array.isArray(r)?r.length:r,i=Array.isArray(r)&&r.length===e?r:new Array(e);for(let r=0;rt.encode(r)}(),s=function(){const t=new TextDecoder("utf-8");return r=>t.decode(r)}();function f16round(t){return h(o(t))}const o=function(){const t=new Float32Array(1),r=new Int32Array(t.buffer);return function(e){t[0]=e;let i=r[0],n=i>>16&32768,s=4096+(2147483647&i)|0;return s>=1199570944?(2147483647&i)<1199570944?31743|n:s<2139095040?31744|n:31744|n|(8388607&i)>>13:s>=947912704?n|s-939524096>>13:s<855638016?n:(s=(2147483647&i)>>23,n|(8388607&i|8388608)+(8388608>>>s-102)>>126-s)}}(),h=function(){const t=Math.pow(2,-24),r=new Float32Array(1056);for(let t=0;t<32;t++)r[t]=Math.pow(2,t-15);for(let t=0;t<1024;t++)r[t+32]=1+t/1024;return function(e){const i=32768&~e?1:-1,n=31744&e,s=1023&e;return 0===n?0===s?0*i:i*t:31744===n?0===s?i*(1/0):NaN:r[n>>10]*r[s+32]*i}}(),a=new Uint32Array(1),u=new Float32Array(a.buffer);function bf16round(t){return u[0]=t,a[0]=4294901760&a[0],u[0]}const f=536870912,c=268435456,d=4294967296,l={h:(r,e)=>{"number"!=typeof r&&(r=Number(r)),r<0&&(r=0),r<128?e.u(r):r<16384?e.l(r+32768):r=f?(e.$(t(r/d)+3758096384|0),e.l(r>>>16),e.l(65535&r)):e.u(!0===r?1:0)},p:t=>{const r=t.m();return 128&r?64&r?32&r?(t.v()-3758096384)*d+t.v():t.v()-3221225472:t.F()-32768:(t.B(),r)}},$={h:(t,r)=>r.u(t),p:t=>t.A()},w={h:(t,r)=>r.l(t),p:t=>t.F()},y={h:(t,r)=>r.$(t),p:t=>t.v()},p={h:(r,e)=>{"number"!=typeof r&&(r=Number(r)),r>=-64&&r<64?e.u(127&r):r>=-8192&&r<8192?e.l(32768+(16383&r)):r>=-268435456&&r=c?(e.$(536870911&t(r/d)|3758096384),e.l(r>>>16),e.l(65535&r)):e.u(!0===r?127:0)},p:t=>{let r,e=t.m();return 128&e?64&e?32&e?(r=t.v()-3758096384,r=268435456&r?3758096384|r:r,r*d+t.v()):(r=t.v()-3221225472,268435456&r?3758096384|r:r):(r=t.F()-32768,8192&r?4294950912|r:r):(t.B(),64&e?4294967168|e:e)}},b={h:(t,r)=>r.T(t),p:t=>t.U()},m={h:(t,r)=>r.I(t),p:t=>t.M()},v={h:(t,r)=>r.S(t),p:t=>t._()},F={h:(t,r)=>r.l(function $tobf16(t){return u[0]=t,a[0]>>>16}(t)),p:t=>function $frombf16(t){return a[0]=t<<16,u[0]}(t.F())},B={h:(t,r)=>r.l(o(t)),p:t=>h(t.F())},A={h:(t,r)=>r.j(t),p:t=>t.k()},T={h:(t,r)=>r.H(t),p:t=>t.O()},E={h:(t,r)=>r.u($touscal8(t)),p:t=>$fromuscal8(t.A())},g={h:(t,r)=>r.u($toscal8(t)),p:t=>$fromscal8(t.A())},U={h:(t,r)=>p.h(t.getTime(),r),p:t=>new Date(p.p(t))},I={h:(t,r)=>{l.h(t.byteLength,r),r.C(t)},p:t=>t.D(l.p(t))},M={h:(t,r)=>I.h(n(t),r),p:t=>s(I.p(t))},S={h:(t,r)=>r.u(t?1:0),p:t=>0!==t.A()},x={h:(t,r)=>{t.length>28&&(t=t.slice(0,28)),l.h(mask(t),r)},p:(t,r)=>unmask(l.p(t),r)},_={h:(t,r)=>M.h(JSON.stringify(t),r),p:t=>JSON.parse(M.p(t))},j={h:(t,r)=>{r.u(mask([t.global,t.ignoreCase,t.multiline])),M.h(t.source,r)},p:t=>{const[r,e,i]=unmask(t.A());return new RegExp(M.p(t),(r?"g":"")+(e?"i":"")+(i?"m":""))}},k={[e.UInt]:l.h,[e.UInt8]:$.h,[e.UInt16]:w.h,[e.UInt32]:y.h,[e.Int]:p.h,[e.Int8]:b.h,[e.Int16]:m.h,[e.Int32]:v.h,[e.Float64]:T.h,[e.Float32]:A.h,[e.Float16]:B.h,[e.BFloat16]:F.h,[e.Scalar8]:g.h,[e.UScalar8]:E.h,[e.Bool]:S.h,[e.Bools]:x.h,[e.Buffer]:I.h,[e.String]:M.h,[e.JSON]:_.h,[e.RegExp]:j.h,[e.Date]:U.h},H={[e.UInt]:l.p,[e.UInt8]:$.p,[e.UInt16]:w.p,[e.UInt32]:y.p,[e.Int]:p.p,[e.Int8]:b.p,[e.Int16]:m.p,[e.Int32]:v.p,[e.Float64]:T.p,[e.Float32]:A.p,[e.Float16]:B.p,[e.BFloat16]:F.p,[e.Scalar8]:g.p,[e.UScalar8]:E.p,[e.Bool]:S.p,[e.Bools]:x.p,[e.Buffer]:I.p,[e.String]:M.p,[e.JSON]:_.p,[e.RegExp]:j.p,[e.Date]:U.p},setTinybufConfig=t=>{O=Object.assign(Object.assign({},O),t)};let O={safe:!1,useGlobalEncodingBuffer:!0,encodingBufferMaxSize:1500,encodingBufferInitialSize:256,encodingBufferIncrement:256};class BufferWriter{constructor(t){this.R=0,this.V=0,this.N="number"==typeof t;let r=t instanceof Uint8Array?t:new Uint8Array(t);this.W=r,this.J=r.byteOffset,this.P=new DataView(r.buffer)}q(t){return this.P.buffer!==t.buffer&&(this.P=new DataView(t.buffer)),this.W=t,this.J=t.byteOffset,this.N=!1,this.V=0,this.R=0,this}G(){return this.W.subarray(0,this.R)}L(){const t=new Uint8Array(this.R);return t.set(this.G()),t}T(t){this.K(1).setInt8(this.V,t)}I(t){this.K(2).setInt16(this.V,t,!0)}S(t){this.K(4).setInt32(this.V,t,!0)}u(t){this.K(1).setUint8(this.V,t)}l(t){this.K(2).setUint16(this.V,t,!1)}$(t){this.K(4).setUint32(this.V,t,!1)}j(t){this.K(4).setFloat32(this.V,t,!0)}H(t){this.K(8).setFloat64(this.V,t,!0)}C(t){this.K(t.byteLength),this.W.set(t instanceof Uint8Array?t:ArrayBuffer.isView(t)?new Uint8Array(t.buffer,t.byteOffset,t.byteLength):new Uint8Array(t),this.V-this.J)}K(t){return this.R+t>this.W.byteLength&&this.X(t),this.V=this.J+this.R,this.R+=t,this.P}X(t){if(!this.N)throw new TinybufError("exceeded buffer length: "+this.W.byteLength);const r=this.W.byteLength,e=this.R+t-r,i=O.encodingBufferMaxSize-r;if(e>i)throw new TinybufError("exceeded encodingBufferMaxSize: "+O.encodingBufferMaxSize);const n=O.encodingBufferIncrement,s=Math.ceil(e/n)*n,o=r+Math.min(s,i),h=new Uint8Array(o);h.set(this.W),this.P=new DataView(h.buffer),this.W=h,this.J=0}}class BufferReader{constructor(t,r){this.q(t,r)}q(t,r){const e=ArrayBuffer.isView(t),i=e?t.buffer:t,n=e?t.byteOffset:0;let s=this.P;return(void 0===s||s.buffer!==i||ns.byteOffset+s.byteLength)&&(s=this.P=t instanceof DataView?t:new DataView(i)),this.J=n-s.byteOffset,this.Y=t.byteLength,this.i=null!=r?r:0,this}m(){if(this.i>=this.Y)throw new RangeError("exceeded bytes");return this.P.getUint8(this.J+this.i)}B(){this.i++}A(){return this.P.getUint8(this.Z(1))}F(){return this.P.getUint16(this.Z(2))}v(){return this.P.getUint32(this.Z(4))}U(){return this.P.getInt8(this.Z(1))}M(){return this.P.getInt16(this.Z(2),!0)}_(){return this.P.getInt32(this.Z(4),!0)}k(){return this.P.getFloat32(this.Z(4),!0)}O(){return this.P.getFloat64(this.Z(8),!0)}D(t){return new Uint8Array(this.P.buffer,this.P.byteOffset+this.Z(t),t)}Z(t){const r=this.i;if(r+t>this.Y)throw new RangeError("exceeded bytes");return this.i=r+t,this.J+r}}const C=new WeakMap;function defineFormat(t,r){return null!==t&&"object"==typeof t?new BufferFormat(t):new BufferFormat(r,t)}class BufferFormat{constructor(t,r){if(this.tt=!1,"string"==typeof t&&i.includes(t))this.rt=t;else{if(t instanceof MaybeType)throw new TypeError("Format cannot be optional");if(!(t instanceof Object))throw new TypeError("Format must be object or Type");if(this.rt=void 0,this.et=new Map,this.it=Object.keys(t).map((r=>{const e=new Field(r,t[r]);return this.et.set(r,e),e})),void 0===r)this.header=$hashCode(this.f),this.nt=this.header;else if(null===r)this.header=void 0,this.nt=void 0;else{if(!function isValidHeader(t){return"number"==typeof t?Number.isInteger(t)&&t>=0&&t<=65535:"string"==typeof t&&2===(new TextEncoder).encode(t).byteLength}(r))throw new TypeError("Header must be 2-byte string, uint16, or null.");this.header=r,this.nt="number"==typeof r?r:$strToHashCode(r)}}}get f(){return void 0===this.st&&(this.st=void 0!==this.it?`{${this.it.map((t=>t.f)).join(",")}}`:`${this.rt}`),this.st}static ot(){return O.useGlobalEncodingBuffer?(BufferFormat.ht||(this.ht=new BufferWriter(O.encodingBufferMaxSize)),this.ht):new BufferWriter(O.encodingBufferInitialSize)}encodeInto(t,r){return r.subarray(0,this.encodeIntoLength(t,r))}encodeIntoLength(t,r){var e,i;this.tt&&(t=this.ut(t));const n=null!==(i=null===(e=this.ft)||void 0===e?void 0:e.q(r))&&void 0!==i?i:new BufferWriter(r);this.ft=void 0;try{return this.ct(t,n),n.R}finally{this.ft=n}}encode(t,r){return this.dt||(this.dt=BufferFormat.ot()),this.dt.R=0,this.tt&&(t=this.ut(t)),this.ct(t,this.dt),(null!=r?r:O.safe)?this.dt.L():this.dt.G()}decodeInto(t,r){return this.lt(t,r)}decode(t,r){return this.lt(t,r)}setTransforms(t){if(this.tt=!0,"function"==typeof t||Array.isArray(t)&&"function"==typeof t[0])this.$t=t;else for(const r of Object.keys(t)){const e=this.et.get(r);if(!e)throw new TypeError(`Failed to set transforms for field '${r}'`);e.wt.setTransforms(t[r])}return this}setValidation(t){if(this.tt=!0,"function"==typeof t)this.yt=t;else for(const r of Object.keys(t)){const e=this.et.get(r);if(!e)throw new TypeError(`Failed to set validation function for field '${r}'`);e.wt.setValidation(t[r])}return this}lt(t,r){var e,i;const n=void 0===this.header?0:2,s=null!==(i=null===(e=this.bt)||void 0===e?void 0:e.q(t,n))&&void 0!==i?i:new BufferReader(t,n);this.bt=void 0;try{return this.vt(s,r)}finally{this.bt=s}}ct(t,r){if(void 0!==this.nt&&r.l(this.nt),void 0!==this.rt){const e=this.yt||this.$t?this.ut(t):t;return k[this.rt](e,r)}if("object"!=typeof t||!t)throw new TypeError("expected object type");const e=this.it;for(let i=0;i`v.${t}=this.${this.Mt.name}(${r},s,v.${t})`)).join(";");return`let v=o??{};${t};return v;`}Mt(t,r,e){const i=this.it[t];if(!i.Bt||S.p(r))return i.At?this.St(i.wt,r,e):i.wt.vt(r,e)}Ut(){return void 0!==this.rt?this.tt?t=>this.gt(H[this.rt](t)):H[this.rt]:new Function("s","o",this.It())}Tt(t,r,e){if(!Array.isArray(t))throw new TypeError(`expected array, instead got: ${t}`);l.h(t.length,r);for(let i=0;i;\ntype Uint16FormatHeader = number;\n\n/**\n * Small utility for registering and processing format handlers.\n *\n * @example\n * const myHandler = bufferParser()\n * .on(FormatA, aData => {})\n * .on(FormatB, bData => {});\n *\n * myHandler.processBuffer(bytes);\n */\nexport const bufferParser = (): BufferParser => new BufferParser();\n\nexport class BufferParser {\n /** @internal */\n private _$formats = new Map any, decodeInPlace: boolean]>();\n private _$data = new Map(); // used when decoding in-place\n\n /**\n * Decode an array buffer and trigger the relevant data handler.\n *\n * When passed an ArrayBufferView, accesses the underlying 'buffer' instance directly.\n *\n * @throws {TinybufError} if fails to decode, or no handler is registered\n */\n public processBuffer(b: ArrayBuffer | ArrayBufferView): void {\n let f: any, data: any, cb: (data: any) => any, r: boolean;\n\n try {\n const header = peekHeader(b);\n\n if (!this._$formats.has(header)) {\n throw new TinybufError(`Unknown format: ${header} '${$hashCodeToStr(header)}')`);\n }\n\n [f, cb, r] = this._$formats.get(header);\n if (r) data = this._$data.get(header) ?? {};\n data = f.decode(b, data);\n if (r) this._$data.set(header, data);\n }\n catch (e) {\n const err = new TinybufError(`Failed to decode: ${e}`);\n err.stack = e.stack;\n\n throw err;\n }\n\n cb(data);\n }\n\n /**\n * Register a format handler.\n */\n public on>(\n format: BufferFormat,\n callback: (data: TDecodedType) => any,\n {\n decodeInPlace = false,\n } = {},\n ): this {\n if (format.header == null) {\n throw new TinybufError(\"Format requires header\");\n }\n\n const header = typeof format.header === \"string\" ? $strToHashCode(format.header) : format.header;\n\n if (this._$formats.has(header) && this._$formats.get(header)?.[0] !== format) {\n throw new TinybufError(`Format header collision: ${format.header}`);\n }\n\n this._$formats.set(header, [format, callback, decodeInPlace]);\n\n return this;\n }\n\n /** Register a format (or formats) that are recognized. */\n public ignore(...format: AnyFormat[]): this {\n format.forEach(f => this.on(f, () => {}));\n return this;\n }\n\n /** Clears all registered formats and handlers. */\n public clear(): void {\n this._$formats.clear();\n this._$data.clear();\n }\n}\n","export const $floor = Math.floor,\n $ceil = Math.ceil;\n\n/** Clamp a number to a range. */\nexport const $clamp = (value: number, min: number, max: number): number =>\n value > max ? max : value < min ? min : value;\n\n/** Round toward zero */\nexport const $roundTowardZero = (x: number): number => x < 0 ? $ceil(x) : $floor(x);\n\n/** Round away zero */\nexport const $roundAwayFromZero = (x: number): number =>\n x < 0 ? $floor(x) : $ceil(x);\n","import { $clamp, $roundTowardZero, $roundAwayFromZero } from \"./math\";\n\n/**\n * Quantize a number to an 8-bit scalar between 0.0 and 1.0.\n *\n * @returns A number (double) in its closest signed scalar representation.\n */\nexport function uscalround(x: number): number {\n return $fromuscal8($touscal8(x));\n}\n\n/**\n * Quantize a number to an 8-bit signed scalar between -1.0 and 1.0.\n *\n * @returns A number (double) in its closest signed scalar representation.\n */\nexport function scalround(x: number): number {\n return $fromscal8($toscal8(x));\n}\n\n/** @returns A UInt8 bitmask representation. */\nexport function $touscal8(x: number): number {\n return $clamp(127 + $roundTowardZero(x * 254 - 127), 0, 254);\n}\n\n/** @returns A UInt8 bitmask representation. */\nexport function $toscal8(x: number): number {\n return $clamp($roundTowardZero(x * 127), -127, 127) + 127;\n}\n\n/** @returns An unsigned scalar between 0.0 and 1.0. */\nexport function $fromuscal8(x: number): number {\n // Make symmetric: (0.5 + round((uint8 - 127) / 254 * 100)) / 100\n return $clamp(($roundAwayFromZero((x - 127) * 0.3937007874015748) + 50) * 0.01, 0, 1);\n}\n\n/** @returns A signed scalar between -1.0 and 1.0. */\nexport function $fromscal8(x: number): number {\n // Make symmetric: round((uint8 - 127) / 127 * 100) / 100\n return $clamp($roundAwayFromZero((x - 127) * 0.787401574803149) * 0.01, -1, 1);\n}\n","/**\n * Field types for defining encoding formats.\n *\n * @see [Types](https://github.com/reececomo/tinybuf/blob/main/docs/types.md)\n */\nexport const Type = {\n /**\n * Unsigned integer (1 - 8 bytes).\n * - 0 → 127 = 1 byte\n * - 128 → 16,384 = 2 bytes\n * - 16,385 → 536,870,911 = 4 bytes\n * - 536,870,912 → `Number.MAX_SAFE_INTEGER` = 8 bytes\n */\n UInt: \"uint\",\n\n /** Unsigned 8-bit integer (between 0 and 255, 1 byte). */\n UInt8: \"u8\",\n\n /** Unsigned 16-bit integer (between 0 and 65,535, 2 bytes). */\n UInt16: \"u16\",\n\n /** Unsigned 32-bit integer (between 0 and 4,294,967,295, 4 bytes). */\n UInt32: \"u32\",\n\n /**\n * Signed integer (1 - 8 bytes).\n * - 0 → ±64 = 1 byte\n * - ±65 → ±8,192 = 2 bytes\n * - ±8,193 → ±268,435,456 = 4 bytes\n * - ±268,435,457 → ±`Number.MAX_SAFE_INTEGER` = 8 bytes\n */\n Int: \"int\",\n\n /** Signed 1 byte integer (between -127 and 127). */\n Int8: \"i8\",\n\n /** Signed 2 byte integer (between -32,767 and 32,767). */\n Int16: \"i16\",\n\n /** Signed 4 byte integer (between -2,147,483,647 and 2,147,483,647). */\n Int32: \"i32\",\n\n /** Default JavaScript `number` type. Floating-point number (64-bit, double precision, 8 bytes). */\n Float64: \"f64\",\n\n /** Floating-point number (32-bit, single precision, 4 bytes). */\n Float32: \"f32\",\n\n /**\n * Floating-point number (16-bit in FP16 format, half precision, 2 bytes).\n *\n * **Warning:** Low precision; maximum range: ±65,504.\n */\n Float16: \"f16\",\n\n /**\n * Floating-point number (16-bit in BF16 format, half precision, 2 bytes).\n *\n * **Warning:** Low precision.\n */\n BFloat16: \"b16\",\n\n /** A signed 2-decimal scalar between -1.00 and 1.00 (1 byte). */\n Scalar8: \"sc\",\n\n /** An unsigned 2-decimal scalar between 0.00 and 1.00 (1 byte). */\n UScalar8: \"usc\",\n\n /**\n * Boolean value (1 byte).\n * @see {Bools} for packing multiple booleans into a single byte.\n */\n Bool: \"bl\",\n\n /** Any array of booleans (1 bit overhead, encoded as UInt). */\n Bools: \"bls\",\n\n /** Any ArrayBuffer or ArrayBufferView (e.g. Uint8Array) value (encoded as 1 x UInt for byte length + buffer bytes). */\n Buffer: \"buf\",\n\n /** A UTF-8 string (encoded as 1 x UInt for UTF-8 byte length + UTF-8 bytes). */\n String: \"str\",\n\n /** Any JSON data (encodes as UTF-8). */\n JSON: \"jsn\",\n\n /** JavaScript RegExp object. */\n RegExp: \"re\",\n\n /**\n * JavaScript Date object.\n *\n * Encoded as an 8 byte (64-bit) integer UTC timestamp from as the number\n * of milliseconds since the Unix Epoch (January 1, 1970, 00:00:00 UTC).\n *\n * @see {Date}\n */\n Date: \"dt\",\n} as const;\n\nexport type TypeLiteral = typeof Type[keyof typeof Type];\nexport const ValidTypes = Object.values(Type);\n\n/**\n * Mappings for the value types.\n */\nexport type ValueTypes = {\n [Type.Int]: number;\n [Type.Int8]: number;\n [Type.Int16]: number;\n [Type.Int32]: number;\n [Type.UInt]: number;\n [Type.UInt8]: number;\n [Type.UInt16]: number;\n [Type.UInt32]: number;\n [Type.Float64]: number;\n [Type.Float32]: number;\n [Type.Float16]: number;\n [Type.BFloat16]: number;\n [Type.Scalar8]: number;\n [Type.UScalar8]: number;\n [Type.Bool]: boolean;\n [Type.Bools]: boolean[];\n [Type.Buffer]: Uint8Array | ArrayBuffer | ArrayBufferView;\n [Type.String]: string;\n [Type.JSON]: any;\n [Type.RegExp]: RegExp;\n [Type.Date]: Date;\n};\n\n/** https://www.totaltypescript.com/concepts/the-prettify-helper */\ntype Pretty = T extends ArrayBuffer | ArrayBufferView | Date | RegExp | Uint8Array ? T\n : T extends Array ? Array>\n : T extends object ? {[K in keyof T]: Pretty} & unknown : T;\n\n/** @throws any error too */\nexport type ValidationFn = (x: T) => undefined | boolean | Error;\nexport type TransformFn = (x: T) => T;\nexport type Transforms = TransformFn | [preEncode: TransformFn] | [preEncode: TransformFn | undefined, postDecode: TransformFn | undefined];\n\n/**\n * A wrapper around any Type definition that declares it as optional.\n */\nexport class MaybeType {\n public constructor(public type: T) {}\n}\n\n/**\n * Wrap any definition as optional.\n */\nexport function optional(t: T): MaybeType {\n return new MaybeType(t);\n}\n\n/**\n * A definition for an object binary encoder.\n */\nexport type EncoderDefinition = {\n [key: string]: FieldDefinition | MaybeType;\n};\n\n/**\n * Definition for an object-field binary encoder.\n */\nexport type FieldDefinition = keyof ValueTypes | [keyof ValueTypes] | EncoderDefinition | [EncoderDefinition] | MaybeType;\n\n/**\n * The resulting type of the decoded data, based on the encoder definition.\n */\ntype RawDecodedType = {\n [EKey in keyof EncoderType as EncoderType[EKey] extends MaybeType ? never : EKey]: EncoderType[EKey] extends keyof ValueTypes\n ? ValueTypes[EncoderType[EKey]]\n : EncoderType[EKey] extends [keyof ValueTypes]\n ? Array\n : EncoderType[EKey] extends EncoderDefinition\n ? RawDecodedType\n : EncoderType[EKey] extends [EncoderDefinition]\n ? Array>\n : never;\n} & {\n [EKey in keyof EncoderType as EncoderType[EKey] extends MaybeType ? EKey : never]?: EncoderType[EKey] extends MaybeType\n ? ValueTypes[OptionalValue] | undefined\n : EncoderType[EKey] extends MaybeType\n ? Array | undefined\n : EncoderType[EKey] extends MaybeType\n ? RawDecodedType | undefined\n : never;\n};\n\nexport type DecodedType = Pretty>;\n\nexport type TransformConfig = {\n [EKey in keyof EncoderType]?: EncoderType[EKey] extends keyof ValueTypes\n ? Transforms\n : EncoderType[EKey] extends [keyof ValueTypes]\n ? Transforms\n : EncoderType[EKey] extends EncoderDefinition\n ? TransformConfig\n : EncoderType[EKey] extends [EncoderDefinition]\n ? TransformConfig\n : EncoderType[EKey] extends MaybeType\n ? Transforms\n : EncoderType[EKey] extends MaybeType\n ? Transforms\n : EncoderType[EKey] extends MaybeType\n ? TransformConfig | undefined\n : never;\n};\n\nexport type ValidationConfig = {\n [EKey in keyof EncoderType]?: EncoderType[EKey] extends keyof ValueTypes\n ? ValidationFn\n : EncoderType[EKey] extends [keyof ValueTypes]\n ? ValidationFn\n : EncoderType[EKey] extends EncoderDefinition\n ? ValidationConfig\n : EncoderType[EKey] extends [EncoderDefinition]\n ? ValidationConfig\n : EncoderType[EKey] extends MaybeType\n ? ValidationFn\n : EncoderType[EKey] extends MaybeType\n ? ValidationFn\n : EncoderType[EKey] extends MaybeType\n ? ValidationConfig | undefined\n : never;\n};\n","/**\n * Mask booleans to a uint32.\n *\n * @param x - A boolean array.\n * @param padBit - A bit to pad the mask (for variable length data).\n */\nexport const mask = (x: boolean[], padBit: 0 | 1 = 0b1): number => {\n return x.reduce((n, b: any) => (n << 1) | b, padBit);\n};\n\n/**\n * Unmask booleans from a uint32.\n *\n * @param x - A uint32 number.\n * @param l - number of booleans to expect (default: infer lenth from x where x is encoded with a pad bit)\n * or pass an existing boolean array to decode in-place.\n */\nexport const unmask = (x: number, l?: number | boolean[]): boolean[] => {\n const len = l === undefined ? 31 - Math.clz32(x) : Array.isArray(l) ? l.length : l;\n const val = Array.isArray(l) && l.length === len ? l : new Array(len);\n for (let i = 0; i < len; i++) val[i] = !!(x & (1 << (len - 1 - i)));\n return val;\n};\n","export const $utf8encode = (function () {\n const encoder = new TextEncoder();\n return (x?: string): Uint8Array => encoder.encode(x);\n})();\n\nexport const $utf8decode = (function () {\n const decoder = new TextDecoder(\"utf-8\");\n return (y: Uint8Array): string => decoder.decode(y);\n})();\n","/**\n * Returns the nearest half precision float representation of a number.\n * @param x A numeric expression.\n */\nexport function f16round(x: number): number {\n return $fromf16($tof16(x));\n}\n\n/**\n * Returns the nearest half precision float representation of a number as a 16-bit bitmask.\n */\nexport const $tof16 = (function() {\n const x = new Float32Array(1);\n const y = new Int32Array(x.buffer);\n\n return function (f: number) {\n x[0] = f;\n let i = y[0]; // 32-bit int\n let s = (i >> 16) & 0X8000; // sign\n let z = (i & 0X7FFFFFFF) + 0X1000 | 0;\n\n if (z >= 0X47800000) {\n if ((i & 0X7FFFFFFF) < 0X47800000) return s | 0X7BFF;\n if (z < 0X7F800000) return s | 0X7C00;\n return s | 0X7C00 | (i & 0X007FFFFF) >> 13;\n }\n if (z >= 0X38800000) return s | z - 0X38000000 >> 13;\n else if (z < 0X33000000) return s;\n z = (i & 0X7FFFFFFF) >> 23;\n return s | ((i & 0X7FFFFF | 0X800000)\n + (0X800000 >>> z - 102)\n >> 126 - z);\n };\n}());\n\n/**\n * Returns the nearest half precision float value for a 16-bit bitmask.\n */\nexport const $fromf16 = (function() {\n const z = Math.pow(2, -24); // subnormal constant\n const d = new Float32Array(32 + 1024);\n for (let e = 0; e < 32; e++) d[e] = Math.pow(2, e - 15); // biased exponents\n for (let m = 0; m < 1024; m++) d[m + 0x20] = 1 + m / 1024; // normalized offset mantissas\n\n return function (b: number): number {\n const s = (b & 32768) === 32768 ? -1 : 1; // sign: 1 bit\n const e = b & 31744; // exponent: 5 bits\n const m = b & 1023; // mantissa: 10 bits\n\n if (e === 0) return m === 0 ? s * 0 : s * z;\n if (e === 31744) return m === 0 ? s * Infinity : NaN;\n return d[e >> 10] * d[m + 0x20] * s;\n };\n}());\n","const i = new Uint32Array(1);\nconst f = new Float32Array(i.buffer);\n\n/**\n * Returns the nearest bfloat16 representation of a number.\n * @param x A numeric expression.\n */\nexport function bf16round(x: number): number {\n f[0] = x;\n i[0] = i[0] & 0xFFFF0000;\n return f[0];\n}\n\n/** Returns a 16-bit bfloat16 bitmask for a given float. */\nexport function $tobf16(x: number): number {\n f[0] = x;\n return i[0] >>> 16;\n}\n\n/** Returns the nearest value from a 16-bit bfloat16 bitmask. */\nexport function $frombf16(x: number): number {\n i[0] = x << 16;\n return f[0];\n}\n","import { BufferWriter } from \"./BufferWriter\";\nimport { BufferReader } from \"./BufferReader\";\nimport {\n $fromuscal8,\n $fromscal8,\n $touscal8,\n $toscal8\n} from \"./scalar\";\nimport { TypeLiteral, Type } from \"../Type\";\nimport { mask, unmask } from \"./bitmask\";\nimport { $utf8decode, $utf8encode } from \"./utf8\";\nimport { $floor } from \"./math\";\nimport { $fromf16, $tof16 } from \"./float16\";\nimport { $frombf16, $tobf16 } from \"./bfloat16\";\n\n// Pre-calculated constants\nconst MAX_VARUINT8 = 128,\n MAX_VARUINT16 = 16_384,\n MAX_VARUINT32 = 536_870_912,\n MAX_VARINT8 = 64,\n MAX_VARINT16 = 8_192,\n MAX_VARINT32 = 268_435_456,\n POW_32 = 0x100000000;\n\ntype WriterFn = (value: W, writer: BufferWriter) => void;\ntype ReaderFn = (reader: BufferReader, overwrite?: Partial) => R;\n\nexport interface BinaryTypeCoder {\n $write: WriterFn;\n $read: ReaderFn;\n}\n\n/**\n * Format (big-endian):\n * 7b 0xxxxxxx\n * 14b 10xxxxxx xxxxxxxx\n * 29b 110xxxxx xxxxxxxx xxxxxxxx xxxxxxxx\n * 61b 111xxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx\n */\nexport const uintCoder: BinaryTypeCoder = {\n $write: (value, writer) => {\n if (typeof value !== \"number\") value = Number(value);\n if (value < 0) value = 0;\n if (value < MAX_VARUINT8) writer.$writeUint8(value);\n else if (value < MAX_VARUINT16) writer.$writeUint16(value + 0x8000);\n else if (value < MAX_VARUINT32) writer.$writeUint32((value + 0xc0000000) | 0);\n else if (value >= MAX_VARUINT32) {\n writer.$writeUint32(($floor(value / POW_32) + 0xe0000000) | 0);\n writer.$writeUint16(value >>> 16);\n writer.$writeUint16(value & 0xffff);\n }\n else {\n // coercion case\n writer.$writeUint8(value as any === true ? 1 : 0);\n }\n },\n $read: (reader) => {\n const firstByte = reader.$peek();\n\n if (!(firstByte & 0x80)) {\n reader.$skip();\n return firstByte;\n }\n else if (!(firstByte & 0x40)) {\n return reader.$readUint16() - 0x8000;\n }\n else if (!(firstByte & 0x20)) {\n return reader.$readUint32() - 0xc0000000;\n }\n\n return (reader.$readUint32() - 0xe0000000) * POW_32\n + reader.$readUint32();\n }\n};\n\nexport const uint8Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint8(value),\n $read: (reader) => reader.$readUint8(),\n};\n\nexport const uint16Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint16(value),\n $read: (reader) => reader.$readUint16(),\n};\n\nexport const uint32Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint32(value),\n $read: (reader) => reader.$readUint32(),\n};\n\n/**\n * Format (big-endian):\n * 7b 0xxxxxxx\n * 14b 10xxxxxx xxxxxxxx\n * 29b 110xxxxx xxxxxxxx xxxxxxxx xxxxxxxx\n * 61b 111xxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx\n */\nexport const intCoder: BinaryTypeCoder = {\n $write: (value, writer) => {\n if (typeof value !== \"number\") value = Number(value);\n if (value >= -MAX_VARINT8 && value < MAX_VARINT8) writer.$writeUint8(value & 0x7f);\n else if (value >= -MAX_VARINT16 && value < MAX_VARINT16) writer.$writeUint16((value & 0x3fff) + 0x8000);\n else if (value >= -MAX_VARINT32 && value < MAX_VARINT32) writer.$writeUint32((value & 0x1fffffff) | 0xc0000000);\n else if (value < -MAX_VARINT32 || value >= MAX_VARINT32) {\n // Split in two 32b uints\n writer.$writeUint32(($floor(value / POW_32) & 0x1fffffff) | 0xe0000000);\n writer.$writeUint16(value >>> 16);\n writer.$writeUint16(value & 0xffff);\n }\n else {\n // coercion case\n writer.$writeUint8(value as any === true ? 0x7f : 0);\n }\n },\n $read: (reader) => {\n let firstByte = reader.$peek(), i: number;\n\n if (!(firstByte & 0x80)) {\n reader.$skip();\n return (firstByte & 0x40) ? (firstByte | 0xffffff80) : firstByte;\n }\n else if (!(firstByte & 0x40)) {\n i = reader.$readUint16() - 0x8000;\n return (i & 0x2000) ? (i | 0xffffc000) : i;\n }\n else if (!(firstByte & 0x20)) {\n i = reader.$readUint32() - 0xc0000000;\n return (i & 0x10000000) ? (i | 0xe0000000) : i;\n }\n else {\n i = reader.$readUint32() - 0xe0000000;\n i = (i & 0x10000000) ? (i | 0xe0000000) : i;\n return i * POW_32 + reader.$readUint32();\n }\n }\n};\n\nexport const int8Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeInt8(value),\n $read: (reader) => reader.$readInt8(),\n};\n\nexport const int16Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeInt16(value),\n $read: (reader) => reader.$readInt16(),\n};\n\nexport const int32Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeInt32(value),\n $read: (reader) => reader.$readInt32(),\n};\n\nexport const bfloat16Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint16($tobf16(value)),\n $read: (reader) => $frombf16(reader.$readUint16()),\n};\n\nexport const float16Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint16($tof16(value)),\n $read: (reader) => $fromf16(reader.$readUint16()),\n};\n\nexport const float32Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeFloat32(value),\n $read: (reader) => reader.$readFloat32(),\n};\n\nexport const float64Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeFloat64(value),\n $read: (reader) => reader.$readFloat64(),\n};\n\nexport const uscalar8Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint8($touscal8(value)),\n $read: (reader) => $fromuscal8(reader.$readUint8()),\n};\n\nexport const scalar8Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint8($toscal8(value)),\n $read: (reader) => $fromscal8(reader.$readUint8()),\n};\n\nexport const dateCoder: BinaryTypeCoder = {\n $write: (value, writer) => intCoder.$write(value.getTime(), writer),\n $read: (reader) => new Date(intCoder.$read(reader)),\n};\n\nexport const bufferCoder: BinaryTypeCoder = {\n $write: (value, writer) => {\n uintCoder.$write(value.byteLength, writer); // prefix length\n writer.$writeBytes(value);\n },\n $read: (reader) => reader.$readBytes(uintCoder.$read(reader)),\n};\n\nexport const stringCoder: BinaryTypeCoder = {\n $write: (value, writer) => bufferCoder.$write($utf8encode(value), writer),\n $read: (reader) => $utf8decode(bufferCoder.$read(reader)),\n};\n\nexport const boolCoder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint8(value ? 1 : 0),\n $read: (reader) => reader.$readUint8() !== 0,\n};\n\nexport const boolsCoder: BinaryTypeCoder = {\n $write: (value, writer) => {\n if (value.length > 28) value = value.slice(0, 28); // drop additional\n uintCoder.$write(mask(value), writer);\n },\n $read: (reader, p) => unmask(uintCoder.$read(reader), p),\n};\n\nexport const jsonCoder: BinaryTypeCoder = {\n $write: (value, writer) => stringCoder.$write(JSON.stringify(value), writer),\n $read: (reader) => JSON.parse(stringCoder.$read(reader)),\n};\n\nexport const regexCoder: BinaryTypeCoder = {\n $write: (value, writer) => {\n writer.$writeUint8(mask([value.global, value.ignoreCase, value.multiline]));\n stringCoder.$write(value.source, writer);\n },\n $read: (reader) => {\n const [g, i, m] = unmask(reader.$readUint8());\n return new RegExp(stringCoder.$read(reader), (g ? \"g\" : \"\") + (i ? \"i\" : \"\") + (m ? \"m\" : \"\"));\n }\n};\n\nexport const writers: Record> = {\n [Type.UInt]: uintCoder.$write,\n [Type.UInt8]: uint8Coder.$write,\n [Type.UInt16]: uint16Coder.$write,\n [Type.UInt32]: uint32Coder.$write,\n [Type.Int]: intCoder.$write,\n [Type.Int8]: int8Coder.$write,\n [Type.Int16]: int16Coder.$write,\n [Type.Int32]: int32Coder.$write,\n [Type.Float64]: float64Coder.$write,\n [Type.Float32]: float32Coder.$write,\n [Type.Float16]: float16Coder.$write,\n [Type.BFloat16]: bfloat16Coder.$write,\n [Type.Scalar8]: scalar8Coder.$write,\n [Type.UScalar8]: uscalar8Coder.$write,\n [Type.Bool]: boolCoder.$write,\n [Type.Bools]: boolsCoder.$write,\n [Type.Buffer]: bufferCoder.$write,\n [Type.String]: stringCoder.$write,\n [Type.JSON]: jsonCoder.$write,\n [Type.RegExp]: regexCoder.$write,\n [Type.Date]: dateCoder.$write,\n};\n\nexport const readers: Record> = {\n [Type.UInt]: uintCoder.$read,\n [Type.UInt8]: uint8Coder.$read,\n [Type.UInt16]: uint16Coder.$read,\n [Type.UInt32]: uint32Coder.$read,\n [Type.Int]: intCoder.$read,\n [Type.Int8]: int8Coder.$read,\n [Type.Int16]: int16Coder.$read,\n [Type.Int32]: int32Coder.$read,\n [Type.Float64]: float64Coder.$read,\n [Type.Float32]: float32Coder.$read,\n [Type.Float16]: float16Coder.$read,\n [Type.BFloat16]: bfloat16Coder.$read,\n [Type.Scalar8]: scalar8Coder.$read,\n [Type.UScalar8]: uscalar8Coder.$read,\n [Type.Bool]: boolCoder.$read,\n [Type.Bools]: boolsCoder.$read,\n [Type.Buffer]: bufferCoder.$read,\n [Type.String]: stringCoder.$read,\n [Type.JSON]: jsonCoder.$read,\n [Type.RegExp]: regexCoder.$read,\n [Type.Date]: dateCoder.$read,\n};\n","/** Default maximum transmission unit in networking */\nconst MTU = 1500;\n\n/** Set Tinybuf global config */\nexport const setTinybufConfig = (c: Partial): void => {\n cfg = { ...cfg, ...c };\n};\n\nexport type TinybufConfig = {\n /**\n * (default: false)\n *\n * This sets the default value for `preserveBytes` on\n * `encode(data, preserveBytes?)`.\n *\n * By default, `encode()` returns its encoded bytes as a `Uint8Array`\n * view of the bytes in the shared encoding buffer.\n *\n * This is suitable for synchronous use (e.g. high-performance applications)\n * as it avoids slow and expensive memory allocation and fragmentation on\n * each call to `encode()`.\n *\n * However, susbsequent calls are destructive to the underlying bytes, so\n * for asynchronous uses (e.g. Promises, Workers, long-lived storage), set\n * `preserveBytes` to `true`.\n */\n safe: boolean,\n\n /**\n * (default: true)\n * By default, format encoders share a global encoding buffer for performance\n * and memory management reasons.\n *\n * When set to false, each format is allocated an individual encoding buffer.\n *\n * Enable to maximise performance and memory re-use, just be cautious of\n * possible race conditions.\n */\n useGlobalEncodingBuffer: boolean,\n\n /**\n * (default: 1500)\n * The maximum bytes that can be allocated to an encoding buffer.\n *\n * Default is 1500 bytes, the standard \"Maximum Transmission Unit\".\n */\n encodingBufferMaxSize: number,\n\n /**\n * (default: 256)\n * Initial bytes to allocate for an encoding buffer.\n */\n encodingBufferInitialSize: number,\n\n /**\n * (default: 256)\n * Additional bytes to allocated when dynamically increasing the size of an encoding buffer.\n */\n encodingBufferIncrement: number,\n};\n\n/** @internal */\nexport let cfg: TinybufConfig = {\n safe: false,\n useGlobalEncodingBuffer: true,\n encodingBufferMaxSize: MTU,\n encodingBufferInitialSize: 256,\n encodingBufferIncrement: 256,\n};\n","import { cfg } from \"../config\";\nimport { TinybufError } from \"./errors\";\n\n/**\n * Wraps a buffer with a write head pointer.\n *\n * @internal\n */\nexport class BufferWriter {\n public $byteLength: number = 0;\n private _$dataView: DataView;\n private _$bytes: Uint8Array;\n private _$base: number;\n private _$writeHead: number = 0;\n private _$resizable: boolean;\n\n public constructor($0: number | Uint8Array) {\n this._$resizable = typeof $0 === \"number\";\n let b = $0 instanceof Uint8Array ? $0 : new Uint8Array($0);\n this._$bytes = b;\n this._$base = b.byteOffset;\n this._$dataView = new DataView(b.buffer);\n }\n\n /** Retarget the writer to a fixed-size byte array, reusing the existing DataView where possible. */\n public $reset(b: Uint8Array): this {\n if (this._$dataView.buffer !== b.buffer) {\n this._$dataView = new DataView(b.buffer);\n }\n\n this._$bytes = b;\n this._$base = b.byteOffset;\n this._$resizable = false;\n this._$writeHead = 0;\n this.$byteLength = 0;\n\n return this;\n }\n\n public $viewBytes(): Uint8Array {\n return this._$bytes.subarray(0, this.$byteLength);\n }\n\n public $copyBytes(): Uint8Array {\n const buf = new Uint8Array(this.$byteLength);\n buf.set(this.$viewBytes());\n return buf;\n }\n\n // ----- Writers: -----\n\n public $writeInt8(value: number): void {\n this._$pre(1).setInt8(this._$writeHead, value);\n }\n\n public $writeInt16(value: number): void {\n this._$pre(2).setInt16(this._$writeHead, value, true);\n }\n\n public $writeInt32(value: number): void {\n this._$pre(4).setInt32(this._$writeHead, value, true);\n }\n\n public $writeUint8(value: number): void {\n this._$pre(1).setUint8(this._$writeHead, value);\n }\n\n public $writeUint16(value: number): void {\n this._$pre(2).setUint16(this._$writeHead, value, false); // big-endian for varint\n }\n\n public $writeUint32(value: number): void {\n this._$pre(4).setUint32(this._$writeHead, value, false); // big-endian for varint\n }\n\n public $writeFloat32(value: number): void {\n this._$pre(4).setFloat32(this._$writeHead, value, true);\n }\n\n public $writeFloat64(value: number): void {\n this._$pre(8).setFloat64(this._$writeHead, value, true);\n }\n\n public $writeBytes(b: Uint8Array | ArrayBuffer | ArrayBufferView): void {\n // allocate bytes first\n this._$pre(b.byteLength);\n\n this._$bytes.set(\n b instanceof Uint8Array\n ? b\n : ArrayBuffer.isView(b)\n ? new Uint8Array(b.buffer, b.byteOffset, b.byteLength)\n : new Uint8Array(b),\n this._$writeHead - this._$base\n );\n }\n\n // ----- Private methods: -----\n\n /**\n * Pre-allocate some bytes on the dataview, moving the write head into\n * position.\n *\n * @throws TinybufError\n */\n private _$pre(bytes: number): DataView {\n if (this.$byteLength + bytes > this._$bytes.byteLength) {\n this._$malloc(bytes);\n }\n\n this._$writeHead = this._$base + this.$byteLength;\n this.$byteLength += bytes;\n\n return this._$dataView;\n }\n\n /**\n * @throws TinybufError\n */\n private _$malloc(bytes: number): void {\n if (!this._$resizable) {\n throw new TinybufError(\"exceeded buffer length: \" + this._$bytes.byteLength);\n }\n\n const currentBytes = this._$bytes.byteLength;\n const minNewBytes = this.$byteLength + bytes - currentBytes;\n const availableBytes = cfg.encodingBufferMaxSize - currentBytes;\n\n if (minNewBytes > availableBytes) {\n throw new TinybufError(\"exceeded encodingBufferMaxSize: \" + cfg.encodingBufferMaxSize);\n }\n\n const increment = cfg.encodingBufferIncrement;\n const newBytes = Math.ceil(minNewBytes / increment) * increment;\n const newSize = currentBytes + Math.min(newBytes, availableBytes);\n const buf = new Uint8Array(newSize);\n\n // copy bytes\n buf.set(this._$bytes);\n\n // update refs\n this._$dataView = new DataView(buf.buffer);\n this._$bytes = buf;\n this._$base = 0;\n }\n}\n","/**\n * Wraps a buffer with a read head pointer.\n *\n * @internal\n */\nexport class BufferReader {\n public i: number;\n private _$dataView!: DataView;\n private _$base!: number;\n private _$byteLength!: number;\n\n public constructor(b: Uint8Array | ArrayBufferView | ArrayBuffer, headerBytes?: number) {\n this.$reset(b, headerBytes);\n }\n\n /** Retarget the reader to a new buffer, reusing the existing DataView where possible. */\n public $reset(b: Uint8Array | ArrayBufferView | ArrayBuffer, headerBytes?: number): this {\n const isView = ArrayBuffer.isView(b);\n const buffer = isView ? b.buffer : b;\n const offset = isView ? b.byteOffset : 0;\n let dv = this._$dataView;\n\n if (\n dv === undefined\n || dv.buffer !== buffer\n || offset < dv.byteOffset\n || offset + b.byteLength > dv.byteOffset + dv.byteLength\n ) {\n dv = this._$dataView = b instanceof DataView ? b : new DataView(buffer);\n }\n\n this._$base = offset - dv.byteOffset;\n this._$byteLength = b.byteLength;\n this.i = headerBytes ?? 0; // internal offset (header)\n\n return this;\n }\n\n /** Read the next byte, without moving the read head pointer. */\n public $peek(): number {\n if (this.i >= this._$byteLength) {\n throw new RangeError(\"exceeded bytes\");\n }\n\n return this._$dataView.getUint8(this._$base + this.i);\n }\n\n /** Skip the next byte without reading it. */\n public $skip(): void {\n this.i++;\n }\n\n // ----- Readers: -----\n\n public $readUint8(): number {\n return this._$dataView.getUint8(this._$at(1));\n }\n\n public $readUint16(): number {\n return this._$dataView.getUint16(this._$at(2)); // big-endian\n }\n\n public $readUint32(): number {\n return this._$dataView.getUint32(this._$at(4)); // big-endian\n }\n\n public $readInt8(): number {\n return this._$dataView.getInt8(this._$at(1));\n }\n\n public $readInt16(): number {\n return this._$dataView.getInt16(this._$at(2), true); // little-endian\n }\n\n public $readInt32(): number {\n return this._$dataView.getInt32(this._$at(4), true); // little-endian\n }\n\n public $readFloat32(): number {\n return this._$dataView.getFloat32(this._$at(4), true); // little-endian\n }\n\n public $readFloat64(): number {\n return this._$dataView.getFloat64(this._$at(8), true); // little-endian\n }\n\n /** @throws RangeError if exceeds length */\n public $readBytes(bytes: number): Uint8Array {\n return new Uint8Array(\n this._$dataView.buffer,\n this._$dataView.byteOffset + this._$at(bytes),\n bytes\n );\n }\n\n // ----- Private methods: -----\n\n /**\n * Advance the read head, returning the DataView offset to read from.\n *\n * @throws RangeError if exceeds length\n */\n private _$at(bytes: number): number {\n const i = this.i;\n\n if (i + bytes > this._$byteLength) {\n throw new RangeError(\"exceeded bytes\");\n }\n\n this.i = i + bytes;\n\n return this._$base + i;\n }\n}\n","/* eslint-disable @typescript-eslint/unified-signatures */\nimport { writers, readers } from \"./lib/coders\";\nimport * as coders from \"./lib/coders\";\nimport { $hashCode, $strToHashCode } from \"./lib/hashCode\";\nimport { peekHeader, peekHeaderStr } from \"./lib/peek\";\nimport { BufferWriter } from \"./lib/BufferWriter\";\nimport { BufferReader } from \"./lib/BufferReader\";\nimport {\n DecodedType,\n EncoderDefinition,\n FieldDefinition,\n TransformConfig,\n ValidationConfig,\n MaybeType,\n Transforms,\n TypeLiteral,\n ValidationFn,\n ValidTypes,\n} from \"./Type\";\nimport { cfg } from \"./config\";\n\nexport type FormatHeader = string | number;\n\n/**\n * Utility to get the decoded type of a buffer format\n * @example type Format = Decoded\n */\nexport type Decoded = TBufferFormat extends BufferFormat\n ? DecodedType\n : never;\n\n/**\n * Defines a format for encoding/decoding binary buffers.\n *\n * Optionally customize the identifier, either as a 2-byte string, an unsigned integer (0 -> 65,535), or as `null` to disable entirely.\n *\n * @example\n * const MyFormat = defineFormat({ ... });\n * const MyFormat = defineFormat('ab', { ... });\n * const MyFormat = defineFormat(1234, { ... });\n * const MyFormat = defineFormat(null, { ... });\n */\nexport function defineFormat(def: T): BufferFormat;\n/**\n * Defines a format for encoding/decoding binary buffers.\n *\n * Optionally customize the identifier, either as a 2-byte string, an unsigned integer (0 -> 65,535), or as `null` to disable entirely.\n *\n * @example\n * const MyFormat = defineFormat({ ... });\n * const MyFormat = defineFormat('ab', { ... });\n * const MyFormat = defineFormat(1234, { ... });\n * const MyFormat = defineFormat(null, { ... });\n */\nexport function defineFormat(h: HeaderType | null, def: T): BufferFormat;\nexport function defineFormat(a?: HeaderType | T, b?: T): BufferFormat {\n return a !== null && typeof a === \"object\"\n ? new BufferFormat(a as T)\n : new BufferFormat(b as T, a as HeaderType);\n}\n\nfunction isValidHeader(h: FormatHeader): boolean {\n if (typeof h === \"number\") return Number.isInteger(h) && h >= 0 && h <= 65_535;\n if (typeof h === \"string\") return new TextEncoder().encode(h).byteLength === 2;\n return false;\n}\n\n/**\n * BufferFormat is a utility class for encoding and decoding binary data based\n * on a provided encoding format.\n *\n * @see {header}\n * @see {encode(data)}\n * @see {decode(binary)}\n */\nexport class BufferFormat {\n /** @internal */\n private static _$globalWriter?: BufferWriter;\n\n /**\n * A unique identifier encoded as the first 2 bytes (or `undefined` if headerless).\n *\n * @see {peekHeader(...)}\n * @see {peekHeaderStr(...)}\n */\n public header!: HeaderType;\n\n /** @internal */\n private _$header!: number; // always uint16 vesion\n /** @internal */\n private _$type!: TypeLiteral;\n /** @internal */\n private _$fields!: Field[];\n /** @internal */\n private _$fieldsMap!: Map;\n\n /** @internal */\n private _$format?: string;\n /** @internal */\n private _$transforms?: Transforms | undefined;\n /** @internal */\n private _$validate?: ValidationFn | undefined;\n /** @internal */\n private _$hasValidationOrTransforms = false;\n /** @internal */\n private _$writer?: BufferWriter;\n /** @internal */\n private _$intoWriter?: BufferWriter;\n /** @internal */\n private _$reader?: BufferReader;\n\n public constructor(\n def: EncoderType,\n header?: HeaderType | null,\n ) {\n // set definition\n if (typeof def === \"string\" && ValidTypes.includes(def)) {\n this._$type = def;\n }\n else if (def instanceof MaybeType) {\n throw new TypeError(\"Format cannot be optional\");\n }\n else if (def instanceof Object) {\n this._$type = undefined; // object\n this._$fieldsMap = new Map();\n this._$fields = Object.keys(def).map((name) => {\n const f = new Field(name, def[name]);\n this._$fieldsMap.set(name, f); // also set map entry\n return f;\n });\n\n // set headers\n if (header === undefined) {\n this.header = $hashCode(this.f) as HeaderType; // automatic\n this._$header = this.header as number;\n }\n else if (header === null) {\n this.header = undefined; // headerless\n this._$header = undefined;\n }\n else if (isValidHeader(header)) {\n this.header = header; // manual\n this._$header = typeof header === \"number\" ? header : $strToHashCode(header);\n }\n else {\n throw new TypeError(\"Header must be 2-byte string, uint16, or null.\");\n }\n }\n else {\n throw new TypeError(\"Format must be object or Type\");\n }\n }\n\n // ----- Static methods: -----\n\n /**\n * Read the header of a buffer as a number.\n *\n * @see {header}\n * @throws {RangeError} if buffer size < 2\n */\n public static peekHeader = peekHeader;\n\n /**\n * Read the header of a buffer as a string.\n *\n * @see {header}\n * @throws {RangeError} if buffer size < 2\n */\n public static peekHeaderStr = peekHeaderStr;\n\n // ----- Accessors: -----\n\n /**\n * @example \"{uint8,str[]?}\"\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n private get f(): string {\n if (this._$format === undefined) {\n this._$format = this._$fields !== undefined\n ? `{${this._$fields.map(v => v.f).join(\",\")}}`\n : `${this._$type}`;\n }\n\n return this._$format;\n }\n\n /** @internal */\n private static _$initWriter(): BufferWriter {\n if (cfg.useGlobalEncodingBuffer) {\n if (!BufferFormat._$globalWriter) {\n this._$globalWriter = new BufferWriter(cfg.encodingBufferMaxSize);\n }\n\n return this._$globalWriter;\n }\n\n return new BufferWriter(cfg.encodingBufferInitialSize);\n }\n\n /**\n * Encode an object into an existing byte array.\n *\n * **Warning:** Returns an unsafe view into the encoding buffer. Pass this reference to preserve\n * performance, and to minimize memory allocation and fragmentation.\n */\n public encodeInto>(\n data: TDecodedType,\n bytes: Uint8Array,\n ): Uint8Array {\n return bytes.subarray(0, this.encodeIntoLength(data, bytes));\n }\n\n /**\n * Encode an object into an existing byte array, without allocating a view.\n *\n * @returns the number of bytes written to the start of `bytes`\n * @throws if fails to encode value to schema, or `bytes` is too small\n */\n public encodeIntoLength>(\n data: TDecodedType,\n bytes: Uint8Array,\n ): number {\n if (this._$hasValidationOrTransforms) {\n data = this._$preprocess(data);\n }\n\n const writer = this._$intoWriter?.$reset(bytes) ?? new BufferWriter(bytes);\n this._$intoWriter = undefined;\n\n try {\n this._$write(data, writer);\n\n return writer.$byteLength;\n }\n finally {\n this._$intoWriter = writer;\n }\n }\n\n /**\n * Encode an object to bytes.\n *\n * **Warning:** Returns an unsafe view into the encoding buffer. Pass this reference to preserve\n * performance, and to minimize memory allocation and fragmentation.\n *\n * @param data - data to encode\n * @param preserveBytes - (default: `setTinybufConfig().safe`) When set to true, copies encoded\n * bytes to a new buffer. When set to false, returns an unsafe view of bytes but prevents\n * unnnecessary memory allocation and fragmentation.\n *\n * @returns a copy of encoded bytes\n * @throws if fails to encode value to schema\n */\n public encode>(\n data: TDecodedType,\n preserveBytes?: boolean,\n ): Uint8Array {\n if (!this._$writer) {\n // lazy init\n this._$writer = BufferFormat._$initWriter();\n }\n\n // reset\n this._$writer.$byteLength = 0;\n\n if (this._$hasValidationOrTransforms) {\n data = this._$preprocess(data);\n }\n\n this._$write(data, this._$writer);\n\n return (preserveBytes ?? cfg.safe)\n ? this._$writer.$copyBytes()\n : this._$writer.$viewBytes();\n }\n\n /**\n * Decode binary data into an existing object instance.\n * @throws if fails to decode bytes to schema.\n */\n public decodeInto>(\n bytes: Uint8Array | ArrayBufferView | ArrayBuffer,\n obj: Partial,\n ): TDecodedType {\n return this._$decode(bytes, obj);\n }\n /**\n * Decode binary data to an object.\n * @throws if fails to decode bytes to schema.\n */\n public decode>(\n bytes: Uint8Array | ArrayBufferView | ArrayBuffer\n ): TDecodedType;\n /**\n * @deprecated use decodeInto() instead\n */\n public decode>(\n bytes: Uint8Array | ArrayBufferView | ArrayBuffer,\n decodeInto: Partial,\n ): TDecodedType;\n /**\n * Decode binary data to an object.\n * @throws if fails to decode bytes to schema.\n */\n public decode>(\n bytes: Uint8Array | ArrayBufferView | ArrayBuffer,\n decodeInto?: Partial | undefined,\n ): TDecodedType {\n return this._$decode(bytes, decodeInto);\n }\n\n /**\n * Set additional transform functions to apply before encoding and after decoding.\n */\n public setTransforms(transforms: TransformConfig | Transforms): this {\n this._$hasValidationOrTransforms = true;\n\n if (typeof transforms === \"function\" || (Array.isArray(transforms) && typeof transforms[0] === \"function\")) {\n this._$transforms = transforms;\n }\n else {\n for (const name of Object.keys(transforms)) {\n const field = this._$fieldsMap.get(name);\n if (!field) {\n throw new TypeError(`Failed to set transforms for field '${name}'`);\n }\n\n // Set validation for object.\n field.$coder.setTransforms(transforms[name]);\n }\n }\n\n return this;\n }\n\n /**\n * Set additional validation rules which are applied on encode() and decode().\n *\n * - Validation functions should throw an error, return an error, or return boolean false.\n * - Anything else is treated as successfully passing validation.\n */\n public setValidation(validations: ValidationConfig | ValidationFn): this {\n this._$hasValidationOrTransforms = true;\n\n if (typeof validations === \"function\") {\n this._$validate = validations;\n }\n else {\n for (const name of Object.keys(validations)) {\n const field = this._$fieldsMap.get(name);\n if (!field) {\n throw new TypeError(`Failed to set validation function for field '${name}'`);\n }\n\n field.$coder.setValidation(validations[name]);\n }\n }\n\n return this;\n }\n\n // ----- Implementation: -----\n\n /** @internal */\n private _$decode(\n bytes: Uint8Array | ArrayBufferView | ArrayBuffer,\n obj: Partial | undefined,\n ): TDecodedType {\n const headerBytes = this.header === undefined ? 0 : 2;\n\n const reader = this._$reader?.$reset(bytes, headerBytes) ?? new BufferReader(bytes, headerBytes);\n this._$reader = undefined;\n\n try {\n return this._$read(reader, obj);\n }\n finally {\n this._$reader = reader;\n }\n }\n\n /**\n * @param value\n * @param bw\n * @throws if the value is invalid\n *\n * @internal\n */\n private _$write(value: any, bw: BufferWriter): void {\n // write header\n if (this._$header !== undefined) bw.$writeUint16(this._$header);\n\n // write scalar\n if (this._$type !== undefined) {\n const safeValue = (this._$validate || this._$transforms) ? this._$preprocess(value) : value;\n\n return writers[this._$type](safeValue, bw);\n }\n\n // check for object type\n if (typeof value !== \"object\" || !value) {\n throw new TypeError(\"expected object type\");\n }\n\n // write each field\n const fields = this._$fields;\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n const subValue = value[field.$name];\n\n if (field.$isOptional) {\n if (subValue === undefined || subValue === null) {\n coders.boolCoder.$write(false, bw);\n continue; // skip\n }\n else {\n coders.boolCoder.$write(true, bw);\n }\n }\n else if (subValue == null) {\n throw new Error(`missing required value: ${field.$name}`);\n }\n\n if (field.$isArray) {\n // array\n this._$writeArray(subValue, bw, field.$coder);\n continue;\n }\n\n // scalar/object field\n field.$coder._$write(subValue, bw);\n }\n }\n\n /**\n * pre-process: validation and/or transforms\n * @internal\n */\n private _$preprocess>(data: T): T {\n if (this._$validate) this._$processValidation(data);\n\n if (typeof this._$transforms === \"function\") {\n return this._$transforms(data);\n }\n else if (Array.isArray(this._$transforms) && typeof this._$transforms[0] === \"function\") {\n return this._$transforms[0](data);\n }\n\n return data;\n }\n\n /**\n * post-process: validation and/or transforms\n * @internal\n */\n private _$postprocess>(data: T): T {\n if (Array.isArray(this._$transforms) && typeof this._$transforms[1] === \"function\") {\n data = this._$transforms[1](data);\n }\n\n if (this._$validate) this._$processValidation(data);\n\n return data;\n }\n\n private _$processValidation(data: any): void {\n if (!this._$validate) return;\n const res = this._$validate(data);\n if (res instanceof Error) throw res;\n if (res === false) throw new Error(\"failed validation\");\n }\n\n /**\n * This function will be executed only the first time\n * After that, we'll compile the read routine and add it directly to the instance\n * @param state\n * @returns\n * @throws if fails\n *\n * @internal\n */\n private _$read>(state: BufferReader, obj?: Partial): TDecodedType {\n // This function will be executed only the first time to compile the read routine.\n // After that, we'll compile the read routine and add it directly to the instance\n\n // Update the read method implementation.\n this._$read = this._$compileFormatReadFn();\n\n return this._$read(state, obj);\n }\n\n /**\n * Generate read function code for this coder.\n *\n * @example\n * let v=o??{};\n * v.prop1=this._$readField(0,s,o);\n * v.prop2=this._$readField(1,s,o);\n * return v\n *\n * @internal\n */\n private _$makeObjectReadFnBody(): string {\n const fieldsStr: string = this._$fields\n .map(({ $name: n }, i) => `v.${n}=this.${this._$readField.name}(${i},s,v.${n})`)\n .join(\";\");\n\n return `let v=o??{};${fieldsStr};return v;`;\n }\n\n /**\n * Read an individual field.\n * @internal\n */\n private _$readField(fieldIndex: number, state: BufferReader, obj?: any): any {\n const field = this._$fields[fieldIndex];\n\n if (field.$isOptional && !coders.boolCoder.$read(state)) {\n return undefined;\n }\n\n if (field.$isArray) {\n return this._$readArray(field.$coder, state, obj);\n }\n\n return field.$coder._$read(state, obj);\n }\n\n /**\n * Compile the decode() method for this object.\n *\n * @internal\n */\n private _$compileFormatReadFn>(): (state: BufferReader, obj: Partial | undefined) => TDecodedType {\n if (this._$type !== undefined) {\n // scalar type\n return this._$hasValidationOrTransforms\n ? (s) => this._$postprocess(readers[this._$type](s))\n : readers[this._$type];\n }\n\n // object type\n return new Function(\"s\", \"o\", this._$makeObjectReadFnBody()) as any;\n }\n\n /**\n * @internal\n */\n private _$writeArray(value: any[], bw: BufferWriter, type: BufferFormat): void {\n if (!Array.isArray(value)) {\n throw new TypeError(`expected array, instead got: ${value}`);\n }\n\n coders.uintCoder.$write(value.length, bw);\n for (let i = 0; i < value.length; i++) {\n type._$write(value[i], bw);\n }\n }\n\n /**\n * @throws if invalid data\n * @internal\n */\n private _$readArray(type: BufferFormat, state: any, obj?: Array): Array {\n const len = coders.uintCoder.$read(state);\n const arr = Array.isArray(obj) ? obj : new Array(len);\n if (arr.length !== len) arr.length = len;\n for (let j = 0; j < arr.length; j++) {\n arr[j] = type._$read(state, obj?.[j]);\n }\n return arr;\n }\n}\n\n/**\n * Parses and represents an object field.\n *\n * @internal\n */\nclass Field {\n public $name: string;\n public $coder: BufferFormat;\n public $isOptional: boolean;\n public $isArray: boolean;\n\n private _$formatString?: string;\n\n public constructor(name: string, rawType: FieldDefinition) {\n this.$isOptional = rawType instanceof MaybeType;\n let type = rawType instanceof MaybeType ? rawType.type : rawType;\n\n this.$name = name;\n\n if (Array.isArray(type)) {\n if (type.length !== 1) {\n throw new TypeError(\"Array type must contain exactly one format\");\n }\n\n type = type[0];\n this.$isArray = true;\n }\n else {\n this.$isArray = false;\n }\n\n this.$coder = new BufferFormat(type, null);\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public get f(): string {\n if (this._$formatString === undefined) {\n this._$formatString = `${(this.$coder as any).f}${this.$isArray ? \"[]\" : \"\"}${this.$isOptional ? \"?\" : \"\"}`;\n }\n\n return this._$formatString;\n }\n}\n"],"names":["TinybufError","Error","$hashCode","str","hash","i","length","charCodeAt","$strToHashCode","$hashCodeToStr","hashCode","String","fromCharCode","Math","floor","peekHeader","b","byteLength","RangeError","Uint8Array","DataView","getUint16","u8","ArrayBuffer","isView","buffer","byteOffset","peekHeaderStr","bufferParser","BufferParser","constructor","this","_$formats","Map","_$data","processBuffer","f","data","cb","r","header","has","get","_a","decode","set","e","err","stack","on","format","callback","decodeInPlace","ignore","forEach","clear","$floor","$ceil","ceil","$clamp","value","min","max","$roundTowardZero","x","$roundAwayFromZero","uscalround","$fromuscal8","$touscal8","scalround","$fromscal8","$toscal8","Type","UInt","UInt8","UInt16","UInt32","Int","Int8","Int16","Int32","Float64","Float32","Float16","BFloat16","Scalar8","UScalar8","Bool","Bools","Buffer","JSON","RegExp","Date","ValidTypes","Object","values","MaybeType","type","optional","t","mask","padBit","reduce","n","unmask","l","len","undefined","clz32","Array","isArray","val","$utf8encode","encoder","TextEncoder","encode","$utf8decode","decoder","TextDecoder","y","f16round","$fromf16","$tof16","Float32Array","Int32Array","s","z","pow","d","m","Infinity","NaN","Uint32Array","bf16round","MAX_VARUINT32","MAX_VARINT32","POW_32","uintCoder","$write","writer","Number","$writeUint8","$writeUint16","$writeUint32","$read","reader","firstByte","$peek","$readUint32","$readUint16","$skip","uint8Coder","$readUint8","uint16Coder","uint32Coder","intCoder","int8Coder","$writeInt8","$readInt8","int16Coder","$writeInt16","$readInt16","int32Coder","$writeInt32","$readInt32","bfloat16Coder","$tobf16","$frombf16","float16Coder","float32Coder","$writeFloat32","$readFloat32","float64Coder","$writeFloat64","$readFloat64","uscalar8Coder","scalar8Coder","dateCoder","getTime","bufferCoder","$writeBytes","$readBytes","stringCoder","boolCoder","boolsCoder","slice","p","jsonCoder","stringify","parse","regexCoder","global","ignoreCase","multiline","source","g","writers","readers","setTinybufConfig","c","cfg","assign","safe","useGlobalEncodingBuffer","encodingBufferMaxSize","encodingBufferInitialSize","encodingBufferIncrement","BufferWriter","$0","$byteLength","_$writeHead","_$resizable","_$bytes","_$base","_$dataView","$reset","$viewBytes","subarray","$copyBytes","buf","_$pre","setInt8","setInt16","setInt32","setUint8","setUint16","setUint32","setFloat32","setFloat64","bytes","_$malloc","currentBytes","minNewBytes","availableBytes","increment","newBytes","newSize","BufferReader","headerBytes","offset","dv","_$byteLength","getUint8","_$at","getUint32","getInt8","getInt16","getInt32","getFloat32","getFloat64","defineFormat","a","BufferFormat","def","_$hasValidationOrTransforms","includes","_$type","TypeError","_$fieldsMap","_$fields","keys","map","name","Field","_$header","isValidHeader","h","isInteger","_$format","v","join","_$initWriter","_$globalWriter","encodeInto","encodeIntoLength","_$preprocess","_b","_$intoWriter","_$write","preserveBytes","_$writer","decodeInto","obj","_$decode","setTransforms","transforms","_$transforms","field","$coder","setValidation","validations","_$validate","_$reader","_$read","bw","safeValue","fields","subValue","$name","$isOptional","coders.boolCoder","$isArray","_$writeArray","_$processValidation","_$postprocess","res","state","_$compileFormatReadFn","_$makeObjectReadFnBody","fieldsStr","_$readField","fieldIndex","_$readArray","Function","coders.uintCoder","arr","j","rawType","_$formatString"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.mjs","sources":["../src/core/lib/errors.ts","../src/core/lib/hashCode.ts","../src/core/lib/peek.ts","../src/core/BufferParser.ts","../src/core/lib/math.ts","../src/core/lib/scalar.ts","../src/core/Type.ts","../src/core/lib/bitmask.ts","../src/core/lib/utf8.ts","../src/core/lib/float16.ts","../src/core/lib/bfloat16.ts","../src/core/lib/coders.ts","../src/core/config.ts","../src/core/lib/BufferWriter.ts","../src/core/lib/BufferReader.ts","../src/core/BufferFormat.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/unified-signatures */\n\nexport class TinybufError extends Error {}\n","/**\n * DJB2 hash algorithm (modified for 16-bit uints).\n *\n * DJB2 is a simple and widely used non-cryptographic\n * hash function created by Daniel J. Bernstein.\n *\n * @returns 16-bit unsigned integer\n */\nexport function $hashCode(str: string): number {\n let hash = 5381;\n for (let i = 0; i < str.length; i++) {\n hash = (hash * 33) ^ str.charCodeAt(i);\n }\n return hash & 0xFFFF; // Ensure the result is a Uint16\n}\n\n/**\n * Returns an unsigned 16-bit integer hashcode for some string.\n * Prefers 2 character string.\n *\n * @returns A UInt16 between 0 and 65535 (inclusive).\n */\nexport function $strToHashCode(str: string): number {\n if (str.length !== 2) return $hashCode(str);\n return str.charCodeAt(0) * 256 + str.charCodeAt(1);\n}\n\n/**\n * Convert a UInt16 hashcode to a 2-byte string.\n */\nexport function $hashCodeToStr(hashCode: number): string {\n return String.fromCharCode(Math.floor(hashCode / 256)) + String.fromCharCode(hashCode % 256);\n}\n","import { $hashCodeToStr } from \"./hashCode\";\n\n\n/**\n * Read the header bytes of a buffer as a number.\n *\n * @throws {RangeError} if buffer size < 2\n */\nexport function peekHeader(b: ArrayBuffer | ArrayBufferView): number {\n if (b.byteLength < 2) {\n throw new RangeError(\"buffer length < 2\");\n }\n\n if (b instanceof Uint8Array) return (b[0] << 8) | b[1];\n if (b instanceof DataView) return b.getUint16(0, false);\n\n const u8 = ArrayBuffer.isView(b) ? new Uint8Array(b.buffer, b.byteOffset, 2) : new Uint8Array(b, 0, 2);\n\n return (u8[0] << 8) | u8[1];\n}\n\n/**\n * Read the header bytes of a buffer as a string.\n *\n * @throws {RangeError} if buffer length < 2\n */\nexport function peekHeaderStr(b: ArrayBuffer | ArrayBufferView): string {\n return $hashCodeToStr(peekHeader(b));\n}\n","import { BufferFormat } from \"./BufferFormat\";\nimport { EncoderDefinition, DecodedType } from \"./Type\";\nimport { TinybufError } from \"./lib/errors\";\nimport { $hashCodeToStr, $strToHashCode } from \"./lib/hashCode\";\nimport { peekHeader } from \"./lib/peek\";\n\ntype AnyFormat = BufferFormat;\ntype Uint16FormatHeader = number;\n\n/**\n * Small utility for registering and processing format handlers.\n *\n * @example\n * const myHandler = bufferParser()\n * .on(FormatA, aData => {})\n * .on(FormatB, bData => {});\n *\n * myHandler.processBuffer(bytes);\n */\nexport const bufferParser = (): BufferParser => new BufferParser();\n\nexport class BufferParser {\n /** @internal */\n private _$formats = new Map any, decodeInPlace: boolean]>();\n private _$data = new Map(); // used when decoding in-place\n\n /**\n * Decode an array buffer and trigger the relevant data handler.\n *\n * When passed an ArrayBufferView, accesses the underlying 'buffer' instance directly.\n *\n * @throws {TinybufError} if fails to decode, or no handler is registered\n */\n public processBuffer(b: ArrayBuffer | ArrayBufferView): void {\n let f: any, data: any, cb: (data: any) => any, r: boolean;\n\n try {\n const header = peekHeader(b);\n\n if (!this._$formats.has(header)) {\n throw new TinybufError(`Unknown format: ${header} '${$hashCodeToStr(header)}')`);\n }\n\n [f, cb, r] = this._$formats.get(header);\n if (r) data = this._$data.get(header) ?? {};\n data = f.decode(b, data);\n if (r) this._$data.set(header, data);\n }\n catch (e) {\n const err = new TinybufError(`Failed to decode: ${e}`);\n err.stack = e.stack;\n\n throw err;\n }\n\n cb(data);\n }\n\n /**\n * Register a format handler.\n */\n public on>(\n format: BufferFormat,\n callback: (data: TDecodedType) => any,\n {\n decodeInPlace = false,\n } = {},\n ): this {\n if (format.header == null) {\n throw new TinybufError(\"Format requires header\");\n }\n\n const header = typeof format.header === \"string\" ? $strToHashCode(format.header) : format.header;\n\n if (this._$formats.has(header) && this._$formats.get(header)?.[0] !== format) {\n throw new TinybufError(`Format header collision: ${format.header}`);\n }\n\n this._$formats.set(header, [format, callback, decodeInPlace]);\n\n return this;\n }\n\n /** Register a format (or formats) that are recognized. */\n public ignore(...format: AnyFormat[]): this {\n format.forEach(f => this.on(f, () => {}));\n return this;\n }\n\n /** Clears all registered formats and handlers. */\n public clear(): void {\n this._$formats.clear();\n this._$data.clear();\n }\n}\n","export const $floor = Math.floor,\n $ceil = Math.ceil;\n\n/** Clamp a number to a range. */\nexport const $clamp = (value: number, min: number, max: number): number =>\n value > max ? max : value < min ? min : value;\n\n/** Round toward zero */\nexport const $roundTowardZero = (x: number): number => x < 0 ? $ceil(x) : $floor(x);\n\n/** Round away zero */\nexport const $roundAwayFromZero = (x: number): number =>\n x < 0 ? $floor(x) : $ceil(x);\n","import { $clamp, $roundTowardZero, $roundAwayFromZero } from \"./math\";\n\n/**\n * Quantize a number to an 8-bit scalar between 0.0 and 1.0.\n *\n * @returns A number (double) in its closest signed scalar representation.\n */\nexport function uscalround(x: number): number {\n return $fromuscal8($touscal8(x));\n}\n\n/**\n * Quantize a number to an 8-bit signed scalar between -1.0 and 1.0.\n *\n * @returns A number (double) in its closest signed scalar representation.\n */\nexport function scalround(x: number): number {\n return $fromscal8($toscal8(x));\n}\n\n/** @returns A UInt8 bitmask representation. */\nexport function $touscal8(x: number): number {\n return $clamp(127 + $roundTowardZero(x * 254 - 127), 0, 254);\n}\n\n/** @returns A UInt8 bitmask representation. */\nexport function $toscal8(x: number): number {\n return $clamp($roundTowardZero(x * 127), -127, 127) + 127;\n}\n\n/** @returns An unsigned scalar between 0.0 and 1.0. */\nexport function $fromuscal8(x: number): number {\n // Make symmetric: (0.5 + round((uint8 - 127) / 254 * 100)) / 100\n return $clamp(($roundAwayFromZero((x - 127) * 0.3937007874015748) + 50) * 0.01, 0, 1);\n}\n\n/** @returns A signed scalar between -1.0 and 1.0. */\nexport function $fromscal8(x: number): number {\n // Make symmetric: round((uint8 - 127) / 127 * 100) / 100\n return $clamp($roundAwayFromZero((x - 127) * 0.787401574803149) * 0.01, -1, 1);\n}\n","/**\n * Field types for defining encoding formats.\n *\n * @see [Types](https://github.com/reececomo/tinybuf/blob/main/docs/types.md)\n */\nexport const Type = {\n /**\n * Unsigned integer (1 - 8 bytes).\n * - 0 → 127 = 1 byte\n * - 128 → 16,384 = 2 bytes\n * - 16,385 → 536,870,911 = 4 bytes\n * - 536,870,912 → `Number.MAX_SAFE_INTEGER` = 8 bytes\n */\n UInt: \"uint\",\n\n /** Unsigned 8-bit integer (between 0 and 255, 1 byte). */\n UInt8: \"u8\",\n\n /** Unsigned 16-bit integer (between 0 and 65,535, 2 bytes). */\n UInt16: \"u16\",\n\n /** Unsigned 32-bit integer (between 0 and 4,294,967,295, 4 bytes). */\n UInt32: \"u32\",\n\n /**\n * Signed integer (1 - 8 bytes).\n * - 0 → ±64 = 1 byte\n * - ±65 → ±8,192 = 2 bytes\n * - ±8,193 → ±268,435,456 = 4 bytes\n * - ±268,435,457 → ±`Number.MAX_SAFE_INTEGER` = 8 bytes\n */\n Int: \"int\",\n\n /** Signed 1 byte integer (between -127 and 127). */\n Int8: \"i8\",\n\n /** Signed 2 byte integer (between -32,767 and 32,767). */\n Int16: \"i16\",\n\n /** Signed 4 byte integer (between -2,147,483,647 and 2,147,483,647). */\n Int32: \"i32\",\n\n /** Default JavaScript `number` type. Floating-point number (64-bit, double precision, 8 bytes). */\n Float64: \"f64\",\n\n /** Floating-point number (32-bit, single precision, 4 bytes). */\n Float32: \"f32\",\n\n /**\n * Floating-point number (16-bit in FP16 format, half precision, 2 bytes).\n *\n * **Warning:** Low precision; maximum range: ±65,504.\n */\n Float16: \"f16\",\n\n /**\n * Floating-point number (16-bit in BF16 format, half precision, 2 bytes).\n *\n * **Warning:** Low precision.\n */\n BFloat16: \"b16\",\n\n /** A signed 2-decimal scalar between -1.00 and 1.00 (1 byte). */\n Scalar8: \"sc\",\n\n /** An unsigned 2-decimal scalar between 0.00 and 1.00 (1 byte). */\n UScalar8: \"usc\",\n\n /**\n * Boolean value (1 byte).\n * @see {Bools} for packing multiple booleans into a single byte.\n */\n Bool: \"bl\",\n\n /** Any array of booleans (1 bit overhead, encoded as UInt). */\n Bools: \"bls\",\n\n /** Any ArrayBuffer or ArrayBufferView (e.g. Uint8Array) value (encoded as 1 x UInt for byte length + buffer bytes). */\n Buffer: \"buf\",\n\n /** A UTF-8 string (encoded as 1 x UInt for UTF-8 byte length + UTF-8 bytes). */\n String: \"str\",\n\n /** Any JSON data (encodes as UTF-8). */\n JSON: \"jsn\",\n\n /** JavaScript RegExp object. */\n RegExp: \"re\",\n\n /**\n * JavaScript Date object.\n *\n * Encoded as an 8 byte (64-bit) integer UTC timestamp from as the number\n * of milliseconds since the Unix Epoch (January 1, 1970, 00:00:00 UTC).\n *\n * @see {Date}\n */\n Date: \"dt\",\n} as const;\n\nexport type TypeLiteral = typeof Type[keyof typeof Type];\nexport const ValidTypes = Object.values(Type);\n\n/**\n * Mappings for the value types.\n */\nexport type ValueTypes = {\n [Type.Int]: number;\n [Type.Int8]: number;\n [Type.Int16]: number;\n [Type.Int32]: number;\n [Type.UInt]: number;\n [Type.UInt8]: number;\n [Type.UInt16]: number;\n [Type.UInt32]: number;\n [Type.Float64]: number;\n [Type.Float32]: number;\n [Type.Float16]: number;\n [Type.BFloat16]: number;\n [Type.Scalar8]: number;\n [Type.UScalar8]: number;\n [Type.Bool]: boolean;\n [Type.Bools]: boolean[];\n [Type.Buffer]: Uint8Array | ArrayBuffer | ArrayBufferView;\n [Type.String]: string;\n [Type.JSON]: any;\n [Type.RegExp]: RegExp;\n [Type.Date]: Date;\n};\n\n/** https://www.totaltypescript.com/concepts/the-prettify-helper */\ntype Pretty = T extends ArrayBuffer | ArrayBufferView | Date | RegExp | Uint8Array ? T\n : T extends Array ? Array>\n : T extends object ? {[K in keyof T]: Pretty} & unknown : T;\n\n/** @throws any error too */\nexport type ValidationFn = (x: T) => undefined | boolean | Error;\nexport type TransformFn = (x: T) => T;\nexport type Transforms = TransformFn | [preEncode: TransformFn] | [preEncode: TransformFn | undefined, postDecode: TransformFn | undefined];\n\n/**\n * A wrapper around any Type definition that declares it as optional.\n */\nexport class MaybeType {\n public constructor(public type: T) {}\n}\n\n/**\n * Wrap any definition as optional.\n */\nexport function optional(t: T): MaybeType {\n return new MaybeType(t);\n}\n\n/**\n * A definition for an object binary encoder.\n */\nexport type EncoderDefinition = {\n [key: string]: FieldDefinition | MaybeType;\n};\n\n/**\n * Definition for an object-field binary encoder.\n */\nexport type FieldDefinition = keyof ValueTypes | [keyof ValueTypes] | EncoderDefinition | [EncoderDefinition] | MaybeType;\n\n/**\n * The resulting type of the decoded data, based on the encoder definition.\n */\ntype RawDecodedType = {\n [EKey in keyof EncoderType as EncoderType[EKey] extends MaybeType ? never : EKey]: EncoderType[EKey] extends keyof ValueTypes\n ? ValueTypes[EncoderType[EKey]]\n : EncoderType[EKey] extends [keyof ValueTypes]\n ? Array\n : EncoderType[EKey] extends EncoderDefinition\n ? RawDecodedType\n : EncoderType[EKey] extends [EncoderDefinition]\n ? Array>\n : never;\n} & {\n [EKey in keyof EncoderType as EncoderType[EKey] extends MaybeType ? EKey : never]?: EncoderType[EKey] extends MaybeType\n ? ValueTypes[OptionalValue] | undefined\n : EncoderType[EKey] extends MaybeType\n ? Array | undefined\n : EncoderType[EKey] extends MaybeType\n ? RawDecodedType | undefined\n : never;\n};\n\nexport type DecodedType = Pretty>;\n\nexport type TransformConfig = {\n [EKey in keyof EncoderType]?: EncoderType[EKey] extends keyof ValueTypes\n ? Transforms\n : EncoderType[EKey] extends [keyof ValueTypes]\n ? Transforms\n : EncoderType[EKey] extends EncoderDefinition\n ? TransformConfig\n : EncoderType[EKey] extends [EncoderDefinition]\n ? TransformConfig\n : EncoderType[EKey] extends MaybeType\n ? Transforms\n : EncoderType[EKey] extends MaybeType\n ? Transforms\n : EncoderType[EKey] extends MaybeType\n ? TransformConfig | undefined\n : never;\n};\n\nexport type ValidationConfig = {\n [EKey in keyof EncoderType]?: EncoderType[EKey] extends keyof ValueTypes\n ? ValidationFn\n : EncoderType[EKey] extends [keyof ValueTypes]\n ? ValidationFn\n : EncoderType[EKey] extends EncoderDefinition\n ? ValidationConfig\n : EncoderType[EKey] extends [EncoderDefinition]\n ? ValidationConfig\n : EncoderType[EKey] extends MaybeType\n ? ValidationFn\n : EncoderType[EKey] extends MaybeType\n ? ValidationFn\n : EncoderType[EKey] extends MaybeType\n ? ValidationConfig | undefined\n : never;\n};\n","/**\n * Mask booleans to a uint32.\n *\n * @param x - A boolean array.\n * @param padBit - A bit to pad the mask (for variable length data).\n */\nexport const mask = (x: boolean[], padBit: 0 | 1 = 0b1): number => {\n return x.reduce((n, b: any) => (n << 1) | b, padBit);\n};\n\n/**\n * Unmask booleans from a uint32.\n *\n * @param x - A uint32 number.\n * @param l - number of booleans to expect (default: infer lenth from x where x is encoded with a pad bit)\n * or pass an existing boolean array to decode in-place.\n */\nexport const unmask = (x: number, l?: number | boolean[]): boolean[] => {\n const len = l === undefined ? 31 - Math.clz32(x) : Array.isArray(l) ? l.length : l;\n const val = Array.isArray(l) && l.length === len ? l : new Array(len);\n for (let i = 0; i < len; i++) val[i] = !!(x & (1 << (len - 1 - i)));\n return val;\n};\n","export const $utf8encode = (function () {\n const encoder = new TextEncoder();\n return (x?: string): Uint8Array => encoder.encode(x);\n})();\n\nexport const $utf8decode = (function () {\n const decoder = new TextDecoder(\"utf-8\");\n return (y: Uint8Array): string => decoder.decode(y);\n})();\n","/**\n * Returns the nearest half precision float representation of a number.\n * @param x A numeric expression.\n */\nexport function f16round(x: number): number {\n return $fromf16($tof16(x));\n}\n\n/**\n * Returns the nearest half precision float representation of a number as a 16-bit bitmask.\n */\nexport const $tof16 = (function() {\n const x = new Float32Array(1);\n const y = new Int32Array(x.buffer);\n\n return function (f: number) {\n x[0] = f;\n let i = y[0]; // 32-bit int\n let s = (i >> 16) & 0X8000; // sign\n let z = (i & 0X7FFFFFFF) + 0X1000 | 0;\n\n if (z >= 0X47800000) {\n if ((i & 0X7FFFFFFF) < 0X47800000) return s | 0X7BFF;\n if (z < 0X7F800000) return s | 0X7C00;\n return s | 0X7C00 | (i & 0X007FFFFF) >> 13;\n }\n if (z >= 0X38800000) return s | z - 0X38000000 >> 13;\n else if (z < 0X33000000) return s;\n z = (i & 0X7FFFFFFF) >> 23;\n return s | ((i & 0X7FFFFF | 0X800000)\n + (0X800000 >>> z - 102)\n >> 126 - z);\n };\n}());\n\n/**\n * Returns the nearest half precision float value for a 16-bit bitmask.\n */\nexport const $fromf16 = (function() {\n const z = Math.pow(2, -24); // subnormal constant\n const d = new Float32Array(32 + 1024);\n for (let e = 0; e < 32; e++) d[e] = Math.pow(2, e - 15); // biased exponents\n for (let m = 0; m < 1024; m++) d[m + 0x20] = 1 + m / 1024; // normalized offset mantissas\n\n return function (b: number): number {\n const s = (b & 32768) === 32768 ? -1 : 1; // sign: 1 bit\n const e = b & 31744; // exponent: 5 bits\n const m = b & 1023; // mantissa: 10 bits\n\n if (e === 0) return m === 0 ? s * 0 : s * z;\n if (e === 31744) return m === 0 ? s * Infinity : NaN;\n return d[e >> 10] * d[m + 0x20] * s;\n };\n}());\n","const i = new Uint32Array(1);\nconst f = new Float32Array(i.buffer);\n\n/**\n * Returns the nearest bfloat16 representation of a number.\n * @param x A numeric expression.\n */\nexport function bf16round(x: number): number {\n f[0] = x;\n i[0] = i[0] & 0xFFFF0000;\n return f[0];\n}\n\n/** Returns a 16-bit bfloat16 bitmask for a given float. */\nexport function $tobf16(x: number): number {\n f[0] = x;\n return i[0] >>> 16;\n}\n\n/** Returns the nearest value from a 16-bit bfloat16 bitmask. */\nexport function $frombf16(x: number): number {\n i[0] = x << 16;\n return f[0];\n}\n","import { BufferWriter } from \"./BufferWriter\";\nimport { BufferReader } from \"./BufferReader\";\nimport {\n $fromuscal8,\n $fromscal8,\n $touscal8,\n $toscal8\n} from \"./scalar\";\nimport { TypeLiteral, Type } from \"../Type\";\nimport { mask, unmask } from \"./bitmask\";\nimport { $utf8decode, $utf8encode } from \"./utf8\";\nimport { $floor } from \"./math\";\nimport { $fromf16, $tof16 } from \"./float16\";\nimport { $frombf16, $tobf16 } from \"./bfloat16\";\n\n// Pre-calculated constants\nconst MAX_VARUINT8 = 128,\n MAX_VARUINT16 = 16_384,\n MAX_VARUINT32 = 536_870_912,\n MAX_VARINT8 = 64,\n MAX_VARINT16 = 8_192,\n MAX_VARINT32 = 268_435_456,\n POW_32 = 0x100000000;\n\ntype WriterFn = (value: W, writer: BufferWriter) => void;\ntype ReaderFn = (reader: BufferReader, overwrite?: Partial) => R;\n\nexport interface BinaryTypeCoder {\n $write: WriterFn;\n $read: ReaderFn;\n}\n\n/**\n * Format (big-endian):\n * 7b 0xxxxxxx\n * 14b 10xxxxxx xxxxxxxx\n * 29b 110xxxxx xxxxxxxx xxxxxxxx xxxxxxxx\n * 61b 111xxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx\n */\nexport const uintCoder: BinaryTypeCoder = {\n $write: (value, writer) => {\n if (typeof value !== \"number\") value = Number(value);\n if (value < 0) value = 0;\n if (value < MAX_VARUINT8) writer.$writeUint8(value);\n else if (value < MAX_VARUINT16) writer.$writeUint16(value + 0x8000);\n else if (value < MAX_VARUINT32) writer.$writeUint32((value + 0xc0000000) | 0);\n else if (value >= MAX_VARUINT32) {\n writer.$writeUint32(($floor(value / POW_32) + 0xe0000000) | 0);\n writer.$writeUint16(value >>> 16);\n writer.$writeUint16(value & 0xffff);\n }\n else {\n // coercion case\n writer.$writeUint8(value as any === true ? 1 : 0);\n }\n },\n $read: (reader) => {\n const firstByte = reader.$peek();\n\n if (!(firstByte & 0x80)) {\n reader.$skip();\n return firstByte;\n }\n else if (!(firstByte & 0x40)) {\n return reader.$readUint16() - 0x8000;\n }\n else if (!(firstByte & 0x20)) {\n return reader.$readUint32() - 0xc0000000;\n }\n\n return (reader.$readUint32() - 0xe0000000) * POW_32\n + reader.$readUint32();\n }\n};\n\nexport const uint8Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint8(value),\n $read: (reader) => reader.$readUint8(),\n};\n\nexport const uint16Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint16(value),\n $read: (reader) => reader.$readUint16(),\n};\n\nexport const uint32Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint32(value),\n $read: (reader) => reader.$readUint32(),\n};\n\n/**\n * Format (big-endian):\n * 7b 0xxxxxxx\n * 14b 10xxxxxx xxxxxxxx\n * 29b 110xxxxx xxxxxxxx xxxxxxxx xxxxxxxx\n * 61b 111xxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx\n */\nexport const intCoder: BinaryTypeCoder = {\n $write: (value, writer) => {\n if (typeof value !== \"number\") value = Number(value);\n if (value >= -MAX_VARINT8 && value < MAX_VARINT8) writer.$writeUint8(value & 0x7f);\n else if (value >= -MAX_VARINT16 && value < MAX_VARINT16) writer.$writeUint16((value & 0x3fff) + 0x8000);\n else if (value >= -MAX_VARINT32 && value < MAX_VARINT32) writer.$writeUint32((value & 0x1fffffff) | 0xc0000000);\n else if (value < -MAX_VARINT32 || value >= MAX_VARINT32) {\n // Split in two 32b uints\n writer.$writeUint32(($floor(value / POW_32) & 0x1fffffff) | 0xe0000000);\n writer.$writeUint16(value >>> 16);\n writer.$writeUint16(value & 0xffff);\n }\n else {\n // coercion case\n writer.$writeUint8(value as any === true ? 0x7f : 0);\n }\n },\n $read: (reader) => {\n let firstByte = reader.$peek(), i: number;\n\n if (!(firstByte & 0x80)) {\n reader.$skip();\n return (firstByte & 0x40) ? (firstByte | 0xffffff80) : firstByte;\n }\n else if (!(firstByte & 0x40)) {\n i = reader.$readUint16() - 0x8000;\n return (i & 0x2000) ? (i | 0xffffc000) : i;\n }\n else if (!(firstByte & 0x20)) {\n i = reader.$readUint32() - 0xc0000000;\n return (i & 0x10000000) ? (i | 0xe0000000) : i;\n }\n else {\n i = reader.$readUint32() - 0xe0000000;\n i = (i & 0x10000000) ? (i | 0xe0000000) : i;\n return i * POW_32 + reader.$readUint32();\n }\n }\n};\n\nexport const int8Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeInt8(value),\n $read: (reader) => reader.$readInt8(),\n};\n\nexport const int16Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeInt16(value),\n $read: (reader) => reader.$readInt16(),\n};\n\nexport const int32Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeInt32(value),\n $read: (reader) => reader.$readInt32(),\n};\n\nexport const bfloat16Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint16($tobf16(value)),\n $read: (reader) => $frombf16(reader.$readUint16()),\n};\n\nexport const float16Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint16($tof16(value)),\n $read: (reader) => $fromf16(reader.$readUint16()),\n};\n\nexport const float32Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeFloat32(value),\n $read: (reader) => reader.$readFloat32(),\n};\n\nexport const float64Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeFloat64(value),\n $read: (reader) => reader.$readFloat64(),\n};\n\nexport const uscalar8Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint8($touscal8(value)),\n $read: (reader) => $fromuscal8(reader.$readUint8()),\n};\n\nexport const scalar8Coder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint8($toscal8(value)),\n $read: (reader) => $fromscal8(reader.$readUint8()),\n};\n\nexport const dateCoder: BinaryTypeCoder = {\n $write: (value, writer) => intCoder.$write(value.getTime(), writer),\n $read: (reader) => new Date(intCoder.$read(reader)),\n};\n\nexport const bufferCoder: BinaryTypeCoder = {\n $write: (value, writer) => {\n uintCoder.$write(value.byteLength, writer); // prefix length\n writer.$writeBytes(value);\n },\n $read: (reader) => reader.$readBytes(uintCoder.$read(reader)),\n};\n\nexport const stringCoder: BinaryTypeCoder = {\n $write: (value, writer) => bufferCoder.$write($utf8encode(value), writer),\n $read: (reader) => $utf8decode(bufferCoder.$read(reader)),\n};\n\nexport const boolCoder: BinaryTypeCoder = {\n $write: (value, writer) => writer.$writeUint8(value ? 1 : 0),\n $read: (reader) => reader.$readUint8() !== 0,\n};\n\nexport const boolsCoder: BinaryTypeCoder = {\n $write: (value, writer) => {\n if (value.length > 28) value = value.slice(0, 28); // drop additional\n uintCoder.$write(mask(value), writer);\n },\n $read: (reader, p) => unmask(uintCoder.$read(reader), p),\n};\n\nexport const jsonCoder: BinaryTypeCoder = {\n $write: (value, writer) => stringCoder.$write(JSON.stringify(value), writer),\n $read: (reader) => JSON.parse(stringCoder.$read(reader)),\n};\n\nexport const regexCoder: BinaryTypeCoder = {\n $write: (value, writer) => {\n writer.$writeUint8(mask([value.global, value.ignoreCase, value.multiline]));\n stringCoder.$write(value.source, writer);\n },\n $read: (reader) => {\n const [g, i, m] = unmask(reader.$readUint8());\n return new RegExp(stringCoder.$read(reader), (g ? \"g\" : \"\") + (i ? \"i\" : \"\") + (m ? \"m\" : \"\"));\n }\n};\n\nexport const writers: Record> = {\n [Type.UInt]: uintCoder.$write,\n [Type.UInt8]: uint8Coder.$write,\n [Type.UInt16]: uint16Coder.$write,\n [Type.UInt32]: uint32Coder.$write,\n [Type.Int]: intCoder.$write,\n [Type.Int8]: int8Coder.$write,\n [Type.Int16]: int16Coder.$write,\n [Type.Int32]: int32Coder.$write,\n [Type.Float64]: float64Coder.$write,\n [Type.Float32]: float32Coder.$write,\n [Type.Float16]: float16Coder.$write,\n [Type.BFloat16]: bfloat16Coder.$write,\n [Type.Scalar8]: scalar8Coder.$write,\n [Type.UScalar8]: uscalar8Coder.$write,\n [Type.Bool]: boolCoder.$write,\n [Type.Bools]: boolsCoder.$write,\n [Type.Buffer]: bufferCoder.$write,\n [Type.String]: stringCoder.$write,\n [Type.JSON]: jsonCoder.$write,\n [Type.RegExp]: regexCoder.$write,\n [Type.Date]: dateCoder.$write,\n};\n\nexport const readers: Record> = {\n [Type.UInt]: uintCoder.$read,\n [Type.UInt8]: uint8Coder.$read,\n [Type.UInt16]: uint16Coder.$read,\n [Type.UInt32]: uint32Coder.$read,\n [Type.Int]: intCoder.$read,\n [Type.Int8]: int8Coder.$read,\n [Type.Int16]: int16Coder.$read,\n [Type.Int32]: int32Coder.$read,\n [Type.Float64]: float64Coder.$read,\n [Type.Float32]: float32Coder.$read,\n [Type.Float16]: float16Coder.$read,\n [Type.BFloat16]: bfloat16Coder.$read,\n [Type.Scalar8]: scalar8Coder.$read,\n [Type.UScalar8]: uscalar8Coder.$read,\n [Type.Bool]: boolCoder.$read,\n [Type.Bools]: boolsCoder.$read,\n [Type.Buffer]: bufferCoder.$read,\n [Type.String]: stringCoder.$read,\n [Type.JSON]: jsonCoder.$read,\n [Type.RegExp]: regexCoder.$read,\n [Type.Date]: dateCoder.$read,\n};\n","/** Default maximum transmission unit in networking */\nconst MTU = 1500;\n\n/** Set Tinybuf global config */\nexport const setTinybufConfig = (c: Partial): void => {\n cfg = { ...cfg, ...c };\n};\n\nexport type TinybufConfig = {\n /**\n * (default: false)\n *\n * This sets the default value for `preserveBytes` on\n * `encode(data, preserveBytes?)`.\n *\n * By default, `encode()` returns its encoded bytes as a `Uint8Array`\n * view of the bytes in the shared encoding buffer.\n *\n * This is suitable for synchronous use (e.g. high-performance applications)\n * as it avoids slow and expensive memory allocation and fragmentation on\n * each call to `encode()`.\n *\n * However, susbsequent calls are destructive to the underlying bytes, so\n * for asynchronous uses (e.g. Promises, Workers, long-lived storage), set\n * `preserveBytes` to `true`.\n */\n safe: boolean,\n\n /**\n * (default: true)\n * By default, format encoders share a global encoding buffer for performance\n * and memory management reasons.\n *\n * When set to false, each format is allocated an individual encoding buffer.\n *\n * Enable to maximise performance and memory re-use, just be cautious of\n * possible race conditions.\n */\n useGlobalEncodingBuffer: boolean,\n\n /**\n * (default: 1500)\n * The maximum bytes that can be allocated to an encoding buffer.\n *\n * Default is 1500 bytes, the standard \"Maximum Transmission Unit\".\n */\n encodingBufferMaxSize: number,\n\n /**\n * (default: 256)\n * Initial bytes to allocate for an encoding buffer.\n */\n encodingBufferInitialSize: number,\n\n /**\n * (default: 256)\n * Additional bytes to allocated when dynamically increasing the size of an encoding buffer.\n */\n encodingBufferIncrement: number,\n};\n\n/** @internal */\nexport let cfg: TinybufConfig = {\n safe: false,\n useGlobalEncodingBuffer: true,\n encodingBufferMaxSize: MTU,\n encodingBufferInitialSize: 256,\n encodingBufferIncrement: 256,\n};\n","import { cfg } from \"../config\";\nimport { TinybufError } from \"./errors\";\n\n/**\n * Wraps a buffer with a write head pointer.\n *\n * @internal\n */\nexport class BufferWriter {\n public $byteLength: number = 0;\n private _$dataView: DataView;\n private _$bytes: Uint8Array;\n private _$base: number;\n private _$writeHead: number = 0;\n private _$resizable: boolean;\n\n public constructor($0: number | Uint8Array) {\n this._$resizable = typeof $0 === \"number\";\n let b = $0 instanceof Uint8Array ? $0 : new Uint8Array($0);\n this._$bytes = b;\n this._$base = b.byteOffset;\n this._$dataView = new DataView(b.buffer);\n }\n\n /** Retarget the writer to a fixed-size byte array, reusing the existing DataView where possible. */\n public $reset(b: Uint8Array): this {\n if (this._$dataView.buffer !== b.buffer) {\n this._$dataView = new DataView(b.buffer);\n }\n\n this._$bytes = b;\n this._$base = b.byteOffset;\n this._$resizable = false;\n this._$writeHead = 0;\n this.$byteLength = 0;\n\n return this;\n }\n\n public $viewBytes(): Uint8Array {\n return this._$bytes.subarray(0, this.$byteLength);\n }\n\n public $copyBytes(): Uint8Array {\n const buf = new Uint8Array(this.$byteLength);\n buf.set(this.$viewBytes());\n return buf;\n }\n\n // ----- Writers: -----\n\n public $writeInt8(value: number): void {\n this._$pre(1).setInt8(this._$writeHead, value);\n }\n\n public $writeInt16(value: number): void {\n this._$pre(2).setInt16(this._$writeHead, value, true);\n }\n\n public $writeInt32(value: number): void {\n this._$pre(4).setInt32(this._$writeHead, value, true);\n }\n\n public $writeUint8(value: number): void {\n this._$pre(1).setUint8(this._$writeHead, value);\n }\n\n public $writeUint16(value: number): void {\n this._$pre(2).setUint16(this._$writeHead, value, false); // big-endian for varint\n }\n\n public $writeUint32(value: number): void {\n this._$pre(4).setUint32(this._$writeHead, value, false); // big-endian for varint\n }\n\n public $writeFloat32(value: number): void {\n this._$pre(4).setFloat32(this._$writeHead, value, true);\n }\n\n public $writeFloat64(value: number): void {\n this._$pre(8).setFloat64(this._$writeHead, value, true);\n }\n\n public $writeBytes(b: Uint8Array | ArrayBuffer | ArrayBufferView): void {\n // allocate bytes first\n this._$pre(b.byteLength);\n\n this._$bytes.set(\n b instanceof Uint8Array\n ? b\n : ArrayBuffer.isView(b)\n ? new Uint8Array(b.buffer, b.byteOffset, b.byteLength)\n : new Uint8Array(b),\n this._$writeHead - this._$base\n );\n }\n\n // ----- Private methods: -----\n\n /**\n * Pre-allocate some bytes on the dataview, moving the write head into\n * position.\n *\n * @throws TinybufError\n */\n private _$pre(bytes: number): DataView {\n if (this.$byteLength + bytes > this._$bytes.byteLength) {\n this._$malloc(bytes);\n }\n\n this._$writeHead = this._$base + this.$byteLength;\n this.$byteLength += bytes;\n\n return this._$dataView;\n }\n\n /**\n * @throws TinybufError\n */\n private _$malloc(bytes: number): void {\n if (!this._$resizable) {\n throw new TinybufError(\"exceeded buffer length: \" + this._$bytes.byteLength);\n }\n\n const currentBytes = this._$bytes.byteLength;\n const minNewBytes = this.$byteLength + bytes - currentBytes;\n const availableBytes = cfg.encodingBufferMaxSize - currentBytes;\n\n if (minNewBytes > availableBytes) {\n throw new TinybufError(\"exceeded encodingBufferMaxSize: \" + cfg.encodingBufferMaxSize);\n }\n\n const increment = cfg.encodingBufferIncrement;\n const newBytes = Math.ceil(minNewBytes / increment) * increment;\n const newSize = currentBytes + Math.min(newBytes, availableBytes);\n const buf = new Uint8Array(newSize);\n\n // copy bytes\n buf.set(this._$bytes);\n\n // update refs\n this._$dataView = new DataView(buf.buffer);\n this._$bytes = buf;\n this._$base = 0;\n }\n}\n","/**\n * Wraps a buffer with a read head pointer.\n *\n * @internal\n */\nexport class BufferReader {\n public i: number;\n private _$dataView!: DataView;\n private _$base!: number;\n private _$byteLength!: number;\n\n public constructor(b: Uint8Array | ArrayBufferView | ArrayBuffer, headerBytes?: number) {\n this.$reset(b, headerBytes);\n }\n\n /** Retarget the reader to a new buffer, reusing the existing DataView where possible. */\n public $reset(b: Uint8Array | ArrayBufferView | ArrayBuffer, headerBytes?: number): this {\n const isView = ArrayBuffer.isView(b);\n const buffer = isView ? b.buffer : b;\n const offset = isView ? b.byteOffset : 0;\n let dv = this._$dataView;\n\n if (\n dv === undefined\n || dv.buffer !== buffer\n || offset < dv.byteOffset\n || offset + b.byteLength > dv.byteOffset + dv.byteLength\n ) {\n dv = this._$dataView = b instanceof DataView ? b : new DataView(buffer);\n }\n\n this._$base = offset - dv.byteOffset;\n this._$byteLength = b.byteLength;\n this.i = headerBytes ?? 0; // internal offset (header)\n\n return this;\n }\n\n /** Read the next byte, without moving the read head pointer. */\n public $peek(): number {\n if (this.i >= this._$byteLength) {\n throw new RangeError(\"exceeded bytes\");\n }\n\n return this._$dataView.getUint8(this._$base + this.i);\n }\n\n /** Skip the next byte without reading it. */\n public $skip(): void {\n this.i++;\n }\n\n // ----- Readers: -----\n\n public $readUint8(): number {\n return this._$dataView.getUint8(this._$at(1));\n }\n\n public $readUint16(): number {\n return this._$dataView.getUint16(this._$at(2)); // big-endian\n }\n\n public $readUint32(): number {\n return this._$dataView.getUint32(this._$at(4)); // big-endian\n }\n\n public $readInt8(): number {\n return this._$dataView.getInt8(this._$at(1));\n }\n\n public $readInt16(): number {\n return this._$dataView.getInt16(this._$at(2), true); // little-endian\n }\n\n public $readInt32(): number {\n return this._$dataView.getInt32(this._$at(4), true); // little-endian\n }\n\n public $readFloat32(): number {\n return this._$dataView.getFloat32(this._$at(4), true); // little-endian\n }\n\n public $readFloat64(): number {\n return this._$dataView.getFloat64(this._$at(8), true); // little-endian\n }\n\n /** @throws RangeError if exceeds length */\n public $readBytes(bytes: number): Uint8Array {\n return new Uint8Array(\n this._$dataView.buffer,\n this._$dataView.byteOffset + this._$at(bytes),\n bytes\n );\n }\n\n // ----- Private methods: -----\n\n /**\n * Advance the read head, returning the DataView offset to read from.\n *\n * @throws RangeError if exceeds length\n */\n private _$at(bytes: number): number {\n const i = this.i;\n\n if (i + bytes > this._$byteLength) {\n throw new RangeError(\"exceeded bytes\");\n }\n\n this.i = i + bytes;\n\n return this._$base + i;\n }\n}\n","/* eslint-disable @typescript-eslint/unified-signatures */\nimport { writers, readers } from \"./lib/coders\";\nimport * as coders from \"./lib/coders\";\nimport { $hashCode, $strToHashCode } from \"./lib/hashCode\";\nimport { peekHeader, peekHeaderStr } from \"./lib/peek\";\nimport { BufferWriter } from \"./lib/BufferWriter\";\nimport { BufferReader } from \"./lib/BufferReader\";\nimport {\n DecodedType,\n EncoderDefinition,\n FieldDefinition,\n TransformConfig,\n ValidationConfig,\n MaybeType,\n Transforms,\n TypeLiteral,\n ValidationFn,\n ValidTypes,\n} from \"./Type\";\nimport { cfg } from \"./config\";\n\nconst spareArrayElements = new WeakMap();\n\nexport type FormatHeader = string | number;\n\n/**\n * Utility to get the decoded type of a buffer format\n * @example type Format = Decoded\n */\nexport type Decoded = TBufferFormat extends BufferFormat\n ? DecodedType\n : never;\n\n/**\n * Defines a format for encoding/decoding binary buffers.\n *\n * Optionally customize the identifier, either as a 2-byte string, an unsigned integer (0 -> 65,535), or as `null` to disable entirely.\n *\n * @example\n * const MyFormat = defineFormat({ ... });\n * const MyFormat = defineFormat('ab', { ... });\n * const MyFormat = defineFormat(1234, { ... });\n * const MyFormat = defineFormat(null, { ... });\n */\nexport function defineFormat(def: T): BufferFormat;\n/**\n * Defines a format for encoding/decoding binary buffers.\n *\n * Optionally customize the identifier, either as a 2-byte string, an unsigned integer (0 -> 65,535), or as `null` to disable entirely.\n *\n * @example\n * const MyFormat = defineFormat({ ... });\n * const MyFormat = defineFormat('ab', { ... });\n * const MyFormat = defineFormat(1234, { ... });\n * const MyFormat = defineFormat(null, { ... });\n */\nexport function defineFormat(h: HeaderType | null, def: T): BufferFormat;\nexport function defineFormat(a?: HeaderType | T, b?: T): BufferFormat {\n return a !== null && typeof a === \"object\"\n ? new BufferFormat(a as T)\n : new BufferFormat(b as T, a as HeaderType);\n}\n\nfunction isValidHeader(h: FormatHeader): boolean {\n if (typeof h === \"number\") return Number.isInteger(h) && h >= 0 && h <= 65_535;\n if (typeof h === \"string\") return new TextEncoder().encode(h).byteLength === 2;\n return false;\n}\n\n/**\n * BufferFormat is a utility class for encoding and decoding binary data based\n * on a provided encoding format.\n *\n * @see {header}\n * @see {encode(data)}\n * @see {decode(binary)}\n */\nexport class BufferFormat {\n /** @internal */\n private static _$globalWriter?: BufferWriter;\n\n /**\n * A unique identifier encoded as the first 2 bytes (or `undefined` if headerless).\n *\n * @see {peekHeader(...)}\n * @see {peekHeaderStr(...)}\n */\n public header!: HeaderType;\n\n /** @internal */\n private _$header!: number; // always uint16 vesion\n /** @internal */\n private _$type!: TypeLiteral;\n /** @internal */\n private _$fields!: Field[];\n /** @internal */\n private _$fieldsMap!: Map;\n\n /** @internal */\n private _$format?: string;\n /** @internal */\n private _$transforms?: Transforms | undefined;\n /** @internal */\n private _$validate?: ValidationFn | undefined;\n /** @internal */\n private _$hasValidationOrTransforms = false;\n /** @internal */\n private _$writer?: BufferWriter;\n /** @internal */\n private _$intoWriter?: BufferWriter;\n /** @internal */\n private _$reader?: BufferReader;\n\n public constructor(\n def: EncoderType,\n header?: HeaderType | null,\n ) {\n // set definition\n if (typeof def === \"string\" && ValidTypes.includes(def)) {\n this._$type = def;\n }\n else if (def instanceof MaybeType) {\n throw new TypeError(\"Format cannot be optional\");\n }\n else if (def instanceof Object) {\n this._$type = undefined; // object\n this._$fieldsMap = new Map();\n this._$fields = Object.keys(def).map((name) => {\n const f = new Field(name, def[name]);\n this._$fieldsMap.set(name, f); // also set map entry\n return f;\n });\n\n // set headers\n if (header === undefined) {\n this.header = $hashCode(this.f) as HeaderType; // automatic\n this._$header = this.header as number;\n }\n else if (header === null) {\n this.header = undefined; // headerless\n this._$header = undefined;\n }\n else if (isValidHeader(header)) {\n this.header = header; // manual\n this._$header = typeof header === \"number\" ? header : $strToHashCode(header);\n }\n else {\n throw new TypeError(\"Header must be 2-byte string, uint16, or null.\");\n }\n }\n else {\n throw new TypeError(\"Format must be object or Type\");\n }\n }\n\n // ----- Static methods: -----\n\n /**\n * Read the header of a buffer as a number.\n *\n * @see {header}\n * @throws {RangeError} if buffer size < 2\n */\n public static peekHeader = peekHeader;\n\n /**\n * Read the header of a buffer as a string.\n *\n * @see {header}\n * @throws {RangeError} if buffer size < 2\n */\n public static peekHeaderStr = peekHeaderStr;\n\n // ----- Accessors: -----\n\n /**\n * @example \"{uint8,str[]?}\"\n * @internal\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n private get f(): string {\n if (this._$format === undefined) {\n this._$format = this._$fields !== undefined\n ? `{${this._$fields.map(v => v.f).join(\",\")}}`\n : `${this._$type}`;\n }\n\n return this._$format;\n }\n\n /** @internal */\n private static _$initWriter(): BufferWriter {\n if (cfg.useGlobalEncodingBuffer) {\n if (!BufferFormat._$globalWriter) {\n this._$globalWriter = new BufferWriter(cfg.encodingBufferMaxSize);\n }\n\n return this._$globalWriter;\n }\n\n return new BufferWriter(cfg.encodingBufferInitialSize);\n }\n\n /**\n * Encode an object into an existing byte array.\n *\n * **Warning:** Returns an unsafe view into the encoding buffer. Pass this reference to preserve\n * performance, and to minimize memory allocation and fragmentation.\n */\n public encodeInto>(\n data: TDecodedType,\n bytes: Uint8Array,\n ): Uint8Array {\n return bytes.subarray(0, this.encodeIntoLength(data, bytes));\n }\n\n /**\n * Encode an object into an existing byte array, without allocating a view.\n *\n * @returns the number of bytes written to the start of `bytes`\n * @throws if fails to encode value to schema, or `bytes` is too small\n */\n public encodeIntoLength>(\n data: TDecodedType,\n bytes: Uint8Array,\n ): number {\n if (this._$hasValidationOrTransforms) {\n data = this._$preprocess(data);\n }\n\n const writer = this._$intoWriter?.$reset(bytes) ?? new BufferWriter(bytes);\n this._$intoWriter = undefined;\n\n try {\n this._$write(data, writer);\n\n return writer.$byteLength;\n }\n finally {\n this._$intoWriter = writer;\n }\n }\n\n /**\n * Encode an object to bytes.\n *\n * **Warning:** Returns an unsafe view into the encoding buffer. Pass this reference to preserve\n * performance, and to minimize memory allocation and fragmentation.\n *\n * @param data - data to encode\n * @param preserveBytes - (default: `setTinybufConfig().safe`) When set to true, copies encoded\n * bytes to a new buffer. When set to false, returns an unsafe view of bytes but prevents\n * unnnecessary memory allocation and fragmentation.\n *\n * @returns a copy of encoded bytes\n * @throws if fails to encode value to schema\n */\n public encode>(\n data: TDecodedType,\n preserveBytes?: boolean,\n ): Uint8Array {\n if (!this._$writer) {\n // lazy init\n this._$writer = BufferFormat._$initWriter();\n }\n\n // reset\n this._$writer.$byteLength = 0;\n\n if (this._$hasValidationOrTransforms) {\n data = this._$preprocess(data);\n }\n\n this._$write(data, this._$writer);\n\n return (preserveBytes ?? cfg.safe)\n ? this._$writer.$copyBytes()\n : this._$writer.$viewBytes();\n }\n\n /**\n * Decode binary data into an existing object instance.\n * @throws if fails to decode bytes to schema.\n */\n public decodeInto>(\n bytes: Uint8Array | ArrayBufferView | ArrayBuffer,\n obj: Partial,\n ): TDecodedType {\n return this._$decode(bytes, obj);\n }\n /**\n * Decode binary data to an object.\n * @throws if fails to decode bytes to schema.\n */\n public decode>(\n bytes: Uint8Array | ArrayBufferView | ArrayBuffer\n ): TDecodedType;\n /**\n * @deprecated use decodeInto() instead\n */\n public decode>(\n bytes: Uint8Array | ArrayBufferView | ArrayBuffer,\n decodeInto: Partial,\n ): TDecodedType;\n /**\n * Decode binary data to an object.\n * @throws if fails to decode bytes to schema.\n */\n public decode>(\n bytes: Uint8Array | ArrayBufferView | ArrayBuffer,\n decodeInto?: Partial | undefined,\n ): TDecodedType {\n return this._$decode(bytes, decodeInto);\n }\n\n /**\n * Set additional transform functions to apply before encoding and after decoding.\n */\n public setTransforms(transforms: TransformConfig | Transforms): this {\n this._$hasValidationOrTransforms = true;\n\n if (typeof transforms === \"function\" || (Array.isArray(transforms) && typeof transforms[0] === \"function\")) {\n this._$transforms = transforms;\n }\n else {\n for (const name of Object.keys(transforms)) {\n const field = this._$fieldsMap.get(name);\n if (!field) {\n throw new TypeError(`Failed to set transforms for field '${name}'`);\n }\n\n // Set validation for object.\n field.$coder.setTransforms(transforms[name]);\n }\n }\n\n return this;\n }\n\n /**\n * Set additional validation rules which are applied on encode() and decode().\n *\n * - Validation functions should throw an error, return an error, or return boolean false.\n * - Anything else is treated as successfully passing validation.\n */\n public setValidation(validations: ValidationConfig | ValidationFn): this {\n this._$hasValidationOrTransforms = true;\n\n if (typeof validations === \"function\") {\n this._$validate = validations;\n }\n else {\n for (const name of Object.keys(validations)) {\n const field = this._$fieldsMap.get(name);\n if (!field) {\n throw new TypeError(`Failed to set validation function for field '${name}'`);\n }\n\n field.$coder.setValidation(validations[name]);\n }\n }\n\n return this;\n }\n\n // ----- Implementation: -----\n\n /** @internal */\n private _$decode(\n bytes: Uint8Array | ArrayBufferView | ArrayBuffer,\n obj: Partial | undefined,\n ): TDecodedType {\n const headerBytes = this.header === undefined ? 0 : 2;\n\n const reader = this._$reader?.$reset(bytes, headerBytes) ?? new BufferReader(bytes, headerBytes);\n this._$reader = undefined;\n\n try {\n return this._$read(reader, obj);\n }\n finally {\n this._$reader = reader;\n }\n }\n\n /**\n * @param value\n * @param bw\n * @throws if the value is invalid\n *\n * @internal\n */\n private _$write(value: any, bw: BufferWriter): void {\n // write header\n if (this._$header !== undefined) bw.$writeUint16(this._$header);\n\n // write scalar\n if (this._$type !== undefined) {\n const safeValue = (this._$validate || this._$transforms) ? this._$preprocess(value) : value;\n\n return writers[this._$type](safeValue, bw);\n }\n\n // check for object type\n if (typeof value !== \"object\" || !value) {\n throw new TypeError(\"expected object type\");\n }\n\n // write each field\n const fields = this._$fields;\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n const subValue = value[field.$name];\n\n if (field.$isOptional) {\n if (subValue === undefined || subValue === null) {\n coders.boolCoder.$write(false, bw);\n continue; // skip\n }\n else {\n coders.boolCoder.$write(true, bw);\n }\n }\n else if (subValue == null) {\n throw new Error(`missing required value: ${field.$name}`);\n }\n\n if (field.$isArray) {\n // array\n this._$writeArray(subValue, bw, field.$coder);\n continue;\n }\n\n // scalar/object field\n field.$coder._$write(subValue, bw);\n }\n }\n\n /**\n * pre-process: validation and/or transforms\n * @internal\n */\n private _$preprocess>(data: T): T {\n if (this._$validate) this._$processValidation(data);\n\n if (typeof this._$transforms === \"function\") {\n return this._$transforms(data);\n }\n else if (Array.isArray(this._$transforms) && typeof this._$transforms[0] === \"function\") {\n return this._$transforms[0](data);\n }\n\n return data;\n }\n\n /**\n * post-process: validation and/or transforms\n * @internal\n */\n private _$postprocess>(data: T): T {\n if (Array.isArray(this._$transforms) && typeof this._$transforms[1] === \"function\") {\n data = this._$transforms[1](data);\n }\n\n if (this._$validate) this._$processValidation(data);\n\n return data;\n }\n\n private _$processValidation(data: any): void {\n if (!this._$validate) return;\n const res = this._$validate(data);\n if (res instanceof Error) throw res;\n if (res === false) throw new Error(\"failed validation\");\n }\n\n /**\n * This function will be executed only the first time\n * After that, we'll compile the read routine and add it directly to the instance\n * @param state\n * @returns\n * @throws if fails\n *\n * @internal\n */\n private _$read>(state: BufferReader, obj?: Partial): TDecodedType {\n // This function will be executed only the first time to compile the read routine.\n // After that, we'll compile the read routine and add it directly to the instance\n\n // Update the read method implementation.\n this._$read = this._$compileFormatReadFn();\n\n return this._$read(state, obj);\n }\n\n /**\n * Generate read function code for this coder.\n *\n * @example\n * let v=o??{};\n * v.prop1=this._$readField(0,s,o);\n * v.prop2=this._$readField(1,s,o);\n * return v\n *\n * @internal\n */\n private _$makeObjectReadFnBody(): string {\n const fieldsStr: string = this._$fields\n .map(({ $name: n }, i) => `v.${n}=this.${this._$readField.name}(${i},s,v.${n})`)\n .join(\";\");\n\n return `let v=o??{};${fieldsStr};return v;`;\n }\n\n /**\n * Read an individual field.\n * @internal\n */\n private _$readField(fieldIndex: number, state: BufferReader, obj?: any): any {\n const field = this._$fields[fieldIndex];\n\n if (field.$isOptional && !coders.boolCoder.$read(state)) {\n return undefined;\n }\n\n if (field.$isArray) {\n return this._$readArray(field.$coder, state, obj);\n }\n\n return field.$coder._$read(state, obj);\n }\n\n /**\n * Compile the decode() method for this object.\n *\n * @internal\n */\n private _$compileFormatReadFn>(): (state: BufferReader, obj: Partial | undefined) => TDecodedType {\n if (this._$type !== undefined) {\n // scalar type\n return this._$hasValidationOrTransforms\n ? (s) => this._$postprocess(readers[this._$type](s))\n : readers[this._$type];\n }\n\n // object type\n return new Function(\"s\", \"o\", this._$makeObjectReadFnBody()) as any;\n }\n\n /**\n * @internal\n */\n private _$writeArray(value: any[], bw: BufferWriter, type: BufferFormat): void {\n if (!Array.isArray(value)) {\n throw new TypeError(`expected array, instead got: ${value}`);\n }\n\n coders.uintCoder.$write(value.length, bw);\n for (let i = 0; i < value.length; i++) {\n type._$write(value[i], bw);\n }\n }\n\n /**\n * @throws if invalid data\n * @internal\n */\n private _$readArray(type: BufferFormat, state: any, obj?: Array): Array {\n const len = coders.uintCoder.$read(state);\n const arr = Array.isArray(obj) ? obj : new Array(len);\n const prevLen = Array.isArray(obj) ? arr.length : 0;\n let spare: any[] | undefined;\n\n if (prevLen !== len && type._$type === undefined) {\n spare = spareArrayElements.get(arr);\n\n if (len < prevLen) {\n if (spare === undefined) spareArrayElements.set(arr, spare = []);\n for (let j = len; j < prevLen; j++) {\n if (arr[j] != null) spare.push(arr[j]);\n }\n }\n }\n\n if (arr.length !== len) arr.length = len;\n for (let j = 0; j < len; j++) {\n arr[j] = type._$read(state, j < prevLen ? arr[j] : spare?.pop());\n }\n return arr;\n }\n}\n\n/**\n * Parses and represents an object field.\n *\n * @internal\n */\nclass Field {\n public $name: string;\n public $coder: BufferFormat;\n public $isOptional: boolean;\n public $isArray: boolean;\n\n private _$formatString?: string;\n\n public constructor(name: string, rawType: FieldDefinition) {\n this.$isOptional = rawType instanceof MaybeType;\n let type = rawType instanceof MaybeType ? rawType.type : rawType;\n\n this.$name = name;\n\n if (Array.isArray(type)) {\n if (type.length !== 1) {\n throw new TypeError(\"Array type must contain exactly one format\");\n }\n\n type = type[0];\n this.$isArray = true;\n }\n else {\n this.$isArray = false;\n }\n\n this.$coder = new BufferFormat(type, null);\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public get f(): string {\n if (this._$formatString === undefined) {\n this._$formatString = `${(this.$coder as any).f}${this.$isArray ? \"[]\" : \"\"}${this.$isOptional ? \"?\" : \"\"}`;\n }\n\n return this._$formatString;\n }\n}\n"],"names":["TinybufError","Error","$hashCode","str","hash","i","length","charCodeAt","$strToHashCode","$hashCodeToStr","hashCode","String","fromCharCode","Math","floor","peekHeader","b","byteLength","RangeError","Uint8Array","DataView","getUint16","u8","ArrayBuffer","isView","buffer","byteOffset","peekHeaderStr","bufferParser","BufferParser","constructor","this","_$formats","Map","_$data","processBuffer","f","data","cb","r","header","has","get","_a","decode","set","e","err","stack","on","format","callback","decodeInPlace","ignore","forEach","clear","$floor","$ceil","ceil","$clamp","value","min","max","$roundTowardZero","x","$roundAwayFromZero","uscalround","$fromuscal8","$touscal8","scalround","$fromscal8","$toscal8","Type","UInt","UInt8","UInt16","UInt32","Int","Int8","Int16","Int32","Float64","Float32","Float16","BFloat16","Scalar8","UScalar8","Bool","Bools","Buffer","JSON","RegExp","Date","ValidTypes","Object","values","MaybeType","type","optional","t","mask","padBit","reduce","n","unmask","l","len","undefined","clz32","Array","isArray","val","$utf8encode","encoder","TextEncoder","encode","$utf8decode","decoder","TextDecoder","y","f16round","$fromf16","$tof16","Float32Array","Int32Array","s","z","pow","d","m","Infinity","NaN","Uint32Array","bf16round","MAX_VARUINT32","MAX_VARINT32","POW_32","uintCoder","$write","writer","Number","$writeUint8","$writeUint16","$writeUint32","$read","reader","firstByte","$peek","$readUint32","$readUint16","$skip","uint8Coder","$readUint8","uint16Coder","uint32Coder","intCoder","int8Coder","$writeInt8","$readInt8","int16Coder","$writeInt16","$readInt16","int32Coder","$writeInt32","$readInt32","bfloat16Coder","$tobf16","$frombf16","float16Coder","float32Coder","$writeFloat32","$readFloat32","float64Coder","$writeFloat64","$readFloat64","uscalar8Coder","scalar8Coder","dateCoder","getTime","bufferCoder","$writeBytes","$readBytes","stringCoder","boolCoder","boolsCoder","slice","p","jsonCoder","stringify","parse","regexCoder","global","ignoreCase","multiline","source","g","writers","readers","setTinybufConfig","c","cfg","assign","safe","useGlobalEncodingBuffer","encodingBufferMaxSize","encodingBufferInitialSize","encodingBufferIncrement","BufferWriter","$0","$byteLength","_$writeHead","_$resizable","_$bytes","_$base","_$dataView","$reset","$viewBytes","subarray","$copyBytes","buf","_$pre","setInt8","setInt16","setInt32","setUint8","setUint16","setUint32","setFloat32","setFloat64","bytes","_$malloc","currentBytes","minNewBytes","availableBytes","increment","newBytes","newSize","BufferReader","headerBytes","offset","dv","_$byteLength","getUint8","_$at","getUint32","getInt8","getInt16","getInt32","getFloat32","getFloat64","spareArrayElements","WeakMap","defineFormat","a","BufferFormat","def","_$hasValidationOrTransforms","includes","_$type","TypeError","_$fieldsMap","_$fields","keys","map","name","Field","_$header","isValidHeader","h","isInteger","_$format","v","join","_$initWriter","_$globalWriter","encodeInto","encodeIntoLength","_$preprocess","_b","_$intoWriter","_$write","preserveBytes","_$writer","decodeInto","obj","_$decode","setTransforms","transforms","_$transforms","field","$coder","setValidation","validations","_$validate","_$reader","_$read","bw","safeValue","fields","subValue","$name","$isOptional","coders.boolCoder","$isArray","_$writeArray","_$processValidation","_$postprocess","res","state","_$compileFormatReadFn","_$makeObjectReadFnBody","fieldsStr","_$readField","fieldIndex","_$readArray","Function","coders.uintCoder","arr","prevLen","spare","j","push","pop","rawType","_$formatString"],"mappings":"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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2065f7a..463813c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "tinybuf", - "version": "1.9.1", + "version": "1.9.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "tinybuf", - "version": "1.9.1", + "version": "1.9.2", "license": "MIT", "devDependencies": { "@rollup/plugin-commonjs": "^26.0.1", diff --git a/package.json b/package.json index 0772c8b..30a4dc7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tinybuf", - "version": "1.9.1", + "version": "1.9.2", "author": "Reece Como ", "authors": [ "Reece Como ", diff --git a/src/__tests__/BufferFormat.test.ts b/src/__tests__/BufferFormat.test.ts index 06a32f4..0fd499b 100644 --- a/src/__tests__/BufferFormat.test.ts +++ b/src/__tests__/BufferFormat.test.ts @@ -126,7 +126,7 @@ describe("BufferFormat", () => { expect(objB2).toBe(obj.b); // longer arrays are re-used expect(objC1D1).toBe(obj.c![0]); // underlying object instances ARE recycled - expect(objC1D2).not.toBe(obj.c![1]); // ...but only when they existed in the previous instance + expect(objC1D2).toBe(obj.c![1]); // ...including instances dropped by a previous shrink }); it("can decode a bools bitmask in-place", () => { diff --git a/src/__tests__/allocations.test.ts b/src/__tests__/allocations.test.ts index 9eb6ac5..8b6dbea 100644 --- a/src/__tests__/allocations.test.ts +++ b/src/__tests__/allocations.test.ts @@ -434,6 +434,49 @@ describe("allocation-free hot paths", () => { expect(obj).toEqual({ values: [], items: [] }); expect(obj.values).toBe(values); }); + + it("reuses element objects dropped by a shrink when the array grows again", () => { + const obj: any = {}; + ArrFormat.decodeInto(ArrFormat.encode({ values: [], items: [{ v: 1 }, { v: 2 }, { v: 3 }] }, true), obj); + + const [item0, item1, item2] = obj.items; + + ArrFormat.decodeInto(ArrFormat.encode({ values: [], items: [{ v: 4 }] }, true), obj); + expect(obj.items).toEqual([{ v: 4 }]); + expect(obj.items[0]).toBe(item0); + + ArrFormat.decodeInto(ArrFormat.encode({ values: [], items: [{ v: 5 }, { v: 6 }, { v: 7 }] }, true), obj); + expect(obj.items).toEqual([{ v: 5 }, { v: 6 }, { v: 7 }]); + expect(new Set(obj.items)).toEqual(new Set([item0, item1, item2])); + }); + + it("creates no more element objects than the longest arrays need", () => { + const NestedFormat = defineFormat({ + frames: [{ seq: Type.UInt, inputs: [{ x: Type.Scalar8, y: Type.Scalar8 }] }], + }); + const make = (n: number): { frames: { seq: number; inputs: { x: number; y: number }[] }[] } => ({ + frames: Array.from({ length: n }, (_, i) => ({ seq: i, inputs: Array.from({ length: (n + i) % 3 + 1 }, () => ({ x: 0.5, y: -0.5 })) })), + }); + const encoded = [3, 9, 1, 12, 5, 0, 10, 7].map(n => NestedFormat.encode(make(n), true)); + const obj: any = {}; + const seen = new Set(); + + for (let pass = 0; pass < 20; pass++) { + for (const bytes of encoded) { + NestedFormat.decodeInto(bytes, obj); + + for (const frame of obj.frames) { + seen.add(frame); + seen.add(frame.inputs); + for (const input of frame.inputs) seen.add(input); + } + } + } + + const maxFrames = 12; + const maxInputs = 3; + expect(seen.size).toBeLessThanOrEqual(maxFrames * (2 + maxInputs)); + }); }); describe("peekHeader()", () => { diff --git a/src/core/BufferFormat.ts b/src/core/BufferFormat.ts index 57e64d8..114c083 100644 --- a/src/core/BufferFormat.ts +++ b/src/core/BufferFormat.ts @@ -19,6 +19,8 @@ import { } from "./Type"; import { cfg } from "./config"; +const spareArrayElements = new WeakMap(); + export type FormatHeader = string | number; /** @@ -566,9 +568,23 @@ export class BufferFormat(type: BufferFormat, state: any, obj?: Array): Array { const len = coders.uintCoder.$read(state); const arr = Array.isArray(obj) ? obj : new Array(len); + const prevLen = Array.isArray(obj) ? arr.length : 0; + let spare: any[] | undefined; + + if (prevLen !== len && type._$type === undefined) { + spare = spareArrayElements.get(arr); + + if (len < prevLen) { + if (spare === undefined) spareArrayElements.set(arr, spare = []); + for (let j = len; j < prevLen; j++) { + if (arr[j] != null) spare.push(arr[j]); + } + } + } + if (arr.length !== len) arr.length = len; - for (let j = 0; j < arr.length; j++) { - arr[j] = type._$read(state, obj?.[j]); + for (let j = 0; j < len; j++) { + arr[j] = type._$read(state, j < prevLen ? arr[j] : spare?.pop()); } return arr; }