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