apiServer.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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 helmet from "helmet";
  15. const dev = process.env.ENVIRONMENT !== "prod";
  16. const externalPort = config.server.external_port;
  17. export function createApiServer() {
  18. const apiServer = express();
  19. // Middleware setup
  20. apiServer.set("trust proxy", 1);
  21. if (dev) {
  22. apiServer.use(
  23. cors({
  24. origin: `http://localhost:${config.server.next_port}`,
  25. credentials: true,
  26. }),
  27. );
  28. } else {
  29. apiServer.use(cors());
  30. apiServer.use(helmet());
  31. }
  32. apiServer.use(cookieParser());
  33. apiServer.use(express.json());
  34. if (!dev) {
  35. apiServer.use(
  36. rateLimitMiddleware({
  37. windowMin: config.rate_limits.global.window_minutes,
  38. max: config.rate_limits.global.max_requests,
  39. type: "IP_AND_PATH",
  40. }),
  41. );
  42. }
  43. // API routes
  44. const prefix = `/api/v1`;
  45. apiServer.use(logIncomingMiddleware);
  46. apiServer.use(prefix, unauthenticated);
  47. apiServer.use(prefix, authenticated);
  48. // WebSocket routes
  49. apiServer.use(prefix, wsRouter);
  50. // Error handling
  51. apiServer.use(notFoundMiddleware);
  52. apiServer.use(errorHandlerMiddleware);
  53. // Create HTTP server
  54. const httpServer = apiServer.listen(externalPort, (err?: any) => {
  55. if (err) throw err;
  56. logger.info(
  57. `API server is running on http://localhost:${externalPort}`,
  58. );
  59. });
  60. // Handle WebSocket upgrades
  61. handleWSUpgrade(httpServer);
  62. return httpServer;
  63. }