mirror of
https://github.com/samsonjs/vibetunnel.git
synced 2026-04-05 11:15:57 +00:00
146 lines
No EOL
3.5 KiB
Go
146 lines
No EOL
3.5 KiB
Go
package services
|
|
|
|
import (
|
|
"fmt"
|
|
"sync"
|
|
)
|
|
|
|
// RemoteServer represents a registered remote server
|
|
type RemoteServer struct {
|
|
ID string `json:"id"`
|
|
Name string `json:"name"`
|
|
URL string `json:"url"`
|
|
Token string `json:"token"`
|
|
SessionIDs []string `json:"sessionIds"`
|
|
}
|
|
|
|
// RemoteRegistry manages registered remote servers (for HQ mode)
|
|
type RemoteRegistry struct {
|
|
mu sync.RWMutex
|
|
remotes map[string]*RemoteServer
|
|
remoteSeq int
|
|
}
|
|
|
|
// NewRemoteRegistry creates a new remote registry
|
|
func NewRemoteRegistry() *RemoteRegistry {
|
|
return &RemoteRegistry{
|
|
remotes: make(map[string]*RemoteServer),
|
|
}
|
|
}
|
|
|
|
// Register adds a new remote server to the registry
|
|
func (rr *RemoteRegistry) Register(remote RemoteServer) (*RemoteServer, error) {
|
|
rr.mu.Lock()
|
|
defer rr.mu.Unlock()
|
|
|
|
// Check if remote with same ID already exists
|
|
if _, exists := rr.remotes[remote.ID]; exists {
|
|
return nil, fmt.Errorf("remote with ID %s already registered", remote.ID)
|
|
}
|
|
|
|
// Check if remote with same name already exists
|
|
for _, r := range rr.remotes {
|
|
if r.Name == remote.Name {
|
|
return nil, fmt.Errorf("remote with name %s already registered", remote.Name)
|
|
}
|
|
}
|
|
|
|
// Initialize empty session list
|
|
remote.SessionIDs = []string{}
|
|
|
|
// Store the remote
|
|
rr.remotes[remote.ID] = &remote
|
|
rr.remoteSeq++
|
|
|
|
return &remote, nil
|
|
}
|
|
|
|
// Unregister removes a remote server from the registry
|
|
func (rr *RemoteRegistry) Unregister(remoteID string) bool {
|
|
rr.mu.Lock()
|
|
defer rr.mu.Unlock()
|
|
|
|
if _, exists := rr.remotes[remoteID]; exists {
|
|
delete(rr.remotes, remoteID)
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
// GetRemote returns a specific remote by ID
|
|
func (rr *RemoteRegistry) GetRemote(remoteID string) *RemoteServer {
|
|
rr.mu.RLock()
|
|
defer rr.mu.RUnlock()
|
|
|
|
return rr.remotes[remoteID]
|
|
}
|
|
|
|
// GetRemotes returns all registered remotes
|
|
func (rr *RemoteRegistry) GetRemotes() []*RemoteServer {
|
|
rr.mu.RLock()
|
|
defer rr.mu.RUnlock()
|
|
|
|
remotes := make([]*RemoteServer, 0, len(rr.remotes))
|
|
for _, remote := range rr.remotes {
|
|
remoteCopy := *remote
|
|
remotes = append(remotes, &remoteCopy)
|
|
}
|
|
return remotes
|
|
}
|
|
|
|
// GetRemoteBySessionID finds which remote owns a specific session
|
|
func (rr *RemoteRegistry) GetRemoteBySessionID(sessionID string) *RemoteServer {
|
|
rr.mu.RLock()
|
|
defer rr.mu.RUnlock()
|
|
|
|
for _, remote := range rr.remotes {
|
|
for _, sid := range remote.SessionIDs {
|
|
if sid == sessionID {
|
|
return remote
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// UpdateRemoteSessions updates the list of sessions for a remote
|
|
func (rr *RemoteRegistry) UpdateRemoteSessions(remoteID string, sessionIDs []string) {
|
|
rr.mu.Lock()
|
|
defer rr.mu.Unlock()
|
|
|
|
if remote, exists := rr.remotes[remoteID]; exists {
|
|
remote.SessionIDs = sessionIDs
|
|
}
|
|
}
|
|
|
|
// AddSessionToRemote adds a session ID to a remote's session list
|
|
func (rr *RemoteRegistry) AddSessionToRemote(remoteID, sessionID string) {
|
|
rr.mu.Lock()
|
|
defer rr.mu.Unlock()
|
|
|
|
if remote, exists := rr.remotes[remoteID]; exists {
|
|
// Check if session already exists
|
|
for _, sid := range remote.SessionIDs {
|
|
if sid == sessionID {
|
|
return
|
|
}
|
|
}
|
|
remote.SessionIDs = append(remote.SessionIDs, sessionID)
|
|
}
|
|
}
|
|
|
|
// RemoveSessionFromRemote removes a session ID from all remotes
|
|
func (rr *RemoteRegistry) RemoveSessionFromRemote(sessionID string) {
|
|
rr.mu.Lock()
|
|
defer rr.mu.Unlock()
|
|
|
|
for _, remote := range rr.remotes {
|
|
newSessions := []string{}
|
|
for _, sid := range remote.SessionIDs {
|
|
if sid != sessionID {
|
|
newSessions = append(newSessions, sid)
|
|
}
|
|
}
|
|
remote.SessionIDs = newSessions
|
|
}
|
|
} |