gilded / server /socket.js
OmegaOne
Upload 41 files
0a8fe79 verified
const jwt = require('jsonwebtoken');
const { JWT_SECRET } = require('./auth');
function setupSocket(io, db) {
io.use((socket, next) => {
try {
const token = socket.handshake.auth.token;
if (!token) {
return next(new Error('Authentication required'));
}
const decoded = jwt.verify(token, JWT_SECRET);
socket.userId = decoded.id;
next();
} catch (err) {
next(new Error('Invalid token'));
}
});
io.on('connection', (socket) => {
const userId = socket.userId;
// Join personal room for notifications
socket.join(`user:${userId}`);
socket.on('join-channel', (channelId) => {
socket.join(`channel:${channelId}`);
});
socket.on('leave-channel', (channelId) => {
socket.leave(`channel:${channelId}`);
});
socket.on('join-dm', (conversationId) => {
socket.join(`dm:${conversationId}`);
});
socket.on('leave-dm', (conversationId) => {
socket.leave(`dm:${conversationId}`);
});
socket.on('typing', ({ channelId }) => {
try {
const user = db.prepare('SELECT username FROM users WHERE id = ?').get(userId);
if (user) {
socket.to(`channel:${channelId}`).emit('user-typing', {
userId,
username: user.username,
channelId
});
}
} catch (err) {
console.error('Typing event error:', err);
}
});
socket.on('dm-typing', ({ conversationId }) => {
try {
const user = db.prepare('SELECT username FROM users WHERE id = ?').get(userId);
if (user) {
socket.to(`dm:${conversationId}`).emit('user-dm-typing', {
userId,
username: user.username,
conversationId
});
}
} catch (err) {
console.error('DM typing event error:', err);
}
});
socket.on('disconnect', () => {
// Cleanup handled automatically by Socket.io
});
});
}
module.exports = { setupSocket };