Socket.IO
01 / 02

Events, Rooms & Namespaces

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 needed

Rooms & 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 anyway

Namespaces & 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