Add GET /api/v1/health/live and GET /api/v1/health/ready per ADR 0044.
- live returns a fixed 200 {"status":"live"} whenever the process serves.
- ready returns 200 {"status":"ready"} only when module startup has
completed (and shutdown has not begun) and a database ping succeeds
within 2s; otherwise a fixed 503 {"code":"NOT_READY"}.
- The ping runs on the shared pool as one simple-protocol message with
a transaction-local statement_timeout, so PostgreSQL cancels a stalled
statement; the pool discards the connection on failure.
- At most one ping is ever unsettled: probes share its outcome and, once
its deadline passes, answer 503 immediately until it settles.
- Both routes set Cache-Control: no-store, accept GET only (405 with
Allow: GET otherwise, HEAD included), never resolve a principal, and
are mounted in app.ts beside, never inside, /api/v1/modules/.
- createApiApp gains a required `health` option; startApi supplies it
and clears module readiness when shutdown begins.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
11 lines
420 B
TypeScript
11 lines
420 B
TypeScript
import type { ApiHealthOptions } from "../../src/health-routes.js";
|
|
|
|
/** Readiness inputs for a composition whose tests do not exercise health: the database answers and
|
|
* module startup has completed. Health behavior itself is tested in `../health-routes.test.ts`. */
|
|
export function readyHealth(): ApiHealthOptions {
|
|
return {
|
|
checkDatabase: async () => undefined,
|
|
isModuleStartupComplete: () => true,
|
|
};
|
|
}
|