diff options
| author | Arne Rief <riearn@proton.me> | 2025-12-19 20:03:03 +0100 |
|---|---|---|
| committer | Arne Rief <riearn@proton.me> | 2025-12-19 20:03:03 +0100 |
| commit | 655ec610fcce8dd7748f10772d520bdff4f7c78e (patch) | |
| tree | 35b79f30d2cb5aea88cf76ce27f480da93cefd32 /backend/src/server.ts | |
Basic setup & login
Diffstat (limited to 'backend/src/server.ts')
| -rw-r--r-- | backend/src/server.ts | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/backend/src/server.ts b/backend/src/server.ts new file mode 100644 index 0000000..d2df403 --- /dev/null +++ b/backend/src/server.ts @@ -0,0 +1,86 @@ +import cors from "cors"; +import express from "express"; +import http from "http"; +import { Server } from "socket.io"; +import { closeDBConnection } from "./database/postgres.js"; +import { closeRedisConnection } from "./database/redis.js"; +import router from "./routes/router.js"; + +const port = process.env.PORT ? parseInt(process.env.PORT) : 3000; + +const app = express(); +const httpServer = http.createServer(app); // for Websocket connection + +const io = new Server(httpServer, { + cors: { + origin: "*", + methods: ["GET", "POST"], + }, +}); + +// Global access to Socket.IO server for all controllers +app.set("io", io); + +// Websocket connection handler +io.on("connection", (socket) => { + console.log(`New Client connected: ${socket.id}`); + socket.on("disconnect", () => { + console.log(`Client disconnected: ${socket.id}`); + }); +}); + +app.use(cors()); +app.use(express.json()); + +app.use(router); + +let isShuttingDown = false; +async function shutdown(exitCode: number) { + // Prevent function from being called repeatedly e.g. from nodemon or node --watch + if (isShuttingDown) return; + + isShuttingDown = true; + console.log("[SHUTDOWN] Server shutdown initiated..."); + + // 1. Closing HTTP/WebSocket-Server + httpServer.close(async (error) => { + if (error) { + console.error("Error closing the HTTP server:", error); + } else { + console.log("Closed HTTP- and WebSocket server."); + } + + // Closing connections to database & Redis + await closeDBConnection(); + await closeRedisConnection(); + + // Closing the process + console.log("[SHUTDOWN] Process closed."); + process.exit(exitCode); + }); + + // Timeout as final fallback if server is unresponsive for 10 seconds + setTimeout(() => { + console.error("[SHUTDOWN] Timeout! Forcing shutdown."); + process.exit(1); + }, 10000); +} + +// Listeners for shutdown signals +process.on("SIGINT", () => shutdown(0)); // Ctrl+C +process.on("SIGTERM", () => shutdown(0)); // Kubernetes, Docker, etc. + +httpServer.on("error", (error: NodeJS.ErrnoException) => { + console.error("Failed to connect to the server...", error); + if (error.code === "EADDRINUSE") { + console.error(`Port ${port} is already in use.`); + } + shutdown(1); +}); + +httpServer.listen(port, () => { + console.log( + `The Robot-Tracker API is activ and listening on port ${port}.` + ); + console.log("The WebSocket server is active."); +}); |
