const main = async () => { // Import core modules const express = require("express"); const cors = require("cors"); const bodyParser = require("body-parser"); const path = require("path"); const compression = require("compression"); const cookieParser = require("cookie-parser"); const http = require("http"); const { Server } = require("socket.io"); const { createClient } = require("redis"); const { createAdapter } = require("@socket.io/redis-adapter"); // Load environment variables require("dotenv").config({ path: path.resolve(process.cwd(), `.env.${process.env.NODE_ENV || "development"}`) }); // Import custom utilities and handlers const logger = require("./server/utils/logger"); // Express app and server setup const app = express(); const port = process.env.PORT || 5000; const server = http.createServer(app); // Redis client setup for Pub/Sub and Key-Value Store const pubClient = createClient({ url: process.env.REDIS_URL || "redis://localhost:6379" }); const subClient = pubClient.duplicate(); // Clean up on exit process.on("SIGINT", async () => { await Promise.all([pubClient.disconnect(), subClient.disconnect()]); process.exit(0); }); // Connect Redis clients await Promise.all([pubClient.connect(), subClient.connect()]); // Redis Pub/Sub adapter for Socket.IO const io = new Server(server, { path: "/ws", adapter: createAdapter(pubClient, subClient), cors: { origin: [ "https://test.imex.online", "https://www.test.imex.online", "http://localhost" // Other allowed origins ], methods: ["GET", "POST"], credentials: true, exposedHeaders: ["set-cookie"] } }); // Export io and Redis client for external use exports.io = io; exports.redisClient = pubClient; require("./server/web-sockets/web-socket"); // Middleware app.use(compression()); app.use(cookieParser()); app.use(bodyParser.json({ limit: "50mb" })); app.use(bodyParser.urlencoded({ limit: "50mb", extended: true })); app.use(cors({ credentials: true, exposedHeaders: ["set-cookie"] })); // Helper middleware app.use((req, res, next) => { req.logger = logger; next(); }); // Route groupings app.use("/", require("./server/routes/miscellaneousRoutes")); // Other routes... // Default route for forbidden access app.get("/", (req, res) => { res.status(200).send("Access Forbidden."); }); try { await server.listen(port); logger.log(`[${process.env.NODE_ENV || "DEVELOPMENT"}] Server started on port ${port}`, "INFO", "api"); } catch (error) { logger.log( `[${process.env.NODE_ENV || "DEVELOPMENT"}] Server failed to start on port ${port}`, "ERROR", "api", error ); } }; // Start server main();