@@ -612,3 +612,81 @@ test('no url', () => {
612612 ` ,
613613 )
614614} )
615+
616+ describe ( 'request cancellation' , ( ) => {
617+ test ( 'cancels request with AbortSignal' , async ( ) => {
618+ const server = await createHttpServer ( ( _ , res ) => {
619+ // Delay response to allow time for cancellation
620+ setTimeout ( ( ) => {
621+ res . writeHead ( 200 , { 'Content-Type' : 'application/json' } )
622+ res . end ( JSON . stringify ( { jsonrpc : '2.0' , result : '0x1' , id : 0 } ) )
623+ } , 100 )
624+ } )
625+
626+ const controller = new AbortController ( )
627+ const transport = http ( server . url ) ( { } )
628+
629+ // Cancel after 50ms (before server responds at 100ms)
630+ setTimeout ( ( ) => controller . abort ( ) , 50 )
631+
632+ await expect (
633+ transport . request (
634+ { method : 'eth_blockNumber' } ,
635+ { signal : controller . signal } ,
636+ ) ,
637+ ) . rejects . toThrow ( )
638+
639+ await server . close ( )
640+ } )
641+
642+ test ( 'successful request with signal' , async ( ) => {
643+ const server = await createHttpServer ( ( _ , res ) => {
644+ res . writeHead ( 200 , { 'Content-Type' : 'application/json' } )
645+ res . end ( JSON . stringify ( { jsonrpc : '2.0' , result : '0x1' , id : 0 } ) )
646+ } )
647+
648+ const controller = new AbortController ( )
649+ const transport = http ( server . url ) ( { } )
650+
651+ const result = await transport . request (
652+ { method : 'eth_blockNumber' } ,
653+ { signal : controller . signal } ,
654+ )
655+
656+ expect ( result ) . toBe ( '0x1' )
657+ await server . close ( )
658+ } )
659+
660+ test ( 'multiple requests with same controller' , async ( ) => {
661+ const server = await createHttpServer ( ( _ , res ) => {
662+ setTimeout ( ( ) => {
663+ res . writeHead ( 200 , { 'Content-Type' : 'application/json' } )
664+ res . end ( JSON . stringify ( { jsonrpc : '2.0' , result : '0x1' , id : 0 } ) )
665+ } , 100 )
666+ } )
667+
668+ const controller = new AbortController ( )
669+ const transport = http ( server . url ) ( { } )
670+
671+ // Start multiple requests
672+ const promise1 = transport . request (
673+ { method : 'eth_blockNumber' } ,
674+ { signal : controller . signal } ,
675+ )
676+ const promise2 = transport . request (
677+ {
678+ method : 'eth_getBalance' ,
679+ params : [ '0x0000000000000000000000000000000000000000' ] ,
680+ } ,
681+ { signal : controller . signal } ,
682+ )
683+
684+ // Cancel after 50ms
685+ setTimeout ( ( ) => controller . abort ( ) , 50 )
686+
687+ await expect ( promise1 ) . rejects . toThrow ( )
688+ await expect ( promise2 ) . rejects . toThrow ( )
689+
690+ await server . close ( )
691+ } )
692+ } )
0 commit comments