Skip to content

Commit ab0eb4f

Browse files
benjamingrdanielleadams
authored andcommitted
events: support event handlers on prototypes
PR-URL: #35931 Reviewed-By: Anna Henningsen <[email protected]> Reviewed-By: Antoine du Hamel <[email protected]> Reviewed-By: Daijiro Wachi <[email protected]> Reviewed-By: Rich Trott <[email protected]>
1 parent 33e2ee5 commit ab0eb4f

File tree

3 files changed

+18
-12
lines changed

3 files changed

+18
-12
lines changed

lib/internal/event_target.js

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const {
1414
Symbol,
1515
SymbolFor,
1616
SymbolToStringTag,
17+
SafeWeakMap,
1718
SafeWeakSet,
1819
} = primordials;
1920

@@ -577,21 +578,27 @@ function emitUnhandledRejectionOrErr(that, err, event) {
577578
process.emit('error', err, event);
578579
}
579580

581+
// A map of emitter -> map of name -> handler
582+
const eventHandlerValueMap = new SafeWeakMap();
583+
580584
function defineEventHandler(emitter, name) {
581585
// 8.1.5.1 Event handlers - basically `on[eventName]` attributes
582-
let eventHandlerValue;
583586
ObjectDefineProperty(emitter, `on${name}`, {
584587
get() {
585-
return eventHandlerValue;
588+
return eventHandlerValueMap.get(this)?.get(name);
586589
},
587590
set(value) {
588-
if (eventHandlerValue) {
589-
emitter.removeEventListener(name, eventHandlerValue);
591+
const oldValue = eventHandlerValueMap.get(this)?.get(name);
592+
if (oldValue) {
593+
this.removeEventListener(name, oldValue);
590594
}
591595
if (typeof value === 'function') {
592-
emitter.addEventListener(name, value);
596+
this.addEventListener(name, value);
597+
}
598+
if (!eventHandlerValueMap.has(this)) {
599+
eventHandlerValueMap.set(this, new Map());
593600
}
594-
eventHandlerValue = value;
601+
eventHandlerValueMap.get(this).set(name, value);
595602
},
596603
configurable: true,
597604
enumerable: true

lib/internal/worker/io.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,13 +146,14 @@ ObjectDefineProperty(
146146
// This is called from inside the `MessagePort` constructor.
147147
function oninit() {
148148
initNodeEventTarget(this);
149-
// TODO(addaleax): This should be on MessagePort.prototype, but
150-
// defineEventHandler() does not support that.
151149
defineEventHandler(this, 'message');
152150
defineEventHandler(this, 'messageerror');
153151
setupPortReferencing(this, this, 'message');
154152
}
155153

154+
defineEventHandler(MessagePort.prototype, 'message');
155+
defineEventHandler(MessagePort.prototype, 'messageerror');
156+
156157
ObjectDefineProperty(MessagePort.prototype, onInitSymbol, {
157158
enumerable: true,
158159
writable: false,

test/parallel/test-worker-message-port.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,7 @@ const { MessageChannel, MessagePort } = require('worker_threads');
165165
assert.deepStrictEqual(
166166
Object.getOwnPropertyNames(MessagePort.prototype).sort(),
167167
[
168-
// TODO(addaleax): This should include onmessage (and eventually
169-
// onmessageerror).
170-
'close', 'constructor', 'postMessage', 'ref', 'start',
171-
'unref'
168+
'close', 'constructor', 'onmessage', 'onmessageerror', 'postMessage',
169+
'ref', 'start', 'unref'
172170
]);
173171
}

0 commit comments

Comments
 (0)