Skip to content

Commit 28ff221

Browse files
committed
feat: setup socket io server
- manual test with test_index.html
1 parent cc7aeb5 commit 28ff221

File tree

4 files changed

+75
-5
lines changed

4 files changed

+75
-5
lines changed

Diff for: backend/.gitignore renamed to .gitignore

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
node_modules
22
.env
3-
dist
3+
dist
4+
.DS_Store

Diff for: backend/package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@
1414
"@types/express": "^5.0.0",
1515
"@types/node": "^22.10.7",
1616
"express": "^4.21.2",
17-
"pino": "^9.6.0"
17+
"pino": "^9.6.0",
18+
"socket.io": "^4.8.1"
1819
}
1920
}
2021

Diff for: backend/src/chat-server.ts

+25-3
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,49 @@
11
import express, { Request, Response } from 'express';
22
import { Logger } from "pino";
3+
import { Server, Socket } from "socket.io";
4+
import { createServer } from "http";
35

46
export class ChatServer {
57
port: number;
68
app: express.Application;
79
logger: Logger;
10+
io: Server;
11+
812
constructor(logger: Logger, port: number = 3000) {
913
this.port = port;
1014
this.logger = logger;
1115
this.app = express();
16+
// ref: https://socket.io/docs/v4/server-initialization/#with-express
17+
this.io = new Server(createServer(this.app), {
18+
cors: {
19+
origin: '*',
20+
}
21+
});
1222
this.setupAppRoutes();
23+
this.setupSocketHandler();
1324
}
1425
setupAppRoutes() {
1526
// health check
16-
// https://kubernetes.io/docs/reference/using-api/health-checks/
27+
// ref: https://kubernetes.io/docs/reference/using-api/health-checks/
1728
this.app.get('/livez', (req: Request, res: Response) => {
1829
res.send('OK');
1930
});
2031
}
2132

22-
listen() {
23-
this.app.listen(this.port, () => {
33+
setupSocketHandler() {
34+
this.io.on("listening", () => {
2435
this.logger.info(`Server running at http://localhost:${this.port}`);
2536
});
37+
this.io.on('connection', (socket: Socket) => {
38+
const sessionLogger = this.logger.child({ session: socket.id });
39+
sessionLogger.info(`Connected client session ${socket.id} on port ${this.port}`);
40+
socket.on('disconnect', () => {
41+
sessionLogger.info('a client disconnected');
42+
});
43+
});
44+
}
45+
46+
listen() {
47+
this.io.listen(this.port);
2648
}
2749
}

Diff for: frontend/test_index.html

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<!-- https://github.com/socketio/socket.io-minimal-example/blob/main/index.html -->
2+
<!DOCTYPE html>
3+
<html lang="en">
4+
<head>
5+
<meta charset="UTF-8" />
6+
<title>Socket.IO Fiddle</title>
7+
</head>
8+
9+
<body>
10+
<h2>Status: <span id="status">Disconnected</span></h2>
11+
<h2>Messages:</h2>
12+
<ul id="messages"></ul>
13+
14+
<script src="http://localhost:3000/socket.io/socket.io.js"></script>
15+
<script>
16+
const status = document.getElementById("status");
17+
const messages = document.getElementById("messages");
18+
19+
const appendMessage = (content) => {
20+
const item = document.createElement("li");
21+
item.textContent = content;
22+
messages.appendChild(item);
23+
};
24+
25+
const socket = io("http://localhost:3000");
26+
27+
socket.on("connect", () => {
28+
status.innerText = "Connected";
29+
appendMessage(`event: connect | session id: ${socket.id}`);
30+
});
31+
32+
socket.on("connect_error", (err) => {
33+
appendMessage(`event: connect_error | reason: ${err.message}`);
34+
});
35+
36+
socket.on("disconnect", (reason) => {
37+
status.innerText = "Disconnected";
38+
appendMessage(`event: disconnect | reason: ${reason}`);
39+
});
40+
41+
socket.onAny((event, ...args) => {
42+
appendMessage(`event: ${event} | arguments: ${args}`);
43+
});
44+
</script>
45+
</body>
46+
</html>

0 commit comments

Comments
 (0)