Skip to content

Commit

Permalink
lib: improve perf of AbortListener creation
Browse files Browse the repository at this point in the history
  • Loading branch information
rluvaton committed Apr 7, 2024
1 parent 74343a7 commit 9b06e6c
Showing 1 changed file with 36 additions and 36 deletions.
72 changes: 36 additions & 36 deletions lib/internal/abort_controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ const {
let _MessageChannel;
let markTransferMode;

const kDontThrowSymbol = Symbol('kDontThrowSymbol');

// Loading the MessageChannel and markTransferable have to be done lazily
// because otherwise we'll end up with a require cycle that ends up with
// an incomplete initialization of abort_controller.
Expand Down Expand Up @@ -137,8 +139,33 @@ function setWeakAbortSignalTimeout(weakRef, delay) {
}

class AbortSignal extends EventTarget {
constructor() {
throw new ERR_ILLEGAL_CONSTRUCTOR();

/**
* @param {{
* aborted? : boolean,
* reason? : any,
* transferable? : boolean,
* composite? : boolean,
* }} [init]
*/
constructor(dontThrowSymbol = undefined, init = kEmptyObject) {
if(dontThrowSymbol !== kDontThrowSymbol) {
throw new ERR_ILLEGAL_CONSTRUCTOR();
}
super();

const {
aborted = false,
reason = undefined,
transferable = false,
composite = false,
} = init;
this[kAborted] = aborted;
this[kReason] = reason;
this[kComposite] = composite;
if (transferable) {
lazyMarkTransferMode(this, false, true);
}
}

/**
Expand Down Expand Up @@ -176,7 +203,7 @@ class AbortSignal extends EventTarget {
*/
static abort(
reason = new DOMException('This operation was aborted', 'AbortError')) {
return createAbortSignal({ aborted: true, reason });
return new AbortSignal(kDontThrowSymbol, { aborted: true, reason });
}

/**
Expand All @@ -185,7 +212,7 @@ class AbortSignal extends EventTarget {
*/
static timeout(delay) {
validateUint32(delay, 'delay', false);
const signal = createAbortSignal();
const signal = new AbortSignal(kDontThrowSymbol);
signal[kTimeout] = true;
clearTimeoutRegistry.register(
signal,
Expand All @@ -199,7 +226,7 @@ class AbortSignal extends EventTarget {
*/
static any(signals) {
validateAbortSignalArray(signals, 'signals');
const resultSignal = createAbortSignal({ composite: true });
const resultSignal = new AbortSignal(kDontThrowSymbol, { composite: true });
if (!signals.length) {
return resultSignal;
}
Expand Down Expand Up @@ -319,7 +346,7 @@ class AbortSignal extends EventTarget {
}

function ClonedAbortSignal() {
return createAbortSignal({ transferable: true });
return new AbortSignal(kDontThrowSymbol, { transferable: true });
}
ClonedAbortSignal.prototype[kDeserialize] = () => {};

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

defineEventHandler(AbortSignal.prototype, 'abort');

/**
* @param {{
* aborted? : boolean,
* reason? : any,
* transferable? : boolean,
* composite? : boolean,
* }} [init]
* @returns {AbortSignal}
*/
function createAbortSignal(init = kEmptyObject) {
const {
aborted = false,
reason = undefined,
transferable = false,
composite = false,
} = init;
const signal = new EventTarget();
ObjectSetPrototypeOf(signal, AbortSignal.prototype);
signal[kAborted] = aborted;
signal[kReason] = reason;
signal[kComposite] = composite;
if (transferable) {
lazyMarkTransferMode(signal, false, true);
}
return signal;
}

function abortSignal(signal, reason) {
if (signal[kAborted]) return;
signal[kAborted] = true;
Expand All @@ -385,15 +385,15 @@ class AbortController {
* @type {AbortSignal}
*/
get signal() {
this.#signal ??= createAbortSignal();
this.#signal ??= new AbortSignal(kDontThrowSymbol);
return this.#signal;
}

/**
* @param {any} [reason]
*/
abort(reason = new DOMException('This operation was aborted', 'AbortError')) {
abortSignal(this.#signal ??= createAbortSignal(), reason);
abortSignal(this.#signal ??= new AbortSignal(kDontThrowSymbol), reason);
}

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

static [kMakeTransferable]() {
const controller = new AbortController();
controller.#signal = createAbortSignal({ transferable: true });
controller.#signal = new AbortSignal(kDontThrowSymbol, { transferable: true });
return controller;
}
}
Expand Down

0 comments on commit 9b06e6c

Please sign in to comment.