|
|
- // Copyright 2020 The Gitea Authors. All rights reserved.
- // Use of this source code is governed by a MIT-style
- // license that can be found in the LICENSE file.
-
- package eventsource
-
- import (
- "sync"
- )
-
- // Manager manages the eventsource Messengers
- type Manager struct {
- mutex sync.Mutex
-
- messengers map[int64]*Messenger
- }
-
- var manager *Manager
-
- func init() {
- manager = &Manager{
- messengers: make(map[int64]*Messenger),
- }
- }
-
- // GetManager returns a Manager and initializes one as singleton if there's none yet
- func GetManager() *Manager {
- return manager
- }
-
- // Register message channel
- func (m *Manager) Register(uid int64) <-chan *Event {
- m.mutex.Lock()
- messenger, ok := m.messengers[uid]
- if !ok {
- messenger = NewMessenger(uid)
- m.messengers[uid] = messenger
- }
- m.mutex.Unlock()
- return messenger.Register()
- }
-
- // Unregister message channel
- func (m *Manager) Unregister(uid int64, channel <-chan *Event) {
- m.mutex.Lock()
- defer m.mutex.Unlock()
- messenger, ok := m.messengers[uid]
- if !ok {
- return
- }
- if messenger.Unregister(channel) {
- delete(m.messengers, uid)
- }
- }
-
- // UnregisterAll message channels
- func (m *Manager) UnregisterAll() {
- m.mutex.Lock()
- defer m.mutex.Unlock()
- for _, messenger := range m.messengers {
- messenger.UnregisterAll()
- }
- m.messengers = map[int64]*Messenger{}
- }
-
- // SendMessage sends a message to a particular user
- func (m *Manager) SendMessage(uid int64, message *Event) {
- m.mutex.Lock()
- messenger, ok := m.messengers[uid]
- m.mutex.Unlock()
- if ok {
- messenger.SendMessage(message)
- }
- }
-
- // SendMessageBlocking sends a message to a particular user
- func (m *Manager) SendMessageBlocking(uid int64, message *Event) {
- m.mutex.Lock()
- messenger, ok := m.messengers[uid]
- m.mutex.Unlock()
- if ok {
- messenger.SendMessageBlocking(message)
- }
- }
|