Rooms & Namespaces — Realtime

Rooms & Namespaces Tidak semua user perlu terima semua events. Rooms dan namespaces mengorganisasi koneksi. Rooms Group sockets dalam satu namespace. Client…

Rooms & Namespaces

Tidak semua user perlu terima semua events. Rooms dan namespaces mengorganisasi koneksi.

Rooms

Group sockets dalam satu namespace. Client bisa join/leave rooms.

// Server
io.on("connection", (socket) => {
  // Join room
  socket.on("join-channel", (channelId) => {
    socket.join(`channel:${channelId}`);
    socket.to(`channel:${channelId}`).emit("user:joined", {
      userId: socket.data.userId,
    });
  });

  // Leave room
  socket.on("leave-channel", (channelId) => {
    socket.leave(`channel:${channelId}`);
  });

  // Send to room
  socket.on("message", ({ channelId, text }) => {
    io.to(`channel:${channelId}`).emit("message", {
      text,
      userId: socket.data.userId,
    });
  });
});

// Server-side: send to specific room
io.to("channel:general").emit("announcement", { text: "Server restart in 5 min" });

Namespaces

Separate communication channels pada satu server. Berbeda dari rooms — namespaces punya handler terpisah.

// Server
const chatNsp = io.of("/chat");
const adminNsp = io.of("/admin");

chatNsp.on("connection", (socket) => {
  // Handle chat events
  socket.on("message", (data) => { ... });
});

adminNsp.use((socket, next) => {
  // Admin namespace requires admin role
  if (socket.handshake.auth.role !== "admin") {
    return next(new Error("Unauthorized"));
  }
  next();
});

adminNsp.on("connection", (socket) => {
  // Handle admin events
  socket.on("broadcast", (data) => {
    chatNsp.emit("announcement", data); // broadcast ke chat namespace
  });
});

// Client
const chatSocket = io("/chat");
const adminSocket = io("/admin", { auth: { role: "admin" } });

Broadcast Patterns

// Ke semua clients
io.emit("event", data);

// Ke semua kecuali sender
socket.broadcast.emit("event", data);

// Ke specific room
io.to("room1").emit("event", data);

// Ke multiple rooms
io.to("room1").to("room2").emit("event", data);

// Ke specific socket
io.to(socketId).emit("event", data);

Yang akan kamu pelajari