Skip to content

Commit 0fb9cb4

Browse files
committed
implement backend server with socket.io for real-time messaging
1 parent f7ed68f commit 0fb9cb4

1 file changed

Lines changed: 168 additions & 0 deletions

File tree

chat-app/backend/server.js

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,168 @@
1+
const express = require("express");
2+
const http = require("http");
3+
const cors = require("cors");
4+
const { Server } = require("socket.io");
5+
6+
const app = express();
7+
8+
app.use(cors());
9+
app.use(express.json());
10+
11+
const server = http.createServer(app);
12+
13+
const io = new Server(server, {
14+
cors: {
15+
origin: "*",
16+
},
17+
});
18+
19+
// Store messages in memory
20+
let messages = [];
21+
22+
// Track online users
23+
let onlineUsers = [];
24+
25+
io.on("connection", (socket) => {
26+
27+
// delete messages
28+
socket.on("delete_message", (id) => {
29+
30+
// remove message from array
31+
messages = messages.filter(
32+
(msg) => msg.id !== id
33+
);
34+
35+
// notify all clients
36+
io.emit("message_deleted", id);
37+
});
38+
39+
console.log("User connected");
40+
41+
// Send old messages
42+
socket.emit("load_messages", messages);
43+
44+
45+
// USER JOIN
46+
47+
socket.on("join", (username) => {
48+
socket.username = username;
49+
50+
if (
51+
username && !onlineUsers.includes(username)
52+
) {
53+
onlineUsers.push(username);
54+
}
55+
56+
io.emit("online_users", onlineUsers);
57+
});
58+
59+
60+
// TYPING INDICATOR
61+
62+
socket.on("typing", (username) => {
63+
socket.broadcast.emit(
64+
"typing",
65+
username
66+
);
67+
});
68+
69+
70+
// SEND MESSAGE
71+
72+
socket.on("send_message", (message) => {
73+
const newMessage = {
74+
id: Date.now(),
75+
76+
text: message.text,
77+
user: message.user,
78+
color: message.color,
79+
80+
likes: 0,
81+
dislikes: 0,
82+
83+
replyTo: message.replyTo || null,
84+
85+
createdAt: new Date(),
86+
};
87+
88+
89+
// SCHEDULED MESSAGE
90+
91+
if (message.scheduledFor) {
92+
93+
const delay = new Date(message.scheduledFor) - new Date();
94+
95+
setTimeout(() => {
96+
messages.push(newMessage);
97+
io.emit(
98+
"receive_message",
99+
newMessage
100+
);
101+
102+
}, delay);
103+
104+
} else {
105+
106+
messages.push(newMessage);
107+
108+
io.emit(
109+
"receive_message",
110+
newMessage
111+
);
112+
}
113+
});
114+
115+
116+
// LIKE MESSAGE
117+
118+
socket.on("like_message", (id) => {
119+
const msg = messages.find( (m) => m.id === id
120+
);
121+
if (msg){
122+
msg.likes++; io.emit(
123+
"update_message",
124+
msg
125+
);
126+
}
127+
});
128+
129+
130+
// DISLIKE MESSAGE
131+
132+
socket.on("dislike_message", (id) => {
133+
134+
const msg = messages.find(
135+
(m) => m.id === id
136+
);
137+
138+
if (msg) {
139+
140+
msg.dislikes++;
141+
142+
io.emit(
143+
"update_message",
144+
msg
145+
);
146+
}
147+
});
148+
149+
150+
// DISCONNECT
151+
152+
socket.on("disconnect", () => {
153+
onlineUsers =
154+
onlineUsers.filter((user) =>user !== socket.username
155+
);
156+
157+
io.emit( "online_users", onlineUsers
158+
);
159+
160+
console.log("User disconnected");
161+
});
162+
});
163+
164+
server.listen(5000, () => {
165+
console.log(
166+
"Server running on port 5000"
167+
);
168+
});

0 commit comments

Comments
 (0)