Files
2024-07-19 08:42:38 +02:00

66 lines
1.5 KiB
JavaScript

import { RedisEngine } from "@socket.io/cluster-engine";
import { createServer } from "node:http";
import { createClient } from "redis";
import { Server } from "socket.io";
import { createAdapter } from "@socket.io/redis-adapter";
import proxyModule from "http-proxy";
const { createProxyServer } = proxyModule;
async function initServer(port) {
const httpServer = createServer((req, res) => {
res.writeHead(404).end();
});
const pubClient = createClient();
const subClient = pubClient.duplicate();
await Promise.all([pubClient.connect(), subClient.connect()]);
const engine = new RedisEngine(pubClient, subClient);
engine.attach(httpServer, {
path: "/socket.io/",
});
const io = new Server({
adapter: createAdapter(pubClient, subClient),
});
io.bind(engine);
io.on("connection", (socket) => {
socket.on("hello", () => {
socket.broadcast.emit("hello", socket.id, port);
});
});
httpServer.listen(port);
}
function initProxy() {
const proxy = createProxyServer();
function randomTarget() {
return [
"http://localhost:3001",
"http://localhost:3002",
"http://localhost:3003",
][Math.floor(Math.random() * 3)];
}
const httpServer = createServer((req, res) => {
proxy.web(req, res, { target: randomTarget() });
});
httpServer.on("upgrade", function (req, socket, head) {
proxy.ws(req, socket, head, { target: randomTarget() });
});
httpServer.listen(3000);
}
await Promise.all([initServer(3001), initServer(3002), initServer(3003)]);
initProxy();