6
6
const {
7
7
ObjectAssign,
8
8
ObjectDefineProperties,
9
- ObjectSetPrototypeOf,
10
9
ObjectDefineProperty,
11
10
PromiseResolve,
12
11
SafeFinalizationRegistry,
@@ -69,6 +68,8 @@ const {
69
68
let _MessageChannel ;
70
69
let markTransferMode ;
71
70
71
+ const kDontThrowSymbol = Symbol ( 'kDontThrowSymbol' ) ;
72
+
72
73
// Loading the MessageChannel and markTransferable have to be done lazily
73
74
// because otherwise we'll end up with a require cycle that ends up with
74
75
// an incomplete initialization of abort_controller.
@@ -137,8 +138,35 @@ function setWeakAbortSignalTimeout(weakRef, delay) {
137
138
}
138
139
139
140
class AbortSignal extends EventTarget {
140
- constructor ( ) {
141
- throw new ERR_ILLEGAL_CONSTRUCTOR ( ) ;
141
+
142
+ /**
143
+ * @param {symbol | undefined } dontThrowSymbol
144
+ * @param {{
145
+ * aborted? : boolean,
146
+ * reason? : any,
147
+ * transferable? : boolean,
148
+ * composite? : boolean,
149
+ * }} [init]
150
+ * @private
151
+ */
152
+ constructor ( dontThrowSymbol = undefined , init = kEmptyObject ) {
153
+ if ( dontThrowSymbol !== kDontThrowSymbol ) {
154
+ throw new ERR_ILLEGAL_CONSTRUCTOR ( ) ;
155
+ }
156
+ super ( ) ;
157
+
158
+ const {
159
+ aborted = false ,
160
+ reason = undefined ,
161
+ transferable = false ,
162
+ composite = false ,
163
+ } = init ;
164
+ this [ kAborted ] = aborted ;
165
+ this [ kReason ] = reason ;
166
+ this [ kComposite ] = composite ;
167
+ if ( transferable ) {
168
+ lazyMarkTransferMode ( this , false , true ) ;
169
+ }
142
170
}
143
171
144
172
/**
@@ -176,7 +204,7 @@ class AbortSignal extends EventTarget {
176
204
*/
177
205
static abort (
178
206
reason = new DOMException ( 'This operation was aborted' , 'AbortError' ) ) {
179
- return createAbortSignal ( { aborted : true , reason } ) ;
207
+ return new AbortSignal ( kDontThrowSymbol , { aborted : true , reason } ) ;
180
208
}
181
209
182
210
/**
@@ -185,7 +213,7 @@ class AbortSignal extends EventTarget {
185
213
*/
186
214
static timeout ( delay ) {
187
215
validateUint32 ( delay , 'delay' , false ) ;
188
- const signal = createAbortSignal ( ) ;
216
+ const signal = new AbortSignal ( kDontThrowSymbol ) ;
189
217
signal [ kTimeout ] = true ;
190
218
clearTimeoutRegistry . register (
191
219
signal ,
@@ -199,7 +227,7 @@ class AbortSignal extends EventTarget {
199
227
*/
200
228
static any ( signals ) {
201
229
validateAbortSignalArray ( signals , 'signals' ) ;
202
- const resultSignal = createAbortSignal ( { composite : true } ) ;
230
+ const resultSignal = new AbortSignal ( kDontThrowSymbol , { composite : true } ) ;
203
231
if ( ! signals . length ) {
204
232
return resultSignal ;
205
233
}
@@ -319,7 +347,7 @@ class AbortSignal extends EventTarget {
319
347
}
320
348
321
349
function ClonedAbortSignal ( ) {
322
- return createAbortSignal ( { transferable : true } ) ;
350
+ return new AbortSignal ( kDontThrowSymbol , { transferable : true } ) ;
323
351
}
324
352
ClonedAbortSignal . prototype [ kDeserialize ] = ( ) => { } ;
325
353
@@ -337,33 +365,6 @@ ObjectDefineProperty(AbortSignal.prototype, SymbolToStringTag, {
337
365
338
366
defineEventHandler ( AbortSignal . prototype , 'abort' ) ;
339
367
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
-
367
368
function abortSignal ( signal , reason ) {
368
369
if ( signal [ kAborted ] ) return ;
369
370
signal [ kAborted ] = true ;
@@ -385,15 +386,15 @@ class AbortController {
385
386
* @type {AbortSignal }
386
387
*/
387
388
get signal ( ) {
388
- this . #signal ??= createAbortSignal ( ) ;
389
+ this . #signal ??= new AbortSignal ( kDontThrowSymbol ) ;
389
390
return this . #signal;
390
391
}
391
392
392
393
/**
393
394
* @param {any } [reason]
394
395
*/
395
396
abort ( reason = new DOMException ( 'This operation was aborted' , 'AbortError' ) ) {
396
- abortSignal ( this . #signal ??= createAbortSignal ( ) , reason ) ;
397
+ abortSignal ( this . #signal ??= new AbortSignal ( kDontThrowSymbol ) , reason ) ;
397
398
}
398
399
399
400
[ customInspectSymbol ] ( depth , options ) {
@@ -404,7 +405,7 @@ class AbortController {
404
405
405
406
static [ kMakeTransferable ] ( ) {
406
407
const controller = new AbortController ( ) ;
407
- controller . #signal = createAbortSignal ( { transferable : true } ) ;
408
+ controller . #signal = new AbortSignal ( kDontThrowSymbol , { transferable : true } ) ;
408
409
return controller ;
409
410
}
410
411
}
0 commit comments