mirror of https://github.com/nodejs/node.git
events: define abort on prototype
PR-URL: https://github.com/nodejs/node/pull/35931 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Antoine du Hamel <duhamelantoine1995@gmail.com> Reviewed-By: Daijiro Wachi <daijiro.wachi@gmail.com> Reviewed-By: Rich Trott <rtrott@gmail.com>
This commit is contained in:
parent
b80d847608
commit
1c99cdebbc
|
@ -48,6 +48,8 @@ ObjectDefineProperties(AbortSignal.prototype, {
|
||||||
aborted: { enumerable: true }
|
aborted: { enumerable: true }
|
||||||
});
|
});
|
||||||
|
|
||||||
|
defineEventHandler(AbortSignal.prototype, 'abort');
|
||||||
|
|
||||||
function abortSignal(signal) {
|
function abortSignal(signal) {
|
||||||
if (signal[kAborted]) return;
|
if (signal[kAborted]) return;
|
||||||
signal[kAborted] = true;
|
signal[kAborted] = true;
|
||||||
|
@ -65,7 +67,6 @@ class AbortController {
|
||||||
constructor() {
|
constructor() {
|
||||||
this[kSignal] = new AbortSignal();
|
this[kSignal] = new AbortSignal();
|
||||||
emitExperimentalWarning('AbortController');
|
emitExperimentalWarning('AbortController');
|
||||||
defineEventHandler(this[kSignal], 'abort');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
get signal() { return this[kSignal]; }
|
get signal() { return this[kSignal]; }
|
||||||
|
|
|
@ -4,17 +4,16 @@ const {
|
||||||
ArrayFrom,
|
ArrayFrom,
|
||||||
Boolean,
|
Boolean,
|
||||||
Error,
|
Error,
|
||||||
Map,
|
|
||||||
NumberIsInteger,
|
NumberIsInteger,
|
||||||
ObjectAssign,
|
ObjectAssign,
|
||||||
ObjectDefineProperties,
|
ObjectDefineProperties,
|
||||||
ObjectDefineProperty,
|
ObjectDefineProperty,
|
||||||
ObjectGetOwnPropertyDescriptor,
|
ObjectGetOwnPropertyDescriptor,
|
||||||
|
SafeMap,
|
||||||
String,
|
String,
|
||||||
Symbol,
|
Symbol,
|
||||||
SymbolFor,
|
SymbolFor,
|
||||||
SymbolToStringTag,
|
SymbolToStringTag,
|
||||||
SafeWeakMap,
|
|
||||||
SafeWeakSet,
|
SafeWeakSet,
|
||||||
} = primordials;
|
} = primordials;
|
||||||
|
|
||||||
|
@ -36,6 +35,7 @@ const kIsEventTarget = SymbolFor('nodejs.event_target');
|
||||||
const kEvents = Symbol('kEvents');
|
const kEvents = Symbol('kEvents');
|
||||||
const kStop = Symbol('kStop');
|
const kStop = Symbol('kStop');
|
||||||
const kTarget = Symbol('kTarget');
|
const kTarget = Symbol('kTarget');
|
||||||
|
const kHandlers = Symbol('khandlers');
|
||||||
|
|
||||||
const kHybridDispatch = SymbolFor('nodejs.internal.kHybridDispatch');
|
const kHybridDispatch = SymbolFor('nodejs.internal.kHybridDispatch');
|
||||||
const kCreateEvent = Symbol('kCreateEvent');
|
const kCreateEvent = Symbol('kCreateEvent');
|
||||||
|
@ -219,7 +219,7 @@ class Listener {
|
||||||
}
|
}
|
||||||
|
|
||||||
function initEventTarget(self) {
|
function initEventTarget(self) {
|
||||||
self[kEvents] = new Map();
|
self[kEvents] = new SafeMap();
|
||||||
}
|
}
|
||||||
|
|
||||||
class EventTarget {
|
class EventTarget {
|
||||||
|
@ -578,27 +578,24 @@ function emitUnhandledRejectionOrErr(that, err, event) {
|
||||||
process.emit('error', err, event);
|
process.emit('error', err, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
// A map of emitter -> map of name -> handler
|
|
||||||
const eventHandlerValueMap = new SafeWeakMap();
|
|
||||||
|
|
||||||
function defineEventHandler(emitter, name) {
|
function defineEventHandler(emitter, name) {
|
||||||
// 8.1.5.1 Event handlers - basically `on[eventName]` attributes
|
// 8.1.5.1 Event handlers - basically `on[eventName]` attributes
|
||||||
ObjectDefineProperty(emitter, `on${name}`, {
|
ObjectDefineProperty(emitter, `on${name}`, {
|
||||||
get() {
|
get() {
|
||||||
return eventHandlerValueMap.get(this)?.get(name);
|
return this[kHandlers]?.get(name);
|
||||||
},
|
},
|
||||||
set(value) {
|
set(value) {
|
||||||
const oldValue = eventHandlerValueMap.get(this)?.get(name);
|
const oldValue = this[kHandlers]?.get(name);
|
||||||
if (oldValue) {
|
if (oldValue) {
|
||||||
this.removeEventListener(name, oldValue);
|
this.removeEventListener(name, oldValue);
|
||||||
}
|
}
|
||||||
if (typeof value === 'function') {
|
if (typeof value === 'function') {
|
||||||
this.addEventListener(name, value);
|
this.addEventListener(name, value);
|
||||||
}
|
}
|
||||||
if (!eventHandlerValueMap.has(this)) {
|
if (!this[kHandlers]) {
|
||||||
eventHandlerValueMap.set(this, new Map());
|
this[kHandlers] = new SafeMap();
|
||||||
}
|
}
|
||||||
eventHandlerValueMap.get(this).set(name, value);
|
this[kHandlers].set(name, value);
|
||||||
},
|
},
|
||||||
configurable: true,
|
configurable: true,
|
||||||
enumerable: true
|
enumerable: true
|
||||||
|
|
|
@ -146,8 +146,6 @@ ObjectDefineProperty(
|
||||||
// This is called from inside the `MessagePort` constructor.
|
// This is called from inside the `MessagePort` constructor.
|
||||||
function oninit() {
|
function oninit() {
|
||||||
initNodeEventTarget(this);
|
initNodeEventTarget(this);
|
||||||
defineEventHandler(this, 'message');
|
|
||||||
defineEventHandler(this, 'messageerror');
|
|
||||||
setupPortReferencing(this, this, 'message');
|
setupPortReferencing(this, this, 'message');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue