mirror of https://github.com/h44z/wg-portal.git
				
				
				
			
		
			
				
	
	
		
			64 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
| package domain
 | |
| 
 | |
| import (
 | |
| 	"time"
 | |
| )
 | |
| 
 | |
| type PeerStatus struct {
 | |
| 	PeerId    PeerIdentifier `gorm:"primaryKey;column:identifier" json:"PeerId"`
 | |
| 	UpdatedAt time.Time      `gorm:"column:updated_at" json:"-"`
 | |
| 
 | |
| 	IsConnected bool `gorm:"column:connected" json:"IsConnected"` // indicates if the peer is connected based on the last handshake or ping
 | |
| 
 | |
| 	IsPingable bool       `gorm:"column:pingable" json:"IsPingable"`
 | |
| 	LastPing   *time.Time `gorm:"column:last_ping" json:"LastPing"`
 | |
| 
 | |
| 	BytesReceived    uint64 `gorm:"column:received" json:"BytesReceived"`
 | |
| 	BytesTransmitted uint64 `gorm:"column:transmitted" json:"BytesTransmitted"`
 | |
| 
 | |
| 	LastHandshake    *time.Time `gorm:"column:last_handshake" json:"LastHandshake"`
 | |
| 	Endpoint         string     `gorm:"column:endpoint" json:"Endpoint"`
 | |
| 	LastSessionStart *time.Time `gorm:"column:last_session_start" json:"LastSessionStart"`
 | |
| }
 | |
| 
 | |
| func (s *PeerStatus) CalcConnected() {
 | |
| 	oldestHandshakeTime := time.Now().Add(-2 * time.Minute) // if a handshake is older than 2 minutes, the peer is no longer connected
 | |
| 
 | |
| 	handshakeValid := false
 | |
| 	if s.LastHandshake != nil {
 | |
| 		handshakeValid = !s.LastHandshake.Before(oldestHandshakeTime)
 | |
| 	}
 | |
| 
 | |
| 	s.IsConnected = s.IsPingable || handshakeValid
 | |
| }
 | |
| 
 | |
| type InterfaceStatus struct {
 | |
| 	InterfaceId InterfaceIdentifier `gorm:"primaryKey;column:identifier"`
 | |
| 	UpdatedAt   time.Time           `gorm:"column:updated_at"`
 | |
| 
 | |
| 	BytesReceived    uint64 `gorm:"column:received"`
 | |
| 	BytesTransmitted uint64 `gorm:"column:transmitted"`
 | |
| }
 | |
| 
 | |
| type PingerResult struct {
 | |
| 	PacketsRecv int
 | |
| 	PacketsSent int
 | |
| 	Rtts        []time.Duration
 | |
| }
 | |
| 
 | |
| func (r PingerResult) IsPingable() bool {
 | |
| 	return r.PacketsRecv > 0 && r.PacketsSent > 0 && len(r.Rtts) > 0
 | |
| }
 | |
| 
 | |
| func (r PingerResult) AverageRtt() time.Duration {
 | |
| 	if len(r.Rtts) == 0 {
 | |
| 		return 0
 | |
| 	}
 | |
| 
 | |
| 	var total time.Duration
 | |
| 	for _, rtt := range r.Rtts {
 | |
| 		total += rtt
 | |
| 	}
 | |
| 	return total / time.Duration(len(r.Rtts))
 | |
| }
 |