@@ -26,11 +26,13 @@ const {
2626const {
2727 customInspectSymbol,
2828 kEnumerableProperty,
29+ kEmptyObject,
2930} = require ( 'internal/util' ) ;
3031const { inspect } = require ( 'internal/util/inspect' ) ;
3132const {
3233 codes : {
3334 ERR_ILLEGAL_CONSTRUCTOR ,
35+ ERR_INVALID_ARG_TYPE ,
3436 ERR_INVALID_THIS ,
3537 }
3638} = require ( 'internal/errors' ) ;
@@ -79,6 +81,7 @@ const kAborted = Symbol('kAborted');
7981const kReason = Symbol ( 'kReason' ) ;
8082const kCloneData = Symbol ( 'kCloneData' ) ;
8183const kTimeout = Symbol ( 'kTimeout' ) ;
84+ const kMakeTransferable = Symbol ( 'kMakeTransferable' ) ;
8285
8386function customInspect ( self , obj , depth , options ) {
8487 if ( depth < 0 )
@@ -159,7 +162,7 @@ class AbortSignal extends EventTarget {
159162 */
160163 static abort (
161164 reason = new DOMException ( 'This operation was aborted' , 'AbortError' ) ) {
162- return createAbortSignal ( true , reason ) ;
165+ return createAbortSignal ( { aborted : true , reason } ) ;
163166 }
164167
165168 /**
@@ -179,10 +182,10 @@ class AbortSignal extends EventTarget {
179182 [ kNewListener ] ( size , type , listener , once , capture , passive , weak ) {
180183 super [ kNewListener ] ( size , type , listener , once , capture , passive , weak ) ;
181184 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 ) {
186189 // If this is a timeout signal, and we're adding a non-weak abort
187190 // listener, then we don't want it to be gc'd while the listener
188191 // is attached and the timer still hasn't fired. So, we retain a
@@ -256,9 +259,9 @@ class AbortSignal extends EventTarget {
256259}
257260
258261function ClonedAbortSignal ( ) {
259- return createAbortSignal ( ) ;
262+ return createAbortSignal ( { transferable : true } ) ;
260263}
261- ClonedAbortSignal . prototype [ kDeserialize ] = ( ) => { } ;
264+ ClonedAbortSignal . prototype [ kDeserialize ] = ( ) => { } ;
262265
263266ObjectDefineProperties ( AbortSignal . prototype , {
264267 aborted : kEnumerableProperty ,
@@ -274,12 +277,25 @@ ObjectDefineProperty(AbortSignal.prototype, SymbolToStringTag, {
274277
275278defineEventHandler ( AbortSignal . prototype , 'abort' ) ;
276279
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 ;
278294 const signal = new EventTarget ( ) ;
279295 ObjectSetPrototypeOf ( signal , AbortSignal . prototype ) ;
280296 signal [ kAborted ] = aborted ;
281297 signal [ kReason ] = reason ;
282- return lazyMakeTransferable ( signal ) ;
298+ return transferable ? lazyMakeTransferable ( signal ) : signal ;
283299}
284300
285301function abortSignal ( signal , reason ) {
@@ -327,6 +343,30 @@ class AbortController {
327343 signal : this . signal
328344 } , depth , options ) ;
329345 }
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 ] ( ) ;
330370}
331371
332372ObjectDefineProperties ( AbortController . prototype , {
@@ -347,4 +387,6 @@ module.exports = {
347387 AbortController,
348388 AbortSignal,
349389 ClonedAbortSignal,
390+ transferableAbortSignal,
391+ transferableAbortController,
350392} ;
0 commit comments