forked from wundergraph/graphql-go-tools
-
Notifications
You must be signed in to change notification settings - Fork 0
/
config_factory_proxy.go
117 lines (99 loc) · 3.78 KB
/
config_factory_proxy.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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package graphql
import (
"net/http"
"time"
"github.com/matthewmcneely/graphql-go-tools/v2/pkg/astparser"
graphqlDataSource "github.com/matthewmcneely/graphql-go-tools/v2/pkg/engine/datasource/graphql_datasource"
)
type proxyEngineConfigFactoryOptions struct {
httpClient *http.Client
streamingClient *http.Client
subscriptionClientFactory graphqlDataSource.GraphQLSubscriptionClientFactory
}
type ProxyEngineConfigFactoryOption func(options *proxyEngineConfigFactoryOptions)
func WithProxyHttpClient(client *http.Client) ProxyEngineConfigFactoryOption {
return func(options *proxyEngineConfigFactoryOptions) {
options.httpClient = client
}
}
func WithProxyStreamingClient(client *http.Client) ProxyEngineConfigFactoryOption {
return func(options *proxyEngineConfigFactoryOptions) {
options.streamingClient = client
}
}
func WithProxySubscriptionClientFactory(factory graphqlDataSource.GraphQLSubscriptionClientFactory) ProxyEngineConfigFactoryOption {
return func(options *proxyEngineConfigFactoryOptions) {
options.subscriptionClientFactory = factory
}
}
// ProxyUpstreamConfig holds configuration to configure a single data source to a single upstream.
type ProxyUpstreamConfig struct {
URL string
Method string
StaticHeaders http.Header
SubscriptionType SubscriptionType
}
// ProxyEngineConfigFactory is used to create a v2 engine config with a single upstream and a single data source for this upstream.
type ProxyEngineConfigFactory struct {
httpClient *http.Client
streamingClient *http.Client
schema *Schema
proxyUpstreamConfig ProxyUpstreamConfig
subscriptionClientFactory graphqlDataSource.GraphQLSubscriptionClientFactory
}
func NewProxyEngineConfigFactory(schema *Schema, proxyUpstreamConfig ProxyUpstreamConfig, opts ...ProxyEngineConfigFactoryOption) *ProxyEngineConfigFactory {
options := proxyEngineConfigFactoryOptions{
httpClient: &http.Client{
Timeout: time.Second * 10,
Transport: &http.Transport{
MaxIdleConnsPerHost: 1024,
TLSHandshakeTimeout: 0 * time.Second,
},
},
streamingClient: &http.Client{
Timeout: 0,
},
subscriptionClientFactory: &graphqlDataSource.DefaultSubscriptionClientFactory{},
}
for _, optFunc := range opts {
optFunc(&options)
}
return &ProxyEngineConfigFactory{
httpClient: options.httpClient,
streamingClient: options.streamingClient,
schema: schema,
proxyUpstreamConfig: proxyUpstreamConfig,
subscriptionClientFactory: options.subscriptionClientFactory,
}
}
func (p *ProxyEngineConfigFactory) EngineV2Configuration() (EngineV2Configuration, error) {
dataSourceConfig := graphqlDataSource.Configuration{
Fetch: graphqlDataSource.FetchConfiguration{
URL: p.proxyUpstreamConfig.URL,
Method: p.proxyUpstreamConfig.Method,
Header: p.proxyUpstreamConfig.StaticHeaders,
},
Subscription: graphqlDataSource.SubscriptionConfiguration{
URL: p.proxyUpstreamConfig.URL,
UseSSE: p.proxyUpstreamConfig.SubscriptionType == SubscriptionTypeSSE,
},
}
conf := NewEngineV2Configuration(p.schema)
rawDoc, report := astparser.ParseGraphqlDocumentBytes(p.schema.rawInput)
if report.HasErrors() {
return EngineV2Configuration{}, report
}
dataSource, err := newGraphQLDataSourceV2Generator(&rawDoc).Generate(
dataSourceConfig,
p.httpClient,
WithDataSourceV2GeneratorSubscriptionConfiguration(p.streamingClient, p.proxyUpstreamConfig.SubscriptionType),
WithDataSourceV2GeneratorSubscriptionClientFactory(p.subscriptionClientFactory),
)
if err != nil {
return EngineV2Configuration{}, err
}
conf.AddDataSource(dataSource)
fieldConfigs := newGraphQLFieldConfigsV2Generator(p.schema).Generate()
conf.SetFieldConfigurations(fieldConfigs)
return conf, nil
}