-
Notifications
You must be signed in to change notification settings - Fork 2
/
transport.go
88 lines (71 loc) · 2.32 KB
/
transport.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
package speakeasy
import (
"context"
"crypto/tls"
"net"
"time"
"github.com/speakeasy-api/speakeasy-go-sdk/internal/log"
"github.com/speakeasy-api/speakeasy-schemas/grpc/go/registry/embedaccesstoken"
"github.com/speakeasy-api/speakeasy-schemas/grpc/go/registry/ingest"
"go.uber.org/zap"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials"
"google.golang.org/grpc/credentials/insecure"
"google.golang.org/grpc/metadata"
)
var GRPCIngestTimeout = 1 * time.Second
type DialerFunc func() func(context.Context, string) (net.Conn, error)
type GRPCClient struct {
apiKey string
serverURL string
secure bool
conn *grpc.ClientConn
}
func newGRPCClient(ctx context.Context, apiKey, serverURL string, secure bool, grpcDialer DialerFunc) (*GRPCClient, error) {
conn, err := createConn(ctx, secure, serverURL, grpcDialer)
if err != nil {
return nil, err
}
return &GRPCClient{
apiKey: apiKey,
serverURL: serverURL,
secure: secure,
conn: conn,
}, nil
}
func (c *GRPCClient) SendToIngest(ctx context.Context, req *ingest.IngestRequest) {
ctx, cancel := context.WithTimeout(ctx, GRPCIngestTimeout)
defer cancel()
ctx = metadata.NewOutgoingContext(ctx, metadata.Pairs("x-api-key", c.apiKey))
_, err := ingest.NewIngestServiceClient(c.conn).Ingest(ctx, req)
if err != nil {
log.From(ctx).Error("speakeasy-sdk: failed to send ingest request", zap.Error(err))
return
}
}
func (c *GRPCClient) GetEmbedAccessToken(ctx context.Context, req *embedaccesstoken.EmbedAccessTokenRequest) (string, error) {
ctx = metadata.NewOutgoingContext(ctx, metadata.Pairs("x-api-key", c.apiKey))
res, err := embedaccesstoken.NewEmbedAccessTokenServiceClient(c.conn).Get(ctx, req)
if err != nil {
return "", err
}
return res.AccessToken, nil
}
func createConn(ctx context.Context, secure bool, serverURL string, grpcDialer DialerFunc) (*grpc.ClientConn, error) {
opts := []grpc.DialOption{}
if secure {
opts = append(opts, grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{
MinVersion: tls.VersionTLS12,
})))
} else {
opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials()))
}
if grpcDialer != nil {
opts = append(opts, grpc.WithContextDialer(grpcDialer()))
}
conn, err := grpc.DialContext(ctx, serverURL, opts...)
if err != nil {
return nil, err
}
return conn, nil
}