Files
2026-05-27 23:47:53 +01:00

2.7 KiB

@suaveplan/websocket-gateway health probes

(no submodules)

Purpose

Inline implementation of the three Kubernetes-style health verbs (/health, /ready, /live) that the daemon hosts on the same TCP port as the WebSocket upgrade endpoint. The proposal explicitly defers full integration with @suaveplan/health-check until that package ships — this module is the standalone replacement and the contract stays stable once health-check lands.

Features

  • classifyHealthRequest(url) — pure URL-path classifier; ignores querystrings and trailing slashes.
  • buildHealthResponse(verb, snap) — pure decision function returning the HTTP status + body for one verb.
  • handleHealth(url, snap) — single-call wrapper returning {status, body} or null so the daemon can short-circuit health requests before falling through to the WS upgrade path.
  • Status discriminator (ok / degraded / starting / stopped) carries enough state for k8s probes and human dashboards.

Usage: Basic Example

import { handleHealth } from "@suaveplan/websocket-gateway";

const result = handleHealth(req.url, {
    running: true,
    disposed: false,
    clientCount: 7,
    roomCount: 2,
    startedAt: 1700000000000,
});
if (result) res.writeHead(result.status).end(result.body);

Usage: Advanced Example

import {
    buildHealthResponse,
    classifyHealthRequest,
    type HealthSnapshot,
} from "@suaveplan/websocket-gateway";

const snap: HealthSnapshot = gateway.snapshot();
const verb = classifyHealthRequest("/ready?probe=k8s");
if (verb !== null) {
    const decision = buildHealthResponse(verb, snap);
    metrics.ready_probe.add(1, { status: decision.body.status });
}

API Reference

  • HEALTH_PATHS — frozen mapping of verb → path string.
  • classifyHealthRequest(url): HealthKind — returns "health" | "ready" | "live" | null.
  • buildHealthResponse(verb, snap): {status, body} — returns the HTTP status + JSON-encodable body for a verb.
  • handleHealth(url, snap): {status, body} | null — combined classify + build returning the serialized response body.
  • HealthSnapshot, HealthResponse, HealthKind, HealthPath — supporting types.

Implementation Notes

live returns 200 unless stop() has cleared state (process is up but daemon-internal storage is torn down). ready returns 503 with status: "starting" until start() resolves so cluster ingress holds traffic until the daemon is actually accepting WebSocket upgrades. health is the catch-all aggregate verb consumers can wire to PagerDuty / Prometheus. The functions are pure to keep the daemon under the 300-line cap and to let unit tests cover every branch without booting a server.