github.com/decred/dcrlnd@v0.7.6/peernotifier/peernotifier.go (about) 1 package peernotifier 2 3 import ( 4 "sync" 5 6 "github.com/decred/dcrlnd/subscribe" 7 ) 8 9 // PeerNotifier is a subsystem which observes peer offline and online events. 10 // It takes subscriptions for its events, and whenever it observes a new event 11 // it notifies its subscribers over the proper channel. 12 type PeerNotifier struct { 13 started sync.Once 14 stopped sync.Once 15 16 ntfnServer *subscribe.Server 17 } 18 19 // PeerOnlineEvent represents a new event where a peer comes online. 20 type PeerOnlineEvent struct { 21 // PubKey is the peer's compressed public key. 22 PubKey [33]byte 23 } 24 25 // PeerOfflineEvent represents a new event where a peer goes offline. 26 type PeerOfflineEvent struct { 27 // PubKey is the peer's compressed public key. 28 PubKey [33]byte 29 } 30 31 // New creates a new peer notifier which notifies clients of peer online 32 // and offline events. 33 func New() *PeerNotifier { 34 return &PeerNotifier{ 35 ntfnServer: subscribe.NewServer(), 36 } 37 } 38 39 // Start starts the PeerNotifier's subscription server. 40 func (p *PeerNotifier) Start() error { 41 var err error 42 43 p.started.Do(func() { 44 log.Info("PeerNotifier starting") 45 err = p.ntfnServer.Start() 46 }) 47 48 return err 49 } 50 51 // Stop signals the notifier for a graceful shutdown. 52 func (p *PeerNotifier) Stop() error { 53 var err error 54 p.stopped.Do(func() { 55 log.Info("PeerNotifier shutting down") 56 err = p.ntfnServer.Stop() 57 }) 58 return err 59 } 60 61 // SubscribePeerEvents returns a subscribe.Client that will receive updates 62 // any time the Server is informed of a peer event. 63 func (p *PeerNotifier) SubscribePeerEvents() (*subscribe.Client, error) { 64 return p.ntfnServer.Subscribe() 65 } 66 67 // NotifyPeerOnline sends a peer online event to all clients subscribed to the 68 // peer notifier. 69 func (p *PeerNotifier) NotifyPeerOnline(pubKey [33]byte) { 70 event := PeerOnlineEvent{PubKey: pubKey} 71 72 log.Debugf("PeerNotifier notifying peer: %x online", pubKey) 73 74 if err := p.ntfnServer.SendUpdate(event); err != nil { 75 log.Warnf("Unable to send peer online update: %v", err) 76 } 77 } 78 79 // NotifyPeerOffline sends a peer offline event to all the clients subscribed 80 // to the peer notifier. 81 func (p *PeerNotifier) NotifyPeerOffline(pubKey [33]byte) { 82 event := PeerOfflineEvent{PubKey: pubKey} 83 84 log.Debugf("PeerNotifier notifying peer: %x offline", pubKey) 85 86 if err := p.ntfnServer.SendUpdate(event); err != nil { 87 log.Warnf("Unable to send peer offline update: %v", err) 88 } 89 }