@flighthq/compression 0.3.0 → 0.3.1-next.1041.35b950c
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/dist/deflate.d.ts.map +1 -1
- package/dist/deflate.js +65 -25
- package/dist/deflate.js.map +1 -1
- package/package.json +2 -2
- package/src/deflate.test.ts +287 -14
package/dist/deflate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deflate.d.ts","sourceRoot":"","sources":["../src/deflate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"deflate.d.ts","sourceRoot":"","sources":["../src/deflate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAgB7D,eAAO,MAAM,cAAc,EAAE,YAoB5B,CAAC;AAKF,wBAAgB,2BAA2B,IAAI,IAAI,CAElD"}
|
package/dist/deflate.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Compression } from '@flighthq/types/contract';
|
|
1
|
+
import { Compression, CompressionFraming } from '@flighthq/types/contract';
|
|
2
2
|
import { registerDecompressor } from './decompressor';
|
|
3
3
|
// Dependency-free, synchronous RFC 1951 (DEFLATE) and RFC 1950 (zlib) decoding. Kept in its own module so
|
|
4
4
|
// the registry stays tree-shakable: a bundle that never calls `registerDeflateDecompressor` pays nothing
|
|
@@ -7,21 +7,31 @@ import { registerDecompressor } from './decompressor';
|
|
|
7
7
|
// wasm codec registers that instead.
|
|
8
8
|
//
|
|
9
9
|
// Real containers mix the two framings — SWF's `CWS` body and Away3D's `ByteArray.compress()` are zlib
|
|
10
|
-
// (a 2-byte header, the DEFLATE stream, an Adler-32), while other producers emit the bare stream
|
|
11
|
-
//
|
|
12
|
-
// `uncompressedLength` is
|
|
13
|
-
|
|
10
|
+
// (a 2-byte header, the DEFLATE stream, an Adler-32), while other producers emit the bare stream. The
|
|
11
|
+
// caller supplies that container-owned fact explicitly because the first raw bytes can also form a valid
|
|
12
|
+
// zlib header. A nonzero `uncompressedLength` is a ceiling enforced while bytes are written; callers
|
|
13
|
+
// without one pass 0 and retain the package-wide safety cap.
|
|
14
|
+
export const inflateDeflate = (compressed, uncompressedLength, framing) => {
|
|
14
15
|
const input = compressed;
|
|
15
|
-
// A zlib header: the low nibble of CMF is the compression method (8 = deflate) and the big-endian
|
|
16
|
-
// (CMF,FLG) pair is a multiple of 31. A preset dictionary (FDICT) is not supported.
|
|
17
16
|
let start = 0;
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
let end = input.length;
|
|
18
|
+
if (framing === CompressionFraming.Rfc1950) {
|
|
19
|
+
if (input.length < ZLIB_HEADER_BYTES + ZLIB_TRAILER_BYTES)
|
|
20
|
+
return null;
|
|
21
|
+
const cmf = input[0];
|
|
22
|
+
const flg = input[1];
|
|
23
|
+
if ((cmf & 0x0f) !== 8 || cmf >> 4 > 7 || ((cmf << 8) | flg) % 31 !== 0 || (flg & 0x20) !== 0)
|
|
20
24
|
return null;
|
|
21
25
|
start = 2;
|
|
26
|
+
end -= ZLIB_TRAILER_BYTES;
|
|
22
27
|
}
|
|
28
|
+
else if (framing !== CompressionFraming.Raw)
|
|
29
|
+
return null;
|
|
23
30
|
try {
|
|
24
|
-
|
|
31
|
+
const output = rawInflate(input.subarray(0, end), start, uncompressedLength);
|
|
32
|
+
if (framing === CompressionFraming.Rfc1950 && readZlibAdler32(input, end) !== computeAdler32(output))
|
|
33
|
+
return null;
|
|
34
|
+
return output;
|
|
25
35
|
}
|
|
26
36
|
catch {
|
|
27
37
|
return null;
|
|
@@ -53,13 +63,16 @@ const CODE_LENGTH_ORDER = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2
|
|
|
53
63
|
class InflateState {
|
|
54
64
|
input;
|
|
55
65
|
position;
|
|
66
|
+
outputLimit;
|
|
56
67
|
bitBuffer = 0;
|
|
57
68
|
bitCount = 0;
|
|
58
|
-
output
|
|
69
|
+
output;
|
|
59
70
|
outputLength = 0;
|
|
60
|
-
constructor(input, position) {
|
|
71
|
+
constructor(input, position, outputLimit) {
|
|
61
72
|
this.input = input;
|
|
62
73
|
this.position = position;
|
|
74
|
+
this.outputLimit = outputLimit;
|
|
75
|
+
this.output = new Uint8Array(Math.min(INITIAL_INFLATE_BYTES, outputLimit));
|
|
63
76
|
}
|
|
64
77
|
readBit() {
|
|
65
78
|
if (this.bitCount === 0) {
|
|
@@ -80,6 +93,8 @@ class InflateState {
|
|
|
80
93
|
return value + base;
|
|
81
94
|
}
|
|
82
95
|
writeByte(byte) {
|
|
96
|
+
if (this.outputLength >= this.outputLimit)
|
|
97
|
+
throw new Error('deflate: output exceeds the inflate limit');
|
|
83
98
|
if (this.outputLength >= this.output.length) {
|
|
84
99
|
// Every other bound in this package is a field checked against the buffer. This one cannot be:
|
|
85
100
|
// the quantity that sizes the allocation is the COMPRESSION RATIO, which is not in the file, is
|
|
@@ -87,9 +102,7 @@ class InflateState {
|
|
|
87
102
|
// length back-references expands to gigabytes and takes the process with it — unrecoverable, and
|
|
88
103
|
// reachable from any untrusted .awd. Where the file cannot bound the allocation, an explicit cap
|
|
89
104
|
// has to.
|
|
90
|
-
|
|
91
|
-
throw new Error('deflate: output exceeds the inflate limit');
|
|
92
|
-
const grown = new Uint8Array(this.output.length * 2);
|
|
105
|
+
const grown = new Uint8Array(Math.min(this.output.length * 2, this.outputLimit));
|
|
93
106
|
grown.set(this.output);
|
|
94
107
|
this.output = grown;
|
|
95
108
|
}
|
|
@@ -97,8 +110,9 @@ class InflateState {
|
|
|
97
110
|
}
|
|
98
111
|
}
|
|
99
112
|
// Inflates the raw DEFLATE block stream at `start`, returning exactly the decompressed bytes.
|
|
100
|
-
function rawInflate(input, start) {
|
|
101
|
-
const
|
|
113
|
+
function rawInflate(input, start, uncompressedLength) {
|
|
114
|
+
const declaredLimit = uncompressedLength > 0 ? uncompressedLength : MAX_INFLATE_BYTES;
|
|
115
|
+
const state = new InflateState(input, start, Math.min(declaredLimit, MAX_INFLATE_BYTES));
|
|
102
116
|
let final = 0;
|
|
103
117
|
do {
|
|
104
118
|
final = state.readBit();
|
|
@@ -112,7 +126,7 @@ function rawInflate(input, start) {
|
|
|
112
126
|
else
|
|
113
127
|
throw new Error('deflate: invalid block type');
|
|
114
128
|
} while (final === 0);
|
|
115
|
-
return state.output.slice(0, state.outputLength);
|
|
129
|
+
return state.outputLength === state.output.length ? state.output : state.output.slice(0, state.outputLength);
|
|
116
130
|
}
|
|
117
131
|
// A stored (uncompressed) block: align to the next byte, read the 16-bit LEN and its one's-complement
|
|
118
132
|
// NLEN, then copy LEN literal bytes.
|
|
@@ -163,6 +177,8 @@ function inflateDynamicBlock(state) {
|
|
|
163
177
|
const literalCount = state.readBits(5, 257);
|
|
164
178
|
const distanceCount = state.readBits(5, 1);
|
|
165
179
|
const codeLengthCount = state.readBits(4, 4);
|
|
180
|
+
if (literalCount > 286)
|
|
181
|
+
throw new Error('deflate: too many literal/length symbols');
|
|
166
182
|
const codeLengthLengths = new Array(19).fill(0);
|
|
167
183
|
for (let i = 0; i < codeLengthCount; i++)
|
|
168
184
|
codeLengthLengths[CODE_LENGTH_ORDER[i]] = state.readBits(3, 0);
|
|
@@ -180,23 +196,27 @@ function inflateDynamicBlock(state) {
|
|
|
180
196
|
if (i === 0)
|
|
181
197
|
throw new Error('deflate: repeat with no previous length');
|
|
182
198
|
const repeat = state.readBits(2, 3);
|
|
199
|
+
if (i + repeat > lengths.length)
|
|
200
|
+
throw new Error('deflate: code-length repeat exceeds the declared table');
|
|
183
201
|
const previous = lengths[i - 1];
|
|
184
|
-
for (let r = 0; r < repeat
|
|
202
|
+
for (let r = 0; r < repeat; r++)
|
|
185
203
|
lengths[i++] = previous;
|
|
186
204
|
}
|
|
187
205
|
else if (symbol === 17) {
|
|
188
206
|
const repeat = state.readBits(3, 3);
|
|
189
|
-
|
|
207
|
+
if (i + repeat > lengths.length)
|
|
208
|
+
throw new Error('deflate: code-length repeat exceeds the declared table');
|
|
209
|
+
for (let r = 0; r < repeat; r++)
|
|
190
210
|
lengths[i++] = 0;
|
|
191
211
|
}
|
|
192
|
-
else
|
|
212
|
+
else {
|
|
213
|
+
// The code-length alphabet has exactly symbols 0-18, so after the cases above this is 18.
|
|
193
214
|
const repeat = state.readBits(7, 11);
|
|
194
|
-
|
|
215
|
+
if (i + repeat > lengths.length)
|
|
216
|
+
throw new Error('deflate: code-length repeat exceeds the declared table');
|
|
217
|
+
for (let r = 0; r < repeat; r++)
|
|
195
218
|
lengths[i++] = 0;
|
|
196
219
|
}
|
|
197
|
-
else {
|
|
198
|
-
throw new Error('deflate: invalid code-length symbol');
|
|
199
|
-
}
|
|
200
220
|
}
|
|
201
221
|
const literalTree = buildHuffmanTree(lengths.slice(0, literalCount), literalCount);
|
|
202
222
|
const distanceTree = buildHuffmanTree(lengths.slice(literalCount), distanceCount);
|
|
@@ -237,6 +257,22 @@ function decodeSymbol(state, tree) {
|
|
|
237
257
|
}
|
|
238
258
|
throw new Error('deflate: invalid Huffman code');
|
|
239
259
|
}
|
|
260
|
+
function computeAdler32(input) {
|
|
261
|
+
let first = 1;
|
|
262
|
+
let second = 0;
|
|
263
|
+
for (const byte of input) {
|
|
264
|
+
first += byte;
|
|
265
|
+
if (first >= ADLER_MODULUS)
|
|
266
|
+
first -= ADLER_MODULUS;
|
|
267
|
+
second += first;
|
|
268
|
+
if (second >= ADLER_MODULUS)
|
|
269
|
+
second -= ADLER_MODULUS;
|
|
270
|
+
}
|
|
271
|
+
return ((second << 16) | first) >>> 0;
|
|
272
|
+
}
|
|
273
|
+
function readZlibAdler32(input, offset) {
|
|
274
|
+
return ((input[offset] << 24) | (input[offset + 1] << 16) | (input[offset + 2] << 8) | input[offset + 3]) >>> 0;
|
|
275
|
+
}
|
|
240
276
|
// The RFC 1951 fixed Huffman trees: literals/lengths 0-287 (lengths 8/9/7/8 by range) and 5-bit distances.
|
|
241
277
|
const FIXED_LITERAL_TREE = buildFixedLiteralTree();
|
|
242
278
|
const FIXED_DISTANCE_TREE = buildHuffmanTree(new Array(30).fill(5), 30);
|
|
@@ -255,4 +291,8 @@ function buildFixedLiteralTree() {
|
|
|
255
291
|
// The ceiling on a single inflate. Generous for any real AWD body — a 256 MB scene is far past what
|
|
256
292
|
// this importer is used for — and small enough that hitting it fails a parse instead of the process.
|
|
257
293
|
const MAX_INFLATE_BYTES = 256 * 1024 * 1024;
|
|
294
|
+
const INITIAL_INFLATE_BYTES = 1024;
|
|
295
|
+
const ZLIB_HEADER_BYTES = 2;
|
|
296
|
+
const ZLIB_TRAILER_BYTES = 4;
|
|
297
|
+
const ADLER_MODULUS = 65521;
|
|
258
298
|
//# sourceMappingURL=deflate.js.map
|
package/dist/deflate.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deflate.js","sourceRoot":"","sources":["../src/deflate.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"deflate.js","sourceRoot":"","sources":["../src/deflate.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flighthq/compression",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.1-next.1041.35b950c",
|
|
4
4
|
"author": "Joshua Granick and other contributors",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
"clean:dist": "tsx ../../scripts/clean-package-dist.ts"
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
|
-
"@flighthq/types": "0.3.
|
|
41
|
+
"@flighthq/types": "0.3.1-next.1041.35b950c"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"typescript": "^5.3.0"
|
package/src/deflate.test.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Compression } from '@flighthq/types/contract';
|
|
1
|
+
import { Compression, CompressionFraming } from '@flighthq/types/contract';
|
|
2
2
|
|
|
3
3
|
import { getDecompressor, unregisterDecompressor } from './decompressor';
|
|
4
4
|
import { inflateDeflate, registerDeflateDecompressor } from './deflate';
|
|
@@ -53,9 +53,172 @@ function decodeBase64(input: string): Uint8Array {
|
|
|
53
53
|
|
|
54
54
|
const encode = (s: string): Uint8Array => new TextEncoder().encode(s);
|
|
55
55
|
|
|
56
|
+
function decodeHex(input: string): Uint8Array {
|
|
57
|
+
const out = new Uint8Array(input.length / 2);
|
|
58
|
+
for (let i = 0; i < out.length; i++) out[i] = Number.parseInt(input.slice(i * 2, i * 2 + 2), 16);
|
|
59
|
+
return out;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function packDeflateBits(bits: readonly number[]): Uint8Array {
|
|
63
|
+
const out = new Uint8Array(Math.ceil(bits.length / 8));
|
|
64
|
+
for (let i = 0; i < bits.length; i++) out[i >> 3] |= bits[i] << (i & 7);
|
|
65
|
+
return out;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function pushLsbValue(bits: number[], value: number, count: number): void {
|
|
69
|
+
for (let i = 0; i < count; i++) bits.push((value >> i) & 1);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function pushCanonicalCode(bits: number[], code: number, count: number): void {
|
|
73
|
+
// DEFLATE transmits a Huffman code from its most-significant bit while packing those bits into each
|
|
74
|
+
// byte least-significant first. Keeping those two directions separate makes the malformed fixtures
|
|
75
|
+
// below readable instead of hiding their discriminator in opaque hex.
|
|
76
|
+
for (let i = count - 1; i >= 0; i--) bits.push((code >> i) & 1);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function pushFixedLiteralCode(bits: number[], symbol: number): void {
|
|
80
|
+
if (symbol <= 143) pushCanonicalCode(bits, 0x30 + symbol, 8);
|
|
81
|
+
else if (symbol <= 255) pushCanonicalCode(bits, 0x190 + symbol - 144, 9);
|
|
82
|
+
else if (symbol <= 279) pushCanonicalCode(bits, symbol - 256, 7);
|
|
83
|
+
else pushCanonicalCode(bits, 0xc0 + symbol - 280, 8);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function createFixedBackReferenceStream(lengthSymbol: number, distanceSymbol?: number): Uint8Array {
|
|
87
|
+
const bits: number[] = [];
|
|
88
|
+
pushLsbValue(bits, 1, 1); // BFINAL
|
|
89
|
+
pushLsbValue(bits, 1, 2); // BTYPE=fixed Huffman
|
|
90
|
+
pushFixedLiteralCode(bits, lengthSymbol);
|
|
91
|
+
if (distanceSymbol !== undefined) pushCanonicalCode(bits, distanceSymbol, 5);
|
|
92
|
+
return packDeflateBits(bits);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
const CODE_LENGTH_ORDER = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15] as const;
|
|
96
|
+
|
|
97
|
+
function pushDynamicHeader(
|
|
98
|
+
bits: number[],
|
|
99
|
+
literalCount: number,
|
|
100
|
+
distanceCount: number,
|
|
101
|
+
codeLengths: ReadonlyMap<number, number>,
|
|
102
|
+
): void {
|
|
103
|
+
pushLsbValue(bits, 1, 1); // BFINAL
|
|
104
|
+
pushLsbValue(bits, 2, 2); // BTYPE=dynamic Huffman
|
|
105
|
+
pushLsbValue(bits, literalCount - 257, 5);
|
|
106
|
+
pushLsbValue(bits, distanceCount - 1, 5);
|
|
107
|
+
let codeLengthCount = 4;
|
|
108
|
+
for (let i = 0; i < CODE_LENGTH_ORDER.length; i++) {
|
|
109
|
+
if ((codeLengths.get(CODE_LENGTH_ORDER[i]) ?? 0) !== 0) codeLengthCount = i + 1;
|
|
110
|
+
}
|
|
111
|
+
pushLsbValue(bits, codeLengthCount - 4, 4);
|
|
112
|
+
for (let i = 0; i < codeLengthCount; i++) pushLsbValue(bits, codeLengths.get(CODE_LENGTH_ORDER[i]) ?? 0, 3);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function createDynamicRepeatOverflowStream(symbol: 16 | 17 | 18): Uint8Array {
|
|
116
|
+
const bits: number[] = [];
|
|
117
|
+
// Code-length symbols 0, 1, and the repeat have canonical codes 0, 10, and 11. The table first
|
|
118
|
+
// declares 256 unused literals and an EOB of length one. The repeat then starts at the final distance
|
|
119
|
+
// slot but asks for at least three entries. A truncating decoder turns that into a valid empty block;
|
|
120
|
+
// a conforming decoder rejects the overrun before it can be hidden by the table boundary.
|
|
121
|
+
pushDynamicHeader(
|
|
122
|
+
bits,
|
|
123
|
+
257,
|
|
124
|
+
1,
|
|
125
|
+
new Map([
|
|
126
|
+
[0, 1],
|
|
127
|
+
[1, 2],
|
|
128
|
+
[symbol, 2],
|
|
129
|
+
]),
|
|
130
|
+
);
|
|
131
|
+
for (let i = 0; i < 256; i++) pushCanonicalCode(bits, 0, 1);
|
|
132
|
+
pushCanonicalCode(bits, 2, 2); // symbol 1: EOB length
|
|
133
|
+
pushCanonicalCode(bits, 3, 2); // repeat symbol
|
|
134
|
+
pushLsbValue(bits, 0, symbol === 16 ? 2 : symbol === 17 ? 3 : 7);
|
|
135
|
+
pushCanonicalCode(bits, 0, 1); // EOB in the block a truncating decoder would accept
|
|
136
|
+
return packDeflateBits(bits);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function createValidDynamicRepeatStream(symbol: 16 | 17 | 18): Uint8Array {
|
|
140
|
+
const bits: number[] = [];
|
|
141
|
+
if (symbol === 16) {
|
|
142
|
+
// Symbols 0, 2, 16 use codes 0, 10, 11. After 254 zero lengths, length 2 is repeated three times,
|
|
143
|
+
// filling literal 254, literal 255, EOB 256, and the sole distance entry exactly.
|
|
144
|
+
pushDynamicHeader(
|
|
145
|
+
bits,
|
|
146
|
+
257,
|
|
147
|
+
1,
|
|
148
|
+
new Map([
|
|
149
|
+
[0, 1],
|
|
150
|
+
[2, 2],
|
|
151
|
+
[16, 2],
|
|
152
|
+
]),
|
|
153
|
+
);
|
|
154
|
+
for (let i = 0; i < 254; i++) pushCanonicalCode(bits, 0, 1);
|
|
155
|
+
pushCanonicalCode(bits, 2, 2);
|
|
156
|
+
pushCanonicalCode(bits, 3, 2);
|
|
157
|
+
pushLsbValue(bits, 0, 2);
|
|
158
|
+
pushCanonicalCode(bits, 2, 2); // literal 256 is the third length-2 code
|
|
159
|
+
} else {
|
|
160
|
+
// Symbols 0, 1, repeat use codes 0, 10, 11. A legal minimum repeat begins the zero run; explicit
|
|
161
|
+
// zeroes finish literals 0-255, then EOB gets length one and the distance entry stays unused.
|
|
162
|
+
pushDynamicHeader(
|
|
163
|
+
bits,
|
|
164
|
+
257,
|
|
165
|
+
1,
|
|
166
|
+
new Map([
|
|
167
|
+
[0, 1],
|
|
168
|
+
[1, 2],
|
|
169
|
+
[symbol, 2],
|
|
170
|
+
]),
|
|
171
|
+
);
|
|
172
|
+
pushCanonicalCode(bits, 3, 2);
|
|
173
|
+
pushLsbValue(bits, 0, symbol === 17 ? 3 : 7);
|
|
174
|
+
const repeat = symbol === 17 ? 3 : 11;
|
|
175
|
+
for (let i = repeat; i < 256; i++) pushCanonicalCode(bits, 0, 1);
|
|
176
|
+
pushCanonicalCode(bits, 2, 2);
|
|
177
|
+
pushCanonicalCode(bits, 0, 1);
|
|
178
|
+
pushCanonicalCode(bits, 0, 1); // EOB
|
|
179
|
+
}
|
|
180
|
+
return packDeflateBits(bits);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
function createReservedDynamicDistanceStream(): Uint8Array {
|
|
184
|
+
const bits: number[] = [];
|
|
185
|
+
// Literal 256 (EOB) and 257 (length 3) are the two one-bit literal codes. Distance 30 is the only
|
|
186
|
+
// distance code. It is representable in the dynamic alphabet but reserved by RFC 1951.
|
|
187
|
+
pushDynamicHeader(
|
|
188
|
+
bits,
|
|
189
|
+
258,
|
|
190
|
+
31,
|
|
191
|
+
new Map([
|
|
192
|
+
[0, 1],
|
|
193
|
+
[1, 1],
|
|
194
|
+
]),
|
|
195
|
+
);
|
|
196
|
+
for (let i = 0; i < 256; i++) pushCanonicalCode(bits, 0, 1);
|
|
197
|
+
pushCanonicalCode(bits, 1, 1);
|
|
198
|
+
pushCanonicalCode(bits, 1, 1);
|
|
199
|
+
for (let i = 0; i < 30; i++) pushCanonicalCode(bits, 0, 1);
|
|
200
|
+
pushCanonicalCode(bits, 1, 1);
|
|
201
|
+
pushCanonicalCode(bits, 1, 1); // literal 257
|
|
202
|
+
pushCanonicalCode(bits, 0, 1); // reserved distance 30
|
|
203
|
+
return packDeflateBits(bits);
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function createRawStoredStreamStartingWithZlibHeader(): { payload: Uint8Array; stream: Uint8Array } {
|
|
207
|
+
const payload = new Uint8Array(156);
|
|
208
|
+
for (let i = 0; i < payload.length; i++) payload[i] = i;
|
|
209
|
+
|
|
210
|
+
const stream = new Uint8Array(1 + 4 + payload.length + 5);
|
|
211
|
+
// 0x78 has BFINAL=0/BTYPE=00 in its low three bits. The remaining padding bits are ignored; the next
|
|
212
|
+
// byte is LEN=0x009c, so the valid raw stream deliberately begins with the common zlib header 78 9c.
|
|
213
|
+
stream.set([0x78, 0x9c, 0x00, 0x63, 0xff]);
|
|
214
|
+
stream.set(payload, 5);
|
|
215
|
+
stream.set([0x01, 0x00, 0x00, 0xff, 0xff], 5 + payload.length);
|
|
216
|
+
return { payload, stream };
|
|
217
|
+
}
|
|
218
|
+
|
|
56
219
|
describe('inflateDeflate', () => {
|
|
57
220
|
it('round-trips empty input', () => {
|
|
58
|
-
expect(inflateDeflate(decodeBase64(FIXTURES.EMPTY), 0)).toEqual(new Uint8Array(0));
|
|
221
|
+
expect(inflateDeflate(decodeBase64(FIXTURES.EMPTY), 0, CompressionFraming.Rfc1950)).toEqual(new Uint8Array(0));
|
|
59
222
|
});
|
|
60
223
|
|
|
61
224
|
it('keeps inflating a stream whose expansion ratio is large but bounded', () => {
|
|
@@ -65,41 +228,151 @@ describe('inflateDeflate', () => {
|
|
|
65
228
|
// fixture is 124 bytes expanding 528x to 64 KB, and must still round-trip byte for byte.
|
|
66
229
|
const source = new Uint8Array(64 * 1024);
|
|
67
230
|
for (let i = 0; i < source.length; i++) source[i] = i % 7;
|
|
68
|
-
expect(inflateDeflate(decodeBase64(FIXTURES.HIGH_RATIO), 0)).toEqual(source);
|
|
231
|
+
expect(inflateDeflate(decodeBase64(FIXTURES.HIGH_RATIO), 0, CompressionFraming.Rfc1950)).toEqual(source);
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
it('stops expansion at the container-declared output bound', () => {
|
|
235
|
+
const compressed = decodeBase64(FIXTURES.HIGH_RATIO);
|
|
236
|
+
expect(inflateDeflate(compressed, 64 * 1024, CompressionFraming.Rfc1950)).toHaveLength(64 * 1024);
|
|
237
|
+
expect(inflateDeflate(compressed, 64 * 1024 - 1, CompressionFraming.Rfc1950)).toBeNull();
|
|
69
238
|
});
|
|
70
239
|
|
|
71
240
|
it('round-trips a short literal run (zlib-wrapped)', () => {
|
|
72
|
-
expect(inflateDeflate(decodeBase64(FIXTURES.LITERAL), 0)).toEqual(
|
|
241
|
+
expect(inflateDeflate(decodeBase64(FIXTURES.LITERAL), 0, CompressionFraming.Rfc1950)).toEqual(
|
|
242
|
+
encode('flighthq scene-formats'),
|
|
243
|
+
);
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
it('round-trips a headerless raw DEFLATE stream when explicitly requested', () => {
|
|
247
|
+
expect(inflateDeflate(decodeBase64(FIXTURES.RAW_LITERAL), 0, CompressionFraming.Raw)).toEqual(
|
|
248
|
+
encode('flighthq scene-formats'),
|
|
249
|
+
);
|
|
73
250
|
});
|
|
74
251
|
|
|
75
|
-
it('
|
|
76
|
-
|
|
252
|
+
it('does not mistake a valid raw stream beginning 78 9c for zlib framing', () => {
|
|
253
|
+
const { payload, stream } = createRawStoredStreamStartingWithZlibHeader();
|
|
254
|
+
expect(inflateDeflate(stream, payload.length, CompressionFraming.Raw)).toEqual(payload);
|
|
255
|
+
expect(inflateDeflate(stream, payload.length, CompressionFraming.Rfc1950)).toBeNull();
|
|
77
256
|
});
|
|
78
257
|
|
|
79
258
|
it('round-trips highly repetitive data through back-references and grows the output buffer', () => {
|
|
80
259
|
// 5400 bytes out — past the 1024-byte initial buffer, exercising the grow path.
|
|
81
|
-
expect(inflateDeflate(decodeBase64(FIXTURES.REPETITIVE), 0)).toEqual(
|
|
260
|
+
expect(inflateDeflate(decodeBase64(FIXTURES.REPETITIVE), 0, CompressionFraming.Rfc1950)).toEqual(
|
|
261
|
+
encode('abcABC123'.repeat(600)),
|
|
262
|
+
);
|
|
82
263
|
});
|
|
83
264
|
|
|
84
265
|
it('round-trips prose through a genuine dynamic-Huffman block', () => {
|
|
85
266
|
// Verified offline that zlib emits BTYPE=2 (dynamic Huffman) for this input, exercising the
|
|
86
267
|
// dynamic literal/length + distance code-length decode path.
|
|
87
|
-
expect(inflateDeflate(decodeBase64(FIXTURES.LOREM), 0)).toEqual(
|
|
268
|
+
expect(inflateDeflate(decodeBase64(FIXTURES.LOREM), 0, CompressionFraming.Rfc1950)).toEqual(
|
|
269
|
+
encode(LOREM.repeat(12)),
|
|
270
|
+
);
|
|
88
271
|
});
|
|
89
272
|
|
|
90
273
|
it('round-trips a stored (level 0) block', () => {
|
|
91
|
-
expect(inflateDeflate(decodeBase64(FIXTURES.STORED_L0), 0)).toEqual(
|
|
274
|
+
expect(inflateDeflate(decodeBase64(FIXTURES.STORED_L0), 0, CompressionFraming.Rfc1950)).toEqual(
|
|
92
275
|
encode('the quick brown fox jumps over the lazy dog'),
|
|
93
276
|
);
|
|
94
277
|
});
|
|
95
278
|
|
|
96
279
|
it('returns null on a truncated stream rather than throwing', () => {
|
|
97
|
-
expect(inflateDeflate(decodeBase64(FIXTURES.REPETITIVE).subarray(0, 6), 0)).toBeNull();
|
|
280
|
+
expect(inflateDeflate(decodeBase64(FIXTURES.REPETITIVE).subarray(0, 6), 0, CompressionFraming.Rfc1950)).toBeNull();
|
|
98
281
|
});
|
|
99
282
|
|
|
100
283
|
it('returns null on a corrupt (invalid block type) stream', () => {
|
|
101
284
|
// 0x78 0x9c is a valid zlib header; 0xff 0xff after it decodes an invalid block type.
|
|
102
|
-
expect(
|
|
285
|
+
expect(
|
|
286
|
+
inflateDeflate(new Uint8Array([0x78, 0x9c, 0xff, 0xff, 0, 0, 0, 0]), 0, CompressionFraming.Rfc1950),
|
|
287
|
+
).toBeNull();
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
it('rejects undersized zlib wrappers and unknown framing values', () => {
|
|
291
|
+
expect(inflateDeflate(new Uint8Array([0x78, 0x9c, 0, 0, 0]), 0, CompressionFraming.Rfc1950)).toBeNull();
|
|
292
|
+
expect(inflateDeflate(decodeBase64(FIXTURES.RAW_LITERAL), 0, 'Unknown' as never)).toBeNull();
|
|
293
|
+
});
|
|
294
|
+
|
|
295
|
+
it('rejects truncated stored-block headers and payloads', () => {
|
|
296
|
+
expect(inflateDeflate(new Uint8Array([0x01, 0, 0]), 0, CompressionFraming.Raw)).toBeNull();
|
|
297
|
+
expect(inflateDeflate(new Uint8Array([0x01, 0x02, 0, 0xfd, 0xff, 0x41]), 0, CompressionFraming.Raw)).toBeNull();
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
it('rejects reserved fixed length symbols and back-references before the output', () => {
|
|
301
|
+
expect(inflateDeflate(createFixedBackReferenceStream(286), 0, CompressionFraming.Raw)).toBeNull();
|
|
302
|
+
expect(inflateDeflate(createFixedBackReferenceStream(257, 0), 0, CompressionFraming.Raw)).toBeNull();
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
it('rejects a reserved dynamic distance symbol', () => {
|
|
306
|
+
expect(inflateDeflate(createReservedDynamicDistanceStream(), 0, CompressionFraming.Raw)).toBeNull();
|
|
307
|
+
});
|
|
308
|
+
|
|
309
|
+
it('rejects a missing or corrupt zlib Adler-32 trailer', () => {
|
|
310
|
+
const valid = decodeBase64(FIXTURES.LITERAL);
|
|
311
|
+
const corrupt = valid.slice();
|
|
312
|
+
corrupt[corrupt.length - 1] ^= 1;
|
|
313
|
+
expect(inflateDeflate(valid.subarray(0, valid.length - 4), 0, CompressionFraming.Rfc1950)).toBeNull();
|
|
314
|
+
expect(inflateDeflate(corrupt, 0, CompressionFraming.Rfc1950)).toBeNull();
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
it('rejects illegal zlib methods, window sizes, check bits, and preset dictionaries', () => {
|
|
318
|
+
const illegalMethod = decodeBase64(FIXTURES.LITERAL);
|
|
319
|
+
illegalMethod[0] = 0x77;
|
|
320
|
+
illegalMethod[1] = 0x09; // FCHECK-valid for CM=7, so only the forbidden compression method rejects it.
|
|
321
|
+
expect(inflateDeflate(illegalMethod, 0, CompressionFraming.Rfc1950)).toBeNull();
|
|
322
|
+
|
|
323
|
+
const illegalWindow = decodeBase64(FIXTURES.LITERAL);
|
|
324
|
+
illegalWindow[0] = 0xf8;
|
|
325
|
+
illegalWindow[1] = 0x00;
|
|
326
|
+
expect(inflateDeflate(illegalWindow, 0, CompressionFraming.Rfc1950)).toBeNull();
|
|
327
|
+
|
|
328
|
+
const illegalCheck = decodeBase64(FIXTURES.LITERAL);
|
|
329
|
+
illegalCheck[1] ^= 1;
|
|
330
|
+
expect(inflateDeflate(illegalCheck, 0, CompressionFraming.Rfc1950)).toBeNull();
|
|
331
|
+
|
|
332
|
+
const presetDictionary = decodeBase64(FIXTURES.LITERAL);
|
|
333
|
+
presetDictionary[1] = 0xbb;
|
|
334
|
+
expect(inflateDeflate(presetDictionary, 0, CompressionFraming.Rfc1950)).toBeNull();
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
it('rejects a dynamic code-length repeat that exceeds the declared table', () => {
|
|
338
|
+
expect(inflateDeflate(decodeHex('05c0050900000000a0ffaf15'), 0, CompressionFraming.Raw)).toEqual(new Uint8Array());
|
|
339
|
+
expect(inflateDeflate(decodeHex('05c0050900000000a0ffaf0d'), 0, CompressionFraming.Raw)).toBeNull();
|
|
340
|
+
});
|
|
341
|
+
|
|
342
|
+
it.each([16, 17, 18] as const)('rejects dynamic repeat symbol %i when it exceeds the declared table', (symbol) => {
|
|
343
|
+
expect(inflateDeflate(createDynamicRepeatOverflowStream(symbol), 0, CompressionFraming.Raw)).toBeNull();
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
it('accepts every dynamic repeat form when it ends inside the declared table', () => {
|
|
347
|
+
for (const symbol of [16, 17, 18] as const) {
|
|
348
|
+
expect(inflateDeflate(createValidDynamicRepeatStream(symbol), 0, CompressionFraming.Raw)).toEqual(
|
|
349
|
+
new Uint8Array(),
|
|
350
|
+
);
|
|
351
|
+
}
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
it('rejects a previous-length repeat before any length has been declared', () => {
|
|
355
|
+
const bits: number[] = [];
|
|
356
|
+
pushDynamicHeader(
|
|
357
|
+
bits,
|
|
358
|
+
257,
|
|
359
|
+
1,
|
|
360
|
+
new Map([
|
|
361
|
+
[0, 1],
|
|
362
|
+
[1, 2],
|
|
363
|
+
[16, 2],
|
|
364
|
+
]),
|
|
365
|
+
);
|
|
366
|
+
pushCanonicalCode(bits, 3, 2);
|
|
367
|
+
expect(inflateDeflate(packDeflateBits(bits), 0, CompressionFraming.Raw)).toBeNull();
|
|
368
|
+
});
|
|
369
|
+
|
|
370
|
+
it('rejects forbidden dynamic literal counts without rejecting the maximum valid count', () => {
|
|
371
|
+
expect(inflateDeflate(decodeHex('edc0210900000000a0ffaf5d22'), 0, CompressionFraming.Raw)).toEqual(
|
|
372
|
+
new Uint8Array(),
|
|
373
|
+
);
|
|
374
|
+
expect(inflateDeflate(decodeHex('f5c0210900000000a0ffaf7d22'), 0, CompressionFraming.Raw)).toBeNull();
|
|
375
|
+
expect(inflateDeflate(decodeHex('fdc0210900000000a0ffaf9d22'), 0, CompressionFraming.Raw)).toBeNull();
|
|
103
376
|
});
|
|
104
377
|
});
|
|
105
378
|
|
|
@@ -113,8 +386,8 @@ describe('registerDeflateDecompressor', () => {
|
|
|
113
386
|
|
|
114
387
|
// One registration is what every container format reads through — none of them owns its own registry.
|
|
115
388
|
expect(getDecompressor(Compression.Deflate)).toBe(inflateDeflate);
|
|
116
|
-
expect(
|
|
117
|
-
|
|
118
|
-
);
|
|
389
|
+
expect(
|
|
390
|
+
getDecompressor(Compression.Deflate)?.(decodeBase64(FIXTURES.LITERAL), 0, CompressionFraming.Rfc1950),
|
|
391
|
+
).toEqual(encode('flighthq scene-formats'));
|
|
119
392
|
});
|
|
120
393
|
});
|