status-im/status-go

View on GitHub
services/ext/mailservers/utils.go

Summary

Maintainability
A
0 mins
Test Coverage
B
86%
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
}