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 }