GeezerVison is showing github.com — events: support event handlers on prototypes · nodejs/node@bdad1bc
File treeExpand file treeCollapse file tree Open diff view settings Expand file treeCollapse file tree Open diff view settings Collapse file Copy file name to clipboardExpand all lines: lib/internal/event_target.js +14-7Lines changed: 14 additions & 7 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -13,6 +13,7 @@ const { | 13 | 13 | Symbol, | 14 | 14 | SymbolFor, | 15 | 15 | SymbolToStringTag, | | 16 | + SafeWeakMap, | 16 | 17 | SafeWeakSet, | 17 | 18 | } = primordials; | 18 | 19 |
| @@ -576,21 +577,27 @@ function emitUnhandledRejectionOrErr(that, err, event) { | 576 | 577 | process.emit('error', err, event); | 577 | 578 | } | 578 | 579 |
| | 580 | +// A map of emitter -> map of name -> handler | | 581 | +const eventHandlerValueMap = new SafeWeakMap(); | | 582 | + | 579 | 583 | function defineEventHandler(emitter, name) { | 580 | 584 | // 8.1.5.1 Event handlers - basically `on[eventName]` attributes | 581 | | - let eventHandlerValue; | 582 | | - Object.defineProperty(emitter, `on${name}`, { | | 585 | + ObjectDefineProperty(emitter, `on${name}`, { | 583 | 586 | get() { | 584 | | - return eventHandlerValue; | | 587 | + return eventHandlerValueMap.get(this)?.get(name); | 585 | 588 | }, | 586 | 589 | set(value) { | 587 | | - if (eventHandlerValue) { | 588 | | - emitter.removeEventListener(name, eventHandlerValue); | | 590 | + const oldValue = eventHandlerValueMap.get(this)?.get(name); | | 591 | + if (oldValue) { | | 592 | + this.removeEventListener(name, oldValue); | 589 | 593 | } | 590 | 594 | if (typeof value === 'function') { | 591 | | - emitter.addEventListener(name, value); | | 595 | + this.addEventListener(name, value); | | 596 | + } | | 597 | + if (!eventHandlerValueMap.has(this)) { | | 598 | + eventHandlerValueMap.set(this, new Map()); | 592 | 599 | } | 593 | | - eventHandlerValue = value; | | 600 | + eventHandlerValueMap.get(this).set(name, value); | 594 | 601 | }, | 595 | 602 | configurable: true, | 596 | 603 | enumerable: true | |
Collapse file Copy file name to clipboardExpand all lines: lib/internal/worker/io.js +3-2Lines changed: 3 additions & 2 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -99,13 +99,14 @@ ObjectDefineProperty( | 99 | 99 | // This is called from inside the `MessagePort` constructor. | 100 | 100 | function oninit() { | 101 | 101 | initNodeEventTarget(this); | 102 | | - // TODO(addaleax): This should be on MessagePort.prototype, but | 103 | | - // defineEventHandler() does not support that. | 104 | 102 | defineEventHandler(this, 'message'); | 105 | 103 | defineEventHandler(this, 'messageerror'); | 106 | 104 | setupPortReferencing(this, this, 'message'); | 107 | 105 | } | 108 | 106 |
| | 107 | +defineEventHandler(MessagePort.prototype, 'message'); | | 108 | +defineEventHandler(MessagePort.prototype, 'messageerror'); | | 109 | + | 109 | 110 | ObjectDefineProperty(MessagePort.prototype, onInitSymbol, { | 110 | 111 | enumerable: true, | 111 | 112 | writable: false, | |
Collapse file Copy file name to clipboardExpand all lines: test/parallel/test-worker-message-port.js +2-4Lines changed: 2 additions & 4 deletions | Original file line number | Diff line number | Diff line change |
|---|
@@ -165,9 +165,7 @@ const { MessageChannel, MessagePort } = require('worker_threads'); | 165 | 165 | assert.deepStrictEqual( | 166 | 166 | Object.getOwnPropertyNames(MessagePort.prototype).sort(), | 167 | 167 | [ | 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' | 172 | 170 | ]); | 173 | 171 | } |
|