Files
bodyshop/server.js
Dave Richer 44db8f20e9 - Checkpoint
Signed-off-by: Dave Richer <dave@imexsystems.ca>
2024-09-06 11:53:08 -04:00

100 lines
2.8 KiB
JavaScript

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();