zstdify 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +95 -0
- package/dist/bitstream/bitReader.d.ts +26 -0
- package/dist/bitstream/bitReader.js +86 -0
- package/dist/bitstream/bitReader.js.map +1 -0
- package/dist/bitstream/bitReader.test.d.ts +1 -0
- package/dist/bitstream/bitReader.test.js +47 -0
- package/dist/bitstream/bitReader.test.js.map +1 -0
- package/dist/bitstream/bitReaderReverse.d.ts +23 -0
- package/dist/bitstream/bitReaderReverse.js +84 -0
- package/dist/bitstream/bitReaderReverse.js.map +1 -0
- package/dist/bitstream/bitReaderReverse.test.d.ts +1 -0
- package/dist/bitstream/bitReaderReverse.test.js +49 -0
- package/dist/bitstream/bitReaderReverse.test.js.map +1 -0
- package/dist/bitstream/bitWriter.d.ts +15 -0
- package/dist/bitstream/bitWriter.js +47 -0
- package/dist/bitstream/bitWriter.js.map +1 -0
- package/dist/bitstream/index.d.ts +4 -0
- package/dist/bitstream/index.js +5 -0
- package/dist/bitstream/index.js.map +1 -0
- package/dist/bitstream/littleEndian.d.ts +7 -0
- package/dist/bitstream/littleEndian.js +45 -0
- package/dist/bitstream/littleEndian.js.map +1 -0
- package/dist/bitstream/littleEndian.test.d.ts +1 -0
- package/dist/bitstream/littleEndian.test.js +21 -0
- package/dist/bitstream/littleEndian.test.js.map +1 -0
- package/dist/bitstream/varint.d.ts +9 -0
- package/dist/bitstream/varint.js +40 -0
- package/dist/bitstream/varint.js.map +1 -0
- package/dist/bitstream/varint.test.d.ts +1 -0
- package/dist/bitstream/varint.test.js +25 -0
- package/dist/bitstream/varint.test.js.map +1 -0
- package/dist/compress.d.ts +9 -0
- package/dist/compress.js +74 -0
- package/dist/compress.js.map +1 -0
- package/dist/decode/block.d.ts +11 -0
- package/dist/decode/block.js +28 -0
- package/dist/decode/block.js.map +1 -0
- package/dist/decode/block.test.d.ts +1 -0
- package/dist/decode/block.test.js +26 -0
- package/dist/decode/block.test.js.map +1 -0
- package/dist/decode/decompressFrame.d.ts +9 -0
- package/dist/decode/decompressFrame.js +147 -0
- package/dist/decode/decompressFrame.js.map +1 -0
- package/dist/decode/literals.corruption.test.d.ts +1 -0
- package/dist/decode/literals.corruption.test.js +26 -0
- package/dist/decode/literals.corruption.test.js.map +1 -0
- package/dist/decode/literals.d.ts +49 -0
- package/dist/decode/literals.js +300 -0
- package/dist/decode/literals.js.map +1 -0
- package/dist/decode/literals.test.d.ts +1 -0
- package/dist/decode/literals.test.js +52 -0
- package/dist/decode/literals.test.js.map +1 -0
- package/dist/decode/reconstruct.d.ts +13 -0
- package/dist/decode/reconstruct.js +80 -0
- package/dist/decode/reconstruct.js.map +1 -0
- package/dist/decode/reconstruct.test.d.ts +1 -0
- package/dist/decode/reconstruct.test.js +42 -0
- package/dist/decode/reconstruct.test.js.map +1 -0
- package/dist/decode/sequences.corruption.test.d.ts +1 -0
- package/dist/decode/sequences.corruption.test.js +32 -0
- package/dist/decode/sequences.corruption.test.js.map +1 -0
- package/dist/decode/sequences.d.ts +21 -0
- package/dist/decode/sequences.js +222 -0
- package/dist/decode/sequences.js.map +1 -0
- package/dist/decode/sequences.level1.test.d.ts +1 -0
- package/dist/decode/sequences.level1.test.js +35 -0
- package/dist/decode/sequences.level1.test.js.map +1 -0
- package/dist/decompress.d.ts +11 -0
- package/dist/decompress.js +59 -0
- package/dist/decompress.js.map +1 -0
- package/dist/dictionary/decoderDictionary.d.ts +15 -0
- package/dist/dictionary/decoderDictionary.js +116 -0
- package/dist/dictionary/decoderDictionary.js.map +1 -0
- package/dist/dictionary/decoderDictionary.test.d.ts +1 -0
- package/dist/dictionary/decoderDictionary.test.js +87 -0
- package/dist/dictionary/decoderDictionary.test.js.map +1 -0
- package/dist/encode/blockWriter.d.ts +5 -0
- package/dist/encode/blockWriter.js +27 -0
- package/dist/encode/blockWriter.js.map +1 -0
- package/dist/encode/blockWriter.test.d.ts +1 -0
- package/dist/encode/blockWriter.test.js +31 -0
- package/dist/encode/blockWriter.test.js.map +1 -0
- package/dist/encode/compressedBlock.d.ts +3 -0
- package/dist/encode/compressedBlock.js +449 -0
- package/dist/encode/compressedBlock.js.map +1 -0
- package/dist/encode/compressedBlock.test.d.ts +1 -0
- package/dist/encode/compressedBlock.test.js +63 -0
- package/dist/encode/compressedBlock.test.js.map +1 -0
- package/dist/encode/frameWriter.d.ts +4 -0
- package/dist/encode/frameWriter.js +34 -0
- package/dist/encode/frameWriter.js.map +1 -0
- package/dist/encode/frameWriter.test.d.ts +1 -0
- package/dist/encode/frameWriter.test.js +38 -0
- package/dist/encode/frameWriter.test.js.map +1 -0
- package/dist/encode/greedySequences.d.ts +7 -0
- package/dist/encode/greedySequences.js +82 -0
- package/dist/encode/greedySequences.js.map +1 -0
- package/dist/encode/greedySequences.test.d.ts +1 -0
- package/dist/encode/greedySequences.test.js +33 -0
- package/dist/encode/greedySequences.test.js.map +1 -0
- package/dist/entropy/fse.d.ts +33 -0
- package/dist/entropy/fse.js +217 -0
- package/dist/entropy/fse.js.map +1 -0
- package/dist/entropy/fse.test.d.ts +1 -0
- package/dist/entropy/fse.test.js +41 -0
- package/dist/entropy/fse.test.js.map +1 -0
- package/dist/entropy/huffman.d.ts +24 -0
- package/dist/entropy/huffman.js +70 -0
- package/dist/entropy/huffman.js.map +1 -0
- package/dist/entropy/huffman.test.d.ts +1 -0
- package/dist/entropy/huffman.test.js +22 -0
- package/dist/entropy/huffman.test.js.map +1 -0
- package/dist/entropy/index.d.ts +6 -0
- package/dist/entropy/index.js +5 -0
- package/dist/entropy/index.js.map +1 -0
- package/dist/entropy/predefined.d.ts +10 -0
- package/dist/entropy/predefined.js +18 -0
- package/dist/entropy/predefined.js.map +1 -0
- package/dist/entropy/weights.d.ts +20 -0
- package/dist/entropy/weights.js +108 -0
- package/dist/entropy/weights.js.map +1 -0
- package/dist/entropy/weights.test.d.ts +1 -0
- package/dist/entropy/weights.test.js +38 -0
- package/dist/entropy/weights.test.js.map +1 -0
- package/dist/errors.d.ts +7 -0
- package/dist/errors.js +13 -0
- package/dist/errors.js.map +1 -0
- package/dist/errors.test.d.ts +1 -0
- package/dist/errors.test.js +16 -0
- package/dist/errors.test.js.map +1 -0
- package/dist/frame/checksum.d.ts +17 -0
- package/dist/frame/checksum.js +94 -0
- package/dist/frame/checksum.js.map +1 -0
- package/dist/frame/checksum.test.d.ts +1 -0
- package/dist/frame/checksum.test.js +28 -0
- package/dist/frame/checksum.test.js.map +1 -0
- package/dist/frame/frameHeader.d.ts +26 -0
- package/dist/frame/frameHeader.js +127 -0
- package/dist/frame/frameHeader.js.map +1 -0
- package/dist/frame/frameHeader.test.d.ts +1 -0
- package/dist/frame/frameHeader.test.js +83 -0
- package/dist/frame/frameHeader.test.js.map +1 -0
- package/dist/frame/index.d.ts +4 -0
- package/dist/frame/index.js +4 -0
- package/dist/frame/index.js.map +1 -0
- package/dist/frame/skippable.d.ts +12 -0
- package/dist/frame/skippable.js +27 -0
- package/dist/frame/skippable.js.map +1 -0
- package/dist/frame/skippable.test.d.ts +1 -0
- package/dist/frame/skippable.test.js +35 -0
- package/dist/frame/skippable.test.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decode sequences section from compressed block.
|
|
3
|
+
* Decodes LL, ML, Offset FSE streams and produces Sequence tuples.
|
|
4
|
+
*/
|
|
5
|
+
import { BitReaderReverse } from '../bitstream/bitReaderReverse.js';
|
|
6
|
+
import { buildFSEDecodeTable, readNCount } from '../entropy/fse.js';
|
|
7
|
+
import { LITERALS_LENGTH_DEFAULT_DISTRIBUTION, LITERALS_LENGTH_TABLE_LOG, MATCH_LENGTH_DEFAULT_DISTRIBUTION, MATCH_LENGTH_TABLE_LOG, OFFSET_CODE_DEFAULT_DISTRIBUTION, OFFSET_CODE_TABLE_LOG, } from '../entropy/predefined.js';
|
|
8
|
+
import { ZstdError } from '../errors.js';
|
|
9
|
+
const LL_BASELINE = [
|
|
10
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 18, 20, 22, 24, 28, 32, 40, 48, 64, 128, 256, 512, 1024, 2048,
|
|
11
|
+
4096, 8192, 16384, 32768, 65536,
|
|
12
|
+
];
|
|
13
|
+
const LL_NUMBITS = [
|
|
14
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
|
|
15
|
+
];
|
|
16
|
+
const ML_BASELINE = [
|
|
17
|
+
3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
|
|
18
|
+
34, 35, 37, 39, 41, 43, 47, 51, 59, 67, 83, 99, 131, 259, 515, 1027, 2051, 4099, 8195, 16387, 32771, 65539,
|
|
19
|
+
];
|
|
20
|
+
const ML_NUMBITS = [
|
|
21
|
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 3,
|
|
22
|
+
3, 4, 4, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
|
|
23
|
+
];
|
|
24
|
+
function getStateRow(table, stateValue) {
|
|
25
|
+
const row = table[stateValue];
|
|
26
|
+
if (!row) {
|
|
27
|
+
throw new ZstdError('FSE invalid state', 'corruption_detected');
|
|
28
|
+
}
|
|
29
|
+
return row;
|
|
30
|
+
}
|
|
31
|
+
function buildRLETable(symbol, tableLog) {
|
|
32
|
+
const tableSize = 1 << tableLog;
|
|
33
|
+
const table = new Array(tableSize);
|
|
34
|
+
for (let i = 0; i < tableSize; i++) {
|
|
35
|
+
table[i] = { symbol, numBits: tableLog, baseline: 0 };
|
|
36
|
+
}
|
|
37
|
+
return table;
|
|
38
|
+
}
|
|
39
|
+
export function decodeSequences(data, offset, size, prevTables) {
|
|
40
|
+
if (size < 2) {
|
|
41
|
+
throw new ZstdError('Sequences section too short', 'corruption_detected');
|
|
42
|
+
}
|
|
43
|
+
let pos = offset;
|
|
44
|
+
let numSequences = data[pos] ?? 0;
|
|
45
|
+
pos++;
|
|
46
|
+
if (numSequences >= 128) {
|
|
47
|
+
if (numSequences === 255) {
|
|
48
|
+
if (pos + 2 > offset + size) {
|
|
49
|
+
throw new ZstdError('Sequences section truncated', 'corruption_detected');
|
|
50
|
+
}
|
|
51
|
+
numSequences = (data[pos] ?? 0) + ((data[pos + 1] ?? 0) << 8) + 0x7f00;
|
|
52
|
+
pos += 2;
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
if (pos >= offset + size) {
|
|
56
|
+
throw new ZstdError('Sequences section truncated', 'corruption_detected');
|
|
57
|
+
}
|
|
58
|
+
numSequences = ((numSequences - 0x80) << 8) + (data[pos] ?? 0);
|
|
59
|
+
pos++;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (numSequences === 0) {
|
|
63
|
+
return {
|
|
64
|
+
sequences: [],
|
|
65
|
+
tables: prevTables ?? {
|
|
66
|
+
llTable: buildFSEDecodeTable(LITERALS_LENGTH_DEFAULT_DISTRIBUTION, LITERALS_LENGTH_TABLE_LOG),
|
|
67
|
+
llTableLog: LITERALS_LENGTH_TABLE_LOG,
|
|
68
|
+
ofTable: buildFSEDecodeTable(OFFSET_CODE_DEFAULT_DISTRIBUTION, OFFSET_CODE_TABLE_LOG),
|
|
69
|
+
ofTableLog: OFFSET_CODE_TABLE_LOG,
|
|
70
|
+
mlTable: buildFSEDecodeTable(MATCH_LENGTH_DEFAULT_DISTRIBUTION, MATCH_LENGTH_TABLE_LOG),
|
|
71
|
+
mlTableLog: MATCH_LENGTH_TABLE_LOG,
|
|
72
|
+
},
|
|
73
|
+
bytesRead: pos - offset,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
if (pos >= offset + size) {
|
|
77
|
+
throw new ZstdError('Sequences section truncated', 'corruption_detected');
|
|
78
|
+
}
|
|
79
|
+
const modesByte = data[pos] ?? 0;
|
|
80
|
+
pos++;
|
|
81
|
+
const llMode = (modesByte >> 6) & 3;
|
|
82
|
+
const ofMode = (modesByte >> 4) & 3;
|
|
83
|
+
const mlMode = (modesByte >> 2) & 3;
|
|
84
|
+
if ((modesByte & 3) !== 0) {
|
|
85
|
+
throw new ZstdError('Reserved bits set in sequences modes', 'corruption_detected');
|
|
86
|
+
}
|
|
87
|
+
let llTable = buildFSEDecodeTable(LITERALS_LENGTH_DEFAULT_DISTRIBUTION, LITERALS_LENGTH_TABLE_LOG);
|
|
88
|
+
let llTableLog = LITERALS_LENGTH_TABLE_LOG;
|
|
89
|
+
let ofTable = buildFSEDecodeTable(OFFSET_CODE_DEFAULT_DISTRIBUTION, OFFSET_CODE_TABLE_LOG);
|
|
90
|
+
let ofTableLog = OFFSET_CODE_TABLE_LOG;
|
|
91
|
+
let mlTable = buildFSEDecodeTable(MATCH_LENGTH_DEFAULT_DISTRIBUTION, MATCH_LENGTH_TABLE_LOG);
|
|
92
|
+
let mlTableLog = MATCH_LENGTH_TABLE_LOG;
|
|
93
|
+
const getLLTable = () => {
|
|
94
|
+
if (llMode === 0) {
|
|
95
|
+
llTable = buildFSEDecodeTable(LITERALS_LENGTH_DEFAULT_DISTRIBUTION, LITERALS_LENGTH_TABLE_LOG);
|
|
96
|
+
llTableLog = LITERALS_LENGTH_TABLE_LOG;
|
|
97
|
+
}
|
|
98
|
+
else if (llMode === 1) {
|
|
99
|
+
if (pos >= offset + size)
|
|
100
|
+
throw new ZstdError('Sequences section truncated', 'corruption_detected');
|
|
101
|
+
const sym = data[pos] ?? 0;
|
|
102
|
+
pos++;
|
|
103
|
+
llTable = buildRLETable(sym, 6);
|
|
104
|
+
llTableLog = 6;
|
|
105
|
+
}
|
|
106
|
+
else if (llMode === 2) {
|
|
107
|
+
const result = readNCount(data, pos, 35, 9);
|
|
108
|
+
pos += result.bytesRead;
|
|
109
|
+
llTable = buildFSEDecodeTable(result.normalizedCounter, result.tableLog);
|
|
110
|
+
llTableLog = result.tableLog;
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
if (!prevTables)
|
|
114
|
+
throw new ZstdError('Repeat_Mode without previous table', 'corruption_detected');
|
|
115
|
+
llTable = prevTables.llTable;
|
|
116
|
+
llTableLog = prevTables.llTableLog;
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
const getOFTable = () => {
|
|
120
|
+
if (ofMode === 0) {
|
|
121
|
+
ofTable = buildFSEDecodeTable(OFFSET_CODE_DEFAULT_DISTRIBUTION, OFFSET_CODE_TABLE_LOG);
|
|
122
|
+
ofTableLog = OFFSET_CODE_TABLE_LOG;
|
|
123
|
+
}
|
|
124
|
+
else if (ofMode === 1) {
|
|
125
|
+
if (pos >= offset + size)
|
|
126
|
+
throw new ZstdError('Sequences section truncated', 'corruption_detected');
|
|
127
|
+
const sym = data[pos] ?? 0;
|
|
128
|
+
pos++;
|
|
129
|
+
ofTable = buildRLETable(sym, 5);
|
|
130
|
+
ofTableLog = 5;
|
|
131
|
+
}
|
|
132
|
+
else if (ofMode === 2) {
|
|
133
|
+
const result = readNCount(data, pos, 31, 8);
|
|
134
|
+
pos += result.bytesRead;
|
|
135
|
+
ofTable = buildFSEDecodeTable(result.normalizedCounter, result.tableLog);
|
|
136
|
+
ofTableLog = result.tableLog;
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
if (!prevTables)
|
|
140
|
+
throw new ZstdError('Repeat_Mode without previous table', 'corruption_detected');
|
|
141
|
+
ofTable = prevTables.ofTable;
|
|
142
|
+
ofTableLog = prevTables.ofTableLog;
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
const getMLTable = () => {
|
|
146
|
+
if (mlMode === 0) {
|
|
147
|
+
mlTable = buildFSEDecodeTable(MATCH_LENGTH_DEFAULT_DISTRIBUTION, MATCH_LENGTH_TABLE_LOG);
|
|
148
|
+
mlTableLog = MATCH_LENGTH_TABLE_LOG;
|
|
149
|
+
}
|
|
150
|
+
else if (mlMode === 1) {
|
|
151
|
+
if (pos >= offset + size)
|
|
152
|
+
throw new ZstdError('Sequences section truncated', 'corruption_detected');
|
|
153
|
+
const sym = data[pos] ?? 0;
|
|
154
|
+
pos++;
|
|
155
|
+
mlTable = buildRLETable(sym, 6);
|
|
156
|
+
mlTableLog = 6;
|
|
157
|
+
}
|
|
158
|
+
else if (mlMode === 2) {
|
|
159
|
+
const result = readNCount(data, pos, 52, 9);
|
|
160
|
+
pos += result.bytesRead;
|
|
161
|
+
mlTable = buildFSEDecodeTable(result.normalizedCounter, result.tableLog);
|
|
162
|
+
mlTableLog = result.tableLog;
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
if (!prevTables)
|
|
166
|
+
throw new ZstdError('Repeat_Mode without previous table', 'corruption_detected');
|
|
167
|
+
mlTable = prevTables.mlTable;
|
|
168
|
+
mlTableLog = prevTables.mlTableLog;
|
|
169
|
+
}
|
|
170
|
+
};
|
|
171
|
+
getLLTable();
|
|
172
|
+
getOFTable();
|
|
173
|
+
getMLTable();
|
|
174
|
+
const bitstreamStart = pos;
|
|
175
|
+
const bitstreamSize = offset + size - pos;
|
|
176
|
+
if (bitstreamSize < 1) {
|
|
177
|
+
throw new ZstdError('Sequences bitstream empty', 'corruption_detected');
|
|
178
|
+
}
|
|
179
|
+
const bitstream = data.subarray(bitstreamStart, bitstreamStart + bitstreamSize);
|
|
180
|
+
const totalStateBits = llTableLog + ofTableLog + mlTableLog;
|
|
181
|
+
if (bitstreamSize * 8 < totalStateBits) {
|
|
182
|
+
throw new ZstdError('Sequences bitstream too short for initial states', 'corruption_detected');
|
|
183
|
+
}
|
|
184
|
+
const reader = new BitReaderReverse(bitstream, 0, bitstreamSize);
|
|
185
|
+
reader.skipPadding();
|
|
186
|
+
const readBits = (numBits) => (numBits > 0 ? reader.readBits(numBits) : 0);
|
|
187
|
+
// Initial states are read in LL, OF, ML order.
|
|
188
|
+
const stateLL = { value: readBits(llTableLog) };
|
|
189
|
+
const stateOF = { value: readBits(ofTableLog) };
|
|
190
|
+
const stateML = { value: readBits(mlTableLog) };
|
|
191
|
+
const sequences = [];
|
|
192
|
+
for (let i = 0; i < numSequences; i++) {
|
|
193
|
+
const isLast = i === numSequences - 1;
|
|
194
|
+
// Per spec, sequence tuple decode order is OF, ML, LL.
|
|
195
|
+
const ofRow = getStateRow(ofTable, stateOF.value);
|
|
196
|
+
const mlRow = getStateRow(mlTable, stateML.value);
|
|
197
|
+
const llRow = getStateRow(llTable, stateLL.value);
|
|
198
|
+
const offsetCode = ofRow.symbol;
|
|
199
|
+
const mlCode = mlRow.symbol;
|
|
200
|
+
const llCode = llRow.symbol;
|
|
201
|
+
const offsetValue = (1 << offsetCode) + (offsetCode > 0 ? readBits(offsetCode) : 0);
|
|
202
|
+
const matchLength = mlCode <= 31 ? mlCode + 3 : (ML_BASELINE[mlCode] ?? 0) + readBits(ML_NUMBITS[mlCode] ?? 0);
|
|
203
|
+
const literalsLength = llCode <= 15 ? llCode : (LL_BASELINE[llCode] ?? 0) + readBits(LL_NUMBITS[llCode] ?? 0);
|
|
204
|
+
sequences.push({
|
|
205
|
+
literalsLength,
|
|
206
|
+
offset: offsetValue,
|
|
207
|
+
matchLength,
|
|
208
|
+
});
|
|
209
|
+
if (!isLast) {
|
|
210
|
+
// State updates for next sequence are LL, ML, OF.
|
|
211
|
+
stateLL.value = llRow.baseline + readBits(llRow.numBits);
|
|
212
|
+
stateML.value = mlRow.baseline + readBits(mlRow.numBits);
|
|
213
|
+
stateOF.value = ofRow.baseline + readBits(ofRow.numBits);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return {
|
|
217
|
+
sequences,
|
|
218
|
+
tables: { llTable, llTableLog, ofTable, ofTableLog, mlTable, mlTableLog },
|
|
219
|
+
bytesRead: size,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
//# sourceMappingURL=sequences.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sequences.js","sourceRoot":"","sources":["../../src/decode/sequences.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decompress zstd-compressed data.
|
|
3
|
+
*/
|
|
4
|
+
export type DecompressOptions = {
|
|
5
|
+
maxSize?: number;
|
|
6
|
+
dictionary?: Uint8Array | {
|
|
7
|
+
bytes: Uint8Array;
|
|
8
|
+
id?: number;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
export declare function decompress(input: Uint8Array, options?: DecompressOptions): Uint8Array;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decompress zstd-compressed data.
|
|
3
|
+
*/
|
|
4
|
+
import { decompressFrame } from './decode/decompressFrame.js';
|
|
5
|
+
import { normalizeDecoderDictionary } from './dictionary/decoderDictionary.js';
|
|
6
|
+
import { ZstdError } from './errors.js';
|
|
7
|
+
import { parseZstdFrame } from './frame/frameHeader.js';
|
|
8
|
+
import { isSkippableFrame, skipSkippableFrame } from './frame/skippable.js';
|
|
9
|
+
export function decompress(input, options) {
|
|
10
|
+
if (input.length === 0) {
|
|
11
|
+
throw new ZstdError('Empty input', 'corruption_detected');
|
|
12
|
+
}
|
|
13
|
+
const maxSize = options?.maxSize;
|
|
14
|
+
const dictionary = options?.dictionary;
|
|
15
|
+
const dictionaryBytes = dictionary instanceof Uint8Array ? dictionary : dictionary?.bytes;
|
|
16
|
+
const providedDictionaryId = dictionary instanceof Uint8Array ? null : (dictionary?.id ?? null);
|
|
17
|
+
const normalizedDictionary = dictionaryBytes && dictionaryBytes.length > 0
|
|
18
|
+
? normalizeDecoderDictionary(dictionaryBytes, providedDictionaryId)
|
|
19
|
+
: null;
|
|
20
|
+
const dictionaryId = normalizedDictionary?.dictionaryId ?? providedDictionaryId;
|
|
21
|
+
const chunks = [];
|
|
22
|
+
let offset = 0;
|
|
23
|
+
while (offset < input.length) {
|
|
24
|
+
if (offset + 4 > input.length) {
|
|
25
|
+
throw new ZstdError('Truncated input', 'corruption_detected');
|
|
26
|
+
}
|
|
27
|
+
if (isSkippableFrame(input, offset)) {
|
|
28
|
+
offset = skipSkippableFrame(input, offset);
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const { header } = parseZstdFrame(input, offset);
|
|
32
|
+
if (header.dictionaryId !== null && !dictionaryBytes) {
|
|
33
|
+
throw new ZstdError('Dictionary frame requires dictionary option', 'parameter_unsupported');
|
|
34
|
+
}
|
|
35
|
+
if (header.dictionaryId !== null && dictionaryId !== null && dictionaryId !== header.dictionaryId) {
|
|
36
|
+
throw new ZstdError('Dictionary ID mismatch', 'corruption_detected');
|
|
37
|
+
}
|
|
38
|
+
const { output, bytesConsumed } = decompressFrame(input, offset, header, normalizedDictionary, maxSize !== undefined ? maxSize - chunks.reduce((s, c) => s + c.length, 0) : undefined);
|
|
39
|
+
chunks.push(output);
|
|
40
|
+
offset += bytesConsumed;
|
|
41
|
+
}
|
|
42
|
+
if (chunks.length === 0)
|
|
43
|
+
return new Uint8Array(0);
|
|
44
|
+
if (chunks.length === 1) {
|
|
45
|
+
const c = chunks[0];
|
|
46
|
+
if (!c)
|
|
47
|
+
throw new ZstdError('Unreachable', 'corruption_detected');
|
|
48
|
+
return c;
|
|
49
|
+
}
|
|
50
|
+
const total = chunks.reduce((s, c) => s + c.length, 0);
|
|
51
|
+
const result = new Uint8Array(total);
|
|
52
|
+
let pos = 0;
|
|
53
|
+
for (const chunk of chunks) {
|
|
54
|
+
result.set(chunk, pos);
|
|
55
|
+
pos += chunk.length;
|
|
56
|
+
}
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=decompress.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decompress.js","sourceRoot":"","sources":["../src/decompress.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { SequenceTables } from '../decode/sequences.js';
|
|
2
|
+
import { buildHuffmanDecodeTable } from '../entropy/huffman.js';
|
|
3
|
+
type HuffmanTable = {
|
|
4
|
+
table: ReturnType<typeof buildHuffmanDecodeTable>;
|
|
5
|
+
maxNumBits: number;
|
|
6
|
+
};
|
|
7
|
+
export interface DecoderDictionaryContext {
|
|
8
|
+
historyPrefix: Uint8Array;
|
|
9
|
+
dictionaryId: number | null;
|
|
10
|
+
repOffsets: [number, number, number];
|
|
11
|
+
huffmanTable: HuffmanTable | null;
|
|
12
|
+
sequenceTables: SequenceTables | null;
|
|
13
|
+
}
|
|
14
|
+
export declare function normalizeDecoderDictionary(dictionaryBytes: Uint8Array, providedDictionaryId?: number | null): DecoderDictionaryContext;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { readU32LE } from '../bitstream/littleEndian.js';
|
|
2
|
+
import { buildFSEDecodeTable, readNCount } from '../entropy/fse.js';
|
|
3
|
+
import { buildHuffmanDecodeTable, weightsToNumBits } from '../entropy/huffman.js';
|
|
4
|
+
import { readWeightsDirect, readWeightsFSE } from '../entropy/weights.js';
|
|
5
|
+
import { ZstdError } from '../errors.js';
|
|
6
|
+
const ZSTD_DICTIONARY_MAGIC = 0xec30a437;
|
|
7
|
+
function buildHuffmanTableFromWeights(weights) {
|
|
8
|
+
let partialSum = 0;
|
|
9
|
+
for (let i = 0; i < weights.length; i++) {
|
|
10
|
+
const w = weights[i] ?? 0;
|
|
11
|
+
if (w > 0)
|
|
12
|
+
partialSum += 1 << (w - 1);
|
|
13
|
+
}
|
|
14
|
+
if (partialSum === 0) {
|
|
15
|
+
throw new ZstdError('Invalid Huffman weights', 'corruption_detected');
|
|
16
|
+
}
|
|
17
|
+
const maxNumBits = 32 - Math.clz32(partialSum);
|
|
18
|
+
const total = 1 << maxNumBits;
|
|
19
|
+
const remainder = total - partialSum;
|
|
20
|
+
if (remainder <= 0 || (remainder & (remainder - 1)) !== 0) {
|
|
21
|
+
throw new ZstdError('Invalid Huffman weights: cannot complete to power of 2', 'corruption_detected');
|
|
22
|
+
}
|
|
23
|
+
const lastWeight = 32 - Math.clz32(remainder);
|
|
24
|
+
const fullWeights = [...weights, lastWeight];
|
|
25
|
+
while (fullWeights.length < 256) {
|
|
26
|
+
fullWeights.push(0);
|
|
27
|
+
}
|
|
28
|
+
const numBits = weightsToNumBits(fullWeights, maxNumBits);
|
|
29
|
+
return {
|
|
30
|
+
table: buildHuffmanDecodeTable(numBits, maxNumBits),
|
|
31
|
+
maxNumBits,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
function parseDictionaryHuffmanTable(data, offset) {
|
|
35
|
+
if (offset >= data.length) {
|
|
36
|
+
throw new ZstdError('Dictionary Huffman table truncated', 'corruption_detected');
|
|
37
|
+
}
|
|
38
|
+
const headerByte = data[offset] ?? 0;
|
|
39
|
+
let pos = offset + 1;
|
|
40
|
+
let weights;
|
|
41
|
+
if (headerByte >= 128) {
|
|
42
|
+
const numWeights = headerByte - 127;
|
|
43
|
+
const direct = readWeightsDirect(data, pos, numWeights);
|
|
44
|
+
weights = direct.weights;
|
|
45
|
+
pos += direct.bytesRead;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
const fse = readWeightsFSE(data, pos, headerByte);
|
|
49
|
+
weights = fse.weights;
|
|
50
|
+
pos += headerByte;
|
|
51
|
+
}
|
|
52
|
+
const table = buildHuffmanTableFromWeights(weights);
|
|
53
|
+
return { table, bytesRead: pos - offset };
|
|
54
|
+
}
|
|
55
|
+
export function normalizeDecoderDictionary(dictionaryBytes, providedDictionaryId = null) {
|
|
56
|
+
if (dictionaryBytes.length < 8 || readU32LE(dictionaryBytes, 0) !== ZSTD_DICTIONARY_MAGIC) {
|
|
57
|
+
return {
|
|
58
|
+
historyPrefix: dictionaryBytes.slice(),
|
|
59
|
+
dictionaryId: providedDictionaryId,
|
|
60
|
+
repOffsets: [1, 4, 8],
|
|
61
|
+
huffmanTable: null,
|
|
62
|
+
sequenceTables: null,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
if (dictionaryBytes.length <= 8) {
|
|
66
|
+
throw new ZstdError('Dictionary too small', 'corruption_detected');
|
|
67
|
+
}
|
|
68
|
+
const parsedDictionaryId = readU32LE(dictionaryBytes, 4);
|
|
69
|
+
if (parsedDictionaryId === 0) {
|
|
70
|
+
throw new ZstdError('Dictionary ID must be non-zero', 'corruption_detected');
|
|
71
|
+
}
|
|
72
|
+
if (providedDictionaryId !== null && providedDictionaryId !== parsedDictionaryId) {
|
|
73
|
+
throw new ZstdError('Provided dictionary ID does not match dictionary content', 'corruption_detected');
|
|
74
|
+
}
|
|
75
|
+
let pos = 8;
|
|
76
|
+
const huffman = parseDictionaryHuffmanTable(dictionaryBytes, pos);
|
|
77
|
+
pos += huffman.bytesRead;
|
|
78
|
+
const ofNCount = readNCount(dictionaryBytes, pos, 31, 8);
|
|
79
|
+
pos += ofNCount.bytesRead;
|
|
80
|
+
const mlNCount = readNCount(dictionaryBytes, pos, 52, 9);
|
|
81
|
+
pos += mlNCount.bytesRead;
|
|
82
|
+
const llNCount = readNCount(dictionaryBytes, pos, 35, 9);
|
|
83
|
+
pos += llNCount.bytesRead;
|
|
84
|
+
if (pos + 12 > dictionaryBytes.length) {
|
|
85
|
+
throw new ZstdError('Dictionary entropy section truncated', 'corruption_detected');
|
|
86
|
+
}
|
|
87
|
+
const contentSize = dictionaryBytes.length - (pos + 12);
|
|
88
|
+
const repOffsets = [
|
|
89
|
+
readU32LE(dictionaryBytes, pos),
|
|
90
|
+
readU32LE(dictionaryBytes, pos + 4),
|
|
91
|
+
readU32LE(dictionaryBytes, pos + 8),
|
|
92
|
+
];
|
|
93
|
+
for (const rep of repOffsets) {
|
|
94
|
+
if (rep === 0 || rep > contentSize) {
|
|
95
|
+
throw new ZstdError('Invalid dictionary repeat offset', 'corruption_detected');
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
pos += 12;
|
|
99
|
+
const historyPrefix = dictionaryBytes.subarray(pos).slice();
|
|
100
|
+
const sequenceTables = {
|
|
101
|
+
ofTable: buildFSEDecodeTable(ofNCount.normalizedCounter, ofNCount.tableLog),
|
|
102
|
+
ofTableLog: ofNCount.tableLog,
|
|
103
|
+
mlTable: buildFSEDecodeTable(mlNCount.normalizedCounter, mlNCount.tableLog),
|
|
104
|
+
mlTableLog: mlNCount.tableLog,
|
|
105
|
+
llTable: buildFSEDecodeTable(llNCount.normalizedCounter, llNCount.tableLog),
|
|
106
|
+
llTableLog: llNCount.tableLog,
|
|
107
|
+
};
|
|
108
|
+
return {
|
|
109
|
+
historyPrefix,
|
|
110
|
+
dictionaryId: parsedDictionaryId,
|
|
111
|
+
repOffsets,
|
|
112
|
+
huffmanTable: huffman.table,
|
|
113
|
+
sequenceTables,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=decoderDictionary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decoderDictionary.js","sourceRoot":"","sources":["../../src/dictionary/decoderDictionary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,87 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decoderDictionary.test.js","sourceRoot":"","sources":["../../src/dictionary/decoderDictionary.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Write raw and RLE blocks.
|
|
3
|
+
*/
|
|
4
|
+
function writeU24LE(arr, offset, value) {
|
|
5
|
+
arr[offset] = value & 0xff;
|
|
6
|
+
arr[offset + 1] = (value >> 8) & 0xff;
|
|
7
|
+
arr[offset + 2] = (value >> 16) & 0xff;
|
|
8
|
+
}
|
|
9
|
+
export function writeRawBlock(data, offset, size, last) {
|
|
10
|
+
const header = new Uint8Array(3);
|
|
11
|
+
const blockHeader = (last ? 1 : 0) | (0 << 1) | (size << 3);
|
|
12
|
+
writeU24LE(header, 0, blockHeader);
|
|
13
|
+
const result = new Uint8Array(3 + size);
|
|
14
|
+
result.set(header);
|
|
15
|
+
result.set(data.subarray(offset, offset + size), 3);
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
18
|
+
export function writeRLEBlock(byte, size, last) {
|
|
19
|
+
const header = new Uint8Array(3);
|
|
20
|
+
const blockHeader = (last ? 1 : 0) | (1 << 1) | (size << 3);
|
|
21
|
+
writeU24LE(header, 0, blockHeader);
|
|
22
|
+
const result = new Uint8Array(4);
|
|
23
|
+
result.set(header, 0);
|
|
24
|
+
result[3] = byte & 0xff;
|
|
25
|
+
return result;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=blockWriter.js.map
|