@@ -26,11 +26,13 @@ const {
26
26
const {
27
27
customInspectSymbol,
28
28
kEnumerableProperty,
29
+ kEmptyObject,
29
30
} = require ( 'internal/util' ) ;
30
31
const { inspect } = require ( 'internal/util/inspect' ) ;
31
32
const {
32
33
codes : {
33
34
ERR_ILLEGAL_CONSTRUCTOR ,
35
+ ERR_INVALID_ARG_TYPE ,
34
36
ERR_INVALID_THIS ,
35
37
}
36
38
} = require ( 'internal/errors' ) ;
@@ -79,6 +81,7 @@ const kAborted = Symbol('kAborted');
79
81
const kReason = Symbol ( 'kReason' ) ;
80
82
const kCloneData = Symbol ( 'kCloneData' ) ;
81
83
const kTimeout = Symbol ( 'kTimeout' ) ;
84
+ const kMakeTransferable = Symbol ( 'kMakeTransferable' ) ;
82
85
83
86
function customInspect ( self , obj , depth , options ) {
84
87
if ( depth < 0 )
@@ -159,7 +162,7 @@ class AbortSignal extends EventTarget {
159
162
*/
160
163
static abort (
161
164
reason = new DOMException ( 'This operation was aborted' , 'AbortError' ) ) {
162
- return createAbortSignal ( true , reason ) ;
165
+ return createAbortSignal ( { aborted : true , reason } ) ;
163
166
}
164
167
165
168
/**
@@ -179,10 +182,10 @@ class AbortSignal extends EventTarget {
179
182
[ kNewListener ] ( size , type , listener , once , capture , passive , weak ) {
180
183
super [ kNewListener ] ( size , type , listener , once , capture , passive , weak ) ;
181
184
if ( this [ kTimeout ] &&
182
- type === 'abort' &&
183
- ! this . aborted &&
184
- ! weak &&
185
- size === 1 ) {
185
+ type === 'abort' &&
186
+ ! this . aborted &&
187
+ ! weak &&
188
+ size === 1 ) {
186
189
// If this is a timeout signal, and we're adding a non-weak abort
187
190
// listener, then we don't want it to be gc'd while the listener
188
191
// is attached and the timer still hasn't fired. So, we retain a
@@ -256,9 +259,9 @@ class AbortSignal extends EventTarget {
256
259
}
257
260
258
261
function ClonedAbortSignal ( ) {
259
- return createAbortSignal ( ) ;
262
+ return createAbortSignal ( { transferable : true } ) ;
260
263
}
261
- ClonedAbortSignal . prototype [ kDeserialize ] = ( ) => { } ;
264
+ ClonedAbortSignal . prototype [ kDeserialize ] = ( ) => { } ;
262
265
263
266
ObjectDefineProperties ( AbortSignal . prototype , {
264
267
aborted : kEnumerableProperty ,
@@ -274,12 +277,25 @@ ObjectDefineProperty(AbortSignal.prototype, SymbolToStringTag, {
274
277
275
278
defineEventHandler ( AbortSignal . prototype , 'abort' ) ;
276
279
277
- function createAbortSignal ( aborted = false , reason = undefined ) {
280
+ /**
281
+ * @param {{
282
+ * aborted? : boolean,
283
+ * reason? : any,
284
+ * transferable? : boolean
285
+ * }} [init]
286
+ * @returns {AbortSignal }
287
+ */
288
+ function createAbortSignal ( init = kEmptyObject ) {
289
+ const {
290
+ aborted = false ,
291
+ reason = undefined ,
292
+ transferable = false ,
293
+ } = init ;
278
294
const signal = new EventTarget ( ) ;
279
295
ObjectSetPrototypeOf ( signal , AbortSignal . prototype ) ;
280
296
signal [ kAborted ] = aborted ;
281
297
signal [ kReason ] = reason ;
282
- return lazyMakeTransferable ( signal ) ;
298
+ return transferable ? lazyMakeTransferable ( signal ) : signal ;
283
299
}
284
300
285
301
function abortSignal ( signal , reason ) {
@@ -327,6 +343,30 @@ class AbortController {
327
343
signal : this . signal
328
344
} , depth , options ) ;
329
345
}
346
+
347
+ static [ kMakeTransferable ] ( ) {
348
+ const controller = new AbortController ( ) ;
349
+ controller [ kSignal ] = transferableAbortSignal ( controller [ kSignal ] ) ;
350
+ return controller ;
351
+ }
352
+ }
353
+
354
+ /**
355
+ * Enables the AbortSignal to be transferable using structuredClone/postMessage.
356
+ * @param {AbortSignal } signal
357
+ * @returns {AbortSignal }
358
+ */
359
+ function transferableAbortSignal ( signal ) {
360
+ if ( signal ?. [ kAborted ] === undefined )
361
+ throw new ERR_INVALID_ARG_TYPE ( 'signal' , 'AbortSignal' , signal ) ;
362
+ return lazyMakeTransferable ( signal ) ;
363
+ }
364
+
365
+ /**
366
+ * Creates an AbortController with a transferable AbortSignal
367
+ */
368
+ function transferableAbortController ( ) {
369
+ return AbortController [ kMakeTransferable ] ( ) ;
330
370
}
331
371
332
372
ObjectDefineProperties ( AbortController . prototype , {
@@ -347,4 +387,6 @@ module.exports = {
347
387
AbortController,
348
388
AbortSignal,
349
389
ClonedAbortSignal,
390
+ transferableAbortSignal,
391
+ transferableAbortController,
350
392
} ;
0 commit comments