mirror of
https://github.com/netbirdio/netbird.git
synced 2026-04-18 16:26:38 +00:00
[client, relay-server] Feature/relay notification (#4083)
- Clients now subscribe to peer status changes. - The server manages and maintains these subscriptions. - Replaced raw string peer IDs with a custom peer ID type for better type safety and clarity.
This commit is contained in:
64
relay/server/store/notifier.go
Normal file
64
relay/server/store/notifier.go
Normal file
@@ -0,0 +1,64 @@
|
||||
package store
|
||||
|
||||
import (
|
||||
"context"
|
||||
"sync"
|
||||
|
||||
"github.com/netbirdio/netbird/relay/messages"
|
||||
)
|
||||
|
||||
type PeerNotifier struct {
|
||||
store *Store
|
||||
|
||||
listeners map[*Listener]context.CancelFunc
|
||||
listenersMutex sync.RWMutex
|
||||
}
|
||||
|
||||
func NewPeerNotifier(store *Store) *PeerNotifier {
|
||||
pn := &PeerNotifier{
|
||||
store: store,
|
||||
listeners: make(map[*Listener]context.CancelFunc),
|
||||
}
|
||||
return pn
|
||||
}
|
||||
|
||||
func (pn *PeerNotifier) NewListener(onPeersComeOnline, onPeersWentOffline func([]messages.PeerID)) *Listener {
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
listener := newListener(pn.store)
|
||||
go listener.listenForEvents(ctx, onPeersComeOnline, onPeersWentOffline)
|
||||
|
||||
pn.listenersMutex.Lock()
|
||||
pn.listeners[listener] = cancel
|
||||
pn.listenersMutex.Unlock()
|
||||
return listener
|
||||
}
|
||||
|
||||
func (pn *PeerNotifier) RemoveListener(listener *Listener) {
|
||||
pn.listenersMutex.Lock()
|
||||
defer pn.listenersMutex.Unlock()
|
||||
|
||||
cancel, ok := pn.listeners[listener]
|
||||
if !ok {
|
||||
return
|
||||
}
|
||||
cancel()
|
||||
delete(pn.listeners, listener)
|
||||
}
|
||||
|
||||
func (pn *PeerNotifier) PeerWentOffline(peerID messages.PeerID) {
|
||||
pn.listenersMutex.RLock()
|
||||
defer pn.listenersMutex.RUnlock()
|
||||
|
||||
for listener := range pn.listeners {
|
||||
listener.peerWentOffline(peerID)
|
||||
}
|
||||
}
|
||||
|
||||
func (pn *PeerNotifier) PeerCameOnline(peerID messages.PeerID) {
|
||||
pn.listenersMutex.RLock()
|
||||
defer pn.listenersMutex.RUnlock()
|
||||
|
||||
for listener := range pn.listeners {
|
||||
listener.peerComeOnline(peerID)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user