| 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: string | undefined, callback: (err: Error | null, allow?: boolean) => void) {
|
| 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;
|
| }
|
|
|