import cluster from "cluster"; import os from "os"; import { setupMaster, setupWorker } from "@socket.io/sticky"; import { createAdapter, setupPrimary } from "@socket.io/cluster-adapter"; import { io } from "./io.js"; import http from "http"; import { Server } from "socket.io"; import { controller } from "../controller/index.js"; import { logger } from "../core/logger.js"; const numCPUs = os.cpus().length; export class CoreCluster { constructor(port) { this.port = port; this.attachThead(); } attachThead() { if (cluster.isMaster) { logger.debug("Total Number of Cores:", numCPUs); logger.debug(`Master ${process.pid} is running`); // setup sticky sessions const httpServer = http.createServer(); setupMaster(httpServer, { loadBalancingMethod: "least-connection", }); setupPrimary(); cluster.setupPrimary({ serialization: "advanced", }); httpServer.listen(this.port); logger.debug(`server is running on port ${this.port}`); for (let i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on("exit", (worker) => { logger.debug(`Worker ${worker.process.pid} died`); cluster.fork(); }); cluster.on("online", (worker) => { logger.debug("Worker %o is listening", worker.process.pid); }); } else { logger.debug(`Worker ${process.pid} started`); // use the cluster adapter io.adapter(createAdapter()); io.ready().then(()=>{ controller.run(); // setupWorker(io); }) setupWorker(io); // controller.run(); // setup connection with the primary process } } }