api-v1/socket.js

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);
};