mirror of
https://github.com/netbirdio/netbird.git
synced 2025-08-19 11:20:18 +02:00
Fix nil pointer in Relay conn address Meanwhile, we create a relayed net.Conn struct instance, it is possible to set the relayedURL to nil. panic: value method github.com/netbirdio/netbird/relay/client.RelayAddr.String called using nil *RelayAddr pointer Fix relayed URL variable protection Protect the channel closing
65 lines
1.4 KiB
Go
65 lines
1.4 KiB
Go
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(ctx, pn.store)
|
|
go listener.listenForEvents(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)
|
|
}
|
|
}
|