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.
- package/README.md +32 -16
- package/package.json +1 -1
- package/dist/bitstream/bitReader.test.d.ts +0 -1
- package/dist/bitstream/bitReader.test.js +0 -47
- package/dist/bitstream/bitReader.test.js.map +0 -1
- package/dist/bitstream/bitReaderReverse.test.d.ts +0 -1
- package/dist/bitstream/bitReaderReverse.test.js +0 -49
- package/dist/bitstream/bitReaderReverse.test.js.map +0 -1
- package/dist/bitstream/littleEndian.test.d.ts +0 -1
- package/dist/bitstream/littleEndian.test.js +0 -21
- package/dist/bitstream/littleEndian.test.js.map +0 -1
- package/dist/bitstream/varint.test.d.ts +0 -1
- package/dist/bitstream/varint.test.js +0 -25
- package/dist/bitstream/varint.test.js.map +0 -1
- package/dist/decode/block.test.d.ts +0 -1
- package/dist/decode/block.test.js +0 -26
- package/dist/decode/block.test.js.map +0 -1
- package/dist/decode/literals.corruption.test.d.ts +0 -1
- package/dist/decode/literals.corruption.test.js +0 -26
- package/dist/decode/literals.corruption.test.js.map +0 -1
- package/dist/decode/literals.test.d.ts +0 -1
- package/dist/decode/literals.test.js +0 -52
- package/dist/decode/literals.test.js.map +0 -1
- package/dist/decode/reconstruct.test.d.ts +0 -1
- package/dist/decode/reconstruct.test.js +0 -42
- package/dist/decode/reconstruct.test.js.map +0 -1
- package/dist/decode/sequences.corruption.test.d.ts +0 -1
- package/dist/decode/sequences.corruption.test.js +0 -32
- package/dist/decode/sequences.corruption.test.js.map +0 -1
- package/dist/decode/sequences.level1.test.d.ts +0 -1
- package/dist/decode/sequences.level1.test.js +0 -35
- package/dist/decode/sequences.level1.test.js.map +0 -1
- package/dist/dictionary/decoderDictionary.test.d.ts +0 -1
- package/dist/dictionary/decoderDictionary.test.js +0 -87
- package/dist/dictionary/decoderDictionary.test.js.map +0 -1
- package/dist/encode/blockWriter.test.d.ts +0 -1
- package/dist/encode/blockWriter.test.js +0 -31
- package/dist/encode/blockWriter.test.js.map +0 -1
- package/dist/encode/compressedBlock.test.d.ts +0 -1
- package/dist/encode/compressedBlock.test.js +0 -63
- package/dist/encode/compressedBlock.test.js.map +0 -1
- package/dist/encode/frameWriter.test.d.ts +0 -1
- package/dist/encode/frameWriter.test.js +0 -38
- package/dist/encode/frameWriter.test.js.map +0 -1
- package/dist/encode/greedySequences.test.d.ts +0 -1
- package/dist/encode/greedySequences.test.js +0 -33
- package/dist/encode/greedySequences.test.js.map +0 -1
- package/dist/entropy/fse.test.d.ts +0 -1
- package/dist/entropy/fse.test.js +0 -41
- package/dist/entropy/fse.test.js.map +0 -1
- package/dist/entropy/huffman.test.d.ts +0 -1
- package/dist/entropy/huffman.test.js +0 -22
- package/dist/entropy/huffman.test.js.map +0 -1
- package/dist/entropy/weights.test.d.ts +0 -1
- package/dist/entropy/weights.test.js +0 -38
- package/dist/entropy/weights.test.js.map +0 -1
- package/dist/errors.test.d.ts +0 -1
- package/dist/errors.test.js +0 -16
- package/dist/errors.test.js.map +0 -1
- package/dist/frame/checksum.test.d.ts +0 -1
- package/dist/frame/checksum.test.js +0 -28
- package/dist/frame/checksum.test.js.map +0 -1
- package/dist/frame/frameHeader.test.d.ts +0 -1
- package/dist/frame/frameHeader.test.js +0 -83
- package/dist/frame/frameHeader.test.js.map +0 -1
- package/dist/frame/skippable.test.d.ts +0 -1
- package/dist/frame/skippable.test.js +0 -35
- package/dist/frame/skippable.test.js.map +0 -1
- 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
|
-
##
|
|
11
|
-
|
|
12
|
-
- **
|
|
13
|
-
- **
|
|
14
|
-
-
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
- **
|
|
61
|
-
- **
|
|
62
|
-
- **
|
|
63
|
-
- **
|
|
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 +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 {};
|