Skip to content

Commit 9addb4c

Browse files
committed
feat: implement real-time chat application with WebSocket messaging, room support, and typing indicators
1 parent 9ba602b commit 9addb4c

3 files changed

Lines changed: 258 additions & 90 deletions

File tree

be/dist/index.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,18 @@ function broadcast(room, payload, exclude) {
2222
const data = JSON.stringify(payload);
2323
allSockets.forEach((user) => {
2424
if (user.room === room && user.socket !== exclude) {
25-
user.socket.send(data);
25+
try {
26+
user.socket.send(data);
27+
}
28+
catch (err) {
29+
console.error(`Failed to send to user ${user.username}:`, err);
30+
}
2631
}
2732
});
2833
}
2934
wss.on('connection', (socket) => {
3035
socket.on('message', (data) => {
31-
var _a, _b, _c;
36+
var _a, _b, _c, _d;
3237
try {
3338
const parsed = JSON.parse(data.toString());
3439
if (parsed.type === 'join') {
@@ -70,6 +75,15 @@ wss.on('connection', (socket) => {
7075
roomMessages.get(currentUser.room).push(msg);
7176
broadcast(currentUser.room, { type: 'chat', payload: msg });
7277
}
78+
if (parsed.type === 'typing') {
79+
const currentUser = allSockets.find((x) => x.socket === socket);
80+
if (!currentUser)
81+
return;
82+
broadcast(currentUser.room, {
83+
type: 'typing',
84+
payload: { username: currentUser.username, isTyping: !!((_d = parsed.payload) === null || _d === void 0 ? void 0 : _d.isTyping) },
85+
}, socket);
86+
}
7387
}
7488
catch (e) {
7589
console.error('Error processing message:', e);

be/src/index.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@ function broadcast(room: string, payload: object, exclude?: WebSocket) {
3434
const data = JSON.stringify(payload);
3535
allSockets.forEach((user) => {
3636
if (user.room === room && user.socket !== exclude) {
37-
user.socket.send(data);
37+
try {
38+
user.socket.send(data);
39+
} catch (err) {
40+
console.error(`Failed to send to user ${user.username}:`, err);
41+
}
3842
}
3943
});
4044
}
@@ -88,6 +92,16 @@ wss.on('connection', (socket) => {
8892

8993
broadcast(currentUser.room, { type: 'chat', payload: msg });
9094
}
95+
96+
if (parsed.type === 'typing') {
97+
const currentUser = allSockets.find((x) => x.socket === socket);
98+
if (!currentUser) return;
99+
100+
broadcast(currentUser.room, {
101+
type: 'typing',
102+
payload: { username: currentUser.username, isTyping: !!parsed.payload?.isTyping },
103+
}, socket);
104+
}
91105
} catch (e) {
92106
console.error('Error processing message:', e);
93107
}

0 commit comments

Comments
 (0)