zstdify 1.2.0 → 1.3.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.
Files changed (63) hide show
  1. package/README.md +47 -9
  2. package/dist/bitstream/bitReaderReverse.d.ts +6 -0
  3. package/dist/bitstream/bitReaderReverse.js +38 -12
  4. package/dist/bitstream/bitReaderReverse.js.map +1 -1
  5. package/dist/bitstream/index.d.ts +1 -0
  6. package/dist/bitstream/index.js +1 -0
  7. package/dist/bitstream/index.js.map +1 -1
  8. package/dist/bitstream/reverseBitWriter.d.ts +1 -0
  9. package/dist/bitstream/reverseBitWriter.js +66 -0
  10. package/dist/bitstream/reverseBitWriter.js.map +1 -0
  11. package/dist/compress.js +46 -5
  12. package/dist/compress.js.map +1 -1
  13. package/dist/decode/debugTrace.d.ts +31 -0
  14. package/dist/decode/debugTrace.js +2 -0
  15. package/dist/decode/debugTrace.js.map +1 -0
  16. package/dist/decode/decompressFrame.d.ts +2 -1
  17. package/dist/decode/decompressFrame.js +96 -18
  18. package/dist/decode/decompressFrame.js.map +1 -1
  19. package/dist/decode/fusedSequences.d.ts +9 -0
  20. package/dist/decode/fusedSequences.js +26 -0
  21. package/dist/decode/fusedSequences.js.map +1 -0
  22. package/dist/decode/literals.js +129 -79
  23. package/dist/decode/literals.js.map +1 -1
  24. package/dist/decode/reconstruct.d.ts +14 -2
  25. package/dist/decode/reconstruct.js +378 -21
  26. package/dist/decode/reconstruct.js.map +1 -1
  27. package/dist/decode/sequences.d.ts +19 -7
  28. package/dist/decode/sequences.js +127 -48
  29. package/dist/decode/sequences.js.map +1 -1
  30. package/dist/decompress.d.ts +3 -0
  31. package/dist/decompress.js +1 -1
  32. package/dist/decompress.js.map +1 -1
  33. package/dist/encode/compressedBlock.d.ts +27 -1
  34. package/dist/encode/compressedBlock.js +573 -367
  35. package/dist/encode/compressedBlock.js.map +1 -1
  36. package/dist/encode/fastMatcher.d.ts +7 -0
  37. package/dist/encode/fastMatcher.js +13 -0
  38. package/dist/encode/fastMatcher.js.map +1 -0
  39. package/dist/encode/greedySequences.d.ts +9 -6
  40. package/dist/encode/greedySequences.js +22 -101
  41. package/dist/encode/greedySequences.js.map +1 -1
  42. package/dist/encode/lazyMatcher.d.ts +7 -0
  43. package/dist/encode/lazyMatcher.js +13 -0
  44. package/dist/encode/lazyMatcher.js.map +1 -0
  45. package/dist/encode/literalsEncoder.d.ts +14 -0
  46. package/dist/encode/literalsEncoder.js +343 -0
  47. package/dist/encode/literalsEncoder.js.map +1 -0
  48. package/dist/encode/optimalParser.d.ts +7 -0
  49. package/dist/encode/optimalParser.js +13 -0
  50. package/dist/encode/optimalParser.js.map +1 -0
  51. package/dist/encode/sequencePlanner.d.ts +23 -0
  52. package/dist/encode/sequencePlanner.js +280 -0
  53. package/dist/encode/sequencePlanner.js.map +1 -0
  54. package/dist/entropy/fse.d.ts +13 -6
  55. package/dist/entropy/fse.js +175 -8
  56. package/dist/entropy/fse.js.map +1 -1
  57. package/dist/entropy/huffman.d.ts +7 -5
  58. package/dist/entropy/huffman.js +18 -7
  59. package/dist/entropy/huffman.js.map +1 -1
  60. package/dist/entropy/index.d.ts +2 -2
  61. package/dist/entropy/weights.js +20 -14
  62. package/dist/entropy/weights.js.map +1 -1
  63. package/package.json +1 -1
package/README.md CHANGED
@@ -26,8 +26,8 @@ Pure JavaScript/TypeScript zstd compression/decompression library. No native dep
26
26
  - Pure TypeScript dictionary training from sample payloads.
27
27
  - Zstd-inspired training options (`fastcover`/`cover`/`legacy` style knobs).
28
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.
29
+ - `zstdify/compress`: ~5.27 KiB gzip / ~4.75 KiB brotli.
30
+ - `zstdify/decompress`: ~8.63 KiB gzip / ~7.67 KiB brotli.
31
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`.
32
32
  - **Extensively tested**:
33
33
  - Round-trip and property-based tests.
@@ -108,10 +108,23 @@ See [packages/cli/README.md](packages/cli/README.md) for full CLI documentation.
108
108
  ```bash
109
109
  pnpm install
110
110
  pnpm build
111
+ pnpm --filter zstdify-tests run bench:fetch-data
111
112
  pnpm test
112
113
  pnpm check
113
114
  ```
114
115
 
116
+ ### Divergence debug tool
117
+
118
+ When a Node zstd -> zstdify decode mismatch appears, use the divergence tool to quickly locate where decoded output first diverges and which decode paths are involved (literals mode, sequence modes, repeat-offset candidates, and nearby block context).
119
+
120
+ Run it from `zstdify-tests`:
121
+
122
+ ```bash
123
+ pnpm --filter zstdify-tests run debug:node-zstd-divergence -- --payload-id corpus-linux-kernel-tar --pass-level 3 --fail-level 5
124
+ ```
125
+
126
+ You can also enable debug output directly in the interop test via `ZSTDIFY_INTEROP_DEBUG=1` (with optional payload/level env vars) to print the same high-level divergence report during test runs.
127
+
115
128
  ### How we validate
116
129
 
117
130
  All of the following run as part of the test suite (`pnpm test` / `pnpm vitest`):
@@ -119,19 +132,44 @@ All of the following run as part of the test suite (`pnpm test` / `pnpm vitest`)
119
132
  - **Round-trip**: `decompress(compress(x)) === x` for a variety of payloads and levels, plus property-based tests with [fast-check](https://fast-check.dev/).
120
133
  - **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).
121
134
  - **Differential (zstd ↔ zstdify)**: We test zstd compress → zstdify decompress and zstdify compress → zstd decompress across payloads and levels.
135
+ - **Differential (Node zstd ↔ zstdify)**: We test Node `node:zlib` zstd compress → zstdify decompress and zstdify compress → Node zstd decompress across synthetic plus local corpus-backed payloads.
122
136
  - **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.
137
+ - **Node zstd ratio**: Compare compression ratio of Node's built-in zstd vs zstdify on representative synthetic plus local corpus-backed payloads and levels; assert zstdify is within ~10% of Node's compressed size.
124
138
  - **Corruption**: Truncation, checksum mismatch, invalid header bits, and related error paths.
125
139
  - **Compression regression**: Compressed sizes for fixed payloads are checked against golden values (ratio stability).
126
140
  - **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.
127
141
 
128
142
  ## Benchmark: zstdify vs Node built-in zstd
129
143
 
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.
144
+ Throughput and compression ratio are compared against Node’s built-in `node:zlib` zstd on a downloaded, local real-world corpus at compression level 6 (one entry per corpus file).
131
145
 
132
- ![Benchmark: compression and decompression throughput](packages/zstdify-tests/benchmarks/latest.svg)
146
+ ## Throughput (MB/s)
147
+
148
+ | Payload | Category | Level | Compress zstdify | Compress Node | Decompress zstdify | Decompress Node | Decompress fzstd | Decompress zstddec |
149
+ |-------------|------|----------|-------|------------------|---------------|-------------------|------------------|---------------------|
150
+ | war-and-peace-txt | text | 6 | 3.11 | 167.23 | 160.81 | 946.05 | 259.70 | 939.95 |
151
+ | shakespeare-complete-txt | text | 6 | 2.30 | 140.86 | 128.66 | 776.63 | 230.89 | 771.69 |
152
+ | enwik8 | text | 6 | 2.54 | 120.59 | 145.00 | 1119.58 | 244.51 | 1012.42 |
153
+ | linux-kernel-tar | archive | 6 | 4.09 | 170.70 | 235.37 | 1746.59 | 338.54 | 1528.30 |
154
+ | apollo17-flightplan-pdf | document | 6 | 7.09 | 277.37 | 476.65 | 2940.43 | 500.13 | 2340.68 |
155
+
156
+ ## Compression ratio (compressed/original)
157
+
158
+ | Payload | Category | Level | zstdify | Node |
159
+ |-------------|----------|-------|---------|------|
160
+ | war-and-peace-txt | text | 6 | 0.3875 | 0.3418 |
161
+ | shakespeare-complete-txt | text | 6 | 0.4758 | 0.4189 |
162
+ | enwik8 | text | 6 | 0.3724 | 0.3248 |
163
+ | linux-kernel-tar | archive | 6 | 0.2259 | 0.1995 |
164
+ | apollo17-flightplan-pdf | document | 6 | 0.1315 | 0.1176 |
165
+
166
+ Before benchmarking, fetch local corpus files (downloaded and stored locally, not committed):
167
+
168
+ ```bash
169
+ pnpm --filter zstdify-tests run bench:fetch-data
170
+ ```
133
171
 
134
- To regenerate the chart and tables (run benchmarks and render SVG):
172
+ To regenerate the chart and tables (fetch corpus if needed, run benchmarks, render SVG):
135
173
 
136
174
  ```bash
137
175
  pnpm --filter zstdify-tests run bench:update
@@ -141,8 +179,8 @@ pnpm --filter zstdify-tests run bench:update
141
179
 
142
180
  | Target | Raw | Gzip | Brotli |
143
181
  |---|---:|---:|---:|
144
- | zstdify/compress | 13.90 KiB | 5.27 KiB | 4.75 KiB |
145
- | zstdify/decompress | 27.70 KiB | 8.63 KiB | 7.67 KiB |
182
+ | zstdify/compress | 28.82 KiB | 9.78 KiB | 8.83 KiB |
183
+ | zstdify/decompress | 35.13 KiB | 10.66 KiB | 9.41 KiB |
146
184
  | zstddec decoder + wasm | 127.37 KiB | 49.69 KiB | 40.66 KiB |
147
185
 
148
186
  To regenerate this snapshot:
@@ -170,7 +208,7 @@ pnpm make-release:cli
170
208
  ## Acknowledgements
171
209
 
172
210
  This project is made possible by the original [zstd](https://github.com/facebook/zstd) project by Meta and its contributors.
173
- The monorepo, project, and CLI structure were bootstrapped from [hdrify](https://github.com/bhouston/hdrify), which made this project much easier to build.
211
+ The monorepo, project, and CLI structure were bootstrapped from [hdrify](https://github.com/bhouston/hdrify), which made this project much easier to build. Many JavaScript optimization strategies were inspired by [fzstd](https://github.com/101arrowz/fzstd).
174
212
 
175
213
  # License
176
214
 
@@ -7,12 +7,18 @@
7
7
  */
8
8
  export declare class BitReaderReverse {
9
9
  private readonly data;
10
+ private readonly dataLength;
10
11
  private readonly startBit;
11
12
  private readonly endBit;
12
13
  private bitOffset;
13
14
  constructor(data: Uint8Array, startByteOffset: number, lengthBytes: number, skipBitsAtStart?: number);
14
15
  /** Read n bits (1-32), LSB first from current position (reading backward) */
15
16
  readBits(n: number): number;
17
+ /**
18
+ * Fast path used by validated hot loops.
19
+ * Falls back to readBits() when the request crosses the logical stream start.
20
+ */
21
+ readBitsFast(n: number): number;
16
22
  /** Skip trailing zero padding and end-mark bit from the stream tail. */
17
23
  skipPadding(): void;
18
24
  get position(): number;
@@ -5,13 +5,19 @@
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
+ const BIT_MASKS = new Uint32Array(33);
9
+ for (let i = 0; i <= 32; i++) {
10
+ BIT_MASKS[i] = i === 32 ? 0xffffffff : ((1 << i) - 1) >>> 0;
11
+ }
12
+ function readU32LEBounded(data, idx) {
13
+ return (((data[idx] ?? 0) | ((data[idx + 1] ?? 0) << 8) | ((data[idx + 2] ?? 0) << 16) | ((data[idx + 3] ?? 0) << 24)) >>> 0);
14
+ }
15
+ function readU32LEFast(data, idx) {
16
+ return (data[idx] | (data[idx + 1] << 8) | (data[idx + 2] << 16) | (data[idx + 3] << 24)) >>> 0;
17
+ }
13
18
  export class BitReaderReverse {
14
19
  data;
20
+ dataLength;
15
21
  startBit;
16
22
  endBit;
17
23
  bitOffset;
@@ -20,6 +26,7 @@ export class BitReaderReverse {
20
26
  throw new RangeError(`BitReaderReverse: negative length ${lengthBytes}`);
21
27
  }
22
28
  this.data = data;
29
+ this.dataLength = data.length;
23
30
  this.startBit = startByteOffset * 8 + skipBitsAtStart;
24
31
  this.endBit = (startByteOffset + lengthBytes) * 8;
25
32
  this.bitOffset = this.endBit;
@@ -35,19 +42,20 @@ export class BitReaderReverse {
35
42
  if (requestedStart >= this.startBit) {
36
43
  const byteIndex = requestedStart >>> 3;
37
44
  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);
45
+ if (bitInByte + n <= 8) {
46
+ return ((this.data[byteIndex] >>> bitInByte) & BIT_MASKS[n]) >>> 0;
47
+ }
48
+ const hasEightBytes = byteIndex + 7 < this.dataLength;
49
+ const word0 = hasEightBytes ? readU32LEFast(this.data, byteIndex) : readU32LEBounded(this.data, byteIndex);
44
50
  if (bitInByte + n <= 32) {
45
51
  const value = word0 >>> bitInByte;
46
52
  return n === 32 ? value >>> 0 : (value & BIT_MASKS[n]) >>> 0;
47
53
  }
48
54
  const low = word0 >>> bitInByte;
49
55
  const highBits = n - (32 - bitInByte);
50
- const word1 = readWord(byteIndex + 4);
56
+ const word1 = hasEightBytes
57
+ ? readU32LEFast(this.data, byteIndex + 4)
58
+ : readU32LEBounded(this.data, byteIndex + 4);
51
59
  const high = ((word1 & BIT_MASKS[highBits]) << (32 - bitInByte)) >>> 0;
52
60
  const merged = (low | high) >>> 0;
53
61
  return n === 32 ? merged : (merged & BIT_MASKS[n]) >>> 0;
@@ -65,6 +73,24 @@ export class BitReaderReverse {
65
73
  }
66
74
  return value;
67
75
  }
76
+ /**
77
+ * Fast path used by validated hot loops.
78
+ * Falls back to readBits() when the request crosses the logical stream start.
79
+ */
80
+ readBitsFast(n) {
81
+ if (n < 1 || n > 24) {
82
+ return this.readBits(n);
83
+ }
84
+ const requestedStart = this.bitOffset - n;
85
+ if (requestedStart < this.startBit) {
86
+ return this.readBits(n);
87
+ }
88
+ this.bitOffset = requestedStart;
89
+ const byteIndex = requestedStart >>> 3;
90
+ const bitInByte = requestedStart & 7;
91
+ const word = byteIndex + 3 < this.dataLength ? readU32LEFast(this.data, byteIndex) : readU32LEBounded(this.data, byteIndex);
92
+ return ((word >>> bitInByte) & BIT_MASKS[n]) >>> 0;
93
+ }
68
94
  /** Skip trailing zero padding and end-mark bit from the stream tail. */
69
95
  skipPadding() {
70
96
  if (this.endBit <= this.startBit) {
@@ -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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"}
@@ -1,4 +1,5 @@
1
1
  export { BitReader } from './bitReader.js';
2
2
  export { BitWriter } from './bitWriter.js';
3
3
  export { readU16LE, readU32LE, readU64LE } from './littleEndian.js';
4
+ export { encodeReverseBitstream } from './reverseBitWriter.js';
4
5
  export { decodeVarint, encodeVarint } from './varint.js';
@@ -1,5 +1,6 @@
1
1
  export { BitReader } from './bitReader.js';
2
2
  export { BitWriter } from './bitWriter.js';
3
3
  export { readU16LE, readU32LE, readU64LE } from './littleEndian.js';
4
+ export { encodeReverseBitstream } from './reverseBitWriter.js';
4
5
  export { decodeVarint, encodeVarint } from './varint.js';
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bitstream/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bitstream/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACpE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function encodeReverseBitstream(bitCounts: ArrayLike<number>, bitValues: ArrayLike<number>): Uint8Array;
@@ -0,0 +1,66 @@
1
+ /**
2
+ * LSB-first bit writer used for reverse zstd bitstreams.
3
+ * Callers must write symbols in reverse decode order.
4
+ */
5
+ class ReverseBitWriter {
6
+ buffer = new Uint8Array(0);
7
+ outputSize = 0;
8
+ writePos = 0;
9
+ bitContainer = 0;
10
+ bitCount = 0;
11
+ reset(bitLength) {
12
+ this.outputSize = (bitLength + 7) >>> 3;
13
+ if (this.buffer.length < this.outputSize) {
14
+ this.buffer = new Uint8Array(this.outputSize);
15
+ }
16
+ this.buffer.fill(0, 0, this.outputSize);
17
+ this.writePos = 0;
18
+ this.bitContainer = 0;
19
+ this.bitCount = 0;
20
+ }
21
+ writeBits(n, bits) {
22
+ let remaining = n;
23
+ let value = bits >>> 0;
24
+ while (remaining > 0) {
25
+ // Keep shifts <= 31 bits for stable JS bitwise semantics.
26
+ const take = remaining > 24 ? 24 : remaining;
27
+ const partMask = ((1 << take) - 1) >>> 0;
28
+ const part = value & partMask;
29
+ this.bitContainer |= part << this.bitCount;
30
+ this.bitCount += take;
31
+ value >>>= take;
32
+ remaining -= take;
33
+ while (this.bitCount >= 8) {
34
+ this.buffer[this.writePos++] = this.bitContainer & 0xff;
35
+ this.bitContainer >>>= 8;
36
+ this.bitCount -= 8;
37
+ }
38
+ }
39
+ }
40
+ finish() {
41
+ if (this.bitCount > 0 && this.writePos < this.outputSize) {
42
+ this.buffer[this.writePos++] = this.bitContainer & 0xff;
43
+ this.bitContainer = 0;
44
+ this.bitCount = 0;
45
+ }
46
+ return this.buffer.slice(0, this.outputSize);
47
+ }
48
+ }
49
+ const sharedReverseBitWriter = new ReverseBitWriter();
50
+ export function encodeReverseBitstream(bitCounts, bitValues) {
51
+ let bitLength = 1; // End marker bit.
52
+ for (let i = 0; i < bitCounts.length; i++) {
53
+ const n = bitCounts[i] ?? 0;
54
+ if (n > 0)
55
+ bitLength += n;
56
+ }
57
+ sharedReverseBitWriter.reset(bitLength);
58
+ for (let i = bitCounts.length - 1; i >= 0; i--) {
59
+ const n = bitCounts[i] ?? 0;
60
+ if (n > 0)
61
+ sharedReverseBitWriter.writeBits(n, bitValues[i] ?? 0);
62
+ }
63
+ sharedReverseBitWriter.writeBits(1, 1);
64
+ return sharedReverseBitWriter.finish();
65
+ }
66
+ //# sourceMappingURL=reverseBitWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reverseBitWriter.js","sourceRoot":"","sources":["../../src/bitstream/reverseBitWriter.ts"],"names":[],"mappings":"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"}
package/dist/compress.js CHANGED
@@ -4,14 +4,48 @@
4
4
  */
5
5
  import { resolveDictionaryIdForCompression } from './dictionary/compressorDictionary.js';
6
6
  import { writeRawBlock, writeRLEBlock } from './encode/blockWriter.js';
7
- import { buildCompressedBlockPayload, writeCompressedBlock } from './encode/compressedBlock.js';
7
+ import { buildCompressedBlockPayload, writeCompressedBlock, } from './encode/compressedBlock.js';
8
8
  import { writeFrameHeader } from './encode/frameWriter.js';
9
9
  import { buildGreedySequences } from './encode/greedySequences.js';
10
+ import { createSequencePlannerState } from './encode/sequencePlanner.js';
10
11
  import { ZstdError } from './errors.js';
11
12
  import { computeContentChecksum32 } from './frame/checksum.js';
12
13
  const BLOCK_MAX = 128 * 1024;
14
+ const WINDOW_SIZE = 128 * 1024;
15
+ function selectCompressionStrategy(level) {
16
+ if (level <= 1)
17
+ return null;
18
+ if (level <= 3)
19
+ return 'fast';
20
+ if (level <= 6)
21
+ return 'lazy';
22
+ return 'optimal';
23
+ }
24
+ function appendHistory(history, chunk) {
25
+ if (chunk.length === 0)
26
+ return history;
27
+ if (chunk.length >= WINDOW_SIZE) {
28
+ const out = new Uint8Array(WINDOW_SIZE);
29
+ out.set(chunk.subarray(chunk.length - WINDOW_SIZE), 0);
30
+ return out;
31
+ }
32
+ const total = history.length + chunk.length;
33
+ if (total <= WINDOW_SIZE) {
34
+ const out = new Uint8Array(total);
35
+ out.set(history, 0);
36
+ out.set(chunk, history.length);
37
+ return out;
38
+ }
39
+ const keepFromHistory = WINDOW_SIZE - chunk.length;
40
+ const out = new Uint8Array(WINDOW_SIZE);
41
+ out.set(history.subarray(history.length - keepFromHistory), 0);
42
+ out.set(chunk, keepFromHistory);
43
+ return out;
44
+ }
13
45
  export function compress(input, options) {
14
- const level = options?.level ?? 0;
46
+ const requestedLevel = options?.level ?? 0;
47
+ const level = Math.max(0, Math.min(9, Math.trunc(requestedLevel)));
48
+ const strategy = selectCompressionStrategy(level);
15
49
  const hasChecksum = options?.checksum ?? false;
16
50
  const dictionary = options?.dictionary;
17
51
  const dictionaryBytes = dictionary instanceof Uint8Array ? dictionary : dictionary?.bytes;
@@ -29,19 +63,25 @@ export function compress(input, options) {
29
63
  let offset = 0;
30
64
  const blockCount = input.length === 0 ? 1 : Math.ceil(input.length / BLOCK_MAX);
31
65
  let blockIndex = 0;
66
+ let history = new Uint8Array(0);
67
+ let repOffsets = [1, 4, 8];
68
+ const sequenceEntropyContext = { prevTables: null };
69
+ const sequencePlannerState = createSequencePlannerState();
32
70
  while (offset < input.length || blockIndex < blockCount) {
33
71
  const size = Math.min(BLOCK_MAX, input.length - offset);
34
72
  const last = blockIndex === blockCount - 1;
35
73
  const block = input.subarray(offset, offset + size);
36
74
  if (level > 0 && size > 0) {
37
- if (level > 1) {
38
- const plan = buildGreedySequences(block);
75
+ if (strategy) {
76
+ const plan = buildGreedySequences(block, { strategy, history, repOffsets, plannerState: sequencePlannerState });
39
77
  if (plan.sequences.length > 0) {
40
- const payload = buildCompressedBlockPayload(plan.literals, plan.sequences);
78
+ const payload = buildCompressedBlockPayload(plan.literals, plan.sequences, sequenceEntropyContext);
41
79
  if (payload) {
42
80
  const compressed = writeCompressedBlock(payload, last);
43
81
  if (compressed.length < 3 + size) {
44
82
  chunks.push(compressed);
83
+ repOffsets = plan.finalRepOffsets;
84
+ history = appendHistory(history, block);
45
85
  offset += size;
46
86
  blockIndex++;
47
87
  continue;
@@ -67,6 +107,7 @@ export function compress(input, options) {
67
107
  else {
68
108
  chunks.push(writeRawBlock(input, offset, size, last));
69
109
  }
110
+ history = appendHistory(history, block);
70
111
  offset += size;
71
112
  blockIndex++;
72
113
  }
@@ -1 +1 @@
1
- {"version":3,"file":"compress.js","sourceRoot":"","sources":["../src/compress.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"compress.js","sourceRoot":"","sources":["../src/compress.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export interface DecodeTraceLiteralsInfo {
2
+ blockType: 0 | 1 | 2 | 3;
3
+ regeneratedSize: number;
4
+ compressedSize?: number;
5
+ numStreams: 1 | 4;
6
+ headerSize: number;
7
+ }
8
+ export interface DecodeTraceSequencesInfo {
9
+ numSequences: number;
10
+ llMode: 0 | 1 | 2 | 3;
11
+ ofMode: 0 | 1 | 2 | 3;
12
+ mlMode: 0 | 1 | 2 | 3;
13
+ llTableLog: number;
14
+ ofTableLog: number;
15
+ mlTableLog: number;
16
+ repeatOffsetCandidateCount: number;
17
+ }
18
+ export interface DecodeTraceBlockInfo {
19
+ blockIndex: number;
20
+ blockType: 0 | 1 | 2;
21
+ blockSize: number;
22
+ lastBlock: boolean;
23
+ inputOffset: number;
24
+ outputStart: number;
25
+ outputEnd: number;
26
+ literals?: DecodeTraceLiteralsInfo;
27
+ sequences?: DecodeTraceSequencesInfo;
28
+ }
29
+ export interface DecodeTrace {
30
+ onBlockDecoded?(info: DecodeTraceBlockInfo): void;
31
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=debugTrace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debugTrace.js","sourceRoot":"","sources":["../../src/decode/debugTrace.ts"],"names":[],"mappings":""}
@@ -3,8 +3,9 @@
3
3
  */
4
4
  import type { DecoderDictionaryContext } from '../dictionary/decoderDictionary.js';
5
5
  import type { FrameHeader } from '../frame/frameHeader.js';
6
+ import type { DecodeTrace } from './debugTrace.js';
6
7
  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): {
8
+ export declare function decompressFrame(data: Uint8Array, offset: number, header: FrameHeader, dictionary?: DecoderDictionaryContext | null, maxSize?: number, validateChecksum?: boolean, reuseContext?: DecoderReuseBag, debugTrace?: DecodeTrace): {
8
9
  output: Uint8Array;
9
10
  bytesConsumed: number;
10
11
  };