55 lines
1.3 KiB
JavaScript
55 lines
1.3 KiB
JavaScript
import { Server } from "socket.io";
|
|
|
|
let io;
|
|
const userSocketMap = new Map(); // userId -> socketId
|
|
|
|
// Initialize Socket.IO
|
|
export const initSocket = (server) => {
|
|
io = new Server(server, {
|
|
cors: {
|
|
origin: "*", // Adjust as needed for production
|
|
methods: ["GET", "POST"],
|
|
},
|
|
});
|
|
|
|
io.on("connection", (socket) => {
|
|
console.log("A user connected:", socket.id);
|
|
|
|
// Event for user to register their ID
|
|
socket.on("register", (userId) => {
|
|
if (userId) {
|
|
userSocketMap.set(userId, socket.id);
|
|
console.log(`Registered user ${userId} to socket ${socket.id}`);
|
|
}
|
|
});
|
|
|
|
socket.on("disconnect", () => {
|
|
console.log("User disconnected:", socket.id);
|
|
// Optional: Remove user from map. This is inefficient O(N).
|
|
// Better: keep reverse map or just iterate. Map iteration is okay for small scale.
|
|
for (const [userId, socketId] of userSocketMap.entries()) {
|
|
if (socketId === socket.id) {
|
|
userSocketMap.delete(userId);
|
|
console.log(`Unregistered user ${userId}`);
|
|
break;
|
|
}
|
|
}
|
|
});
|
|
});
|
|
|
|
return io;
|
|
};
|
|
|
|
// Get the IO instance
|
|
export const getIO = () => {
|
|
if (!io) {
|
|
throw new Error("Socket.io not initialized!");
|
|
}
|
|
return io;
|
|
};
|
|
|
|
// Get socket ID for a user
|
|
export const getSocketId = (userId) => {
|
|
return userSocketMap.get(userId);
|
|
};
|