@@ -206,3 +206,38 @@ const Countdown = require('../common/countdown');
206
206
assert . strictEqual ( req . destroyed , true ) ;
207
207
} ) ) ;
208
208
}
209
+ // Pass an already destroyed signal to abort immediately.
210
+ {
211
+ const server = h2 . createServer ( ) ;
212
+ const controller = new AbortController ( ) ;
213
+
214
+ server . on ( 'stream' , common . mustNotCall ( ) ) ;
215
+ server . listen ( 0 , common . mustCall ( ( ) => {
216
+ const client = h2 . connect ( `http://localhost:${ server . address ( ) . port } ` ) ;
217
+ client . on ( 'close' , common . mustCall ( ) ) ;
218
+
219
+ const { signal } = controller ;
220
+ controller . abort ( ) ;
221
+
222
+ assert . strictEqual ( signal [ kEvents ] . get ( 'abort' ) , undefined ) ;
223
+
224
+ client . on ( 'error' , common . mustCall ( ( ) => {
225
+ // After underlying stream dies, signal listener detached
226
+ assert . strictEqual ( signal [ kEvents ] . get ( 'abort' ) , undefined ) ;
227
+ } ) ) ;
228
+
229
+ const req = client . request ( { } , { signal } ) ;
230
+ // Signal already aborted, so no event listener attached.
231
+ assert . strictEqual ( signal [ kEvents ] . get ( 'abort' ) , undefined ) ;
232
+
233
+ assert . strictEqual ( req . aborted , false ) ;
234
+ // Destroyed on same tick as request made
235
+ assert . strictEqual ( req . destroyed , true ) ;
236
+
237
+ req . on ( 'error' , common . mustCall ( ( err ) => {
238
+ assert . strictEqual ( err . code , 'ABORT_ERR' ) ;
239
+ assert . strictEqual ( err . name , 'AbortError' ) ;
240
+ } ) ) ;
241
+ req . on ( 'close' , common . mustCall ( ( ) => server . close ( ) ) ) ;
242
+ } ) ) ;
243
+ }
0 commit comments