@@ -164,29 +164,33 @@ export class DefaultDualKadDHT extends EventEmitter<PeerDiscoveryEvents> impleme
164164 } ) )
165165 } )
166166
167- components . events . addEventListener ( 'self:peer:update' , ( evt ) => {
168- log ( 'received update of self-peer info' )
169- const hasPublicAddress = evt . detail . peer . addresses
170- . some ( ( { multiaddr } ) => {
171- const isPublic = multiaddrIsPublic ( multiaddr )
172-
173- log ( '%m is public %s' , multiaddr , isPublic )
174-
175- return isPublic
176- } )
177-
178- this . getMode ( )
179- . then ( async mode => {
180- if ( hasPublicAddress && mode === 'client' ) {
181- await this . setMode ( 'server' )
182- } else if ( mode === 'server' && ! hasPublicAddress ) {
183- await this . setMode ( 'client' )
184- }
185- } )
186- . catch ( err => {
187- log . error ( 'error setting dht server mode' , err )
188- } )
189- } )
167+ // if client mode has not been explicitly specified, auto-switch to server
168+ // mode when the node's peer data is updated with publicly dialable addresses
169+ if ( init . clientMode == null ) {
170+ components . events . addEventListener ( 'self:peer:update' , ( evt ) => {
171+ log ( 'received update of self-peer info' )
172+ const hasPublicAddress = evt . detail . peer . addresses
173+ . some ( ( { multiaddr } ) => {
174+ const isPublic = multiaddrIsPublic ( multiaddr )
175+
176+ log ( '%m is public %s' , multiaddr , isPublic )
177+
178+ return isPublic
179+ } )
180+
181+ this . getMode ( )
182+ . then ( async mode => {
183+ if ( hasPublicAddress && mode === 'client' ) {
184+ await this . setMode ( 'server' )
185+ } else if ( mode === 'server' && ! hasPublicAddress ) {
186+ await this . setMode ( 'client' )
187+ }
188+ } )
189+ . catch ( err => {
190+ log . error ( 'error setting dht server mode' , err )
191+ } )
192+ } )
193+ }
190194 }
191195
192196 readonly [ Symbol . toStringTag ] = '@libp2p/dual-kad-dht'
0 commit comments