feat(backend): sync limiters on agent connect

Implemented full sync of speed limit configurations when an Agent connects via WebSocket. This ensures that even fresh or restarted agents receive the necessary limiter configurations.
This commit is contained in:
sagit
2026-02-09 08:47:13 +00:00
parent 7919dfde59
commit 3d7a0b697d
3 changed files with 36 additions and 1 deletions
@@ -1144,3 +1144,30 @@ func (h *Handler) sendDeleteLimiterConfig(limiterID int64, tunnelID int64) error
}
return nil
}
func (h *Handler) onNodeConnected(nodeID int64) {
// Sync limiters
rows, err := h.repo.DB().Query(`
SELECT DISTINCT sl.id, sl.speed
FROM speed_limit sl
JOIN chain_tunnel ct ON ct.tunnel_id = sl.tunnel_id
WHERE ct.node_id = ? AND ct.chain_type = 1 AND sl.status = 1
`, nodeID)
if err == nil {
defer rows.Close()
for rows.Next() {
var id int64
var speed int
if err := rows.Scan(&id, &speed); err == nil {
rate := float64(speed) / 8.0
limitStr := fmt.Sprintf("$ %.1fMB %.1fMB", rate, rate)
payload := map[string]interface{}{
"name": strconv.FormatInt(id, 10),
"limits": []string{limitStr},
}
_, _ = h.sendNodeCommand(nodeID, "AddLimiters", payload, false, false)
}
}
}
}
+3 -1
View File
@@ -62,11 +62,13 @@ type flowItem struct {
}
func New(repo *sqlite.Repository, jwtSecret string) *Handler {
return &Handler{
h := &Handler{
repo: repo,
jwtSecret: jwtSecret,
wsServer: ws.NewServer(repo, jwtSecret),
}
h.wsServer.OnNodeConnected = h.onNodeConnected
return h
}
func (h *Handler) WebSocketHandler() http.Handler {
+6
View File
@@ -71,6 +71,8 @@ type Server struct {
nodes map[int64]*nodeSession
byConn map[*websocket.Conn]*nodeSession
pending map[string]pendingRequest
OnNodeConnected func(nodeID int64)
}
func NewServer(repo *sqlite.Repository, jwtSecret string) *Server {
@@ -164,6 +166,10 @@ func (s *Server) handleNode(w http.ResponseWriter, r *http.Request, nodeID int64
_ = s.repo.UpdateNodeOnline(nodeID, 1, version, httpVal, tlsVal, socksVal)
s.broadcastStatus(nodeID, 1)
if s.OnNodeConnected != nil {
go s.OnNodeConnected(nodeID)
}
defer func() {
needOfflineBroadcast := false
s.mu.Lock()