@norskvideo/moq-net 0.1.8 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/announce.d.ts +7 -0
- package/announce.d.ts.map +1 -0
- package/announce.js +8 -0
- package/announce.js.map +1 -0
- package/announced.d.ts +49 -91
- package/announced.d.ts.map +1 -1
- package/announced.js +21 -156
- package/announced.js.map +1 -1
- package/bandwidth.d.ts +163 -0
- package/bandwidth.d.ts.map +1 -0
- package/bandwidth.js +304 -0
- package/bandwidth.js.map +1 -0
- package/bandwidth_api.d.ts +7 -0
- package/bandwidth_api.d.ts.map +1 -0
- package/bandwidth_api.js +8 -0
- package/bandwidth_api.js.map +1 -0
- package/broadcast.d.ts +44 -35
- package/broadcast.d.ts.map +1 -1
- package/broadcast.js +104 -60
- package/broadcast.js.map +1 -1
- package/connection/accept.d.ts +16 -1
- package/connection/accept.d.ts.map +1 -1
- package/connection/accept.js +52 -28
- package/connection/accept.js.map +1 -1
- package/connection/browser.d.ts.map +1 -1
- package/connection/browser.js +9 -7
- package/connection/browser.js.map +1 -1
- package/connection/connect.d.ts +30 -6
- package/connection/connect.d.ts.map +1 -1
- package/connection/connect.js +110 -54
- package/connection/connect.js.map +1 -1
- package/connection/established.d.ts +17 -21
- package/connection/established.d.ts.map +1 -1
- package/connection/established.js.map +1 -1
- package/connection/forward.d.ts +2 -0
- package/connection/forward.d.ts.map +1 -0
- package/connection/forward.js +173 -0
- package/connection/forward.js.map +1 -0
- package/connection/handshake.d.ts +1 -0
- package/connection/handshake.d.ts.map +1 -1
- package/connection/handshake.js +5 -2
- package/connection/handshake.js.map +1 -1
- package/connection/index.d.ts +5 -5
- package/connection/index.d.ts.map +1 -1
- package/connection/index.js +4 -5
- package/connection/index.js.map +1 -1
- package/connection/pool.d.ts +186 -0
- package/connection/pool.d.ts.map +1 -0
- package/connection/pool.js +361 -0
- package/connection/pool.js.map +1 -0
- package/connection/reload.d.ts +14 -93
- package/connection/reload.d.ts.map +1 -1
- package/connection/reload.js +217 -81
- package/connection/reload.js.map +1 -1
- package/connection/stats.d.ts +3 -26
- package/connection/stats.d.ts.map +1 -1
- package/connection/stats.js.map +1 -1
- package/connection/transport.d.ts +0 -7
- package/connection/transport.d.ts.map +1 -1
- package/consume.d.ts +1 -43
- package/consume.d.ts.map +1 -1
- package/consume.js +1 -1
- package/consume.js.map +1 -1
- package/error.d.ts +180 -29
- package/error.d.ts.map +1 -1
- package/error.js +331 -16
- package/error.js.map +1 -1
- package/errors.d.ts +7 -0
- package/errors.d.ts.map +1 -0
- package/errors.js +8 -0
- package/errors.js.map +1 -0
- package/group.d.ts +9 -43
- package/group.d.ts.map +1 -1
- package/group.js +284 -69
- package/group.js.map +1 -1
- package/hop.d.ts +115 -0
- package/hop.d.ts.map +1 -0
- package/hop.js +119 -0
- package/hop.js.map +1 -0
- package/ietf/adapter.d.ts +5 -1
- package/ietf/adapter.d.ts.map +1 -1
- package/ietf/adapter.js +105 -60
- package/ietf/adapter.js.map +1 -1
- package/ietf/aliases.d.ts +1 -78
- package/ietf/aliases.d.ts.map +1 -1
- package/ietf/cluster.d.ts +9 -123
- package/ietf/cluster.d.ts.map +1 -1
- package/ietf/cluster.js +84 -44
- package/ietf/cluster.js.map +1 -1
- package/ietf/connection.d.ts +6 -72
- package/ietf/connection.d.ts.map +1 -1
- package/ietf/connection.js +62 -56
- package/ietf/connection.js.map +1 -1
- package/ietf/error.d.ts +11 -0
- package/ietf/error.d.ts.map +1 -0
- package/ietf/error.js +193 -0
- package/ietf/error.js.map +1 -0
- package/ietf/fetch.d.ts +7 -20
- package/ietf/fetch.d.ts.map +1 -1
- package/ietf/fetch.js +52 -22
- package/ietf/fetch.js.map +1 -1
- package/ietf/filter.d.ts +2 -0
- package/ietf/filter.d.ts.map +1 -1
- package/ietf/filter.js +10 -1
- package/ietf/filter.js.map +1 -1
- package/ietf/goaway.d.ts.map +1 -1
- package/ietf/goaway.js +22 -5
- package/ietf/goaway.js.map +1 -1
- package/ietf/hidden.d.ts +2 -0
- package/ietf/hidden.d.ts.map +1 -0
- package/ietf/hidden.js +30 -0
- package/ietf/hidden.js.map +1 -0
- package/ietf/index.d.ts +2 -0
- package/ietf/index.d.ts.map +1 -1
- package/ietf/index.js +2 -0
- package/ietf/index.js.map +1 -1
- package/ietf/object.d.ts +15 -8
- package/ietf/object.d.ts.map +1 -1
- package/ietf/object.js +51 -36
- package/ietf/object.js.map +1 -1
- package/ietf/parameters.d.ts +14 -2
- package/ietf/parameters.d.ts.map +1 -1
- package/ietf/parameters.js +97 -29
- package/ietf/parameters.js.map +1 -1
- package/ietf/properties.d.ts +1 -0
- package/ietf/properties.d.ts.map +1 -1
- package/ietf/properties.js +14 -0
- package/ietf/properties.js.map +1 -1
- package/ietf/publish.d.ts +19 -2
- package/ietf/publish.d.ts.map +1 -1
- package/ietf/publish.js +40 -6
- package/ietf/publish.js.map +1 -1
- package/ietf/publish_namespace.d.ts +25 -0
- package/ietf/publish_namespace.d.ts.map +1 -1
- package/ietf/publish_namespace.js +63 -0
- package/ietf/publish_namespace.js.map +1 -1
- package/ietf/publisher.d.ts +1 -82
- package/ietf/publisher.d.ts.map +1 -1
- package/ietf/publisher.js +483 -235
- package/ietf/publisher.js.map +1 -1
- package/ietf/solicit.d.ts +1 -40
- package/ietf/solicit.d.ts.map +1 -1
- package/ietf/subscribe.d.ts +8 -6
- package/ietf/subscribe.d.ts.map +1 -1
- package/ietf/subscribe.js +33 -27
- package/ietf/subscribe.js.map +1 -1
- package/ietf/subscribe_namespace.d.ts +8 -2
- package/ietf/subscribe_namespace.d.ts.map +1 -1
- package/ietf/subscribe_namespace.js +18 -8
- package/ietf/subscribe_namespace.js.map +1 -1
- package/ietf/subscriber.d.ts +1 -65
- package/ietf/subscriber.d.ts.map +1 -1
- package/ietf/subscriber.js +337 -123
- package/ietf/subscriber.js.map +1 -1
- package/ietf/token.d.ts +2 -0
- package/ietf/token.d.ts.map +1 -0
- package/ietf/token.js +99 -0
- package/ietf/token.js.map +1 -0
- package/ietf/track.d.ts +4 -0
- package/ietf/track.d.ts.map +1 -1
- package/ietf/track.js +6 -20
- package/ietf/track.js.map +1 -1
- package/ietf/version.d.ts +12 -1
- package/ietf/version.d.ts.map +1 -1
- package/ietf/version.js +13 -0
- package/ietf/version.js.map +1 -1
- package/index.d.ts +12 -7
- package/index.d.ts.map +1 -1
- package/index.js +10 -5
- package/index.js.map +1 -1
- package/internal.d.ts +115 -1
- package/internal.d.ts.map +1 -1
- package/internal.js +108 -0
- package/internal.js.map +1 -1
- package/lite/announce.d.ts +60 -10
- package/lite/announce.d.ts.map +1 -1
- package/lite/announce.js +176 -31
- package/lite/announce.js.map +1 -1
- package/lite/connection.d.ts +9 -59
- package/lite/connection.d.ts.map +1 -1
- package/lite/connection.js +34 -35
- package/lite/connection.js.map +1 -1
- package/lite/datagram.d.ts +3 -2
- package/lite/datagram.d.ts.map +1 -1
- package/lite/datagram.js +7 -8
- package/lite/datagram.js.map +1 -1
- package/lite/fetch.d.ts +15 -1
- package/lite/fetch.d.ts.map +1 -1
- package/lite/fetch.js +39 -7
- package/lite/fetch.js.map +1 -1
- package/lite/goaway.d.ts.map +1 -1
- package/lite/goaway.js +7 -1
- package/lite/goaway.js.map +1 -1
- package/lite/group.d.ts +30 -12
- package/lite/group.d.ts.map +1 -1
- package/lite/group.js +68 -26
- package/lite/group.js.map +1 -1
- package/lite/message.d.ts +2 -2
- package/lite/message.d.ts.map +1 -1
- package/lite/message.js +14 -5
- package/lite/message.js.map +1 -1
- package/lite/priority.d.ts +1 -61
- package/lite/priority.d.ts.map +1 -1
- package/lite/priority.js +4 -5
- package/lite/priority.js.map +1 -1
- package/lite/publisher.d.ts +1 -69
- package/lite/publisher.d.ts.map +1 -1
- package/lite/publisher.js +630 -262
- package/lite/publisher.js.map +1 -1
- package/lite/setup.d.ts +8 -8
- package/lite/setup.d.ts.map +1 -1
- package/lite/setup.js +33 -30
- package/lite/setup.js.map +1 -1
- package/lite/subscribe.d.ts +71 -17
- package/lite/subscribe.d.ts.map +1 -1
- package/lite/subscribe.js +205 -53
- package/lite/subscribe.js.map +1 -1
- package/lite/subscriber.d.ts +15 -56
- package/lite/subscriber.d.ts.map +1 -1
- package/lite/subscriber.js +451 -247
- package/lite/subscriber.js.map +1 -1
- package/lite/track.d.ts +4 -10
- package/lite/track.d.ts.map +1 -1
- package/lite/track.js +34 -29
- package/lite/track.js.map +1 -1
- package/lite/version.d.ts +42 -6
- package/lite/version.d.ts.map +1 -1
- package/lite/version.js +126 -10
- package/lite/version.js.map +1 -1
- package/origin.d.ts +256 -29
- package/origin.d.ts.map +1 -1
- package/origin.js +1427 -37
- package/origin.js.map +1 -1
- package/package.json +8 -3
- package/path.d.ts +25 -7
- package/path.d.ts.map +1 -1
- package/path.js +5 -3
- package/path.js.map +1 -1
- package/stream.d.ts +73 -14
- package/stream.d.ts.map +1 -1
- package/stream.js +372 -141
- package/stream.js.map +1 -1
- package/tail.d.ts +18 -0
- package/tail.d.ts.map +1 -0
- package/tail.js +167 -0
- package/tail.js.map +1 -0
- package/time.d.ts +15 -2
- package/time.d.ts.map +1 -1
- package/time.js +28 -9
- package/time.js.map +1 -1
- package/track.d.ts +211 -83
- package/track.d.ts.map +1 -1
- package/track.js +816 -205
- package/track.js.map +1 -1
- package/util/abort.d.ts +2 -0
- package/util/abort.d.ts.map +1 -0
- package/util/abort.js +20 -0
- package/util/abort.js.map +1 -0
- package/util/log.d.ts +5 -0
- package/util/log.d.ts.map +1 -0
- package/util/log.js +17 -0
- package/util/log.js.map +1 -0
- package/util/u64.d.ts +39 -0
- package/util/u64.d.ts.map +1 -0
- package/util/u64.js +83 -0
- package/util/u64.js.map +1 -0
- package/util/varint.d.ts +29 -0
- package/util/varint.d.ts.map +1 -0
- package/util/varint.js +198 -0
- package/util/varint.js.map +1 -0
- package/varint.d.ts +10 -6
- package/varint.d.ts.map +1 -1
- package/varint.js +40 -237
- package/varint.js.map +1 -1
- package/wire.d.ts +80 -0
- package/wire.d.ts.map +1 -0
- package/wire.js +32 -0
- package/wire.js.map +1 -0
- package/zod.d.ts +1 -1
- package/zod.d.ts.map +1 -1
- package/zod.js.map +1 -1
- package/mock.d.ts +0 -66
- package/mock.d.ts.map +0 -1
- package/mock.js +0 -243
- package/mock.js.map +0 -1
package/util/u64.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"u64.js","sourceRoot":"","sources":["../../src/util/u64.ts"],"names":[],"mappings":"AAAA,2FAA2F;AAC3F,yEAAyE;AAEzE,0CAA0C;AAC1C,MAAM,CAAC,MAAM,KAAK,GAAG,aAAa,CAAC;AACnC,oEAAoE;AACpE,MAAM,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AAExB,+GAA+G;AAC/G,MAAM,UAAU,QAAQ,CAAC,EAAU,EAAE,EAAU;IAC9C,IAAI,EAAE,IAAI,OAAO;QAAE,MAAM,IAAI,UAAU,CAAC,8BAA8B,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1F,OAAO,EAAE,GAAG,KAAK,GAAG,EAAE,CAAC;AACxB,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,QAAQ,CAAC,EAAU,EAAE,EAAU;IAC9C,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,GAAG;IACf,mBAAmB;IACnB,MAAM,CAAU,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACrC,mCAAmC;IACnC,MAAM,CAAU,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAEpD,yBAAyB;IAChB,EAAE,CAAS;IACpB,yBAAyB;IAChB,EAAE,CAAS;IAEpB,yEAAyE;IACzE,YAAY,EAAU,EAAE,EAAU;QACjC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK;YAAE,MAAM,IAAI,UAAU,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;QACtG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK;YAAE,MAAM,IAAI,UAAU,CAAC,uBAAuB,EAAE,EAAE,CAAC,CAAC;QACtG,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACd,CAAC;IAED,sEAAsE;IACtE,MAAM,CAAC,UAAU,CAAC,CAAS;QAC1B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QACjF,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,4DAA4D;IAC5D,MAAM,CAAC,UAAU,CAAC,CAAS;QAC1B,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,GAAG;YAAE,MAAM,IAAI,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAClE,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,gFAAgF;IAChF,QAAQ;QACP,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,oCAAoC;IACpC,QAAQ;QACP,OAAO,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,4BAA4B;IAC5B,QAAQ;QACP,OAAO,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC;IAC3F,CAAC;IAED,iFAAiF;IACjF,OAAO,CAAC,KAAU;QACjB,OAAO,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,CAAC;IACjD,CAAC;IAED,mCAAmC;IACnC,MAAM,CAAC,KAAU;QAChB,OAAO,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,IAAI,IAAI,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAAC;IACrD,CAAC;IAED,+EAA+E;IAC/E,GAAG,CAAC,KAAa;QAChB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,kBAAkB,KAAK,EAAE,CAAC,CAAC;QAC/F,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACvE,IAAI,EAAE,IAAI,KAAK;YAAE,MAAM,IAAI,UAAU,CAAC,aAAa,IAAI,MAAM,KAAK,kBAAkB,CAAC,CAAC;QACtF,OAAO,IAAI,GAAG,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAC9B,CAAC;CACD","sourcesContent":["// An unsigned 64-bit integer as two u32 halves, so nothing on the hot path needs a BigInt.\n// Package-internal. Varints are only its wire encoding; see ./varint.ts.\n\n/** 2^32, the weight of the upper half. */\nexport const POW32 = 0x1_0000_0000;\n// An upper half at or above this is past `Number.MAX_SAFE_INTEGER`.\nconst SAFE_HI = 2 ** 21;\n\n/** Join two halves into a `number`, throwing if it is above `Number.MAX_SAFE_INTEGER` rather than rounding. */\nexport function toNumber(hi: number, lo: number): number {\n\tif (hi >= SAFE_HI) throw new RangeError(`value larger than 53-bits: ${toBigInt(hi, lo)}`);\n\treturn hi * POW32 + lo;\n}\n\n/** Join two halves into a bigint, exact up to 64 bits. */\nexport function toBigInt(hi: number, lo: number): bigint {\n\treturn hi === 0 ? BigInt(lo) : (BigInt(hi) << 32n) | BigInt(lo);\n}\n\n/**\n * An unsigned 64-bit integer, held as two 32-bit halves so it encodes and decodes without a BigInt.\n * Converting to a `number` throws past 2^53 rather than rounding.\n */\nexport class U64 {\n\t/** The value 0. */\n\tstatic readonly ZERO = new U64(0, 0);\n\t/** The largest value, 2^64 - 1. */\n\tstatic readonly MAX = new U64(POW32 - 1, POW32 - 1);\n\n\t/** The upper 32 bits. */\n\treadonly hi: number;\n\t/** The lower 32 bits. */\n\treadonly lo: number;\n\n\t/** Join the upper and lower 32 bits, throwing if either is not a u32. */\n\tconstructor(hi: number, lo: number) {\n\t\tif (!Number.isInteger(hi) || hi < 0 || hi >= POW32) throw new RangeError(`invalid upper half: ${hi}`);\n\t\tif (!Number.isInteger(lo) || lo < 0 || lo >= POW32) throw new RangeError(`invalid lower half: ${lo}`);\n\t\tthis.hi = hi;\n\t\tthis.lo = lo;\n\t}\n\n\t/** Convert a non-negative safe integer, throwing on anything else. */\n\tstatic fromNumber(v: number): U64 {\n\t\tif (!Number.isSafeInteger(v) || v < 0) throw new RangeError(`invalid u64: ${v}`);\n\t\treturn new U64(Math.floor(v / POW32), v >>> 0);\n\t}\n\n\t/** Convert a bigint, throwing unless it is in [0, 2^64). */\n\tstatic fromBigInt(v: bigint): U64 {\n\t\tif (v < 0n || v >> 64n) throw new RangeError(`invalid u64: ${v}`);\n\t\treturn new U64(Number(v >> 32n), Number(v & 0xffffffffn));\n\t}\n\n\t/** Convert to a `number`, throwing if it is above `Number.MAX_SAFE_INTEGER`. */\n\ttoNumber(): number {\n\t\treturn toNumber(this.hi, this.lo);\n\t}\n\n\t/** Convert to a bigint, exactly. */\n\ttoBigInt(): bigint {\n\t\treturn toBigInt(this.hi, this.lo);\n\t}\n\n\t/** The value in decimal. */\n\ttoString(): string {\n\t\treturn this.hi < SAFE_HI ? String(this.hi * POW32 + this.lo) : this.toBigInt().toString();\n\t}\n\n\t/** Negative if this is less than `other`, zero if equal, positive if greater. */\n\tcompare(other: U64): number {\n\t\treturn this.hi - other.hi || this.lo - other.lo;\n\t}\n\n\t/** Whether this equals `other`. */\n\tequals(other: U64): boolean {\n\t\treturn this.hi === other.hi && this.lo === other.lo;\n\t}\n\n\t/** This plus a non-negative safe integer, throwing if the sum reaches 2^64. */\n\tadd(delta: number): U64 {\n\t\tif (!Number.isSafeInteger(delta) || delta < 0) throw new RangeError(`invalid delta: ${delta}`);\n\t\tconst lo = this.lo + (delta >>> 0);\n\t\tconst hi = this.hi + Math.floor(delta / POW32) + (lo >= POW32 ? 1 : 0);\n\t\tif (hi >= POW32) throw new RangeError(`overflow, ${this} + ${delta} exceeds 64 bits`);\n\t\treturn new U64(hi, lo >>> 0);\n\t}\n}\n"]}
|
package/util/varint.d.ts
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The upper half of the last value decoded or split. Each returns its lower half and leaves the
|
|
3
|
+
* upper one here rather than allocating a pair; read it before the next call.
|
|
4
|
+
*/
|
|
5
|
+
export declare const parts: {
|
|
6
|
+
hi: number;
|
|
7
|
+
};
|
|
8
|
+
/** Split a non-negative integer of up to 64 bits, returning the lower half. The encoder bounds it. */
|
|
9
|
+
export declare function split(v: number | bigint): number;
|
|
10
|
+
/** The size of a QUIC varint, from its first byte. */
|
|
11
|
+
export declare function peekQuic(first: number): number;
|
|
12
|
+
/** Decode a QUIC varint of `size` bytes at `o`, returning the lower half and setting `parts.hi`. The bytes must be there. */
|
|
13
|
+
export declare function readQuic(buf: Uint8Array, o: number, size: number): number;
|
|
14
|
+
/** The size of `hi`/`lo` as a QUIC varint, throwing at 2^62 or above. */
|
|
15
|
+
export declare function lengthQuic(hi: number, lo: number): number;
|
|
16
|
+
/** Encode a QUIC varint of {@link lengthQuic} `size` at the start of `dst`. */
|
|
17
|
+
export declare function writeQuic(dst: Uint8Array, hi: number, lo: number, size: number): void;
|
|
18
|
+
/** The size of a leading-ones varint, from its first byte. */
|
|
19
|
+
export declare function peekLeadingOnes(first: number): number;
|
|
20
|
+
/** Decode a leading-ones varint of `size` bytes at `o`, returning the lower half and setting `parts.hi`. The bytes must be there. */
|
|
21
|
+
export declare function readLeadingOnes(buf: Uint8Array, o: number, size: number): number;
|
|
22
|
+
/**
|
|
23
|
+
* The size of `hi`/`lo` as a leading-ones varint, in its shortest form. The 7-byte form is skipped:
|
|
24
|
+
* draft-17 rejects it, and the 8-byte form is valid everywhere.
|
|
25
|
+
*/
|
|
26
|
+
export declare function lengthLeadingOnes(hi: number, lo: number): number;
|
|
27
|
+
/** Encode a leading-ones varint of {@link lengthLeadingOnes} `size` at the start of `dst`. */
|
|
28
|
+
export declare function writeLeadingOnes(dst: Uint8Array, hi: number, lo: number, size: number): void;
|
|
29
|
+
//# sourceMappingURL=varint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"varint.d.ts","sourceRoot":"","sources":["../../src/util/varint.ts"],"names":[],"mappings":"AAmBA;;;GAGG;AACH,eAAO,MAAM,KAAK;IAAK,EAAE;CAAK,CAAC;AAE/B,sGAAsG;AACtG,wBAAgB,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAYhD;AAaD,sDAAsD;AACtD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,6HAA6H;AAC7H,wBAAgB,QAAQ,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAUzE;AAED,yEAAyE;AACzE,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAQzD;AAED,+EAA+E;AAC/E,wBAAgB,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAY9E;AAED,8DAA8D;AAC9D,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,qIAAqI;AACrI,wBAAgB,eAAe,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CA+BhF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAWhE;AAED,8FAA8F;AAC9F,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAmCrF"}
|
package/util/varint.js
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/* @ts-self-types="./varint.d.ts" */
|
|
2
|
+
// The varint wire codec on 32-bit halves (see ./u64.ts), so neither format needs a BigInt.
|
|
3
|
+
// Package-internal: the public API in ../varint.ts and the stream Cursor and Writer are built on it.
|
|
4
|
+
//
|
|
5
|
+
// QUIC (RFC 9000 Section 16): the top two bits give the size.
|
|
6
|
+
// 00xxxxxx → 1 byte, 01 → 2, 10 → 4, 11 → 8 (62 bits)
|
|
7
|
+
//
|
|
8
|
+
// Leading-ones (moq-transport draft-17+ Section 1.4.1): the leading 1-bits give the size.
|
|
9
|
+
// 0xxxxxxx → 1 byte (7 bits)
|
|
10
|
+
// 10xxxxxx + 1B → 2 bytes (14 bits)
|
|
11
|
+
// 110xxxxx + 2B → 3 bytes (21 bits)
|
|
12
|
+
// 1110xxxx + 3B → 4 bytes (28 bits)
|
|
13
|
+
// 11110xxx + 4B → 5 bytes (35 bits)
|
|
14
|
+
// 111110xx + 5B → 6 bytes (42 bits)
|
|
15
|
+
// 1111110x + 6B → 7 bytes (49 bits), draft-18+ only (invalid in draft-17 per #1595)
|
|
16
|
+
// 11111110 + 7B → 8 bytes (56 bits)
|
|
17
|
+
// 11111111 + 8B → 9 bytes (64 bits)
|
|
18
|
+
import { POW32, toBigInt } from "./u64.js";
|
|
19
|
+
/**
|
|
20
|
+
* The upper half of the last value decoded or split. Each returns its lower half and leaves the
|
|
21
|
+
* upper one here rather than allocating a pair; read it before the next call.
|
|
22
|
+
*/
|
|
23
|
+
export const parts = { hi: 0 };
|
|
24
|
+
/** Split a non-negative integer of up to 64 bits, returning the lower half. The encoder bounds it. */
|
|
25
|
+
export function split(v) {
|
|
26
|
+
if (typeof v === "number") {
|
|
27
|
+
if (!Number.isInteger(v))
|
|
28
|
+
throw new RangeError(`not an integer: ${v}`);
|
|
29
|
+
if (v < 0)
|
|
30
|
+
throw new RangeError(`underflow, value is negative: ${v}`);
|
|
31
|
+
if (v >= POW32 * POW32)
|
|
32
|
+
throw new RangeError(`value exceeds 64 bits: ${v}`);
|
|
33
|
+
parts.hi = Math.floor(v / POW32);
|
|
34
|
+
return v >>> 0;
|
|
35
|
+
}
|
|
36
|
+
if (v < 0n)
|
|
37
|
+
throw new RangeError(`underflow, value is negative: ${v}`);
|
|
38
|
+
if (v >> 64n)
|
|
39
|
+
throw new RangeError(`value exceeds 64 bits: ${v}`);
|
|
40
|
+
parts.hi = Number(v >> 32n);
|
|
41
|
+
return Number(v & 0xffffffffn);
|
|
42
|
+
}
|
|
43
|
+
function u32(buf, o) {
|
|
44
|
+
return ((buf[o] << 24) | (buf[o + 1] << 16) | (buf[o + 2] << 8) | buf[o + 3]) >>> 0;
|
|
45
|
+
}
|
|
46
|
+
function setU32(buf, o, v) {
|
|
47
|
+
buf[o] = v >>> 24;
|
|
48
|
+
buf[o + 1] = v >>> 16;
|
|
49
|
+
buf[o + 2] = v >>> 8;
|
|
50
|
+
buf[o + 3] = v;
|
|
51
|
+
}
|
|
52
|
+
/** The size of a QUIC varint, from its first byte. */
|
|
53
|
+
export function peekQuic(first) {
|
|
54
|
+
return 1 << (first >> 6);
|
|
55
|
+
}
|
|
56
|
+
/** Decode a QUIC varint of `size` bytes at `o`, returning the lower half and setting `parts.hi`. The bytes must be there. */
|
|
57
|
+
export function readQuic(buf, o, size) {
|
|
58
|
+
const b = buf[o] & 0x3f;
|
|
59
|
+
if (size === 8) {
|
|
60
|
+
parts.hi = (b << 24) | (buf[o + 1] << 16) | (buf[o + 2] << 8) | buf[o + 3];
|
|
61
|
+
return u32(buf, o + 4);
|
|
62
|
+
}
|
|
63
|
+
parts.hi = 0;
|
|
64
|
+
if (size === 1)
|
|
65
|
+
return b;
|
|
66
|
+
if (size === 2)
|
|
67
|
+
return (b << 8) | buf[o + 1];
|
|
68
|
+
return (b << 24) | (buf[o + 1] << 16) | (buf[o + 2] << 8) | buf[o + 3];
|
|
69
|
+
}
|
|
70
|
+
/** The size of `hi`/`lo` as a QUIC varint, throwing at 2^62 or above. */
|
|
71
|
+
export function lengthQuic(hi, lo) {
|
|
72
|
+
if (hi === 0) {
|
|
73
|
+
if (lo < 0x40)
|
|
74
|
+
return 1;
|
|
75
|
+
if (lo < 0x4000)
|
|
76
|
+
return 2;
|
|
77
|
+
if (lo < 0x4000_0000)
|
|
78
|
+
return 4;
|
|
79
|
+
}
|
|
80
|
+
if (hi >= 0x4000_0000)
|
|
81
|
+
throw new RangeError(`overflow, value larger than 62-bits: ${toBigInt(hi, lo)}`);
|
|
82
|
+
return 8;
|
|
83
|
+
}
|
|
84
|
+
/** Encode a QUIC varint of {@link lengthQuic} `size` at the start of `dst`. */
|
|
85
|
+
export function writeQuic(dst, hi, lo, size) {
|
|
86
|
+
if (size === 1) {
|
|
87
|
+
dst[0] = lo;
|
|
88
|
+
}
|
|
89
|
+
else if (size === 2) {
|
|
90
|
+
dst[0] = 0x40 | (lo >>> 8);
|
|
91
|
+
dst[1] = lo;
|
|
92
|
+
}
|
|
93
|
+
else if (size === 4) {
|
|
94
|
+
setU32(dst, 0, 0x8000_0000 | lo);
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
setU32(dst, 0, 0xc000_0000 | hi);
|
|
98
|
+
setU32(dst, 4, lo);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** The size of a leading-ones varint, from its first byte. */
|
|
102
|
+
export function peekLeadingOnes(first) {
|
|
103
|
+
return Math.clz32(~(first << 24)) + 1;
|
|
104
|
+
}
|
|
105
|
+
/** Decode a leading-ones varint of `size` bytes at `o`, returning the lower half and setting `parts.hi`. The bytes must be there. */
|
|
106
|
+
export function readLeadingOnes(buf, o, size) {
|
|
107
|
+
const b = buf[o];
|
|
108
|
+
switch (size) {
|
|
109
|
+
case 1:
|
|
110
|
+
parts.hi = 0;
|
|
111
|
+
return b;
|
|
112
|
+
case 2:
|
|
113
|
+
parts.hi = 0;
|
|
114
|
+
return ((b & 0x3f) << 8) | buf[o + 1];
|
|
115
|
+
case 3:
|
|
116
|
+
parts.hi = 0;
|
|
117
|
+
return ((b & 0x1f) << 16) | (buf[o + 1] << 8) | buf[o + 2];
|
|
118
|
+
case 4:
|
|
119
|
+
parts.hi = 0;
|
|
120
|
+
return ((b & 0x0f) << 24) | (buf[o + 1] << 16) | (buf[o + 2] << 8) | buf[o + 3];
|
|
121
|
+
case 5:
|
|
122
|
+
parts.hi = b & 0x07;
|
|
123
|
+
return u32(buf, o + 1);
|
|
124
|
+
case 6:
|
|
125
|
+
parts.hi = ((b & 0x03) << 8) | buf[o + 1];
|
|
126
|
+
return u32(buf, o + 2);
|
|
127
|
+
case 7:
|
|
128
|
+
parts.hi = ((b & 0x01) << 16) | (buf[o + 1] << 8) | buf[o + 2];
|
|
129
|
+
return u32(buf, o + 3);
|
|
130
|
+
case 8:
|
|
131
|
+
parts.hi = (buf[o + 1] << 16) | (buf[o + 2] << 8) | buf[o + 3];
|
|
132
|
+
return u32(buf, o + 4);
|
|
133
|
+
default:
|
|
134
|
+
parts.hi = u32(buf, o + 1);
|
|
135
|
+
return u32(buf, o + 5);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* The size of `hi`/`lo` as a leading-ones varint, in its shortest form. The 7-byte form is skipped:
|
|
140
|
+
* draft-17 rejects it, and the 8-byte form is valid everywhere.
|
|
141
|
+
*/
|
|
142
|
+
export function lengthLeadingOnes(hi, lo) {
|
|
143
|
+
if (hi === 0) {
|
|
144
|
+
if (lo < 0x80)
|
|
145
|
+
return 1;
|
|
146
|
+
if (lo < 0x4000)
|
|
147
|
+
return 2;
|
|
148
|
+
if (lo < 0x20_0000)
|
|
149
|
+
return 3;
|
|
150
|
+
if (lo < 0x1000_0000)
|
|
151
|
+
return 4;
|
|
152
|
+
}
|
|
153
|
+
if (hi < 0x8)
|
|
154
|
+
return 5;
|
|
155
|
+
if (hi < 0x400)
|
|
156
|
+
return 6;
|
|
157
|
+
if (hi < 0x100_0000)
|
|
158
|
+
return 8;
|
|
159
|
+
return 9;
|
|
160
|
+
}
|
|
161
|
+
/** Encode a leading-ones varint of {@link lengthLeadingOnes} `size` at the start of `dst`. */
|
|
162
|
+
export function writeLeadingOnes(dst, hi, lo, size) {
|
|
163
|
+
switch (size) {
|
|
164
|
+
case 1:
|
|
165
|
+
dst[0] = lo;
|
|
166
|
+
return;
|
|
167
|
+
case 2:
|
|
168
|
+
dst[0] = 0x80 | (lo >>> 8);
|
|
169
|
+
dst[1] = lo;
|
|
170
|
+
return;
|
|
171
|
+
case 3:
|
|
172
|
+
dst[0] = 0xc0 | (lo >>> 16);
|
|
173
|
+
dst[1] = lo >>> 8;
|
|
174
|
+
dst[2] = lo;
|
|
175
|
+
return;
|
|
176
|
+
case 4:
|
|
177
|
+
setU32(dst, 0, 0xe000_0000 | lo);
|
|
178
|
+
return;
|
|
179
|
+
case 5:
|
|
180
|
+
dst[0] = 0xf0 | hi;
|
|
181
|
+
setU32(dst, 1, lo);
|
|
182
|
+
return;
|
|
183
|
+
case 6:
|
|
184
|
+
dst[0] = 0xf8 | (hi >>> 8);
|
|
185
|
+
dst[1] = hi;
|
|
186
|
+
setU32(dst, 2, lo);
|
|
187
|
+
return;
|
|
188
|
+
case 8:
|
|
189
|
+
setU32(dst, 0, 0xfe00_0000 | hi);
|
|
190
|
+
setU32(dst, 4, lo);
|
|
191
|
+
return;
|
|
192
|
+
default:
|
|
193
|
+
dst[0] = 0xff;
|
|
194
|
+
setU32(dst, 1, hi);
|
|
195
|
+
setU32(dst, 5, lo);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=varint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"varint.js","sourceRoot":"","sources":["../../src/util/varint.ts"],"names":[],"mappings":"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","sourcesContent":["// The varint wire codec on 32-bit halves (see ./u64.ts), so neither format needs a BigInt.\n// Package-internal: the public API in ../varint.ts and the stream Cursor and Writer are built on it.\n//\n// QUIC (RFC 9000 Section 16): the top two bits give the size.\n// 00xxxxxx → 1 byte, 01 → 2, 10 → 4, 11 → 8 (62 bits)\n//\n// Leading-ones (moq-transport draft-17+ Section 1.4.1): the leading 1-bits give the size.\n// 0xxxxxxx → 1 byte (7 bits)\n// 10xxxxxx + 1B → 2 bytes (14 bits)\n// 110xxxxx + 2B → 3 bytes (21 bits)\n// 1110xxxx + 3B → 4 bytes (28 bits)\n// 11110xxx + 4B → 5 bytes (35 bits)\n// 111110xx + 5B → 6 bytes (42 bits)\n// 1111110x + 6B → 7 bytes (49 bits), draft-18+ only (invalid in draft-17 per #1595)\n// 11111110 + 7B → 8 bytes (56 bits)\n// 11111111 + 8B → 9 bytes (64 bits)\n\nimport { POW32, toBigInt } from \"./u64.ts\";\n\n/**\n * The upper half of the last value decoded or split. Each returns its lower half and leaves the\n * upper one here rather than allocating a pair; read it before the next call.\n */\nexport const parts = { hi: 0 };\n\n/** Split a non-negative integer of up to 64 bits, returning the lower half. The encoder bounds it. */\nexport function split(v: number | bigint): number {\n\tif (typeof v === \"number\") {\n\t\tif (!Number.isInteger(v)) throw new RangeError(`not an integer: ${v}`);\n\t\tif (v < 0) throw new RangeError(`underflow, value is negative: ${v}`);\n\t\tif (v >= POW32 * POW32) throw new RangeError(`value exceeds 64 bits: ${v}`);\n\t\tparts.hi = Math.floor(v / POW32);\n\t\treturn v >>> 0;\n\t}\n\tif (v < 0n) throw new RangeError(`underflow, value is negative: ${v}`);\n\tif (v >> 64n) throw new RangeError(`value exceeds 64 bits: ${v}`);\n\tparts.hi = Number(v >> 32n);\n\treturn Number(v & 0xffffffffn);\n}\n\nfunction u32(buf: Uint8Array, o: number): number {\n\treturn ((buf[o] << 24) | (buf[o + 1] << 16) | (buf[o + 2] << 8) | buf[o + 3]) >>> 0;\n}\n\nfunction setU32(buf: Uint8Array, o: number, v: number) {\n\tbuf[o] = v >>> 24;\n\tbuf[o + 1] = v >>> 16;\n\tbuf[o + 2] = v >>> 8;\n\tbuf[o + 3] = v;\n}\n\n/** The size of a QUIC varint, from its first byte. */\nexport function peekQuic(first: number): number {\n\treturn 1 << (first >> 6);\n}\n\n/** Decode a QUIC varint of `size` bytes at `o`, returning the lower half and setting `parts.hi`. The bytes must be there. */\nexport function readQuic(buf: Uint8Array, o: number, size: number): number {\n\tconst b = buf[o] & 0x3f;\n\tif (size === 8) {\n\t\tparts.hi = (b << 24) | (buf[o + 1] << 16) | (buf[o + 2] << 8) | buf[o + 3];\n\t\treturn u32(buf, o + 4);\n\t}\n\tparts.hi = 0;\n\tif (size === 1) return b;\n\tif (size === 2) return (b << 8) | buf[o + 1];\n\treturn (b << 24) | (buf[o + 1] << 16) | (buf[o + 2] << 8) | buf[o + 3];\n}\n\n/** The size of `hi`/`lo` as a QUIC varint, throwing at 2^62 or above. */\nexport function lengthQuic(hi: number, lo: number): number {\n\tif (hi === 0) {\n\t\tif (lo < 0x40) return 1;\n\t\tif (lo < 0x4000) return 2;\n\t\tif (lo < 0x4000_0000) return 4;\n\t}\n\tif (hi >= 0x4000_0000) throw new RangeError(`overflow, value larger than 62-bits: ${toBigInt(hi, lo)}`);\n\treturn 8;\n}\n\n/** Encode a QUIC varint of {@link lengthQuic} `size` at the start of `dst`. */\nexport function writeQuic(dst: Uint8Array, hi: number, lo: number, size: number) {\n\tif (size === 1) {\n\t\tdst[0] = lo;\n\t} else if (size === 2) {\n\t\tdst[0] = 0x40 | (lo >>> 8);\n\t\tdst[1] = lo;\n\t} else if (size === 4) {\n\t\tsetU32(dst, 0, 0x8000_0000 | lo);\n\t} else {\n\t\tsetU32(dst, 0, 0xc000_0000 | hi);\n\t\tsetU32(dst, 4, lo);\n\t}\n}\n\n/** The size of a leading-ones varint, from its first byte. */\nexport function peekLeadingOnes(first: number): number {\n\treturn Math.clz32(~(first << 24)) + 1;\n}\n\n/** Decode a leading-ones varint of `size` bytes at `o`, returning the lower half and setting `parts.hi`. The bytes must be there. */\nexport function readLeadingOnes(buf: Uint8Array, o: number, size: number): number {\n\tconst b = buf[o];\n\tswitch (size) {\n\t\tcase 1:\n\t\t\tparts.hi = 0;\n\t\t\treturn b;\n\t\tcase 2:\n\t\t\tparts.hi = 0;\n\t\t\treturn ((b & 0x3f) << 8) | buf[o + 1];\n\t\tcase 3:\n\t\t\tparts.hi = 0;\n\t\t\treturn ((b & 0x1f) << 16) | (buf[o + 1] << 8) | buf[o + 2];\n\t\tcase 4:\n\t\t\tparts.hi = 0;\n\t\t\treturn ((b & 0x0f) << 24) | (buf[o + 1] << 16) | (buf[o + 2] << 8) | buf[o + 3];\n\t\tcase 5:\n\t\t\tparts.hi = b & 0x07;\n\t\t\treturn u32(buf, o + 1);\n\t\tcase 6:\n\t\t\tparts.hi = ((b & 0x03) << 8) | buf[o + 1];\n\t\t\treturn u32(buf, o + 2);\n\t\tcase 7:\n\t\t\tparts.hi = ((b & 0x01) << 16) | (buf[o + 1] << 8) | buf[o + 2];\n\t\t\treturn u32(buf, o + 3);\n\t\tcase 8:\n\t\t\tparts.hi = (buf[o + 1] << 16) | (buf[o + 2] << 8) | buf[o + 3];\n\t\t\treturn u32(buf, o + 4);\n\t\tdefault:\n\t\t\tparts.hi = u32(buf, o + 1);\n\t\t\treturn u32(buf, o + 5);\n\t}\n}\n\n/**\n * The size of `hi`/`lo` as a leading-ones varint, in its shortest form. The 7-byte form is skipped:\n * draft-17 rejects it, and the 8-byte form is valid everywhere.\n */\nexport function lengthLeadingOnes(hi: number, lo: number): number {\n\tif (hi === 0) {\n\t\tif (lo < 0x80) return 1;\n\t\tif (lo < 0x4000) return 2;\n\t\tif (lo < 0x20_0000) return 3;\n\t\tif (lo < 0x1000_0000) return 4;\n\t}\n\tif (hi < 0x8) return 5;\n\tif (hi < 0x400) return 6;\n\tif (hi < 0x100_0000) return 8;\n\treturn 9;\n}\n\n/** Encode a leading-ones varint of {@link lengthLeadingOnes} `size` at the start of `dst`. */\nexport function writeLeadingOnes(dst: Uint8Array, hi: number, lo: number, size: number) {\n\tswitch (size) {\n\t\tcase 1:\n\t\t\tdst[0] = lo;\n\t\t\treturn;\n\t\tcase 2:\n\t\t\tdst[0] = 0x80 | (lo >>> 8);\n\t\t\tdst[1] = lo;\n\t\t\treturn;\n\t\tcase 3:\n\t\t\tdst[0] = 0xc0 | (lo >>> 16);\n\t\t\tdst[1] = lo >>> 8;\n\t\t\tdst[2] = lo;\n\t\t\treturn;\n\t\tcase 4:\n\t\t\tsetU32(dst, 0, 0xe000_0000 | lo);\n\t\t\treturn;\n\t\tcase 5:\n\t\t\tdst[0] = 0xf0 | hi;\n\t\t\tsetU32(dst, 1, lo);\n\t\t\treturn;\n\t\tcase 6:\n\t\t\tdst[0] = 0xf8 | (hi >>> 8);\n\t\t\tdst[1] = hi;\n\t\t\tsetU32(dst, 2, lo);\n\t\t\treturn;\n\t\tcase 8:\n\t\t\tsetU32(dst, 0, 0xfe00_0000 | hi);\n\t\t\tsetU32(dst, 4, lo);\n\t\t\treturn;\n\t\tdefault:\n\t\t\tdst[0] = 0xff;\n\t\t\tsetU32(dst, 1, hi);\n\t\t\tsetU32(dst, 5, lo);\n\t}\n}\n"]}
|
package/varint.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Variable-length integers: QUIC's (RFC 9000 Section 16) and moq-transport's leading-ones form.
|
|
3
3
|
* https://www.rfc-editor.org/rfc/rfc9000#section-16
|
|
4
4
|
*
|
|
5
5
|
* @module
|
|
@@ -18,19 +18,23 @@ export declare function sizeLeadingOnes(v: number | bigint): number;
|
|
|
18
18
|
export declare function encodeLeadingOnesTo(dst: ArrayBuffer, v: number | bigint): Uint8Array;
|
|
19
19
|
/** Encode a value in leading-ones varint format into a freshly allocated buffer. */
|
|
20
20
|
export declare function encodeLeadingOnes(v: number | bigint): Uint8Array;
|
|
21
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* Decode a leading-ones varint, returning the value and the remaining buffer.
|
|
23
|
+
*
|
|
24
|
+
* Accepts the 7-byte form, which only draft-18+ allows, since there is no version here to check.
|
|
25
|
+
*/
|
|
22
26
|
export declare function decodeLeadingOnes(buf: Uint8Array): [bigint, Uint8Array];
|
|
23
27
|
/**
|
|
24
28
|
* Returns the number of bytes needed to encode a value as a varint.
|
|
25
29
|
*/
|
|
26
30
|
export declare function size(v: number): number;
|
|
27
31
|
/**
|
|
28
|
-
* Encodes a
|
|
29
|
-
*
|
|
32
|
+
* Encodes a value as a QUIC variable-length integer into the provided buffer,
|
|
33
|
+
* returning the written subarray.
|
|
30
34
|
*/
|
|
31
35
|
export declare function encodeTo(dst: ArrayBuffer, v: number | bigint): Uint8Array;
|
|
32
36
|
/**
|
|
33
|
-
* Encodes a
|
|
37
|
+
* Encodes a value as a QUIC variable-length integer.
|
|
34
38
|
* Returns a new Uint8Array containing the encoded bytes.
|
|
35
39
|
*/
|
|
36
40
|
export declare function encode(v: number | bigint): Uint8Array;
|
|
@@ -41,7 +45,7 @@ export declare function encode(v: number | bigint): Uint8Array;
|
|
|
41
45
|
export declare function decodeBigInt(buf: Uint8Array): [bigint, Uint8Array];
|
|
42
46
|
/**
|
|
43
47
|
* Decodes a QUIC variable-length integer from a buffer.
|
|
44
|
-
*
|
|
48
|
+
* Throws above `Number.MAX_SAFE_INTEGER` rather than rounding; use {@link decodeBigInt} for those.
|
|
45
49
|
*/
|
|
46
50
|
export declare function decode(buf: Uint8Array): [number, Uint8Array];
|
|
47
51
|
//# sourceMappingURL=varint.d.ts.map
|
package/varint.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"varint.d.ts","sourceRoot":"","sources":["../src/varint.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;
|
|
1
|
+
{"version":3,"file":"varint.d.ts","sourceRoot":"","sources":["../src/varint.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH,2DAA2D;AAC3D,eAAO,MAAM,MAAM,QAAa,CAAC;AACjC,4DAA4D;AAC5D,eAAO,MAAM,OAAO,QAAc,CAAC;AACnC,4DAA4D;AAC5D,eAAO,MAAM,OAAO,QAAc,CAAC;AACnC,+FAA+F;AAC/F,eAAO,MAAM,OAAO,QAA0B,CAAC;AAU/C,kFAAkF;AAClF,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAG1D;AAED,6GAA6G;AAC7G,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAKpF;AAED,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAEhE;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAIvE;AAED;;GAEG;AACH,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAMtC;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAKzE;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAErD;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAIlE;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,GAAG,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAI5D"}
|
package/varint.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
/* @ts-self-types="./varint.d.ts" */
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Variable-length integers: QUIC's (RFC 9000 Section 16) and moq-transport's leading-ones form.
|
|
4
4
|
* https://www.rfc-editor.org/rfc/rfc9000#section-16
|
|
5
5
|
*
|
|
6
6
|
* @module
|
|
7
7
|
*/
|
|
8
|
+
import { toBigInt, toNumber } from "./util/u64.js";
|
|
9
|
+
import { lengthLeadingOnes, lengthQuic, parts, peekLeadingOnes, peekQuic, readLeadingOnes, readQuic, split, writeLeadingOnes, writeQuic, } from "./util/varint.js";
|
|
8
10
|
/** Largest value that fits in a 1-byte varint (6 bits). */
|
|
9
11
|
export const MAX_U6 = 2 ** 6 - 1;
|
|
10
12
|
/** Largest value that fits in a 2-byte varint (14 bits). */
|
|
@@ -13,181 +15,40 @@ export const MAX_U14 = 2 ** 14 - 1;
|
|
|
13
15
|
export const MAX_U30 = 2 ** 30 - 1;
|
|
14
16
|
/** Largest value representable without precision loss (`Number.MAX_SAFE_INTEGER`, 53 bits). */
|
|
15
17
|
export const MAX_U53 = Number.MAX_SAFE_INTEGER;
|
|
16
|
-
//
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
// 11111110 + 7B → 8 bytes (56 bits)
|
|
26
|
-
// 11111111 + 8B → 9 bytes (64 bits)
|
|
27
|
-
const MAX_U64 = (1n << 64n) - 1n;
|
|
18
|
+
// The size of the varint at the start of `buf`, throwing unless all of it is there.
|
|
19
|
+
function sizeOf(buf, size) {
|
|
20
|
+
if (buf.length === 0)
|
|
21
|
+
throw new Error("buffer is empty");
|
|
22
|
+
const n = size(buf[0]);
|
|
23
|
+
if (buf.length < n)
|
|
24
|
+
throw new Error(`buffer too short: need ${n} bytes, have ${buf.length}`);
|
|
25
|
+
return n;
|
|
26
|
+
}
|
|
28
27
|
/** Number of bytes needed to encode a value in the leading-ones varint format. */
|
|
29
28
|
export function sizeLeadingOnes(v) {
|
|
30
|
-
const
|
|
31
|
-
|
|
32
|
-
throw new RangeError(`value is negative: ${v}`);
|
|
33
|
-
if (b > MAX_U64)
|
|
34
|
-
throw new RangeError(`value exceeds 64 bits: ${v}`);
|
|
35
|
-
if (b < 1n << 7n)
|
|
36
|
-
return 1;
|
|
37
|
-
if (b < 1n << 14n)
|
|
38
|
-
return 2;
|
|
39
|
-
if (b < 1n << 21n)
|
|
40
|
-
return 3;
|
|
41
|
-
if (b < 1n << 28n)
|
|
42
|
-
return 4;
|
|
43
|
-
if (b < 1n << 35n)
|
|
44
|
-
return 5;
|
|
45
|
-
if (b < 1n << 42n)
|
|
46
|
-
return 6;
|
|
47
|
-
if (b < 1n << 56n)
|
|
48
|
-
return 8;
|
|
49
|
-
return 9;
|
|
29
|
+
const lo = split(v);
|
|
30
|
+
return lengthLeadingOnes(parts.hi, lo);
|
|
50
31
|
}
|
|
51
32
|
/** Encode a value in leading-ones varint format into the provided buffer, returning the written subarray. */
|
|
52
33
|
export function encodeLeadingOnesTo(dst, v) {
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
throw new RangeError(`value exceeds 64 bits: ${v}`);
|
|
58
|
-
const view = new DataView(dst);
|
|
59
|
-
if (x < 1n << 7n) {
|
|
60
|
-
view.setUint8(0, Number(x));
|
|
61
|
-
return new Uint8Array(dst, 0, 1);
|
|
62
|
-
}
|
|
63
|
-
if (x < 1n << 14n) {
|
|
64
|
-
view.setUint8(0, 0x80 | Number(x >> 8n));
|
|
65
|
-
view.setUint8(1, Number(x & 0xffn));
|
|
66
|
-
return new Uint8Array(dst, 0, 2);
|
|
67
|
-
}
|
|
68
|
-
if (x < 1n << 21n) {
|
|
69
|
-
view.setUint8(0, 0xc0 | Number(x >> 16n));
|
|
70
|
-
view.setUint16(1, Number(x & 0xffffn));
|
|
71
|
-
return new Uint8Array(dst, 0, 3);
|
|
72
|
-
}
|
|
73
|
-
if (x < 1n << 28n) {
|
|
74
|
-
view.setUint8(0, 0xe0 | Number(x >> 24n));
|
|
75
|
-
view.setUint8(1, Number((x >> 16n) & 0xffn));
|
|
76
|
-
view.setUint16(2, Number(x & 0xffffn));
|
|
77
|
-
return new Uint8Array(dst, 0, 4);
|
|
78
|
-
}
|
|
79
|
-
if (x < 1n << 35n) {
|
|
80
|
-
view.setUint8(0, 0xf0 | Number(x >> 32n));
|
|
81
|
-
view.setUint32(1, Number(x & 0xffffffffn));
|
|
82
|
-
return new Uint8Array(dst, 0, 5);
|
|
83
|
-
}
|
|
84
|
-
if (x < 1n << 42n) {
|
|
85
|
-
view.setUint8(0, 0xf8 | Number(x >> 40n));
|
|
86
|
-
view.setUint8(1, Number((x >> 32n) & 0xffn));
|
|
87
|
-
view.setUint32(2, Number(x & 0xffffffffn));
|
|
88
|
-
return new Uint8Array(dst, 0, 6);
|
|
89
|
-
}
|
|
90
|
-
if (x < 1n << 56n) {
|
|
91
|
-
// 11111110 + 7 bytes
|
|
92
|
-
view.setUint8(0, 0xfe);
|
|
93
|
-
view.setUint8(1, Number((x >> 48n) & 0xffn));
|
|
94
|
-
view.setUint16(2, Number((x >> 32n) & 0xffffn));
|
|
95
|
-
view.setUint32(4, Number(x & 0xffffffffn));
|
|
96
|
-
return new Uint8Array(dst, 0, 8);
|
|
97
|
-
}
|
|
98
|
-
// 11111111 + 8 bytes
|
|
99
|
-
view.setUint8(0, 0xff);
|
|
100
|
-
view.setBigUint64(1, x);
|
|
101
|
-
return new Uint8Array(dst, 0, 9);
|
|
34
|
+
const lo = split(v);
|
|
35
|
+
const buf = new Uint8Array(dst, 0, lengthLeadingOnes(parts.hi, lo));
|
|
36
|
+
writeLeadingOnes(buf, parts.hi, lo, buf.length);
|
|
37
|
+
return buf;
|
|
102
38
|
}
|
|
103
39
|
/** Encode a value in leading-ones varint format into a freshly allocated buffer. */
|
|
104
40
|
export function encodeLeadingOnes(v) {
|
|
105
41
|
return encodeLeadingOnesTo(new ArrayBuffer(9), v);
|
|
106
42
|
}
|
|
107
|
-
/**
|
|
43
|
+
/**
|
|
44
|
+
* Decode a leading-ones varint, returning the value and the remaining buffer.
|
|
45
|
+
*
|
|
46
|
+
* Accepts the 7-byte form, which only draft-18+ allows, since there is no version here to check.
|
|
47
|
+
*/
|
|
108
48
|
export function decodeLeadingOnes(buf) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
// Count leading 1-bits
|
|
113
|
-
let ones = 0;
|
|
114
|
-
for (let bit = 7; bit >= 0; bit--) {
|
|
115
|
-
if (b & (1 << bit))
|
|
116
|
-
ones++;
|
|
117
|
-
else
|
|
118
|
-
break;
|
|
119
|
-
}
|
|
120
|
-
// 1111110x is a 7-byte form: invalid on draft-17, allowed on draft-18+ per #1595.
|
|
121
|
-
// This standalone decoder is permissive (Postel-style) since we lack version context here.
|
|
122
|
-
let totalSize;
|
|
123
|
-
if (ones <= 5)
|
|
124
|
-
totalSize = ones + 1;
|
|
125
|
-
else if (ones === 6)
|
|
126
|
-
totalSize = 7;
|
|
127
|
-
else if (ones === 7)
|
|
128
|
-
totalSize = 8;
|
|
129
|
-
else
|
|
130
|
-
totalSize = 9; // ones === 8
|
|
131
|
-
if (buf.length < totalSize) {
|
|
132
|
-
throw new Error(`buffer too short: need ${totalSize} bytes, have ${buf.length}`);
|
|
133
|
-
}
|
|
134
|
-
const view = new DataView(buf.buffer, buf.byteOffset, totalSize);
|
|
135
|
-
const remain = buf.subarray(totalSize);
|
|
136
|
-
let value;
|
|
137
|
-
switch (ones) {
|
|
138
|
-
case 0:
|
|
139
|
-
value = BigInt(b);
|
|
140
|
-
break;
|
|
141
|
-
case 1:
|
|
142
|
-
value = (BigInt(b & 0x3f) << 8n) | BigInt(buf[1]);
|
|
143
|
-
break;
|
|
144
|
-
case 2:
|
|
145
|
-
value = (BigInt(b & 0x1f) << 16n) | BigInt(view.getUint16(1));
|
|
146
|
-
break;
|
|
147
|
-
case 3:
|
|
148
|
-
value = (BigInt(b & 0x0f) << 24n) | (BigInt(buf[1]) << 16n) | (BigInt(buf[2]) << 8n) | BigInt(buf[3]);
|
|
149
|
-
break;
|
|
150
|
-
case 4:
|
|
151
|
-
value = (BigInt(b & 0x07) << 32n) | BigInt(view.getUint32(1));
|
|
152
|
-
break;
|
|
153
|
-
case 5:
|
|
154
|
-
value =
|
|
155
|
-
(BigInt(b & 0x03) << 40n) |
|
|
156
|
-
(BigInt(buf[1]) << 32n) |
|
|
157
|
-
(BigInt(buf[2]) << 24n) |
|
|
158
|
-
(BigInt(buf[3]) << 16n) |
|
|
159
|
-
(BigInt(buf[4]) << 8n) |
|
|
160
|
-
BigInt(buf[5]);
|
|
161
|
-
break;
|
|
162
|
-
case 6: {
|
|
163
|
-
// 1111110x + 6 bytes = 49 bits (draft-18+)
|
|
164
|
-
value =
|
|
165
|
-
(BigInt(b & 0x01) << 48n) |
|
|
166
|
-
(BigInt(buf[1]) << 40n) |
|
|
167
|
-
(BigInt(buf[2]) << 32n) |
|
|
168
|
-
(BigInt(buf[3]) << 24n) |
|
|
169
|
-
(BigInt(buf[4]) << 16n) |
|
|
170
|
-
(BigInt(buf[5]) << 8n) |
|
|
171
|
-
BigInt(buf[6]);
|
|
172
|
-
break;
|
|
173
|
-
}
|
|
174
|
-
case 7: {
|
|
175
|
-
// 11111110 + 7 bytes = 56 usable bits
|
|
176
|
-
const hi = new Uint8Array(8);
|
|
177
|
-
hi[0] = 0;
|
|
178
|
-
hi.set(buf.subarray(1, 8), 1);
|
|
179
|
-
value = new DataView(hi.buffer).getBigUint64(0);
|
|
180
|
-
break;
|
|
181
|
-
}
|
|
182
|
-
case 8: {
|
|
183
|
-
// 11111111 + 8 bytes = 64 bits
|
|
184
|
-
value = new DataView(buf.buffer, buf.byteOffset + 1, 8).getBigUint64(0);
|
|
185
|
-
break;
|
|
186
|
-
}
|
|
187
|
-
default:
|
|
188
|
-
throw new Error("impossible");
|
|
189
|
-
}
|
|
190
|
-
return [value, remain];
|
|
49
|
+
const size = sizeOf(buf, peekLeadingOnes);
|
|
50
|
+
const lo = readLeadingOnes(buf, 0, size);
|
|
51
|
+
return [toBigInt(parts.hi, lo), buf.subarray(size)];
|
|
191
52
|
}
|
|
192
53
|
/**
|
|
193
54
|
* Returns the number of bytes needed to encode a value as a varint.
|
|
@@ -203,54 +64,18 @@ export function size(v) {
|
|
|
203
64
|
return 8;
|
|
204
65
|
throw new Error(`overflow, value larger than 53-bits: ${v}`);
|
|
205
66
|
}
|
|
206
|
-
// Helper functions for writing to an ArrayBuffer
|
|
207
|
-
function setUint8(dst, v) {
|
|
208
|
-
const buffer = new Uint8Array(dst, 0, 1);
|
|
209
|
-
buffer[0] = v;
|
|
210
|
-
return buffer;
|
|
211
|
-
}
|
|
212
|
-
function setUint16(dst, v) {
|
|
213
|
-
const view = new DataView(dst, 0, 2);
|
|
214
|
-
view.setUint16(0, v);
|
|
215
|
-
return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
|
|
216
|
-
}
|
|
217
|
-
function setUint32(dst, v) {
|
|
218
|
-
const view = new DataView(dst, 0, 4);
|
|
219
|
-
view.setUint32(0, v);
|
|
220
|
-
return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
|
|
221
|
-
}
|
|
222
|
-
function setUint64(dst, v) {
|
|
223
|
-
const view = new DataView(dst, 0, 8);
|
|
224
|
-
view.setBigUint64(0, v);
|
|
225
|
-
return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);
|
|
226
|
-
}
|
|
227
|
-
const MAX_U62 = 2n ** 62n - 1n;
|
|
228
67
|
/**
|
|
229
|
-
* Encodes a
|
|
230
|
-
*
|
|
68
|
+
* Encodes a value as a QUIC variable-length integer into the provided buffer,
|
|
69
|
+
* returning the written subarray.
|
|
231
70
|
*/
|
|
232
71
|
export function encodeTo(dst, v) {
|
|
233
|
-
const
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
if (b > MAX_U62) {
|
|
238
|
-
throw new Error(`overflow, value larger than 62-bits: ${v}`);
|
|
239
|
-
}
|
|
240
|
-
const n = Number(b);
|
|
241
|
-
if (n <= MAX_U6) {
|
|
242
|
-
return setUint8(dst, n);
|
|
243
|
-
}
|
|
244
|
-
if (n <= MAX_U14) {
|
|
245
|
-
return setUint16(dst, n | 0x4000);
|
|
246
|
-
}
|
|
247
|
-
if (n <= MAX_U30) {
|
|
248
|
-
return setUint32(dst, n | 0x80000000);
|
|
249
|
-
}
|
|
250
|
-
return setUint64(dst, b | 0xc000000000000000n);
|
|
72
|
+
const lo = split(v);
|
|
73
|
+
const buf = new Uint8Array(dst, 0, lengthQuic(parts.hi, lo));
|
|
74
|
+
writeQuic(buf, parts.hi, lo, buf.length);
|
|
75
|
+
return buf;
|
|
251
76
|
}
|
|
252
77
|
/**
|
|
253
|
-
* Encodes a
|
|
78
|
+
* Encodes a value as a QUIC variable-length integer.
|
|
254
79
|
* Returns a new Uint8Array containing the encoded bytes.
|
|
255
80
|
*/
|
|
256
81
|
export function encode(v) {
|
|
@@ -261,39 +86,17 @@ export function encode(v) {
|
|
|
261
86
|
* Returns a tuple of [value, remaining buffer].
|
|
262
87
|
*/
|
|
263
88
|
export function decodeBigInt(buf) {
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
const size = 1 << ((buf[0] & 0xc0) >> 6);
|
|
268
|
-
if (buf.length < size) {
|
|
269
|
-
throw new Error(`buffer too short: need ${size} bytes, have ${buf.length}`);
|
|
270
|
-
}
|
|
271
|
-
const view = new DataView(buf.buffer, buf.byteOffset, size);
|
|
272
|
-
const remain = buf.subarray(size);
|
|
273
|
-
let value;
|
|
274
|
-
if (size === 1) {
|
|
275
|
-
value = BigInt(buf[0] & 0x3f);
|
|
276
|
-
}
|
|
277
|
-
else if (size === 2) {
|
|
278
|
-
value = BigInt(view.getUint16(0) & 0x3fff);
|
|
279
|
-
}
|
|
280
|
-
else if (size === 4) {
|
|
281
|
-
value = BigInt(view.getUint32(0) & 0x3fffffff);
|
|
282
|
-
}
|
|
283
|
-
else if (size === 8) {
|
|
284
|
-
value = view.getBigUint64(0) & 0x3fffffffffffffffn;
|
|
285
|
-
}
|
|
286
|
-
else {
|
|
287
|
-
throw new Error("impossible");
|
|
288
|
-
}
|
|
289
|
-
return [value, remain];
|
|
89
|
+
const size = sizeOf(buf, peekQuic);
|
|
90
|
+
const lo = readQuic(buf, 0, size);
|
|
91
|
+
return [toBigInt(parts.hi, lo), buf.subarray(size)];
|
|
290
92
|
}
|
|
291
93
|
/**
|
|
292
94
|
* Decodes a QUIC variable-length integer from a buffer.
|
|
293
|
-
*
|
|
95
|
+
* Throws above `Number.MAX_SAFE_INTEGER` rather than rounding; use {@link decodeBigInt} for those.
|
|
294
96
|
*/
|
|
295
97
|
export function decode(buf) {
|
|
296
|
-
const
|
|
297
|
-
|
|
98
|
+
const size = sizeOf(buf, peekQuic);
|
|
99
|
+
const lo = readQuic(buf, 0, size);
|
|
100
|
+
return [toNumber(parts.hi, lo), buf.subarray(size)];
|
|
298
101
|
}
|
|
299
102
|
//# sourceMappingURL=varint.js.map
|