github.com/status-im/status-go@v1.1.0/services/ext/mailservers/peerstore.go (about)

     1  package mailservers
     2  
     3  import (
     4  	"errors"
     5  	"sync"
     6  
     7  	"github.com/ethereum/go-ethereum/p2p"
     8  	"github.com/ethereum/go-ethereum/p2p/enode"
     9  
    10  	"github.com/status-im/status-go/eth-node/types"
    11  )
    12  
    13  var (
    14  	// ErrNoConnected returned when mail servers are not connected.
    15  	ErrNoConnected = errors.New("no connected mail servers")
    16  )
    17  
    18  // PeersProvider is an interface for requesting list of peers.
    19  type PeersProvider interface {
    20  	Peers() []*p2p.Peer
    21  }
    22  
    23  // NewPeerStore returns an instance of PeerStore.
    24  func NewPeerStore(cache *Cache) *PeerStore {
    25  	return &PeerStore{
    26  		nodes: map[types.EnodeID]*enode.Node{},
    27  		cache: cache,
    28  	}
    29  }
    30  
    31  // PeerStore stores list of selected mail servers and keeps N of them connected.
    32  type PeerStore struct {
    33  	mu    sync.RWMutex
    34  	nodes map[types.EnodeID]*enode.Node
    35  
    36  	cache *Cache
    37  }
    38  
    39  // Exist confirms that peers was added to a store.
    40  func (ps *PeerStore) Exist(nodeID types.EnodeID) bool {
    41  	ps.mu.RLock()
    42  	defer ps.mu.RUnlock()
    43  	_, exist := ps.nodes[nodeID]
    44  	return exist
    45  }
    46  
    47  // Get returns instance of the node with requested ID or nil if ID is not found.
    48  func (ps *PeerStore) Get(nodeID types.EnodeID) *enode.Node {
    49  	ps.mu.RLock()
    50  	defer ps.mu.RUnlock()
    51  	return ps.nodes[nodeID]
    52  }
    53  
    54  // Update updates peers locally.
    55  func (ps *PeerStore) Update(nodes []*enode.Node) error {
    56  	ps.mu.Lock()
    57  	ps.nodes = map[types.EnodeID]*enode.Node{}
    58  	for _, n := range nodes {
    59  		ps.nodes[types.EnodeID(n.ID())] = n
    60  	}
    61  	ps.mu.Unlock()
    62  	return ps.cache.Replace(nodes)
    63  }