|
|
const jwt = require('jsonwebtoken');
|
|
|
const User = require('../models/User');
|
|
|
|
|
|
|
|
|
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) => {
|
|
|
|
|
|
io.use(authenticateSocket);
|
|
|
|
|
|
io.on('connection', (socket) => {
|
|
|
console.log(`User ${socket.user.username} connected`);
|
|
|
|
|
|
|
|
|
socket.join(`user_${socket.userId}`);
|
|
|
|
|
|
|
|
|
socket.on('typing', (data) => {
|
|
|
socket.to(`user_${socket.userId}`).emit('userTyping', {
|
|
|
conversationId: data.conversationId,
|
|
|
isTyping: data.isTyping
|
|
|
});
|
|
|
});
|
|
|
|
|
|
|
|
|
socket.on('disconnect', () => {
|
|
|
console.log(`User ${socket.user.username} disconnected`);
|
|
|
});
|
|
|
|
|
|
|
|
|
socket.user.lastSeen = new Date();
|
|
|
socket.user.save().catch(console.error);
|
|
|
});
|
|
|
|
|
|
return io;
|
|
|
};
|
|
|
|
|
|
module.exports = {
|
|
|
initializeSocket
|
|
|
}; |