# `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()}
```

# `unregister_session`

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

# `registry_name`

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

# `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_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*
