@@ -12,7 +12,7 @@ import { DialQueue } from '../../src/connection-manager/dial-queue.js'
12
12
import type { Connection } from '@libp2p/interface/connection'
13
13
import type { ConnectionGater } from '@libp2p/interface/connection-gater'
14
14
import type { PeerId } from '@libp2p/interface/peer-id'
15
- import type { PeerStore } from '@libp2p/interface/peer-store'
15
+ import type { Address , PeerStore } from '@libp2p/interface/peer-store'
16
16
import type { Transport } from '@libp2p/interface/transport'
17
17
import type { TransportManager } from '@libp2p/interface-internal/transport-manager'
18
18
@@ -330,4 +330,99 @@ describe('dial queue', () => {
330
330
331
331
resolvers . delete ( 'dnsaddr' )
332
332
} )
333
+
334
+ const ensureDialOrder = async ( peerId : PeerId , orderedAddresses : Address [ ] , testType : 'lastFailure' | 'lastSuccess' ) : Promise < void > => {
335
+ components . transportManager . transportForMultiaddr . returns ( stubInterface < Transport > ( ) )
336
+
337
+ const duplicatedOrderedAddresses = [ ...orderedAddresses ]
338
+
339
+ const dialer = new DialQueue ( components , {
340
+ maxParallelDials : 1
341
+ } )
342
+
343
+ // reverse order of addresses
344
+ orderedAddresses . reverse ( )
345
+
346
+ const sortedAddresses = await dialer . calculateMultiaddrs ( peerId , orderedAddresses )
347
+
348
+ expect ( sortedAddresses . map ( address => address [ testType ] ) ) . to . deep . equal ( duplicatedOrderedAddresses . map ( address => address [ testType ] ) )
349
+ }
350
+
351
+ it ( 'should sort already succesfully dialled addresses by most recently sucessful' , async ( ) => {
352
+ const peerId = await createEd25519PeerId ( )
353
+ const orderedAddresses : Address [ ] = [
354
+ {
355
+ multiaddr : multiaddr ( '/ip4/127.0.0.1/tcp/1231' ) ,
356
+ lastSuccess : Date . now ( )
357
+ } ,
358
+ {
359
+ multiaddr : multiaddr ( '/ip4/127.0.0.1/tcp/1232' ) ,
360
+ lastSuccess : Date . now ( ) - 1000
361
+ } ,
362
+ {
363
+ multiaddr : multiaddr ( '/ip4/127.0.0.1/tcp/1234' ) ,
364
+ lastSuccess : Date . now ( ) - 2000
365
+ }
366
+ ]
367
+
368
+ await ensureDialOrder ( peerId , orderedAddresses , 'lastSuccess' )
369
+ } )
370
+
371
+ it ( 'should sort addresses which failed to be dialled by least recent failure' , async ( ) => {
372
+ const peerId = await createEd25519PeerId ( )
373
+ const orderedAddresses : Address [ ] = [
374
+ {
375
+ multiaddr : multiaddr ( '/ip4/127.0.0.1/tcp/1231' ) ,
376
+ lastFailure : Date . now ( ) - 2000
377
+ } ,
378
+ {
379
+ multiaddr : multiaddr ( '/ip4/127.0.0.1/tcp/1232' ) ,
380
+ lastFailure : Date . now ( ) - 1000
381
+ } ,
382
+ {
383
+ multiaddr : multiaddr ( '/ip4/127.0.0.1/tcp/1234' ) ,
384
+ lastFailure : Date . now ( )
385
+ }
386
+ ]
387
+
388
+ await ensureDialOrder ( peerId , orderedAddresses , 'lastFailure' )
389
+ } )
390
+
391
+ it ( 'should dial new addresses before addresses which have failed to be dialled' , async ( ) => {
392
+ const peerId = await createEd25519PeerId ( )
393
+ const orderedAddresses : Address [ ] = [
394
+ {
395
+ multiaddr : multiaddr ( '/ip4/127.0.0.1/tcp/1231' )
396
+ } ,
397
+ {
398
+ multiaddr : multiaddr ( '/ip4/127.0.0.1/tcp/1232' ) ,
399
+ lastFailure : Date . now ( ) - 2000
400
+ } ,
401
+ {
402
+ multiaddr : multiaddr ( '/ip4/127.0.0.1/tcp/1234' ) ,
403
+ lastFailure : Date . now ( ) - 1000
404
+ }
405
+ ]
406
+
407
+ await ensureDialOrder ( peerId , orderedAddresses , 'lastFailure' )
408
+ } )
409
+
410
+ it ( 'should dial succesfull dialled addresses first, then new addresses, then failed addresses' , async ( ) => {
411
+ const peerId = await createEd25519PeerId ( )
412
+ const orderedAddresses : Address [ ] = [
413
+ {
414
+ multiaddr : multiaddr ( '/ip4/127.0.0.1/tcp/1231' ) ,
415
+ lastSuccess : Date . now ( ) - 5000
416
+ } ,
417
+ {
418
+ multiaddr : multiaddr ( '/ip4/127.0.0.1/tcp/1232' )
419
+ } ,
420
+ {
421
+ multiaddr : multiaddr ( '/ip4/127.0.0.1/tcp/1234' ) ,
422
+ lastFailure : Date . now ( ) - 6000
423
+ }
424
+ ]
425
+
426
+ await ensureDialOrder ( peerId , orderedAddresses , 'lastSuccess' )
427
+ } )
333
428
} )
0 commit comments