43 lines
1.2 KiB
TypeScript
43 lines
1.2 KiB
TypeScript
|
|
import { z } from "zod";
|
||
|
|
|
||
|
|
const envSchema = z.object({
|
||
|
|
DATABASE_URL: z.string().min(1),
|
||
|
|
REDIS_URL: z.string().min(1).optional(),
|
||
|
|
ORCHESTRATOR_DRY_RUN: z
|
||
|
|
.enum(["0", "1", "true", "false", ""])
|
||
|
|
.optional()
|
||
|
|
.transform((value) => value === "1" || value === "true"),
|
||
|
|
ORCHESTRATOR_POLL_MS: z
|
||
|
|
.string()
|
||
|
|
.optional()
|
||
|
|
.transform((value) => {
|
||
|
|
const parsed = Number(value ?? "5000");
|
||
|
|
return Number.isFinite(parsed) && parsed > 0 ? parsed : 5_000;
|
||
|
|
}),
|
||
|
|
ORCHESTRATOR_STALL_MINUTES: z
|
||
|
|
.string()
|
||
|
|
.optional()
|
||
|
|
.transform((value) => {
|
||
|
|
const parsed = Number(value ?? "120");
|
||
|
|
return Number.isFinite(parsed) && parsed > 0 ? parsed : 120;
|
||
|
|
}),
|
||
|
|
ORCHESTRATOR_MAX_IMPLEMENTERS: z
|
||
|
|
.string()
|
||
|
|
.optional()
|
||
|
|
.transform((value) => {
|
||
|
|
const parsed = Number(value ?? "2");
|
||
|
|
return Number.isFinite(parsed) && parsed > 0 ? parsed : 2;
|
||
|
|
}),
|
||
|
|
});
|
||
|
|
|
||
|
|
export type OrchestratorEnv = z.infer<typeof envSchema>;
|
||
|
|
|
||
|
|
export function loadEnv(): OrchestratorEnv {
|
||
|
|
const parsed = envSchema.safeParse(process.env);
|
||
|
|
if (!parsed.success) {
|
||
|
|
console.error("[orchestrator] Invalid environment:", parsed.error.flatten().fieldErrors);
|
||
|
|
process.exit(1);
|
||
|
|
}
|
||
|
|
return parsed.data;
|
||
|
|
}
|