forked from Shiloh/githaven
85 lines
1.8 KiB
Go
85 lines
1.8 KiB
Go
|
// 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)
|
||
|
}
|
||
|
}
|