feat(config): valibot schemas, schema version, migrations, filter AST

This commit is contained in:
RhenCloud 2026-08-15 16:08:52 +08:00
parent eaec039ad4
commit 2470bd786d
No known key found for this signature in database
GPG key ID: A574A617378C4E0B
13 changed files with 617 additions and 191 deletions

View file

@ -1,5 +1,6 @@
import type { Env, Config, Route } from "./types";
import { log } from "./lib/log";
import { migrateRoutes, validateRoutes } from "./config/schema";
const CONFIG_CACHE_TTL = 60_000;
const ROUTES_KEY = "config:routes";
@ -8,26 +9,13 @@ let configCache: { config: Config; expiresAt: number } | null = null;
export async function loadRoutes(kv: KVNamespace): Promise<Route[]> {
try {
const stored = await kv.get<Route[]>(ROUTES_KEY, "json");
if (stored) return normalizeRoutes(stored);
if (stored) return validateRoutes(migrateRoutes(stored));
} catch (err) {
log.warn({ err }, "Failed to load routes from KV");
}
return [];
}
/**
* Migrate legacy single-target routes (`target`) to the array form (`targets`).
*/
function normalizeRoutes(routes: Route[]): Route[] {
return routes.map((r) => {
if (r.targets && r.targets.length > 0) return r;
const legacy = (r as Route & { target?: Route["targets"][number] }).target;
if (!legacy) return r;
const { target: _target, ...rest } = r as Route & { target?: Route["targets"][number] };
return { ...rest, targets: [legacy] };
});
}
export async function saveRoutes(kv: KVNamespace, routes: Route[]): Promise<void> {
await kv.put(ROUTES_KEY, JSON.stringify(routes));
configCache = null;