79 lines · 1.6 KB · Go
RawDownload
// Copyright 2020 The Gitea Authors. All rights reserved.// SPDX-License-Identifier: MIT package eventsource import (	"sync") // Manager manages the eventsource Messengerstype Manager struct {	mutex sync.Mutex 	messengers map[int64]*Messenger	connection chan struct{}} var manager *Manager func init() {	manager = &Manager{		messengers: make(map[int64]*Messenger),		connection: make(chan struct{}, 1),	}} // GetManager returns a Manager and initializes one as singleton if there's none yetfunc GetManager() *Manager {	return manager} // Register message channelfunc (m *Manager) Register(uid int64) <-chan *Event {	m.mutex.Lock()	messenger, ok := m.messengers[uid]	if !ok {		messenger = NewMessenger(uid)		m.messengers[uid] = messenger	}	select {	case m.connection <- struct{}{}:	default:	}	m.mutex.Unlock()	return messenger.Register()} // Unregister message channelfunc (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 channelsfunc (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 userfunc (m *Manager) SendMessage(uid int64, message *Event) {	m.mutex.Lock()	messenger, ok := m.messengers[uid]	m.mutex.Unlock()	if ok {		messenger.SendMessage(message)	}}