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 LastActionsQueue = NewSyncQueue(20) func (h *ClientsManager) Run() { initActionQueue() 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: LastActionsQueue.Push(message) for client := range h.Clients { select { case client.Send <- message: default: close(client.Send) delete(h.Clients, client) } } } } } func initActionQueue() { actions, err := models.GetLast20PublicFeeds() if err == nil { for i := len(actions) - 1; i >= 0; i-- { LastActionsQueue.Push(actions[i]) } } }