75 lines
2.6 KiB
TypeScript
75 lines
2.6 KiB
TypeScript
import path from "node:path";
|
|
import { config as dotenvConfig } from "dotenv";
|
|
|
|
// Chargement du .env : d'abord le .env du paquet serveur, puis celui de la racine du repo.
|
|
// Les variables déjà présentes dans l'environnement ne sont jamais écrasées.
|
|
dotenvConfig({ path: [".env", "../.env"] });
|
|
|
|
export interface Config {
|
|
port: number;
|
|
host: string;
|
|
dataDir: string;
|
|
sessionTtlMs: number;
|
|
sessionAbsoluteTtlMs: number;
|
|
maxLoginAttemptsPerMinute: number;
|
|
cookieSecure: boolean;
|
|
trustProxy: boolean;
|
|
publicDir: string | null;
|
|
external: {
|
|
adapter: "example" | "http";
|
|
baseUrl: string;
|
|
apiKey: string;
|
|
healthPath: string;
|
|
listPath: string;
|
|
timeoutMs: number;
|
|
retries: number;
|
|
cacheTtlMs: number;
|
|
};
|
|
}
|
|
|
|
function envStr(name: string, fallback: string): string {
|
|
const value = process.env[name];
|
|
return value === undefined || value === "" ? fallback : value;
|
|
}
|
|
|
|
function envInt(name: string, fallback: number): number {
|
|
const raw = process.env[name];
|
|
if (raw === undefined || raw === "") return fallback;
|
|
const value = Number.parseInt(raw, 10);
|
|
if (Number.isNaN(value) || value <= 0) {
|
|
throw new Error(`Variable d'environnement ${name} invalide : ${raw} (entier positif attendu)`);
|
|
}
|
|
return value;
|
|
}
|
|
|
|
function envBool(name: string, fallback: boolean): boolean {
|
|
const raw = process.env[name];
|
|
if (raw === undefined || raw === "") return fallback;
|
|
return raw === "1" || raw.toLowerCase() === "true";
|
|
}
|
|
|
|
export function loadConfig(): Config {
|
|
const dataDir = path.resolve(process.cwd(), envStr("SEICHE_DATA_DIR", "./data"));
|
|
return {
|
|
port: envInt("SEICHE_PORT", 8787),
|
|
host: envStr("SEICHE_HOST", "127.0.0.1"),
|
|
dataDir,
|
|
sessionTtlMs: envInt("SEICHE_SESSION_TTL_MS", 8 * 60 * 60 * 1000),
|
|
sessionAbsoluteTtlMs: envInt("SEICHE_SESSION_ABSOLUTE_TTL_MS", 7 * 24 * 60 * 60 * 1000),
|
|
maxLoginAttemptsPerMinute: envInt("SEICHE_MAX_LOGIN_ATTEMPTS_PER_MINUTE", 5),
|
|
cookieSecure: envBool("SEICHE_COOKIE_SECURE", false),
|
|
trustProxy: envBool("SEICHE_TRUST_PROXY", false),
|
|
publicDir: process.env.SEICHE_PUBLIC_DIR ?? null,
|
|
external: {
|
|
adapter: (process.env.SEICHE_EXTERNAL_ADAPTER ?? "example") as "example" | "http",
|
|
baseUrl: envStr("SEICHE_EXTERNAL_BASE_URL", ""),
|
|
apiKey: envStr("SEICHE_EXTERNAL_API_KEY", ""),
|
|
healthPath: envStr("SEICHE_EXTERNAL_HEALTH_PATH", "/health"),
|
|
listPath: envStr("SEICHE_EXTERNAL_LIST_PATH", "/items"),
|
|
timeoutMs: envInt("SEICHE_EXTERNAL_TIMEOUT_MS", 10_000),
|
|
retries: envInt("SEICHE_EXTERNAL_RETRIES", 2),
|
|
cacheTtlMs: envInt("SEICHE_EXTERNAL_CACHE_TTL_MS", 30_000),
|
|
},
|
|
};
|
|
}
|