32 lines
1.3 KiB
TypeScript
32 lines
1.3 KiB
TypeScript
import { z } from "zod";
|
|
|
|
const configSchema = z.object({
|
|
NODE_ENV: z.enum(["development", "production", "test"]).default("development"),
|
|
PORT: z.coerce.number().default(3000),
|
|
HOST: z.string().default("0.0.0.0"),
|
|
DATABASE_URL: z.string(),
|
|
REDIS_URL: z.string().default("redis://localhost:6379"),
|
|
SESSION_SECRET: z.string().min(32),
|
|
ADMIN_EMAIL: z.string().email().optional(),
|
|
ADMIN_PASSWORD: z.string().min(8).optional(),
|
|
TMDB_API_KEY: z.string().optional(),
|
|
PUBLIC_URL: z.string().url().default("http://localhost:3000"),
|
|
/** Base URL shown on TV for /link (often admin UI). Falls back to PUBLIC_URL. */
|
|
CLIENT_LINK_BASE_URL: z.string().url().optional(),
|
|
PLAYBACK_IDLE_TIMEOUT_SECONDS: z.coerce.number().default(1200),
|
|
PLAYBACK_ABSOLUTE_LIFETIME_SECONDS: z.coerce.number().default(43200),
|
|
NODE_HEARTBEAT_INTERVAL_SECONDS: z.coerce.number().default(30),
|
|
NODE_OFFLINE_THRESHOLD_SECONDS: z.coerce.number().default(90),
|
|
HIDE_UNAVAILABLE_TITLES: z.coerce.boolean().default(true),
|
|
});
|
|
|
|
export type Config = z.infer<typeof configSchema>;
|
|
|
|
export function loadConfig(): Config {
|
|
const result = configSchema.safeParse(process.env);
|
|
if (!result.success) {
|
|
console.error("Invalid configuration:", result.error.flatten().fieldErrors);
|
|
process.exit(1);
|
|
}
|
|
return result.data;
|
|
}
|