apiServer.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. };
  35. apiServer.use(cors(corsOptions));
  36. apiServer.use(helmet());
  37. apiServer.use(csrfProtectionMiddleware);
  38. }
  39. apiServer.use(cookieParser());
  40. apiServer.use(express.json());
  41. if (!dev) {
  42. apiServer.use(
  43. rateLimitMiddleware({
  44. windowMin: config.rate_limits.global.window_minutes,
  45. max: config.rate_limits.global.max_requests,
  46. type: "IP_AND_PATH"
  47. })
  48. );
  49. }
  50. // API routes
  51. const prefix = `/api/v1`;
  52. apiServer.use(logIncomingMiddleware);
  53. apiServer.use(prefix, unauthenticated);
  54. apiServer.use(prefix, authenticated);
  55. // WebSocket routes
  56. apiServer.use(prefix, wsRouter);
  57. // Error handling
  58. apiServer.use(notFoundMiddleware);
  59. apiServer.use(errorHandlerMiddleware);
  60. // Create HTTP server
  61. const httpServer = apiServer.listen(externalPort, (err?: any) => {
  62. if (err) throw err;
  63. logger.info(
  64. `API server is running on http://localhost:${externalPort}`
  65. );
  66. });
  67. // Handle WebSocket upgrades
  68. handleWSUpgrade(httpServer);
  69. return httpServer;
  70. }