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  }