forked from Shiloh/githaven
791353c03b
If the browser supports EventSource switch to use this instead of polling notifications. Signed-off-by: Andrew Thornton art27@cantab.net
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)
|
|
}
|
|
}
|