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.
Files changed (157) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +95 -0
  3. package/dist/bitstream/bitReader.d.ts +26 -0
  4. package/dist/bitstream/bitReader.js +86 -0
  5. package/dist/bitstream/bitReader.js.map +1 -0
  6. package/dist/bitstream/bitReader.test.d.ts +1 -0
  7. package/dist/bitstream/bitReader.test.js +47 -0
  8. package/dist/bitstream/bitReader.test.js.map +1 -0
  9. package/dist/bitstream/bitReaderReverse.d.ts +23 -0
  10. package/dist/bitstream/bitReaderReverse.js +84 -0
  11. package/dist/bitstream/bitReaderReverse.js.map +1 -0
  12. package/dist/bitstream/bitReaderReverse.test.d.ts +1 -0
  13. package/dist/bitstream/bitReaderReverse.test.js +49 -0
  14. package/dist/bitstream/bitReaderReverse.test.js.map +1 -0
  15. package/dist/bitstream/bitWriter.d.ts +15 -0
  16. package/dist/bitstream/bitWriter.js +47 -0
  17. package/dist/bitstream/bitWriter.js.map +1 -0
  18. package/dist/bitstream/index.d.ts +4 -0
  19. package/dist/bitstream/index.js +5 -0
  20. package/dist/bitstream/index.js.map +1 -0
  21. package/dist/bitstream/littleEndian.d.ts +7 -0
  22. package/dist/bitstream/littleEndian.js +45 -0
  23. package/dist/bitstream/littleEndian.js.map +1 -0
  24. package/dist/bitstream/littleEndian.test.d.ts +1 -0
  25. package/dist/bitstream/littleEndian.test.js +21 -0
  26. package/dist/bitstream/littleEndian.test.js.map +1 -0
  27. package/dist/bitstream/varint.d.ts +9 -0
  28. package/dist/bitstream/varint.js +40 -0
  29. package/dist/bitstream/varint.js.map +1 -0
  30. package/dist/bitstream/varint.test.d.ts +1 -0
  31. package/dist/bitstream/varint.test.js +25 -0
  32. package/dist/bitstream/varint.test.js.map +1 -0
  33. package/dist/compress.d.ts +9 -0
  34. package/dist/compress.js +74 -0
  35. package/dist/compress.js.map +1 -0
  36. package/dist/decode/block.d.ts +11 -0
  37. package/dist/decode/block.js +28 -0
  38. package/dist/decode/block.js.map +1 -0
  39. package/dist/decode/block.test.d.ts +1 -0
  40. package/dist/decode/block.test.js +26 -0
  41. package/dist/decode/block.test.js.map +1 -0
  42. package/dist/decode/decompressFrame.d.ts +9 -0
  43. package/dist/decode/decompressFrame.js +147 -0
  44. package/dist/decode/decompressFrame.js.map +1 -0
  45. package/dist/decode/literals.corruption.test.d.ts +1 -0
  46. package/dist/decode/literals.corruption.test.js +26 -0
  47. package/dist/decode/literals.corruption.test.js.map +1 -0
  48. package/dist/decode/literals.d.ts +49 -0
  49. package/dist/decode/literals.js +300 -0
  50. package/dist/decode/literals.js.map +1 -0
  51. package/dist/decode/literals.test.d.ts +1 -0
  52. package/dist/decode/literals.test.js +52 -0
  53. package/dist/decode/literals.test.js.map +1 -0
  54. package/dist/decode/reconstruct.d.ts +13 -0
  55. package/dist/decode/reconstruct.js +80 -0
  56. package/dist/decode/reconstruct.js.map +1 -0
  57. package/dist/decode/reconstruct.test.d.ts +1 -0
  58. package/dist/decode/reconstruct.test.js +42 -0
  59. package/dist/decode/reconstruct.test.js.map +1 -0
  60. package/dist/decode/sequences.corruption.test.d.ts +1 -0
  61. package/dist/decode/sequences.corruption.test.js +32 -0
  62. package/dist/decode/sequences.corruption.test.js.map +1 -0
  63. package/dist/decode/sequences.d.ts +21 -0
  64. package/dist/decode/sequences.js +222 -0
  65. package/dist/decode/sequences.js.map +1 -0
  66. package/dist/decode/sequences.level1.test.d.ts +1 -0
  67. package/dist/decode/sequences.level1.test.js +35 -0
  68. package/dist/decode/sequences.level1.test.js.map +1 -0
  69. package/dist/decompress.d.ts +11 -0
  70. package/dist/decompress.js +59 -0
  71. package/dist/decompress.js.map +1 -0
  72. package/dist/dictionary/decoderDictionary.d.ts +15 -0
  73. package/dist/dictionary/decoderDictionary.js +116 -0
  74. package/dist/dictionary/decoderDictionary.js.map +1 -0
  75. package/dist/dictionary/decoderDictionary.test.d.ts +1 -0
  76. package/dist/dictionary/decoderDictionary.test.js +87 -0
  77. package/dist/dictionary/decoderDictionary.test.js.map +1 -0
  78. package/dist/encode/blockWriter.d.ts +5 -0
  79. package/dist/encode/blockWriter.js +27 -0
  80. package/dist/encode/blockWriter.js.map +1 -0
  81. package/dist/encode/blockWriter.test.d.ts +1 -0
  82. package/dist/encode/blockWriter.test.js +31 -0
  83. package/dist/encode/blockWriter.test.js.map +1 -0
  84. package/dist/encode/compressedBlock.d.ts +3 -0
  85. package/dist/encode/compressedBlock.js +449 -0
  86. package/dist/encode/compressedBlock.js.map +1 -0
  87. package/dist/encode/compressedBlock.test.d.ts +1 -0
  88. package/dist/encode/compressedBlock.test.js +63 -0
  89. package/dist/encode/compressedBlock.test.js.map +1 -0
  90. package/dist/encode/frameWriter.d.ts +4 -0
  91. package/dist/encode/frameWriter.js +34 -0
  92. package/dist/encode/frameWriter.js.map +1 -0
  93. package/dist/encode/frameWriter.test.d.ts +1 -0
  94. package/dist/encode/frameWriter.test.js +38 -0
  95. package/dist/encode/frameWriter.test.js.map +1 -0
  96. package/dist/encode/greedySequences.d.ts +7 -0
  97. package/dist/encode/greedySequences.js +82 -0
  98. package/dist/encode/greedySequences.js.map +1 -0
  99. package/dist/encode/greedySequences.test.d.ts +1 -0
  100. package/dist/encode/greedySequences.test.js +33 -0
  101. package/dist/encode/greedySequences.test.js.map +1 -0
  102. package/dist/entropy/fse.d.ts +33 -0
  103. package/dist/entropy/fse.js +217 -0
  104. package/dist/entropy/fse.js.map +1 -0
  105. package/dist/entropy/fse.test.d.ts +1 -0
  106. package/dist/entropy/fse.test.js +41 -0
  107. package/dist/entropy/fse.test.js.map +1 -0
  108. package/dist/entropy/huffman.d.ts +24 -0
  109. package/dist/entropy/huffman.js +70 -0
  110. package/dist/entropy/huffman.js.map +1 -0
  111. package/dist/entropy/huffman.test.d.ts +1 -0
  112. package/dist/entropy/huffman.test.js +22 -0
  113. package/dist/entropy/huffman.test.js.map +1 -0
  114. package/dist/entropy/index.d.ts +6 -0
  115. package/dist/entropy/index.js +5 -0
  116. package/dist/entropy/index.js.map +1 -0
  117. package/dist/entropy/predefined.d.ts +10 -0
  118. package/dist/entropy/predefined.js +18 -0
  119. package/dist/entropy/predefined.js.map +1 -0
  120. package/dist/entropy/weights.d.ts +20 -0
  121. package/dist/entropy/weights.js +108 -0
  122. package/dist/entropy/weights.js.map +1 -0
  123. package/dist/entropy/weights.test.d.ts +1 -0
  124. package/dist/entropy/weights.test.js +38 -0
  125. package/dist/entropy/weights.test.js.map +1 -0
  126. package/dist/errors.d.ts +7 -0
  127. package/dist/errors.js +13 -0
  128. package/dist/errors.js.map +1 -0
  129. package/dist/errors.test.d.ts +1 -0
  130. package/dist/errors.test.js +16 -0
  131. package/dist/errors.test.js.map +1 -0
  132. package/dist/frame/checksum.d.ts +17 -0
  133. package/dist/frame/checksum.js +94 -0
  134. package/dist/frame/checksum.js.map +1 -0
  135. package/dist/frame/checksum.test.d.ts +1 -0
  136. package/dist/frame/checksum.test.js +28 -0
  137. package/dist/frame/checksum.test.js.map +1 -0
  138. package/dist/frame/frameHeader.d.ts +26 -0
  139. package/dist/frame/frameHeader.js +127 -0
  140. package/dist/frame/frameHeader.js.map +1 -0
  141. package/dist/frame/frameHeader.test.d.ts +1 -0
  142. package/dist/frame/frameHeader.test.js +83 -0
  143. package/dist/frame/frameHeader.test.js.map +1 -0
  144. package/dist/frame/index.d.ts +4 -0
  145. package/dist/frame/index.js +4 -0
  146. package/dist/frame/index.js.map +1 -0
  147. package/dist/frame/skippable.d.ts +12 -0
  148. package/dist/frame/skippable.js +27 -0
  149. package/dist/frame/skippable.js.map +1 -0
  150. package/dist/frame/skippable.test.d.ts +1 -0
  151. package/dist/frame/skippable.test.js +35 -0
  152. package/dist/frame/skippable.test.js.map +1 -0
  153. package/dist/index.d.ts +2 -0
  154. package/dist/index.js +3 -0
  155. package/dist/index.js.map +1 -0
  156. package/dist/tsconfig.tsbuildinfo +1 -0
  157. package/package.json +38 -0
@@ -0,0 +1,300 @@
1
+ /**
2
+ * Decode literals section: Raw, RLE, Compressed, Treeless.
3
+ */
4
+ import { BitReader } from '../bitstream/bitReader.js';
5
+ import { BitReaderReverse } from '../bitstream/bitReaderReverse.js';
6
+ import { buildHuffmanDecodeTable, weightsToNumBits } from '../entropy/huffman.js';
7
+ import { readWeightsDirect, readWeightsFSE } from '../entropy/weights.js';
8
+ import { ZstdError } from '../errors.js';
9
+ /**
10
+ * Parse Literals_Section_Header from compressed block.
11
+ * Returns header info and the byte offset after the header.
12
+ */
13
+ export function parseLiteralsSectionHeader(data, offset) {
14
+ if (offset >= data.length) {
15
+ throw new ZstdError('Literals section header truncated', 'corruption_detected');
16
+ }
17
+ const b0 = data[offset] ?? 0;
18
+ const blockType = (b0 & 3);
19
+ const sizeFormat = (b0 >> 2) & 3;
20
+ if (blockType === 0 || blockType === 1) {
21
+ if (sizeFormat === 0 || sizeFormat === 2) {
22
+ const regeneratedSize = b0 >> 3;
23
+ return {
24
+ header: { blockType, regeneratedSize, headerSize: 1, numStreams: 1 },
25
+ dataOffset: offset + 1,
26
+ };
27
+ }
28
+ if (sizeFormat === 1) {
29
+ if (offset + 2 > data.length) {
30
+ throw new ZstdError('Literals section header truncated', 'corruption_detected');
31
+ }
32
+ const b1 = data[offset + 1] ?? 0;
33
+ const regeneratedSize = (b0 >> 4) + (b1 << 4);
34
+ return {
35
+ header: { blockType, regeneratedSize, headerSize: 2, numStreams: 1 },
36
+ dataOffset: offset + 2,
37
+ };
38
+ }
39
+ if (sizeFormat === 3) {
40
+ if (offset + 3 > data.length) {
41
+ throw new ZstdError('Literals section header truncated', 'corruption_detected');
42
+ }
43
+ const b1 = data[offset + 1] ?? 0;
44
+ const b2 = data[offset + 2] ?? 0;
45
+ const regeneratedSize = (b0 >> 4) + (b1 << 4) + (b2 << 12);
46
+ return {
47
+ header: { blockType, regeneratedSize, headerSize: 3, numStreams: 1 },
48
+ dataOffset: offset + 3,
49
+ };
50
+ }
51
+ }
52
+ if (blockType === 2 || blockType === 3) {
53
+ const reader = new BitReader(data, offset);
54
+ const parsedBlockType = reader.readBits(2);
55
+ const parsedSizeFormat = reader.readBits(2);
56
+ if (parsedBlockType !== blockType || parsedSizeFormat !== sizeFormat) {
57
+ throw new ZstdError('Invalid literals section header', 'corruption_detected');
58
+ }
59
+ const numStreams = sizeFormat === 0 ? 1 : 4;
60
+ const sizeBits = sizeFormat <= 1 ? 10 : sizeFormat === 2 ? 14 : 18;
61
+ const regeneratedSize = reader.readBits(sizeBits);
62
+ const compressedSize = reader.readBits(sizeBits);
63
+ reader.align();
64
+ const headerSize = reader.position - offset;
65
+ if (offset + headerSize > data.length) {
66
+ throw new ZstdError('Literals section header truncated', 'corruption_detected');
67
+ }
68
+ return {
69
+ header: { blockType, regeneratedSize, compressedSize, headerSize, numStreams },
70
+ dataOffset: offset + headerSize,
71
+ };
72
+ }
73
+ throw new ZstdError('Invalid literals section header', 'corruption_detected');
74
+ }
75
+ /**
76
+ * Decode raw literals block - direct copy.
77
+ */
78
+ export function decodeRawLiterals(data, offset, size) {
79
+ if (offset + size > data.length) {
80
+ throw new ZstdError('Raw literals truncated', 'corruption_detected');
81
+ }
82
+ return data.subarray(offset, offset + size).slice();
83
+ }
84
+ /**
85
+ * Decode RLE literals block - single byte repeated.
86
+ */
87
+ export function decodeRLELiterals(data, offset, size) {
88
+ if (offset >= data.length) {
89
+ throw new ZstdError('RLE literals truncated', 'corruption_detected');
90
+ }
91
+ const byte = data[offset] ?? 0;
92
+ const result = new Uint8Array(size);
93
+ result.fill(byte);
94
+ return result;
95
+ }
96
+ function weightsToHuffmanTable(weights) {
97
+ let partialSum = 0;
98
+ for (let i = 0; i < weights.length; i++) {
99
+ const w = weights[i] ?? 0;
100
+ if (w > 0)
101
+ partialSum += 1 << (w - 1);
102
+ }
103
+ if (partialSum === 0) {
104
+ throw new ZstdError('Invalid Huffman weights', 'corruption_detected');
105
+ }
106
+ const maxNumBits = 32 - Math.clz32(partialSum);
107
+ const total = 1 << maxNumBits;
108
+ const remainder = total - partialSum;
109
+ if (remainder <= 0 || (remainder & (remainder - 1)) !== 0) {
110
+ throw new ZstdError('Invalid Huffman weights: cannot complete to power of 2', 'corruption_detected');
111
+ }
112
+ const lastWeight = 32 - Math.clz32(remainder);
113
+ const fullWeights = [...weights, lastWeight];
114
+ while (fullWeights.length < 256) {
115
+ fullWeights.push(0);
116
+ }
117
+ const numBits = weightsToNumBits(fullWeights, maxNumBits);
118
+ const table = buildHuffmanDecodeTable(numBits, maxNumBits);
119
+ return { table, maxNumBits };
120
+ }
121
+ function decodeHuffmanStreamToEnd(data, streamOffset, streamLength, table, maxNumBits) {
122
+ if (streamLength <= 0) {
123
+ throw new ZstdError('Huffman stream truncated', 'corruption_detected');
124
+ }
125
+ const stream = data.subarray(streamOffset, streamOffset + streamLength);
126
+ const lastByte = stream[stream.length - 1] ?? 0;
127
+ if (lastByte === 0) {
128
+ throw new ZstdError('Huffman invalid end marker', 'corruption_detected');
129
+ }
130
+ const highestSetBit = 31 - Math.clz32(lastByte);
131
+ const paddingBits = 8 - highestSetBit;
132
+ let bitOffset = streamLength * 8 - paddingBits;
133
+ const readBitsZeroExtended = (numBits) => {
134
+ if (numBits <= 0)
135
+ return 0;
136
+ bitOffset -= numBits;
137
+ let value = 0;
138
+ for (let i = 0; i < numBits; i++) {
139
+ const abs = bitOffset + i;
140
+ if (abs < 0)
141
+ continue;
142
+ const byteIndex = abs >>> 3;
143
+ const bitInByte = abs & 7;
144
+ const bit = ((stream[byteIndex] ?? 0) >>> bitInByte) & 1;
145
+ value |= bit << i;
146
+ }
147
+ return value;
148
+ };
149
+ const out = [];
150
+ const mask = (1 << maxNumBits) - 1;
151
+ let state = readBitsZeroExtended(maxNumBits);
152
+ while (bitOffset > -maxNumBits) {
153
+ const row = table[state];
154
+ if (!row) {
155
+ throw new ZstdError('Huffman invalid code', 'corruption_detected');
156
+ }
157
+ out.push(row.symbol);
158
+ const nb = row.numBits;
159
+ const rest = nb > 0 ? readBitsZeroExtended(nb) : 0;
160
+ state = ((state << nb) & mask) + rest;
161
+ }
162
+ if (bitOffset !== -maxNumBits) {
163
+ throw new ZstdError('Huffman stream did not end cleanly', 'corruption_detected');
164
+ }
165
+ return new Uint8Array(out);
166
+ }
167
+ function decodeHuffmanStreamByCount(data, streamOffset, streamLength, table, maxNumBits, numSymbols) {
168
+ if (numSymbols === 0)
169
+ return new Uint8Array(0);
170
+ if (streamLength <= 0) {
171
+ throw new ZstdError('Huffman stream truncated', 'corruption_detected');
172
+ }
173
+ const reader = new BitReaderReverse(data, streamOffset, streamLength);
174
+ reader.skipPadding();
175
+ const out = new Uint8Array(numSymbols);
176
+ for (let i = 0; i < numSymbols; i++) {
177
+ const peek = reader.readBits(maxNumBits);
178
+ const row = table[peek];
179
+ if (!row) {
180
+ throw new ZstdError('Huffman invalid code', 'corruption_detected');
181
+ }
182
+ out[i] = row.symbol;
183
+ }
184
+ return out;
185
+ }
186
+ /**
187
+ * Decode compressed literals (Huffman). Requires Huffman table from tree description.
188
+ */
189
+ export function decodeCompressedLiterals(data, offset, compressedSize, regeneratedSize, numStreams) {
190
+ let pos = offset;
191
+ let huffmanTable;
192
+ if (pos >= data.length) {
193
+ throw new ZstdError('Huffman tree description truncated', 'corruption_detected');
194
+ }
195
+ const headerByte = data[pos] ?? 0;
196
+ pos++;
197
+ let weights;
198
+ let treeBytes;
199
+ if (headerByte >= 128) {
200
+ const numWeights = headerByte - 127;
201
+ const { weights: w, bytesRead } = readWeightsDirect(data, pos, numWeights);
202
+ weights = w;
203
+ treeBytes = 1 + bytesRead;
204
+ pos += bytesRead;
205
+ }
206
+ else {
207
+ const { weights: w, bytesRead } = readWeightsFSE(data, pos, headerByte);
208
+ weights = w;
209
+ treeBytes = 1 + bytesRead;
210
+ pos += headerByte;
211
+ }
212
+ huffmanTable = weightsToHuffmanTable(weights);
213
+ const totalStreamsSize = compressedSize - treeBytes;
214
+ if (totalStreamsSize <= 0) {
215
+ throw new ZstdError('Invalid literals compressed size', 'corruption_detected');
216
+ }
217
+ const result = new Uint8Array(regeneratedSize);
218
+ let outPos = 0;
219
+ if (numStreams === 1) {
220
+ const lit = decodeHuffmanStreamByCount(data, pos, totalStreamsSize, huffmanTable.table, huffmanTable.maxNumBits, regeneratedSize);
221
+ result.set(lit);
222
+ }
223
+ else {
224
+ if (totalStreamsSize < 10) {
225
+ throw new ZstdError('4-stream mode requires at least 10 bytes', 'corruption_detected');
226
+ }
227
+ const s1 = (data[pos] ?? 0) | ((data[pos + 1] ?? 0) << 8);
228
+ const s2 = (data[pos + 2] ?? 0) | ((data[pos + 3] ?? 0) << 8);
229
+ const s3 = (data[pos + 4] ?? 0) | ((data[pos + 5] ?? 0) << 8);
230
+ const stream1Size = s1;
231
+ const stream2Size = s2;
232
+ const stream3Size = s3;
233
+ const stream4Size = totalStreamsSize - 6 - stream1Size - stream2Size - stream3Size;
234
+ if (stream4Size < 0) {
235
+ throw new ZstdError(`Invalid jump table in 4-stream literals: total=${totalStreamsSize} s1=${stream1Size} s2=${stream2Size} s3=${stream3Size}`, 'corruption_detected');
236
+ }
237
+ let streamOffset = pos + 6;
238
+ const decodeStream = (size) => {
239
+ const lit = decodeHuffmanStreamToEnd(data, streamOffset, size, huffmanTable.table, huffmanTable.maxNumBits);
240
+ result.set(lit, outPos);
241
+ outPos += lit.length;
242
+ streamOffset += size;
243
+ };
244
+ decodeStream(stream1Size);
245
+ decodeStream(stream2Size);
246
+ decodeStream(stream3Size);
247
+ decodeStream(stream4Size);
248
+ if (outPos !== regeneratedSize) {
249
+ throw new ZstdError('Huffman literals size mismatch', 'corruption_detected');
250
+ }
251
+ }
252
+ return {
253
+ literals: result,
254
+ huffmanTable,
255
+ bytesRead: compressedSize,
256
+ };
257
+ }
258
+ /**
259
+ * Decode treeless literals (reuse previous Huffman table).
260
+ */
261
+ export function decodeTreelessLiterals(data, offset, compressedSize, regeneratedSize, numStreams, huffmanTable) {
262
+ const result = new Uint8Array(regeneratedSize);
263
+ let outPos = 0;
264
+ let pos = offset;
265
+ if (numStreams === 1) {
266
+ const lit = decodeHuffmanStreamByCount(data, pos, compressedSize, huffmanTable.table, huffmanTable.maxNumBits, regeneratedSize);
267
+ result.set(lit);
268
+ }
269
+ else {
270
+ if (compressedSize < 10) {
271
+ throw new ZstdError('4-stream mode requires at least 10 bytes', 'corruption_detected');
272
+ }
273
+ const s1 = (data[pos] ?? 0) | ((data[pos + 1] ?? 0) << 8);
274
+ const s2 = (data[pos + 2] ?? 0) | ((data[pos + 3] ?? 0) << 8);
275
+ const s3 = (data[pos + 4] ?? 0) | ((data[pos + 5] ?? 0) << 8);
276
+ const stream1Size = s1;
277
+ const stream2Size = s2;
278
+ const stream3Size = s3;
279
+ const stream4Size = compressedSize - 6 - stream1Size - stream2Size - stream3Size;
280
+ if (stream4Size < 0) {
281
+ throw new ZstdError(`Invalid jump table in 4-stream literals: total=${compressedSize} s1=${stream1Size} s2=${stream2Size} s3=${stream3Size}`, 'corruption_detected');
282
+ }
283
+ pos += 6;
284
+ const decodeStream = (size) => {
285
+ const lit = decodeHuffmanStreamToEnd(data, pos, size, huffmanTable.table, huffmanTable.maxNumBits);
286
+ result.set(lit, outPos);
287
+ outPos += lit.length;
288
+ pos += size;
289
+ };
290
+ decodeStream(stream1Size);
291
+ decodeStream(stream2Size);
292
+ decodeStream(stream3Size);
293
+ decodeStream(stream4Size);
294
+ if (outPos !== regeneratedSize) {
295
+ throw new ZstdError('Huffman literals size mismatch', 'corruption_detected');
296
+ }
297
+ }
298
+ return { literals: result, bytesRead: compressedSize };
299
+ }
300
+ //# sourceMappingURL=literals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"literals.js","sourceRoot":"","sources":["../../src/decode/literals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,52 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"literals.test.js","sourceRoot":"","sources":["../../src/decode/literals.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Sequence execution: copy literals + match copies with window.
3
+ */
4
+ export interface Sequence {
5
+ literalsLength: number;
6
+ offset: number;
7
+ matchLength: number;
8
+ }
9
+ /**
10
+ * Execute sequences to produce decompressed output.
11
+ * repOffsets: [Repeated_Offset1, Repeated_Offset2, Repeated_Offset3], updated in place.
12
+ */
13
+ export declare function executeSequences(literals: Uint8Array, sequences: Sequence[], windowSize: number, repOffsets?: [number, number, number], history?: Uint8Array): Uint8Array;
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Sequence execution: copy literals + match copies with window.
3
+ */
4
+ import { ZstdError } from '../errors.js';
5
+ /**
6
+ * Execute sequences to produce decompressed output.
7
+ * repOffsets: [Repeated_Offset1, Repeated_Offset2, Repeated_Offset3], updated in place.
8
+ */
9
+ export function executeSequences(literals, sequences, windowSize, repOffsets = [1, 4, 8], history = new Uint8Array(0)) {
10
+ // Sequence literals are slices of `literals`, so only matches expand output size.
11
+ const totalSize = literals.length + sequences.reduce((s, seq) => s + seq.matchLength, 0);
12
+ const historyLength = history.length;
13
+ const buffer = new Uint8Array(historyLength + totalSize);
14
+ if (historyLength > 0) {
15
+ buffer.set(history, 0);
16
+ }
17
+ let outPos = historyLength;
18
+ let litPos = 0;
19
+ for (const seq of sequences) {
20
+ for (let i = 0; i < seq.literalsLength; i++) {
21
+ buffer[outPos++] = literals[litPos++] ?? 0;
22
+ }
23
+ const ov = seq.offset; // Offset_Value from sequence decode.
24
+ const ll0 = seq.literalsLength === 0;
25
+ let offset;
26
+ let repeatIndex = null;
27
+ const isNonRepeat = ov > 3 || (ov === 3 && ll0);
28
+ if (isNonRepeat) {
29
+ if (ov === 3) {
30
+ offset = repOffsets[0] - 1;
31
+ if (offset === 0) {
32
+ throw new ZstdError('Invalid match offset: repeat1-1 is 0', 'corruption_detected');
33
+ }
34
+ }
35
+ else {
36
+ offset = ov - 3;
37
+ }
38
+ }
39
+ else {
40
+ if (ll0) {
41
+ repeatIndex = ov === 1 ? 1 : 2;
42
+ }
43
+ else {
44
+ repeatIndex = (ov - 1);
45
+ }
46
+ offset = repOffsets[repeatIndex] ?? 0;
47
+ }
48
+ const produced = outPos - historyLength;
49
+ const maxReachBack = produced <= windowSize ? produced + historyLength : windowSize;
50
+ if (offset <= 0 || offset > maxReachBack) {
51
+ throw new ZstdError(`Invalid match offset: offset=${offset} maxReachBack=${maxReachBack} produced=${produced} history=${historyLength} window=${windowSize}`, 'corruption_detected');
52
+ }
53
+ for (let i = 0; i < seq.matchLength; i++) {
54
+ buffer[outPos] = buffer[outPos - offset] ?? 0;
55
+ outPos++;
56
+ }
57
+ if (isNonRepeat) {
58
+ repOffsets[2] = repOffsets[1];
59
+ repOffsets[1] = repOffsets[0];
60
+ repOffsets[0] = offset;
61
+ }
62
+ else {
63
+ // Move the used repeated offset to the front.
64
+ if (repeatIndex === 1) {
65
+ repOffsets[1] = repOffsets[0];
66
+ repOffsets[0] = offset;
67
+ }
68
+ else if (repeatIndex === 2) {
69
+ repOffsets[2] = repOffsets[1];
70
+ repOffsets[1] = repOffsets[0];
71
+ repOffsets[0] = offset;
72
+ }
73
+ }
74
+ }
75
+ while (litPos < literals.length) {
76
+ buffer[outPos++] = literals[litPos++] ?? 0;
77
+ }
78
+ return buffer.subarray(historyLength, outPos).slice();
79
+ }
80
+ //# sourceMappingURL=reconstruct.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconstruct.js","sourceRoot":"","sources":["../../src/decode/reconstruct.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,42 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,32 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Decode sequences section from compressed block.
3
+ * Decodes LL, ML, Offset FSE streams and produces Sequence tuples.
4
+ */
5
+ import { type FSEDecodeRow } from '../entropy/fse.js';
6
+ import type { Sequence } from './reconstruct.js';
7
+ export type CompressionMode = 0 | 1 | 2 | 3;
8
+ export interface SequenceTables {
9
+ llTable: FSEDecodeRow[];
10
+ llTableLog: number;
11
+ ofTable: FSEDecodeRow[];
12
+ ofTableLog: number;
13
+ mlTable: FSEDecodeRow[];
14
+ mlTableLog: number;
15
+ }
16
+ export interface DecodeSequencesResult {
17
+ sequences: Sequence[];
18
+ tables: SequenceTables;
19
+ bytesRead: number;
20
+ }
21
+ export declare function decodeSequences(data: Uint8Array, offset: number, size: number, prevTables: SequenceTables | null): DecodeSequencesResult;