@@ -324,6 +324,57 @@ describe('RampsController', () => {
324324 await expect ( requestPromise ) . rejects . toThrow ( 'Request was aborted' ) ;
325325 } ) ;
326326 } ) ;
327+
328+ it ( 'does not delete newer pending request when aborted request settles' , async ( ) => {
329+ await withController ( async ( { controller } ) => {
330+ let requestASettled = false ;
331+ let requestBCallCount = 0 ;
332+
333+ // Request A: will be aborted but takes time to settle
334+ const fetcherA = async ( signal : AbortSignal ) : Promise < string > => {
335+ return new Promise < string > ( ( resolve , reject ) => {
336+ signal . addEventListener ( 'abort' , ( ) => {
337+ // Simulate async cleanup delay before rejecting
338+ setTimeout ( ( ) => {
339+ requestASettled = true ;
340+ reject ( new Error ( 'Request A aborted' ) ) ;
341+ } , 50 ) ;
342+ } ) ;
343+ } ) ;
344+ } ;
345+
346+ // Request B: normal request that should deduplicate correctly
347+ const fetcherB = async ( ) : Promise < string > => {
348+ requestBCallCount += 1 ;
349+ await new Promise ( ( resolve ) => setTimeout ( resolve , 10 ) ) ;
350+ return 'result-b' ;
351+ } ;
352+
353+ // Start request A
354+ const promiseA = controller . executeRequest ( 'race-key' , fetcherA ) ;
355+
356+ // Abort request A (removes from pendingRequests, triggers abort)
357+ controller . abortRequest ( 'race-key' ) ;
358+
359+ // Start request B with the same key before request A settles
360+ expect ( requestASettled ) . toBe ( false ) ;
361+ const promiseB = controller . executeRequest ( 'race-key' , fetcherB ) ;
362+
363+ // Start request C with same key - should deduplicate with B
364+ const promiseC = controller . executeRequest ( 'race-key' , fetcherB ) ;
365+
366+ // Wait for request A to finish settling (its finally block runs)
367+ await expect ( promiseA ) . rejects . toThrow ( 'Request A aborted' ) ;
368+ expect ( requestASettled ) . toBe ( true ) ;
369+
370+ // Requests B and C should still work correctly (deduplication intact)
371+ const [ resultB , resultC ] = await Promise . all ( [ promiseB , promiseC ] ) ;
372+
373+ expect ( resultB ) . toBe ( 'result-b' ) ;
374+ expect ( resultC ) . toBe ( 'result-b' ) ;
375+ expect ( requestBCallCount ) . toBe ( 1 ) ;
376+ } ) ;
377+ } ) ;
327378 } ) ;
328379
329380 describe ( 'cache eviction' , ( ) => {
0 commit comments