File size: 1,725 Bytes
9de8a4f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d65b197
9de8a4f
 
 
 
 
 
 
 
 
 
 
 
 
 
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import express from 'express';
import helmet from 'helmet';
import cors from 'cors';
import compression from 'compression';
import rateLimit from 'express-rate-limit';
import path from 'path';
import { logger } from './middleware/logger';
import { routeRouter } from './routes/route';

const app = express();
const PORT = parseInt(process.env.PORT || '7860', 10);


app.use(helmet({
  contentSecurityPolicy: false, // Allow map tiles from external origins
}));
app.use(cors({
  origin: process.env.ALLOWED_ORIGINS?.split(',') || '*',
  methods: ['GET', 'POST', 'OPTIONS'],
  allowedHeaders: ['Content-Type', 'Authorization'],
}));
app.use(compression());
app.use(express.json({ limit: '10kb' }));


const limiter = rateLimit({
  windowMs: 15 * 60 * 1000, // 15 minutes
  max: 200,
  standardHeaders: true,
  legacyHeaders: false,
  message: { error: 'Too many requests, please try again later.' },
});
app.use('/api', limiter);


app.use((req, _res, next) => {
  logger.info({ method: req.method, url: req.url, ip: req.ip }, 'incoming request');
  next();
});


app.use('/api', routeRouter);


app.get('/health', (_req, res) => {
  res.json({
    status: 'ok',
    timestamp: new Date().toISOString(),
    version: '1.0.0',
    osrm: process.env.OSRM_URL || 'http://localhost:5001',
  });
});


app.get('*', (_req, res) => {
  res.json({ message: 'RouteWave API (Backend Only)' });
});


app.use((err: Error, _req: express.Request, res: express.Response, _next: express.NextFunction) => {
  logger.error({ err }, 'unhandled error');
  res.status(500).json({ error: 'Internal server error' });
});


app.listen(PORT, '0.0.0.0', () => {
  logger.info({ port: PORT }, `🌊 RouteWave backend running`);
});

export default app;