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 }