# `ExWapp.Message.Handler.Inbound.Publisher`
[🔗](https://github.com/elchemista/ex_wapp/blob/v0.1.5/lib/ex_wapp/message/handler/inbound/publisher.ex#L1)

Projects normalized inbound data into the public chat message and event stream.

This boundary owns chat persistence and `:new_message` publication. It does
not parse wire payloads, decrypt Signal content, or plan receipts.

# `envelope`

```elixir
@type envelope() :: %{
  id: term(),
  from: term(),
  from_me: boolean(),
  timestamp: term(),
  participant: term(),
  type: term(),
  attrs: map()
}
```

# `publish`

```elixir
@spec publish(map(), envelope(), term(), map()) ::
  {:published, map()} | {:suppressed, map()} | {:error, term()}
```

Persists and publishes one normalized inbound message unless it is internal.

---

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