@@ -612,3 +612,81 @@ test('no url', () => {
612
612
` ,
613
613
)
614
614
} )
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