@@ -2,15 +2,16 @@ import { ListenError, TypedEventEmitter, setMaxListeners } from '@libp2p/interfa
22import { multiaddr } from '@multiformats/multiaddr'
33import { DEFAULT_RESERVATION_COMPLETION_TIMEOUT } from '../constants.js'
44import { CircuitListen , CircuitSearch } from '../utils.js'
5- import type { RelayDiscovery } from './discovery.js'
65import type { RelayReservation , ReservationStore } from './reservation-store.js'
76import type { ComponentLogger , Logger , Listener , ListenerEvents , PeerId } from '@libp2p/interface'
8- import type { ConnectionManager } from '@libp2p/interface-internal'
7+ import type { AddressManager , ConnectionManager } from '@libp2p/interface-internal'
98import type { Multiaddr } from '@multiformats/multiaddr'
109
1110export interface CircuitRelayTransportListenerComponents {
11+ peerId : PeerId
1212 connectionManager : ConnectionManager
13- relayStore : ReservationStore
13+ addressManager : AddressManager
14+ reservationStore : ReservationStore
1415 logger : ComponentLogger
1516}
1617
@@ -19,9 +20,10 @@ export interface CircuitRelayTransportListenerInit {
1920}
2021
2122class CircuitRelayTransportListener extends TypedEventEmitter < ListenerEvents > implements Listener {
23+ private readonly peerId : PeerId
2224 private readonly connectionManager : ConnectionManager
25+ private readonly addressManager : AddressManager
2326 private readonly reservationStore : ReservationStore
24- private readonly discovery ?: RelayDiscovery
2527 private listeningAddrs : Multiaddr [ ]
2628 private readonly log : Logger
2729 private readonly listenTimeout : number
@@ -32,8 +34,10 @@ class CircuitRelayTransportListener extends TypedEventEmitter<ListenerEvents> im
3234 super ( )
3335
3436 this . log = components . logger . forComponent ( 'libp2p:circuit-relay:transport:listener' )
37+ this . peerId = components . peerId
3538 this . connectionManager = components . connectionManager
36- this . reservationStore = components . relayStore
39+ this . addressManager = components . addressManager
40+ this . reservationStore = components . reservationStore
3741 this . listeningAddrs = [ ]
3842 this . listenTimeout = init . listenTimeout ?? DEFAULT_RESERVATION_COMPLETION_TIMEOUT
3943
@@ -51,6 +55,11 @@ class CircuitRelayTransportListener extends TypedEventEmitter<ListenerEvents> im
5155
5256 this . log ( 'relay peer removed %p' , evt . detail . relay )
5357
58+ this . listeningAddrs . forEach ( ma => {
59+ // mark as externally dialable
60+ this . addressManager . removeObservedAddr ( ma )
61+ } )
62+
5463 this . listeningAddrs = [ ]
5564
5665 // announce listen addresses change
@@ -59,7 +68,7 @@ class CircuitRelayTransportListener extends TypedEventEmitter<ListenerEvents> im
5968
6069 _onAddRelayPeer = ( evt : CustomEvent < RelayReservation > ) : void => {
6170 const {
62- relay , details
71+ details
6372 } = evt . detail
6473
6574 if ( details . type === 'configured' ) {
@@ -70,16 +79,7 @@ class CircuitRelayTransportListener extends TypedEventEmitter<ListenerEvents> im
7079 return
7180 }
7281
73- this . log ( 'relay peer added %p' , relay )
74-
75- this . relay = relay
76-
77- // add all addresses from the relay reservation
78- this . listeningAddrs = details . reservation . addrs
79- . map ( buf => multiaddr ( buf ) . encapsulate ( '/p2p-circuit' ) )
80-
81- // announce listen addresses change
82- this . safeDispatchEvent ( 'listening' )
82+ this . addedRelay ( evt . detail )
8383 }
8484
8585 async listen ( addr : Multiaddr ) : Promise < void > {
@@ -102,18 +102,7 @@ class CircuitRelayTransportListener extends TypedEventEmitter<ListenerEvents> im
102102 if ( ! this . reservationStore . hasReservation ( relayConn . remotePeer ) ) {
103103 this . log ( 'making reservation on peer %p' , relayConn . remotePeer )
104104 const reservation = await this . reservationStore . addRelay ( relayConn . remotePeer , 'configured' )
105- this . log ( 'made reservation on peer %p' , relayConn . remotePeer )
106-
107- this . relay = reservation . relay
108-
109- // add all addresses from the relay reservation
110- this . listeningAddrs = reservation . details . reservation . addrs
111- . map ( buf => multiaddr ( buf ) . encapsulate ( '/p2p-circuit' ) )
112-
113- // if that succeeded announce listen addresses change
114- queueMicrotask ( ( ) => {
115- this . safeDispatchEvent ( 'listening' )
116- } )
105+ this . addedRelay ( reservation )
117106 }
118107 } else {
119108 throw new ListenError ( `Could not listen on p2p-circuit address "${ addr } "` )
@@ -136,6 +125,28 @@ class CircuitRelayTransportListener extends TypedEventEmitter<ListenerEvents> im
136125 this . safeDispatchEvent ( 'close' )
137126 } )
138127 }
128+
129+ private addedRelay ( reservation : RelayReservation ) : void {
130+ this . log ( 'relay peer added %p' , reservation . relay )
131+
132+ this . relay = reservation . relay
133+
134+ // add all addresses from the relay reservation
135+ this . listeningAddrs = reservation . details . reservation . addrs
136+ . map ( buf => multiaddr ( buf ) . encapsulate ( '/p2p-circuit' ) )
137+
138+ this . listeningAddrs . forEach ( ma => {
139+ // mark as externally dialable
140+ this . addressManager . confirmObservedAddr ( ma , {
141+ type : 'transport'
142+ } )
143+ } )
144+
145+ // if that succeeded announce listen addresses change
146+ queueMicrotask ( ( ) => {
147+ this . safeDispatchEvent ( 'listening' )
148+ } )
149+ }
139150}
140151
141152export function createListener ( options : CircuitRelayTransportListenerComponents ) : Listener {
0 commit comments