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

     1  package mailservers
     2  
     3  import (
     4  	"sort"
     5  
     6  	"github.com/ethereum/go-ethereum/p2p/enode"
     7  
     8  	"github.com/status-im/status-go/eth-node/types"
     9  )
    10  
    11  // GetFirstConnected returns first connected peer that is also added to a peer store.
    12  // Raises ErrNoConnected if no peers are added to a peer store.
    13  func GetFirstConnected(provider PeersProvider, store *PeerStore) (*enode.Node, error) {
    14  	peers := provider.Peers()
    15  	for _, p := range peers {
    16  		if store.Exist(types.EnodeID(p.ID())) {
    17  			return p.Node(), nil
    18  		}
    19  	}
    20  	return nil, ErrNoConnected
    21  }
    22  
    23  // NodesNotifee interface to be notified when new nodes are received.
    24  type NodesNotifee interface {
    25  	Notify([]*enode.Node)
    26  }
    27  
    28  // EnsureUsedRecordsAddedFirst checks if any nodes were marked as connected before app went offline.
    29  func EnsureUsedRecordsAddedFirst(ps *PeerStore, conn NodesNotifee) error {
    30  	records, err := ps.cache.LoadAll()
    31  	if err != nil {
    32  		return err
    33  	}
    34  	if len(records) == 0 {
    35  		return nil
    36  	}
    37  	sort.Slice(records, func(i, j int) bool {
    38  		return records[i].LastUsed.After(records[j].LastUsed)
    39  	})
    40  	all := recordsToNodes(records)
    41  	if !records[0].LastUsed.IsZero() {
    42  		conn.Notify(all[:1])
    43  	}
    44  	conn.Notify(all)
    45  	return nil
    46  }
    47  
    48  func recordsToNodes(records []PeerRecord) []*enode.Node {
    49  	nodes := make([]*enode.Node, len(records))
    50  	for i := range records {
    51  		nodes[i] = records[i].Node()
    52  	}
    53  	return nodes
    54  }