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

Public PubSub extension API.

This domain provides non-blocking event fanout to local or optional external
PubSub backends.

Topic strategy:
- `:all` -> `asm:events`
- `:session` -> `asm:session:<session_id>`
- `:run` -> `asm:session:<session_id>:run:<run_id>`

Payload contract:
- `%{schema: "asm.pubsub.event.v1", event: %ASM.Event{}, meta: %{...}}`
- broadcast messages are delivered as `{:asm_pubsub, topic, payload}`

# `adapter_spec`

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

# `all_topic`

```elixir
@spec all_topic(keyword()) :: String.t()
```

# `broadcaster_plug`

```elixir
@spec broadcaster_plug(
  pid(),
  keyword()
) :: {module(), keyword()}
```

# `event_callback`

```elixir
@spec event_callback(
  pid(),
  keyword()
) :: (ASM.Event.t(), iodata() -&gt; :ok)
```

# `flush_broadcaster`

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

# `local_adapter`

```elixir
@spec local_adapter(keyword()) :: adapter_spec()
```

# `payload_for_event`

```elixir
@spec payload_for_event(
  ASM.Event.t(),
  keyword()
) :: ASM.Extensions.PubSub.Payload.t()
```

# `phoenix_adapter`

```elixir
@spec phoenix_adapter(keyword()) :: adapter_spec()
```

# `publish`

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

# `run_topic`

```elixir
@spec run_topic(String.t(), String.t(), keyword()) :: String.t()
```

# `session_topic`

```elixir
@spec session_topic(
  String.t(),
  keyword()
) :: String.t()
```

# `start_broadcaster`

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

# `start_local_bus`

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

# `subscribe`

```elixir
@spec subscribe(adapter_spec(), String.t()) :: :ok | {:error, ASM.Error.t()}
```

# `topics_for_event`

```elixir
@spec topics_for_event(
  ASM.Event.t(),
  keyword()
) :: {:ok, [String.t()]} | {:error, ASM.Error.t()}
```

---

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