@@ -22,8 +22,10 @@ const {
22
22
SafePromiseRace,
23
23
ObjectDefineProperty,
24
24
Symbol,
25
+ SymbolDispose,
25
26
} = primordials ;
26
27
const { AsyncResource } = require ( 'async_hooks' ) ;
28
+ const { addAbortListener } = require ( 'events' ) ;
27
29
const { AbortController } = require ( 'internal/abort_controller' ) ;
28
30
const {
29
31
codes : {
@@ -77,56 +79,27 @@ let kResistStopPropagation;
77
79
78
80
function stopTest ( timeout , signal ) {
79
81
const deferred = createDeferredPromise ( ) ;
82
+ const abortListener = addAbortListener ( signal , deferred . resolve ) ;
83
+ let timer ;
84
+
80
85
81
86
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 , ( ) => {
112
92
throw new ERR_TEST_FAILURE (
113
93
`test timed out after ${ timeout } ms` ,
114
94
kTestTimeoutFailure ,
115
95
) ;
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 ;
130
103
}
131
104
132
105
class TestContext {
@@ -591,7 +564,7 @@ class Test extends AsyncResource {
591
564
}
592
565
} ) ;
593
566
594
- let stopPromiseWrapper ;
567
+ let stopPromise ;
595
568
596
569
try {
597
570
if ( this . parent ?. hooks . before . length > 0 ) {
@@ -600,7 +573,7 @@ class Test extends AsyncResource {
600
573
if ( this . parent ?. hooks . beforeEach . length > 0 ) {
601
574
await this . parent . runHook ( 'beforeEach' , { args, ctx } ) ;
602
575
}
603
- stopPromiseWrapper = stopTest ( this . timeout , this . signal ) ;
576
+ stopPromise = stopTest ( this . timeout , this . signal ) ;
604
577
const runArgs = ArrayPrototypeSlice ( args ) ;
605
578
ArrayPrototypeUnshift ( runArgs , this . fn , ctx ) ;
606
579
@@ -616,14 +589,14 @@ class Test extends AsyncResource {
616
589
'passed a callback but also returned a Promise' ,
617
590
kCallbackAndPromisePresent ,
618
591
) ) ;
619
- await SafePromiseRace ( [ ret , stopPromiseWrapper . promise ] ) ;
592
+ await SafePromiseRace ( [ ret , stopPromise ] ) ;
620
593
} else {
621
- await SafePromiseRace ( [ PromiseResolve ( promise ) , stopPromiseWrapper . promise ] ) ;
594
+ await SafePromiseRace ( [ PromiseResolve ( promise ) , stopPromise ] ) ;
622
595
}
623
596
} else {
624
597
// This test is synchronous or using Promises.
625
598
const promise = ReflectApply ( this . runInAsyncScope , this , runArgs ) ;
626
- await SafePromiseRace ( [ PromiseResolve ( promise ) , stopPromiseWrapper . promise ] ) ;
599
+ await SafePromiseRace ( [ PromiseResolve ( promise ) , stopPromise ] ) ;
627
600
}
628
601
629
602
if ( this [ kShouldAbort ] ( ) ) {
@@ -647,7 +620,7 @@ class Test extends AsyncResource {
647
620
this . fail ( new ERR_TEST_FAILURE ( err , kTestCodeFailure ) ) ;
648
621
}
649
622
} finally {
650
- stopPromiseWrapper ?. cleanup ( ) ;
623
+ stopPromise ?. [ SymbolDispose ] ( ) ;
651
624
652
625
// Do not abort hooks and the root test as hooks instance are shared between tests suite so aborting them will
653
626
// cause them to not run for further tests.
@@ -863,7 +836,7 @@ class Suite extends Test {
863
836
async run ( ) {
864
837
const hookArgs = this . getRunArgs ( ) ;
865
838
866
- let stopPromiseWrapper ;
839
+ let stopPromise ;
867
840
try {
868
841
this . parent . activeSubtests ++ ;
869
842
await this . buildSuite ;
@@ -881,11 +854,11 @@ class Suite extends Test {
881
854
882
855
await this . runHook ( 'before' , hookArgs ) ;
883
856
884
- stopPromiseWrapper = stopTest ( this . timeout , this . signal ) ;
857
+ stopPromise = stopTest ( this . timeout , this . signal ) ;
885
858
const subtests = this . skipped || this . error ? [ ] : this . subtests ;
886
859
const promise = SafePromiseAll ( subtests , ( subtests ) => subtests . start ( ) ) ;
887
860
888
- await SafePromiseRace ( [ promise , stopPromiseWrapper . promise ] ) ;
861
+ await SafePromiseRace ( [ promise , stopPromise ] ) ;
889
862
await this . runHook ( 'after' , hookArgs ) ;
890
863
891
864
this . pass ( ) ;
@@ -896,7 +869,7 @@ class Suite extends Test {
896
869
this . fail ( new ERR_TEST_FAILURE ( err , kTestCodeFailure ) ) ;
897
870
}
898
871
} finally {
899
- stopPromiseWrapper ?. cleanup ( ) ;
872
+ stopPromise ?. [ SymbolDispose ] ( ) ;
900
873
}
901
874
902
875
this . postRun ( ) ;
0 commit comments