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
|
@@ -1,87 +0,0 @@
|
|
|
1
|
-
import { spawnSync } from 'node:child_process';
|
|
2
|
-
import { mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
|
|
3
|
-
import { tmpdir } from 'node:os';
|
|
4
|
-
import { join } from 'node:path';
|
|
5
|
-
import { describe, expect, it } from 'vitest';
|
|
6
|
-
import { normalizeDecoderDictionary } from './decoderDictionary.js';
|
|
7
|
-
function hasZstdCli() {
|
|
8
|
-
const result = spawnSync('zstd', ['--version'], { encoding: 'utf8' });
|
|
9
|
-
return result.status === 0;
|
|
10
|
-
}
|
|
11
|
-
describe('normalizeDecoderDictionary', () => {
|
|
12
|
-
it('keeps raw-content dictionary bytes as history prefix', () => {
|
|
13
|
-
const dictionaryBytes = new TextEncoder().encode('alpha beta gamma dictionary content');
|
|
14
|
-
const parsed = normalizeDecoderDictionary(dictionaryBytes);
|
|
15
|
-
expect(parsed.historyPrefix).toEqual(dictionaryBytes);
|
|
16
|
-
expect(parsed.dictionaryId).toBe(null);
|
|
17
|
-
expect(parsed.repOffsets).toEqual([1, 4, 8]);
|
|
18
|
-
expect(parsed.huffmanTable).toBe(null);
|
|
19
|
-
expect(parsed.sequenceTables).toBe(null);
|
|
20
|
-
});
|
|
21
|
-
it('rejects malformed trained dictionaries with truncated entropy tables', () => {
|
|
22
|
-
const malformed = new Uint8Array([
|
|
23
|
-
0x37,
|
|
24
|
-
0xa4,
|
|
25
|
-
0x30,
|
|
26
|
-
0xec, // dictionary magic
|
|
27
|
-
0x01,
|
|
28
|
-
0x00,
|
|
29
|
-
0x00,
|
|
30
|
-
0x00, // dictionary id
|
|
31
|
-
0x82, // direct-weight header: expects 3 nibbles => 2 bytes, but none provided
|
|
32
|
-
]);
|
|
33
|
-
expect(() => normalizeDecoderDictionary(malformed)).toThrow();
|
|
34
|
-
});
|
|
35
|
-
it('parses trained dictionary metadata and content when zstd cli is available', () => {
|
|
36
|
-
if (!hasZstdCli())
|
|
37
|
-
return;
|
|
38
|
-
const tempRoot = mkdtempSync(join(tmpdir(), 'zstdify-dict-parse-'));
|
|
39
|
-
try {
|
|
40
|
-
const dictPath = join(tempRoot, 'trained.dict');
|
|
41
|
-
const sampleTexts = [
|
|
42
|
-
'alpha alpha alpha beta beta gamma gamma delta delta epsilon epsilon zeta zeta',
|
|
43
|
-
'header vertex texture vertex normal normal index index tangent bitangent',
|
|
44
|
-
'compressor dictionary training corpus repeated tokens phrase phrase phrase',
|
|
45
|
-
'mesh primitive material shader pipeline render scene graph transform',
|
|
46
|
-
'packet stream frame header footer checksum block entropy symbols',
|
|
47
|
-
'typescript package monorepo workspace pnpm vitest biome lint check',
|
|
48
|
-
'offset match literal sequence table repeat mode huffman fse decode',
|
|
49
|
-
'browser node runtime buffer array uint8array encoder decoder api',
|
|
50
|
-
];
|
|
51
|
-
const samplePaths = sampleTexts.map((_, index) => join(tempRoot, `sample-${index}.txt`));
|
|
52
|
-
for (const [index, samplePath] of samplePaths.entries()) {
|
|
53
|
-
const sampleText = sampleTexts[index];
|
|
54
|
-
if (sampleText === undefined) {
|
|
55
|
-
throw new Error('Sample text missing');
|
|
56
|
-
}
|
|
57
|
-
writeFileSync(samplePath, sampleText);
|
|
58
|
-
}
|
|
59
|
-
const train = spawnSync('zstd', ['--train', ...samplePaths, '--maxdict=2048', '-o', dictPath, '--quiet'], {
|
|
60
|
-
encoding: null,
|
|
61
|
-
});
|
|
62
|
-
if (train.status !== 0) {
|
|
63
|
-
throw new Error(`zstd dictionary training failed: ${train.stderr?.toString() ?? 'unknown error'}`);
|
|
64
|
-
}
|
|
65
|
-
const dictionaryBytes = new Uint8Array(readFileSync(dictPath));
|
|
66
|
-
const parsed = normalizeDecoderDictionary(dictionaryBytes);
|
|
67
|
-
const dictIdFromHeader = (dictionaryBytes[4] ?? 0) |
|
|
68
|
-
((dictionaryBytes[5] ?? 0) << 8) |
|
|
69
|
-
((dictionaryBytes[6] ?? 0) << 16) |
|
|
70
|
-
((dictionaryBytes[7] ?? 0) << 24);
|
|
71
|
-
expect(parsed.dictionaryId).toBe(dictIdFromHeader >>> 0);
|
|
72
|
-
expect(parsed.historyPrefix.length).toBeGreaterThan(0);
|
|
73
|
-
expect(parsed.repOffsets[0]).toBeGreaterThan(0);
|
|
74
|
-
expect(parsed.repOffsets[1]).toBeGreaterThan(0);
|
|
75
|
-
expect(parsed.repOffsets[2]).toBeGreaterThan(0);
|
|
76
|
-
expect(parsed.repOffsets[0]).toBeLessThanOrEqual(parsed.historyPrefix.length);
|
|
77
|
-
expect(parsed.repOffsets[1]).toBeLessThanOrEqual(parsed.historyPrefix.length);
|
|
78
|
-
expect(parsed.repOffsets[2]).toBeLessThanOrEqual(parsed.historyPrefix.length);
|
|
79
|
-
expect(parsed.huffmanTable).not.toBe(null);
|
|
80
|
-
expect(parsed.sequenceTables).not.toBe(null);
|
|
81
|
-
}
|
|
82
|
-
finally {
|
|
83
|
-
rmSync(tempRoot, { recursive: true, force: true });
|
|
84
|
-
}
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
//# sourceMappingURL=decoderDictionary.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"decoderDictionary.test.js","sourceRoot":"","sources":["../../src/dictionary/decoderDictionary.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { writeRawBlock, writeRLEBlock } from './blockWriter.js';
|
|
3
|
-
describe('blockWriter', () => {
|
|
4
|
-
it('writeRawBlock produces correct header and payload', () => {
|
|
5
|
-
const data = new Uint8Array([0x61, 0x62, 0x63]);
|
|
6
|
-
const block = writeRawBlock(data, 0, 3, true);
|
|
7
|
-
expect(block.length).toBe(6);
|
|
8
|
-
// Block header: last=1, type=0 (raw), size=3 -> (1 | 0<<1 | 3<<3) = 25 LE = 19 00 00
|
|
9
|
-
expect(block[0]).toBe(25);
|
|
10
|
-
expect(block[1]).toBe(0);
|
|
11
|
-
expect(block[2]).toBe(0);
|
|
12
|
-
expect(block[3]).toBe(0x61);
|
|
13
|
-
expect(block[4]).toBe(0x62);
|
|
14
|
-
expect(block[5]).toBe(0x63);
|
|
15
|
-
});
|
|
16
|
-
it('writeRawBlock with last=false sets last bit 0', () => {
|
|
17
|
-
const data = new Uint8Array([1]);
|
|
18
|
-
const block = writeRawBlock(data, 0, 1, false);
|
|
19
|
-
expect(block[0]).toBe(1 << 3); // last=0, type=0, size=1
|
|
20
|
-
});
|
|
21
|
-
it('writeRLEBlock produces correct header and single byte', () => {
|
|
22
|
-
const block = writeRLEBlock(0x61, 10, true);
|
|
23
|
-
expect(block.length).toBe(4);
|
|
24
|
-
// last=1, type=1 (RLE), size=10 -> (1 | 2 | 80) = 83 LE = 53 00 00
|
|
25
|
-
expect(block[0]).toBe(83);
|
|
26
|
-
expect(block[1]).toBe(0);
|
|
27
|
-
expect(block[2]).toBe(0);
|
|
28
|
-
expect(block[3]).toBe(0x61);
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
//# sourceMappingURL=blockWriter.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"blockWriter.test.js","sourceRoot":"","sources":["../../src/encode/blockWriter.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEhE,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC;IAC5B,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,qFAAqF;QACrF,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAAA,CAC7B,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE,CAAC;QACxD,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAC/C,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,yBAAyB;IAA1B,CAC/B,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE,CAAC;QAChE,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,mEAAmE;QACnE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAAA,CAC7B,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { compress } from '../compress.js';
|
|
3
|
-
import { parseLiteralsSectionHeader } from '../decode/literals.js';
|
|
4
|
-
import { decompress } from '../decompress.js';
|
|
5
|
-
import { parseFrameHeader } from '../frame/frameHeader.js';
|
|
6
|
-
import { buildCompressedBlockPayload, writeCompressedBlock } from './compressedBlock.js';
|
|
7
|
-
import { buildGreedySequences } from './greedySequences.js';
|
|
8
|
-
describe('compressed block encoder', () => {
|
|
9
|
-
it('builds decodable compressed-block payload for single-sequence case', () => {
|
|
10
|
-
const input = new TextEncoder().encode('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa');
|
|
11
|
-
const plan = buildGreedySequences(input);
|
|
12
|
-
expect(plan.sequences.length).toBeGreaterThan(0);
|
|
13
|
-
const payload = buildCompressedBlockPayload(plan.literals, plan.sequences);
|
|
14
|
-
expect(payload).not.toBeNull();
|
|
15
|
-
const frameHeader = new Uint8Array([0x28, 0xb5, 0x2f, 0xfd, 0x20, input.length & 0xff]);
|
|
16
|
-
const block = writeCompressedBlock(payload, true);
|
|
17
|
-
const frame = new Uint8Array(frameHeader.length + block.length);
|
|
18
|
-
frame.set(frameHeader, 0);
|
|
19
|
-
frame.set(block, frameHeader.length);
|
|
20
|
-
expect(decompress(frame)).toEqual(input);
|
|
21
|
-
});
|
|
22
|
-
it('compress(level=3) emits compressed block when beneficial', () => {
|
|
23
|
-
const input = new TextEncoder().encode('abcdabcdabcdabcdabcdabcdabcdabcd');
|
|
24
|
-
const encoded = compress(input, { level: 3 });
|
|
25
|
-
const header = parseFrameHeader(encoded, 4);
|
|
26
|
-
const blockHeaderOffset = 4 + header.headerSize;
|
|
27
|
-
const blockType = ((encoded[blockHeaderOffset] ?? 0) >> 1) & 0x3;
|
|
28
|
-
expect(blockType).toBe(2);
|
|
29
|
-
expect(decompress(encoded)).toEqual(input);
|
|
30
|
-
});
|
|
31
|
-
it('encodes multi-sequence section using non-RLE modes', () => {
|
|
32
|
-
const input = new TextEncoder().encode('abcdabcdXabcdabcdYabcdabcdZabcdabcd');
|
|
33
|
-
const plan = buildGreedySequences(input);
|
|
34
|
-
expect(plan.sequences.length).toBeGreaterThan(1);
|
|
35
|
-
const payload = buildCompressedBlockPayload(plan.literals, plan.sequences);
|
|
36
|
-
expect(payload).not.toBeNull();
|
|
37
|
-
const { header } = parseLiteralsSectionHeader(payload, 0);
|
|
38
|
-
const litBytes = header.headerSize + (header.compressedSize ?? header.regeneratedSize);
|
|
39
|
-
const numSeq = payload[litBytes] ?? 0;
|
|
40
|
-
expect(numSeq).toBe(plan.sequences.length);
|
|
41
|
-
const modes = payload[litBytes + 1] ?? 0xff;
|
|
42
|
-
expect(modes).toBe(0); // predefined, i.e. non-RLE modes
|
|
43
|
-
const frameHeader = new Uint8Array([0x28, 0xb5, 0x2f, 0xfd, 0x20, input.length & 0xff]);
|
|
44
|
-
const block = writeCompressedBlock(payload, true);
|
|
45
|
-
const frame = new Uint8Array(frameHeader.length + block.length);
|
|
46
|
-
frame.set(frameHeader, 0);
|
|
47
|
-
frame.set(block, frameHeader.length);
|
|
48
|
-
expect(decompress(frame)).toEqual(input);
|
|
49
|
-
});
|
|
50
|
-
it('encodes multi-symbol compressed literals for bounded symbol sets', () => {
|
|
51
|
-
const literals = new Uint8Array(40);
|
|
52
|
-
for (let i = 0; i < literals.length; i++) {
|
|
53
|
-
literals[i] = (i & 1);
|
|
54
|
-
}
|
|
55
|
-
const payload = buildCompressedBlockPayload(literals, [
|
|
56
|
-
{ literalsLength: literals.length, offset: 1, matchLength: 3 },
|
|
57
|
-
]);
|
|
58
|
-
expect(payload).not.toBeNull();
|
|
59
|
-
const { header } = parseLiteralsSectionHeader(payload, 0);
|
|
60
|
-
expect([0, 2]).toContain(header.blockType);
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
//# sourceMappingURL=compressedBlock.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"compressedBlock.test.js","sourceRoot":"","sources":["../../src/encode/compressedBlock.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,2BAA2B,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE,CAAC;IACzC,EAAE,CAAC,oEAAoE,EAAE,GAAG,EAAE,CAAC;QAC7E,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC;QAC3E,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,2BAA2B,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3E,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;QACxF,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAQ,EAAE,IAAI,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAChE,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC1B,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAAA,CAC1C,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE,CAAC;QACnE,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,kCAAkC,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC5C,MAAM,iBAAiB,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC;QAChD,MAAM,SAAS,GAAG,CAAC,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC;QACjE,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAAA,CAC5C,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE,CAAC;QAC7D,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,qCAAqC,CAAC,CAAC;QAC9E,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,2BAA2B,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3E,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,EAAE,MAAM,EAAE,GAAG,0BAA0B,CAAC,OAAQ,EAAE,CAAC,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,GAAG,CAAC,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,eAAe,CAAC,CAAC;QACvF,MAAM,MAAM,GAAG,OAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,OAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,iCAAiC;QACxD,MAAM,WAAW,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;QACxF,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAQ,EAAE,IAAI,CAAC,CAAC;QACnD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAChE,KAAK,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC1B,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAAA,CAC1C,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE,CAAC;QAC3E,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAU,CAAC;QACjC,CAAC;QACD,MAAM,OAAO,GAAG,2BAA2B,CAAC,QAAQ,EAAE;YACpD,EAAE,cAAc,EAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE;SAC/D,CAAC,CAAC;QACH,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC/B,MAAM,EAAE,MAAM,EAAE,GAAG,0BAA0B,CAAC,OAAQ,EAAE,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAAA,CAC5C,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { writeFrameHeader } from './frameWriter.js';
|
|
3
|
-
const ZSTD_MAGIC_LE = [0x28, 0xb5, 0x2f, 0xfd];
|
|
4
|
-
describe('frameWriter', () => {
|
|
5
|
-
it('writeFrameHeader writes magic and 1-byte content size for small content', () => {
|
|
6
|
-
const h = writeFrameHeader(100, false);
|
|
7
|
-
expect(h.length).toBeGreaterThanOrEqual(6);
|
|
8
|
-
expect(h[0]).toBe(ZSTD_MAGIC_LE[0]);
|
|
9
|
-
expect(h[1]).toBe(ZSTD_MAGIC_LE[1]);
|
|
10
|
-
expect(h[2]).toBe(ZSTD_MAGIC_LE[2]);
|
|
11
|
-
expect(h[3]).toBe(ZSTD_MAGIC_LE[3]);
|
|
12
|
-
// FHD: single segment (1<<5), content size flag 0 (1 byte), no checksum
|
|
13
|
-
expect(h[4]).toBe(1 << 5);
|
|
14
|
-
expect(h[5]).toBe(100);
|
|
15
|
-
});
|
|
16
|
-
it('writeFrameHeader uses 2-byte content size for medium content', () => {
|
|
17
|
-
const h = writeFrameHeader(256 + 100, false);
|
|
18
|
-
expect(h.length).toBeGreaterThanOrEqual(7);
|
|
19
|
-
expect(h[4]).toBe((1 << 6) | (1 << 5));
|
|
20
|
-
// 256+100-256 = 100, LE
|
|
21
|
-
expect(h[5]).toBe(100);
|
|
22
|
-
expect(h[6]).toBe(0);
|
|
23
|
-
});
|
|
24
|
-
it('writeFrameHeader uses 4-byte content size for large content', () => {
|
|
25
|
-
const h = writeFrameHeader(300_000, false);
|
|
26
|
-
expect(h.length).toBeGreaterThanOrEqual(9);
|
|
27
|
-
expect(h[4]).toBe((2 << 6) | (1 << 5));
|
|
28
|
-
expect(h[5]).toBe(300_000 & 0xff);
|
|
29
|
-
expect(h[6]).toBe((300_000 >> 8) & 0xff);
|
|
30
|
-
expect(h[7]).toBe((300_000 >> 16) & 0xff);
|
|
31
|
-
expect(h[8]).toBe((300_000 >> 24) & 0xff);
|
|
32
|
-
});
|
|
33
|
-
it('writeFrameHeader sets checksum flag when hasChecksum true', () => {
|
|
34
|
-
const h = writeFrameHeader(5, true);
|
|
35
|
-
expect(h[4]).toBe((1 << 5) | (1 << 2));
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
//# sourceMappingURL=frameWriter.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"frameWriter.test.js","sourceRoot":"","sources":["../../src/encode/frameWriter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { executeSequences } from '../decode/reconstruct.js';
|
|
3
|
-
import { buildGreedySequences } from './greedySequences.js';
|
|
4
|
-
describe('buildGreedySequences', () => {
|
|
5
|
-
it('reconstructs repetitive text via generated sequences', () => {
|
|
6
|
-
const input = new TextEncoder().encode('hello world hello world hello world hello world hello world ');
|
|
7
|
-
const plan = buildGreedySequences(input);
|
|
8
|
-
const output = executeSequences(plan.literals, plan.sequences, 128 * 1024);
|
|
9
|
-
expect(output).toEqual(input);
|
|
10
|
-
expect(plan.sequences.length).toBeGreaterThan(0);
|
|
11
|
-
});
|
|
12
|
-
it('reconstructs binary payload via generated sequences', () => {
|
|
13
|
-
const input = new Uint8Array(4096);
|
|
14
|
-
for (let i = 0; i < input.length; i++) {
|
|
15
|
-
input[i] = i & 0xff;
|
|
16
|
-
}
|
|
17
|
-
const doubled = new Uint8Array(input.length * 2);
|
|
18
|
-
doubled.set(input, 0);
|
|
19
|
-
doubled.set(input, input.length);
|
|
20
|
-
const plan = buildGreedySequences(doubled);
|
|
21
|
-
const output = executeSequences(plan.literals, plan.sequences, 128 * 1024);
|
|
22
|
-
expect(output).toEqual(doubled);
|
|
23
|
-
expect(plan.sequences.length).toBeGreaterThan(0);
|
|
24
|
-
});
|
|
25
|
-
it('returns literals-only result when no matches exist', () => {
|
|
26
|
-
const input = new TextEncoder().encode('abcdefghijklmnopqrstuvwxyz');
|
|
27
|
-
const plan = buildGreedySequences(input);
|
|
28
|
-
expect(plan.sequences).toEqual([]);
|
|
29
|
-
expect(plan.literals).toEqual(input);
|
|
30
|
-
expect(plan.trailingLiterals).toBe(input.length);
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
//# sourceMappingURL=greedySequences.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"greedySequences.test.js","sourceRoot":"","sources":["../../src/encode/greedySequences.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE,CAAC;IACrC,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE,CAAC;QAC/D,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,8DAA8D,CAAC,CAAC;QACvG,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAAA,CAClD,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE,CAAC;QAC9D,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QACtB,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACtB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;QAC3E,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAAA,CAClD,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE,CAAC;QAC7D,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrC,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAAA,CAClD,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/entropy/fse.test.js
DELETED
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { BitReaderReverse } from '../bitstream/bitReaderReverse.js';
|
|
3
|
-
import { buildFSEDecodeTable, decodeFSESymbol, readNCount } from './fse.js';
|
|
4
|
-
import { LITERALS_LENGTH_DEFAULT_DISTRIBUTION, LITERALS_LENGTH_TABLE_LOG } from './predefined.js';
|
|
5
|
-
describe('FSE', () => {
|
|
6
|
-
it('readNCount decodes 2-symbol distribution', () => {
|
|
7
|
-
const result = readNCount(new Uint8Array([0x10, 0x3f, 0x01]), 0, 255, 12);
|
|
8
|
-
expect(result.tableLog).toBe(5);
|
|
9
|
-
expect(result.maxSymbolValue).toBe(1);
|
|
10
|
-
expect(result.normalizedCounter[0]).toBe(16);
|
|
11
|
-
expect(result.normalizedCounter[1]).toBe(16);
|
|
12
|
-
expect(result.bytesRead).toBe(2);
|
|
13
|
-
});
|
|
14
|
-
it('readNCount matches short-buffer and padded-buffer parsing', () => {
|
|
15
|
-
const short = new Uint8Array([0x10, 0x3f, 0x01]);
|
|
16
|
-
const padded = new Uint8Array([0x10, 0x3f, 0x01, 0, 0, 0, 0, 0]);
|
|
17
|
-
const a = readNCount(short, 0, 255, 12);
|
|
18
|
-
const b = readNCount(padded, 0, 255, 12);
|
|
19
|
-
expect(a.tableLog).toBe(b.tableLog);
|
|
20
|
-
expect(a.maxSymbolValue).toBe(b.maxSymbolValue);
|
|
21
|
-
expect(a.bytesRead).toBe(2);
|
|
22
|
-
expect(b.bytesRead).toBe(2);
|
|
23
|
-
expect(a.normalizedCounter.slice(0, 8)).toEqual(b.normalizedCounter.slice(0, 8));
|
|
24
|
-
});
|
|
25
|
-
it('buildFSEDecodeTable from predefined literals length', () => {
|
|
26
|
-
const table = buildFSEDecodeTable(LITERALS_LENGTH_DEFAULT_DISTRIBUTION, LITERALS_LENGTH_TABLE_LOG);
|
|
27
|
-
expect(table.length).toBe(1 << LITERALS_LENGTH_TABLE_LOG);
|
|
28
|
-
expect(table.every((r) => r.symbol >= 0 && r.numBits >= 0)).toBe(true);
|
|
29
|
-
});
|
|
30
|
-
it('decodeFSESymbol updates state', () => {
|
|
31
|
-
const table = buildFSEDecodeTable(LITERALS_LENGTH_DEFAULT_DISTRIBUTION, LITERALS_LENGTH_TABLE_LOG);
|
|
32
|
-
const data = new Uint8Array([0x55, 0xaa, 0x01]);
|
|
33
|
-
const reader = new BitReaderReverse(data, 0, 3);
|
|
34
|
-
reader.skipPadding();
|
|
35
|
-
const state = { value: 0 };
|
|
36
|
-
const symbol = decodeFSESymbol(table, LITERALS_LENGTH_TABLE_LOG, reader, state);
|
|
37
|
-
expect(typeof symbol).toBe('number');
|
|
38
|
-
expect(state.value).toBeGreaterThanOrEqual(0);
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
//# sourceMappingURL=fse.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fse.test.js","sourceRoot":"","sources":["../../src/entropy/fse.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { BitReaderReverse } from '../bitstream/bitReaderReverse.js';
|
|
3
|
-
import { buildHuffmanDecodeTable, decodeHuffmanSymbol } from './huffman.js';
|
|
4
|
-
describe('Huffman', () => {
|
|
5
|
-
it('builds canonical decode table in rank order', () => {
|
|
6
|
-
const table = buildHuffmanDecodeTable([1, 2, 2], 2);
|
|
7
|
-
expect(table.map((r) => r?.symbol)).toEqual([1, 2, 0, 0]);
|
|
8
|
-
expect(table.map((r) => r?.numBits)).toEqual([2, 2, 1, 1]);
|
|
9
|
-
});
|
|
10
|
-
it('decode consumes symbol bit length (not max bits)', () => {
|
|
11
|
-
const table = buildHuffmanDecodeTable([1, 2, 2], 2);
|
|
12
|
-
// Reverse bitstream payload is first byte; last byte is only the end-mark.
|
|
13
|
-
// For first byte 0b10100000, the first 2-bit peek is binary 10 (index 2),
|
|
14
|
-
// whose row has numBits=1, so one bit must remain unread.
|
|
15
|
-
const reader = new BitReaderReverse(new Uint8Array([0xa0, 0x01]), 0, 2);
|
|
16
|
-
reader.skipPadding();
|
|
17
|
-
const symbol = decodeHuffmanSymbol(table, 2, reader);
|
|
18
|
-
expect(symbol).toBe(0);
|
|
19
|
-
expect(reader.readBits(1)).toBe(0);
|
|
20
|
-
});
|
|
21
|
-
});
|
|
22
|
-
//# sourceMappingURL=huffman.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"huffman.test.js","sourceRoot":"","sources":["../../src/entropy/huffman.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,uBAAuB,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAE5E,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC;IACxB,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAAA,CAC5D,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpD,2EAA2E;QAC3E,0EAA0E;QAC1E,0DAA0D;QAC1D,MAAM,MAAM,GAAG,IAAI,gBAAgB,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACxE,MAAM,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAAA,CACpC,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { readWeightsDirect, readWeightsFSE } from './weights.js';
|
|
3
|
-
describe('weights', () => {
|
|
4
|
-
describe('readWeightsDirect', () => {
|
|
5
|
-
it('throws when data is truncated', () => {
|
|
6
|
-
// numWeights=4 -> bytesNeeded=2; buffer length 1
|
|
7
|
-
expect(() => readWeightsDirect(new Uint8Array([0x00]), 0, 4)).toThrow(/Huffman weights truncated/i);
|
|
8
|
-
});
|
|
9
|
-
it('returns weights for valid direct input', () => {
|
|
10
|
-
// 2 weights in 1 byte: high nibble and low nibble
|
|
11
|
-
const { weights, bytesRead } = readWeightsDirect(new Uint8Array([0x12]), 0, 2);
|
|
12
|
-
expect(weights).toEqual([1, 2]);
|
|
13
|
-
expect(bytesRead).toBe(1);
|
|
14
|
-
});
|
|
15
|
-
});
|
|
16
|
-
describe('readWeightsFSE', () => {
|
|
17
|
-
it('throws when compressed size < 2', () => {
|
|
18
|
-
expect(() => readWeightsFSE(new Uint8Array(10), 0, 1)).toThrow(/FSE-compressed weights: need at least 2 bytes/i);
|
|
19
|
-
});
|
|
20
|
-
it('throws when input is truncated', () => {
|
|
21
|
-
expect(() => readWeightsFSE(new Uint8Array([0x00, 0x00]), 0, 5)).toThrow(/FSE-compressed weights truncated/i);
|
|
22
|
-
});
|
|
23
|
-
it('throws when there is no stream after header', () => {
|
|
24
|
-
// From fse.test: [0x10, 0x3f, 0x01] gives readNCount bytesRead=2. Use compressedSize=2
|
|
25
|
-
// so streamLength = 2 - 2 = 0 (no stream bytes after header).
|
|
26
|
-
const buf = new Uint8Array([0x10, 0x3f]);
|
|
27
|
-
expect(() => readWeightsFSE(buf, 0, 2)).toThrow(/no stream after header/i);
|
|
28
|
-
});
|
|
29
|
-
it('throws when stream has invalid end marker (last byte zero)', () => {
|
|
30
|
-
// 3 bytes: 2-byte ncount header + 1 stream byte. If stream last byte is 0, invalid.
|
|
31
|
-
// We need readNCount to read exactly 2 bytes. Example from fse.test: [0x10, 0x3f, 0x01] gives bytesRead 2.
|
|
32
|
-
// So [0x10, 0x3f, 0x00] = 2 byte header + stream [0x00], lastByte=0 -> invalid end marker
|
|
33
|
-
const buf = new Uint8Array([0x10, 0x3f, 0x00]);
|
|
34
|
-
expect(() => readWeightsFSE(buf, 0, 3)).toThrow(/invalid end marker/i);
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
//# sourceMappingURL=weights.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"weights.test.js","sourceRoot":"","sources":["../../src/entropy/weights.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEjE,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC;IACxB,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC;QAClC,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE,CAAC;YACxC,iDAAiD;YACjD,MAAM,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;QAAA,CACrG,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE,CAAC;YACjD,kDAAkD;YAClD,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,iBAAiB,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/E,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAChC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAA,CAC3B,CAAC,CAAC;IAAA,CACJ,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC;QAC/B,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE,CAAC;YAC1C,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,gDAAgD,CAAC,CAAC;QAAA,CAClH,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE,CAAC;YACzC,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,mCAAmC,CAAC,CAAC;QAAA,CAC/G,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE,CAAC;YACtD,uFAAuF;YACvF,8DAA8D;YAC9D,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YACzC,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAAA,CAC5E,CAAC,CAAC;QAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE,CAAC;YACrE,oFAAoF;YACpF,2GAA2G;YAC3G,0FAA0F;YAC1F,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;QAAA,CACxE,CAAC,CAAC;IAAA,CACJ,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
|
package/dist/errors.test.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
package/dist/errors.test.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { ZstdError } from './errors.js';
|
|
3
|
-
describe('ZstdError', () => {
|
|
4
|
-
it('has correct name, message, and code', () => {
|
|
5
|
-
const e = new ZstdError('test message', 'corruption_detected');
|
|
6
|
-
expect(e.name).toBe('ZstdError');
|
|
7
|
-
expect(e.message).toBe('test message');
|
|
8
|
-
expect(e.code).toBe('corruption_detected');
|
|
9
|
-
});
|
|
10
|
-
it('is instanceof Error and ZstdError', () => {
|
|
11
|
-
const e = new ZstdError('x', 'parameter_unsupported');
|
|
12
|
-
expect(e).toBeInstanceOf(Error);
|
|
13
|
-
expect(e).toBeInstanceOf(ZstdError);
|
|
14
|
-
});
|
|
15
|
-
});
|
|
16
|
-
//# sourceMappingURL=errors.test.js.map
|
package/dist/errors.test.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../src/errors.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC;IAC1B,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE,CAAC;QAC9C,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC,cAAc,EAAE,qBAAqB,CAAC,CAAC;QAC/D,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACvC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAAA,CAC5C,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC,GAAG,EAAE,uBAAuB,CAAC,CAAC;QACtD,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAChC,MAAM,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAAA,CACrC,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { computeContentChecksum32, validateContentChecksum, xxh64 } from './checksum.js';
|
|
3
|
-
describe('xxh64', () => {
|
|
4
|
-
it('hashes empty input', () => {
|
|
5
|
-
const h = xxh64(new Uint8Array(0));
|
|
6
|
-
expect(typeof h).toBe('bigint');
|
|
7
|
-
expect(h).toBeGreaterThanOrEqual(0n);
|
|
8
|
-
});
|
|
9
|
-
it('hashes consistently', () => {
|
|
10
|
-
const data = new TextEncoder().encode('hello');
|
|
11
|
-
const h1 = xxh64(data);
|
|
12
|
-
const h2 = xxh64(data);
|
|
13
|
-
expect(h1).toBe(h2);
|
|
14
|
-
expect(typeof h1).toBe('bigint');
|
|
15
|
-
});
|
|
16
|
-
it('validateContentChecksum matches low 32 bits', () => {
|
|
17
|
-
const data = new TextEncoder().encode('test');
|
|
18
|
-
const hash = xxh64(data);
|
|
19
|
-
const low32 = Number(hash & 0xffffffffn);
|
|
20
|
-
expect(validateContentChecksum(data, low32)).toBe(true);
|
|
21
|
-
expect(validateContentChecksum(data, low32 + 1)).toBe(false);
|
|
22
|
-
});
|
|
23
|
-
it('matches zstd checksum vector', () => {
|
|
24
|
-
const data = new TextEncoder().encode('checksum interoperability payload');
|
|
25
|
-
expect(computeContentChecksum32(data)).toBe(0x1be3054d);
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
//# sourceMappingURL=checksum.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"checksum.test.js","sourceRoot":"","sources":["../../src/frame/checksum.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEzF,QAAQ,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC;IACtB,EAAE,CAAC,oBAAoB,EAAE,GAAG,EAAE,CAAC;QAC7B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,MAAM,CAAC,CAAC,CAAC,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IAAA,CACtC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QACvB,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QACvB,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAAA,CAClC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,GAAG,WAAW,CAAC,CAAC;QACzC,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAAA,CAC9D,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,mCAAmC,CAAC,CAAC;QAC3E,MAAM,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAAA,CACzD,CAAC,CAAC;AAAA,CACJ,CAAC,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { parseZstdFrame } from './frameHeader.js';
|
|
3
|
-
describe('frameHeader', () => {
|
|
4
|
-
it('parses minimal frame header (no window, no content size, no dict)', () => {
|
|
5
|
-
// FHD: 0x00 = FCS=0, single=0, unused=0, reserved=0, checksum=0, dict=0
|
|
6
|
-
const data = new Uint8Array([
|
|
7
|
-
0x28,
|
|
8
|
-
0xb5,
|
|
9
|
-
0x2f,
|
|
10
|
-
0xfd, // magic
|
|
11
|
-
0x00,
|
|
12
|
-
0x00, // FHD=0, WD: exponent=0 (windowLog=10), mantissa=0 -> 1KB
|
|
13
|
-
]);
|
|
14
|
-
const { header } = parseZstdFrame(data, 0);
|
|
15
|
-
expect(header.headerSize).toBe(2); // 1 FHD + 1 WD
|
|
16
|
-
expect(header.windowSize).toBe(1024);
|
|
17
|
-
expect(header.contentSize).toBe(null);
|
|
18
|
-
expect(header.hasContentChecksum).toBe(false);
|
|
19
|
-
expect(header.dictionaryId).toBe(null);
|
|
20
|
-
});
|
|
21
|
-
it('rejects invalid magic', () => {
|
|
22
|
-
const data = new Uint8Array([0, 0, 0, 0]);
|
|
23
|
-
expect(() => parseZstdFrame(data, 0)).toThrow('Invalid zstd magic');
|
|
24
|
-
});
|
|
25
|
-
it('rejects reserved bit set', () => {
|
|
26
|
-
const data = new Uint8Array([
|
|
27
|
-
0x28,
|
|
28
|
-
0xb5,
|
|
29
|
-
0x2f,
|
|
30
|
-
0xfd, // magic
|
|
31
|
-
0x08,
|
|
32
|
-
0x40, // FHD with reserved bit (bit 3) set
|
|
33
|
-
]);
|
|
34
|
-
expect(() => parseZstdFrame(data, 0)).toThrow('Reserved bit');
|
|
35
|
-
});
|
|
36
|
-
it('parses single-segment frame with 1-byte content size and checksum', () => {
|
|
37
|
-
// FHD: FCS=0 (1 byte), single=1, checksum=1, dict=0 -> 0x24. Then 1 byte content size = 5
|
|
38
|
-
const data = new Uint8Array([0x28, 0xb5, 0x2f, 0xfd, 0x24, 0x05]);
|
|
39
|
-
const { header } = parseZstdFrame(data, 0);
|
|
40
|
-
expect(header.singleSegment).toBe(true);
|
|
41
|
-
expect(header.contentSize).toBe(5);
|
|
42
|
-
expect(header.hasContentChecksum).toBe(true);
|
|
43
|
-
expect(header.headerSize).toBe(2);
|
|
44
|
-
});
|
|
45
|
-
it('parses frame with 2-byte content size', () => {
|
|
46
|
-
// FHD: FCS=1 (2 bytes), single=1, dict=0 -> 0x60. Single-segment skips WD, so FCS starts immediately.
|
|
47
|
-
const data = new Uint8Array([0x28, 0xb5, 0x2f, 0xfd, 0x60, 0x01, 0x00]);
|
|
48
|
-
const { header } = parseZstdFrame(data, 0);
|
|
49
|
-
expect(header.singleSegment).toBe(true);
|
|
50
|
-
expect(header.contentSize).toBe(257);
|
|
51
|
-
});
|
|
52
|
-
it('parses frame with dictionary ID (1 byte)', () => {
|
|
53
|
-
// FHD: FCS=0, single=1, dict=1 -> 0x21. Per spec: [Dict_ID] then [FCS]; so 1 byte dict ID = 42, then 1 byte FCS = 0.
|
|
54
|
-
const data = new Uint8Array([0x28, 0xb5, 0x2f, 0xfd, 0x21, 0x2a, 0x00]);
|
|
55
|
-
const { header } = parseZstdFrame(data, 0);
|
|
56
|
-
expect(header.dictionaryId).toBe(0x2a);
|
|
57
|
-
});
|
|
58
|
-
it('parses frame with dictionary ID 0 as null', () => {
|
|
59
|
-
// dict=1, 1 byte dict ID = 0; per spec dictionary ID 0 means "no dictionary"
|
|
60
|
-
const data = new Uint8Array([0x28, 0xb5, 0x2f, 0xfd, 0x21, 0x00, 0x00]);
|
|
61
|
-
const { header } = parseZstdFrame(data, 0);
|
|
62
|
-
expect(header.dictionaryId).toBe(null);
|
|
63
|
-
});
|
|
64
|
-
it('parses frame with 4-byte content size', () => {
|
|
65
|
-
// FHD: bits 7-6=FCS(2)=4 bytes, bit 5=single=1, bits 1-0=dict=0 -> 0xA0. Then 4 bytes LE = 0x10000.
|
|
66
|
-
const data = new Uint8Array([0x28, 0xb5, 0x2f, 0xfd, 0xa0, 0x00, 0x00, 0x01, 0x00]);
|
|
67
|
-
const { header } = parseZstdFrame(data, 0);
|
|
68
|
-
expect(header.contentSize).toBe(0x10000);
|
|
69
|
-
expect(header.headerSize).toBe(5);
|
|
70
|
-
});
|
|
71
|
-
it('parses frame with 8-byte content size', () => {
|
|
72
|
-
// FHD: bits 7-6=FCS(3)=8 bytes, bit 5=single=1 -> 0xE0. Then 8 bytes LE = 2^32.
|
|
73
|
-
const data = new Uint8Array([0x28, 0xb5, 0x2f, 0xfd, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00]);
|
|
74
|
-
const { header } = parseZstdFrame(data, 0);
|
|
75
|
-
expect(header.contentSize).toBe(0x1_0000_0000);
|
|
76
|
-
expect(header.headerSize).toBe(9);
|
|
77
|
-
});
|
|
78
|
-
it('rejects input too short for magic', () => {
|
|
79
|
-
const data = new Uint8Array([0x28, 0xb5, 0x2f]);
|
|
80
|
-
expect(() => parseZstdFrame(data, 0)).toThrow(/too short|magic/i);
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
//# sourceMappingURL=frameHeader.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"frameHeader.test.js","sourceRoot":"","sources":["../../src/frame/frameHeader.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|