You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

clientManager.go 1.1 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package socketwrap
  2. import (
  3. "code.gitea.io/gitea/models"
  4. )
  5. type ClientsManager struct {
  6. Clients map[*Client]bool
  7. Register chan *Client
  8. Unregister chan *Client
  9. }
  10. func NewClientsManager() *ClientsManager {
  11. return &ClientsManager{
  12. Register: make(chan *Client),
  13. Unregister: make(chan *Client),
  14. Clients: make(map[*Client]bool),
  15. }
  16. }
  17. var LastActionsQueue = NewSyncQueue(20)
  18. func (h *ClientsManager) Run() {
  19. initActionQueue()
  20. for {
  21. select {
  22. case client := <-h.Register:
  23. h.Clients[client] = true
  24. case client := <-h.Unregister:
  25. if _, ok := h.Clients[client]; ok {
  26. delete(h.Clients, client)
  27. close(client.Send)
  28. }
  29. case message := <-models.ActionChan:
  30. LastActionsQueue.Push(message)
  31. for client := range h.Clients {
  32. select {
  33. case client.Send <- message:
  34. default:
  35. close(client.Send)
  36. delete(h.Clients, client)
  37. }
  38. }
  39. }
  40. }
  41. }
  42. func initActionQueue() {
  43. actions, err := models.GetLast20PublicFeeds()
  44. if err == nil {
  45. for i := len(actions) - 1; i >= 0; i-- {
  46. LastActionsQueue.Push(actions[i])
  47. }
  48. }
  49. }