const { Server: SocketIOServer } = require('socket.io'); const { Server: HTTPServer } = require('http'); // Store active connections const activeUsers = new Map(); function createSocketService(httpServer) { const io = new SocketIOServer(httpServer, { cors: { origin: '*', methods: ['GET', 'POST'] } }); io.on('connection', (socket) => { console.log(`New client connected: ${socket.id}`); // Handle user login/registration socket.on('user:register', (userId) => { console.log(`User registered: ${userId} (Socket: ${socket.id})`); activeUsers.set(userId, socket.id); // Broadcast updated user list io.emit('users:update', Array.from(activeUsers.keys())); }); // Handle location updates socket.on('location:update', (data) => { console.log(`Location update from ${data.userId}: ${data.latitude}, ${data.longitude}`); // Broadcast to all connected clients io.emit('location:broadcast', data); }); // Handle direct messages or location shares socket.on('location:share', (data) => { console.log(`Location share from ${data.fromUserId} to ${data.toUserId}`); const targetSocketId = activeUsers.get(data.toUserId); if (targetSocketId) { // Send to specific user io.to(targetSocketId).emit('location:shared', { fromUserId: data.fromUserId, latitude: data.latitude, longitude: data.longitude }); } }); // Handle disconnect socket.on('disconnect', () => { console.log(`Client disconnected: ${socket.id}`); // Remove user from active users for (const [userId, socketId] of activeUsers.entries()) { if (socketId === socket.id) { activeUsers.delete(userId); break; } } // Broadcast updated user list io.emit('users:update', Array.from(activeUsers.keys())); }); }); return io; } module.exports = createSocketService;