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}