@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.
@@ -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;AAe7D,eAAO,MAAM,cAAc,EAAE,YAc5B,CAAC;AAKF,wBAAgB,2BAA2B,IAAI,IAAI,CAElD"}
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 — so a
11
- // zlib header is detected and skipped when present and the input is otherwise read as raw DEFLATE.
12
- // `uncompressedLength` is unused: DEFLATE encodes its own end and the output buffer grows to fit.
13
- export const inflateDeflate = (compressed) => {
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
- if (input.length >= 2 && (input[0] & 0x0f) === 8 && (((input[0] << 8) | input[1]) & 0xffff) % 31 === 0) {
19
- if ((input[1] & 0x20) !== 0)
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
- return rawInflate(input, start);
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 = new Uint8Array(1024);
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
- if (this.output.length * 2 > MAX_INFLATE_BYTES)
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 state = new InflateState(input, start);
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 && i < lengths.length; r++)
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
- for (let r = 0; r < repeat && i < lengths.length; r++)
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 if (symbol === 18) {
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
- for (let r = 0; r < repeat && i < lengths.length; r++)
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
@@ -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.0",
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.0"
41
+ "@flighthq/types": "0.3.1-next.1041.35b950c"
42
42
  },
43
43
  "devDependencies": {
44
44
  "typescript": "^5.3.0"
@@ -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(encode('flighthq scene-formats'));
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('round-trips a headerless raw DEFLATE stream via the fallback path', () => {
76
- expect(inflateDeflate(decodeBase64(FIXTURES.RAW_LITERAL), 0)).toEqual(encode('flighthq scene-formats'));
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(encode('abcABC123'.repeat(600)));
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(encode(LOREM.repeat(12)));
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(inflateDeflate(new Uint8Array([0x78, 0x9c, 0xff, 0xff]), 0)).toBeNull();
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(getDecompressor(Compression.Deflate)?.(decodeBase64(FIXTURES.LITERAL), 0)).toEqual(
117
- encode('flighthq scene-formats'),
118
- );
389
+ expect(
390
+ getDecompressor(Compression.Deflate)?.(decodeBase64(FIXTURES.LITERAL), 0, CompressionFraming.Rfc1950),
391
+ ).toEqual(encode('flighthq scene-formats'));
119
392
  });
120
393
  });