|
- 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])
- }
- }
- }
|