This commit is contained in:
Ramprasad 2024-11-08 13:18:25 +05:30
parent b3561bd155
commit c1760f03a8
5 changed files with 73 additions and 104 deletions

7
.babelrc Normal file
View File

@ -0,0 +1,7 @@
{
"presets": [
["@babel/preset-env", { "targets": { "node": "current" } }],
"@babel/preset-typescript"
],
"plugins": ["@babel/plugin-transform-runtime"]
}

4
.gitignore vendored
View File

@ -1,2 +1,2 @@
/node_modules node_modules
.env dist

View File

@ -3,9 +3,11 @@
"version": "1.0.0", "version": "1.0.0",
"main": "index.js", "main": "index.js",
"scripts": { "scripts": {
"dev": "ts-node src/index.ts", "build": "babel src --out-dir dist --extensions \".ts,.js\"",
"build": "tsc", "type-check": "tsc --noEmit",
"start": "node dist/index.js" "start": "node dist/index.js",
"dev": "nodemon --watch src --exec ts-node src/index.ts",
"test": "jest"
}, },
"keywords": [], "keywords": [],
"author": "", "author": "",
@ -13,16 +15,21 @@
"description": "", "description": "",
"dependencies": { "dependencies": {
"cors": "^2.8.5", "cors": "^2.8.5",
"crypto-js": "^4.2.0",
"dotenv": "^16.4.5",
"express": "^4.21.1", "express": "^4.21.1",
"socket.io": "^4.8.0" "socket.io": "^4.8.0"
}, },
"devDependencies": { "devDependencies": {
"@types/crypto-js": "^4.2.2", "@babel/cli": "^7.25.9",
"@babel/core": "^7.26.0",
"@babel/node": "^7.26.0",
"@babel/plugin-transform-runtime": "^7.25.9",
"@babel/preset-env": "^7.26.0",
"@babel/preset-typescript": "^7.26.0",
"@babel/runtime": "^7.26.0",
"@types/express": "^5.0.0", "@types/express": "^5.0.0",
"@types/node": "^22.7.5", "@types/node": "^22.7.5",
"@types/socket.io": "^3.0.2", "@types/socket.io": "^3.0.2",
"nodemon": "^3.1.7",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"typescript": "^5.6.3" "typescript": "^5.6.3"
} }

View File

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

View File

@ -1,13 +1,15 @@
{ {
"compilerOptions": { "compilerOptions": {
"target": "ES2020", "target": "ESNext", // Handled by Babel
"module": "commonjs", "module": "CommonJS", // Node.js module system
"strict": true, "strict": true, // Enable strict type-checking
"esModuleInterop": true, "esModuleInterop": true, // Allow default imports from CJS modules
"skipLibCheck": true, "skipLibCheck": true, // Skip type checking of declaration files
"forceConsistentCasingInFileNames": true, "forceConsistentCasingInFileNames": true,
"outDir": "./dist" "outDir": "./dist", // Output directory
"rootDir": "./src", // Source directory
"noEmit": true // No need to emit files, Babel does that
}, },
"include": ["src/**/*.ts"], "include": ["src/**/*"],
"exclude": ["node_modules"] "exclude": ["node_modules", "dist"]
} }