@@ -19,6 +19,7 @@ import (
1919
2020 "github.com/libp2p/go-libp2p"
2121 dht "github.com/libp2p/go-libp2p-kad-dht"
22+ "github.com/libp2p/go-libp2p-kad-dht/records"
2223 pubsub "github.com/libp2p/go-libp2p-pubsub"
2324 "github.com/libp2p/go-libp2p/core/crypto"
2425 "github.com/libp2p/go-libp2p/core/host"
@@ -27,6 +28,9 @@ import (
2728 "github.com/libp2p/go-libp2p/p2p/discovery/mdns"
2829 drouting "github.com/libp2p/go-libp2p/p2p/discovery/routing"
2930 "github.com/multiformats/go-multiaddr"
31+
32+ ds "github.com/ipfs/go-datastore"
33+ dssync "github.com/ipfs/go-datastore/sync"
3034)
3135
3236var (
@@ -92,7 +96,7 @@ func NewClient(config Config) (Client, error) {
9296 }
9397
9498 // Set up DHT
95- kadDHT , err := setupDHT (ctx , h , bootstrapPeers , clientLogger , cancel )
99+ kadDHT , err := setupDHT (ctx , h , config , bootstrapPeers , clientLogger , cancel )
96100 if err != nil {
97101 return nil , err
98102 }
@@ -204,8 +208,46 @@ func createHost(_ context.Context, hostOpts []libp2p.Option, config Config, rela
204208 return h , nil
205209}
206210
207- func setupDHT (ctx context.Context , h host.Host , bootstrapPeers []peer.AddrInfo , _ logger , cancel context.CancelFunc ) (* dht.IpfsDHT , error ) {
208- kadDHT , err := dht .New (ctx , h , dht .Mode (dht .ModeServer ), dht .BootstrapPeers (bootstrapPeers ... ))
211+ func setupDHT (ctx context.Context , h host.Host , config Config , bootstrapPeers []peer.AddrInfo , log logger , cancel context.CancelFunc ) (* dht.IpfsDHT , error ) {
212+ // Determine DHT mode (default to server)
213+ mode := dht .ModeServer
214+ if config .DHTMode == "client" {
215+ mode = dht .ModeClient
216+ log .Infof ("DHT mode: client (query-only, no provider storage)" )
217+ } else {
218+ log .Infof ("DHT mode: server (will advertise and store provider records)" )
219+ }
220+
221+ // Build DHT options
222+ dhtOpts := []dht.Option {
223+ dht .Mode (mode ),
224+ dht .BootstrapPeers (bootstrapPeers ... ),
225+ }
226+
227+ // If server mode and custom cleanup interval specified, configure ProviderManager
228+ if mode == dht .ModeServer && config .DHTCleanupInterval > 0 {
229+ log .Infof ("Configuring DHT cleanup interval: %v" , config .DHTCleanupInterval )
230+
231+ // Create an in-memory datastore for the provider manager
232+ // Same as default DHT datastore creation
233+ datastore := dssync .MutexWrap (ds .NewMapDatastore ())
234+
235+ providerManager , err := records .NewProviderManager (
236+ ctx ,
237+ h .ID (),
238+ h .Peerstore (),
239+ datastore ,
240+ records .CleanupInterval (config .DHTCleanupInterval ),
241+ )
242+ if err != nil {
243+ _ = h .Close ()
244+ cancel ()
245+ return nil , fmt .Errorf ("failed to create provider manager: %w" , err )
246+ }
247+ dhtOpts = append (dhtOpts , dht .ProviderStore (providerManager ))
248+ }
249+
250+ kadDHT , err := dht .New (ctx , h , dhtOpts ... )
209251 if err != nil {
210252 _ = h .Close ()
211253 cancel ()
0 commit comments