-
Notifications
You must be signed in to change notification settings - Fork 0
/
submit.go
96 lines (74 loc) · 1.88 KB
/
submit.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
95
96
package connectors
import (
"context"
"crypto/tls"
"sync"
"time"
rarimo "github.com/rarimo/rarimo-core/x/rarimocore/types"
"github.com/rarimo/tss-svc/internal/secret"
"github.com/rarimo/tss-svc/pkg/types"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
)
type con struct {
client *grpc.ClientConn
lastUsed time.Time
}
var clientsBuffer = struct {
mu sync.Mutex
clients map[string]*con
}{
clients: make(map[string]*con),
}
// SubmitConnector submits signed requests to the party.
// Also holds buffer of connections to reduce submitting time.
type SubmitConnector struct {
secret *secret.TssSecret
}
func NewSubmitConnector(secret *secret.TssSecret) *SubmitConnector {
c := &SubmitConnector{
secret: secret,
}
return c
}
func (s *SubmitConnector) Submit(ctx context.Context, party *rarimo.Party, request *types.MsgSubmitRequest) (*types.MsgSubmitResponse, error) {
if err := s.secret.Sign(request); err != nil {
return nil, err
}
var client *con
var err error
func() {
clientsBuffer.mu.Lock()
defer clientsBuffer.mu.Unlock()
client, err = s.getClient(party.Address)
}()
if err != nil {
return nil, err
}
return types.NewServiceClient(client.client).Submit(ctx, request)
}
func (s *SubmitConnector) getClient(addr string) (*con, error) {
if client, ok := clientsBuffer.clients[addr]; ok && client != nil {
client.lastUsed = time.Now().UTC()
return client, nil
}
var client *grpc.ClientConn
var err error
connectSecurityOptions := grpc.WithInsecure()
if s.secret.TLS() {
tlsConfig := &tls.Config{
MinVersion: tls.VersionTLS13,
}
connectSecurityOptions = grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig))
}
client, err = grpc.Dial(addr, connectSecurityOptions)
if err != nil {
return nil, err
}
con := &con{
client: client,
lastUsed: time.Now().UTC(),
}
clientsBuffer.clients[addr] = con
return con, nil
}