# `ASM.Extensions.PubSub.Broadcaster`
[🔗](https://github.com/nshkrdotcom/agent_session_manager/blob/v0.9.2/lib/asm/extensions/pub_sub/broadcaster.ex#L1)

Async broadcaster process that publishes `%ASM.Event{}` outside run-critical paths.

Design notes:
- enqueue path uses `GenServer.cast/2` and never blocks callers
- dispatch runs in monitored async tasks
- bounded queue with drop policy protects against unbounded mailbox growth

# `adapter_spec`

```elixir
@type adapter_spec() :: {module(), keyword()}
```

# `overflow_policy`

```elixir
@type overflow_policy() :: :drop_oldest | :drop_newest
```

# `state`

```elixir
@type state() :: %ASM.Extensions.PubSub.Broadcaster{
  adapter_mod: module(),
  adapter_state: ASM.Extensions.PubSub.Adapter.state(),
  inflight_pid: pid() | nil,
  inflight_ref: reference() | nil,
  max_queue_size: pos_integer(),
  notify: pid() | nil,
  overflow: overflow_policy(),
  payload_builder: (ASM.Event.t(), keyword() -&gt;
                      ASM.Extensions.PubSub.Payload.t()),
  queue: :queue.queue(),
  queue_len: non_neg_integer(),
  task_supervisor: pid(),
  topic_prefix: String.t(),
  topic_scopes: [ASM.Extensions.PubSub.Topic.scope()],
  waiters: [GenServer.from()]
}
```

# `child_spec`

Returns a specification to start this module under a supervisor.

See `Supervisor`.

# `enqueue`

```elixir
@spec enqueue(pid(), ASM.Event.t(), keyword()) :: :ok
```

# `flush`

```elixir
@spec flush(pid(), timeout()) :: :ok | {:error, ASM.Error.t()}
```

# `start_link`

```elixir
@spec start_link(keyword()) :: GenServer.on_start() | {:error, ASM.Error.t()}
```

---

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