baa-conductor


baa-conductor / apps / status-api / src
im_wower  ·  2026-03-25

runtime.ts

 1import { createDefaultStatusSnapshotLoader, resolveStatusApiTruthSourceBase } from "./data-source.js";
 2import type {
 3  StatusApiEnvironment,
 4  StatusApiHandler,
 5  StatusApiRequest,
 6  StatusApiResponse,
 7  StatusApiRoute,
 8  StatusSnapshotLoader
 9} from "./contracts.js";
10import { createStatusApiHandler } from "./service.js";
11
12export interface StatusApiRuntime extends StatusApiHandler {
13  fetch(request: Request): Promise<Response>;
14}
15
16export interface StatusApiRuntimeOptions {
17  env?: StatusApiEnvironment;
18  snapshotLoader?: StatusSnapshotLoader;
19}
20
21export function createStatusApiRuntime(options: StatusApiRuntimeOptions = {}): StatusApiRuntime {
22  const env = options.env;
23  const handler = createStatusApiHandler(
24    options.snapshotLoader ?? createDefaultStatusSnapshotLoader({ env }),
25    {
26      truthSourceBaseUrl: resolveStatusApiTruthSourceBase(env),
27      publicBaseUrl: env?.BAA_STATUS_API_PUBLIC_BASE,
28      version: env?.BAA_STATUS_API_VERSION
29    }
30  );
31
32  return {
33    routes: handler.routes,
34    handle: handler.handle,
35    fetch: async (request) => toFetchResponse(await handler.handle(toStatusApiRequest(request)))
36  };
37}
38
39export function createStatusApiFetchHandler(snapshotLoader: StatusSnapshotLoader): (request: Request) => Promise<Response> {
40  const handler = createStatusApiHandler(snapshotLoader);
41
42  return async (request) => toFetchResponse(await handler.handle(toStatusApiRequest(request)));
43}
44
45export function toStatusApiRequest(request: Pick<Request, "method" | "url">): StatusApiRequest {
46  return {
47    method: request.method,
48    path: request.url
49  };
50}
51
52export function toFetchResponse(response: StatusApiResponse): Response {
53  return new Response(response.body, {
54    status: response.status,
55    headers: new Headers(response.headers)
56  });
57}
58
59export function describeStatusApiRuntimeSurface(runtime: Pick<StatusApiRuntime, "routes">): string[] {
60  return runtime.routes.map(describeStatusApiRoute);
61}
62
63function describeStatusApiRoute(route: StatusApiRoute): string {
64  const paths = [route.path, ...(route.aliases ?? [])].join(", ");
65
66  return `${route.method} ${paths} (${route.contentType})`;
67}