diff --git a/src/js/node/events.ts b/src/js/node/events.ts index 455dd4e0ac76..68febad27e7b 100644 --- a/src/js/node/events.ts +++ b/src/js/node/events.ts @@ -47,7 +47,7 @@ const kCapture: typeof shared.kCapture = shared.kCapture; // writes `undefined` instead of `delete`, keeping one shared JSC Structure // so the (StructureID, name)-keyed megamorphic cache stays hot. const kShapeMode: typeof shared.kShapeMode = shared.kShapeMode; -const kErrorMonitor = Symbol.for("events.errorMonitor"); +const kErrorMonitor = Symbol("events.errorMonitor"); const kMaxEventTargetListeners = Symbol("events.maxEventTargetListeners"); const kMaxEventTargetListenersWarned = Symbol("events.maxEventTargetListenersWarned"); const kWatermarkData = Symbol.for("nodejs.watermarkData"); diff --git a/test/js/node/events/event-emitter.test.ts b/test/js/node/events/event-emitter.test.ts index a8c26f5f6f8b..eb87b9b6920f 100644 --- a/test/js/node/events/event-emitter.test.ts +++ b/test/js/node/events/event-emitter.test.ts @@ -8,6 +8,7 @@ import { join } from "path"; // our transpiler transform changes this to a var with import.meta.require import EventEmitter, { captureRejectionSymbol, + errorMonitor, getEventListeners, getMaxListeners, listenerCount, @@ -757,6 +758,42 @@ describe("EventEmitter error handling", () => { expect(handled).toBe(true); }); + + test("errorMonitor is not in the global symbol registry", () => { + expect({ + namedExport: errorMonitor === EventEmitter.errorMonitor, + sameAsRegistered: errorMonitor === Symbol.for("events.errorMonitor"), + keyFor: Symbol.keyFor(errorMonitor), + description: errorMonitor.description, + }).toEqual({ + namedExport: true, + sameAsRegistered: false, + keyFor: undefined, + description: "events.errorMonitor", + }); + }); + + test("a listener under Symbol.for('events.errorMonitor') is not an error monitor", () => { + const registered = Symbol.for("events.errorMonitor"); + const myEmitter = new EventEmitter(); + + const calls: unknown[][] = []; + myEmitter.on(registered, (...args) => calls.push(args)); + + expect(() => { + myEmitter.emit("error", new Error("boom")); + }).toThrow("boom"); + expect(calls).toEqual([]); + + expect(myEmitter.emit(registered, "direct")).toBe(true); + expect(calls).toEqual([["direct"]]); + + myEmitter.on(errorMonitor, () => {}); + expect({ + monitors: myEmitter.listenerCount(errorMonitor), + registered: myEmitter.listenerCount(registered), + }).toEqual({ monitors: 1, registered: 1 }); + }); }); describe("EventEmitter captureRejections", () => {