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.9KB

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