package httpd import ( "sync" "github.com/jumpserver/koko/pkg/logger" ) var conns = &Connections{container: make(map[string][]string), mu: new(sync.RWMutex)} var clients = &Clients{container: make(map[string]*Client), mu: new(sync.RWMutex)} type Clients struct { container map[string]*Client mu *sync.RWMutex } func (c *Clients) GetClient(cID string) (client *Client) { c.mu.RLock() defer c.mu.RUnlock() client = c.container[cID] return } func (c *Clients) DeleteClient(cID string) { c.mu.RLock() client, ok := c.container[cID] c.mu.RUnlock() if !ok { return } _ = client.Close() c.mu.Lock() defer c.mu.Unlock() delete(c.container, cID) logger.Debug("Remain clients count: ", len(c.container)) } func (c *Clients) AddClient(cID string, conn *Client) { c.mu.Lock() defer c.mu.Unlock() c.container[cID] = conn logger.Debug("Now clients count: ", len(c.container)) } type Connections struct { container map[string][]string mu *sync.RWMutex } func (c *Connections) AddClient(cID, clientID string) { c.mu.Lock() defer c.mu.Unlock() clients, ok := c.container[cID] if ok { clients = append(clients, clientID) } else { clients = []string{clientID} } c.container[cID] = clients } func (c *Connections) GetClients(cID string) (clients []string) { c.mu.Lock() defer c.mu.Unlock() return c.container[cID] } func (c *Connections) DeleteClients(cID string) { if clientIDs := c.GetClients(cID); clientIDs != nil { for _, clientID := range clientIDs { clients.DeleteClient(clientID) } } c.mu.Lock() defer c.mu.Unlock() delete(c.container, cID) }