BabylonJS/Babylon.js · error

deflate: invalid block type

Error message

deflate: invalid block type

What it means

DEFLATE block headers start with a 3-bit type: 0=stored, 1=fixed Huffman, 2=dynamic Huffman. inflateZlib throws 'deflate: invalid block type' when it reads bit pattern 3 (or otherwise invalid), meaning the compressed stream is corrupt or the bit position has desynchronized.

Source

Thrown at packages/dev/loaders/src/FBX/parsers/zlibInflate.ts:54

    let isFinalBlock = false;
    while (!isFinalBlock) {
        isFinalBlock = reader.readBits(1) === 1;
        const blockType = reader.readBits(2);
        switch (blockType) {
            case 0:
                inflateStoredBlock(reader, output);
                break;
            case 1:
                inflateCompressedBlock(reader, output, getFixedLiteralLengthTree(), getFixedDistanceTree());
                break;
            case 2: {
                const { literalLengthTree, distanceTree } = readDynamicTrees(reader);
                inflateCompressedBlock(reader, output, literalLengthTree, distanceTree);
                break;
            }
            default:
                throw new Error("deflate: invalid block type");
        }
    }

    if (reader.byteOffset < input.byteLength - 4) {
        throw new Error("zlib: trailing deflate data");
    }

    output.finish();
    const expectedAdler = ((input[input.byteLength - 4] << 24) | (input[input.byteLength - 3] << 16) | (input[input.byteLength - 2] << 8) | input[input.byteLength - 1]) >>> 0;
    if (output.adler32() !== expectedAdler) {
        throw new Error("zlib: adler32 mismatch");
    }

    return output.bytes;
}

class BitReader {
    private bitBuffer = 0;

View on GitHub (pinned to 0592b347b8)

Solutions

  1. Verify file integrity (checksum) and re-download/re-export the FBX
  2. Check the compressed payload's start offset — zlib data begins at byte 2, and inflateZlib already sets this, so suspect file corruption first
  3. Round-trip the data through a reference zlib inflate to see if it decompresses there
  4. Catch and report as corrupt asset data rather than a parser bug
Defensive patterns

Strategy: try-catch

Validate before calling

// can't pre-validate deflate bits cheaply; validate container instead
if (compressed.byteLength < 6 || !looksLikeZlib(compressed)) {
  throw new Error('FBX compressed array container invalid');
}

Try / catch

try {
  return inflateZlib(compressed, expectedLength);
} catch (e) {
  if ((e as Error).message === 'deflate: invalid block type') {
    throw new Error('FBX compressed array bitstream is corrupt', { cause: e });
  }
  throw e;
}

Prevention

When it happens

Trigger: Inflating an FBX compressed array whose deflate bitstream is corrupted, truncated mid-block, or whose start offset is wrong so the reader reads garbage as a block header; bit-level desync after a previously malformed block.

Common situations: Partially corrupted files (bad sectors, incomplete transfers); data sliced from the wrong byte offset; payloads recompressed or edited after export; a bug in an upstream compressor.

Related errors


AI-assisted analysis of BabylonJS/Babylon.js@0592b347b8 (2026-08-30). Data as JSON: /api/errors/53701e11058e9568. Report an issue: GitHub.