@@ -64,6 +64,8 @@ type Client struct {
6464 ps * pubsub.PubSub
6565 started bool
6666
67+ seedPeers []peer.AddrInfo
68+
6769 maintenanceCancel context.CancelFunc
6870 maintenanceWg sync.WaitGroup
6971 connectSem chan struct {}
@@ -185,6 +187,7 @@ func (c *Client) startWithHost(ctx context.Context, h host.Host) error {
185187
186188 c .started = true
187189
190+ c .host .Network ().Notify (c .newDisconnectNotifee ())
188191 c .startConnectionMaintenance ()
189192
190193 return nil
@@ -267,6 +270,38 @@ func (c *Client) Peers() []PeerConnection {
267270 return res
268271}
269272
273+ type disconnectNotifee struct {
274+ c * Client
275+ }
276+
277+ func (n disconnectNotifee ) Connected (_ network.Network , conn network.Conn ) {
278+ p := conn .RemotePeer ()
279+ for _ , sp := range n .c .seedPeers {
280+ if sp .ID == p {
281+ n .c .logger .Info ().Str ("peer" , p .String ()).Msg ("connected to seed peer" )
282+ return
283+ }
284+ }
285+ }
286+ func (n disconnectNotifee ) OpenedStream (_ network.Network , _ network.Stream ) {}
287+ func (n disconnectNotifee ) ClosedStream (_ network.Network , _ network.Stream ) {}
288+ func (n disconnectNotifee ) Listen (_ network.Network , _ multiaddr.Multiaddr ) {}
289+ func (n disconnectNotifee ) ListenClose (_ network.Network , _ multiaddr.Multiaddr ) {}
290+
291+ func (n disconnectNotifee ) Disconnected (_ network.Network , conn network.Conn ) {
292+ p := conn .RemotePeer ()
293+ for _ , sp := range n .c .seedPeers {
294+ if sp .ID == p {
295+ n .c .logger .Info ().Str ("peer" , p .String ()).Msg ("disconnected from seed peer" )
296+ return
297+ }
298+ }
299+ }
300+
301+ func (c * Client ) newDisconnectNotifee () disconnectNotifee {
302+ return disconnectNotifee {c : c }
303+ }
304+
270305// startConnectionMaintenance launches a background goroutine that periodically
271306// refreshes peer discovery via DHT. This ensures P2P connectivity recovers after
272307// transient network failures and discovers new peers without requiring a full node restart.
@@ -337,6 +372,7 @@ func (c *Client) listen() (host.Host, error) {
337372
338373func (c * Client ) setupDHT (ctx context.Context ) error {
339374 peers := c .parseAddrInfoList (c .conf .Peers )
375+ c .seedPeers = peers
340376 if len (peers ) == 0 {
341377 c .logger .Info ().Msg ("no peers - only listening for connections" )
342378 }
0 commit comments