# Runtime and Components

The diagram below focuses on the deployed `galaxy/gateway` process and its
runtime dependencies.

```mermaid
flowchart LR
    subgraph Clients
        Public["Public REST clients"]
        Authd["Authenticated edge clients\n(Connect / gRPC / gRPC-Web)"]
    end

    subgraph Gateway["Edge Gateway process"]
        PublicHTTP["Public HTTP listener\n/healthz /readyz /api/v1/public/auth/*"]
        AuthGRPC["Authenticated edge listener (h2c)\nConnect / gRPC / gRPC-Web\nExecuteCommand / SubscribeEvents"]
        AdminHTTP["Optional admin HTTP listener\n/metrics"]
        BackendREST["backendclient.RESTClient\nsessions + public auth + user/lobby"]
        BackendPush["backendclient.PushClient\nSubscribePush consumer"]
        Replay["Replay reservation client"]
        PushHub["PushHub"]
        Dispatcher["Push event dispatcher"]
        Telemetry["Logs, traces, metrics"]
    end

    Public --> PublicHTTP
    Authd --> AuthGRPC
    PublicHTTP --> BackendREST
    AuthGRPC --> BackendREST
    AuthGRPC --> Replay
    AuthGRPC --> PushHub
    BackendPush --> Dispatcher
    Dispatcher --> PushHub
    PublicHTTP --> Telemetry
    AuthGRPC --> Telemetry
    AdminHTTP --> Telemetry

    Redis["Redis\nanti-replay reservations only"]
    Backend["backend service\nHTTP + gRPC"]
    Metrics["Prometheus / OTLP collectors"]

    BackendREST --> Backend
    BackendPush --> Backend
    Replay --> Redis
    Telemetry --> Metrics
```

Notes:

- `cmd/gateway` refuses startup when Redis connectivity, the backend endpoint,
  or the response signer is misconfigured.
- Session lookup is synchronous: every authenticated edge request triggers one
  `GET /api/v1/internal/sessions/{id}` call to backend; there is no
  process-local projection.
- The authenticated edge listener is built on `connectrpc.com/connect` and
  natively serves the Connect, gRPC, and gRPC-Web protocols on a single
  HTTP/2 cleartext (`h2c`) port. Browsers use Connect; native clients can
  use either Connect or raw gRPC framing against the same listener.
- `backendclient.PushClient` keeps a long-lived `Push.SubscribePush` stream
  open. The dispatcher converts inbound `pushv1.PushEvent` frames into either
  `PushHub.Publish` (for client events) or `PushHub.RevokeDeviceSession` /
  `PushHub.RevokeAllForUser` (for `session_invalidation`).
- `user.*` and `lobby.*` authenticated routes are forwarded to backend through
  the same REST client, with `X-User-Id` carrying the verified identity.
- The admin listener is optional and serves only Prometheus text metrics.
