# `MqttX.Packet.Codec`
[🔗](https://github.com/cignosystems/mqttx/blob/v0.11.2/lib/mqttx/packet/codec.ex#L1)

High-performance MQTT packet encoder and decoder.

Supports MQTT 3.1, 3.1.1, and 5.0 protocols with all 15 packet types.

## Encoding

    packet = %{type: :publish, topic: "test", payload: "hello", qos: 0, retain: false}
    {:ok, binary} = MqttX.Packet.Codec.encode(4, packet)

## Decoding

    {:ok, {packet, rest}} = MqttX.Packet.Codec.decode(4, binary)

# `declared_length`

```elixir
@spec declared_length(binary()) ::
  {:ok, non_neg_integer()} | :incomplete | {:error, :malformed_header}
```

Total on-the-wire size a buffered packet declares in its fixed header,
without decoding the body.

Returns `{:ok, total_bytes}` (fixed header + remaining length) once enough
of the header has arrived, `:incomplete` if the header itself is still
partial, or `{:error, :malformed_header}`. Lets transports reject oversized
packets (§3.1.2.11.4) *before* buffering up to the declared size.

# `decode`

```elixir
@spec decode(integer(), binary()) :: {:ok, {map(), binary()}} | {:error, atom()}
```

Decode an MQTT packet from binary data.

Returns `{:ok, {packet, rest}}` on success, `{:error, reason}` on failure,
or `{:error, :incomplete}` if more data is needed.

# `encode`

```elixir
@spec encode(integer(), map()) :: {:ok, binary()} | {:error, atom()}
```

Encode an MQTT packet to binary.

Returns `{:ok, binary}` on success or `{:error, reason}` on failure.

# `encode_iodata`

```elixir
@spec encode_iodata(integer(), map()) :: {:ok, iodata()} | {:error, atom()}
```

Encode an MQTT packet to iodata (more efficient, avoids binary copy).

---

*Consult [api-reference.md](api-reference.md) for complete listing*
