Pumpkin-MC/Pumpkin · error · PacketDecodeError

failed to decode packet ID

Error message

failed to decode packet ID

What it means

`PacketDecodeError::DecodeID` is returned when the incoming packet's ID VarInt could not be read — the very first field of every framed packet. Failure here means the stream is empty, truncated, or desynchronized before any packet content was parsed.

Solutions

  1. Treat as a connection-level failure: close and clean up the session.
  2. Check whether a previous decode error desynchronized the stream; resync or reconnect.
  3. Verify the framing (length prefix) is being consumed correctly before the ID read.
  4. Log the connection state to distinguish clean disconnects from corruption.
Defensive patterns

Strategy: try-catch

Try / catch

match read_packet(&mut reader) {
    Ok(p) => handle(p),
    Err(PacketDecodeError::DecodeID) | Err(PacketDecodeError::OutOfBounds) => {
        log::info!("stream ended or desynced; closing connection");
    }
    Err(e) => return Err(e.into()),
}

Prevention

When it happens

Trigger: Reading a packet from a stream that closed/ended mid-frame; a corrupted length field causing a short read; reading from an already-closed connection.

Common situations: Client disconnecting abruptly; network interruption mid-packet; a prior decode error leaving the reader at the wrong offset.

Understand the failure class

Related errors


AI-assisted analysis of Pumpkin-MC/Pumpkin@8d4639e25a (2026-09-09). Data as JSON: /api/errors/8debeeb6ad164ff5. Report an issue: GitHub.

Appendix: source

Thrown at crates/pumpkin-protocol/src/lib.rs:301

pub trait BServerPacket: Packet + Sized {
    fn read(read: impl Read) -> Result<Self, Error>;
}

/// Errors that can occur during packet encoding.
#[derive(Error, Debug)]
pub enum PacketEncodeError {
    #[error("Packet exceeds maximum length: {0}")]
    TooLong(usize),
    #[error("Compression failed {0}")]
    CompressionFailed(String),
    #[error("Writing packet failed: {0}")]
    Message(String),
}

#[derive(Error, Debug)]
pub enum PacketDecodeError {
    #[error("failed to decode packet ID")]
    DecodeID,
    #[error("packet exceeds maximum length")]
    TooLong,
    #[error("packet length is out of bounds")]
    OutOfBounds,
    #[error("malformed packet length VarInt: {0}")]
    MalformedLength(String),
    #[error("failed to decompress packet: {0}")]
    FailedDecompression(String), // Updated to include error details
    #[error("packet is uncompressed but greater than the threshold")]
    NotCompressed,
    #[error("the connection has closed")]
    ConnectionClosed,
    #[error("{0}")]
    Message(String),
}

impl From<ReadingError> for PacketDecodeError {

View on GitHub (pinned to 8d4639e25a)