mirror of
https://github.com/socketio/socket.io.git
synced 2026-01-09 15:08:12 -05:00
66 lines
1.5 KiB
JavaScript
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();
|