# `Anubis.Server.Registry`

Behaviour for pluggable session registries and deterministic naming utilities.

The registry is responsible for mapping session IDs to PIDs. Different transports
have different needs:

- STDIO: single session, no registry needed (`Registry.None`)
- HTTP: multiple sessions, need lookup by session ID (`Registry.Local`)

## Naming Utilities

The module also provides deterministic atom naming for internal processes.
These are safe because server modules are compile-time bounded.

# `session_id`

```elixir
@type session_id() :: String.t()
```

# `child_spec`

```elixir
@callback child_spec(keyword()) :: Supervisor.child_spec() | :ignore
```

# `lookup_session`

```elixir
@callback lookup_session(name :: term(), session_id()) ::
  {:ok, pid()} | {:error, :not_found}
```

# `register_session`

```elixir
@callback register_session(name :: term(), session_id(), pid()) :: :ok | {:error, term()}
```

# `session_name`
*optional* 

```elixir
@callback session_name(registry_name :: term(), session_id()) :: GenServer.name()
```

Returns the GenServer name for a session. Override this to return a `:via` tuple
(e.g. `{:via, Horde.Registry, {name, session_id}}`) when using a distributed registry
that auto-registers processes on `start_link`. The default returns a plain atom.

When a `:via` tuple is returned, `register_session/3` should be a no-op since
registration happens automatically on process start.

# `unregister_session`

```elixir
@callback unregister_session(name :: term(), session_id()) :: :ok
```

# `registry_name`

```elixir
@spec registry_name(module()) :: atom()
```

# `resolve_session_name`

```elixir
@spec resolve_session_name(module(), term(), session_id()) :: GenServer.name()
```

Resolves the session GenServer name via the registry adapter.

Falls back to the default atom-based naming if the adapter does not implement
the optional `session_name/2` callback.

# `session_name`

```elixir
@spec session_name(module(), String.t()) :: atom()
```

# `session_supervisor_name`

```elixir
@spec session_supervisor_name(module()) :: atom()
```

# `stdio_session_name`

```elixir
@spec stdio_session_name(module()) :: atom()
```

# `supervisor_name`

```elixir
@spec supervisor_name(module()) :: atom()
```

# `task_store_name`

```elixir
@spec task_store_name(module()) :: atom()
```

Default atom name for a server's `Anubis.Server.TaskStore` process. Adapters
may override via the optional `resolve_name/2` callback to return a `:via`
tuple for distributed deployments.

# `task_supervisor_name`

```elixir
@spec task_supervisor_name(module()) :: atom()
```

# `transport_name`

```elixir
@spec transport_name(module(), atom()) :: atom()
```

---

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