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