Expose release manifest API

This commit is contained in:
2026-05-08 16:18:02 -04:00
parent e425ea903c
commit c8a7a32673
6 changed files with 452 additions and 12 deletions
+32
View File
@@ -1,4 +1,9 @@
import type { Env } from "./bindings.js";
import {
ReleaseManifestSchemaError,
parseReleaseManifestDocument,
releaseManifestKvKey,
} from "./release_manifests.js";
import {
SigningKeysSchemaError,
parsePublicSigningKeysDocument,
@@ -16,6 +21,9 @@ export async function handleRequest(request: Request, env: Env): Promise<Respons
if (url.pathname === "/api/plugins/signing-keys") {
return handlePublicSigningKeys(request, env);
}
if (url.pathname === "/api/releases/manifest") {
return handleReleaseManifest(request, env);
}
return jsonResponse({ error: "not_found" }, 404);
}
@@ -44,6 +52,30 @@ async function handlePublicSigningKeys(request: Request, env: Env): Promise<Resp
}
}
async function handleReleaseManifest(request: Request, env: Env): Promise<Response> {
if (request.method !== "GET") {
return jsonResponse({ error: "method_not_allowed" }, 405, { Allow: "GET" });
}
const kvKey = releaseManifestKvKey(env.ELY_ENVIRONMENT);
const value = await env.ELY_KV.get(kvKey);
if (value === null) {
return jsonResponse({ error: "release_manifest_unavailable" }, 503);
}
try {
const document = parseReleaseManifestDocument(value);
return jsonResponse(document, 200, {
"Cache-Control": "public, max-age=120, stale-while-revalidate=60",
});
} catch (error) {
if (error instanceof ReleaseManifestSchemaError) {
return jsonResponse({ error: "release_manifest_invalid" }, 500);
}
throw error;
}
}
function jsonResponse(
body: unknown,
status: number,