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.

messenger.go 1.7KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // Copyright 2020 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package eventsource
  4. import "sync"
  5. // Messenger is a per uid message store
  6. type Messenger struct {
  7. mutex sync.Mutex
  8. uid int64
  9. channels []chan *Event
  10. }
  11. // NewMessenger creates a messenger for a particular uid
  12. func NewMessenger(uid int64) *Messenger {
  13. return &Messenger{
  14. uid: uid,
  15. channels: [](chan *Event){},
  16. }
  17. }
  18. // Register returns a new chan []byte
  19. func (m *Messenger) Register() <-chan *Event {
  20. m.mutex.Lock()
  21. // TODO: Limit the number of messengers per uid
  22. channel := make(chan *Event, 1)
  23. m.channels = append(m.channels, channel)
  24. m.mutex.Unlock()
  25. return channel
  26. }
  27. // Unregister removes the provider chan []byte
  28. func (m *Messenger) Unregister(channel <-chan *Event) bool {
  29. m.mutex.Lock()
  30. defer m.mutex.Unlock()
  31. for i, toRemove := range m.channels {
  32. if channel == toRemove {
  33. m.channels = append(m.channels[:i], m.channels[i+1:]...)
  34. close(toRemove)
  35. break
  36. }
  37. }
  38. return len(m.channels) == 0
  39. }
  40. // UnregisterAll removes all chan []byte
  41. func (m *Messenger) UnregisterAll() {
  42. m.mutex.Lock()
  43. defer m.mutex.Unlock()
  44. for _, channel := range m.channels {
  45. close(channel)
  46. }
  47. m.channels = nil
  48. }
  49. // SendMessage sends the message to all registered channels
  50. func (m *Messenger) SendMessage(message *Event) {
  51. m.mutex.Lock()
  52. defer m.mutex.Unlock()
  53. for i := range m.channels {
  54. channel := m.channels[i]
  55. select {
  56. case channel <- message:
  57. default:
  58. }
  59. }
  60. }
  61. // SendMessageBlocking sends the message to all registered channels and ensures it gets sent
  62. func (m *Messenger) SendMessageBlocking(message *Event) {
  63. m.mutex.Lock()
  64. defer m.mutex.Unlock()
  65. for i := range m.channels {
  66. m.channels[i] <- message
  67. }
  68. }