zstdify 1.1.1 → 1.2.0

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 CHANGED
@@ -5,7 +5,7 @@
5
5
  [![Tests][tests-badge]][tests-url]
6
6
  [![Coverage][coverage-badge]][coverage-url]
7
7
 
8
- ![Zstdify Logo](/logo.webp)
8
+ ![Zstdify Logo](https://raw.githubusercontent.com/bhouston/zstdify/main/logo.webp)
9
9
 
10
10
  Pure JavaScript/TypeScript zstd compression/decompression library. No native dependencies, works in Node.js and browsers.
11
11
 
@@ -25,7 +25,10 @@ Pure JavaScript/TypeScript zstd compression/decompression library. No native dep
25
25
  - **Dictionary generation**:
26
26
  - Pure TypeScript dictionary training from sample payloads.
27
27
  - Zstd-inspired training options (`fastcover`/`cover`/`legacy` style knobs).
28
- - **Interop-focused**: `zstdify` output is decoded by the official `zstd` CLI, and `zstd` CLI output is decoded by `zstdify`.
28
+ - **Tree-shaken bundle size (Rollup + Terser, compressed)**:
29
+ - `zstdify/compress`: ~4.91 KiB gzip / ~4.43 KiB brotli.
30
+ - `zstdify/decompress`: ~7.46 KiB gzip / ~6.62 KiB brotli.
31
+ - **Interop-focused**: `zstdify` output is decoded by the official `zstd` CLI and by the [zstddec](https://www.npmjs.com/package/zstddec) npm package; `zstd` CLI output is decoded by `zstdify`.
29
32
  - **Extensively tested**:
30
33
  - Round-trip and property-based tests.
31
34
  - Conformance fixtures from known-good archives generated by the official `zstd` tool.
@@ -43,10 +46,26 @@ const restored = decompress(compressed);
43
46
  // restored equals data
44
47
  ```
45
48
 
49
+ ### Tree-shaking friendly imports
50
+
51
+ The default import path remains unchanged:
52
+
53
+ ```ts
54
+ import { compress, decompress, generateDictionary } from 'zstdify';
55
+ ```
56
+
57
+ For stricter bundling control, you can import feature-specific subpaths:
58
+
59
+ ```ts
60
+ import { compress } from 'zstdify/compress';
61
+ import { decompress } from 'zstdify/decompress';
62
+ import { generateDictionary } from 'zstdify/dictionary';
63
+ ```
64
+
46
65
  ## API
47
66
 
48
67
  - `compress(input: Uint8Array, options?: { level?: number; checksum?: boolean; dictionary?: Uint8Array | { bytes: Uint8Array; id?: number }; noDictId?: boolean }): Uint8Array`
49
- - `decompress(input: Uint8Array, options?: { maxSize?: number; dictionary?: Uint8Array | { bytes: Uint8Array; id?: number } }): Uint8Array`
68
+ - `decompress(input: Uint8Array, options?: { maxSize?: number; dictionary?: Uint8Array | { bytes: Uint8Array; id?: number }; validateChecksum?: boolean }): Uint8Array`
50
69
  - `generateDictionary(samples: Uint8Array[], options?: { maxDictSize?: number; dictId?: number; algorithm?: "fastcover" | "cover" | "legacy"; k?: number; d?: number; steps?: number; split?: number; f?: number; accel?: number; selectivity?: number; shrink?: boolean | number }): Uint8Array`
51
70
 
52
71
  Dictionary generation outputs a raw-content dictionary. If you want a specific `dictID` written into compressed frames, pass it to `compress()` via `dictionary: { bytes, id }`.
@@ -100,10 +119,38 @@ All of the following run as part of the test suite (`pnpm test` / `pnpm vitest`)
100
119
  - **Round-trip**: `decompress(compress(x)) === x` for a variety of payloads and levels, plus property-based tests with [fast-check](https://fast-check.dev/).
101
120
  - **Conformance fixtures**: Pre-generated `.zst` files from the official zstd CLI (legacy fixtures and a committed decodecorpus-style **corpus** with manifest); we decompress and compare. See [packages/zstdify-tests/fixtures/README.md](packages/zstdify-tests/fixtures/README.md).
102
121
  - **Differential (zstd ↔ zstdify)**: We test zstd compress → zstdify decompress and zstdify compress → zstd decompress across payloads and levels.
122
+ - **zstddec**: zstdify compress → [zstddec](https://www.npmjs.com/package/zstddec) decode at all compression levels (0–9) and with content checksum.
123
+ - **Node zstd ratio**: Compare compression ratio of Node's built-in zstd vs zstdify on representative payloads and levels; assert zstdify is within ~10% of Node's compressed size.
103
124
  - **Corruption**: Truncation, checksum mismatch, invalid header bits, and related error paths.
104
125
  - **Compression regression**: Compressed sizes for fixed payloads are checked against golden values (ratio stability).
105
126
  - **Decompress robustness**: Each corpus fixture is decompressed in its own test (one test per file), so the suite tracks decompress behavior per input. See [upstream zstd TESTING.md](https://github.com/facebook/zstd/blob/dev/TESTING.md) for comparison.
106
127
 
128
+ ## Benchmark: zstdify vs Node built-in zstd
129
+
130
+ Throughput and compression ratio are compared against Node’s built-in `node:zlib` zstd on synthetic payloads (text, binary, repetitive) at levels 3, 5, and 9.
131
+
132
+ ![Benchmark: compression and decompression throughput](packages/zstdify-tests/benchmarks/latest.svg)
133
+
134
+ To regenerate the chart and tables (run benchmarks and render SVG):
135
+
136
+ ```bash
137
+ pnpm --filter zstdify-tests run bench:update
138
+ ```
139
+
140
+ ### Bundle size benchmark (Rollup)
141
+
142
+ | Target | Raw | Gzip | Brotli |
143
+ |---|---:|---:|---:|
144
+ | zstdify/compress | 13.90 KiB | 5.27 KiB | 4.75 KiB |
145
+ | zstdify/decompress | 27.70 KiB | 8.63 KiB | 7.67 KiB |
146
+ | zstddec decoder + wasm | 127.37 KiB | 49.69 KiB | 40.66 KiB |
147
+
148
+ To regenerate this snapshot:
149
+
150
+ ```bash
151
+ pnpm --filter zstdify-tests run bench:bundle-size
152
+ ```
153
+
107
154
  ## Publishing
108
155
 
109
156
  Publish the npm packages (library first, then CLI so it gets the correct `zstdify` version):
@@ -139,5 +186,5 @@ MIT
139
186
  [npmtrends-url]: https://www.npmtrends.com/zstdify
140
187
  [tests-badge]: https://github.com/bhouston/zstdify/workflows/Tests/badge.svg
141
188
  [tests-url]: https://github.com/bhouston/zstdify/actions/workflows/test.yml
142
- [coverage-badge]: https://codecov.io/gh/bhouston/zstdify/branch/main/graph/badge.svg
143
- [coverage-url]: https://codecov.io/gh/bhouston/zstdify
189
+ [coverage-badge]: https://codecov.io/gh/bhouston/zstdify/graph/badge.svg?token=K9NKF7F3T0
190
+ [coverage-url]: https://codecov.io/gh/bhouston/zstdify
@@ -5,6 +5,11 @@
5
5
  * - consume bits by decrementing that offset,
6
6
  * - extract bits in little-endian bit order.
7
7
  */
8
+ const BIT_MASKS = Array.from({ length: 33 }, (_, i) => {
9
+ if (i === 32)
10
+ return 0xffffffff;
11
+ return ((1 << i) - 1) >>> 0;
12
+ });
8
13
  export class BitReaderReverse {
9
14
  data;
10
15
  startBit;
@@ -25,7 +30,28 @@ export class BitReaderReverse {
25
30
  throw new RangeError(`BitReaderReverse.readBits: n must be 1-32, got ${n}`);
26
31
  }
27
32
  const requestedStart = this.bitOffset - n;
28
- this.bitOffset = Math.max(this.startBit, requestedStart);
33
+ const clampedStart = requestedStart < this.startBit ? this.startBit : requestedStart;
34
+ this.bitOffset = clampedStart;
35
+ if (requestedStart >= this.startBit) {
36
+ const byteIndex = requestedStart >>> 3;
37
+ const bitInByte = requestedStart & 7;
38
+ const readWord = (idx) => ((this.data[idx] ?? 0) |
39
+ ((this.data[idx + 1] ?? 0) << 8) |
40
+ ((this.data[idx + 2] ?? 0) << 16) |
41
+ ((this.data[idx + 3] ?? 0) << 24)) >>>
42
+ 0;
43
+ const word0 = readWord(byteIndex);
44
+ if (bitInByte + n <= 32) {
45
+ const value = word0 >>> bitInByte;
46
+ return n === 32 ? value >>> 0 : (value & BIT_MASKS[n]) >>> 0;
47
+ }
48
+ const low = word0 >>> bitInByte;
49
+ const highBits = n - (32 - bitInByte);
50
+ const word1 = readWord(byteIndex + 4);
51
+ const high = ((word1 & BIT_MASKS[highBits]) << (32 - bitInByte)) >>> 0;
52
+ const merged = (low | high) >>> 0;
53
+ return n === 32 ? merged : (merged & BIT_MASKS[n]) >>> 0;
54
+ }
29
55
  let value = 0;
30
56
  for (let i = 0; i < n; i++) {
31
57
  const absoluteBit = requestedStart + i;
@@ -1 +1 @@
1
- {"version":3,"file":"bitReaderReverse.js","sourceRoot":"","sources":["../../src/bitstream/bitReaderReverse.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bitReaderReverse.js","sourceRoot":"","sources":["../../src/bitstream/bitReaderReverse.ts"],"names":[],"mappings":"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"}
package/dist/compress.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * Compress input data using zstd.
3
3
  * Level 0: raw blocks only (no compression, fast).
4
4
  */
5
- import { normalizeDecoderDictionary } from './dictionary/decoderDictionary.js';
5
+ import { resolveDictionaryIdForCompression } from './dictionary/compressorDictionary.js';
6
6
  import { writeRawBlock, writeRLEBlock } from './encode/blockWriter.js';
7
7
  import { buildCompressedBlockPayload, writeCompressedBlock } from './encode/compressedBlock.js';
8
8
  import { writeFrameHeader } from './encode/frameWriter.js';
@@ -16,10 +16,11 @@ export function compress(input, options) {
16
16
  const dictionary = options?.dictionary;
17
17
  const dictionaryBytes = dictionary instanceof Uint8Array ? dictionary : dictionary?.bytes;
18
18
  const providedDictionaryId = dictionary instanceof Uint8Array ? null : (dictionary?.id ?? null);
19
- const normalizedDictionary = dictionaryBytes && dictionaryBytes.length > 0
20
- ? normalizeDecoderDictionary(dictionaryBytes, providedDictionaryId)
21
- : null;
22
- const dictionaryId = options?.noDictId ? null : (normalizedDictionary?.dictionaryId ?? providedDictionaryId);
19
+ const dictionaryId = options?.noDictId
20
+ ? null
21
+ : dictionaryBytes && dictionaryBytes.length > 0
22
+ ? resolveDictionaryIdForCompression(dictionaryBytes, providedDictionaryId)
23
+ : providedDictionaryId;
23
24
  if (dictionaryId !== null && (!Number.isInteger(dictionaryId) || dictionaryId <= 0 || dictionaryId > 0xffff_ffff)) {
24
25
  throw new ZstdError('dictionary.id must be a 32-bit positive integer', 'parameter_unsupported');
25
26
  }
@@ -39,8 +40,7 @@ export function compress(input, options) {
39
40
  const payload = buildCompressedBlockPayload(plan.literals, plan.sequences);
40
41
  if (payload) {
41
42
  const compressed = writeCompressedBlock(payload, last);
42
- const raw = writeRawBlock(input, offset, size, last);
43
- if (compressed.length < raw.length) {
43
+ if (compressed.length < 3 + size) {
44
44
  chunks.push(compressed);
45
45
  offset += size;
46
46
  blockIndex++;
@@ -1 +1 @@
1
- {"version":3,"file":"compress.js","sourceRoot":"","sources":["../src/compress.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAChG,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAS/D,MAAM,SAAS,GAAG,GAAG,GAAG,IAAI,CAAC;AAE7B,MAAM,UAAU,QAAQ,CAAC,KAAiB,EAAE,OAAyB,EAAc;IACjF,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC;IAClC,MAAM,WAAW,GAAG,OAAO,EAAE,QAAQ,IAAI,KAAK,CAAC;IAC/C,MAAM,UAAU,GAAG,OAAO,EAAE,UAAU,CAAC;IACvC,MAAM,eAAe,GAAG,UAAU,YAAY,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC;IAC1F,MAAM,oBAAoB,GAAG,UAAU,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,EAAE,EAAE,IAAI,IAAI,CAAC,CAAC;IAChG,MAAM,oBAAoB,GACxB,eAAe,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC;QAC3C,CAAC,CAAC,0BAA0B,CAAC,eAAe,EAAE,oBAAoB,CAAC;QACnE,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,YAAY,GAAG,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,oBAAoB,EAAE,YAAY,IAAI,oBAAoB,CAAC,CAAC;IAC7G,IAAI,YAAY,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,YAAY,IAAI,CAAC,IAAI,YAAY,GAAG,WAAW,CAAC,EAAE,CAAC;QAClH,MAAM,IAAI,SAAS,CAAC,iDAAiD,EAAE,uBAAuB,CAAC,CAAC;IAClG,CAAC;IACD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;IAEvE,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAChF,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,OAAO,MAAM,GAAG,KAAK,CAAC,MAAM,IAAI,UAAU,GAAG,UAAU,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;QACxD,MAAM,IAAI,GAAG,UAAU,KAAK,UAAU,GAAG,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;QACpD,IAAI,KAAK,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;gBACzC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9B,MAAM,OAAO,GAAG,2BAA2B,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;oBAC3E,IAAI,OAAO,EAAE,CAAC;wBACZ,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;wBACvD,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;wBACrD,IAAI,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC;4BACnC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;4BACxB,MAAM,IAAI,IAAI,CAAC;4BACf,UAAU,EAAE,CAAC;4BACb,SAAS;wBACX,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACjC,IAAI,KAAK,GAAG,IAAI,CAAC;YACjB,KAAK,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;gBAChD,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;oBAC9B,KAAK,GAAG,KAAK,CAAC;oBACd,MAAM;gBACR,CAAC;YACH,CAAC;YACD,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,MAAM,IAAI,IAAI,CAAC;QACf,UAAU,EAAE,CAAC;IACf,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,QAAQ,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,CACT,IAAI,UAAU,CAAC,CAAC,QAAQ,GAAG,IAAI,EAAE,CAAC,QAAQ,KAAK,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,QAAQ,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,QAAQ,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAC/G,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACvD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACvB,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC;AAAA,CACf"}
1
+ {"version":3,"file":"compress.js","sourceRoot":"","sources":["../src/compress.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,8 @@
3
3
  */
4
4
  import type { DecoderDictionaryContext } from '../dictionary/decoderDictionary.js';
5
5
  import type { FrameHeader } from '../frame/frameHeader.js';
6
- export declare function decompressFrame(data: Uint8Array, offset: number, header: FrameHeader, dictionary?: DecoderDictionaryContext | null, maxSize?: number): {
6
+ import { type DecoderReuseBag } from './reconstruct.js';
7
+ export declare function decompressFrame(data: Uint8Array, offset: number, header: FrameHeader, dictionary?: DecoderDictionaryContext | null, maxSize?: number, validateChecksum?: boolean, reuseContext?: DecoderReuseBag): {
7
8
  output: Uint8Array;
8
9
  bytesConsumed: number;
9
10
  };
@@ -6,21 +6,42 @@ import { ZstdError } from '../errors.js';
6
6
  import { validateContentChecksum } from '../frame/checksum.js';
7
7
  import { parseBlockHeader } from './block.js';
8
8
  import { decodeCompressedLiterals, decodeRawLiterals, decodeRLELiterals, decodeTreelessLiterals, parseLiteralsSectionHeader, } from './literals.js';
9
- import { executeSequences } from './reconstruct.js';
9
+ import { appendRangeToHistoryWindow, appendRLEToHistoryWindow, appendToHistoryWindow, executeSequencesInto, getOrCreateHistoryWindow, } from './reconstruct.js';
10
10
  import { decodeSequences } from './sequences.js';
11
- export function decompressFrame(data, offset, header, dictionary, maxSize) {
11
+ export function decompressFrame(data, offset, header, dictionary, maxSize, validateChecksum = true, reuseContext) {
12
12
  let pos = offset + 4 + header.headerSize;
13
- const chunks = [];
13
+ const knownOutputSize = header.contentSize ?? null;
14
+ let outputBuffer = knownOutputSize !== null ? new Uint8Array(knownOutputSize) : new Uint8Array(0);
14
15
  let totalSize = 0;
15
16
  const repOffsets = dictionary?.repOffsets
16
17
  ? [dictionary.repOffsets[0], dictionary.repOffsets[1], dictionary.repOffsets[2]]
17
18
  : [1, 4, 8];
18
- let history = new Uint8Array(0);
19
- if (dictionary?.historyPrefix && dictionary.historyPrefix.length > 0) {
20
- history = dictionary.historyPrefix.slice();
21
- }
19
+ const history = getOrCreateHistoryWindow(header.windowSize, dictionary?.historyPrefix, reuseContext);
22
20
  let prevHuffmanTable = dictionary?.huffmanTable ?? null;
23
21
  let prevSeqTables = dictionary?.sequenceTables ?? null;
22
+ const ensureOutputCapacity = (additional) => {
23
+ const needed = totalSize + additional;
24
+ if (needed <= outputBuffer.length) {
25
+ return;
26
+ }
27
+ let nextCapacity = outputBuffer.length === 0 ? 64 * 1024 : outputBuffer.length;
28
+ while (nextCapacity < needed) {
29
+ nextCapacity *= 2;
30
+ }
31
+ const grown = new Uint8Array(nextCapacity);
32
+ if (totalSize > 0) {
33
+ grown.set(outputBuffer.subarray(0, totalSize), 0);
34
+ }
35
+ outputBuffer = grown;
36
+ };
37
+ const appendOutput = (chunk) => {
38
+ if (chunk.length === 0) {
39
+ return;
40
+ }
41
+ ensureOutputCapacity(chunk.length);
42
+ outputBuffer.set(chunk, totalSize);
43
+ totalSize += chunk.length;
44
+ };
24
45
  while (true) {
25
46
  if (pos + 3 > data.length) {
26
47
  throw new ZstdError('Block header truncated', 'corruption_detected');
@@ -28,17 +49,28 @@ export function decompressFrame(data, offset, header, dictionary, maxSize) {
28
49
  const block = parseBlockHeader(data, pos);
29
50
  pos += 3;
30
51
  if (block.blockType === 0) {
31
- const literals = decodeRawLiterals(data, pos, block.blockSize);
32
- chunks.push(literals);
33
- totalSize += literals.length;
34
- history = appendToHistory(history, literals, header.windowSize);
52
+ if (pos + block.blockSize > data.length) {
53
+ throw new ZstdError('Raw literals truncated', 'corruption_detected');
54
+ }
55
+ ensureOutputCapacity(block.blockSize);
56
+ outputBuffer.set(data.subarray(pos, pos + block.blockSize), totalSize);
57
+ if (!block.lastBlock) {
58
+ appendRangeToHistoryWindow(history, data, pos, block.blockSize);
59
+ }
60
+ totalSize += block.blockSize;
35
61
  pos += block.blockSize;
36
62
  }
37
63
  else if (block.blockType === 1) {
38
- const literals = decodeRLELiterals(data, pos, block.blockSize);
39
- chunks.push(literals);
40
- totalSize += literals.length;
41
- history = appendToHistory(history, literals, header.windowSize);
64
+ if (pos >= data.length) {
65
+ throw new ZstdError('RLE literals truncated', 'corruption_detected');
66
+ }
67
+ const byte = data[pos];
68
+ ensureOutputCapacity(block.blockSize);
69
+ outputBuffer.fill(byte, totalSize, totalSize + block.blockSize);
70
+ if (!block.lastBlock) {
71
+ appendRLEToHistoryWindow(history, byte, block.blockSize);
72
+ }
73
+ totalSize += block.blockSize;
42
74
  pos += 1;
43
75
  }
44
76
  else if (block.blockType === 2) {
@@ -69,23 +101,35 @@ export function decompressFrame(data, offset, header, dictionary, maxSize) {
69
101
  litBytesConsumed = litHeader.headerSize + comp.bytesRead;
70
102
  }
71
103
  const seqSectionSize = block.blockSize - litBytesConsumed;
72
- let output;
73
104
  if (seqSectionSize <= 0) {
74
- output = literals;
105
+ appendOutput(literals);
106
+ if (!block.lastBlock) {
107
+ appendToHistoryWindow(history, literals);
108
+ }
75
109
  }
76
110
  else {
77
- const seqResult = decodeSequences(blockContent, litBytesConsumed, seqSectionSize, prevSeqTables);
111
+ const seqResult = decodeSequences(blockContent, litBytesConsumed, seqSectionSize, prevSeqTables, reuseContext?._sequences);
112
+ if (reuseContext) {
113
+ reuseContext._sequences = seqResult.sequences;
114
+ }
78
115
  prevSeqTables = seqResult.tables;
79
116
  if (seqResult.sequences.length === 0) {
80
- output = literals;
117
+ appendOutput(literals);
118
+ if (!block.lastBlock) {
119
+ appendToHistoryWindow(history, literals);
120
+ }
81
121
  }
82
122
  else {
83
- output = executeSequences(literals, seqResult.sequences, header.windowSize, repOffsets, history);
123
+ let decodedSize = literals.length;
124
+ for (const seq of seqResult.sequences) {
125
+ decodedSize += seq.matchLength;
126
+ }
127
+ ensureOutputCapacity(decodedSize);
128
+ const start = totalSize;
129
+ const written = executeSequencesInto(literals, seqResult.sequences, header.windowSize, outputBuffer, start, repOffsets, history, !block.lastBlock);
130
+ totalSize += written;
84
131
  }
85
132
  }
86
- chunks.push(output);
87
- totalSize += output.length;
88
- history = appendToHistory(history, output, header.windowSize);
89
133
  pos += block.blockSize;
90
134
  }
91
135
  else {
@@ -97,7 +141,7 @@ export function decompressFrame(data, offset, header, dictionary, maxSize) {
97
141
  if (block.lastBlock)
98
142
  break;
99
143
  }
100
- const output = concatenateChunks(chunks);
144
+ const output = outputBuffer.subarray(0, totalSize);
101
145
  if (header.contentSize !== null && output.length !== header.contentSize) {
102
146
  throw new ZstdError('Frame content size mismatch', 'corruption_detected');
103
147
  }
@@ -105,43 +149,15 @@ export function decompressFrame(data, offset, header, dictionary, maxSize) {
105
149
  if (pos + 4 > data.length) {
106
150
  throw new ZstdError('Content checksum truncated', 'corruption_detected');
107
151
  }
108
- const storedChecksum = readU32LE(data, pos);
109
- if (!validateContentChecksum(output, storedChecksum)) {
110
- throw new ZstdError('Content checksum mismatch', 'corruption_detected');
152
+ if (validateChecksum) {
153
+ const storedChecksum = readU32LE(data, pos);
154
+ if (!validateContentChecksum(output, storedChecksum)) {
155
+ throw new ZstdError('Content checksum mismatch', 'corruption_detected');
156
+ }
111
157
  }
112
158
  pos += 4;
113
159
  return { output, bytesConsumed: pos - offset };
114
160
  }
115
161
  return { output, bytesConsumed: pos - offset };
116
162
  }
117
- function appendToHistory(history, chunk, windowSize) {
118
- if (windowSize <= 0 || chunk.length === 0) {
119
- return history;
120
- }
121
- const maxHistory = Math.max(1, windowSize);
122
- if (chunk.length >= maxHistory) {
123
- return new Uint8Array(chunk.subarray(chunk.length - maxHistory));
124
- }
125
- const keepFromHistory = Math.min(history.length, maxHistory - chunk.length);
126
- const next = new Uint8Array(keepFromHistory + chunk.length);
127
- if (keepFromHistory > 0) {
128
- next.set(history.subarray(history.length - keepFromHistory), 0);
129
- }
130
- next.set(chunk, keepFromHistory);
131
- return next;
132
- }
133
- function concatenateChunks(chunks) {
134
- if (chunks.length === 0)
135
- return new Uint8Array(0);
136
- if (chunks.length === 1)
137
- return chunks[0];
138
- const total = chunks.reduce((s, c) => s + c.length, 0);
139
- const result = new Uint8Array(total);
140
- let pos = 0;
141
- for (const chunk of chunks) {
142
- result.set(chunk, pos);
143
- pos += chunk.length;
144
- }
145
- return result;
146
- }
147
163
  //# sourceMappingURL=decompressFrame.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"decompressFrame.js","sourceRoot":"","sources":["../../src/decode/decompressFrame.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"decompressFrame.js","sourceRoot":"","sources":["../../src/decode/decompressFrame.ts"],"names":[],"mappings":"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"}