EventEmitter listeners
EventEmitter stores listeners in an internal array. Each listener is a root until removed.
Broken code
Section titled “Broken code”examples/node/02-event-emitter-leak.js:
import { EventEmitter } from 'node:events';
const bus = new EventEmitter();
setInterval(() => { const payload = new Array(50_000).fill(0); bus.on('job', () => void payload.length); bus.emit('job');}, 400);Every tick adds another listener — memory and CPU grow.
Fixed code
Section titled “Fixed code”examples/node/02-event-emitter-fixed.js — once, removeListener, or reuse one handler.
Run it
Section titled “Run it”node examples/node/02-event-emitter-leak.jsnode examples/node/02-event-emitter-fixed.jsNode warns: MaxListenersExceededWarning — treat as a leak smell.
flowchart LR emitter[EventEmitter] l1[listener + closure] l2[listener + closure] ln[listener N...] emitter --> l1 emitter --> l2 emitter --> ln