@@ -18,7 +18,7 @@ import type { Connection, ConnectionGater } from '@libp2p/interface-connection'
1818import type { AbortOptions } from '@libp2p/interfaces'
1919import type { Startable } from '@libp2p/interfaces/startable'
2020import { isPeerId , PeerId } from '@libp2p/interface-peer-id'
21- import { getPeer } from '../../get-peer.js'
21+ import { getPeerAddress } from '../../get-peer.js'
2222import type { AddressSorter , PeerStore } from '@libp2p/interface-peer-store'
2323import type { Metrics } from '@libp2p/interface-metrics'
2424import type { Dialer } from '@libp2p/interface-connection-manager'
@@ -151,24 +151,24 @@ export class DefaultDialer implements Startable, Dialer {
151151 * will be used.
152152 */
153153 async dial ( peerIdOrMultiaddr : PeerId | Multiaddr , options : AbortOptions = { } ) : Promise < Connection > {
154- const { id , multiaddrs } = getPeer ( peerIdOrMultiaddr )
154+ const { peerId , multiaddr } = getPeerAddress ( peerIdOrMultiaddr )
155155
156- if ( this . components . peerId . equals ( id ) ) {
157- throw errCode ( new Error ( 'Tried to dial self' ) , codes . ERR_DIALED_SELF )
158- }
159-
160- log ( 'check multiaddrs %p' , id )
156+ if ( peerId != null ) {
157+ if ( this . components . peerId . equals ( peerId ) ) {
158+ throw errCode ( new Error ( 'Tried to dial self' ) , codes . ERR_DIALED_SELF )
159+ }
161160
162- if ( multiaddrs != null && multiaddrs . length > 0 ) {
163- log ( 'storing multiaddrs %p' , id , multiaddrs )
164- await this . components . peerStore . addressBook . add ( id , multiaddrs )
165- }
161+ if ( multiaddr != null ) {
162+ log ( 'storing multiaddrs %p' , peerId , multiaddr )
163+ await this . components . peerStore . addressBook . add ( peerId , [ multiaddr ] )
164+ }
166165
167- if ( await this . components . connectionGater . denyDialPeer ( id ) ) {
168- throw errCode ( new Error ( 'The dial request is blocked by gater.allowDialPeer' ) , codes . ERR_PEER_DIAL_INTERCEPTED )
166+ if ( await this . components . connectionGater . denyDialPeer ( peerId ) ) {
167+ throw errCode ( new Error ( 'The dial request is blocked by gater.allowDialPeer' ) , codes . ERR_PEER_DIAL_INTERCEPTED )
168+ }
169169 }
170170
171- log ( 'creating dial target for %p' , id )
171+ log ( 'creating dial target for %p' , peerId )
172172
173173 // resolving multiaddrs can involve dns lookups so allow them to be aborted
174174 const controller = new AbortController ( )
@@ -184,7 +184,7 @@ export class DefaultDialer implements Startable, Dialer {
184184 let dialTarget : DialTarget
185185
186186 try {
187- dialTarget = await this . _createDialTarget ( peerIdOrMultiaddr , {
187+ dialTarget = await this . _createDialTarget ( { peerId , multiaddr } , {
188188 ...options ,
189189 signal
190190 } )
@@ -198,7 +198,7 @@ export class DefaultDialer implements Startable, Dialer {
198198 }
199199
200200 // try to join an in-flight dial for this peer if one is available
201- const pendingDial = this . pendingDials . get ( dialTarget . id . toString ( ) ) ?? this . _createPendingDial ( dialTarget , options )
201+ const pendingDial = this . pendingDials . get ( dialTarget . id ) ?? this . _createPendingDial ( dialTarget , options )
202202
203203 try {
204204 const connection = await pendingDial . promise
@@ -225,26 +225,33 @@ export class DefaultDialer implements Startable, Dialer {
225225 *
226226 * Multiaddrs not supported by the available transports will be filtered out.
227227 */
228- async _createDialTarget ( peerIdOrMultiaddr : PeerId | Multiaddr , options : AbortOptions ) : Promise < DialTarget > {
229- const _resolve = this . _resolve . bind ( this )
228+ async _createDialTarget ( peerIdOrMultiaddr : { peerId ?: PeerId , multiaddr ?: Multiaddr } , options : AbortOptions ) : Promise < DialTarget > {
229+ let addrs : Multiaddr [ ] = [ ]
230230
231- let addrs = isMultiaddr ( peerIdOrMultiaddr ) ? [ peerIdOrMultiaddr ] : await this . _loadAddresses ( peerIdOrMultiaddr )
231+ if ( isMultiaddr ( peerIdOrMultiaddr . multiaddr ) ) {
232+ addrs . push ( peerIdOrMultiaddr . multiaddr )
233+ }
234+
235+ // only load addresses if a peer id was passed, otherwise only dial the passed multiaddr
236+ if ( ! isMultiaddr ( peerIdOrMultiaddr . multiaddr ) && isPeerId ( peerIdOrMultiaddr . peerId ) ) {
237+ addrs . push ( ...await this . _loadAddresses ( peerIdOrMultiaddr . peerId ) )
238+ }
232239
233240 addrs = ( await Promise . all (
234- addrs . map ( async ( ma ) => await _resolve ( ma , options ) )
241+ addrs . map ( async ( ma ) => await this . _resolve ( ma , options ) )
235242 ) )
236243 . flat ( )
237244 // Multiaddrs not supported by the available transports will be filtered out.
238245 . filter ( ma => Boolean ( this . components . transportManager . transportForMultiaddr ( ma ) ) )
239246
240247 // deduplicate addresses
241- addrs = [ ...new Set ( addrs ) ]
248+ addrs = [ ...new Set ( addrs . map ( ma => ma . toString ( ) ) ) ] . map ( ma => multiaddr ( ma ) )
242249
243250 if ( addrs . length > this . maxAddrsToDial ) {
244251 throw errCode ( new Error ( 'dial with more addresses than allowed' ) , codes . ERR_TOO_MANY_ADDRESSES )
245252 }
246253
247- const peerId = isPeerId ( peerIdOrMultiaddr ) ? peerIdOrMultiaddr : undefined
254+ const peerId = isPeerId ( peerIdOrMultiaddr . peerId ) ? peerIdOrMultiaddr . peerId : undefined
248255
249256 if ( peerId != null ) {
250257 const peerIdMultiaddr = `/p2p/${ peerId . toString ( ) } `
0 commit comments