diff --git a/lib/internal/abort_controller.js b/lib/internal/abort_controller.js index 9762280426e544..f047a878ffedd0 100644 --- a/lib/internal/abort_controller.js +++ b/lib/internal/abort_controller.js @@ -5,7 +5,9 @@ const { Object, + ObjectSetPrototypeOf, Symbol, + TypeError, } = primordials; const { @@ -34,6 +36,11 @@ function customInspect(self, obj, depth, options) { } class AbortSignal extends EventTarget { + constructor() { + // eslint-disable-next-line no-restricted-syntax + throw new TypeError('Illegal constructor'); + } + get aborted() { return !!this[kAborted]; } [customInspectSymbol](depth, options) { @@ -49,6 +56,13 @@ Object.defineProperties(AbortSignal.prototype, { defineEventHandler(AbortSignal.prototype, 'abort'); +function createAbortSignal() { + const signal = new EventTarget(); + ObjectSetPrototypeOf(signal, AbortSignal.prototype); + signal[kAborted] = false; + return signal; +} + function abortSignal(signal) { if (signal[kAborted]) return; signal[kAborted] = true; @@ -64,7 +78,7 @@ function abortSignal(signal) { const kSignal = Symbol('signal'); class AbortController { constructor() { - this[kSignal] = new AbortSignal(); + this[kSignal] = createAbortSignal(); emitExperimentalWarning('AbortController'); } diff --git a/test/parallel/test-abortcontroller.js b/test/parallel/test-abortcontroller.js index aba647a1eccc02..3eba5fff051512 100644 --- a/test/parallel/test-abortcontroller.js +++ b/test/parallel/test-abortcontroller.js @@ -3,7 +3,7 @@ const common = require('../common'); -const { ok, strictEqual } = require('assert'); +const { ok, strictEqual, throws } = require('assert'); const { Event } = require('internal/event_target'); { @@ -52,3 +52,12 @@ const { Event } = require('internal/event_target'); strictEqual(firstTrusted, secondTrusted); strictEqual(untrusted, firstTrusted); } + +{ + // Tests that AbortSignal is impossible to construct manually + const ac = new AbortController(); + throws( + () => new ac.signal.constructor(), + /^TypeError: Illegal constructor$/ + ); +}