code.gitea.io/gitea@v1.19.3/modules/eventsource/messenger.go (about)

     1  // Copyright 2020 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package eventsource
     5  
     6  import "sync"
     7  
     8  // Messenger is a per uid message store
     9  type Messenger struct {
    10  	mutex    sync.Mutex
    11  	uid      int64
    12  	channels []chan *Event
    13  }
    14  
    15  // NewMessenger creates a messenger for a particular uid
    16  func NewMessenger(uid int64) *Messenger {
    17  	return &Messenger{
    18  		uid:      uid,
    19  		channels: [](chan *Event){},
    20  	}
    21  }
    22  
    23  // Register returns a new chan []byte
    24  func (m *Messenger) Register() <-chan *Event {
    25  	m.mutex.Lock()
    26  	// TODO: Limit the number of messengers per uid
    27  	channel := make(chan *Event, 1)
    28  	m.channels = append(m.channels, channel)
    29  	m.mutex.Unlock()
    30  	return channel
    31  }
    32  
    33  // Unregister removes the provider chan []byte
    34  func (m *Messenger) Unregister(channel <-chan *Event) bool {
    35  	m.mutex.Lock()
    36  	defer m.mutex.Unlock()
    37  	for i, toRemove := range m.channels {
    38  		if channel == toRemove {
    39  			m.channels = append(m.channels[:i], m.channels[i+1:]...)
    40  			close(toRemove)
    41  			break
    42  		}
    43  	}
    44  	return len(m.channels) == 0
    45  }
    46  
    47  // UnregisterAll removes all chan []byte
    48  func (m *Messenger) UnregisterAll() {
    49  	m.mutex.Lock()
    50  	defer m.mutex.Unlock()
    51  	for _, channel := range m.channels {
    52  		close(channel)
    53  	}
    54  	m.channels = nil
    55  }
    56  
    57  // SendMessage sends the message to all registered channels
    58  func (m *Messenger) SendMessage(message *Event) {
    59  	m.mutex.Lock()
    60  	defer m.mutex.Unlock()
    61  	for i := range m.channels {
    62  		channel := m.channels[i]
    63  		select {
    64  		case channel <- message:
    65  		default:
    66  		}
    67  	}
    68  }
    69  
    70  // SendMessageBlocking sends the message to all registered channels and ensures it gets sent
    71  func (m *Messenger) SendMessageBlocking(message *Event) {
    72  	m.mutex.Lock()
    73  	defer m.mutex.Unlock()
    74  	for i := range m.channels {
    75  		m.channels[i] <- message
    76  	}
    77  }