Skip to content

Commit 9b06e6c

Browse files
committed
lib: improve perf of AbortListener creation
1 parent 74343a7 commit 9b06e6c

File tree

1 file changed

+36
-36
lines changed

1 file changed

+36
-36
lines changed

lib/internal/abort_controller.js

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ const {
6969
let _MessageChannel;
7070
let markTransferMode;
7171

72+
const kDontThrowSymbol = Symbol('kDontThrowSymbol');
73+
7274
// Loading the MessageChannel and markTransferable have to be done lazily
7375
// because otherwise we'll end up with a require cycle that ends up with
7476
// an incomplete initialization of abort_controller.
@@ -137,8 +139,33 @@ function setWeakAbortSignalTimeout(weakRef, delay) {
137139
}
138140

139141
class AbortSignal extends EventTarget {
140-
constructor() {
141-
throw new ERR_ILLEGAL_CONSTRUCTOR();
142+
143+
/**
144+
* @param {{
145+
* aborted? : boolean,
146+
* reason? : any,
147+
* transferable? : boolean,
148+
* composite? : boolean,
149+
* }} [init]
150+
*/
151+
constructor(dontThrowSymbol = undefined, init = kEmptyObject) {
152+
if(dontThrowSymbol !== kDontThrowSymbol) {
153+
throw new ERR_ILLEGAL_CONSTRUCTOR();
154+
}
155+
super();
156+
157+
const {
158+
aborted = false,
159+
reason = undefined,
160+
transferable = false,
161+
composite = false,
162+
} = init;
163+
this[kAborted] = aborted;
164+
this[kReason] = reason;
165+
this[kComposite] = composite;
166+
if (transferable) {
167+
lazyMarkTransferMode(this, false, true);
168+
}
142169
}
143170

144171
/**
@@ -176,7 +203,7 @@ class AbortSignal extends EventTarget {
176203
*/
177204
static abort(
178205
reason = new DOMException('This operation was aborted', 'AbortError')) {
179-
return createAbortSignal({ aborted: true, reason });
206+
return new AbortSignal(kDontThrowSymbol, { aborted: true, reason });
180207
}
181208

182209
/**
@@ -185,7 +212,7 @@ class AbortSignal extends EventTarget {
185212
*/
186213
static timeout(delay) {
187214
validateUint32(delay, 'delay', false);
188-
const signal = createAbortSignal();
215+
const signal = new AbortSignal(kDontThrowSymbol);
189216
signal[kTimeout] = true;
190217
clearTimeoutRegistry.register(
191218
signal,
@@ -199,7 +226,7 @@ class AbortSignal extends EventTarget {
199226
*/
200227
static any(signals) {
201228
validateAbortSignalArray(signals, 'signals');
202-
const resultSignal = createAbortSignal({ composite: true });
229+
const resultSignal = new AbortSignal(kDontThrowSymbol, { composite: true });
203230
if (!signals.length) {
204231
return resultSignal;
205232
}
@@ -319,7 +346,7 @@ class AbortSignal extends EventTarget {
319346
}
320347

321348
function ClonedAbortSignal() {
322-
return createAbortSignal({ transferable: true });
349+
return new AbortSignal(kDontThrowSymbol, { transferable: true });
323350
}
324351
ClonedAbortSignal.prototype[kDeserialize] = () => {};
325352

@@ -337,33 +364,6 @@ ObjectDefineProperty(AbortSignal.prototype, SymbolToStringTag, {
337364

338365
defineEventHandler(AbortSignal.prototype, 'abort');
339366

340-
/**
341-
* @param {{
342-
* aborted? : boolean,
343-
* reason? : any,
344-
* transferable? : boolean,
345-
* composite? : boolean,
346-
* }} [init]
347-
* @returns {AbortSignal}
348-
*/
349-
function createAbortSignal(init = kEmptyObject) {
350-
const {
351-
aborted = false,
352-
reason = undefined,
353-
transferable = false,
354-
composite = false,
355-
} = init;
356-
const signal = new EventTarget();
357-
ObjectSetPrototypeOf(signal, AbortSignal.prototype);
358-
signal[kAborted] = aborted;
359-
signal[kReason] = reason;
360-
signal[kComposite] = composite;
361-
if (transferable) {
362-
lazyMarkTransferMode(signal, false, true);
363-
}
364-
return signal;
365-
}
366-
367367
function abortSignal(signal, reason) {
368368
if (signal[kAborted]) return;
369369
signal[kAborted] = true;
@@ -385,15 +385,15 @@ class AbortController {
385385
* @type {AbortSignal}
386386
*/
387387
get signal() {
388-
this.#signal ??= createAbortSignal();
388+
this.#signal ??= new AbortSignal(kDontThrowSymbol);
389389
return this.#signal;
390390
}
391391

392392
/**
393393
* @param {any} [reason]
394394
*/
395395
abort(reason = new DOMException('This operation was aborted', 'AbortError')) {
396-
abortSignal(this.#signal ??= createAbortSignal(), reason);
396+
abortSignal(this.#signal ??= new AbortSignal(kDontThrowSymbol), reason);
397397
}
398398

399399
[customInspectSymbol](depth, options) {
@@ -404,7 +404,7 @@ class AbortController {
404404

405405
static [kMakeTransferable]() {
406406
const controller = new AbortController();
407-
controller.#signal = createAbortSignal({ transferable: true });
407+
controller.#signal = new AbortSignal(kDontThrowSymbol, { transferable: true });
408408
return controller;
409409
}
410410
}

0 commit comments

Comments
 (0)