const jwt = require('jsonwebtoken'); const User = require('../models/User'); // Socket authentication middleware const authenticateSocket = async (socket, next) => { try { const token = socket.handshake.auth.token; if (!token) { return next(new Error('Authentication error')); } const decoded = jwt.verify(token, process.env.JWT_SECRET); const user = await User.findById(decoded.userId); if (!user) { return next(new Error('User not found')); } socket.userId = user._id.toString(); socket.user = user; next(); } catch (error) { next(new Error('Authentication error')); } }; const initializeSocket = (io) => { // Authentication middleware io.use(authenticateSocket); io.on('connection', (socket) => { console.log(`User ${socket.user.username} connected`); // Join user to their personal room socket.join(`user_${socket.userId}`); // Handle typing events socket.on('typing', (data) => { socket.to(`user_${socket.userId}`).emit('userTyping', { conversationId: data.conversationId, isTyping: data.isTyping }); }); // Handle disconnection socket.on('disconnect', () => { console.log(`User ${socket.user.username} disconnected`); }); // Update user's last seen socket.user.lastSeen = new Date(); socket.user.save().catch(console.error); }); return io; }; module.exports = { initializeSocket };