|
|
@ -2,7 +2,6 @@ import express, { Request, Response } from "express"; |
|
|
|
import { createServer, Server as HTTPServer } from "http"; |
|
|
|
import { Server as SocketIOServer, Socket } from "socket.io"; |
|
|
|
import cors from "cors"; |
|
|
|
require("dotenv").config(); |
|
|
|
|
|
|
|
// Initialize Express
|
|
|
|
const app = express(); |
|
|
@ -10,10 +9,8 @@ const app = express(); |
|
|
|
// Set up CORS middleware for Express
|
|
|
|
app.use( |
|
|
|
cors({ |
|
|
|
origin: |
|
|
|
process.env.NEXT_FRONTEND_URL || "https://realtime-voicecall.vercel.app", // Update this to the origin of your client
|
|
|
|
origin: "http://localhost:4200", // Update this to the origin of your client
|
|
|
|
methods: ["GET", "POST"], |
|
|
|
credentials: true, // Allow credentials (e.g., cookies) if needed
|
|
|
|
}) |
|
|
|
); |
|
|
|
|
|
|
@ -24,10 +21,8 @@ const httpServer: HTTPServer = createServer(app); |
|
|
|
const io = new SocketIOServer(httpServer, { |
|
|
|
path: "/socket", // Define the WebSocket path
|
|
|
|
cors: { |
|
|
|
origin: |
|
|
|
process.env.NEXT_FRONTEND_URL || "https://realtime-voicecall.vercel.app", // Update this to the origin of your client
|
|
|
|
origin: "http://localhost:4200", // Update this to the origin of your client
|
|
|
|
methods: ["GET", "POST"], |
|
|
|
credentials: true, // Allow credentials (e.g., cookies) if needed
|
|
|
|
}, |
|
|
|
}); |
|
|
|
|
|
|
@ -40,101 +35,59 @@ io.on("connection", (socket: Socket) => { |
|
|
|
|
|
|
|
// Handle user-online event
|
|
|
|
socket.on("user-online", (user: any) => { |
|
|
|
// console.log("User online:", user);
|
|
|
|
// Check if the same user exists in the map
|
|
|
|
for (const [key, value] of onlineUsers.entries()) { |
|
|
|
console.log("value", value); |
|
|
|
if (value.userId === user.userId) { |
|
|
|
// Assuming user object has an 'id' property
|
|
|
|
onlineUsers.delete(key); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
// Now we store the socket ID along with the user details
|
|
|
|
onlineUsers.set(socket.id, { ...user, socketId: socket.id }); |
|
|
|
io.emit("online-users", Array.from(onlineUsers.values())); |
|
|
|
onlineUsers.set(user, { userId: user, socketId: socket.id }); |
|
|
|
// io.emit("online-users", Array.from(onlineUsers.values()));
|
|
|
|
}); |
|
|
|
|
|
|
|
// Handle user disconnect event
|
|
|
|
socket.on("disconnect", () => { |
|
|
|
onlineUsers.delete(socket.id); |
|
|
|
io.emit("online-users", Array.from(onlineUsers.values())); |
|
|
|
io.emit("user-diconnected", socket.id); |
|
|
|
console.log("User Disconnected", socket.id); |
|
|
|
const userArr = Array.from(onlineUsers.values()); |
|
|
|
const u = userArr.filter((item: any) => item.socketId == socket.id); |
|
|
|
onlineUsers.delete(u[0].userId); |
|
|
|
}); |
|
|
|
|
|
|
|
// Handle call-related events
|
|
|
|
|
|
|
|
socket.on("call-request", (data) => { |
|
|
|
console.log("Call request received on server:", data); |
|
|
|
const { to } = data; |
|
|
|
const caller = onlineUsers.get(socket.id); |
|
|
|
console.log("Caller:", caller); |
|
|
|
|
|
|
|
if (caller) { |
|
|
|
socket.on("ice-candidate", (data) => { |
|
|
|
const { candidate, to } = data; |
|
|
|
const calledTo = onlineUsers.get(to); |
|
|
|
if (calledTo) { |
|
|
|
// Emit to the recipient's socket ID
|
|
|
|
io.to(to).emit("call-request", { caller }); |
|
|
|
socket.to(calledTo.socketId).emit("get-ice-candidate", candidate); |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
socket.on("send-message", (message) => { |
|
|
|
const { recipentSocketId } = message; |
|
|
|
|
|
|
|
// Emit message to the specific recipient
|
|
|
|
const recipient = onlineUsers.get(recipentSocketId); |
|
|
|
console.log("recipientSocketId:", recipient, recipentSocketId, onlineUsers); |
|
|
|
if (recipient) { |
|
|
|
io.to(recipentSocketId).emit("receive-message", message); |
|
|
|
console.log("Message Received:", message); |
|
|
|
// // Handle call-related events
|
|
|
|
socket.on("offer", (data) => { |
|
|
|
const { offer, to, sender } = data; |
|
|
|
const calledTo = onlineUsers.get(to); |
|
|
|
if (calledTo) { |
|
|
|
// Emit to the recipient's socket ID
|
|
|
|
socket.to(calledTo.socketId).emit("get-offer", { offer, sender: sender }); |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
socket.on("send-user-typing", (user) => { |
|
|
|
const { recipentSocketId } = user; |
|
|
|
|
|
|
|
// Emit message to the specific recipient
|
|
|
|
const recipient = onlineUsers.get(recipentSocketId); |
|
|
|
if (recipient) { |
|
|
|
io.to(recipentSocketId).emit("receive-user-typing"); |
|
|
|
socket.on("call-request", (data) => { |
|
|
|
const { answer, to } = data; |
|
|
|
const calledTo = onlineUsers.get(to); |
|
|
|
if (calledTo) { |
|
|
|
socket.to(calledTo.socketId).emit("get-answer", answer); |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
socket.on("send-user-typing-end", (user) => { |
|
|
|
const { recipentSocketId } = user; |
|
|
|
|
|
|
|
// Emit message to the specific recipient
|
|
|
|
const recipient = onlineUsers.get(recipentSocketId); |
|
|
|
if (recipient) { |
|
|
|
io.to(recipentSocketId).emit("receive-user-typing-end"); |
|
|
|
socket.on("call-accept", (data) => { |
|
|
|
const { to } = data; |
|
|
|
const calledTo = onlineUsers.get(to); |
|
|
|
if (calledTo) { |
|
|
|
socket.to(calledTo.socketId).emit("call-accepted"); |
|
|
|
} |
|
|
|
}); |
|
|
|
|
|
|
|
socket.on("call-accepted", (data: { to: string }) => { |
|
|
|
const caller = onlineUsers.get(socket.id); |
|
|
|
socket.to(data.to).emit("call-accepted", { caller }); |
|
|
|
}); |
|
|
|
|
|
|
|
socket.on("call-rejected", (data: { to: string }) => { |
|
|
|
socket.to(data.to).emit("call-rejected"); |
|
|
|
}); |
|
|
|
|
|
|
|
socket.on("webrtc-offer", (data: { to: string; offer: any }) => { |
|
|
|
const caller = onlineUsers.get(socket.id); |
|
|
|
socket.to(data.to).emit("webrtc-offer", { data, caller }); |
|
|
|
}); |
|
|
|
|
|
|
|
socket.on("webrtc-answer", (data: { to: string; answer: any }) => { |
|
|
|
console.log("webrtc-answer", data); |
|
|
|
socket.to(data.to).emit("webrtc-answer", data); |
|
|
|
}); |
|
|
|
|
|
|
|
socket.on("webrtc-ice-candidate", (data: { to: string; candidate: any }) => { |
|
|
|
socket.to(data.to).emit("webrtc-ice-candidate", data); |
|
|
|
}); |
|
|
|
|
|
|
|
// Handle call-ended event
|
|
|
|
socket.on("call-ended", (data: { to: string }) => { |
|
|
|
socket.to(data.to).emit("call-ended"); |
|
|
|
socket.on("call-reject", (data: { to: string }) => { |
|
|
|
const { to } = data; |
|
|
|
const calledTo = onlineUsers.get(to); |
|
|
|
if (calledTo) { |
|
|
|
socket.to(calledTo.socketId).emit("call-rejected"); |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
|
|
|
|