apiServer.ts 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import express, { Request, Response } from "express";
  2. import cors from "cors";
  3. import cookieParser from "cookie-parser";
  4. import config from "@server/config";
  5. import logger from "@server/logger";
  6. import {
  7. errorHandlerMiddleware,
  8. notFoundMiddleware,
  9. rateLimitMiddleware
  10. } from "@server/middlewares";
  11. import { authenticated, unauthenticated } from "@server/routers/external";
  12. import { router as wsRouter, handleWSUpgrade } from "@server/routers/ws";
  13. import { logIncomingMiddleware } from "./middlewares/logIncoming";
  14. import { csrfProtectionMiddleware } from "./middlewares/csrfProtection";
  15. import helmet from "helmet";
  16. const dev = process.env.ENVIRONMENT !== "prod";
  17. const externalPort = config.server.external_port;
  18. export function createApiServer() {
  19. const apiServer = express();
  20. // Middleware setup
  21. apiServer.set("trust proxy", 1);
  22. if (dev) {
  23. apiServer.use(
  24. cors({
  25. origin: `http://localhost:${config.server.next_port}`,
  26. credentials: true
  27. })
  28. );
  29. } else {
  30. const corsOptions = {
  31. origin: config.app.base_url,
  32. methods: ["GET", "POST", "PUT", "DELETE", "PATCH"],
  33. allowedHeaders: ["Content-Type", "X-CSRF-Token"],
  34. credentials: true
  35. };
  36. apiServer.use(cors(corsOptions));
  37. apiServer.use(helmet());
  38. apiServer.use(csrfProtectionMiddleware);
  39. }
  40. apiServer.use(cookieParser());
  41. apiServer.use(express.json());
  42. if (!dev) {
  43. apiServer.use(
  44. rateLimitMiddleware({
  45. windowMin: config.rate_limits.global.window_minutes,
  46. max: config.rate_limits.global.max_requests,
  47. type: "IP_AND_PATH"
  48. })
  49. );
  50. }
  51. // API routes
  52. const prefix = `/api/v1`;
  53. apiServer.use(logIncomingMiddleware);
  54. apiServer.use(prefix, unauthenticated);
  55. apiServer.use(prefix, authenticated);
  56. // WebSocket routes
  57. apiServer.use(prefix, wsRouter);
  58. // Error handling
  59. apiServer.use(notFoundMiddleware);
  60. apiServer.use(errorHandlerMiddleware);
  61. // Create HTTP server
  62. const httpServer = apiServer.listen(externalPort, (err?: any) => {
  63. if (err) throw err;
  64. logger.info(
  65. `API server is running on http://localhost:${externalPort}`
  66. );
  67. });
  68. // Handle WebSocket upgrades
  69. handleWSUpgrade(httpServer);
  70. return httpServer;
  71. }