forked from bazil/bazil
-
Notifications
You must be signed in to change notification settings - Fork 0
/
peer.go
90 lines (80 loc) · 1.68 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
package server
import (
"io"
"time"
"bazil.org/bazil/db"
"bazil.org/bazil/kv"
"bazil.org/bazil/peer"
wirepeer "bazil.org/bazil/peer/wire"
"bazil.org/bazil/util/grpcedtls"
"github.com/agl/ed25519"
"google.golang.org/grpc"
)
func (app *App) OpenKVForPeer(pub *peer.PublicKey) (kv.KV, error) {
var kvstore kv.KV
open := func(tx *db.Tx) error {
p, err := tx.Peers().Get(pub)
if err != nil {
return err
}
s, err := p.Storage().Open(app.openStorage)
if err != nil {
return err
}
kvstore = s
return nil
}
if err := app.DB.View(open); err != nil {
return nil, err
}
return kvstore, nil
}
type PeerClient interface {
wirepeer.PeerClient
io.Closer
}
type peerClient struct {
wirepeer.PeerClient
conn *grpc.ClientConn
}
var _ PeerClient = (*peerClient)(nil)
func (p *peerClient) Close() error {
return p.conn.Close()
}
func (app *App) DialPeer(pub *peer.PublicKey) (PeerClient, error) {
var addr string
find := func(tx *db.Tx) error {
p, err := tx.Peers().Get(pub)
if err != nil {
return err
}
a, err := p.Locations().Get()
if err != nil {
return err
}
addr = a
return nil
}
if err := app.DB.View(find); err != nil {
return nil, err
}
auth := &grpcedtls.Authenticator{
Config: app.GetTLSConfig,
PeerPub: (*[ed25519.PublicKeySize]byte)(pub),
}
// TODO never delay here.
// https://github.com/grpc/grpc-go/blob/8ce50750fe22e967aa8b1d308b21511844674b57/clientconn.go#L85
conn, err := grpc.Dial(addr,
grpc.WithTransportCredentials(auth),
grpc.WithTimeout(30*time.Second),
)
if err != nil {
return nil, err
}
client := wirepeer.NewPeerClient(conn)
p := &peerClient{
PeerClient: client,
conn: conn,
}
return p, nil
}