@@ -22,8 +22,10 @@ const {
2222 SafePromiseRace,
2323 ObjectDefineProperty,
2424 Symbol,
25+ SymbolDispose,
2526} = primordials ;
2627const { AsyncResource } = require ( 'async_hooks' ) ;
28+ const { addAbortListener } = require ( 'events' ) ;
2729const { AbortController } = require ( 'internal/abort_controller' ) ;
2830const {
2931 codes : {
@@ -77,56 +79,27 @@ let kResistStopPropagation;
7779
7880function stopTest ( timeout , signal ) {
7981 const deferred = createDeferredPromise ( ) ;
82+ const abortListener = addAbortListener ( signal , deferred . resolve ) ;
83+ let timer ;
84+
8085
8186 if ( timeout === kDefaultTimeout ) {
82- signal . addEventListener ( 'abort' , deferred . resolve , { __proto__ : null , once : true } ) ;
83-
84- ObjectDefineProperty ( deferred , 'cleanup' , {
85- __proto__ : null ,
86- configurable : true ,
87- writable : true ,
88- value : ( ) => signal . removeEventListener ( 'abort' , deferred . resolve ) ,
89- } ) ;
90-
91- return deferred ;
92- }
93-
94- signal . addEventListener ( 'abort' , throwOnAbort , { __proto__ : null , once : true } ) ;
95- const cleanAbort = ( ) => signal . removeEventListener ( 'abort' , throwOnAbort ) ;
96- const timer = setTimeout ( ( ) => {
97- deferred . resolve ( ) ;
98- cleanAbort ( ) ;
99- } , timeout ) ;
100-
101- timer . unref ( ) ;
102- function throwOnAbort ( ) {
103- deferred . reject ( new AbortError ( undefined , { cause : signal . reason } ) ) ;
104- clearTimeout ( timer ) ;
105- }
106-
107- ObjectDefineProperty ( deferred , 'promise' , {
108- __proto__ : null ,
109- configurable : true ,
110- writable : true ,
111- value : PromisePrototypeThen ( deferred . promise , ( ) => {
87+ deferred . promise [ SymbolDispose ] = abortListener [ SymbolDispose ] ;
88+ } if ( timeout !== kDefaultTimeout ) {
89+ timer = setTimeout ( ( ) => deferred . resolve ( ) , timeout ) ;
90+ timer . unref ( ) ;
91+ deferred . promise = PromisePrototypeThen ( deferred . promise , ( ) => {
11292 throw new ERR_TEST_FAILURE (
11393 `test timed out after ${ timeout } ms` ,
11494 kTestTimeoutFailure ,
11595 ) ;
116- } ) ,
117- } ) ;
118-
119- ObjectDefineProperty ( deferred , 'cleanup' , {
120- __proto__ : null ,
121- configurable : true ,
122- writable : true ,
123- value : ( ) => {
124- clearTimeout ( timer ) ;
125- cleanAbort ( ) ;
126- } ,
127- } ) ;
128-
129- return deferred ;
96+ } ) ;
97+ deferred . promise [ SymbolDispose ] = ( ) => {
98+ abortListener [ SymbolDispose ] ( ) ;
99+ timer [ SymbolDispose ] ( ) ;
100+ }
101+ }
102+ return deferred . promise ;
130103}
131104
132105class TestContext {
@@ -591,7 +564,7 @@ class Test extends AsyncResource {
591564 }
592565 } ) ;
593566
594- let stopPromiseWrapper ;
567+ let stopPromise ;
595568
596569 try {
597570 if ( this . parent ?. hooks . before . length > 0 ) {
@@ -600,7 +573,7 @@ class Test extends AsyncResource {
600573 if ( this . parent ?. hooks . beforeEach . length > 0 ) {
601574 await this . parent . runHook ( 'beforeEach' , { args, ctx } ) ;
602575 }
603- stopPromiseWrapper = stopTest ( this . timeout , this . signal ) ;
576+ stopPromise = stopTest ( this . timeout , this . signal ) ;
604577 const runArgs = ArrayPrototypeSlice ( args ) ;
605578 ArrayPrototypeUnshift ( runArgs , this . fn , ctx ) ;
606579
@@ -616,14 +589,14 @@ class Test extends AsyncResource {
616589 'passed a callback but also returned a Promise' ,
617590 kCallbackAndPromisePresent ,
618591 ) ) ;
619- await SafePromiseRace ( [ ret , stopPromiseWrapper . promise ] ) ;
592+ await SafePromiseRace ( [ ret , stopPromise ] ) ;
620593 } else {
621- await SafePromiseRace ( [ PromiseResolve ( promise ) , stopPromiseWrapper . promise ] ) ;
594+ await SafePromiseRace ( [ PromiseResolve ( promise ) , stopPromise ] ) ;
622595 }
623596 } else {
624597 // This test is synchronous or using Promises.
625598 const promise = ReflectApply ( this . runInAsyncScope , this , runArgs ) ;
626- await SafePromiseRace ( [ PromiseResolve ( promise ) , stopPromiseWrapper . promise ] ) ;
599+ await SafePromiseRace ( [ PromiseResolve ( promise ) , stopPromise ] ) ;
627600 }
628601
629602 if ( this [ kShouldAbort ] ( ) ) {
@@ -647,7 +620,7 @@ class Test extends AsyncResource {
647620 this . fail ( new ERR_TEST_FAILURE ( err , kTestCodeFailure ) ) ;
648621 }
649622 } finally {
650- stopPromiseWrapper ?. cleanup ( ) ;
623+ stopPromise ?. [ SymbolDispose ] ( ) ;
651624
652625 // Do not abort hooks and the root test as hooks instance are shared between tests suite so aborting them will
653626 // cause them to not run for further tests.
@@ -863,7 +836,7 @@ class Suite extends Test {
863836 async run ( ) {
864837 const hookArgs = this . getRunArgs ( ) ;
865838
866- let stopPromiseWrapper ;
839+ let stopPromise ;
867840 try {
868841 this . parent . activeSubtests ++ ;
869842 await this . buildSuite ;
@@ -881,11 +854,11 @@ class Suite extends Test {
881854
882855 await this . runHook ( 'before' , hookArgs ) ;
883856
884- stopPromiseWrapper = stopTest ( this . timeout , this . signal ) ;
857+ stopPromise = stopTest ( this . timeout , this . signal ) ;
885858 const subtests = this . skipped || this . error ? [ ] : this . subtests ;
886859 const promise = SafePromiseAll ( subtests , ( subtests ) => subtests . start ( ) ) ;
887860
888- await SafePromiseRace ( [ promise , stopPromiseWrapper . promise ] ) ;
861+ await SafePromiseRace ( [ promise , stopPromise ] ) ;
889862 await this . runHook ( 'after' , hookArgs ) ;
890863
891864 this . pass ( ) ;
@@ -896,7 +869,7 @@ class Suite extends Test {
896869 this . fail ( new ERR_TEST_FAILURE ( err , kTestCodeFailure ) ) ;
897870 }
898871 } finally {
899- stopPromiseWrapper ?. cleanup ( ) ;
872+ stopPromise ?. [ SymbolDispose ] ( ) ;
900873 }
901874
902875 this . postRun ( ) ;
0 commit comments