Skip to content

Commit 146a552

Browse files
authored
feat: implement gRPC datasource (#1146)
1 parent c0e870c commit 146a552

42 files changed

Lines changed: 12099 additions & 178 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
.idea/*
2+
.vscode/*
23
*.out
34
*.test
45
.DS_Store

examples/federation/go.mod

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,16 @@ require (
99
github.com/jensneuse/abstractlogger v0.0.4
1010
github.com/vektah/gqlparser/v2 v2.5.14
1111
github.com/wundergraph/graphql-go-tools/execution v1.0.1
12-
github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.136
12+
github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.172
1313
go.uber.org/atomic v1.11.0
1414
go.uber.org/zap v1.26.0
1515
)
1616

1717
require (
1818
github.com/agnivade/levenshtein v1.1.1 // indirect
19+
github.com/bufbuild/protocompile v0.14.1 // indirect
1920
github.com/buger/jsonparser v1.1.1 // indirect
20-
github.com/cespare/xxhash/v2 v2.2.0 // indirect
21+
github.com/cespare/xxhash/v2 v2.3.0 // indirect
2122
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
2223
github.com/davecgh/go-spew v1.1.1 // indirect
2324
github.com/dlclark/regexp2 v1.11.0 // indirect
@@ -40,24 +41,26 @@ require (
4041
github.com/r3labs/sse/v2 v2.8.1 // indirect
4142
github.com/russross/blackfriday/v2 v2.1.0 // indirect
4243
github.com/sirupsen/logrus v1.9.3 // indirect
43-
github.com/stretchr/testify v1.9.0 // indirect
44+
github.com/stretchr/testify v1.10.0 // indirect
4445
github.com/tidwall/gjson v1.17.0 // indirect
4546
github.com/tidwall/match v1.1.1 // indirect
4647
github.com/tidwall/pretty v1.2.1 // indirect
4748
github.com/tidwall/sjson v1.2.5 // indirect
4849
github.com/urfave/cli/v2 v2.25.5 // indirect
49-
github.com/wundergraph/astjson v0.0.0-20241210135722-15ca0ac078f8 // indirect
50+
github.com/wundergraph/astjson v0.0.0-20250106123708-be463c97e083 // indirect
5051
github.com/wundergraph/cosmo/composition-go v0.0.0-20241020204711-78f240a77c99 // indirect
5152
github.com/wundergraph/cosmo/router v0.0.0-20240729154441-b20b00e892c6 // indirect
5253
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
5354
go.uber.org/multierr v1.11.0 // indirect
5455
golang.org/x/mod v0.18.0 // indirect
55-
golang.org/x/net v0.26.0 // indirect
56-
golang.org/x/sync v0.7.0 // indirect
57-
golang.org/x/sys v0.21.0 // indirect
58-
golang.org/x/text v0.16.0 // indirect
56+
golang.org/x/net v0.34.0 // indirect
57+
golang.org/x/sync v0.10.0 // indirect
58+
golang.org/x/sys v0.29.0 // indirect
59+
golang.org/x/text v0.21.0 // indirect
5960
golang.org/x/tools v0.22.0 // indirect
60-
google.golang.org/protobuf v1.34.1 // indirect
61+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect
62+
google.golang.org/grpc v1.71.0 // indirect
63+
google.golang.org/protobuf v1.36.4 // indirect
6164
gopkg.in/cenkalti/backoff.v1 v1.1.0 // indirect
6265
gopkg.in/yaml.v3 v3.0.1 // indirect
6366
rogchap.com/v8go v0.9.0 // indirect

examples/federation/go.sum

Lines changed: 52 additions & 18 deletions
Large diffs are not rendered by default.

execution/engine/config_factory_federation.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99

1010
"github.com/wundergraph/cosmo/router/gen/proto/wg/cosmo/common"
1111
nodev1 "github.com/wundergraph/cosmo/router/gen/proto/wg/cosmo/node/v1"
12+
"google.golang.org/grpc"
1213
"google.golang.org/protobuf/encoding/protojson"
1314

1415
"github.com/wundergraph/cosmo/composition-go"
@@ -42,6 +43,8 @@ type federationEngineConfigFactoryOptions struct {
4243
subscriptionClientFactory graphql_datasource.GraphQLSubscriptionClientFactory
4344
subscriptionType SubscriptionType
4445
customResolveMap map[string]resolve.CustomResolve
46+
47+
grpcClient grpc.ClientConnInterface
4548
}
4649

4750
type FederationEngineConfigFactoryOption func(options *federationEngineConfigFactoryOptions)
@@ -85,6 +88,8 @@ func NewFederationEngineConfigFactory(engineCtx context.Context, subgraphsConfig
8588
TLSHandshakeTimeout: 0 * time.Second,
8689
},
8790
},
91+
// TODO
92+
grpcClient: nil,
8893
streamingClient: &http.Client{
8994
Timeout: 0,
9095
},
@@ -99,6 +104,7 @@ func NewFederationEngineConfigFactory(engineCtx context.Context, subgraphsConfig
99104
return &FederationEngineConfigFactory{
100105
engineCtx: engineCtx,
101106
httpClient: options.httpClient,
107+
grpcClient: options.grpcClient,
102108
streamingClient: options.streamingClient,
103109
subscriptionClientFactory: options.subscriptionClientFactory,
104110
subscriptionType: options.subscriptionType,
@@ -117,6 +123,8 @@ type FederationEngineConfigFactory struct {
117123
subscriptionType SubscriptionType
118124
customResolveMap map[string]resolve.CustomResolve
119125
subgraphsConfigs []SubgraphConfiguration
126+
127+
grpcClient grpc.ClientConnInterface
120128
}
121129

122130
func (f *FederationEngineConfigFactory) BuildEngineConfiguration() (Configuration, error) {

execution/engine/config_factory_proxy.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"time"
77

88
"github.com/google/uuid"
9+
"google.golang.org/grpc"
910

1011
"github.com/wundergraph/graphql-go-tools/execution/graphql"
1112
"github.com/wundergraph/graphql-go-tools/v2/pkg/astparser"
@@ -62,6 +63,7 @@ type ProxyEngineConfigFactory struct {
6263
proxyUpstreamConfig ProxyUpstreamConfig
6364
subscriptionClientFactory graphqlDataSource.GraphQLSubscriptionClientFactory
6465
engineCtx context.Context
66+
grpcClient grpc.ClientConnInterface
6567
}
6668

6769
func NewProxyEngineConfigFactory(engineCtx context.Context, schema *graphql.Schema, proxyUpstreamConfig ProxyUpstreamConfig, opts ...ProxyEngineConfigFactoryOption) *ProxyEngineConfigFactory {
@@ -128,6 +130,7 @@ func (p *ProxyEngineConfigFactory) EngineConfiguration() (Configuration, error)
128130
p.dataSourceID,
129131
dataSourceConfig,
130132
p.httpClient,
133+
p.grpcClient,
131134
WithDataSourceGeneratorSubscriptionConfiguration(p.streamingClient, p.proxyUpstreamConfig.SubscriptionType),
132135
WithDataSourceGeneratorSubscriptionClientFactory(p.subscriptionClientFactory),
133136
)

execution/engine/engine_config.go

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"github.com/wundergraph/graphql-go-tools/v2/pkg/engine/datasource/graphql_datasource"
1111
"github.com/wundergraph/graphql-go-tools/v2/pkg/engine/plan"
1212
"github.com/wundergraph/graphql-go-tools/v2/pkg/engine/resolve"
13+
"google.golang.org/grpc"
1314
)
1415

1516
const (
@@ -103,7 +104,7 @@ func newGraphQLDataSourceGenerator(engineCtx context.Context, document *ast.Docu
103104
}
104105
}
105106

106-
func (d *graphqlDataSourceGenerator) Generate(dsID string, config graphql_datasource.Configuration, httpClient *http.Client, options ...DataSourceGeneratorOption) (plan.DataSource, error) {
107+
func (d *graphqlDataSourceGenerator) Generate(dsID string, config graphql_datasource.Configuration, httpClient *http.Client, grpcClient grpc.ClientConnInterface, options ...DataSourceGeneratorOption) (plan.DataSource, error) {
107108
extractor := NewLocalTypeFieldExtractor(d.document)
108109
rootNodes, childNodes := extractor.GetAllNodes()
109110

@@ -122,11 +123,21 @@ func (d *graphqlDataSourceGenerator) Generate(dsID string, config graphql_dataso
122123
return nil, err
123124
}
124125

125-
factory, err := graphql_datasource.NewFactory(
126-
d.engineCtx,
127-
httpClient,
128-
subscriptionClient,
129-
)
126+
var factory plan.PlannerFactory[graphql_datasource.Configuration]
127+
128+
if config.IsGRPC() {
129+
factory, err = graphql_datasource.NewFactoryGRPC(
130+
d.engineCtx,
131+
grpcClient,
132+
)
133+
} else {
134+
factory, err = graphql_datasource.NewFactory(
135+
d.engineCtx,
136+
httpClient,
137+
subscriptionClient,
138+
)
139+
}
140+
130141
if err != nil {
131142
return nil, err
132143
}

execution/engine/engine_config_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ func TestGraphQLDataSourceGenerator_Generate(t *testing.T) {
124124
"test",
125125
dataSourceConfig,
126126
client,
127+
nil,
127128
WithDataSourceGeneratorSubscriptionClientFactory(&MockSubscriptionClientFactory{}),
128129
)
129130
require.NoError(t, err)
@@ -157,6 +158,7 @@ func TestGraphQLDataSourceGenerator_Generate(t *testing.T) {
157158
"test",
158159
dataSourceConfig,
159160
client,
161+
nil,
160162
WithDataSourceGeneratorSubscriptionConfiguration(streamingClient, SubscriptionTypeSSE),
161163
WithDataSourceGeneratorSubscriptionClientFactory(&MockSubscriptionClientFactory{}),
162164
)

0 commit comments

Comments
 (0)