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  }