From ee0e53b55f96853009dd0aa41a01e3febffc3880 Mon Sep 17 00:00:00 2001 From: Reece Como Date: Mon, 1 Sep 2025 15:26:29 +1000 Subject: [PATCH] v1.8.7 --- dist/index.cjs | 2 +- dist/index.cjs.map | 2 +- dist/index.mjs | 2 +- dist/index.mjs.map | 2 +- package-lock.json | 375 ++++++++--------------------- package.json | 2 +- src/__tests__/BufferWriter.test.ts | 26 ++ src/core/BufferFormat.ts | 3 +- src/core/lib/BufferWriter.ts | 56 +++-- 9 files changed, 173 insertions(+), 297 deletions(-) diff --git a/dist/index.cjs b/dist/index.cjs index 2d84b6d..61a3145 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,$={h:(r,e)=>{"number"!=typeof r&&(r=Number(r)),r<0&&(r=0),r<128?e.u(r):r<16384?e.$(r+32768):r=u?(e.l(t(r/d)+3758096384),e.l(r>>>0)):e.u(!0===r?1:0)},p:t=>{const r=t.m();return 128&r?64&r?32&r?(t.B()-3758096384)*d+t.B():t.B()-3221225472:t.F()-32768:(t.T(),r)}},l={h:(t,r)=>r.u(t),p:t=>t.A()},w={h:(t,r)=>r.$(t),p:t=>t.F()},y={h:(t,r)=>r.l(t),p:t=>t.B()},p={h:(r,e)=>{"number"!=typeof r&&(r=Number(r)),r>=-64&&r<64?e.u(127&r):r>=-8192&&r<8192?e.$(32768+(16383&r)):r>=-268435456&&r=c?(e.l(3758096384+(536870911&t(r/d))),e.l(r>>>0)):e.u(!0===r?127:0)},p:t=>{let r,e=t.m();return 128&e?64&e?32&e?(r=t.B()-3758096384,r=268435456&r?3758096384|r:r,r*d+t.B()):(r=t.B()-3221225472,268435456&r?3758096384|r:r):(r=t.F()-32768,8192&r?4294950912|r:r):(t.T(),64&e?4294967168|e:e)}},b={h:(t,r)=>r.v(t),p:t=>t.U()},m={h:(t,r)=>r.I(t),p:t=>t.M()},B={h:(t,r)=>r.S(t),p:t=>t.j()},F={h:(t,r)=>r.$(function $tobf16(t){return f[0]=t,a[0]>>>16}(t)),p:t=>function $frombf16(t){return a[0]=t<<16,f[0]}(t.F())},T={h:(t,r)=>r.$(o(t)),p:t=>h(t.F())},A={h:(t,r)=>r.H(t),p:t=>t._()},v={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)=>{$.h(t.byteLength,r),r.C(t)},p:t=>t.D($.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)),$.h(mask(t),r)},p:(t,r)=>unmask($.p(t),r)},j={h:(t,r)=>I.h(JSON.stringify(t),r),p:t=>JSON.parse(I.p(t))},H={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":""))}},_={[e.UInt]:$.h,[e.UInt8]:l.h,[e.UInt16]:w.h,[e.UInt32]:y.h,[e.Int]:p.h,[e.Int8]:b.h,[e.Int16]:m.h,[e.Int32]:B.h,[e.Float64]:v.h,[e.Float32]:A.h,[e.Float16]:T.h,[e.BFloat16]:F.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]:j.h,[e.RegExp]:H.h,[e.Date]:g.h},k={[e.UInt]:$.p,[e.UInt8]:l.p,[e.UInt16]:w.p,[e.UInt32]:y.p,[e.Int]:p.p,[e.Int8]:b.p,[e.Int16]:m.p,[e.Int32]:B.p,[e.Float64]:v.p,[e.Float32]:A.p,[e.Float16]:T.p,[e.BFloat16]:F.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]:j.p,[e.RegExp]:H.p,[e.Date]:g.p};let O={safe:!1,useGlobalEncodingBuffer:!0,encodingBufferMaxSize:1500,encodingBufferInitialSize:256,encodingBufferIncrement:256};class BufferWriter{constructor(t){this.V=0,this.N=0,this.R="number"==typeof t;let r=t instanceof Uint8Array?t:new Uint8Array(t);this.W=r,this.J=new DataView(r.buffer,r.byteOffset,r.byteLength)}P(){return this.W.subarray(0,this.V)}q(){const t=new Uint8Array(this.V);return t.set(this.P()),t}v(t){this.G(1).setInt8(this.N,t)}I(t){this.G(2).setInt16(this.N,t,!0)}S(t){this.G(4).setInt32(this.N,t,!0)}u(t){this.G(1).setUint8(this.N,t)}$(t){this.G(2).setUint16(this.N,t,!1)}l(t){this.G(4).setUint32(this.N,t,!1)}H(t){this.G(4).setFloat32(this.N,t,!0)}k(t){this.G(8).setFloat64(this.N,t,!0)}C(t){this.G(t.byteLength);let r=ArrayBuffer.isView(t)?t instanceof Uint8Array?t:new Uint8Array(t.buffer,t.byteOffset,t.byteLength):new Uint8Array(t);new Uint8Array(this.J.buffer,this.J.byteOffset+this.N,t.byteLength).set(r)}G(t){if(this.V+t>this.J.byteLength){const r=this.V+t-this.J.byteLength,e=Math.ceil(r/O.encodingBufferIncrement)*O.encodingBufferIncrement;if(!this.R)throw new TinybufError("exceeded buffer length: "+this.J.byteLength);this.K(this.J.byteLength+e)}return this.N=this.V,this.V+=t,this.J}K(t){if(t>O.encodingBufferMaxSize)throw new TinybufError(`exceeded encodingBufferMaxSize: ${O.encodingBufferMaxSize}`);const r=new Uint8Array(t);r.set(this.W),this.J=new DataView(r.buffer),this.W=r}}class BufferReader{constructor(t,r){this.J=ArrayBuffer.isView(t)?new DataView(t.buffer,t.byteOffset,t.byteLength):new DataView(t),this.i=null!=r?r:0}m(){return this.J.getUint8(this.i)}T(){this.i++}A(){return this.J.getUint8(this.i++)}F(){const t=this.J.getUint16(this.i);return this.i+=2,t}B(){const t=this.J.getUint32(this.i);return this.i+=4,t}U(){return this.J.getInt8(this.i++)}M(){const t=this.J.getInt16(this.i,!0);return this.i+=2,t}j(){const t=this.J.getInt32(this.i,!0);return this.i+=4,t}_(){const t=this.J.getFloat32(this.i,!0);return this.i+=4,t}O(){const t=this.J.getFloat64(this.i,!0);return this.i+=8,t}D(t){if(this.J.byteOffset+this.i+t>this.J.byteLength)throw new RangeError("exceeded bytes");const r=new Uint8Array(this.J.buffer,this.J.byteOffset+this.i,t);return this.i+=t,r}}class BufferFormat{constructor(t,r){if(this.L=!1,"string"==typeof t&&i.includes(t))this.X=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.X=void 0,this.Y=new Map,this.Z=Object.keys(t).map((r=>{const e=new Field(r,t[r]);return this.Y.set(r,e),e})),void 0===r)this.header=$hashCode(this.f),this.tt=this.header;else if(null===r)this.header=void 0,this.tt=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.tt="number"==typeof r?r:$strToHashCode(r)}}}get f(){return void 0===this.rt&&(this.rt=void 0!==this.Z?`{${this.Z.map((t=>t.f)).join(",")}}`:`${this.X}`),this.rt}static et(){return O.useGlobalEncodingBuffer?(BufferFormat.it||(this.it=new BufferWriter(O.encodingBufferInitialSize)),this.it):new BufferWriter(O.encodingBufferInitialSize)}encodeInto(t,r){const e=new BufferWriter(r);return this.L&&(t=this.nt(t)),this.st(t,e),e.P()}encode(t,r){return this.ot||(this.ot=BufferFormat.et()),this.ot.V=0,this.L&&(t=this.nt(t)),this.st(t,this.ot),(null!=r?r:O.safe)?this.ot.q():this.ot.P()}decodeInto(t,r){return this.ht(new BufferReader(t,void 0===this.header?0:2),r)}decode(t,r){return this.ht(new BufferReader(t,void 0===this.header?0:2),r)}setTransforms(t){if(this.L=!0,"function"==typeof t||Array.isArray(t)&&"function"==typeof t[0])this.ft=t;else for(const r of Object.keys(t)){const e=this.Y.get(r);if(!e)throw new TypeError(`Failed to set transforms for field '${r}'`);e.ut.setTransforms(t[r])}return this}setValidation(t){if(this.L=!0,"function"==typeof t)this.ct=t;else for(const r of Object.keys(t)){const e=this.Y.get(r);if(!e)throw new TypeError(`Failed to set validation function for field '${r}'`);e.ut.setValidation(t[r])}return this}st(t,r){if(void 0!==this.tt&&r.$(this.tt),void 0!==this.X){const e=this.ct||this.ft?this.nt(t):t;return _[this.X](e,r)}if("object"!=typeof t||!t)throw new TypeError("expected object type");for(const e of this.Z){const i=t[e.dt];if(e.$t){if(null==i){M.h(!1,r);continue}M.h(!0,r)}else if(null==i)throw new Error(`missing required value: ${e.dt}`);e.lt?this.wt(i,r,e.ut):e.ut.st(i,r)}}nt(t){return this.ct&&this.yt(t),"function"==typeof this.ft?this.ft(t):Array.isArray(this.ft)&&"function"==typeof this.ft[0]?this.ft[0](t):t}bt(t){return Array.isArray(this.ft)&&"function"==typeof this.ft[1]&&(t=this.ft[1](t)),this.ct&&this.yt(t),t}yt(t){if(!this.ct)return;const r=this.ct(t);if(r instanceof Error)throw r;if(!1===r)throw new Error("failed validation")}ht(t,r){return this.ht=this.Bt(),this.ht(t,r)}Ft(){const t=this.Z.map((({dt:t},r)=>`v.${t}=this.${this.Tt.name}(${r},s,v.${t})`)).join(";");return`let v=o??{};${t};return v;`}Tt(t,r,e){const i=this.Z[t];if(!i.$t||M.p(r))return i.lt?this.At(i.ut,r,e):i.ut.ht(r,e)}Bt(){return void 0!==this.X?this.L?t=>this.bt(k[this.X](t)):k[this.X]:new Function("s","o",this.Ft())}wt(t,r,e){if(!Array.isArray(t))throw new TypeError(`expected array, instead got: ${t}`);$.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,$={h:(r,e)=>{"number"!=typeof r&&(r=Number(r)),r<0&&(r=0),r<128?e.u(r):r<16384?e.$(r+32768):r=u?(e.l(t(r/d)+3758096384),e.l(r>>>0)):e.u(!0===r?1:0)},p:t=>{const r=t.m();return 128&r?64&r?32&r?(t.B()-3758096384)*d+t.B():t.B()-3221225472:t.F()-32768:(t.T(),r)}},l={h:(t,r)=>r.u(t),p:t=>t.A()},w={h:(t,r)=>r.$(t),p:t=>t.F()},y={h:(t,r)=>r.l(t),p:t=>t.B()},p={h:(r,e)=>{"number"!=typeof r&&(r=Number(r)),r>=-64&&r<64?e.u(127&r):r>=-8192&&r<8192?e.$(32768+(16383&r)):r>=-268435456&&r=c?(e.l(3758096384+(536870911&t(r/d))),e.l(r>>>0)):e.u(!0===r?127:0)},p:t=>{let r,e=t.m();return 128&e?64&e?32&e?(r=t.B()-3758096384,r=268435456&r?3758096384|r:r,r*d+t.B()):(r=t.B()-3221225472,268435456&r?3758096384|r:r):(r=t.F()-32768,8192&r?4294950912|r:r):(t.T(),64&e?4294967168|e:e)}},b={h:(t,r)=>r.v(t),p:t=>t.U()},m={h:(t,r)=>r.I(t),p:t=>t.M()},B={h:(t,r)=>r.S(t),p:t=>t.j()},F={h:(t,r)=>r.$(function $tobf16(t){return f[0]=t,a[0]>>>16}(t)),p:t=>function $frombf16(t){return a[0]=t<<16,f[0]}(t.F())},T={h:(t,r)=>r.$(o(t)),p:t=>h(t.F())},A={h:(t,r)=>r.H(t),p:t=>t._()},v={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)=>{$.h(t.byteLength,r),r.C(t)},p:t=>t.D($.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)),$.h(mask(t),r)},p:(t,r)=>unmask($.p(t),r)},j={h:(t,r)=>I.h(JSON.stringify(t),r),p:t=>JSON.parse(I.p(t))},H={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":""))}},_={[e.UInt]:$.h,[e.UInt8]:l.h,[e.UInt16]:w.h,[e.UInt32]:y.h,[e.Int]:p.h,[e.Int8]:b.h,[e.Int16]:m.h,[e.Int32]:B.h,[e.Float64]:v.h,[e.Float32]:A.h,[e.Float16]:T.h,[e.BFloat16]:F.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]:j.h,[e.RegExp]:H.h,[e.Date]:g.h},k={[e.UInt]:$.p,[e.UInt8]:l.p,[e.UInt16]:w.p,[e.UInt32]:y.p,[e.Int]:p.p,[e.Int8]:b.p,[e.Int16]:m.p,[e.Int32]:B.p,[e.Float64]:v.p,[e.Float32]:A.p,[e.Float16]:T.p,[e.BFloat16]:F.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]:j.p,[e.RegExp]:H.p,[e.Date]:g.p};let O={safe:!1,useGlobalEncodingBuffer:!0,encodingBufferMaxSize:1500,encodingBufferInitialSize:256,encodingBufferIncrement:256};class BufferWriter{constructor(t){this.V=0,this.N=0,this.R="number"==typeof t;let r=t instanceof Uint8Array?t:new Uint8Array(t);this.W=r,this.J=new DataView(r.buffer,r.byteOffset,r.byteLength)}P(){return this.W.subarray(0,this.V)}q(){const t=new Uint8Array(this.V);return t.set(this.P()),t}v(t){this.G(1).setInt8(this.N,t)}I(t){this.G(2).setInt16(this.N,t,!0)}S(t){this.G(4).setInt32(this.N,t,!0)}u(t){this.G(1).setUint8(this.N,t)}$(t){this.G(2).setUint16(this.N,t,!1)}l(t){this.G(4).setUint32(this.N,t,!1)}H(t){this.G(4).setFloat32(this.N,t,!0)}k(t){this.G(8).setFloat64(this.N,t,!0)}C(t){this.G(t.byteLength);let r=ArrayBuffer.isView(t)?t instanceof Uint8Array?t:new Uint8Array(t.buffer,t.byteOffset,t.byteLength):new Uint8Array(t);new Uint8Array(this.J.buffer,this.J.byteOffset+this.N,t.byteLength).set(r)}G(t){return this.V+t>this.J.byteLength&&this.K(t),this.N=this.V,this.V+=t,this.J}K(t){if(!this.R)throw new TinybufError("exceeded buffer length: "+this.J.byteLength);const r=this.J.byteLength,e=this.V+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.J=new DataView(h.buffer),this.W=h}}class BufferReader{constructor(t,r){this.J=ArrayBuffer.isView(t)?new DataView(t.buffer,t.byteOffset,t.byteLength):new DataView(t),this.i=null!=r?r:0}m(){return this.J.getUint8(this.i)}T(){this.i++}A(){return this.J.getUint8(this.i++)}F(){const t=this.J.getUint16(this.i);return this.i+=2,t}B(){const t=this.J.getUint32(this.i);return this.i+=4,t}U(){return this.J.getInt8(this.i++)}M(){const t=this.J.getInt16(this.i,!0);return this.i+=2,t}j(){const t=this.J.getInt32(this.i,!0);return this.i+=4,t}_(){const t=this.J.getFloat32(this.i,!0);return this.i+=4,t}O(){const t=this.J.getFloat64(this.i,!0);return this.i+=8,t}D(t){if(this.J.byteOffset+this.i+t>this.J.byteLength)throw new RangeError("exceeded bytes");const r=new Uint8Array(this.J.buffer,this.J.byteOffset+this.i,t);return this.i+=t,r}}class BufferFormat{constructor(t,r){if(this.L=!1,"string"==typeof t&&i.includes(t))this.X=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.X=void 0,this.Y=new Map,this.Z=Object.keys(t).map((r=>{const e=new Field(r,t[r]);return this.Y.set(r,e),e})),void 0===r)this.header=$hashCode(this.f),this.tt=this.header;else if(null===r)this.header=void 0,this.tt=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.tt="number"==typeof r?r:$strToHashCode(r)}}}get f(){return void 0===this.rt&&(this.rt=void 0!==this.Z?`{${this.Z.map((t=>t.f)).join(",")}}`:`${this.X}`),this.rt}static et(){return O.useGlobalEncodingBuffer?(BufferFormat.it||(this.it=new BufferWriter(O.encodingBufferMaxSize)),this.it):new BufferWriter(O.encodingBufferInitialSize)}encodeInto(t,r){const e=new BufferWriter(r);return this.L&&(t=this.nt(t)),this.st(t,e),e.P()}encode(t,r){return this.ot||(this.ot=BufferFormat.et()),this.ot.V=0,this.L&&(t=this.nt(t)),this.st(t,this.ot),(null!=r?r:O.safe)?this.ot.q():this.ot.P()}decodeInto(t,r){return this.ht(new BufferReader(t,void 0===this.header?0:2),r)}decode(t,r){return this.ht(new BufferReader(t,void 0===this.header?0:2),r)}setTransforms(t){if(this.L=!0,"function"==typeof t||Array.isArray(t)&&"function"==typeof t[0])this.ft=t;else for(const r of Object.keys(t)){const e=this.Y.get(r);if(!e)throw new TypeError(`Failed to set transforms for field '${r}'`);e.ut.setTransforms(t[r])}return this}setValidation(t){if(this.L=!0,"function"==typeof t)this.ct=t;else for(const r of Object.keys(t)){const e=this.Y.get(r);if(!e)throw new TypeError(`Failed to set validation function for field '${r}'`);e.ut.setValidation(t[r])}return this}st(t,r){if(void 0!==this.tt&&r.$(this.tt),void 0!==this.X){const e=this.ct||this.ft?this.nt(t):t;return _[this.X](e,r)}if("object"!=typeof t||!t)throw new TypeError("expected object type");for(const e of this.Z){const i=t[e.dt];if(e.$t){if(null==i){M.h(!1,r);continue}M.h(!0,r)}else if(null==i)throw new Error(`missing required value: ${e.dt}`);e.lt?this.wt(i,r,e.ut):e.ut.st(i,r)}}nt(t){return this.ct&&this.yt(t),"function"==typeof this.ft?this.ft(t):Array.isArray(this.ft)&&"function"==typeof this.ft[0]?this.ft[0](t):t}bt(t){return Array.isArray(this.ft)&&"function"==typeof this.ft[1]&&(t=this.ft[1](t)),this.ct&&this.yt(t),t}yt(t){if(!this.ct)return;const r=this.ct(t);if(r instanceof Error)throw r;if(!1===r)throw new Error("failed validation")}ht(t,r){return this.ht=this.Bt(),this.ht(t,r)}Ft(){const t=this.Z.map((({dt:t},r)=>`v.${t}=this.${this.Tt.name}(${r},s,v.${t})`)).join(";");return`let v=o??{};${t};return v;`}Tt(t,r,e){const i=this.Z[t];if(!i.$t||M.p(r))return i.lt?this.At(i.ut,r,e):i.ut.ht(r,e)}Bt(){return void 0!==this.X?this.L?t=>this.bt(k[this.X](t)):k[this.X]:new Function("s","o",this.Ft())}wt(t,r,e){if(!Array.isArray(t))throw new TypeError(`expected array, instead got: ${t}`);$.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 e7e5166..bc249e5 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 return (ArrayBuffer.isView(b) ? new DataView(b.buffer, b.byteOffset, 2) : new DataView(b, 0, 2)).getUint16(0, false);\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);\n else if (value >= MAX_VARUINT32) {\n writer.$writeUint32($floor(value / POW_32) + 0xe0000000);\n writer.$writeUint32(value >>> 0);\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.$writeUint32(value >>> 0);\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 _$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._$dataView = new DataView(b.buffer, b.byteOffset, b.byteLength);\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._$alloc(1).setInt8(this._$writeHead, value);\n }\n\n public $writeInt16(value: number): void {\n this._$alloc(2).setInt16(this._$writeHead, value, true);\n }\n\n public $writeInt32(value: number): void {\n this._$alloc(4).setInt32(this._$writeHead, value, true);\n }\n\n public $writeUint8(value: number): void {\n this._$alloc(1).setUint8(this._$writeHead, value);\n }\n\n public $writeUint16(value: number): void {\n this._$alloc(2).setUint16(this._$writeHead, value, false); // big-endian for varint\n }\n\n public $writeUint32(value: number): void {\n this._$alloc(4).setUint32(this._$writeHead, value, false); // big-endian for varint\n }\n\n public $writeFloat32(value: number): void {\n this._$alloc(4).setFloat32(this._$writeHead, value, true);\n }\n\n public $writeFloat64(value: number): void {\n this._$alloc(8).setFloat64(this._$writeHead, value, true);\n }\n\n public $writeBytes(b: Uint8Array | ArrayBuffer | ArrayBufferView): void {\n // allocate bytes first\n this._$alloc(b.byteLength);\n\n let bBytes: Uint8Array = ArrayBuffer.isView(b)\n ? b instanceof Uint8Array\n ? b\n : new Uint8Array(b.buffer, b.byteOffset, b.byteLength)\n : new Uint8Array(b);\n\n // copy bytes\n new Uint8Array(\n this._$dataView.buffer,\n this._$dataView.byteOffset + this._$writeHead,\n b.byteLength\n ).set(bBytes);\n }\n\n // ----- Private methods: -----\n\n private _$alloc(bytes: number): DataView {\n if (this.$byteLength + bytes > this._$dataView.byteLength) {\n const minBytesNeeded = this.$byteLength + bytes - this._$dataView.byteLength;\n const requestedNewBytes = Math.ceil(minBytesNeeded / cfg.encodingBufferIncrement) * cfg.encodingBufferIncrement;\n if (!this._$resizable) throw new TinybufError(\"exceeded buffer length: \" + this._$dataView.byteLength);\n this._$resizeBuffer(this._$dataView.byteLength + requestedNewBytes);\n }\n\n this._$writeHead = this.$byteLength;\n this.$byteLength += bytes;\n\n return this._$dataView;\n }\n\n private _$resizeBuffer(newSize: number): void {\n if (newSize > cfg.encodingBufferMaxSize) {\n // safety check\n throw new TinybufError(`exceeded encodingBufferMaxSize: ${cfg.encodingBufferMaxSize}`);\n }\n\n const buf = new Uint8Array(newSize);\n buf.set(this._$bytes); // copy bytes\n\n // update refs\n this._$dataView = new DataView(buf.buffer);\n this._$bytes = buf;\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\n public constructor(b: Uint8Array | ArrayBufferView | ArrayBuffer, headerBytes?: number) {\n this._$dataView = ArrayBuffer.isView(b)\n ? new DataView(b.buffer, b.byteOffset, b.byteLength)\n : new DataView(b);\n\n this.i = headerBytes ?? 0; // internal offset (header)\n }\n\n /** Read the next byte, without moving the read head pointer. */\n public $peek(): number {\n return this._$dataView.getUint8(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.i++);\n }\n\n public $readUint16(): number {\n const r = this._$dataView.getUint16(this.i); // big-endian\n this.i += 2;\n return r;\n }\n\n public $readUint32(): number {\n const r = this._$dataView.getUint32(this.i); // big-endian\n this.i += 4;\n return r;\n }\n\n public $readInt8(): number {\n return this._$dataView.getInt8(this.i++);\n }\n\n public $readInt16(): number {\n const r = this._$dataView.getInt16(this.i, true); // little-endian\n this.i += 2;\n return r;\n }\n\n public $readInt32(): number {\n const r = this._$dataView.getInt32(this.i, true); // little-endian\n this.i += 4;\n return r;\n }\n\n public $readFloat32(): number {\n const r = this._$dataView.getFloat32(this.i, true); // little-endian\n this.i += 4;\n return r;\n }\n\n public $readFloat64(): number {\n const r = this._$dataView.getFloat64(this.i, true); // little-endian\n this.i += 8;\n return r;\n }\n\n /** @throws RangeError if exceeds length */\n public $readBytes(bytes: number): Uint8Array {\n if (this._$dataView.byteOffset + this.i + bytes > this._$dataView.byteLength) {\n throw new RangeError(\"exceeded bytes\");\n }\n\n const view = new Uint8Array(this._$dataView.buffer, this._$dataView.byteOffset + this.i, bytes);\n this.i += bytes;\n\n return view;\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\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 // lazy init: global encoding buffer created at max size\n this._$globalWriter = new BufferWriter(cfg.encodingBufferInitialSize);\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 const writer = new BufferWriter(bytes);\n\n if (this._$hasValidationOrTransforms) {\n data = this._$preprocess(data);\n }\n\n this._$write(data, writer);\n\n return writer.$viewBytes();\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._$read(new BufferReader(bytes, this.header === undefined ? 0 : 2), 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._$read(new BufferReader(bytes, this.header === undefined ? 0 : 2), 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 /**\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 for (const field of this._$fields) {\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 = obj?.length === len ? obj : new Array(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","ArrayBuffer","isView","DataView","buffer","byteOffset","getUint16","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","byteLength","$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","Uint8Array","_$bytes","_$dataView","$viewBytes","subarray","$copyBytes","buf","_$alloc","setInt8","setInt16","setInt32","setUint8","setUint16","setUint32","setFloat32","setFloat64","bBytes","bytes","minBytesNeeded","requestedNewBytes","_$resizeBuffer","newSize","BufferReader","headerBytes","getUint8","getUint32","getInt8","getInt16","getInt32","getFloat32","getFloat64","RangeError","view","BufferFormat","def","_$hasValidationOrTransforms","includes","_$type","TypeError","_$fieldsMap","_$fields","keys","map","name","Field","_$header","isValidHeader","h","isInteger","_$format","v","join","_$initWriter","_$globalWriter","encodeInto","_$preprocess","_$write","preserveBytes","_$writer","decodeInto","obj","_$read","setTransforms","transforms","_$transforms","field","$coder","setValidation","validations","_$validate","bw","safeValue","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 return (ArrayBuffer.isView(b) ? new DataView(b.buffer, b.byteOffset, 2) : new DataView(b, 0, 2)).getUint16(0, false);\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);\n else if (value >= MAX_VARUINT32) {\n writer.$writeUint32($floor(value / POW_32) + 0xe0000000);\n writer.$writeUint32(value >>> 0);\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.$writeUint32(value >>> 0);\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 _$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._$dataView = new DataView(b.buffer, b.byteOffset, b.byteLength);\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 let bBytes: Uint8Array = ArrayBuffer.isView(b)\n ? b instanceof Uint8Array\n ? b\n : new Uint8Array(b.buffer, b.byteOffset, b.byteLength)\n : new Uint8Array(b);\n\n // copy bytes\n new Uint8Array(\n this._$dataView.buffer,\n this._$dataView.byteOffset + this._$writeHead,\n b.byteLength\n ).set(bBytes);\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._$dataView.byteLength) {\n this._$malloc(bytes);\n }\n\n this._$writeHead = 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._$dataView.byteLength);\n }\n\n const currentBytes = this._$dataView.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 }\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\n public constructor(b: Uint8Array | ArrayBufferView | ArrayBuffer, headerBytes?: number) {\n this._$dataView = ArrayBuffer.isView(b)\n ? new DataView(b.buffer, b.byteOffset, b.byteLength)\n : new DataView(b);\n\n this.i = headerBytes ?? 0; // internal offset (header)\n }\n\n /** Read the next byte, without moving the read head pointer. */\n public $peek(): number {\n return this._$dataView.getUint8(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.i++);\n }\n\n public $readUint16(): number {\n const r = this._$dataView.getUint16(this.i); // big-endian\n this.i += 2;\n return r;\n }\n\n public $readUint32(): number {\n const r = this._$dataView.getUint32(this.i); // big-endian\n this.i += 4;\n return r;\n }\n\n public $readInt8(): number {\n return this._$dataView.getInt8(this.i++);\n }\n\n public $readInt16(): number {\n const r = this._$dataView.getInt16(this.i, true); // little-endian\n this.i += 2;\n return r;\n }\n\n public $readInt32(): number {\n const r = this._$dataView.getInt32(this.i, true); // little-endian\n this.i += 4;\n return r;\n }\n\n public $readFloat32(): number {\n const r = this._$dataView.getFloat32(this.i, true); // little-endian\n this.i += 4;\n return r;\n }\n\n public $readFloat64(): number {\n const r = this._$dataView.getFloat64(this.i, true); // little-endian\n this.i += 8;\n return r;\n }\n\n /** @throws RangeError if exceeds length */\n public $readBytes(bytes: number): Uint8Array {\n if (this._$dataView.byteOffset + this.i + bytes > this._$dataView.byteLength) {\n throw new RangeError(\"exceeded bytes\");\n }\n\n const view = new Uint8Array(this._$dataView.buffer, this._$dataView.byteOffset + this.i, bytes);\n this.i += bytes;\n\n return view;\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\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 const writer = new BufferWriter(bytes);\n\n if (this._$hasValidationOrTransforms) {\n data = this._$preprocess(data);\n }\n\n this._$write(data, writer);\n\n return writer.$viewBytes();\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._$read(new BufferReader(bytes, this.header === undefined ? 0 : 2), 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._$read(new BufferReader(bytes, this.header === undefined ? 0 : 2), 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 /**\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 for (const field of this._$fields) {\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 = obj?.length === len ? obj : new Array(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","ArrayBuffer","isView","DataView","buffer","byteOffset","getUint16","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","byteLength","$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","Uint8Array","_$bytes","_$dataView","$viewBytes","subarray","$copyBytes","buf","_$pre","setInt8","setInt16","setInt32","setUint8","setUint16","setUint32","setFloat32","setFloat64","bBytes","bytes","_$malloc","currentBytes","minNewBytes","availableBytes","increment","newBytes","newSize","BufferReader","headerBytes","getUint8","getUint32","getInt8","getInt16","getInt32","getFloat32","getFloat64","RangeError","view","BufferFormat","def","_$hasValidationOrTransforms","includes","_$type","TypeError","_$fieldsMap","_$fields","keys","map","name","Field","_$header","isValidHeader","h","isInteger","_$format","v","join","_$initWriter","_$globalWriter","encodeInto","_$preprocess","_$write","preserveBytes","_$writer","decodeInto","obj","_$read","setTransforms","transforms","_$transforms","field","$coder","setValidation","validations","_$validate","bw","safeValue","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 diff --git a/dist/index.mjs b/dist/index.mjs index f8cb6ae..799276f 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),f=new Float32Array(a.buffer);function bf16round(t){return f[0]=t,a[0]=4294901760&a[0],f[0]}const u=536870912,c=268435456,d=4294967296,$={h:(r,e)=>{"number"!=typeof r&&(r=Number(r)),r<0&&(r=0),r<128?e.u(r):r<16384?e.$(r+32768):r=u?(e.l(t(r/d)+3758096384),e.l(r>>>0)):e.u(!0===r?1:0)},p:t=>{const r=t.m();return 128&r?64&r?32&r?(t.B()-3758096384)*d+t.B():t.B()-3221225472:t.F()-32768:(t.T(),r)}},l={h:(t,r)=>r.u(t),p:t=>t.A()},w={h:(t,r)=>r.$(t),p:t=>t.F()},y={h:(t,r)=>r.l(t),p:t=>t.B()},p={h:(r,e)=>{"number"!=typeof r&&(r=Number(r)),r>=-64&&r<64?e.u(127&r):r>=-8192&&r<8192?e.$(32768+(16383&r)):r>=-268435456&&r=c?(e.l(3758096384+(536870911&t(r/d))),e.l(r>>>0)):e.u(!0===r?127:0)},p:t=>{let r,e=t.m();return 128&e?64&e?32&e?(r=t.B()-3758096384,r=268435456&r?3758096384|r:r,r*d+t.B()):(r=t.B()-3221225472,268435456&r?3758096384|r:r):(r=t.F()-32768,8192&r?4294950912|r:r):(t.T(),64&e?4294967168|e:e)}},b={h:(t,r)=>r.v(t),p:t=>t.U()},m={h:(t,r)=>r.I(t),p:t=>t.M()},B={h:(t,r)=>r.S(t),p:t=>t.j()},F={h:(t,r)=>r.$(function $tobf16(t){return f[0]=t,a[0]>>>16}(t)),p:t=>function $frombf16(t){return a[0]=t<<16,f[0]}(t.F())},T={h:(t,r)=>r.$(o(t)),p:t=>h(t.F())},A={h:(t,r)=>r.H(t),p:t=>t._()},v={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)=>{$.h(t.byteLength,r),r.C(t)},p:t=>t.D($.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)),$.h(mask(t),r)},p:(t,r)=>unmask($.p(t),r)},j={h:(t,r)=>M.h(JSON.stringify(t),r),p:t=>JSON.parse(M.p(t))},H={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":""))}},_={[e.UInt]:$.h,[e.UInt8]:l.h,[e.UInt16]:w.h,[e.UInt32]:y.h,[e.Int]:p.h,[e.Int8]:b.h,[e.Int16]:m.h,[e.Int32]:B.h,[e.Float64]:v.h,[e.Float32]:A.h,[e.Float16]:T.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]:j.h,[e.RegExp]:H.h,[e.Date]:U.h},k={[e.UInt]:$.p,[e.UInt8]:l.p,[e.UInt16]:w.p,[e.UInt32]:y.p,[e.Int]:p.p,[e.Int8]:b.p,[e.Int16]:m.p,[e.Int32]:B.p,[e.Float64]:v.p,[e.Float32]:A.p,[e.Float16]:T.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]:j.p,[e.RegExp]:H.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.V=0,this.N=0,this.R="number"==typeof t;let r=t instanceof Uint8Array?t:new Uint8Array(t);this.W=r,this.J=new DataView(r.buffer,r.byteOffset,r.byteLength)}P(){return this.W.subarray(0,this.V)}q(){const t=new Uint8Array(this.V);return t.set(this.P()),t}v(t){this.G(1).setInt8(this.N,t)}I(t){this.G(2).setInt16(this.N,t,!0)}S(t){this.G(4).setInt32(this.N,t,!0)}u(t){this.G(1).setUint8(this.N,t)}$(t){this.G(2).setUint16(this.N,t,!1)}l(t){this.G(4).setUint32(this.N,t,!1)}H(t){this.G(4).setFloat32(this.N,t,!0)}k(t){this.G(8).setFloat64(this.N,t,!0)}C(t){this.G(t.byteLength);let r=ArrayBuffer.isView(t)?t instanceof Uint8Array?t:new Uint8Array(t.buffer,t.byteOffset,t.byteLength):new Uint8Array(t);new Uint8Array(this.J.buffer,this.J.byteOffset+this.N,t.byteLength).set(r)}G(t){if(this.V+t>this.J.byteLength){const r=this.V+t-this.J.byteLength,e=Math.ceil(r/O.encodingBufferIncrement)*O.encodingBufferIncrement;if(!this.R)throw new TinybufError("exceeded buffer length: "+this.J.byteLength);this.K(this.J.byteLength+e)}return this.N=this.V,this.V+=t,this.J}K(t){if(t>O.encodingBufferMaxSize)throw new TinybufError(`exceeded encodingBufferMaxSize: ${O.encodingBufferMaxSize}`);const r=new Uint8Array(t);r.set(this.W),this.J=new DataView(r.buffer),this.W=r}}class BufferReader{constructor(t,r){this.J=ArrayBuffer.isView(t)?new DataView(t.buffer,t.byteOffset,t.byteLength):new DataView(t),this.i=null!=r?r:0}m(){return this.J.getUint8(this.i)}T(){this.i++}A(){return this.J.getUint8(this.i++)}F(){const t=this.J.getUint16(this.i);return this.i+=2,t}B(){const t=this.J.getUint32(this.i);return this.i+=4,t}U(){return this.J.getInt8(this.i++)}M(){const t=this.J.getInt16(this.i,!0);return this.i+=2,t}j(){const t=this.J.getInt32(this.i,!0);return this.i+=4,t}_(){const t=this.J.getFloat32(this.i,!0);return this.i+=4,t}O(){const t=this.J.getFloat64(this.i,!0);return this.i+=8,t}D(t){if(this.J.byteOffset+this.i+t>this.J.byteLength)throw new RangeError("exceeded bytes");const r=new Uint8Array(this.J.buffer,this.J.byteOffset+this.i,t);return this.i+=t,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.L=!1,"string"==typeof t&&i.includes(t))this.X=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.X=void 0,this.Y=new Map,this.Z=Object.keys(t).map((r=>{const e=new Field(r,t[r]);return this.Y.set(r,e),e})),void 0===r)this.header=$hashCode(this.f),this.tt=this.header;else if(null===r)this.header=void 0,this.tt=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.tt="number"==typeof r?r:$strToHashCode(r)}}}get f(){return void 0===this.rt&&(this.rt=void 0!==this.Z?`{${this.Z.map((t=>t.f)).join(",")}}`:`${this.X}`),this.rt}static et(){return O.useGlobalEncodingBuffer?(BufferFormat.it||(this.it=new BufferWriter(O.encodingBufferInitialSize)),this.it):new BufferWriter(O.encodingBufferInitialSize)}encodeInto(t,r){const e=new BufferWriter(r);return this.L&&(t=this.nt(t)),this.st(t,e),e.P()}encode(t,r){return this.ot||(this.ot=BufferFormat.et()),this.ot.V=0,this.L&&(t=this.nt(t)),this.st(t,this.ot),(null!=r?r:O.safe)?this.ot.q():this.ot.P()}decodeInto(t,r){return this.ht(new BufferReader(t,void 0===this.header?0:2),r)}decode(t,r){return this.ht(new BufferReader(t,void 0===this.header?0:2),r)}setTransforms(t){if(this.L=!0,"function"==typeof t||Array.isArray(t)&&"function"==typeof t[0])this.ft=t;else for(const r of Object.keys(t)){const e=this.Y.get(r);if(!e)throw new TypeError(`Failed to set transforms for field '${r}'`);e.ut.setTransforms(t[r])}return this}setValidation(t){if(this.L=!0,"function"==typeof t)this.ct=t;else for(const r of Object.keys(t)){const e=this.Y.get(r);if(!e)throw new TypeError(`Failed to set validation function for field '${r}'`);e.ut.setValidation(t[r])}return this}st(t,r){if(void 0!==this.tt&&r.$(this.tt),void 0!==this.X){const e=this.ct||this.ft?this.nt(t):t;return _[this.X](e,r)}if("object"!=typeof t||!t)throw new TypeError("expected object type");for(const e of this.Z){const i=t[e.dt];if(e.$t){if(null==i){S.h(!1,r);continue}S.h(!0,r)}else if(null==i)throw new Error(`missing required value: ${e.dt}`);e.lt?this.wt(i,r,e.ut):e.ut.st(i,r)}}nt(t){return this.ct&&this.yt(t),"function"==typeof this.ft?this.ft(t):Array.isArray(this.ft)&&"function"==typeof this.ft[0]?this.ft[0](t):t}bt(t){return Array.isArray(this.ft)&&"function"==typeof this.ft[1]&&(t=this.ft[1](t)),this.ct&&this.yt(t),t}yt(t){if(!this.ct)return;const r=this.ct(t);if(r instanceof Error)throw r;if(!1===r)throw new Error("failed validation")}ht(t,r){return this.ht=this.Bt(),this.ht(t,r)}Ft(){const t=this.Z.map((({dt:t},r)=>`v.${t}=this.${this.Tt.name}(${r},s,v.${t})`)).join(";");return`let v=o??{};${t};return v;`}Tt(t,r,e){const i=this.Z[t];if(!i.$t||S.p(r))return i.lt?this.At(i.ut,r,e):i.ut.ht(r,e)}Bt(){return void 0!==this.X?this.L?t=>this.bt(k[this.X](t)):k[this.X]:new Function("s","o",this.Ft())}wt(t,r,e){if(!Array.isArray(t))throw new TypeError(`expected array, instead got: ${t}`);$.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),f=new Float32Array(a.buffer);function bf16round(t){return f[0]=t,a[0]=4294901760&a[0],f[0]}const u=536870912,c=268435456,d=4294967296,$={h:(r,e)=>{"number"!=typeof r&&(r=Number(r)),r<0&&(r=0),r<128?e.u(r):r<16384?e.$(r+32768):r=u?(e.l(t(r/d)+3758096384),e.l(r>>>0)):e.u(!0===r?1:0)},p:t=>{const r=t.m();return 128&r?64&r?32&r?(t.B()-3758096384)*d+t.B():t.B()-3221225472:t.F()-32768:(t.T(),r)}},l={h:(t,r)=>r.u(t),p:t=>t.A()},w={h:(t,r)=>r.$(t),p:t=>t.F()},y={h:(t,r)=>r.l(t),p:t=>t.B()},p={h:(r,e)=>{"number"!=typeof r&&(r=Number(r)),r>=-64&&r<64?e.u(127&r):r>=-8192&&r<8192?e.$(32768+(16383&r)):r>=-268435456&&r=c?(e.l(3758096384+(536870911&t(r/d))),e.l(r>>>0)):e.u(!0===r?127:0)},p:t=>{let r,e=t.m();return 128&e?64&e?32&e?(r=t.B()-3758096384,r=268435456&r?3758096384|r:r,r*d+t.B()):(r=t.B()-3221225472,268435456&r?3758096384|r:r):(r=t.F()-32768,8192&r?4294950912|r:r):(t.T(),64&e?4294967168|e:e)}},b={h:(t,r)=>r.v(t),p:t=>t.U()},m={h:(t,r)=>r.I(t),p:t=>t.M()},B={h:(t,r)=>r.S(t),p:t=>t.j()},F={h:(t,r)=>r.$(function $tobf16(t){return f[0]=t,a[0]>>>16}(t)),p:t=>function $frombf16(t){return a[0]=t<<16,f[0]}(t.F())},T={h:(t,r)=>r.$(o(t)),p:t=>h(t.F())},A={h:(t,r)=>r.H(t),p:t=>t._()},v={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)=>{$.h(t.byteLength,r),r.C(t)},p:t=>t.D($.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)),$.h(mask(t),r)},p:(t,r)=>unmask($.p(t),r)},j={h:(t,r)=>M.h(JSON.stringify(t),r),p:t=>JSON.parse(M.p(t))},H={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":""))}},_={[e.UInt]:$.h,[e.UInt8]:l.h,[e.UInt16]:w.h,[e.UInt32]:y.h,[e.Int]:p.h,[e.Int8]:b.h,[e.Int16]:m.h,[e.Int32]:B.h,[e.Float64]:v.h,[e.Float32]:A.h,[e.Float16]:T.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]:j.h,[e.RegExp]:H.h,[e.Date]:U.h},k={[e.UInt]:$.p,[e.UInt8]:l.p,[e.UInt16]:w.p,[e.UInt32]:y.p,[e.Int]:p.p,[e.Int8]:b.p,[e.Int16]:m.p,[e.Int32]:B.p,[e.Float64]:v.p,[e.Float32]:A.p,[e.Float16]:T.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]:j.p,[e.RegExp]:H.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.V=0,this.N=0,this.R="number"==typeof t;let r=t instanceof Uint8Array?t:new Uint8Array(t);this.W=r,this.J=new DataView(r.buffer,r.byteOffset,r.byteLength)}P(){return this.W.subarray(0,this.V)}q(){const t=new Uint8Array(this.V);return t.set(this.P()),t}v(t){this.G(1).setInt8(this.N,t)}I(t){this.G(2).setInt16(this.N,t,!0)}S(t){this.G(4).setInt32(this.N,t,!0)}u(t){this.G(1).setUint8(this.N,t)}$(t){this.G(2).setUint16(this.N,t,!1)}l(t){this.G(4).setUint32(this.N,t,!1)}H(t){this.G(4).setFloat32(this.N,t,!0)}k(t){this.G(8).setFloat64(this.N,t,!0)}C(t){this.G(t.byteLength);let r=ArrayBuffer.isView(t)?t instanceof Uint8Array?t:new Uint8Array(t.buffer,t.byteOffset,t.byteLength):new Uint8Array(t);new Uint8Array(this.J.buffer,this.J.byteOffset+this.N,t.byteLength).set(r)}G(t){return this.V+t>this.J.byteLength&&this.K(t),this.N=this.V,this.V+=t,this.J}K(t){if(!this.R)throw new TinybufError("exceeded buffer length: "+this.J.byteLength);const r=this.J.byteLength,e=this.V+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.J=new DataView(h.buffer),this.W=h}}class BufferReader{constructor(t,r){this.J=ArrayBuffer.isView(t)?new DataView(t.buffer,t.byteOffset,t.byteLength):new DataView(t),this.i=null!=r?r:0}m(){return this.J.getUint8(this.i)}T(){this.i++}A(){return this.J.getUint8(this.i++)}F(){const t=this.J.getUint16(this.i);return this.i+=2,t}B(){const t=this.J.getUint32(this.i);return this.i+=4,t}U(){return this.J.getInt8(this.i++)}M(){const t=this.J.getInt16(this.i,!0);return this.i+=2,t}j(){const t=this.J.getInt32(this.i,!0);return this.i+=4,t}_(){const t=this.J.getFloat32(this.i,!0);return this.i+=4,t}O(){const t=this.J.getFloat64(this.i,!0);return this.i+=8,t}D(t){if(this.J.byteOffset+this.i+t>this.J.byteLength)throw new RangeError("exceeded bytes");const r=new Uint8Array(this.J.buffer,this.J.byteOffset+this.i,t);return this.i+=t,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.L=!1,"string"==typeof t&&i.includes(t))this.X=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.X=void 0,this.Y=new Map,this.Z=Object.keys(t).map((r=>{const e=new Field(r,t[r]);return this.Y.set(r,e),e})),void 0===r)this.header=$hashCode(this.f),this.tt=this.header;else if(null===r)this.header=void 0,this.tt=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.tt="number"==typeof r?r:$strToHashCode(r)}}}get f(){return void 0===this.rt&&(this.rt=void 0!==this.Z?`{${this.Z.map((t=>t.f)).join(",")}}`:`${this.X}`),this.rt}static et(){return O.useGlobalEncodingBuffer?(BufferFormat.it||(this.it=new BufferWriter(O.encodingBufferMaxSize)),this.it):new BufferWriter(O.encodingBufferInitialSize)}encodeInto(t,r){const e=new BufferWriter(r);return this.L&&(t=this.nt(t)),this.st(t,e),e.P()}encode(t,r){return this.ot||(this.ot=BufferFormat.et()),this.ot.V=0,this.L&&(t=this.nt(t)),this.st(t,this.ot),(null!=r?r:O.safe)?this.ot.q():this.ot.P()}decodeInto(t,r){return this.ht(new BufferReader(t,void 0===this.header?0:2),r)}decode(t,r){return this.ht(new BufferReader(t,void 0===this.header?0:2),r)}setTransforms(t){if(this.L=!0,"function"==typeof t||Array.isArray(t)&&"function"==typeof t[0])this.ft=t;else for(const r of Object.keys(t)){const e=this.Y.get(r);if(!e)throw new TypeError(`Failed to set transforms for field '${r}'`);e.ut.setTransforms(t[r])}return this}setValidation(t){if(this.L=!0,"function"==typeof t)this.ct=t;else for(const r of Object.keys(t)){const e=this.Y.get(r);if(!e)throw new TypeError(`Failed to set validation function for field '${r}'`);e.ut.setValidation(t[r])}return this}st(t,r){if(void 0!==this.tt&&r.$(this.tt),void 0!==this.X){const e=this.ct||this.ft?this.nt(t):t;return _[this.X](e,r)}if("object"!=typeof t||!t)throw new TypeError("expected object type");for(const e of this.Z){const i=t[e.dt];if(e.$t){if(null==i){S.h(!1,r);continue}S.h(!0,r)}else if(null==i)throw new Error(`missing required value: ${e.dt}`);e.lt?this.wt(i,r,e.ut):e.ut.st(i,r)}}nt(t){return this.ct&&this.yt(t),"function"==typeof this.ft?this.ft(t):Array.isArray(this.ft)&&"function"==typeof this.ft[0]?this.ft[0](t):t}bt(t){return Array.isArray(this.ft)&&"function"==typeof this.ft[1]&&(t=this.ft[1](t)),this.ct&&this.yt(t),t}yt(t){if(!this.ct)return;const r=this.ct(t);if(r instanceof Error)throw r;if(!1===r)throw new Error("failed validation")}ht(t,r){return this.ht=this.Bt(),this.ht(t,r)}Ft(){const t=this.Z.map((({dt:t},r)=>`v.${t}=this.${this.Tt.name}(${r},s,v.${t})`)).join(";");return`let v=o??{};${t};return v;`}Tt(t,r,e){const i=this.Z[t];if(!i.$t||S.p(r))return i.lt?this.At(i.ut,r,e):i.ut.ht(r,e)}Bt(){return void 0!==this.X?this.L?t=>this.bt(k[this.X](t)):k[this.X]:new Function("s","o",this.Ft())}wt(t,r,e){if(!Array.isArray(t))throw new TypeError(`expected array, instead got: ${t}`);$.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);\n else if (value >= MAX_VARUINT32) {\n writer.$writeUint32($floor(value / POW_32) + 0xe0000000);\n writer.$writeUint32(value >>> 0);\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.$writeUint32(value >>> 0);\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 _$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._$dataView = new DataView(b.buffer, b.byteOffset, b.byteLength);\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._$alloc(1).setInt8(this._$writeHead, value);\n }\n\n public $writeInt16(value: number): void {\n this._$alloc(2).setInt16(this._$writeHead, value, true);\n }\n\n public $writeInt32(value: number): void {\n this._$alloc(4).setInt32(this._$writeHead, value, true);\n }\n\n public $writeUint8(value: number): void {\n this._$alloc(1).setUint8(this._$writeHead, value);\n }\n\n public $writeUint16(value: number): void {\n this._$alloc(2).setUint16(this._$writeHead, value, false); // big-endian for varint\n }\n\n public $writeUint32(value: number): void {\n this._$alloc(4).setUint32(this._$writeHead, value, false); // big-endian for varint\n }\n\n public $writeFloat32(value: number): void {\n this._$alloc(4).setFloat32(this._$writeHead, value, true);\n }\n\n public $writeFloat64(value: number): void {\n this._$alloc(8).setFloat64(this._$writeHead, value, true);\n }\n\n public $writeBytes(b: Uint8Array | ArrayBuffer | ArrayBufferView): void {\n // allocate bytes first\n this._$alloc(b.byteLength);\n\n let bBytes: Uint8Array = ArrayBuffer.isView(b)\n ? b instanceof Uint8Array\n ? b\n : new Uint8Array(b.buffer, b.byteOffset, b.byteLength)\n : new Uint8Array(b);\n\n // copy bytes\n new Uint8Array(\n this._$dataView.buffer,\n this._$dataView.byteOffset + this._$writeHead,\n b.byteLength\n ).set(bBytes);\n }\n\n // ----- Private methods: -----\n\n private _$alloc(bytes: number): DataView {\n if (this.$byteLength + bytes > this._$dataView.byteLength) {\n const minBytesNeeded = this.$byteLength + bytes - this._$dataView.byteLength;\n const requestedNewBytes = Math.ceil(minBytesNeeded / cfg.encodingBufferIncrement) * cfg.encodingBufferIncrement;\n if (!this._$resizable) throw new TinybufError(\"exceeded buffer length: \" + this._$dataView.byteLength);\n this._$resizeBuffer(this._$dataView.byteLength + requestedNewBytes);\n }\n\n this._$writeHead = this.$byteLength;\n this.$byteLength += bytes;\n\n return this._$dataView;\n }\n\n private _$resizeBuffer(newSize: number): void {\n if (newSize > cfg.encodingBufferMaxSize) {\n // safety check\n throw new TinybufError(`exceeded encodingBufferMaxSize: ${cfg.encodingBufferMaxSize}`);\n }\n\n const buf = new Uint8Array(newSize);\n buf.set(this._$bytes); // copy bytes\n\n // update refs\n this._$dataView = new DataView(buf.buffer);\n this._$bytes = buf;\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\n public constructor(b: Uint8Array | ArrayBufferView | ArrayBuffer, headerBytes?: number) {\n this._$dataView = ArrayBuffer.isView(b)\n ? new DataView(b.buffer, b.byteOffset, b.byteLength)\n : new DataView(b);\n\n this.i = headerBytes ?? 0; // internal offset (header)\n }\n\n /** Read the next byte, without moving the read head pointer. */\n public $peek(): number {\n return this._$dataView.getUint8(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.i++);\n }\n\n public $readUint16(): number {\n const r = this._$dataView.getUint16(this.i); // big-endian\n this.i += 2;\n return r;\n }\n\n public $readUint32(): number {\n const r = this._$dataView.getUint32(this.i); // big-endian\n this.i += 4;\n return r;\n }\n\n public $readInt8(): number {\n return this._$dataView.getInt8(this.i++);\n }\n\n public $readInt16(): number {\n const r = this._$dataView.getInt16(this.i, true); // little-endian\n this.i += 2;\n return r;\n }\n\n public $readInt32(): number {\n const r = this._$dataView.getInt32(this.i, true); // little-endian\n this.i += 4;\n return r;\n }\n\n public $readFloat32(): number {\n const r = this._$dataView.getFloat32(this.i, true); // little-endian\n this.i += 4;\n return r;\n }\n\n public $readFloat64(): number {\n const r = this._$dataView.getFloat64(this.i, true); // little-endian\n this.i += 8;\n return r;\n }\n\n /** @throws RangeError if exceeds length */\n public $readBytes(bytes: number): Uint8Array {\n if (this._$dataView.byteOffset + this.i + bytes > this._$dataView.byteLength) {\n throw new RangeError(\"exceeded bytes\");\n }\n\n const view = new Uint8Array(this._$dataView.buffer, this._$dataView.byteOffset + this.i, bytes);\n this.i += bytes;\n\n return view;\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\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 // lazy init: global encoding buffer created at max size\n this._$globalWriter = new BufferWriter(cfg.encodingBufferInitialSize);\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 const writer = new BufferWriter(bytes);\n\n if (this._$hasValidationOrTransforms) {\n data = this._$preprocess(data);\n }\n\n this._$write(data, writer);\n\n return writer.$viewBytes();\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._$read(new BufferReader(bytes, this.header === undefined ? 0 : 2), 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._$read(new BufferReader(bytes, this.header === undefined ? 0 : 2), 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 /**\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 for (const field of this._$fields) {\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 = obj?.length === len ? obj : new Array(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","ArrayBuffer","isView","DataView","buffer","byteOffset","getUint16","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","byteLength","$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","Uint8Array","_$bytes","_$dataView","$viewBytes","subarray","$copyBytes","buf","_$alloc","setInt8","setInt16","setInt32","setUint8","setUint16","setUint32","setFloat32","setFloat64","bBytes","bytes","minBytesNeeded","requestedNewBytes","_$resizeBuffer","newSize","BufferReader","headerBytes","getUint8","getUint32","getInt8","getInt16","getInt32","getFloat32","getFloat64","RangeError","view","defineFormat","a","BufferFormat","def","_$hasValidationOrTransforms","includes","_$type","TypeError","_$fieldsMap","_$fields","keys","map","name","Field","_$header","isValidHeader","h","isInteger","_$format","v","join","_$initWriter","_$globalWriter","encodeInto","_$preprocess","_$write","preserveBytes","_$writer","decodeInto","obj","_$read","setTransforms","transforms","_$transforms","field","$coder","setValidation","validations","_$validate","bw","safeValue","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 return (ArrayBuffer.isView(b) ? new DataView(b.buffer, b.byteOffset, 2) : new DataView(b, 0, 2)).getUint16(0, false);\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);\n else if (value >= MAX_VARUINT32) {\n writer.$writeUint32($floor(value / POW_32) + 0xe0000000);\n writer.$writeUint32(value >>> 0);\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.$writeUint32(value >>> 0);\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 _$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._$dataView = new DataView(b.buffer, b.byteOffset, b.byteLength);\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 let bBytes: Uint8Array = ArrayBuffer.isView(b)\n ? b instanceof Uint8Array\n ? b\n : new Uint8Array(b.buffer, b.byteOffset, b.byteLength)\n : new Uint8Array(b);\n\n // copy bytes\n new Uint8Array(\n this._$dataView.buffer,\n this._$dataView.byteOffset + this._$writeHead,\n b.byteLength\n ).set(bBytes);\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._$dataView.byteLength) {\n this._$malloc(bytes);\n }\n\n this._$writeHead = 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._$dataView.byteLength);\n }\n\n const currentBytes = this._$dataView.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 }\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\n public constructor(b: Uint8Array | ArrayBufferView | ArrayBuffer, headerBytes?: number) {\n this._$dataView = ArrayBuffer.isView(b)\n ? new DataView(b.buffer, b.byteOffset, b.byteLength)\n : new DataView(b);\n\n this.i = headerBytes ?? 0; // internal offset (header)\n }\n\n /** Read the next byte, without moving the read head pointer. */\n public $peek(): number {\n return this._$dataView.getUint8(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.i++);\n }\n\n public $readUint16(): number {\n const r = this._$dataView.getUint16(this.i); // big-endian\n this.i += 2;\n return r;\n }\n\n public $readUint32(): number {\n const r = this._$dataView.getUint32(this.i); // big-endian\n this.i += 4;\n return r;\n }\n\n public $readInt8(): number {\n return this._$dataView.getInt8(this.i++);\n }\n\n public $readInt16(): number {\n const r = this._$dataView.getInt16(this.i, true); // little-endian\n this.i += 2;\n return r;\n }\n\n public $readInt32(): number {\n const r = this._$dataView.getInt32(this.i, true); // little-endian\n this.i += 4;\n return r;\n }\n\n public $readFloat32(): number {\n const r = this._$dataView.getFloat32(this.i, true); // little-endian\n this.i += 4;\n return r;\n }\n\n public $readFloat64(): number {\n const r = this._$dataView.getFloat64(this.i, true); // little-endian\n this.i += 8;\n return r;\n }\n\n /** @throws RangeError if exceeds length */\n public $readBytes(bytes: number): Uint8Array {\n if (this._$dataView.byteOffset + this.i + bytes > this._$dataView.byteLength) {\n throw new RangeError(\"exceeded bytes\");\n }\n\n const view = new Uint8Array(this._$dataView.buffer, this._$dataView.byteOffset + this.i, bytes);\n this.i += bytes;\n\n return view;\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\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 const writer = new BufferWriter(bytes);\n\n if (this._$hasValidationOrTransforms) {\n data = this._$preprocess(data);\n }\n\n this._$write(data, writer);\n\n return writer.$viewBytes();\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._$read(new BufferReader(bytes, this.header === undefined ? 0 : 2), 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._$read(new BufferReader(bytes, this.header === undefined ? 0 : 2), 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 /**\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 for (const field of this._$fields) {\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 = obj?.length === len ? obj : new Array(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","ArrayBuffer","isView","DataView","buffer","byteOffset","getUint16","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","byteLength","$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","Uint8Array","_$bytes","_$dataView","$viewBytes","subarray","$copyBytes","buf","_$pre","setInt8","setInt16","setInt32","setUint8","setUint16","setUint32","setFloat32","setFloat64","bBytes","bytes","_$malloc","currentBytes","minNewBytes","availableBytes","increment","newBytes","newSize","BufferReader","headerBytes","getUint8","getUint32","getInt8","getInt16","getInt32","getFloat32","getFloat64","RangeError","view","defineFormat","a","BufferFormat","def","_$hasValidationOrTransforms","includes","_$type","TypeError","_$fieldsMap","_$fields","keys","map","name","Field","_$header","isValidHeader","h","isInteger","_$format","v","join","_$initWriter","_$globalWriter","encodeInto","_$preprocess","_$write","preserveBytes","_$writer","decodeInto","obj","_$read","setTransforms","transforms","_$transforms","field","$coder","setValidation","validations","_$validate","bw","safeValue","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 diff --git a/package-lock.json b/package-lock.json index b725cda..9fb48e0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "tinybuf", - "version": "1.8.3", + "version": "1.8.7", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "tinybuf", - "version": "1.8.3", + "version": "1.8.7", "license": "MIT", "devDependencies": { "@rollup/plugin-commonjs": "^26.0.1", @@ -52,13 +52,14 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "dependencies": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" @@ -256,18 +257,18 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true, "engines": { "node": ">=6.9.0" @@ -283,110 +284,26 @@ } }, "node_modules/@babel/helpers": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", - "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", - "dev": true, - "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.13", - "@babel/types": "^7.20.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", + "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/parser": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", + "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "@babel/types": "^7.28.2" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -572,14 +489,14 @@ } }, "node_modules/@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -607,14 +524,13 @@ } }, "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -1315,9 +1231,9 @@ } }, "node_modules/@rollup/plugin-commonjs/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" @@ -2008,9 +1924,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" @@ -2368,9 +2284,9 @@ "dev": true }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", @@ -2618,9 +2534,9 @@ "dev": true }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "dependencies": { "path-key": "^3.1.0", @@ -4964,9 +4880,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "node_modules/picomatch": { @@ -5180,9 +5096,9 @@ } }, "node_modules/rimraf/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "dependencies": { "balanced-match": "^1.0.0" @@ -5647,15 +5563,6 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6014,13 +5921,14 @@ } }, "@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", "dev": true, "requires": { - "@babel/highlight": "^7.24.7", - "picocolors": "^1.0.0" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" } }, "@babel/compat-data": { @@ -6173,15 +6081,15 @@ } }, "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", "dev": true }, "@babel/helper-validator-option": { @@ -6191,92 +6099,24 @@ "dev": true }, "@babel/helpers": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.20.13.tgz", - "integrity": "sha512-nzJ0DWCL3gB5RCXbUO3KIMMsBY2Eqbx8mBpKGE/02PgyRQFcPQLbkQ1vyy596mZLaP+dAfD+R4ckASzNVmW3jg==", + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", + "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", "dev": true, "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.13", - "@babel/types": "^7.20.7" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2" } }, - "@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "@babel/parser": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", + "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "@babel/types": "^7.28.2" } }, - "@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", - "dev": true - }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -6404,14 +6244,14 @@ } }, "@babel/template": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz", - "integrity": "sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", "dev": true, "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" } }, "@babel/traverse": { @@ -6433,14 +6273,13 @@ } }, "@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" } }, "@bcoe/v8-coverage": { @@ -6966,9 +6805,9 @@ }, "dependencies": { "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "requires": { "balanced-match": "^1.0.0" @@ -7425,9 +7264,9 @@ }, "dependencies": { "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "requires": { "balanced-match": "^1.0.0" @@ -7688,9 +7527,9 @@ "dev": true }, "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", "dev": true, "requires": { "balanced-match": "^1.0.0", @@ -7863,9 +7702,9 @@ "dev": true }, "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -9629,9 +9468,9 @@ "dev": true }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "picomatch": { @@ -9772,9 +9611,9 @@ }, "dependencies": { "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "requires": { "balanced-match": "^1.0.0" @@ -10109,12 +9948,6 @@ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", diff --git a/package.json b/package.json index 9586e11..3fd83e1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tinybuf", - "version": "1.8.6", + "version": "1.8.7", "author": "Reece Como ", "authors": [ "Reece Como ", diff --git a/src/__tests__/BufferWriter.test.ts b/src/__tests__/BufferWriter.test.ts index 50440b3..dcce187 100644 --- a/src/__tests__/BufferWriter.test.ts +++ b/src/__tests__/BufferWriter.test.ts @@ -21,4 +21,30 @@ describe("BufferWriter", () => { const text = new TextDecoder("utf-8").decode(writer.$copyBytes()); expect(text).toBe(input); }); + + it("should resize until the limit", () => { + const writer = new BufferWriter(256); + + // cheeky check of the underlying implementation + expect((writer as any)._$dataView.byteOffset).toBe(0); + expect((writer as any)._$dataView.byteLength).toBe(256); + + const textA = "a".repeat(1200); + const textBufferA = $utf8encode(textA); + writer.$writeBytes(textBufferA); + + expect((writer as any)._$dataView.byteOffset).toBe(0); + expect((writer as any)._$dataView.byteLength).toBe(1280); + + const textB = "b".repeat(100); + const textBufferB = $utf8encode(textB); + writer.$writeBytes(textBufferB); + + // caps resize to encodingBufferMaxSize + expect((writer as any)._$dataView.byteOffset).toBe(0); + expect((writer as any)._$dataView.byteLength).toBe(1500); + + const text = new TextDecoder("utf-8").decode(writer.$copyBytes()); + expect(text).toBe(textA + textB); + }); }); diff --git a/src/core/BufferFormat.ts b/src/core/BufferFormat.ts index e881525..31be435 100644 --- a/src/core/BufferFormat.ts +++ b/src/core/BufferFormat.ts @@ -186,8 +186,7 @@ export class BufferFormat this._$dataView.byteLength) { - const minBytesNeeded = this.$byteLength + bytes - this._$dataView.byteLength; - const requestedNewBytes = Math.ceil(minBytesNeeded / cfg.encodingBufferIncrement) * cfg.encodingBufferIncrement; - if (!this._$resizable) throw new TinybufError("exceeded buffer length: " + this._$dataView.byteLength); - this._$resizeBuffer(this._$dataView.byteLength + requestedNewBytes); + this._$malloc(bytes); } this._$writeHead = this.$byteLength; @@ -98,14 +101,29 @@ export class BufferWriter { return this._$dataView; } - private _$resizeBuffer(newSize: number): void { - if (newSize > cfg.encodingBufferMaxSize) { - // safety check - throw new TinybufError(`exceeded encodingBufferMaxSize: ${cfg.encodingBufferMaxSize}`); + /** + * @throws TinybufError + */ + private _$malloc(bytes: number): void { + if (!this._$resizable) { + throw new TinybufError("exceeded buffer length: " + this._$dataView.byteLength); } + const currentBytes = this._$dataView.byteLength; + const minNewBytes = this.$byteLength + bytes - currentBytes; + const availableBytes = cfg.encodingBufferMaxSize - currentBytes; + + if (minNewBytes > availableBytes) { + throw new TinybufError("exceeded encodingBufferMaxSize: " + cfg.encodingBufferMaxSize); + } + + const increment = cfg.encodingBufferIncrement; + const newBytes = Math.ceil(minNewBytes / increment) * increment; + const newSize = currentBytes + Math.min(newBytes, availableBytes); const buf = new Uint8Array(newSize); - buf.set(this._$bytes); // copy bytes + + // copy bytes + buf.set(this._$bytes); // update refs this._$dataView = new DataView(buf.buffer);