@@ -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 /**
@@ -256,7 +259,7 @@ class AbortSignal extends EventTarget {
256259}
257260
258261function ClonedAbortSignal ( ) {
259- return createAbortSignal ( ) ;
262+ return createAbortSignal ( { transferable : true } ) ;
260263}
261264ClonedAbortSignal . prototype [ kDeserialize ] = ( ) => { } ;
262265
@@ -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 ) {
@@ -314,6 +330,30 @@ class AbortController {
314330 signal : this . signal
315331 } , depth , options ) ;
316332 }
333+
334+ static [ kMakeTransferable ] ( ) {
335+ const controller = new AbortController ( ) ;
336+ controller . #signal = transferableAbortSignal ( controller . #signal) ;
337+ return controller ;
338+ }
339+ }
340+
341+ /**
342+ * Enables the AbortSignal to be transferable using structuredClone/postMessage.
343+ * @param {AbortSignal } signal
344+ * @returns {AbortSignal }
345+ */
346+ function transferableAbortSignal ( signal ) {
347+ if ( signal ?. [ kAborted ] === undefined )
348+ throw new ERR_INVALID_ARG_TYPE ( 'signal' , 'AbortSignal' , signal ) ;
349+ return lazyMakeTransferable ( signal ) ;
350+ }
351+
352+ /**
353+ * Creates an AbortController with a transferable AbortSignal
354+ */
355+ function transferableAbortController ( ) {
356+ return AbortController [ kMakeTransferable ] ( ) ;
317357}
318358
319359ObjectDefineProperties ( AbortController . prototype , {
@@ -334,4 +374,6 @@ module.exports = {
334374 AbortController,
335375 AbortSignal,
336376 ClonedAbortSignal,
377+ transferableAbortSignal,
378+ transferableAbortController,
337379} ;
0 commit comments