zstdify 1.0.0 → 1.0.2

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 (69) hide show
  1. package/README.md +32 -16
  2. package/package.json +1 -1
  3. package/dist/bitstream/bitReader.test.d.ts +0 -1
  4. package/dist/bitstream/bitReader.test.js +0 -47
  5. package/dist/bitstream/bitReader.test.js.map +0 -1
  6. package/dist/bitstream/bitReaderReverse.test.d.ts +0 -1
  7. package/dist/bitstream/bitReaderReverse.test.js +0 -49
  8. package/dist/bitstream/bitReaderReverse.test.js.map +0 -1
  9. package/dist/bitstream/littleEndian.test.d.ts +0 -1
  10. package/dist/bitstream/littleEndian.test.js +0 -21
  11. package/dist/bitstream/littleEndian.test.js.map +0 -1
  12. package/dist/bitstream/varint.test.d.ts +0 -1
  13. package/dist/bitstream/varint.test.js +0 -25
  14. package/dist/bitstream/varint.test.js.map +0 -1
  15. package/dist/decode/block.test.d.ts +0 -1
  16. package/dist/decode/block.test.js +0 -26
  17. package/dist/decode/block.test.js.map +0 -1
  18. package/dist/decode/literals.corruption.test.d.ts +0 -1
  19. package/dist/decode/literals.corruption.test.js +0 -26
  20. package/dist/decode/literals.corruption.test.js.map +0 -1
  21. package/dist/decode/literals.test.d.ts +0 -1
  22. package/dist/decode/literals.test.js +0 -52
  23. package/dist/decode/literals.test.js.map +0 -1
  24. package/dist/decode/reconstruct.test.d.ts +0 -1
  25. package/dist/decode/reconstruct.test.js +0 -42
  26. package/dist/decode/reconstruct.test.js.map +0 -1
  27. package/dist/decode/sequences.corruption.test.d.ts +0 -1
  28. package/dist/decode/sequences.corruption.test.js +0 -32
  29. package/dist/decode/sequences.corruption.test.js.map +0 -1
  30. package/dist/decode/sequences.level1.test.d.ts +0 -1
  31. package/dist/decode/sequences.level1.test.js +0 -35
  32. package/dist/decode/sequences.level1.test.js.map +0 -1
  33. package/dist/dictionary/decoderDictionary.test.d.ts +0 -1
  34. package/dist/dictionary/decoderDictionary.test.js +0 -87
  35. package/dist/dictionary/decoderDictionary.test.js.map +0 -1
  36. package/dist/encode/blockWriter.test.d.ts +0 -1
  37. package/dist/encode/blockWriter.test.js +0 -31
  38. package/dist/encode/blockWriter.test.js.map +0 -1
  39. package/dist/encode/compressedBlock.test.d.ts +0 -1
  40. package/dist/encode/compressedBlock.test.js +0 -63
  41. package/dist/encode/compressedBlock.test.js.map +0 -1
  42. package/dist/encode/frameWriter.test.d.ts +0 -1
  43. package/dist/encode/frameWriter.test.js +0 -38
  44. package/dist/encode/frameWriter.test.js.map +0 -1
  45. package/dist/encode/greedySequences.test.d.ts +0 -1
  46. package/dist/encode/greedySequences.test.js +0 -33
  47. package/dist/encode/greedySequences.test.js.map +0 -1
  48. package/dist/entropy/fse.test.d.ts +0 -1
  49. package/dist/entropy/fse.test.js +0 -41
  50. package/dist/entropy/fse.test.js.map +0 -1
  51. package/dist/entropy/huffman.test.d.ts +0 -1
  52. package/dist/entropy/huffman.test.js +0 -22
  53. package/dist/entropy/huffman.test.js.map +0 -1
  54. package/dist/entropy/weights.test.d.ts +0 -1
  55. package/dist/entropy/weights.test.js +0 -38
  56. package/dist/entropy/weights.test.js.map +0 -1
  57. package/dist/errors.test.d.ts +0 -1
  58. package/dist/errors.test.js +0 -16
  59. package/dist/errors.test.js.map +0 -1
  60. package/dist/frame/checksum.test.d.ts +0 -1
  61. package/dist/frame/checksum.test.js +0 -28
  62. package/dist/frame/checksum.test.js.map +0 -1
  63. package/dist/frame/frameHeader.test.d.ts +0 -1
  64. package/dist/frame/frameHeader.test.js +0 -83
  65. package/dist/frame/frameHeader.test.js.map +0 -1
  66. package/dist/frame/skippable.test.d.ts +0 -1
  67. package/dist/frame/skippable.test.js +0 -35
  68. package/dist/frame/skippable.test.js.map +0 -1
  69. package/dist/tsconfig.tsbuildinfo +0 -1
package/README.md CHANGED
@@ -5,13 +5,26 @@
5
5
  [![Tests][tests-badge]][tests-url]
6
6
  [![Coverage][coverage-badge]][coverage-url]
7
7
 
8
- Pure TypeScript zstd compression library. No native dependencies, works in Node.js and browsers.
9
-
10
- ## Status
11
-
12
- - **Decoder**: Raw and RLE blocks supported. Compressed blocks (Huffman/FSE) planned.
13
- - **Encoder**: Raw baseline, RLE blocks for repeated-byte chunks (`level > 0`), plus an initial compressed-block path (`level > 1`) for selected single-sequence blocks with raw fallback.
14
- - **Format**: RFC 8878 compliant for supported features.
8
+ Pure JavaScript/TypeScript zstd compression/decompression library. No native dependencies, works in Node.js and browsers.
9
+
10
+ ## Features
11
+
12
+ - **Pure JS/TS zstd in Node and browsers**: No native dependencies, portable by default.
13
+ - **Decoder support across real-world zstd frames**:
14
+ - Raw, RLE, and compressed blocks (including Huffman/FSE-based paths).
15
+ - Single and concatenated frames, plus skippable frame support.
16
+ - Content checksum validation.
17
+ - Dictionary-aware decompression, including dictionary ID checks.
18
+ - **Encoder support with adaptive strategy**:
19
+ - Raw blocks, RLE blocks, and compressed blocks.
20
+ - Compression-level driven behavior with automatic raw fallback when compressed output is not smaller.
21
+ - Optional frame content checksums.
22
+ - **Interop-focused**: `zstdify` output is decoded by the official `zstd` CLI, and `zstd` CLI output is decoded by `zstdify`.
23
+ - **Extensively tested**:
24
+ - Round-trip and property-based tests.
25
+ - Conformance fixtures from known-good archives generated by the official `zstd` tool.
26
+ - Differential tests against the official `zstd` CLI (both directions).
27
+ - Corruption, boundary, and compression-regression coverage.
15
28
 
16
29
  ## Usage
17
30
 
@@ -26,8 +39,8 @@ const restored = decompress(compressed);
26
39
 
27
40
  ## API
28
41
 
29
- - `compress(input: Uint8Array, options?: { level?: number }): Uint8Array`
30
- - `decompress(input: Uint8Array, options?: { maxSize?: number }): Uint8Array`
42
+ - `compress(input: Uint8Array, options?: { level?: number; checksum?: boolean }): Uint8Array`
43
+ - `decompress(input: Uint8Array, options?: { maxSize?: number; dictionary?: Uint8Array | { bytes: Uint8Array; id?: number } }): Uint8Array`
31
44
 
32
45
  ## CLI Tool
33
46
 
@@ -55,12 +68,14 @@ pnpm check
55
68
 
56
69
  ### How we validate
57
70
 
58
- - **Round-trip**: `decompress(compress(x)) === x` for a variety of payloads and levels (see [packages/zstdify-tests/src/roundtrip/](packages/zstdify-tests/src/roundtrip/)), plus property-based tests with [fast-check](https://fast-check.dev/).
59
- - **Conformance fixtures**: Pre-generated `.zst` files from the official zstd CLI; we decompress and compare. Legacy fixtures are documented in [packages/zstdify-tests/fixtures/README.md](packages/zstdify-tests/fixtures/README.md). A decodecorpus-style **corpus** (multiple sizes/levels, manifest with hashes) is generated by `pnpm --filter zstdify-tests run generate:corpus` and tested in `conformance/corpus-manifest.test.ts`.
60
- - **Differential (zstd ↔ zstdify)**: With the zstd CLI installed, we test zstd compress → zstdify decompress and zstdify compress zstd decompress across payloads and levels.
61
- - **Corruption**: Truncation, checksum mismatch, invalid header bits, and related error paths are tested in [conformance/corruption.test.ts](packages/zstdify-tests/src/conformance/corruption.test.ts).
62
- - **Compression regression**: `pnpm --filter zstdify-tests run regression:compression` checks that compressed sizes for fixed payloads do not increase (ratio stability).
63
- - **Fuzzing**: A decompress harness (`pnpm --filter zstdify-tests run fuzz:decompress`) reads bytes from stdin and calls `decompress`; use with a fuzzer or corpus to find crashes. See [upstream zstd TESTING.md](https://github.com/facebook/zstd/blob/dev/TESTING.md) and decodecorpus for comparison.
71
+ All of the following run as part of the test suite (`pnpm test` / `pnpm vitest`):
72
+
73
+ - **Round-trip**: `decompress(compress(x)) === x` for a variety of payloads and levels, plus property-based tests with [fast-check](https://fast-check.dev/).
74
+ - **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).
75
+ - **Differential (zstd ↔ zstdify)**: When the zstd CLI is installed, we test zstd compress zstdify decompress and zstdify compress → zstd decompress across payloads and levels.
76
+ - **Corruption**: Truncation, checksum mismatch, invalid header bits, and related error paths.
77
+ - **Compression regression**: Compressed sizes for fixed payloads are checked against golden values (ratio stability).
78
+ - **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.
64
79
 
65
80
  ## Publishing
66
81
 
@@ -74,8 +89,9 @@ pnpm make-release:cli
74
89
  ## Project structure
75
90
 
76
91
  - `packages/zstdify` - Core library
77
- - `packages/cli` - CLI tool (`zstdify-cli` on npm)
78
92
  - `packages/zstdify-tests` - Integration tests
93
+ - `packages/cli` - CLI tool (`zstdify-cli` on npm)
94
+ - `packages/cli-tests` - Tests of the CLI tool
79
95
 
80
96
  # License
81
97
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "zstdify",
3
3
  "description": "Pure TypeScript zstd compression library",
4
- "version": "1.0.0",
4
+ "version": "1.0.2",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",
@@ -1 +0,0 @@
1
- export {};
@@ -1,47 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { BitReader } from './bitReader.js';
3
- describe('BitReader', () => {
4
- it('reads single bits', () => {
5
- // 0b10110100 = 0xB4
6
- const data = new Uint8Array([0xb4]);
7
- const r = new BitReader(data);
8
- expect(r.readBits(1)).toBe(0);
9
- expect(r.readBits(1)).toBe(0);
10
- expect(r.readBits(1)).toBe(1);
11
- expect(r.readBits(1)).toBe(0);
12
- expect(r.readBits(1)).toBe(1);
13
- expect(r.readBits(1)).toBe(1);
14
- expect(r.readBits(1)).toBe(0);
15
- expect(r.readBits(1)).toBe(1);
16
- expect(r.atEnd).toBe(true);
17
- });
18
- it('reads multi-bit values', () => {
19
- const data = new Uint8Array([0xff, 0x00]); // 11111111 00000000
20
- const r = new BitReader(data);
21
- expect(r.readBits(8)).toBe(0xff);
22
- expect(r.readBits(8)).toBe(0x00);
23
- });
24
- it('reads across byte boundaries', () => {
25
- // byte0: 1111 (low) 0000 (high), byte1: 1111 (low) 0000 (high)
26
- const data = new Uint8Array([0b00001111, 0b00001111]);
27
- const r = new BitReader(data);
28
- expect(r.readBits(4)).toBe(0b1111); // low 4 of byte0
29
- expect(r.readBits(8)).toBe(0b11110000); // high 4 of byte0 + low 4 of byte1
30
- expect(r.readBits(4)).toBe(0); // high 4 of byte1
31
- });
32
- it('align works', () => {
33
- const data = new Uint8Array([0xff, 0xab, 0xcd]);
34
- const r = new BitReader(data);
35
- r.readBits(3);
36
- r.align();
37
- expect(r.position).toBe(1);
38
- expect(r.readByte()).toBe(0xab);
39
- });
40
- it('throws on out of bounds', () => {
41
- const data = new Uint8Array([0xff]);
42
- const r = new BitReader(data);
43
- r.readBits(8);
44
- expect(() => r.readBits(1)).toThrow();
45
- });
46
- });
47
- //# sourceMappingURL=bitReader.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bitReader.test.js","sourceRoot":"","sources":["../../src/bitstream/bitReader.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,49 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { BitReaderReverse } from './bitReaderReverse.js';
3
- describe('BitReaderReverse', () => {
4
- it('supports unreadBits to rollback over-read', () => {
5
- const reader = new BitReaderReverse(new Uint8Array([0xa0, 0x01]), 0, 2);
6
- reader.skipPadding();
7
- const first = reader.readBits(2);
8
- expect(first).toBe(2);
9
- reader.unreadBits(1);
10
- expect(reader.readBits(1)).toBe(0);
11
- });
12
- it('zero-fills when reading past stream start', () => {
13
- const reader = new BitReaderReverse(new Uint8Array([0x80]), 0, 1);
14
- reader.skipPadding();
15
- // No payload bits remain after padding; reading still succeeds with zeros.
16
- expect(reader.readBits(4)).toBe(0);
17
- });
18
- it('position returns start byte when bitOffset <= startBit', () => {
19
- const reader = new BitReaderReverse(new Uint8Array([0x80]), 0, 1);
20
- reader.skipPadding();
21
- reader.readBits(4); // consume remaining (zeros)
22
- expect(reader.position).toBe(0);
23
- });
24
- it('position returns correct byte after reading bits', () => {
25
- const reader = new BitReaderReverse(new Uint8Array([0xa0, 0x01]), 0, 2);
26
- reader.skipPadding();
27
- reader.readBits(2);
28
- expect(reader.position).toBeGreaterThanOrEqual(0);
29
- expect(reader.position).toBeLessThanOrEqual(2);
30
- });
31
- it('skipBitsAtEnd advances logical position', () => {
32
- const reader = new BitReaderReverse(new Uint8Array([0x80]), 0, 1);
33
- reader.skipPadding();
34
- reader.skipBitsAtEnd(1);
35
- expect(reader.readBits(1)).toBe(0);
36
- });
37
- it('skipBitsAtEnd throws on buffer underflow', () => {
38
- const reader = new BitReaderReverse(new Uint8Array([0x80]), 0, 1);
39
- reader.skipPadding();
40
- expect(() => reader.skipBitsAtEnd(100)).toThrow(/underflow|RangeError/i);
41
- });
42
- it('unreadBits throws on overflow', () => {
43
- const reader = new BitReaderReverse(new Uint8Array([0xa0, 0x01]), 0, 2);
44
- reader.skipPadding();
45
- reader.readBits(2);
46
- expect(() => reader.unreadBits(20)).toThrow(/overflow|RangeError/i);
47
- });
48
- });
49
- //# sourceMappingURL=bitReaderReverse.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bitReaderReverse.test.js","sourceRoot":"","sources":["../../src/bitstream/bitReaderReverse.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,21 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { readU16LE, readU32LE, readU64LE } from './littleEndian.js';
3
- describe('littleEndian', () => {
4
- it('readU16LE', () => {
5
- const data = new Uint8Array([0x34, 0x12]); // 0x1234
6
- expect(readU16LE(data, 0)).toBe(0x1234);
7
- });
8
- it('readU32LE', () => {
9
- const data = new Uint8Array([0x78, 0x56, 0x34, 0x12]);
10
- expect(readU32LE(data, 0)).toBe(0x12345678);
11
- });
12
- it('readU64LE', () => {
13
- const data = new Uint8Array([0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01]);
14
- expect(readU64LE(data, 0)).toBe(0x0123456789abcdefn);
15
- });
16
- it('throws on out of bounds', () => {
17
- const data = new Uint8Array([1, 2, 3]);
18
- expect(() => readU32LE(data, 0)).toThrow();
19
- });
20
- });
21
- //# sourceMappingURL=littleEndian.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"littleEndian.test.js","sourceRoot":"","sources":["../../src/bitstream/littleEndian.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAEpE,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC;IAC7B,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;QACpD,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAAA,CACzC,CAAC,CAAC;IAEH,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACtD,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAAA,CAC7C,CAAC,CAAC;IAEH,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9E,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAAA,CACtD,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAAA,CAC5C,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,25 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { decodeVarint, encodeVarint } from './varint.js';
3
- describe('varint', () => {
4
- it('encodes and decodes small values', () => {
5
- for (const v of [0, 1, 127, 128, 255, 256, 16383]) {
6
- const encoded = encodeVarint(v);
7
- const { value, bytesRead } = decodeVarint(encoded, 0);
8
- expect(value).toBe(v);
9
- expect(bytesRead).toBe(encoded.length);
10
- }
11
- });
12
- it('decodes single-byte varint', () => {
13
- const data = new Uint8Array([0x7f]); // 127, no continuation
14
- const { value, bytesRead } = decodeVarint(data, 0);
15
- expect(value).toBe(127);
16
- expect(bytesRead).toBe(1);
17
- });
18
- it('decodes two-byte varint', () => {
19
- const data = new Uint8Array([0x80, 0x01]); // 128 = 0x80 | 0x01<<7
20
- const { value, bytesRead } = decodeVarint(data, 0);
21
- expect(value).toBe(128);
22
- expect(bytesRead).toBe(2);
23
- });
24
- });
25
- //# sourceMappingURL=varint.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"varint.test.js","sourceRoot":"","sources":["../../src/bitstream/varint.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzD,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC;IACvB,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC;YAClD,MAAM,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACtD,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;IAAA,CACF,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,uBAAuB;QAC5D,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAAA,CAC3B,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,uBAAuB;QAClE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAAA,CAC3B,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,26 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { parseBlockHeader } from './block.js';
3
- describe('block', () => {
4
- it('parses raw block header (last=1, type=0, size=5)', () => {
5
- // last=1, type=0, size=5 -> (5<<3)|0<<1|1 = 41
6
- const data = new Uint8Array([0x29, 0x00, 0x00]);
7
- const block = parseBlockHeader(data, 0);
8
- expect(block.lastBlock).toBe(true);
9
- expect(block.blockType).toBe(0);
10
- expect(block.blockSize).toBe(5);
11
- });
12
- it('throws on reserved block type 3', () => {
13
- // last=0, type=3, size=0
14
- const data = new Uint8Array([0x06, 0x00, 0x00]);
15
- expect(() => parseBlockHeader(data, 0)).toThrow(/Reserved block type|corruption/i);
16
- });
17
- it('throws when block header is truncated', () => {
18
- const data = new Uint8Array([0x28, 0xb5]);
19
- expect(() => parseBlockHeader(data, 0)).toThrow(/Block header truncated|corruption/i);
20
- });
21
- it('throws when offset + 3 exceeds data length', () => {
22
- const data = new Uint8Array([0x29, 0x00]);
23
- expect(() => parseBlockHeader(data, 0)).toThrow(/truncated|corruption/i);
24
- });
25
- });
26
- //# sourceMappingURL=block.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"block.test.js","sourceRoot":"","sources":["../../src/decode/block.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9C,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;IACtB,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE,CAAC;QAC3D,+CAA+C;QAC/C,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAAA,CACjC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE,CAAC;QAC1C,yBAAyB;QACzB,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,iCAAiC,CAAC,CAAC;IAAA,CACpF,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,oCAAoC,CAAC,CAAC;IAAA,CACvF,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAAA,CAC1E,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,26 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { decodeCompressedLiterals, decodeRawLiterals, decodeRLELiterals, decodeTreelessLiterals, parseLiteralsSectionHeader, } from './literals.js';
3
- describe('literals corruption handling', () => {
4
- it('rejects truncated literals section header', () => {
5
- const data = new Uint8Array([0x24]); // compressed literals sizeFormat=1 requires 3-byte header
6
- expect(() => parseLiteralsSectionHeader(data, 0)).toThrowError(/header truncated/i);
7
- });
8
- it('rejects raw literals overrun', () => {
9
- const data = new Uint8Array([0x61, 0x62]);
10
- expect(() => decodeRawLiterals(data, 0, 3)).toThrowError(/Raw literals truncated/i);
11
- });
12
- it('rejects rle literals when source byte is missing', () => {
13
- const data = new Uint8Array([]);
14
- expect(() => decodeRLELiterals(data, 0, 10)).toThrowError(/RLE literals truncated/i);
15
- });
16
- it('rejects invalid compressed literals size', () => {
17
- const data = new Uint8Array([0x80]); // direct weights header with 1 weight; no stream payload
18
- expect(() => decodeCompressedLiterals(data, 0, 1, 16, 1)).toThrowError(/truncated|Invalid literals compressed size/i);
19
- });
20
- it('rejects treeless 4-stream with compressedSize < 10', () => {
21
- const table = decodeCompressedLiterals(new Uint8Array([129, 0x10, 0x02]), 0, 3, 1, 1).huffmanTable;
22
- const data = new Uint8Array(9);
23
- expect(() => decodeTreelessLiterals(data, 0, 9, 100, 4, table)).toThrowError(/4-stream mode requires at least 10 bytes/i);
24
- });
25
- });
26
- //# sourceMappingURL=literals.corruption.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"literals.corruption.test.js","sourceRoot":"","sources":["../../src/decode/literals.corruption.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,EACjB,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,eAAe,CAAC;AAEvB,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC;IAC7C,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE,CAAC;QACpD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,0DAA0D;QAC/F,MAAM,CAAC,GAAG,EAAE,CAAC,0BAA0B,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,mBAAmB,CAAC,CAAC;IAAA,CACrF,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC;IAAA,CACrF,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;QAChC,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,yBAAyB,CAAC,CAAC;IAAA,CACtF,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,yDAAyD;QAC9F,MAAM,CAAC,GAAG,EAAE,CAAC,wBAAwB,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,YAAY,CACpE,6CAA6C,CAC9C,CAAC;IAAA,CACH,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE,CAAC;QAC7D,MAAM,KAAK,GAAG,wBAAwB,CAAC,IAAI,UAAU,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;QACnG,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,YAAY,CAC1E,2CAA2C,CAC5C,CAAC;IAAA,CACH,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,52 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { BitWriter } from '../bitstream/bitWriter.js';
3
- import { decodeCompressedLiterals, decodeTreelessLiterals, parseLiteralsSectionHeader } from './literals.js';
4
- describe('literals header parsing', () => {
5
- it('parses compressed literals header with bit-accurate layout', () => {
6
- const writer = new BitWriter();
7
- writer.writeBits(2, 2); // blockType=Compressed
8
- writer.writeBits(2, 1); // sizeFormat=1 => 4 streams, 10-bit sizes
9
- writer.writeBits(10, 513); // regeneratedSize
10
- writer.writeBits(10, 700); // compressedSize
11
- const headerBytes = writer.flush();
12
- const { header, dataOffset } = parseLiteralsSectionHeader(headerBytes, 0);
13
- expect(header.blockType).toBe(2);
14
- expect(header.numStreams).toBe(4);
15
- expect(header.regeneratedSize).toBe(513);
16
- expect(header.compressedSize).toBe(700);
17
- expect(header.headerSize).toBe(3);
18
- expect(dataOffset).toBe(3);
19
- });
20
- });
21
- describe('decodeCompressedLiterals', () => {
22
- it('decodes minimal single-symbol Huffman (direct weights, 1 stream)', () => {
23
- // headerByte=129 => numWeights=2, then 1 byte with nibbles [1,0] => symbol 0 has weight 1 (1 bit)
24
- // stream: 1 byte; last byte must be non-zero (end marker). Bit 0 = data (0), bit 1 = end => 0x02
25
- const data = new Uint8Array([129, 0x10, 0x02]);
26
- const result = decodeCompressedLiterals(data, 0, 3, 1, 1);
27
- expect(result.literals).toEqual(new Uint8Array([0]));
28
- expect(result.bytesRead).toBe(3);
29
- expect(result.huffmanTable.table).toBeDefined();
30
- expect(result.huffmanTable.maxNumBits).toBe(1);
31
- });
32
- it('decodes multiple symbols with single-symbol tree', () => {
33
- // Same tree (symbol 0, 1 bit). Stream: 3 data bits (0,0,0) + end at bit 3 => 0x08
34
- const data = new Uint8Array([129, 0x10, 0x08]);
35
- const result = decodeCompressedLiterals(data, 0, 3, 3, 1);
36
- expect(result.literals).toEqual(new Uint8Array([0, 0, 0]));
37
- expect(result.bytesRead).toBe(3);
38
- });
39
- });
40
- describe('decodeTreelessLiterals', () => {
41
- it('decodes treeless literals reusing previous Huffman table (1 stream)', () => {
42
- // First get a table from compressed literals
43
- const compressed = new Uint8Array([129, 0x10, 0x02]);
44
- const { huffmanTable } = decodeCompressedLiterals(compressed, 0, 3, 1, 1);
45
- // Treeless: no tree, just stream. Same 1-symbol stream: 1 byte with end marker 0x02
46
- const treelessData = new Uint8Array([0x02]);
47
- const result = decodeTreelessLiterals(treelessData, 0, 1, 1, 1, huffmanTable);
48
- expect(result.literals).toEqual(new Uint8Array([0]));
49
- expect(result.bytesRead).toBe(1);
50
- });
51
- });
52
- //# sourceMappingURL=literals.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"literals.test.js","sourceRoot":"","sources":["../../src/decode/literals.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,42 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { executeSequences } from './reconstruct.js';
3
- describe('executeSequences', () => {
4
- it('does not over-allocate output when sequences consume literals', () => {
5
- const literals = new TextEncoder().encode('abcd');
6
- const sequences = [
7
- {
8
- literalsLength: 4, // "abcd"
9
- offset: 7, // offsetValue 7 => actual offset 4
10
- matchLength: 2,
11
- },
12
- ];
13
- const output = executeSequences(literals, sequences, 128 * 1024);
14
- expect(new TextDecoder().decode(output)).toBe('abcdab');
15
- expect(output.length).toBe(6);
16
- });
17
- it('supports match copies from previous block history', () => {
18
- const history = new TextEncoder().encode('wxyz');
19
- const literals = new Uint8Array(0);
20
- const sequences = [
21
- {
22
- literalsLength: 0,
23
- offset: 7, // Offset_Value 7 => actual offset 4
24
- matchLength: 4,
25
- },
26
- ];
27
- const output = executeSequences(literals, sequences, 128 * 1024, [1, 4, 8], history);
28
- expect(new TextDecoder().decode(output)).toBe('wxyz');
29
- });
30
- it('rejects rep1-1 when it becomes zero', () => {
31
- const literals = new Uint8Array(0);
32
- const sequences = [
33
- {
34
- literalsLength: 0,
35
- offset: 3,
36
- matchLength: 1,
37
- },
38
- ];
39
- expect(() => executeSequences(literals, sequences, 128 * 1024, [1, 4, 8])).toThrowError(/repeat1-1/i);
40
- });
41
- });
42
- //# sourceMappingURL=reconstruct.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reconstruct.test.js","sourceRoot":"","sources":["../../src/decode/reconstruct.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAiB,MAAM,kBAAkB,CAAC;AAEnE,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC;IACjC,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE,CAAC;QACxE,MAAM,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,SAAS,GAAe;YAC5B;gBACE,cAAc,EAAE,CAAC,EAAE,SAAS;gBAC5B,MAAM,EAAE,CAAC,EAAE,mCAAmC;gBAC9C,WAAW,EAAE,CAAC;aACf;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;QACjE,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAAA,CAC/B,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE,CAAC;QAC5D,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,SAAS,GAAe;YAC5B;gBACE,cAAc,EAAE,CAAC;gBACjB,MAAM,EAAE,CAAC,EAAE,oCAAoC;gBAC/C,WAAW,EAAE,CAAC;aACf;SACF,CAAC;QAEF,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACrF,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAAA,CACvD,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,SAAS,GAAe;YAC5B;gBACE,cAAc,EAAE,CAAC;gBACjB,MAAM,EAAE,CAAC;gBACT,WAAW,EAAE,CAAC;aACf;SACF,CAAC;QAEF,MAAM,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC;IAAA,CACvG,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,32 +0,0 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { decodeSequences } from './sequences.js';
3
- describe('decodeSequences corruption handling', () => {
4
- it('rejects truncated sequences section header', () => {
5
- const data = new Uint8Array([0x01]);
6
- expect(() => decodeSequences(data, 0, data.length, null)).toThrowError(/too short|truncated/i);
7
- });
8
- it('rejects reserved bits set in modes byte', () => {
9
- const data = new Uint8Array([
10
- 0x01, // numSequences
11
- 0x01, // reserved low 2 bits set
12
- ]);
13
- expect(() => decodeSequences(data, 0, data.length, null)).toThrowError(/reserved bits/i);
14
- });
15
- it('rejects repeat mode without previous tables', () => {
16
- const data = new Uint8Array([
17
- 0x01, // numSequences
18
- 0xc0, // llMode=3 (repeat), of/ml default
19
- 0xff, // bitstream marker byte
20
- ]);
21
- expect(() => decodeSequences(data, 0, data.length, null)).toThrowError(/Repeat_Mode/i);
22
- });
23
- it('rejects bitstream too short for initial states', () => {
24
- const data = new Uint8Array([
25
- 0x01, // numSequences
26
- 0x00, // predefined tables for LL/OF/ML
27
- 0x80, // valid reverse end marker but only 1 byte of bitstream
28
- ]);
29
- expect(() => decodeSequences(data, 0, data.length, null)).toThrowError(/too short for initial states/i);
30
- });
31
- });
32
- //# sourceMappingURL=sequences.corruption.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sequences.corruption.test.js","sourceRoot":"","sources":["../../src/decode/sequences.corruption.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE,CAAC;IACpD,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC;IAAA,CAChG,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC;YAC1B,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,0BAA0B;SACjC,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;IAAA,CAC1F,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC;YAC1B,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,mCAAmC;YACzC,IAAI,EAAE,wBAAwB;SAC/B,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IAAA,CACxF,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE,CAAC;QACzD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC;YAC1B,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,iCAAiC;YACvC,IAAI,EAAE,wDAAwD;SAC/D,CAAC,CAAC;QACH,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,+BAA+B,CAAC,CAAC;IAAA,CACzG,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,35 +0,0 @@
1
- import * as fs from 'node:fs';
2
- import * as path from 'node:path';
3
- import { fileURLToPath } from 'node:url';
4
- import { describe, expect, it } from 'vitest';
5
- import { parseFrameHeader } from '../frame/frameHeader.js';
6
- import { parseBlockHeader } from './block.js';
7
- import { decodeRawLiterals, parseLiteralsSectionHeader } from './literals.js';
8
- import { executeSequences } from './reconstruct.js';
9
- import { decodeSequences } from './sequences.js';
10
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
11
- const fixturePath = path.join(__dirname, '../../../zstdify-tests/fixtures/level1.zst');
12
- describe('sequence internals (level1 fixture)', () => {
13
- it('decodes exact sequence tuple and reconstructs output length', () => {
14
- if (!fs.existsSync(fixturePath)) {
15
- console.warn('Skipping: run "echo -n "hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world " | zstd -c --no-check -1 > packages/zstdify-tests/fixtures/level1.zst"');
16
- return;
17
- }
18
- const data = new Uint8Array(fs.readFileSync(fixturePath));
19
- const header = parseFrameHeader(data, 4);
20
- let pos = 4 + header.headerSize;
21
- const block = parseBlockHeader(data, pos);
22
- pos += 3;
23
- const blockContent = data.subarray(pos, pos + block.blockSize);
24
- const { header: litHeader, dataOffset } = parseLiteralsSectionHeader(blockContent, 0);
25
- expect(litHeader.blockType).toBe(0); // Raw literals for this fixture.
26
- const literals = decodeRawLiterals(blockContent, dataOffset, litHeader.regeneratedSize);
27
- const litBytesConsumed = litHeader.headerSize + litHeader.regeneratedSize;
28
- const seq = decodeSequences(blockContent, litBytesConsumed, block.blockSize - litBytesConsumed, null);
29
- expect(seq.sequences).toEqual([{ literalsLength: 12, offset: 15, matchLength: 108 }]);
30
- const output = executeSequences(literals, seq.sequences, header.windowSize, [1, 4, 8]);
31
- expect(output.length).toBe(120);
32
- expect(new TextDecoder().decode(output)).toBe('hello world hello world hello world hello world hello world hello world hello world hello world hello world hello world ');
33
- });
34
- });
35
- //# sourceMappingURL=sequences.level1.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sequences.level1.test.js","sourceRoot":"","sources":["../../src/decode/sequences.level1.test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,0BAA0B,EAAE,MAAM,eAAe,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,4CAA4C,CAAC,CAAC;AAEvF,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE,CAAC;IACpD,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE,CAAC;QACtE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,IAAI,CACV,yNAAyN,CAC1N,CAAC;YACF,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACzC,IAAI,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC;QAChC,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAC1C,GAAG,IAAI,CAAC,CAAC;QACT,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QAE/D,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,0BAA0B,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACtF,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,iCAAiC;QACtE,MAAM,QAAQ,GAAG,iBAAiB,CAAC,YAAY,EAAE,UAAU,EAAE,SAAS,CAAC,eAAe,CAAC,CAAC;QACxF,MAAM,gBAAgB,GAAG,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC,eAAe,CAAC;QAE1E,MAAM,GAAG,GAAG,eAAe,CAAC,YAAY,EAAE,gBAAgB,EAAE,KAAK,CAAC,SAAS,GAAG,gBAAgB,EAAE,IAAI,CAAC,CAAC;QACtG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAEtF,MAAM,MAAM,GAAG,gBAAgB,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvF,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAC3C,0HAA0H,CAC3H,CAAC;IAAA,CACH,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};