-
Notifications
You must be signed in to change notification settings - Fork 0
/
peer.go
94 lines (76 loc) · 1.56 KB
/
peer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package devp2p
import (
"fmt"
"github.com/umbracle/go-devp2p/enode"
)
type Status int
const (
PeerActive Status = iota
PeerPending
PeerDisconnected
PeerBusy
)
func (s Status) String() string {
switch s {
case PeerActive:
return "active"
case PeerPending:
return "pending"
case PeerDisconnected:
return "disconnected"
default:
panic(fmt.Sprintf("Status %d not found", s))
}
}
// Peer is each of the connected peers
type Peer struct {
Enode *enode.Enode
Info Info
ID string
prettyID string
Status Status
conn Session
protocols []*Instance
}
func newPeer(conn Session) *Peer {
info := conn.GetInfo()
id := info.Enode.ID.String()
peer := &Peer{
Enode: info.Enode,
Info: info,
ID: id,
prettyID: id[:8],
conn: conn,
protocols: []*Instance{},
}
return peer
}
// Session returns the session of the peer
func (p *Peer) Session() Session {
return p.conn
}
// GetProtocols returns all the protocols of the peer
func (p *Peer) GetProtocols() []*Instance {
return p.protocols
}
// GetProtocol returns the protocol by name
func (p *Peer) GetProtocol(name string) (*Instance, bool) {
for _, i := range p.protocols {
if i.Protocol.Spec.Name == name {
return i, true
}
}
return nil, false
}
// IsClosed checks if the connection is closed
func (p *Peer) IsClosed() bool {
return p.conn.IsClosed()
}
// PrettyID returns a pretty version of the id
func (p *Peer) PrettyID() string {
return p.prettyID
}
// Close closes the peer connection
func (p *Peer) Close() error {
return p.conn.Close()
}