Skip to content

Commit 0e5afee

Browse files
docs: add example with PM2
Related: #5054
1 parent eab9623 commit 0e5afee

5 files changed

Lines changed: 165 additions & 0 deletions

File tree

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export const apps = [
2+
{
3+
name: "pm2-example",
4+
script: "entrypoint.js",
5+
// script: "fastify-entrypoint.js",
6+
instances: "max",
7+
exec_mode: "cluster",
8+
},
9+
];

examples/pm2-example/entrypoint.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { readFileSync } from "node:fs";
2+
import { createServer } from "node:http";
3+
import { Server } from "socket.io";
4+
import { createAdapter } from "@socket.io/cluster-adapter";
5+
import { setupWorker } from "@socket.io/sticky";
6+
7+
const httpServer = createServer((req, res) => {
8+
if (req.method === "GET" && req.url === "/") {
9+
const content = readFileSync("./index.html");
10+
res.writeHead(200, {
11+
"content-type": "text/html",
12+
});
13+
res.write(content);
14+
res.end();
15+
} else {
16+
res.writeHead(404).end();
17+
}
18+
});
19+
20+
const io = new Server(httpServer, {
21+
adapter: createAdapter(),
22+
});
23+
24+
setupWorker(io);
25+
26+
io.on("connection", (socket) => {
27+
console.log(`connect ${socket.id}`);
28+
29+
socket.emit("nodeId", process.env.NODE_APP_INSTANCE);
30+
31+
socket.conn.on("upgrade", (transport) => {
32+
console.log(`transport upgraded to ${transport.name}`);
33+
});
34+
35+
socket.on("disconnect", (reason) => {
36+
console.log(`disconnect ${socket.id} due to ${reason}`);
37+
});
38+
});
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import Fastify from "fastify";
2+
import staticPlugin from "@fastify/static";
3+
import { Server } from "socket.io";
4+
import { createAdapter } from "@socket.io/cluster-adapter";
5+
import { setupWorker } from "@socket.io/sticky";
6+
7+
const fastify = Fastify();
8+
9+
fastify.register(staticPlugin, {
10+
root: import.meta.dirname,
11+
});
12+
13+
fastify.get("/", (req, reply) => {
14+
reply.sendFile("index.html");
15+
});
16+
17+
const io = new Server(fastify.server, {
18+
adapter: createAdapter(),
19+
});
20+
21+
setupWorker(io);
22+
23+
io.on("connection", (socket) => {
24+
console.log(`connect ${socket.id}`);
25+
26+
socket.emit("nodeId", process.env.NODE_APP_INSTANCE ?? "N/A");
27+
28+
socket.conn.on("upgrade", (transport) => {
29+
console.log(`transport upgraded to ${transport.name}`);
30+
});
31+
32+
socket.on("disconnect", (reason) => {
33+
console.log(`disconnect ${socket.id} due to ${reason}`);
34+
});
35+
});
36+
37+
fastify.addHook("preClose", (done) => {
38+
// close all active connections on this server
39+
io.local.disconnectSockets(true);
40+
done();
41+
});
42+
43+
fastify.addHook("onClose", (_instance, done) => {
44+
io.close(done);
45+
});
46+
47+
fastify.ready(() => {
48+
console.log("successfully booted!");
49+
});

examples/pm2-example/index.html

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8" />
5+
<title>Socket.IO PM2 example</title>
6+
</head>
7+
<body>
8+
<p>Connection status: <span id="status">-</span></p>
9+
<p>Node ID: <span id="nodeId">-</span></p>
10+
<p>Transport: <span id="transport">-</span></p>
11+
12+
<script src="/socket.io/socket.io.js"></script>
13+
<script>
14+
const $status = document.getElementById("status");
15+
const $nodeId = document.getElementById("nodeId");
16+
const $transport = document.getElementById("transport");
17+
18+
const socket = io({
19+
// transports: ["websocket"]
20+
transports: ["polling", "websocket"],
21+
});
22+
23+
socket.on("connect", () => {
24+
console.log(`connect ${socket.id}`);
25+
$status.innerText = "connected";
26+
$transport.innerText = socket.io.engine.transport.name;
27+
28+
socket.io.engine.on("upgrade", (transport) => {
29+
console.log(`transport upgraded to ${transport.name}`);
30+
$transport.innerText = socket.io.engine.transport.name;
31+
});
32+
});
33+
34+
socket.on("nodeId", (nodeId) => {
35+
$nodeId.innerText = nodeId;
36+
});
37+
38+
socket.on("connect_error", (err) => {
39+
console.log(`connect_error due to ${err.message}`);
40+
});
41+
42+
socket.on("disconnect", (reason) => {
43+
console.log(`disconnect due to ${reason}`);
44+
$status.innerText = "disconnected";
45+
$nodeId.innerText = "-";
46+
$transport.innerText = "-";
47+
});
48+
</script>
49+
</body>
50+
</html>

examples/pm2-example/package.json

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
{
2+
"private": true,
3+
"name": "pm2-example",
4+
"version": "0.0.0",
5+
"type": "module",
6+
"dependencies": {
7+
"@fastify/static": "^9.1.3",
8+
"@socket.io/cluster-adapter": "^0.3.0",
9+
"@socket.io/sticky": "^1.0.4",
10+
"fastify": "^5.8.5",
11+
"socket.io": "^4.8.3"
12+
},
13+
"scripts": {
14+
"start": "npx @socket.io/pm2 startOrReload ecosystem.config.js",
15+
"stop": "npx @socket.io/pm2 stop pm2-example",
16+
"ps": "npx @socket.io/pm2 ps",
17+
"cleanup": "npx @socket.io/pm2 delete pm2-example"
18+
}
19+
}

0 commit comments

Comments
 (0)