EventEmitter হল Node-এর একটি মূল ক্লাস যা প্রকাশ/সাবস্ক্রাইব প্যাটার্ন প্রয়োগ করে: অবজেক্টগুলি নামযুক্ত ইভেন্ট নির্গত করে, এবং সেই ইভেন্টগুলির জন্য নিবন্ধিত শ্রোতারা যখন তারা ট্রিগার হয় তখন চলে। Node-এর নিজস্ব API-এর বেশিরভাগ (streams, HTTP servers, process) এটির উপর নির্মিত।
মৌলিক ব্যবহার
import { EventEmitter } from "events";
const emitter = new EventEmitter();
// SUBSCRIBE: register a listener for an event
emitter.on("order", (order) => {
console.log(`Processing order ${order.id}`);
});
// PUBLISH: emit the event (with optional data)
emitter.emit("order", { id: 123 }); // → "Processing order 123"
প্যাটার্ন: on(event, listener) সাবস্ক্রাইব করে; emit(event, ...args) সেই ইভেন্টের জন্য সমস্ত শ্রোতাদের সিঙ্ক্রোনাসভাবে ট্রিগার করে, যুক্তিগুলি পাস করে।
আপনার নিজের ক্লাসগুলির জন্য EventEmitter প্রসারিত করা
class OrderService extends EventEmitter {
placeOrder(order) {
// ...save the order...
this.emit("order:created", order); // notify anyone interested
}
}
const service = new OrderService();
service.on("order:created", (o) => sendEmail(o)); // decoupled listeners
service.on("order:created", (o) => updateAnalytics(o));
service.placeOrder({ id: 1 }); // both listeners run
এটি emitter কে এর শ্রোতাদের থেকে আলাদা করে — OrderService জানে না বা যত্ন করে না কে শুনছে, তাই আপনি প্রতিক্রিয়া যোগ করতে পারেন (ইমেল, বিশ্লেষণ, লগিং) এটি সংশোধন না করে।
উপকারী পদ্ধতি
emitter.once("ready", fn); // listener runs only ONCE, then auto-removes
emitter.off("order", fn); // remove a listener (prevent leaks)
emitter.emit("error", new Error()); // "error" is special — throws if no listener!
emitter.listenerCount("order");
দুটি গুরুত্বপূর্ণ সতর্কতা
⚠️ Memory leaks: forgetting to remove listeners (use off/once). Node warns at >10
listeners on one event ("possible EventEmitter memory leak").
⚠️ The "error" event: if emitted with no listener, Node THROWS and may crash —
always attach an error listener to emitters that can error (streams!).
Node-এ এটি যেখানে ব্যবহার করা হয়
streams (data, end, error events), http.Server (request event),
process (SIGTERM, exit), sockets — all are EventEmitters.
কেন এটি গুরুত্বপূর্ণ
EventEmitter হল Node-এর ইভেন্ট-চালিত আর্কিটেকচারের ভিত্তি — এটি বোঝা ব্যাখ্যা করে যে কীভাবে streams, servers, এবং process অবজেক্ট কাজ করে (তারা সব emitters), এবং এটি আপনার নিজের কোডে আলগা-যুক্ত, ইভেন্ট-ভিত্তিক যোগাযোগের জন্য আদর্শ সরঞ্জাম।
on/emit/once/off API জানা, অপসারিত শ্রোতাদের থেকে মেমরি-লিক ঝুঁকি, এবং বিশেষ ক্র্যাশ-সৃষ্টিকারী error ইভেন্ট, Node-এর API-গুলি সঠিকভাবে ব্যবহার করা এবং রক্ষণাবেক্ষণযোগ্য ইভেন্ট-চালিত সিস্টেম তৈরি করার জন্য অপরিহার্য।
