@@ -19,7 +19,7 @@ import { QueryManager, type QueryManagerInit } from '../src/query/manager.js'
1919import  {  convertBuffer  }  from  '../src/utils.js' 
2020import  {  createPeerId ,  createPeerIds  }  from  './utils/create-peer-id.js' 
2121import  {  sortClosestPeers  }  from  './utils/sort-closest-peers.js' 
22- import  type  {  QueryFunc  }  from  '../src/query/types.js' 
22+ import  type  {  QueryContext ,   QueryFunc  }  from  '../src/query/types.js' 
2323import  type  {  RoutingTable  }  from  '../src/routing-table/index.js' 
2424import  type  {  PeerId  }  from  '@libp2p/interface' 
2525
@@ -29,12 +29,9 @@ interface TopologyEntry {
2929  value ?: Uint8Array 
3030  closerPeers ?: number [ ] 
3131  event : QueryEvent 
32+   context ?: QueryContext 
3233} 
33- type  Topology  =  Record < string ,  { 
34-   delay ?: number  |  undefined 
35-   error ?: Error  |  undefined 
36-   event : QueryEvent 
37- } > 
34+ type  Topology  =  Record < string ,  TopologyEntry > 
3835
3936describe ( 'QueryManager' ,  ( )  =>  { 
4037  let  ourPeerId : PeerId 
@@ -55,7 +52,7 @@ describe('QueryManager', () => {
5552  } 
5653
5754  function  createTopology  ( opts : Record < number ,  {  delay ?: number ,  error ?: Error ,  value ?: Uint8Array ,  closerPeers ?: number [ ]  } > ) : Topology  { 
58-     const  topology : Record < string ,   {   delay ?:  number ,   error ?:  Error ,   event :  QueryEvent   } >  =  { } 
55+     const  topology : Topology  =  { } 
5956
6057    Object . keys ( opts ) . forEach ( key  =>  { 
6158      const  id  =  parseInt ( key ) 
@@ -94,9 +91,12 @@ describe('QueryManager', () => {
9491    return  topology 
9592  } 
9693
97-   function  createQueryFunction  ( topology : Record < string ,  {  delay ?: number ,  event : QueryEvent  } > ) : QueryFunc  { 
98-     const  queryFunc : QueryFunc  =  async  function  *  ( {  peer } )  { 
94+   function  createQueryFunction  ( topology : Topology ) : QueryFunc  { 
95+     const  queryFunc : QueryFunc  =  async  function  *  ( context )  { 
96+       const  {  peer }  =  context 
97+ 
9998      const  res  =  topology [ peer . toString ( ) ] 
99+       res . context  =  context 
100100
101101      if  ( res . delay  !=  null )  { 
102102        await  delay ( res . delay ) 
@@ -870,4 +870,46 @@ describe('QueryManager', () => {
870870
871871    await  manager . stop ( ) 
872872  } ) 
873+ 
874+   it ( 'should abort the query if we break out of the loop early' ,  async  ( )  =>  { 
875+     const  manager  =  new  QueryManager ( { 
876+       peerId : ourPeerId , 
877+       logger : defaultLogger ( ) 
878+     } ,  { 
879+       ...defaultInit ( ) , 
880+       disjointPaths : 2 
881+     } ) 
882+     await  manager . start ( ) 
883+ 
884+     // 1 -> 0 [pathComplete] 
885+     // 4 -> 3 [delay] -> 2 [pathComplete] 
886+     const  topology  =  createTopology ( { 
887+       // quick value path 
888+       0 : {  delay : 10 ,  value : uint8ArrayFromString ( 'true' )  } , 
889+       1 : {  closerPeers : [ 0 ]  } , 
890+       // slow value path 
891+       2 : {  value : uint8ArrayFromString ( 'true' )  } , 
892+       3 : {  delay : 1000 ,  closerPeers : [ 2 ]  } , 
893+       4 : {  closerPeers : [ 3 ]  } 
894+     } ) 
895+ 
896+     routingTable . closestPeers . returns ( [ peers [ 1 ] ,  peers [ 4 ] ] ) 
897+ 
898+     for  await  ( const  event  of  manager . run ( key ,  createQueryFunction ( topology ) ) )  { 
899+       if  ( event . name  ===  'VALUE' )  { 
900+         expect ( event . from . toString ( ) ) . to . equal ( peers [ 0 ] . toString ( ) ) 
901+ 
902+         // break out of loop early 
903+         break 
904+       } 
905+     } 
906+ 
907+     // should have aborted query on slow path 
908+     expect ( topology [ peers [ 3 ] . toString ( ) ] ) . to . have . nested . property ( 'context.signal.aborted' ,  true ) 
909+ 
910+     // should not have visited the next peer on the slow path 
911+     expect ( topology [ peers [ 4 ] . toString ( ) ] ) . to . not . have . property ( 'context' ,  true ) 
912+ 
913+     await  manager . stop ( ) 
914+   } ) 
873915} ) 
0 commit comments