56 lines
1.1 KiB
Go
56 lines
1.1 KiB
Go
package beacon
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"log"
|
|
"net/http"
|
|
"time"
|
|
|
|
"git.send.nrw/sendnrw/decent-websrv/internal/mesh"
|
|
)
|
|
|
|
type Client struct {
|
|
URL, Token string
|
|
HTTP *http.Client
|
|
}
|
|
|
|
func (c *Client) LoopRegister(n mesh.NodeInfo) {
|
|
go func() {
|
|
for {
|
|
c.register(n)
|
|
time.Sleep(30 * time.Second)
|
|
}
|
|
}()
|
|
}
|
|
|
|
func (c *Client) register(n mesh.NodeInfo) {
|
|
b, _ := json.Marshal(RegisterReq{BaseURL: n.PublicURL, MeshURL: n.MeshURL, NodeID: n.NodeID, TTL: 45})
|
|
req, _ := http.NewRequest(http.MethodPost, c.URL+"/_beacon/register", bytes.NewReader(b))
|
|
req.Header.Set("Content-Type", "application/json")
|
|
if c.Token != "" {
|
|
req.Header.Set("X-Beacon-Token", c.Token)
|
|
}
|
|
resp, err := c.HTTP.Do(req)
|
|
if err != nil {
|
|
log.Println("beacon register:", err)
|
|
return
|
|
}
|
|
resp.Body.Close()
|
|
}
|
|
|
|
func (c *Client) PollPeers() []mesh.NodeInfo {
|
|
req, _ := http.NewRequest(http.MethodGet, c.URL+"/_beacon/peers", nil)
|
|
if c.Token != "" {
|
|
req.Header.Set("X-Beacon-Token", c.Token)
|
|
}
|
|
resp, err := c.HTTP.Do(req)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
defer resp.Body.Close()
|
|
var out PeersResp
|
|
_ = json.NewDecoder(resp.Body).Decode(&out)
|
|
return out.Peers
|
|
}
|