package mailservers import ( "sort" "github.com/ethereum/go-ethereum/p2p/enode" "github.com/status-im/status-go/eth-node/types" ) // GetFirstConnected returns first connected peer that is also added to a peer store. // Raises ErrNoConnected if no peers are added to a peer store. func GetFirstConnected(provider PeersProvider, store *PeerStore) (*enode.Node, error) { peers := provider.Peers() for _, p := range peers { if store.Exist(types.EnodeID(p.ID())) { return p.Node(), nil } } return nil, ErrNoConnected } // NodesNotifee interface to be notified when new nodes are received. type NodesNotifee interface { Notify([]*enode.Node) } // EnsureUsedRecordsAddedFirst checks if any nodes were marked as connected before app went offline. func EnsureUsedRecordsAddedFirst(ps *PeerStore, conn NodesNotifee) error { records, err := ps.cache.LoadAll() if err != nil { return err } if len(records) == 0 { return nil } sort.Slice(records, func(i, j int) bool { return records[i].LastUsed.After(records[j].LastUsed) }) all := recordsToNodes(records) if !records[0].LastUsed.IsZero() { conn.Notify(all[:1]) } conn.Notify(all) return nil } func recordsToNodes(records []PeerRecord) []*enode.Node { nodes := make([]*enode.Node, len(records)) for i := range records { nodes[i] = records[i].Node() } return nodes }