github.com/yggdrasil-network/yggdrasil-go@v0.5.6/src/admin/getpeers.go (about)

     1  package admin
     2  
     3  import (
     4  	"encoding/hex"
     5  	"net"
     6  	"sort"
     7  	"time"
     8  
     9  	"github.com/yggdrasil-network/yggdrasil-go/src/address"
    10  )
    11  
    12  type GetPeersRequest struct {
    13  }
    14  
    15  type GetPeersResponse struct {
    16  	Peers []PeerEntry `json:"peers"`
    17  }
    18  
    19  type PeerEntry struct {
    20  	URI           string        `json:"remote,omitempty"`
    21  	Up            bool          `json:"up"`
    22  	Inbound       bool          `json:"inbound"`
    23  	IPAddress     string        `json:"address,omitempty"`
    24  	PublicKey     string        `json:"key"`
    25  	Port          uint64        `json:"port"`
    26  	Priority      uint64        `json:"priority"`
    27  	RXBytes       DataUnit      `json:"bytes_recvd,omitempty"`
    28  	TXBytes       DataUnit      `json:"bytes_sent,omitempty"`
    29  	Uptime        float64       `json:"uptime,omitempty"`
    30  	Latency       time.Duration `json:"latency_ms,omitempty"`
    31  	LastErrorTime time.Duration `json:"last_error_time,omitempty"`
    32  	LastError     string        `json:"last_error,omitempty"`
    33  }
    34  
    35  func (a *AdminSocket) getPeersHandler(req *GetPeersRequest, res *GetPeersResponse) error {
    36  	peers := a.core.GetPeers()
    37  	res.Peers = make([]PeerEntry, 0, len(peers))
    38  	for _, p := range peers {
    39  		peer := PeerEntry{
    40  			Port:     p.Port,
    41  			Up:       p.Up,
    42  			Inbound:  p.Inbound,
    43  			Priority: uint64(p.Priority), // can't be uint8 thanks to gobind
    44  			URI:      p.URI,
    45  			RXBytes:  DataUnit(p.RXBytes),
    46  			TXBytes:  DataUnit(p.TXBytes),
    47  			Uptime:   p.Uptime.Seconds(),
    48  		}
    49  		if p.Latency > 0 {
    50  			peer.Latency = p.Latency
    51  		}
    52  		if addr := address.AddrForKey(p.Key); addr != nil {
    53  			peer.PublicKey = hex.EncodeToString(p.Key)
    54  			peer.IPAddress = net.IP(addr[:]).String()
    55  		}
    56  		if p.LastError != nil {
    57  			peer.LastError = p.LastError.Error()
    58  			peer.LastErrorTime = time.Since(p.LastErrorTime)
    59  		}
    60  		res.Peers = append(res.Peers, peer)
    61  	}
    62  	sort.Slice(res.Peers, func(i, j int) bool {
    63  		if res.Peers[i].Inbound == res.Peers[j].Inbound {
    64  			if res.Peers[i].PublicKey == res.Peers[j].PublicKey {
    65  				if res.Peers[i].Priority == res.Peers[j].Priority {
    66  					return res.Peers[i].Uptime > res.Peers[j].Uptime
    67  				}
    68  				return res.Peers[i].Priority < res.Peers[j].Priority
    69  			}
    70  			return res.Peers[i].PublicKey < res.Peers[j].PublicKey
    71  		}
    72  		return !res.Peers[i].Inbound && res.Peers[j].Inbound
    73  	})
    74  	return nil
    75  }