| import dotenv from "dotenv"; |
|
|
| dotenv.config(); |
|
|
| function numberFromEnv(env, key, fallback) { |
| const value = env[key]; |
| if (value === undefined || value === "") { |
| return fallback; |
| } |
|
|
| const parsed = Number(value); |
| return Number.isFinite(parsed) ? parsed : fallback; |
| } |
|
|
| export function loadConfig(env = process.env) { |
| return { |
| openAiApiKey: env.OPENAI_API_KEY ?? "", |
| openAiBaseUrl: (env.OPENAI_BASE_URL ?? "https://api.openai.com/v1").replace(/\/+$/, ""), |
| port: numberFromEnv(env, "PORT", 3000), |
| mediaTtlSeconds: numberFromEnv(env, "MEDIA_TTL_SECONDS", 3600), |
| requestTimeoutMs: numberFromEnv(env, "REQUEST_TIMEOUT_MS", 60000), |
| jsonLimit: env.JSON_LIMIT ?? "50mb", |
| maxAudioDownloadMb: numberFromEnv(env, "MAX_AUDIO_DOWNLOAD_MB", 25) |
| }; |
| } |
|
|
| export function validateConfig(config) { |
| const missing = []; |
|
|
| if (!config.openAiApiKey) { |
| missing.push("OPENAI_API_KEY"); |
| } |
|
|
| if (!config.openAiBaseUrl) { |
| missing.push("OPENAI_BASE_URL"); |
| } |
|
|
| if (missing.length > 0) { |
| throw new Error(`Missing required environment variables: ${missing.join(", ")}`); |
| } |
| } |
|
|