# `ExWapp.Message.Handler.Wire.ContentDecoder`
[🔗](https://github.com/elchemista/ex_wapp/blob/v0.1.5/lib/ex_wapp/message/handler/wire/content_decoder.ex#L1)

Pure decoder for supported WhatsApp message content.

It decodes the E2E `Message` protobuf and maps supported content (text,
media, location, contact, event) to the internal contract, but does not
parse XML envelopes, decrypt Signal payloads, persist state, or publish
events.

# `apply_media_from_message`

```elixir
@spec apply_media_from_message(map(), WAWebProtobufsE2E.Message.t()) :: map()
```

Same as `apply_media_from_plaintext/2` for an already-decoded message.

# `apply_media_from_plaintext`

```elixir
@spec apply_media_from_plaintext(map(), binary()) :: map()
```

Adds decoded media, location, contact, or event fields to a message map.

# `classify_decrypted_content`

```elixir
@spec classify_decrypted_content(binary(), non_neg_integer()) ::
  {:protocol | :user_message, binary() | nil}
```

Distinguishes protocol payloads from user content and extracts message text.

# `classify_message`

```elixir
@spec classify_message(WAWebProtobufsE2E.Message.t(), non_neg_integer()) ::
  {:protocol | :user_message, binary() | nil}
```

Same as `classify_decrypted_content/2` for an already-decoded message.

# `decode`

```elixir
@spec decode(binary()) :: {:ok, WAWebProtobufsE2E.Message.t()} | :error
```

Decodes an E2E `Message` payload, returning `:error` on malformed protobuf.

# `device_sent_message?`

```elixir
@spec device_sent_message?(WAWebProtobufsE2E.Message.t() | term()) :: boolean()
```

Reports whether a message is a `DeviceSentMessage` wrapper (own-device fanout).

---

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