const path = require("node:path"); const ONE_DAY_SECONDS = 24 * 60 * 60; function requiredEnv(name) { const value = process.env[name]; if (!value) { throw new Error(`Missing required env: ${name}`); } return value; } function getConfig() { const nodeEnv = process.env.NODE_ENV ?? "development"; const serverRoot = path.resolve(__dirname, ".."); const storageDir = process.env.STORAGE_DIR ?? "generated/storage"; return { nodeEnv, port: Number(process.env.PORT ?? 3000), host: process.env.HOST ?? "0.0.0.0", appOrigin: process.env.APP_ORIGIN ?? "", jwtSecret: requiredEnv("JWT_SECRET"), accessTokenTtl: "15m", refreshTtlSeconds: 7 * ONE_DAY_SECONDS, refreshCookieName: "refresh_token", cookieSecure: process.env.COOKIE_SECURE != null ? process.env.COOKIE_SECURE === "true" : nodeEnv === "production", passwordResetCodeTtlSeconds: Number( process.env.PASSWORD_RESET_CODE_TTL_SECONDS ?? 10 * 60, ), devShowPasswordResetCode: process.env.DEV_SHOW_PASSWORD_RESET_CODE === "true", appTimezone: process.env.APP_TIMEZONE ?? "Asia/Shanghai", storageDir: path.resolve(serverRoot, storageDir), signedUrlTtlSeconds: Number(process.env.SIGNED_URL_TTL_SECONDS ?? 600), maxUploadSizeBytes: Number(process.env.MAX_UPLOAD_SIZE_BYTES ?? 10 * 1024 * 1024), rateLimitEnabled: process.env.RATE_LIMIT_ENABLED != null ? process.env.RATE_LIMIT_ENABLED === "true" : nodeEnv === "production", rateLimitLoginMax: Number(process.env.RATE_LIMIT_LOGIN_MAX ?? 10), rateLimitLoginWindow: process.env.RATE_LIMIT_LOGIN_WINDOW ?? "1 minute", delegationRevokeCron: process.env.DELEGATION_REVOKE_CRON ?? "0 * * * *", ocrProvider: process.env.OCR_PROVIDER ?? "off", ocrBatchSize: Number(process.env.OCR_BATCH_SIZE ?? 10), ocrLockTtlSeconds: Number(process.env.OCR_LOCK_TTL_SECONDS ?? 300), ocrPollCron: process.env.OCR_POLL_CRON ?? "* * * * *", ocrMaxAttempts: Number(process.env.OCR_MAX_ATTEMPTS ?? 3), ocrTimeoutMs: Number(process.env.OCR_TIMEOUT_MS ?? 5000), tencentSecretId: process.env.TENCENT_SECRET_ID ?? "", tencentSecretKey: process.env.TENCENT_SECRET_KEY ?? "", tencentOcrRegion: process.env.TENCENT_OCR_REGION ?? "ap-beijing", }; } module.exports = { getConfig };