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

manager.go 1.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package eventsource
  4. import (
  5. "sync"
  6. )
  7. // Manager manages the eventsource Messengers
  8. type Manager struct {
  9. mutex sync.Mutex
  10. messengers map[int64]*Messenger
  11. connection chan struct{}
  12. }
  13. var manager *Manager
  14. func init() {
  15. manager = &Manager{
  16. messengers: make(map[int64]*Messenger),
  17. connection: make(chan struct{}, 1),
  18. }
  19. }
  20. // GetManager returns a Manager and initializes one as singleton if there's none yet
  21. func GetManager() *Manager {
  22. return manager
  23. }
  24. // Register message channel
  25. func (m *Manager) Register(uid int64) <-chan *Event {
  26. m.mutex.Lock()
  27. messenger, ok := m.messengers[uid]
  28. if !ok {
  29. messenger = NewMessenger(uid)
  30. m.messengers[uid] = messenger
  31. }
  32. select {
  33. case m.connection <- struct{}{}:
  34. default:
  35. }
  36. m.mutex.Unlock()
  37. return messenger.Register()
  38. }
  39. // Unregister message channel
  40. func (m *Manager) Unregister(uid int64, channel <-chan *Event) {
  41. m.mutex.Lock()
  42. defer m.mutex.Unlock()
  43. messenger, ok := m.messengers[uid]
  44. if !ok {
  45. return
  46. }
  47. if messenger.Unregister(channel) {
  48. delete(m.messengers, uid)
  49. }
  50. }
  51. // UnregisterAll message channels
  52. func (m *Manager) UnregisterAll() {
  53. m.mutex.Lock()
  54. defer m.mutex.Unlock()
  55. for _, messenger := range m.messengers {
  56. messenger.UnregisterAll()
  57. }
  58. m.messengers = map[int64]*Messenger{}
  59. }
  60. // SendMessage sends a message to a particular user
  61. func (m *Manager) SendMessage(uid int64, message *Event) {
  62. m.mutex.Lock()
  63. messenger, ok := m.messengers[uid]
  64. m.mutex.Unlock()
  65. if ok {
  66. messenger.SendMessage(message)
  67. }
  68. }
  69. // SendMessageBlocking sends a message to a particular user
  70. func (m *Manager) SendMessageBlocking(uid int64, message *Event) {
  71. m.mutex.Lock()
  72. messenger, ok := m.messengers[uid]
  73. m.mutex.Unlock()
  74. if ok {
  75. messenger.SendMessageBlocking(message)
  76. }
  77. }