# `ProtoChannel.Serializer`

A `Phoenix.Socket.Serializer` that frames every socket frame as a
protobuf `Envelope` message (defined in `priv/proto/wire.proto`).

## Endpoint wiring

    socket "/socket", MyAppWeb.UserSocket,
      websocket: [serializer: [{ProtoChannel.Serializer, "~> 2.0.0"}]],
      longpoll: false

## Payload contract

The serializer is intentionally narrow:

  * `{:binary, bytes}` — written verbatim to the envelope's `payload` field.
  * `%{}` (empty map) — encoded as zero bytes; tolerated because Phoenix
    uses empty maps as join acknowledgements.
  * Anything else raises `ArgumentError`.

On decode, payloads are always wrapped as `{:binary, bytes}`. Empty
`join_ref` / `ref` strings round-trip back to `nil`.

## Wire format

The envelope is defined in `priv/proto/wire.proto`. It carries a `kind` enum
(`PUSH`, `REPLY`, `BROADCAST`) plus `join_ref`, `ref`, `topic`, `event`,
`status`, and `payload` fields.

This serializer composes with the `ProtoChannel` macro but does not require
it — any channel that produces `{:binary, bytes}` payloads works.

---

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