File size: 1,541 Bytes
5dfbe50
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import { config as dotenvConfig } from 'dotenv';
import { z } from 'zod';

dotenvConfig();

const envSchema = z.object({
  PORT: z.string().default('4025'),
  BACKEND_URL: z.string().default('http://localhost:7860'),
  VESPA_APP_URL: z.string().optional(),
  VESPA_CERT_PATH: z.string().optional(),
  VESPA_KEY_PATH: z.string().optional(),
  NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),
  CORS_ORIGIN: z.string().default('http://localhost:3000'),
  CACHE_TTL: z.string().default('300'), // 5 minutes
  ENABLE_CACHE: z.string().default('true'),
  RATE_LIMIT_WINDOW: z.string().default('60000'), // 1 minute
  RATE_LIMIT_MAX: z.string().default('100'),
});

const parsedEnv = envSchema.safeParse(process.env);

if (!parsedEnv.success) {
  console.error('❌ Invalid environment variables:', parsedEnv.error.format());
  process.exit(1);
}

export const config = {
  port: parseInt(parsedEnv.data.PORT),
  backendUrl: parsedEnv.data.BACKEND_URL,
  vespaAppUrl: parsedEnv.data.VESPA_APP_URL,
  vespaCertPath: parsedEnv.data.VESPA_CERT_PATH,
  vespaKeyPath: parsedEnv.data.VESPA_KEY_PATH,
  nodeEnv: parsedEnv.data.NODE_ENV,
  corsOrigin: parsedEnv.data.CORS_ORIGIN,
  cacheTTL: parseInt(parsedEnv.data.CACHE_TTL),
  enableCache: parsedEnv.data.ENABLE_CACHE === 'true',
  rateLimit: {
    windowMs: parseInt(parsedEnv.data.RATE_LIMIT_WINDOW),
    max: parseInt(parsedEnv.data.RATE_LIMIT_MAX),
  },
};

export const isDev = config.nodeEnv === 'development';
export const isProd = config.nodeEnv === 'production';