const PORT = process.env.PORT || 3000; const io = require("socket.io")(PORT, { cors: { origin: "*", methods: ["GET", "POST"], }, }); const peerSocketMap = new Map(); const socketPeerMap = new Map(); io.on("connection", socket => { console.log(`New client connected, socket ID: ${socket.id}`); const emitToTarget = (eventType, data, recipient) => { const targetSocketId = peerSocketMap.get(recipient); const sender = socketPeerMap.get(socket.id); if (sender && targetSocketId) { io.to(targetSocketId).emit(eventType, { ...data, sender }); } }; socket.on("offer", data => emitToTarget("offer", data, data.recipient)); socket.on("answer", data => emitToTarget("answer", data, data.recipient)); socket.on("candidate", data => emitToTarget("candidate", data, data.recipient)); socket.on("hello", peerId => { console.log(`Received hello from ${peerId}`); peerSocketMap.set(peerId, socket.id); socketPeerMap.set(socket.id, peerId); socket.broadcast.emit("hello", peerId); }); socket.on("disconnect", () => { peerSocketMap.delete(socketPeerMap.get(socket.id)); socketPeerMap.delete(socket.id); console.log(`Client disconnected, socket ID: ${socket.id}`); }); }); console.log(`Signaling server running on port ${PORT}`); const Ministun = require("ministun"); const stunConfig = { udp4: true, udp6: true, port: 3478, log: console.log, err: console.err, sw: true, }; const server = new Ministun(stunConfig); console.log(`STUN server running on port ${stunConfig.port}`);