This commit is contained in:
nic
2025-07-23 17:56:38 +03:00
parent a31b9310a2
commit 1c181d7e22
10 changed files with 196 additions and 44 deletions
+16
View File
@@ -0,0 +1,16 @@
package coordinator
import "github.com/rombintu/godpn/internal/models"
type Coordinator struct {
// TODO временное решение
//
// ip : Peer
peers map[string]models.PeerNode
}
func NewCoordinator() *Coordinator {
return &Coordinator{
peers: make(map[string]models.PeerNode),
}
}
@@ -1,4 +1,4 @@
package tracker
package coordinator
import (
"net/http"
@@ -9,27 +9,26 @@ import (
)
func (s *Server) registerHandler(c echo.Context) error {
var peer models.PeerManifest
if err := c.Bind(peer); err != nil {
var node models.PeerNode
if err := c.Bind(node); err != nil {
return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid request"})
}
if peer.PubKey == "" {
return c.JSON(http.StatusBadRequest, map[string]string{"error": "pubkey is required"})
if node.PublicKey == "" {
return c.JSON(http.StatusBadRequest, map[string]string{"error": "public key is required"})
}
ip := c.RealIP()
if peer.IP != "" {
ip = peer.IP
if node.Endpoint != "" {
ip = node.Endpoint
}
s.mu.Lock()
s.tracker.peers[ip] = peer.PubKey
s.coordinator.peers[ip] = node
s.mu.Unlock()
return c.JSON(http.StatusOK, map[string]string{
"status": "registered",
"ip": ip,
return c.JSON(http.StatusOK, map[string]models.PeerNode{
"registered": node,
})
}
@@ -37,7 +36,7 @@ func (s *Server) registerHandler(c echo.Context) error {
func (s *Server) listPeers(c echo.Context) error {
s.mu.RLock()
defer s.mu.RUnlock()
return c.JSON(http.StatusOK, s.tracker.peers)
return c.JSON(http.StatusOK, s.coordinator.peers)
}
// WebSocket handler для реального времени
@@ -54,7 +53,7 @@ func (s *Server) websocketHandler(c echo.Context) error {
// Отправляем текущий список peers при подключении
s.mu.RLock()
if err := ws.WriteJSON(s.tracker.peers); err != nil {
if err := ws.WriteJSON(s.coordinator.peers); err != nil {
s.mu.RUnlock()
return err
}
@@ -1,4 +1,4 @@
package tracker
package coordinator
import (
"sync"
@@ -8,15 +8,15 @@ import (
)
type Server struct {
router *echo.Echo
mu sync.RWMutex
tracker *Tracker
router *echo.Echo
mu sync.RWMutex
coordinator *Coordinator
}
func NewServer() *Server {
return &Server{
router: echo.New(),
tracker: NewTracker(),
router: echo.New(),
coordinator: NewCoordinator(),
}
}
+26 -3
View File
@@ -1,6 +1,29 @@
package models
type PeerManifest struct {
IP string `json:"ip" form:"ip" query:"ip"`
PubKey string `json:"pubkey" form:"pubkey" query:"pubkey" validate:"required"`
import "time"
type PeerNode struct {
// Basic identity
PublicKey string `json:"public_key" validate:"required"` // WireGuard/SS public key
// Network information
Endpoint string `json:"endpoint"` // IP:Port or DNS
Protocol string `json:"protocol"` // "shadowsocks", "wireguard", etc
// Performance metrics
System string `json:"system"` // "linux", "windows", etc
Latency int `json:"latency"` // in milliseconds
Bandwidth int `json:"bandwidth"` // in Mbps
// Geo information
Region string `json:"region,omitempty"` // "eu-west", "us-east"
Country string `json:"country,omitempty"` // 2-letter ISO code
// System stats
Uptime float64 `json:"uptime"` // 0.0-1.0 percentage
Load float64 `json:"load"` // 5-min system load avg
// Timestamps
LastSeen time.Time `json:"last_seen"`
FirstSeen time.Time `json:"first_seen"`
}
+4 -4
View File
@@ -6,14 +6,14 @@ import (
)
func (s *Server) connectHandler(c echo.Context) error {
var peerManifest models.PeerManifest
var node models.PeerNode
if err := c.Bind(peerManifest); err != nil {
if err := c.Bind(node); err != nil {
return err
}
peer := NewPeer(peerManifest.PubKey)
if err := peer.Connect(peerManifest.IP, "8080"); err != nil {
peer := NewPeer(node.PublicKey)
if err := peer.Connect(node.Endpoint); err != nil {
return err
}
defer peer.Disconnect()
+6 -5
View File
@@ -11,8 +11,9 @@ import (
)
const (
tcpNetwork = "tcp"
bufferSize = 32 * 1024 // 32KB
tcpNetwork = "tcp"
bufferSize = 32 * 1024 // 32KB
AHEAD_CHACHA20_POLY1305 = "AEAD_CHACHA20_POLY1305" // Default method cipher
)
// Ошибки подключения
@@ -34,7 +35,7 @@ func NewPeer(pubKey string) *Peer {
}
}
func (p *Peer) Connect(ip, port string) error {
func (p *Peer) Connect(endpoint string) error {
p.mu.Lock()
defer p.mu.Unlock()
@@ -42,12 +43,12 @@ func (p *Peer) Connect(ip, port string) error {
return nil // Уже подключен
}
conn, err := net.Dial(tcpNetwork, net.JoinHostPort(ip, port))
conn, err := net.Dial(tcpNetwork, endpoint)
if err != nil {
return err
}
cipher, err := core.PickCipher("AEAD_CHACHA20_POLY1305", []byte(p.pubKey), "")
cipher, err := core.PickCipher(AHEAD_CHACHA20_POLY1305, []byte(p.pubKey), "")
if err != nil {
conn.Close()
return err
-11
View File
@@ -1,11 +0,0 @@
package tracker
type Tracker struct {
peers map[string]string
}
func NewTracker() *Tracker {
return &Tracker{
peers: make(map[string]string),
}
}