| import express from 'express'; |
| import cors from 'cors'; |
| import helmet from 'helmet'; |
| import path from 'path'; |
| import { fileURLToPath } from 'url'; |
| import { keysRouter } from './routes/keys.js'; |
| import { modelsRouter } from './routes/models.js'; |
| import { proxyRouter } from './routes/proxy.js'; |
| import { responsesRouter } from './routes/responses.js'; |
| import { fallbackRouter } from './routes/fallback.js'; |
| import { embeddingsRouter } from './routes/embeddings.js'; |
| import { analyticsRouter } from './routes/analytics.js'; |
| import { healthRouter } from './routes/health.js'; |
| import { settingsRouter } from './routes/settings.js'; |
| import { authRouter } from './routes/auth.js'; |
| import { requireAuth } from './middleware/requireAuth.js'; |
| import { createProxyRateLimiter } from './middleware/rateLimit.js'; |
| import { errorHandler } from './middleware/errorHandler.js'; |
| const __dirname = path.dirname(fileURLToPath(import.meta.url)); |
| const DEFAULT_DASHBOARD_ORIGINS = [ |
| 'http://localhost:5173', |
| 'http://127.0.0.1:5173', |
| 'http://[::1]:5173', |
| ]; |
| function getAllowedCorsOrigins() { |
| const configuredOrigins = (process.env.DASHBOARD_ORIGINS ?? '') |
| .split(',') |
| .map(origin => origin.trim()) |
| .filter(Boolean); |
| return new Set([...DEFAULT_DASHBOARD_ORIGINS, ...configuredOrigins]); |
| } |
| export function createApp() { |
| const app = express(); |
| const allowedCorsOrigins = getAllowedCorsOrigins(); |
| |
| |
| |
| |
| |
| |
| app.use(helmet({ contentSecurityPolicy: false, hsts: false })); |
| app.use(cors({ |
| origin(origin, callback) { |
| callback(null, !origin || allowedCorsOrigins.has(origin)); |
| }, |
| })); |
| |
| |
| |
| app.use(express.json({ limit: '10mb' })); |
| |
| |
| |
| app.use('/api/auth', authRouter); |
| |
| app.use('/api/keys', requireAuth, keysRouter); |
| app.use('/api/models', requireAuth, modelsRouter); |
| app.use('/api/fallback', requireAuth, fallbackRouter); |
| app.use('/api/embeddings', requireAuth, embeddingsRouter); |
| app.use('/api/analytics', requireAuth, analyticsRouter); |
| app.use('/api/health', requireAuth, healthRouter); |
| app.use('/api/settings', requireAuth, settingsRouter); |
| |
| |
| |
| app.use('/v1', createProxyRateLimiter()); |
| app.use('/v1', proxyRouter); |
| |
| app.use('/v1', responsesRouter); |
| |
| app.get('/api/ping', (_req, res) => { |
| res.json({ status: 'ok', timestamp: new Date().toISOString() }); |
| }); |
| |
| app.use(errorHandler); |
| |
| |
| |
| const clientDist = process.env.CLIENT_DIST |
| ? path.resolve(process.env.CLIENT_DIST) |
| : path.resolve(__dirname, '../../client/dist'); |
| app.use(express.static(clientDist)); |
| |
| app.use((req, res, next) => { |
| if (req.path.startsWith('/api/') || req.path.startsWith('/v1/')) { |
| next(); |
| return; |
| } |
| res.sendFile(path.join(clientDist, 'index.html')); |
| }); |
| return app; |
| } |
| |