Socket.IO Namespaces
custom namespace, default namespace, per-namespace middleware ও dynamic namespace — বাংলায়।
Namespace হলো একই socket server-এর ভিতরে আলাদা আলাদা channel — যেমন /chat, /admin, /notifications। একই TCP connection-এ হলেও এদের event ও middleware সম্পূর্ণ আলাদা থাকে।
শেখার লক্ষ্য
- namespace ও room-এর পার্থক্য বোঝা
- custom namespace তৈরি ও ব্যবহার
- per-namespace middleware কনফিগার
- কখন namespace, কখন room — সিদ্ধান্ত নেওয়া
Namespace vs Room
| বিষয় | Namespace | Room |
|---|---|---|
| তৈরি | server code-এ io.of(name) | runtime-এ socket.join() |
| Client থেকে switch | নতুন connection object লাগে | একই connection-এ dynamic |
| Middleware | আলাদা middleware set | নেই |
| কখন | app-এর বড় ভাগ (chat vs admin) | ভাগ করা topic/group |
Default Namespace
সব client ডিফল্টভাবে / namespace-এ যুক্ত হয়। এখন পর্যন্ত যা করেছি, সব ডিফল্ট namespace-এই।
// দুটোই ডিফল্ট ('/') namespace
const io = new Server(httpServer);
io.on("connection", (socket) => {
console.log("root namespace:", socket.nsp.name); // "/"
});Custom Namespace তৈরি
// /chat namespace
const chat = io.of("/chat");
chat.on("connection", (socket) => {
console.log("chat namespace:", socket.id);
socket.on("message", (text) => {
chat.emit("message", text); // শুধু /chat-এর সবাই
});
});
// /admin namespace
io.of("/admin").on("connection", (socket) => {
console.log("admin connected:", socket.id);
});// client — namespace-এ connect
const chatSocket = io("/chat");
const adminSocket = io("/admin");
chat.on("message", (text) => console.log("চ্যাট:", text));
// অথবা full URL সহ
const socket = io("http://localhost:3000/chat");নামের মিল থাকলেও namespace একাধিক physical connection তৈরি করে না — Socket.IO একাধিক namespace-এর জন্য একই underlying connection পুনর্ব্যবহার করে (multiplexing)। client-এর manager সেটি দেখতে পাওয়া যায়।
Per-Namespace Middleware
প্রতিটি namespace-এর নিজের middleware থাকতে পারে — যেমন /admin-এ admin auth দরকার, /chat-এ শুধু login:
const adminNs = io.of("/admin");
adminNs.use((socket, next) => {
const token = socket.handshake.auth.token;
if (token === process.env.ADMIN_TOKEN) {
next(); // অনুমোদিত
} else {
const err = new Error("admin only");
err.data = { status: 403 };
next(err); // প্রত্যাখ্যান
}
});
adminNs.on("connection", (socket) => {
socket.emit("admin:ready", true);
});io.of("/chat").use(...) কেবল /chat namespace-এর connection-এ চলে। অন্যদিকে io.use(...) কেবল root / namespace-এর জন্য (v3 থেকে)। সব namespace-এ একই middleware দরকার হলে একটি reusable function বানিয়ে প্রতিটিতে (বা dynamic namespace-এর parent-এ) register করুন। আরও: Middleware।
Dynamic Namespace (v4)
Socket.IO v4-এ io.of(/regex/) দিয়ে dynamic namespace বানানো যায়:
const dynamic = io.of(/^\/project-\d+$/);
dynamic.on("connection", (socket) => {
// socket.nsp.name = "/project-42" ইত্যাদি
console.log("সংশ্লিষ্ট project:", socket.nsp.name);
});কখন Namespace বেছে নেবেন?
- একই server-এ সম্পূর্ণ আলাদা domain থাকলে — chat vs admin vs notification
- আলাদা auth/middleware দরকার হলে
- আলাদা client module/connection object ব্যবস্থাপনা সহজ হলে
সাধারণত rooms দিয়েই কাজ চলে; namespace তখনই ব্যবহার করা উচিত যখন middleware বা connection আলাদা করা দরকার।
সাধারণ ভুল ও সমাধান
- namespace নাম ভুল — client
io("/chat")আর serverio.of("/chat"); দুই জায়গায় একই নাম রাখুন - room আর namespace মেলানো —
/chatnamespace আলাদা object;io.to("chat")দিলে default namespace-এর "chat" room-এ যায়,/chatnamespace-এ নয় - সব কাজ এক namespace-এ — ভবিষ্যতে বড় হলে ভাগ করা কঠিন
Practice Task
/chatও/admin— দুটি namespace বানিয়ে আলাদা message পাঠান/admin-এ token middleware দিয়ে সঠিক/ভুল token test করুন- একটিমাত্র connection-এ একাধিক namespace ব্যবহার করে announce করুন
সম্পর্কিত অধ্যায়: Rooms · Private and Group Messaging · Middleware