Skip to content

Commit 323c4d7

Browse files
authored
Merge pull request #41 from saumya1317/feature/in-call-chat-overlay
implement in-call chat overlay with real-time messaging
2 parents 30f48e3 + 94dd01f commit 323c4d7

File tree

11 files changed

+881
-7
lines changed

11 files changed

+881
-7
lines changed

backend/package-lock.json

Lines changed: 23 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,16 @@
66
"scripts": {
77
"test": "echo \"Error: no test specified\" && exit 1",
88
"build": "tsc",
9-
"dev": "nodemon dist/server.js"
9+
"dev": "node server.js",
10+
"dev-ts": "node --loader ts-node/esm src/server.ts"
1011
},
1112
"keywords": [],
1213
"author": "",
1314
"license": "ISC",
1415
"type": "module",
1516
"dependencies": {
1617
"bcryptjs": "^3.0.2",
18+
"cors": "^2.8.5",
1719
"dotenv": "^17.2.3",
1820
"express": "^5.1.0",
1921
"jsonwebtoken": "^9.0.2",

backend/server.js

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
import mongoose from "mongoose";
2+
import { createServer } from "http";
3+
import { Server as SocketIOServer } from "socket.io";
4+
import express from "express";
5+
import dotenv from "dotenv";
6+
import cors from "cors";
7+
8+
dotenv.config();
9+
10+
const app = express();
11+
const PORT = process.env.PORT || 3000;
12+
const MONGO_URI = process.env.MONGO_URI || "mongodb://localhost:27017/peercall";
13+
14+
app.use(express.json());
15+
app.use(cors());
16+
17+
const chatMessages = [];
18+
19+
const httpServer = createServer(app);
20+
const io = new SocketIOServer(httpServer, {
21+
cors: { origin: "*" },
22+
});
23+
24+
io.on("connection", (socket) => {
25+
console.log("User connected:", socket.id);
26+
27+
socket.on("join-room", (roomId, userName) => {
28+
socket.join(roomId);
29+
console.log(`${userName} joined room ${roomId}`);
30+
const roomMessages = chatMessages.filter(msg => msg.roomId === roomId);
31+
socket.emit("chat-history", roomMessages.slice(-50));
32+
});
33+
34+
socket.on("chat-message", ({ roomId, user, text }) => {
35+
const message = {
36+
roomId,
37+
user,
38+
text,
39+
time: new Date(),
40+
id: Date.now()
41+
};
42+
chatMessages.push(message);
43+
io.to(roomId).emit("chat-message", message);
44+
console.log(`Message in ${roomId} from ${user}: ${text}`);
45+
});
46+
47+
socket.on("disconnect", () => {
48+
console.log("User disconnected:", socket.id);
49+
});
50+
});
51+
52+
app.get("/health", (req, res) => {
53+
res.json({ status: "OK", message: "Chat server is running" });
54+
});
55+
56+
httpServer.listen(PORT, () => {
57+
console.log(`🚀 Chat server running on port ${PORT}`);
58+
console.log(`📡 Socket.io ready for real-time chat`);
59+
console.log(`💬 Chat overlay feature is active!`);
60+
});
61+
62+
process.on('SIGINT', () => {
63+
console.log('\n🛑 Shutting down chat server...');
64+
httpServer.close(() => {
65+
console.log('✅ Server closed');
66+
process.exit(0);
67+
});
68+
});
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import mongoose, { Document, Schema } from "mongoose";
2+
3+
export interface IChatMessage extends Document {
4+
roomId: string;
5+
user: string;
6+
text: string;
7+
timestamp: Date;
8+
}
9+
10+
const chatMessageSchema = new Schema<IChatMessage>({
11+
roomId: { type: String, required: true },
12+
user: { type: String, required: true },
13+
text: { type: String, required: true },
14+
timestamp: { type: Date, default: Date.now },
15+
});
16+
17+
export const ChatMessage = mongoose.model<IChatMessage>("ChatMessage", chatMessageSchema);

backend/src/server.ts

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
import mongoose from "mongoose";
2+
import { createServer } from "http";
3+
import { Server as SocketIOServer } from "socket.io";
24
import app from "./app.js"
5+
import { ChatMessage } from "./models/chatMessageModel.js";
36

47
import dotenv from "dotenv";
58
dotenv.config();
@@ -8,10 +11,48 @@ const PORT = process.env.PORT;
811
const MONGO_URI = process.env.MONGO_URI as string;
912
// console.log(MONGO_URI)
1013

14+
const httpServer = createServer(app);
15+
const io = new SocketIOServer(httpServer, {
16+
cors: { origin: "*" },
17+
});
18+
19+
io.on("connection", (socket) => {
20+
socket.on("join-room", async (roomId, userName) => {
21+
socket.join(roomId);
22+
// Send recent chat history to the user
23+
try {
24+
const recentMessages = await ChatMessage.find({ roomId })
25+
.sort({ timestamp: -1 })
26+
.limit(50)
27+
.lean();
28+
socket.emit("chat-history", recentMessages.reverse());
29+
} catch (error) {
30+
console.error("Error fetching chat history:", error);
31+
}
32+
});
33+
34+
socket.on("chat-message", async ({ roomId, user, text }) => {
35+
try {
36+
// Save message to database
37+
const message = new ChatMessage({ roomId, user, text });
38+
await message.save();
39+
40+
// Broadcast to all users in the room
41+
io.to(roomId).emit("chat-message", {
42+
user,
43+
text,
44+
time: new Date(),
45+
});
46+
} catch (error) {
47+
console.error("Error saving message:", error);
48+
}
49+
});
50+
});
51+
1152
mongoose
1253
.connect(MONGO_URI)
1354
.then(() => {
1455
console.log(" MongoDB Connected");
15-
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));
56+
httpServer.listen(PORT, () => console.log(`Server running on port ${PORT}`));
1657
})
1758
.catch((err) => console.error(" DB connection failed:", err));

0 commit comments

Comments
 (0)