Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

messenger.go 1.8KB

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