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);