package peer import ( "encoding/json" "io" "log" "net/http" "net/url" "time" "vppn/m" ) func (r *Router) pollHub() { u, err := url.Parse(r.conf.HubAddress) if err != nil { log.Fatalf("Failed to parse hub address %s: %v", r.conf.HubAddress, err) } u.Path = "/peer/fetch-state/" client := &http.Client{Timeout: 8 * time.Second} req := &http.Request{ Method: http.MethodGet, URL: u, Header: http.Header{}, } req.SetBasicAuth("", r.conf.APIKey) // TODO: Before we start polling, load state from the file system. r._pollHub(client, req) for range time.Tick(32 * time.Second) { r._pollHub(client, req) } } func (r *Router) _pollHub(client *http.Client, req *http.Request) { var state m.NetworkState log.Printf("Fetching peer state from %s...", r.conf.HubAddress) resp, err := client.Do(req) if err != nil { log.Printf("Failed to fetch peer state: %v", err) return } body, err := io.ReadAll(resp.Body) _ = resp.Body.Close() if err != nil { log.Printf("Failed to read body from hub: %v", err) return } if err := json.Unmarshal(body, &state); err != nil { log.Printf("Failed to unmarshal response from hub: %v", err) return } for i := range r.conns { if r.conns[i] != nil { r.conns[i].UpdatePeer(peerUpdate{PeerIP: byte(i), Peer: state.Peers[i]}) } } }