@@ -16,7 +16,7 @@ import {
16
16
LAST_DIAL_FAILURE_KEY
17
17
} from './constants.js'
18
18
import { resolveMultiaddrs } from './utils.js'
19
- import type { AddressSorter , AbortOptions , ComponentLogger , Logger , Connection , ConnectionGater , Metrics , PeerId , Address , PeerStore } from '@libp2p/interface'
19
+ import type { AddressSorter , AbortOptions , ComponentLogger , Logger , Connection , ConnectionGater , Metrics , PeerId , Address , PeerStore , PeerRouting } from '@libp2p/interface'
20
20
import type { TransportManager } from '@libp2p/interface-internal'
21
21
22
22
export interface PendingDialTarget {
@@ -57,17 +57,15 @@ interface DialQueueComponents {
57
57
peerId : PeerId
58
58
metrics ?: Metrics
59
59
peerStore : PeerStore
60
+ peerRouting : PeerRouting
60
61
transportManager : TransportManager
61
62
connectionGater : ConnectionGater
62
63
logger : ComponentLogger
63
64
}
64
65
65
66
export class DialQueue {
66
67
public queue : Queue < Connection , DialQueueJobOptions >
67
- private readonly peerId : PeerId
68
- private readonly peerStore : PeerStore
69
- private readonly connectionGater : ConnectionGater
70
- private readonly transportManager : TransportManager
68
+ private readonly components : DialQueueComponents
71
69
private readonly addressSorter : AddressSorter
72
70
private readonly maxPeerAddrsToDial : number
73
71
private readonly dialTimeout : number
@@ -82,10 +80,7 @@ export class DialQueue {
82
80
this . connections = init . connections ?? new PeerMap ( )
83
81
this . log = components . logger . forComponent ( 'libp2p:connection-manager:dial-queue' )
84
82
85
- this . peerId = components . peerId
86
- this . peerStore = components . peerStore
87
- this . connectionGater = components . connectionGater
88
- this . transportManager = components . transportManager
83
+ this . components = components
89
84
this . shutDownController = new AbortController ( )
90
85
91
86
setMaxListeners ( Infinity , this . shutDownController . signal )
@@ -218,15 +213,15 @@ export class DialQueue {
218
213
219
214
for ( const address of addrsToDial ) {
220
215
if ( dialed === this . maxPeerAddrsToDial ) {
221
- this . log ( 'dialed %d addresses for %p, not trying any others' , dialed , peerId )
216
+ this . log ( 'dialed maxPeerAddrsToDial (%d) addresses for %p, not trying any others' , dialed , peerId )
222
217
223
218
throw new CodeError ( 'Peer had more than maxPeerAddrsToDial' , codes . ERR_TOO_MANY_ADDRESSES )
224
219
}
225
220
226
221
dialed ++
227
222
228
223
try {
229
- const conn = await this . transportManager . dial ( address . multiaddr , {
224
+ const conn = await this . components . transportManager . dial ( address . multiaddr , {
230
225
...options ,
231
226
signal
232
227
} )
@@ -240,7 +235,7 @@ export class DialQueue {
240
235
if ( peerId != null ) {
241
236
// record the failed dial
242
237
try {
243
- await this . peerStore . patch ( peerId , {
238
+ await this . components . peerStore . patch ( peerId , {
244
239
metadata : {
245
240
[ LAST_DIAL_FAILURE_KEY ] : uint8ArrayFromString ( Date . now ( ) . toString ( ) )
246
241
}
@@ -299,19 +294,20 @@ export class DialQueue {
299
294
300
295
// if a peer id or multiaddr(s) with a peer id, make sure it isn't our peer id and that we are allowed to dial it
301
296
if ( peerId != null ) {
302
- if ( this . peerId . equals ( peerId ) ) {
297
+ if ( this . components . peerId . equals ( peerId ) ) {
303
298
throw new CodeError ( 'Tried to dial self' , codes . ERR_DIALED_SELF )
304
299
}
305
300
306
- if ( ( await this . connectionGater . denyDialPeer ?.( peerId ) ) === true ) {
301
+ if ( ( await this . components . connectionGater . denyDialPeer ?.( peerId ) ) === true ) {
307
302
throw new CodeError ( 'The dial request is blocked by gater.allowDialPeer' , codes . ERR_PEER_DIAL_INTERCEPTED )
308
303
}
309
304
310
- // if just a peer id was passed, load available multiaddrs for this peer from the address book
305
+ // if just a peer id was passed, load available multiaddrs for this peer
306
+ // from the peer store
311
307
if ( addrs . length === 0 ) {
312
308
this . log ( 'loading multiaddrs for %p' , peerId )
313
309
try {
314
- const peer = await this . peerStore . get ( peerId )
310
+ const peer = await this . components . peerStore . get ( peerId )
315
311
addrs . push ( ...peer . addresses )
316
312
this . log ( 'loaded multiaddrs for %p' , peerId , addrs . map ( ( { multiaddr } ) => multiaddr . toString ( ) ) )
317
313
} catch ( err : any ) {
@@ -320,9 +316,31 @@ export class DialQueue {
320
316
}
321
317
}
322
318
}
319
+
320
+ // if we still don't have any addresses for this peer, try a lookup
321
+ // using the peer routing
322
+ if ( addrs . length === 0 ) {
323
+ this . log ( 'looking up multiaddrs for %p in the peer routing' , peerId )
324
+
325
+ try {
326
+ const peerInfo = await this . components . peerRouting . findPeer ( peerId )
327
+
328
+ this . log ( 'found multiaddrs for %p in the peer routing' , peerId , addrs . map ( ( { multiaddr } ) => multiaddr . toString ( ) ) )
329
+
330
+ addrs . push ( ...peerInfo . multiaddrs . map ( multiaddr => ( {
331
+ multiaddr,
332
+ isCertified : false
333
+ } ) ) )
334
+ } catch ( err : any ) {
335
+ if ( err . code !== codes . ERR_NO_ROUTERS_AVAILABLE ) {
336
+ this . log . error ( 'looking up multiaddrs for %p in the peer routing failed' , peerId , err )
337
+ }
338
+ }
339
+ }
323
340
}
324
341
325
- // resolve addresses - this can result in a one-to-many translation when dnsaddrs are resolved
342
+ // resolve addresses - this can result in a one-to-many translation when
343
+ // dnsaddrs are resolved
326
344
let resolvedAddresses = ( await Promise . all (
327
345
addrs . map ( async addr => {
328
346
const result = await resolveMultiaddrs ( addr . multiaddr , {
@@ -367,7 +385,7 @@ export class DialQueue {
367
385
368
386
const filteredAddrs = resolvedAddresses . filter ( addr => {
369
387
// filter out any multiaddrs that we do not have transports for
370
- if ( this . transportManager . transportForMultiaddr ( addr . multiaddr ) == null ) {
388
+ if ( this . components . transportManager . transportForMultiaddr ( addr . multiaddr ) == null ) {
371
389
return false
372
390
}
373
391
@@ -407,7 +425,7 @@ export class DialQueue {
407
425
const gatedAdrs : Address [ ] = [ ]
408
426
409
427
for ( const addr of dedupedMultiaddrs ) {
410
- if ( this . connectionGater . denyDialMultiaddr != null && await this . connectionGater . denyDialMultiaddr ( addr . multiaddr ) ) {
428
+ if ( this . components . connectionGater . denyDialMultiaddr != null && await this . components . connectionGater . denyDialMultiaddr ( addr . multiaddr ) ) {
411
429
continue
412
430
}
413
431
0 commit comments