package socketwrap import ( "code.gitea.io/gitea/models" ) type ClientsManager struct { Clients map[*Client]bool Register chan *Client Unregister chan *Client } func NewClientsManager() *ClientsManager { return &ClientsManager{ Register: make(chan *Client), Unregister: make(chan *Client), Clients: make(map[*Client]bool), } } var LastTenActionsQueue = NewSyncQueue(10) func (h *ClientsManager) Run() { for { select { case client := <-h.Register: h.Clients[client] = true case client := <-h.Unregister: if _, ok := h.Clients[client]; ok { delete(h.Clients, client) close(client.Send) } case message := <-models.ActionChan: LastTenActionsQueue.Push(message) for client := range h.Clients { select { case client.Send <- message: default: close(client.Send) delete(h.Clients, client) } } } } }