From d125e3dd5482e55ff99a64d84b32825e3dc62510 Mon Sep 17 00:00:00 2001 From: jbergner Date: Sat, 27 Sep 2025 16:25:13 +0200 Subject: [PATCH] findnodes --- internal/mesh/mesh.go | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/internal/mesh/mesh.go b/internal/mesh/mesh.go index aea5ebf..a798c61 100644 --- a/internal/mesh/mesh.go +++ b/internal/mesh/mesh.go @@ -184,6 +184,9 @@ func (n *Node) Serve() error { n.loopSeeder() }() + n.wg.Add(1) + go func() { defer n.wg.Done(); n.loopPeerExchange() }() + if n.cfg.EnableDiscovery && n.cfg.DiscoveryAddress != "" { n.wg.Add(2) go func() { @@ -226,6 +229,43 @@ func (n *Node) Close(ctx context.Context) error { /*** Loops ***/ +func (n *Node) loopPeerExchange() { + t := time.NewTicker(30 * time.Second) + defer t.Stop() + for { + select { + case <-n.stop: + return + case <-t.C: + } + // Seeds abfragen + for _, s := range n.cfg.Seeds { + if strings.TrimSpace(s) == "" { + continue + } + resp, err := n.client.Get(strings.TrimRight(s, "/") + "/mesh/peers") + if err != nil { + continue + } + var list []Peer + if json.NewDecoder(resp.Body).Decode(&list) == nil { + n.mu.Lock() + for _, p := range list { + if p.URL == "" || p.URL == n.self.URL { + continue + } + if _, ok := n.peers[p.URL]; !ok { + cp := p + n.peers[p.URL] = &cp + } + } + n.mu.Unlock() + } + resp.Body.Close() + } + } +} + func (n *Node) loopSeeder() { // attempt to hello known seeds every 5s at start, then every 30s backoff := 5 * time.Second