CHAINR / backend /src /services /socketService.js
chainr-ai's picture
Upload 8536 files
4888678 verified
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
};