Events, Rooms & Namespaces
Basic Setup
// server.js
const { Server } = require('socket.io');
const io = new Server(httpServer);
io.on('connection', (socket) => {
console.log('connected:', socket.id);
console.log(socket.handshake.auth.token); // data sent at connect time
socket.on('chat:message', (data, callback) => {
io.to(data.room).emit('chat:message', data); // to everyone in the room
callback({ status: 'delivered' }); // acknowledgment
});
socket.on('disconnect', (reason) => {
console.log('disconnected:', socket.id, reason);
// cleanup — e.g. remove from an "online users" list
});
});
// client.js
const socket = io('http://localhost:3000', { auth: { token: 'abc123' } });
socket.emit('chat:message', { room: 'general', text: 'hi' }, (response) => {
console.log(response.status);
});
socket.on('chat:message', (data) => console.log(data));
// Reconnects automatically on drop — no manual retry logic neededRooms & Broadcasting
socket.on('join', (roomName) => {
socket.join(roomName);
});
io.to('room1').emit('event', data); // only sockets in room1
socket.broadcast.emit('event', data); // everyone EXCEPT the sender
io.emit('event', data); // absolutely everyone
socket.leave('room1'); // auto-leaves all rooms on disconnect anywayNamespaces & Auth Middleware
const adminNamespace = io.of('/admin');
// Connection-level auth — rejects the connection entirely before ANY
// events can be exchanged. Still need separate per-event authorization
// for WHAT an already-connected user is allowed to do.
adminNamespace.use((socket, next) => {
const token = socket.handshake.auth.token;
if (!isValidAdminToken(token)) {
return next(new Error('unauthorized'));
}
next();
});
adminNamespace.on('connection', (socket) => {
socket.on('ban-user', (userId) => {
// still check: is THIS user allowed to ban THIS target?
if (!canBan(socket.data.user, userId)) return;
// ...
});
});Keep your own version of these notes — editable, searchable, and organised by your stack.
Start free