Anubis.Server.Registry behaviour (anubis_mcp v1.6.0)

Copy Markdown

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.

Summary

Callbacks

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.

Functions

Resolves the session GenServer name via the registry adapter.

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.

Types

session_id()

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

Callbacks

child_spec(keyword)

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

lookup_session(name, session_id)

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

register_session(name, session_id, pid)

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

session_name(registry_name, session_id)

(optional)
@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(name, session_id)

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

Functions

registry_name(server)

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

resolve_session_name(registry_mod, registry_name, session_id)

@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(server, session_id)

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

session_supervisor_name(server)

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

stdio_session_name(server)

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

supervisor_name(server)

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

task_store_name(server)

@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(server)

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

transport_name(server, type)

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